Skip to content

Realtime: fix interrupt logic #1370

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion examples/realtime/app/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,6 @@ async def websocket_endpoint(websocket: WebSocket, session_id: str):

if message["type"] == "audio":
# Convert int16 array to bytes
print("Received audio data")
int16_data = message["data"]
audio_bytes = struct.pack(f"{len(int16_data)}h", *int16_data)
await manager.send_audio(session_id, audio_bytes)
Expand Down
13 changes: 10 additions & 3 deletions src/agents/realtime/openai_realtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ async def connect(self, options: RealtimeModelConfig) -> None:

model_settings: RealtimeSessionModelSettings = options.get("initial_model_settings", {})

self._playback_tracker = options.get("playback_tracker", RealtimePlaybackTracker())
self._playback_tracker = options.get("playback_tracker", None)

self.model = model_settings.get("model_name", self.model)
api_key = await get_api_key(options.get("api_key"))
Expand Down Expand Up @@ -226,7 +226,7 @@ async def _listen_for_messages(self):

except websockets.exceptions.ConnectionClosedOK:
# Normal connection closure - no exception event needed
logger.info("WebSocket connection closed normally")
logger.debug("WebSocket connection closed normally")
except websockets.exceptions.ConnectionClosed as e:
await self._emit_event(
RealtimeModelExceptionEvent(
Expand Down Expand Up @@ -329,7 +329,7 @@ async def _send_interrupt(self, event: RealtimeModelSendInterrupt) -> None:
current_item_content_index = playback_state.get("current_item_content_index")
elapsed_ms = playback_state.get("elapsed_ms")
if current_item_id is None or elapsed_ms is None:
logger.info(
logger.debug(
"Skipping interrupt. "
f"Item id: {current_item_id}, "
f"elapsed ms: {elapsed_ms}, "
Expand All @@ -351,6 +351,13 @@ async def _send_interrupt(self, event: RealtimeModelSendInterrupt) -> None:
int(elapsed_ms),
)
await self._send_raw_message(converted)
else:
logger.debug(
"Didn't interrupt bc elapsed ms is < 0. "
f"Item id: {current_item_id}, "
f"elapsed ms: {elapsed_ms}, "
f"content index: {current_item_content_index}"
)

automatic_response_cancellation_enabled = (
self._created_session
Expand Down