diff --git a/.changeset/soniox-stt-server-errors.md b/.changeset/soniox-stt-server-errors.md new file mode 100644 index 000000000..14539b24f --- /dev/null +++ b/.changeset/soniox-stt-server-errors.md @@ -0,0 +1,5 @@ +--- +'@livekit/agents-plugin-soniox': patch +--- + +Surface Soniox STT server error frames as API status errors. diff --git a/plugins/soniox/src/_internal.ts b/plugins/soniox/src/_internal.ts index d735bf563..3e34ba7f9 100644 --- a/plugins/soniox/src/_internal.ts +++ b/plugins/soniox/src/_internal.ts @@ -25,7 +25,7 @@ export interface SonioxMessage { tokens?: SonioxToken[]; total_audio_proc_ms?: number; finished?: boolean; - error_code?: string; + error_code?: string | number; error_message?: string; } diff --git a/plugins/soniox/src/stt.ts b/plugins/soniox/src/stt.ts index 057b8d264..f7c05bc37 100644 --- a/plugins/soniox/src/stt.ts +++ b/plugins/soniox/src/stt.ts @@ -4,6 +4,8 @@ import { type APIConnectOptions, APIConnectionError, + APIError, + APIStatusError, APITimeoutError, type AudioBuffer, log, @@ -143,7 +145,7 @@ export class SpeechStream extends stt.SpeechStream { ws = await this.#connectWS(); await this.#runWS(ws); } catch (error) { - if (error instanceof APITimeoutError || error instanceof APIConnectionError) { + if (error instanceof APIError) { throw error; } throw new APIConnectionError({ @@ -228,9 +230,16 @@ export class SpeechStream extends stt.SpeechStream { this.#put(event); } if (content.error_code || content.error_message) { - this.#logger.error( - `WebSocket error: ${content.error_code ?? ''} - ${content.error_message ?? ''}`, + const statusCode = parseStatusCode(content.error_code); + const errorMessage = content.error_message ?? 'Unknown Soniox STT error'; + this.#logger.error(`WebSocket error: ${content.error_code ?? ''} - ${errorMessage}`); + reject( + new APIStatusError({ + message: `Soniox STT error: ${content.error_code ?? ''} - ${errorMessage}`, + options: { statusCode, body: content }, + }), ); + return; } if (content.finished) { resolve(); @@ -302,3 +311,9 @@ const serializeTranslation = (translation: TranslationConfig): Record { + if (typeof errorCode === 'number') return Number.isInteger(errorCode) ? errorCode : -1; + if (typeof errorCode === 'string' && /^\d+$/.test(errorCode)) return Number(errorCode); + return -1; +};