From f6fb1a7cdd55502b1d33844c69cdd823a3ed7db8 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Tue, 28 Jul 2026 14:25:33 -0500 Subject: [PATCH] fix(ai): retry transient client statuses (#39391) --- packages/ai/src/provider-error.ts | 3 +-- packages/ai/test/provider-error.test.ts | 6 ++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/ai/src/provider-error.ts b/packages/ai/src/provider-error.ts index 963c7599cf..a155719319 100644 --- a/packages/ai/src/provider-error.ts +++ b/packages/ai/src/provider-error.ts @@ -135,7 +135,7 @@ export function classifyProviderFailure(input: ProviderFailure): LLMError["reaso rateLimit: input.rateLimit, }) } - if (input.status !== undefined && input.status >= 500) + if (input.status === 408 || input.status === 409 || (input.status !== undefined && input.status >= 500)) return new ProviderInternalReason({ ...common, status: input.status, @@ -145,7 +145,6 @@ export function classifyProviderFailure(input: ProviderFailure): LLMError["reaso if ( input.status === 400 || input.status === 404 || - input.status === 409 || input.status === 413 || input.status === 422 ) diff --git a/packages/ai/test/provider-error.test.ts b/packages/ai/test/provider-error.test.ts index ea0464089e..667009fa0a 100644 --- a/packages/ai/test/provider-error.test.ts +++ b/packages/ai/test/provider-error.test.ts @@ -58,6 +58,12 @@ describe("provider error classification", () => { ).toEqual(["ProviderInternal", "ProviderInternal"]) }) + test("classifies transient client statuses as provider internal", () => { + expect( + [408, 409].map((status) => classifyProviderFailure({ message: `HTTP ${status}`, status })._tag), + ).toEqual(["ProviderInternal", "ProviderInternal"]) + }) + test("classifies nested provider codes when a top-level code is also present", () => { expect( [