From 476c678424de2631333bae8f49d75909567e33b1 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 4 May 2026 13:06:25 +0000 Subject: [PATCH] fix(openai realtime): reject pending response future on error event When the OpenAI Realtime API sends an `error` event referencing the `event_id` of a `response.create` we issued, resolve the future created by `generateReply()` with an Error so awaiters do not hang. Ports livekit/agents#5576. https://claude.ai/code/session_01DgYvBGHayjKh6MfV763she --- .../openai-realtime-reject-pending-response.md | 5 +++++ plugins/openai/src/realtime/realtime_model.ts | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 .changeset/openai-realtime-reject-pending-response.md diff --git a/.changeset/openai-realtime-reject-pending-response.md b/.changeset/openai-realtime-reject-pending-response.md new file mode 100644 index 000000000..619363a04 --- /dev/null +++ b/.changeset/openai-realtime-reject-pending-response.md @@ -0,0 +1,5 @@ +--- +'@livekit/agents-plugin-openai': patch +--- + +fix(openai realtime): reject pending response future on error event. When the OpenAI Realtime API returns an `error` event referencing the `event_id` of a `response.create` we issued, the corresponding future created by `generateReply()` is now rejected instead of left hanging. Ports livekit/agents#5576. diff --git a/plugins/openai/src/realtime/realtime_model.ts b/plugins/openai/src/realtime/realtime_model.ts index 1ff0f61ab..af11b9054 100644 --- a/plugins/openai/src/realtime/realtime_model.ts +++ b/plugins/openai/src/realtime/realtime_model.ts @@ -1740,6 +1740,18 @@ export class RealtimeSession extends llm.RealtimeSession { return; } this.#logger.error({ error: event.error }, 'OpenAI Realtime API returned an error'); + + const eventId = event.error.event_id; + if (eventId) { + const handle = this.responseCreatedFutures[eventId]; + if (handle) { + delete this.responseCreatedFutures[eventId]; + if (!handle.doneFut.done) { + handle.doneFut.reject(new Error(event.error.message)); + } + } + } + this.emitError({ error: new APIError(event.error.message, { body: event.error, @@ -1747,8 +1759,6 @@ export class RealtimeSession extends llm.RealtimeSession { }), recoverable: true, }); - - // TODO(brian): set error for response future if it exists } private emitError({ error, recoverable }: { error: Error; recoverable: boolean }): void {