fix(model-core): retry OpenAI usage_limit_reached fallbacks

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
YeonGyu-Kim
2026-05-25 17:09:19 +09:00
parent 6343feb608
commit 767f5a6148
3 changed files with 22 additions and 3 deletions
@@ -0,0 +1,18 @@
import { describe, expect, test } from "bun:test"
import { shouldRetryError } from "./model-error-classifier"
describe("model-error-classifier OpenAI usage_limit_reached", () => {
test("treats OpenAI usage_limit_reached response bodies as retryable provider exhaustion", () => {
//#given
const error = {
name: "AI_APICallError",
message: '{"error":{"type":"usage_limit_reached","message":"The usage limit has been reached"}}',
}
//#when
const result = shouldRetryError(error)
//#then
expect(result).toBe(true)
})
})
@@ -172,7 +172,7 @@ describe("model-error-classifier", () => {
expect(result).toBe(false) expect(result).toBe(false)
}) })
test("treats usage limit reached message as non-retryable STOP error (no error name)", () => { test("treats provider usage limit reached message as retryable fallback signal", () => {
//#given //#given
const error = { message: "usage limit has been reached for your account" } const error = { message: "usage limit has been reached for your account" }
@@ -180,7 +180,7 @@ describe("model-error-classifier", () => {
const result = shouldRetryError(error) const result = shouldRetryError(error)
//#then //#then
expect(result).toBe(false) expect(result).toBe(true)
}) })
test("treats insufficient credits message as non-retryable STOP error (no error name)", () => { test("treats insufficient credits message as non-retryable STOP error (no error name)", () => {
@@ -40,6 +40,8 @@ const NON_RETRYABLE_ERROR_NAMES = new Set([
const RETRYABLE_MESSAGE_PATTERNS = [ const RETRYABLE_MESSAGE_PATTERNS = [
"rate_limit", "rate_limit",
"rate limit", "rate limit",
"usage_limit_reached",
"usage limit has been reached",
"quota", "quota",
"all credentials for model", "all credentials for model",
"cooling down", "cooling down",
@@ -92,7 +94,6 @@ const RETRYABLE_MESSAGE_PATTERNS = [
const STOP_MESSAGE_PATTERNS = [ const STOP_MESSAGE_PATTERNS = [
"quota will reset after", "quota will reset after",
"quota exceeded", "quota exceeded",
"usage limit has been reached",
"free usage limit", "free usage limit",
"billing limit", "billing limit",
"billing hard limit", "billing hard limit",