diff --git a/src/shared/model-error-classifier.test.ts b/src/shared/model-error-classifier.test.ts index d359c26d3..21e0b0f56 100644 --- a/src/shared/model-error-classifier.test.ts +++ b/src/shared/model-error-classifier.test.ts @@ -82,4 +82,26 @@ describe("model-error-classifier", () => { //#then expect(provider).toBe("provider-x") }) + + test("treats FreeUsageLimitError (lowercase) as retryable by name", () => { + //#given + const error = { name: "FreeUsageLimitError" } + + //#when + const result = shouldRetryError(error) + + //#then + expect(result).toBe(true) + }) + + test("treats freeusagelimiterror (lowercase name) as retryable by name", () => { + //#given + const error = { name: "freeusagelimiterror" } + + //#when + const result = shouldRetryError(error) + + //#then + expect(result).toBe(true) + }) }) diff --git a/src/shared/model-error-classifier.ts b/src/shared/model-error-classifier.ts index 2bb7ef176..eb8236f78 100644 --- a/src/shared/model-error-classifier.ts +++ b/src/shared/model-error-classifier.ts @@ -13,6 +13,7 @@ const RETRYABLE_ERROR_NAMES = new Set([ "ModelUnavailableError", "ProviderConnectionError", "AuthenticationError", + "freeusagelimiterror", ]) /** @@ -97,12 +98,13 @@ export interface ErrorInfo { export function isRetryableModelError(error: ErrorInfo): boolean { // If we have an error name, check against known lists if (error.name) { + const errorNameLower = error.name.toLowerCase() // Explicit non-retryable takes precedence - if (NON_RETRYABLE_ERROR_NAMES.has(error.name)) { + if (NON_RETRYABLE_ERROR_NAMES.has(errorNameLower)) { return false } // Check if it's a known retryable error - if (RETRYABLE_ERROR_NAMES.has(error.name)) { + if (RETRYABLE_ERROR_NAMES.has(errorNameLower)) { return true } }