Skip to content

Commit 0a24671

Browse files
michieldwitteMichiel De Witte
andauthored
Performance: only create the OpenAIRealtimeServerEvent TypeAdapter once (#1548)
For every event a new TypeAdapter is created, which has a significant performance impact. <img width="1412" height="1166" alt="image" src="https://github.com/user-attachments/assets/fc1f9629-9342-4347-b4d5-5e218b73c4e8" /> Creating it once and reusing it, makes event handling a lot faster. Co-authored-by: Michiel De Witte <[email protected]>
1 parent 36fa8f3 commit 0a24671

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

src/agents/realtime/openai_realtime.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ class _InputAudioBufferTimeoutTriggeredEvent(BaseModel):
136136
audio_end_ms: int
137137
item_id: str
138138

139+
139140
AllRealtimeServerEvents = 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

148158
class 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

Comments
 (0)