From 8378856a905a5e0ff426d0c9787876bbd7c0f7af Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" Date: Tue, 2 Jun 2026 13:54:04 +0000 Subject: [PATCH] refactor(console): simplify provider error parsing --- .../app/src/routes/zen/util/handler.ts | 12 ++++++++-- .../app/src/routes/zen/util/providerError.ts | 24 +++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index dc8649c6d1..48514e5865 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -48,7 +48,7 @@ import { localeFromRequest } from "~/lib/language" import { createModelTpmLimiter } from "./modelTpmLimiter" import { createModelTpsLimiter } from "./modelTpsLimiter" import { accumulateUsage, HOT_WORKSPACES } from "./usageBatcher" -import { readProviderError } from "./providerError" +import { parseProviderErrorBody } from "./providerError" type ZenData = Awaited> type RetryOptions = { @@ -249,7 +249,15 @@ export async function handler( // Handle non-streaming response if (!isStream || [400, 404, 429].includes(res.status)) { - const json = res.status === 200 ? await res.json() : await readProviderError(res) + const json = await (async () => { + if (res.status === 200) return res.json() + const body = await res.text() + try { + const parsed = JSON.parse(body) + if (parsed && typeof parsed === "object") return parsed as Record + } catch {} + return parseProviderErrorBody(body, res.statusText) + })() await rateLimiter?.track() const usage = providerInfo.extractUsage(json) if (usage) { diff --git a/packages/console/app/src/routes/zen/util/providerError.ts b/packages/console/app/src/routes/zen/util/providerError.ts index 2a793930f5..f52f605252 100644 --- a/packages/console/app/src/routes/zen/util/providerError.ts +++ b/packages/console/app/src/routes/zen/util/providerError.ts @@ -1,10 +1,3 @@ -export async function readProviderError(res: Response) { - const body = await res.text() - const json = parseJson(body) - if (json && typeof json === "object") return json as Record - return parseProviderErrorBody(body, res.statusText) -} - export function parseProviderErrorBody(body: string, statusText: string) { const text = body.trim() const sseData = text @@ -14,7 +7,14 @@ export function parseProviderErrorBody(body: string, statusText: string) { .map((line) => line.slice(5).trim()) .filter((line) => line && line !== "[DONE]") - const parsed = sseData.map(parseJson).find((item) => item && typeof item === "object") + const parsed = (() => { + for (const data of sseData) { + try { + const json = JSON.parse(data) + if (json && typeof json === "object") return json as Record + } catch {} + } + })() if (parsed) return parsed as Record return { @@ -23,11 +23,3 @@ export function parseProviderErrorBody(body: string, statusText: string) { }, } } - -function parseJson(value: string) { - try { - return JSON.parse(value) as unknown - } catch { - return undefined - } -}