From 1ef9a2a8eaeb244227be7573702779d491e1faa9 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Mon, 2 Mar 2026 21:03:37 +0530 Subject: [PATCH] fix: handle HTTP 529 (Anthropic overloaded) in failover error classification Classify Anthropic's 529 status code as "rate_limit" so model fallback triggers reliably without depending on fragile message-based detection. Closes #28502 --- src/agents/failover-error.test.ts | 2 ++ src/agents/failover-error.ts | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/agents/failover-error.test.ts b/src/agents/failover-error.test.ts index 413e9da8c31..ec7e7a195ee 100644 --- a/src/agents/failover-error.test.ts +++ b/src/agents/failover-error.test.ts @@ -18,6 +18,8 @@ describe("failover-error", () => { expect(resolveFailoverReasonFromError({ status: 502 })).toBe("timeout"); expect(resolveFailoverReasonFromError({ status: 503 })).toBe("timeout"); expect(resolveFailoverReasonFromError({ status: 504 })).toBe("timeout"); + // Anthropic 529 (overloaded) should trigger failover as rate_limit. + expect(resolveFailoverReasonFromError({ status: 529 })).toBe("rate_limit"); }); it("infers format errors from error messages", () => { diff --git a/src/agents/failover-error.ts b/src/agents/failover-error.ts index 5b3884b29f2..97cdd3ae6e0 100644 --- a/src/agents/failover-error.ts +++ b/src/agents/failover-error.ts @@ -178,6 +178,9 @@ export function resolveFailoverReasonFromError(err: unknown): FailoverReason | n if (status === 502 || status === 503 || status === 504) { return "timeout"; } + if (status === 529) { + return "rate_limit"; + } if (status === 400) { return "format"; }