From 7c9d79bdc798666ae9427057a00836213aad89ea Mon Sep 17 00:00:00 2001 From: Rohan Mehta Date: Tue, 29 Jul 2025 14:13:46 -0400 Subject: [PATCH] Realtime: only cancel response if necessary --- src/agents/realtime/openai_realtime.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/agents/realtime/openai_realtime.py b/src/agents/realtime/openai_realtime.py index 2e950b0a1..01a246ad2 100644 --- a/src/agents/realtime/openai_realtime.py +++ b/src/agents/realtime/openai_realtime.py @@ -140,6 +140,7 @@ def __init__(self) -> None: self._ongoing_response: bool = False self._tracing_config: RealtimeModelTracingConfig | Literal["auto"] | None = None self._playback_tracker: RealtimePlaybackTracker | None = None + self._created_session: OpenAISessionObject | None = None async def connect(self, options: RealtimeModelConfig) -> None: """Establish a connection to the model and keep it alive.""" @@ -349,7 +350,14 @@ async def _send_interrupt(self, event: RealtimeModelSendInterrupt) -> None: int(elapsed_ms), ) await self._send_raw_message(converted) - await self._cancel_response() + + automatic_response_cancellation_enabled = ( + self._created_session + and self._created_session.turn_detection + and self._created_session.turn_detection.interrupt_response + ) + if not automatic_response_cancellation_enabled: + await self._cancel_response() self._audio_state_tracker.on_interrupted() if self._playback_tracker: @@ -483,6 +491,9 @@ async def _handle_ws_event(self, event: dict[str, Any]): await self._emit_event(RealtimeModelTurnEndedEvent()) elif parsed.type == "session.created": await self._send_tracing_config(self._tracing_config) + self._update_created_session(parsed.session) # type: ignore + elif parsed.type == "session.updated": + self._update_created_session(parsed.session) # type: ignore elif parsed.type == "error": await self._emit_event(RealtimeModelErrorEvent(error=parsed.error)) elif parsed.type == "conversation.item.deleted": @@ -532,6 +543,13 @@ async def _handle_ws_event(self, event: dict[str, Any]): ): await self._handle_output_item(parsed.item) + def _update_created_session(self, session: OpenAISessionObject) -> None: + self._created_session = session + if session.output_audio_format: + self._audio_state_tracker.set_audio_format(session.output_audio_format) + if self._playback_tracker: + self._playback_tracker.set_audio_format(session.output_audio_format) + async def _update_session_config(self, model_settings: RealtimeSessionModelSettings) -> None: session_config = self._get_session_config(model_settings) await self._send_raw_message(