diff --git a/src/media-understanding/providers/deepgram/audio.ts b/src/media-understanding/providers/deepgram/audio.ts index 35965459fec..b32f18c870a 100644 --- a/src/media-understanding/providers/deepgram/audio.ts +++ b/src/media-understanding/providers/deepgram/audio.ts @@ -1,5 +1,5 @@ import type { AudioTranscriptionRequest, AudioTranscriptionResult } from "../../types.js"; -import { fetchWithTimeoutGuarded, normalizeBaseUrl, readErrorResponse } from "../shared.js"; +import { assertOkOrThrowHttpError, fetchWithTimeoutGuarded, normalizeBaseUrl } from "../shared.js"; export const DEFAULT_DEEPGRAM_AUDIO_BASE_URL = "https://api.deepgram.com/v1"; export const DEFAULT_DEEPGRAM_AUDIO_MODEL = "nova-3"; @@ -63,11 +63,7 @@ export async function transcribeDeepgramAudio( ); try { - if (!res.ok) { - const detail = await readErrorResponse(res); - const suffix = detail ? `: ${detail}` : ""; - throw new Error(`Audio transcription failed (HTTP ${res.status})${suffix}`); - } + await assertOkOrThrowHttpError(res, "Audio transcription failed"); const payload = (await res.json()) as DeepgramTranscriptResponse; const transcript = payload.results?.channels?.[0]?.alternatives?.[0]?.transcript?.trim(); diff --git a/src/media-understanding/providers/google/inline-data.ts b/src/media-understanding/providers/google/inline-data.ts index 4f5df896a0a..39c1093644a 100644 --- a/src/media-understanding/providers/google/inline-data.ts +++ b/src/media-understanding/providers/google/inline-data.ts @@ -1,5 +1,5 @@ import { normalizeGoogleModelId } from "../../../agents/models-config.providers.js"; -import { fetchWithTimeoutGuarded, normalizeBaseUrl, readErrorResponse } from "../shared.js"; +import { assertOkOrThrowHttpError, fetchWithTimeoutGuarded, normalizeBaseUrl } from "../shared.js"; export async function generateGeminiInlineDataText(params: { buffer: Buffer; @@ -73,11 +73,7 @@ export async function generateGeminiInlineDataText(params: { ); try { - if (!res.ok) { - const detail = await readErrorResponse(res); - const suffix = detail ? `: ${detail}` : ""; - throw new Error(`${params.httpErrorLabel} (HTTP ${res.status})${suffix}`); - } + await assertOkOrThrowHttpError(res, params.httpErrorLabel); const payload = (await res.json()) as { candidates?: Array<{ diff --git a/src/media-understanding/providers/openai/audio.ts b/src/media-understanding/providers/openai/audio.ts index bfd87009909..2635ad23d0b 100644 --- a/src/media-understanding/providers/openai/audio.ts +++ b/src/media-understanding/providers/openai/audio.ts @@ -1,6 +1,6 @@ import path from "node:path"; import type { AudioTranscriptionRequest, AudioTranscriptionResult } from "../../types.js"; -import { fetchWithTimeoutGuarded, normalizeBaseUrl, readErrorResponse } from "../shared.js"; +import { assertOkOrThrowHttpError, fetchWithTimeoutGuarded, normalizeBaseUrl } from "../shared.js"; export const DEFAULT_OPENAI_AUDIO_BASE_URL = "https://api.openai.com/v1"; const DEFAULT_OPENAI_AUDIO_MODEL = "gpt-4o-mini-transcribe"; @@ -52,11 +52,7 @@ export async function transcribeOpenAiCompatibleAudio( ); try { - if (!res.ok) { - const detail = await readErrorResponse(res); - const suffix = detail ? `: ${detail}` : ""; - throw new Error(`Audio transcription failed (HTTP ${res.status})${suffix}`); - } + await assertOkOrThrowHttpError(res, "Audio transcription failed"); const payload = (await res.json()) as { text?: string }; const text = payload.text?.trim(); diff --git a/src/media-understanding/providers/shared.ts b/src/media-understanding/providers/shared.ts index 3e9a9ee7d93..beaafcf9e51 100644 --- a/src/media-understanding/providers/shared.ts +++ b/src/media-understanding/providers/shared.ts @@ -47,3 +47,12 @@ export async function readErrorResponse(res: Response): Promise { + if (res.ok) { + return; + } + const detail = await readErrorResponse(res); + const suffix = detail ? `: ${detail}` : ""; + throw new Error(`${label} (HTTP ${res.status})${suffix}`); +}