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 {