diff --git a/src/hooks/runtime-fallback/error-classifier.ts b/src/hooks/runtime-fallback/error-classifier.ts index 3bb46454c..0901a4e05 100644 --- a/src/hooks/runtime-fallback/error-classifier.ts +++ b/src/hooks/runtime-fallback/error-classifier.ts @@ -97,6 +97,13 @@ export function extractErrorName(error: unknown): string | undefined { return undefined } +function isLocalizedQuotaExhaustionMessage(message: string): boolean { + return ( + (/预扣费额度失败/i.test(message) && /用户剩余额度/i.test(message)) || + (/用户剩余额度/i.test(message) && /需要预扣费额度/i.test(message)) + ) +} + export function classifyErrorType(error: unknown): string | undefined { const message = getErrorMessage(error) const errorName = extractErrorName(error)?.toLowerCase() @@ -135,7 +142,8 @@ export function classifyErrorType(error: unknown): string | undefined { /out\s+of\s+credits?/i.test(message) || /payment.?required/i.test(message) || /usage\s+limit/i.test(message) || - /credit\s+balance.*too\s+low/i.test(message) + /credit\s+balance.*too\s+low/i.test(message) || + isLocalizedQuotaExhaustionMessage(message) ) { return "quota_exceeded" } diff --git a/src/hooks/runtime-fallback/quota-error-classifier.regression.test.ts b/src/hooks/runtime-fallback/quota-error-classifier.regression.test.ts index 5878e8f2a..f55c632cf 100644 --- a/src/hooks/runtime-fallback/quota-error-classifier.regression.test.ts +++ b/src/hooks/runtime-fallback/quota-error-classifier.regression.test.ts @@ -73,4 +73,20 @@ describe("runtime-fallback quota error regressions", () => { // Volcano Engine quota errors trigger fallback to the next model expect(retryable).toBe(true) }) + + test("classifies UnifyLLM pre-charge balance failures as quota_exceeded", () => { + //#given + const error = { + message: + "预扣费额度失败, 用户剩余额度: 0.265718, 需要预扣费额度: 0.680208 (request id: test-request-id)", + } + + //#when + const errorType = classifyErrorType(error) + const retryable = isRetryableError(error, [429, 500, 502, 503, 504]) + + //#then + expect(errorType).toBe("quota_exceeded") + expect(retryable).toBe(true) + }) })