fix(model): quota errors should STOP not retry
This commit is contained in:
@@ -84,7 +84,51 @@ describe("model-error-classifier", () => {
|
|||||||
expect(provider).toBe("provider-x")
|
expect(provider).toBe("provider-x")
|
||||||
})
|
})
|
||||||
|
|
||||||
test("treats FreeUsageLimitError (PascalCase name) as retryable by name", () => {
|
test("treats QuotaExceededError (PascalCase name) as non-retryable STOP error", () => {
|
||||||
|
//#given
|
||||||
|
const error = { name: "QuotaExceededError" }
|
||||||
|
|
||||||
|
//#when
|
||||||
|
const result = shouldRetryError(error)
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(result).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("treats quotaexceedederror (lowercase name) as non-retryable STOP error", () => {
|
||||||
|
//#given
|
||||||
|
const error = { name: "quotaexceedederror" }
|
||||||
|
|
||||||
|
//#when
|
||||||
|
const result = shouldRetryError(error)
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(result).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("treats InsufficientCreditsError (PascalCase name) as non-retryable STOP error", () => {
|
||||||
|
//#given
|
||||||
|
const error = { name: "InsufficientCreditsError" }
|
||||||
|
|
||||||
|
//#when
|
||||||
|
const result = shouldRetryError(error)
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(result).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("treats insufficientcreditserror (lowercase name) as non-retryable STOP error", () => {
|
||||||
|
//#given
|
||||||
|
const error = { name: "insufficientcreditserror" }
|
||||||
|
|
||||||
|
//#when
|
||||||
|
const result = shouldRetryError(error)
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(result).toBe(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
test("treats FreeUsageLimitError (PascalCase name) as non-retryable STOP error", () => {
|
||||||
//#given
|
//#given
|
||||||
const error = { name: "FreeUsageLimitError" }
|
const error = { name: "FreeUsageLimitError" }
|
||||||
|
|
||||||
@@ -92,10 +136,10 @@ describe("model-error-classifier", () => {
|
|||||||
const result = shouldRetryError(error)
|
const result = shouldRetryError(error)
|
||||||
|
|
||||||
//#then
|
//#then
|
||||||
expect(result).toBe(true)
|
expect(result).toBe(false)
|
||||||
})
|
})
|
||||||
|
|
||||||
test("treats freeusagelimiterror (lowercase name) as retryable by name", () => {
|
test("treats freeusagelimiterror (lowercase name) as non-retryable STOP error", () => {
|
||||||
//#given
|
//#given
|
||||||
const error = { name: "freeusagelimiterror" }
|
const error = { name: "freeusagelimiterror" }
|
||||||
|
|
||||||
@@ -103,7 +147,7 @@ describe("model-error-classifier", () => {
|
|||||||
const result = shouldRetryError(error)
|
const result = shouldRetryError(error)
|
||||||
|
|
||||||
//#then
|
//#then
|
||||||
expect(result).toBe(true)
|
expect(result).toBe(false)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,14 @@ import { readConnectedProvidersCache } from "./connected-providers-cache"
|
|||||||
const RETRYABLE_ERROR_NAMES = new Set([
|
const RETRYABLE_ERROR_NAMES = new Set([
|
||||||
"providermodelnotfounderror",
|
"providermodelnotfounderror",
|
||||||
"ratelimiterror",
|
"ratelimiterror",
|
||||||
"quotaexceedederror",
|
|
||||||
"insufficientcreditserror",
|
|
||||||
"modelunavailableerror",
|
"modelunavailableerror",
|
||||||
"providerconnectionerror",
|
"providerconnectionerror",
|
||||||
"authenticationerror",
|
"authenticationerror",
|
||||||
|
])
|
||||||
|
|
||||||
|
const STOP_ERROR_NAMES = new Set([
|
||||||
|
"quotaexceedederror",
|
||||||
|
"insufficientcreditserror",
|
||||||
"freeusagelimiterror",
|
"freeusagelimiterror",
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -106,6 +109,9 @@ export function isRetryableModelError(error: ErrorInfo): boolean {
|
|||||||
if (NON_RETRYABLE_ERROR_NAMES.has(errorNameLower)) {
|
if (NON_RETRYABLE_ERROR_NAMES.has(errorNameLower)) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if (STOP_ERROR_NAMES.has(errorNameLower)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
// Check if it's a known retryable error
|
// Check if it's a known retryable error
|
||||||
if (RETRYABLE_ERROR_NAMES.has(errorNameLower)) {
|
if (RETRYABLE_ERROR_NAMES.has(errorNameLower)) {
|
||||||
return true
|
return true
|
||||||
|
|||||||
Reference in New Issue
Block a user