Skip to content

Commit 0997749

Browse files
committed
fix: stop retrying non-transient rate limits (weekly/monthly quotas)
1 parent 9b6db08 commit 0997749

2 files changed

Lines changed: 29 additions & 0 deletions

File tree

packages/opencode/src/session/retry.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ export function retryable(error: Err) {
6060
// even when the provider SDK doesn't explicitly mark them as retryable.
6161
if (!error.data.isRetryable && !(status !== undefined && status >= 500)) return undefined
6262
if (error.data.responseBody?.includes("FreeUsageLimitError")) return GO_UPSELL_MESSAGE
63+
// Non-transient rate limits (weekly/monthly quotas) should not be retried
64+
// they won't resolve with backoff and can take days to reset.
65+
const lower = error.data.message.toLowerCase()
66+
if (
67+
lower.includes("weekly") ||
68+
lower.includes("monthly") ||
69+
lower.includes("exceeded your")
70+
)
71+
return undefined
6372
return error.data.message.includes("Overloaded") ? "Provider is overloaded" : error.data.message
6473
}
6574

packages/opencode/test/session/retry.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,26 @@ describe("session.retry.retryable", () => {
230230
expect(retryable).toBeDefined()
231231
expect(retryable).toBe("Response decompression failed")
232232
})
233+
234+
test("does not retry weekly rate limit errors", () => {
235+
const error = new MessageV2.APIError({
236+
message: "Too Many Requests: Sorry, you've exceeded your weekly rate limit. Please review ...",
237+
isRetryable: true,
238+
statusCode: 429,
239+
}).toObject() as MessageV2.APIError
240+
241+
expect(SessionRetry.retryable(error)).toBeUndefined()
242+
})
243+
244+
test("does not retry monthly quota errors", () => {
245+
const error = new MessageV2.APIError({
246+
message: "You have exceeded your monthly usage quota",
247+
isRetryable: true,
248+
statusCode: 429,
249+
}).toObject() as MessageV2.APIError
250+
251+
expect(SessionRetry.retryable(error)).toBeUndefined()
252+
})
233253
})
234254

235255
describe("session.message-v2.fromError", () => {

0 commit comments

Comments
 (0)