@@ -136,6 +136,7 @@ class _InputAudioBufferTimeoutTriggeredEvent(BaseModel):
136136 audio_end_ms : int
137137 item_id : str
138138
139+
139140AllRealtimeServerEvents = Annotated [
140141 Union [
141142 OpenAIRealtimeServerEvent ,
@@ -144,6 +145,15 @@ class _InputAudioBufferTimeoutTriggeredEvent(BaseModel):
144145 Field (discriminator = "type" ),
145146]
146147
148+ ServerEventTypeAdapter : TypeAdapter [AllRealtimeServerEvents ] | None = None
149+
150+
151+ def get_server_event_type_adapter ():
152+ global ServerEventTypeAdapter
153+ if not ServerEventTypeAdapter :
154+ ServerEventTypeAdapter = TypeAdapter (AllRealtimeServerEvents )
155+ return ServerEventTypeAdapter
156+
147157
148158class OpenAIRealtimeWebSocketModel (RealtimeModel ):
149159 """A model that uses OpenAI's WebSocket API."""
@@ -159,6 +169,7 @@ def __init__(self) -> None:
159169 self ._tracing_config : RealtimeModelTracingConfig | Literal ["auto" ] | None = None
160170 self ._playback_tracker : RealtimePlaybackTracker | None = None
161171 self ._created_session : OpenAISessionObject | None = None
172+ self ._server_event_type_adapter = get_server_event_type_adapter ()
162173
163174 async def connect (self , options : RealtimeModelConfig ) -> None :
164175 """Establish a connection to the model and keep it alive."""
@@ -479,9 +490,9 @@ async def _handle_ws_event(self, event: dict[str, Any]):
479490 try :
480491 if "previous_item_id" in event and event ["previous_item_id" ] is None :
481492 event ["previous_item_id" ] = "" # TODO (rm) remove
482- parsed : AllRealtimeServerEvents = TypeAdapter (
483- AllRealtimeServerEvents
484- ). validate_python ( event )
493+ parsed : OpenAIRealtimeServerEvent = self . _server_event_type_adapter . validate_python (
494+ event
495+ )
485496 except pydantic .ValidationError as e :
486497 logger .error (f"Failed to validate server event: { event } " , exc_info = True )
487498 await self ._emit_event (
0 commit comments