From f4bad9aada82b604332bf7ca438d6ec86df77ac8 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 11 Mar 2026 13:21:57 +0000 Subject: [PATCH] fix: recognize Venice 402 billing errors for model fallback Venice returns "Insufficient USD or Diem balance" which has extra words between "insufficient" and "balance", causing the billing pattern `"insufficient balance"` (substring match) to miss it. Change the pattern to a regex `/insufficient\b.*\bbalance/i` so providers that insert qualifier words (e.g. "USD or Diem") between "insufficient" and "balance" are still classified as billing errors and trigger model fallback. Co-Authored-By: Claude Opus 4.6 --- .../pi-embedded-helpers.isbillingerrormessage.test.ts | 9 +++++++++ src/agents/pi-embedded-helpers/failover-matches.ts | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts b/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts index 0430bd3814b..b9a0f311a04 100644 --- a/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts +++ b/src/agents/pi-embedded-helpers.isbillingerrormessage.test.ts @@ -106,6 +106,9 @@ describe("isBillingErrorMessage", () => { "Payment Required", "HTTP 402 Payment Required", "plans & billing", + // Venice returns "Insufficient USD or Diem balance" which has extra words + // between "insufficient" and "balance" (#XXXXX) + "Insufficient USD or Diem balance to complete request. Visit https://venice.ai/settings/api to add credits.", ]; for (const sample of samples) { expect(isBillingErrorMessage(sample)).toBe(true); @@ -650,6 +653,12 @@ describe("classifyFailoverReason", () => { expect(classifyFailoverReason(TOGETHER_ENGINE_OVERLOADED_MESSAGE)).toBe("overloaded"); expect(classifyFailoverReason(GROQ_TOO_MANY_REQUESTS_MESSAGE)).toBe("rate_limit"); expect(classifyFailoverReason(GROQ_SERVICE_UNAVAILABLE_MESSAGE)).toBe("overloaded"); + // Venice 402 billing error with extra words between "insufficient" and "balance" + expect( + classifyFailoverReason( + "Insufficient USD or Diem balance to complete request. Visit https://venice.ai/settings/api to add credits.", + ), + ).toBe("billing"); }); it("classifies internal and compatibility error messages", () => { diff --git a/src/agents/pi-embedded-helpers/failover-matches.ts b/src/agents/pi-embedded-helpers/failover-matches.ts index a7948703f39..de80685f1d2 100644 --- a/src/agents/pi-embedded-helpers/failover-matches.ts +++ b/src/agents/pi-embedded-helpers/failover-matches.ts @@ -51,7 +51,7 @@ const ERROR_PATTERNS = { /insufficient[_ ]quota/i, "credit balance", "plans & billing", - "insufficient balance", + /insufficient\b.*\bbalance/i, ], authPermanent: [ /api[_ ]?key[_ ]?(?:revoked|invalid|deactivated|deleted)/i,