fix(#2885): add model_not_supported to RETRYABLE error patterns
model_not_supported errors from providers (e.g. OpenAI returning
{"error": {"code": "model_not_supported"}}) were not recognized as
retryable. Subagents would silently fail with no response, hanging the
parent session.
Fix:
- Add "model_not_supported", "model not supported", "model is not
supported" to RETRYABLE_MESSAGE_PATTERNS in model-error-classifier.ts
- Add regex patterns to RETRYABLE_ERROR_PATTERNS in
runtime-fallback/constants.ts to match "model ... is ... not ...
supported" with flexible spacing
- Add regression test covering all three variations
Now model_not_supported errors trigger the normal fallback chain instead
of silent failure.
This commit is contained in:
@@ -31,6 +31,8 @@ export const RETRYABLE_ERROR_PATTERNS = [
|
|||||||
/cool(?:ing)?\s+down/i,
|
/cool(?:ing)?\s+down/i,
|
||||||
/exhausted\s+your\s+capacity/i,
|
/exhausted\s+your\s+capacity/i,
|
||||||
/usage\s+limit\s+has\s+been\s+reached/i,
|
/usage\s+limit\s+has\s+been\s+reached/i,
|
||||||
|
/model.{0,20}?not.{0,10}?supported/i,
|
||||||
|
/model_not_supported/i,
|
||||||
/service.?unavailable/i,
|
/service.?unavailable/i,
|
||||||
/overloaded/i,
|
/overloaded/i,
|
||||||
/temporarily.?unavailable/i,
|
/temporarily.?unavailable/i,
|
||||||
|
|||||||
@@ -276,4 +276,21 @@ describe("quota error detection (fixes #2747)", () => {
|
|||||||
expect(errorType).toBe("quota_exceeded")
|
expect(errorType).toBe("quota_exceeded")
|
||||||
expect(retryable).toBe(true)
|
expect(retryable).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("detects model_not_supported errors as retryable for fallback chain", () => {
|
||||||
|
//#given
|
||||||
|
const error1 = { message: "model_not_supported" }
|
||||||
|
const error2 = { message: "The model 'gpt-4-foo' is not supported by this API" }
|
||||||
|
const error3 = { message: "model not supported on free tier" }
|
||||||
|
|
||||||
|
//#when
|
||||||
|
const retryable1 = isRetryableError(error1, [400, 404])
|
||||||
|
const retryable2 = isRetryableError(error2, [400, 404])
|
||||||
|
const retryable3 = isRetryableError(error3, [400, 404])
|
||||||
|
|
||||||
|
//#then
|
||||||
|
expect(retryable1).toBe(true)
|
||||||
|
expect(retryable2).toBe(true)
|
||||||
|
expect(retryable3).toBe(true)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ const RETRYABLE_MESSAGE_PATTERNS = [
|
|||||||
"bad gateway",
|
"bad gateway",
|
||||||
"unknown provider",
|
"unknown provider",
|
||||||
"provider not found",
|
"provider not found",
|
||||||
|
"model_not_supported",
|
||||||
|
"model not supported",
|
||||||
|
"model is not supported",
|
||||||
"connection error",
|
"connection error",
|
||||||
"network error",
|
"network error",
|
||||||
"timeout",
|
"timeout",
|
||||||
|
|||||||
Reference in New Issue
Block a user