From 84c536a5e08e12ae215d3fbf3fb65b1574bb08cf Mon Sep 17 00:00:00 2001 From: Oren Date: Sun, 25 Jan 2026 19:37:50 +0200 Subject: [PATCH] Support model failover for error code 400 --- src/agents/failover-error.test.ts | 1 + src/agents/failover-error.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/agents/failover-error.test.ts b/src/agents/failover-error.test.ts index a43ae289f..d81781a90 100644 --- a/src/agents/failover-error.test.ts +++ b/src/agents/failover-error.test.ts @@ -11,6 +11,7 @@ describe("failover-error", () => { expect(resolveFailoverReasonFromError({ statusCode: "429" })).toBe("rate_limit"); expect(resolveFailoverReasonFromError({ status: 403 })).toBe("auth"); expect(resolveFailoverReasonFromError({ status: 408 })).toBe("timeout"); + expect(resolveFailoverReasonFromError({ status: 400 })).toBe("format"); }); it("infers format errors from error messages", () => { diff --git a/src/agents/failover-error.ts b/src/agents/failover-error.ts index 5026394f3..6f6e33948 100644 --- a/src/agents/failover-error.ts +++ b/src/agents/failover-error.ts @@ -120,6 +120,7 @@ export function resolveFailoverReasonFromError(err: unknown): FailoverReason | n if (status === 429) return "rate_limit"; if (status === 401 || status === 403) return "auth"; if (status === 408) return "timeout"; + if (status === 400) return "format"; const code = (getErrorCode(err) ?? "").toUpperCase(); if (["ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNRESET", "ECONNABORTED"].includes(code)) {