From 858caa68489ab708877c2760e46783d1fcec3fc9 Mon Sep 17 00:00:00 2001 From: "opencode-agent[bot]" <219766164+opencode-agent[bot]@users.noreply.github.com> Date: Fri, 21 Aug 2026 01:47:34 -0500 Subject: [PATCH] fix(ai): classify network error variants (#43807) Co-authored-by: Aiden --- packages/ai/src/provider-error.ts | 2 ++ packages/ai/test/provider-error.test.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/ai/src/provider-error.ts b/packages/ai/src/provider-error.ts index e81f1d7d034..3cc30644ce5 100644 --- a/packages/ai/src/provider-error.ts +++ b/packages/ai/src/provider-error.ts @@ -74,6 +74,7 @@ const INVALID_REQUEST_CODES = new Set(["invalid_prompt", "invalid_request_error" const RATE_LIMIT_TEXT = /rate increased too quickly|rate[-_\s]?limit|too[_\s]?many[_\s]?requests/i const QUOTA_TEXT = /insufficient[-_\s]?quota|quota[-_\s]?exceeded/i const CONTENT_POLICY_TEXT = /content[-_\s]?policy|content_filter|safety/i +const NETWORK_ERROR_TEXT = /network[-_\s]error/i export interface ProviderFailure { readonly message: string @@ -127,6 +128,7 @@ export function classifyProviderFailure(input: ProviderFailure): AIError["reason retryAfterMs: input.retryAfterMs, rateLimit: input.rateLimit, }) + if (NETWORK_ERROR_TEXT.test(text)) return new ProviderInternalReason({ ...common, status: input.status }) if (codes.some((code) => SERVER_CODES.has(code) || code.includes("exhausted") || code.includes("unavailable"))) return new ProviderInternalReason({ ...common, diff --git a/packages/ai/test/provider-error.test.ts b/packages/ai/test/provider-error.test.ts index 14be937d596..1ad76fb5785 100644 --- a/packages/ai/test/provider-error.test.ts +++ b/packages/ai/test/provider-error.test.ts @@ -82,6 +82,14 @@ describe("provider error classification", () => { ]) }) + test("classifies network error text as provider internal", () => { + expect( + ["network error", "network-error", "network_error"].map( + (message) => classifyProviderFailure({ message })._tag, + ), + ).toEqual(["ProviderInternal", "ProviderInternal", "ProviderInternal"]) + }) + test("classifies nested provider codes when a top-level code is also present", () => { expect( [