mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-05 06:10:21 +00:00
fix(agents): handle overloaded failover separately (#38301)
* fix(agents): skip auth-profile failure on overload * fix(agents): note overload auth-profile fallback fix * fix(agents): classify overloaded failures separately * fix(agents): back off before overload failover * fix(agents): tighten overload probe and backoff state * fix(agents): persist overloaded cooldown across runs * fix(agents): tighten overloaded status handling * test(agents): add overload regression coverage * fix(agents): restore runner imports after rebase * test(agents): add overload fallback integration coverage * fix(agents): harden overloaded failover abort handling * test(agents): tighten overload classifier coverage * test(agents): cover all-overloaded fallback exhaustion * fix(cron): retry overloaded fallback summaries * fix(cron): treat HTTP 529 as overloaded retry
This commit is contained in:
@@ -75,7 +75,7 @@ describe("failover-error", () => {
|
||||
expect(resolveFailoverReasonFromError({ status: 522 })).toBeNull();
|
||||
expect(resolveFailoverReasonFromError({ status: 523 })).toBeNull();
|
||||
expect(resolveFailoverReasonFromError({ status: 524 })).toBeNull();
|
||||
expect(resolveFailoverReasonFromError({ status: 529 })).toBe("rate_limit");
|
||||
expect(resolveFailoverReasonFromError({ status: 529 })).toBe("overloaded");
|
||||
});
|
||||
|
||||
it("classifies documented provider error shapes at the error boundary", () => {
|
||||
@@ -90,7 +90,7 @@ describe("failover-error", () => {
|
||||
status: 529,
|
||||
message: ANTHROPIC_OVERLOADED_PAYLOAD,
|
||||
}),
|
||||
).toBe("rate_limit");
|
||||
).toBe("overloaded");
|
||||
expect(
|
||||
resolveFailoverReasonFromError({
|
||||
status: 429,
|
||||
@@ -126,7 +126,22 @@ describe("failover-error", () => {
|
||||
status: 503,
|
||||
message: GROQ_SERVICE_UNAVAILABLE_MESSAGE,
|
||||
}),
|
||||
).toBe("overloaded");
|
||||
});
|
||||
|
||||
it("keeps status-only 503s conservative unless the payload is clearly overloaded", () => {
|
||||
expect(
|
||||
resolveFailoverReasonFromError({
|
||||
status: 503,
|
||||
message: "Internal database error",
|
||||
}),
|
||||
).toBe("timeout");
|
||||
expect(
|
||||
resolveFailoverReasonFromError({
|
||||
status: 503,
|
||||
message: '{"error":{"message":"The model is overloaded. Please try later"}}',
|
||||
}),
|
||||
).toBe("overloaded");
|
||||
});
|
||||
|
||||
it("treats 400 insufficient_quota payloads as billing instead of format", () => {
|
||||
@@ -151,6 +166,14 @@ describe("failover-error", () => {
|
||||
).toBe("rate_limit");
|
||||
});
|
||||
|
||||
it("treats overloaded provider payloads as overloaded", () => {
|
||||
expect(
|
||||
resolveFailoverReasonFromError({
|
||||
message: ANTHROPIC_OVERLOADED_PAYLOAD,
|
||||
}),
|
||||
).toBe("overloaded");
|
||||
});
|
||||
|
||||
it("keeps raw-text 402 weekly/monthly limit errors in billing", () => {
|
||||
expect(
|
||||
resolveFailoverReasonFromError({
|
||||
@@ -221,6 +244,10 @@ describe("failover-error", () => {
|
||||
expect(err?.model).toBe("claude-opus-4-5");
|
||||
});
|
||||
|
||||
it("maps overloaded to a 503 fallback status", () => {
|
||||
expect(resolveFailoverStatus("overloaded")).toBe(503);
|
||||
});
|
||||
|
||||
it("coerces format errors with a 400 status", () => {
|
||||
const err = coerceToFailoverError("invalid request format", {
|
||||
provider: "google",
|
||||
|
||||
Reference in New Issue
Block a user