@@ -244,6 +244,82 @@ def __getitem__(self, key):
244
244
return _dict [key ]
245
245
246
246
247
+ # History and Context classes for Function Call Context / History feature
248
+
249
+ @dataclass
250
+ class Flags (BaseResponse ):
251
+ """
252
+ This class defines configuration flags for the agent settings.
253
+ """
254
+
255
+ history : bool = field (default = True )
256
+
257
+
258
+ @dataclass
259
+ class HistoryConversationMessage (BaseResponse ):
260
+ """
261
+ This class defines a conversation text message as part of the conversation history.
262
+ """
263
+
264
+ type : str = field (default = "History" )
265
+ role : str = field (default = "" ) # "user" or "assistant"
266
+ content : str = field (default = "" )
267
+
268
+
269
+ @dataclass
270
+ class FunctionCallHistory (BaseResponse ):
271
+ """
272
+ This class defines a single function call in the history.
273
+ """
274
+
275
+ id : str = field (default = "" )
276
+ name : str = field (default = "" )
277
+ client_side : bool = field (default = False )
278
+ arguments : str = field (default = "" )
279
+ response : str = field (default = "" )
280
+
281
+
282
+ @dataclass
283
+ class HistoryFunctionCallsMessage (BaseResponse ):
284
+ """
285
+ This class defines function call messages as part of the conversation history.
286
+ """
287
+
288
+ type : str = field (default = "History" )
289
+ function_calls : List [FunctionCallHistory ] = field (default_factory = list )
290
+
291
+ def __post_init__ (self ):
292
+ """Convert dict function_calls to FunctionCallHistory objects if needed."""
293
+ if self .function_calls :
294
+ self .function_calls = [
295
+ FunctionCallHistory .from_dict (call ) if isinstance (call , dict ) else call
296
+ for call in self .function_calls
297
+ ]
298
+
299
+
300
+ @dataclass
301
+ class Context (BaseResponse ):
302
+ """
303
+ This class defines the conversation context including the history of messages and function calls.
304
+ """
305
+
306
+ messages : List [Union [HistoryConversationMessage , HistoryFunctionCallsMessage ]] = field (default_factory = list )
307
+
308
+ def __post_init__ (self ):
309
+ """Convert dict messages to appropriate message objects if needed."""
310
+ if self .messages :
311
+ converted_messages = []
312
+ for message in self .messages :
313
+ if isinstance (message , dict ):
314
+ if "function_calls" in message :
315
+ converted_messages .append (HistoryFunctionCallsMessage .from_dict (message ))
316
+ else :
317
+ converted_messages .append (HistoryConversationMessage .from_dict (message ))
318
+ else :
319
+ converted_messages .append (message )
320
+ self .messages = converted_messages
321
+
322
+
247
323
@dataclass
248
324
class Agent (BaseResponse ):
249
325
"""
@@ -277,6 +353,9 @@ class Agent(BaseResponse):
277
353
tags : Optional [List [str ]] = field (
278
354
default = None , metadata = dataclass_config (exclude = lambda f : f is None )
279
355
)
356
+ context : Optional [Context ] = field (
357
+ default = None , metadata = dataclass_config (exclude = lambda f : f is None )
358
+ )
280
359
281
360
def __post_init__ (self ):
282
361
"""Handle conversion of dict/list data to proper Speak objects"""
@@ -300,6 +379,8 @@ def __getitem__(self, key):
300
379
_dict ["speak" ] = [Speak .from_dict (item ) for item in _dict ["speak" ]]
301
380
elif isinstance (_dict ["speak" ], dict ):
302
381
_dict ["speak" ] = Speak .from_dict (_dict ["speak" ])
382
+ if "context" in _dict and isinstance (_dict ["context" ], dict ):
383
+ _dict ["context" ] = Context .from_dict (_dict ["context" ])
303
384
return _dict [key ]
304
385
305
386
@@ -355,13 +436,19 @@ class SettingsOptions(BaseResponse):
355
436
type : str = str (AgentWebSocketEvents .Settings )
356
437
audio : Audio = field (default_factory = Audio )
357
438
agent : Agent = field (default_factory = Agent )
439
+ flags : Optional [Flags ] = field (
440
+ default = None , metadata = dataclass_config (exclude = lambda f : f is None )
441
+ )
358
442
359
443
def __getitem__ (self , key ):
360
444
_dict = self .to_dict ()
361
445
if "audio" in _dict and isinstance (_dict ["audio" ], dict ):
362
446
_dict ["audio" ] = Audio .from_dict (_dict ["audio" ])
363
447
if "agent" in _dict and isinstance (_dict ["agent" ], dict ):
364
448
_dict ["agent" ] = Agent .from_dict (_dict ["agent" ])
449
+ if "flags" in _dict and isinstance (_dict ["flags" ], dict ):
450
+ _dict ["flags" ] = Flags .from_dict (_dict ["flags" ])
451
+ return _dict [key ]
365
452
366
453
def check (self ):
367
454
"""
0 commit comments