Bug Report
What happened?
When Anthropic's API returns a transient server error (HTTP 500, 502, 503, or 504), OpenCode does not retry the request — it immediately fails with an error like:
{"type":"api_error","message":"Claude API returned a server error. This is usually temporary — try again in a moment."}
Expected behavior
Transient server errors should be retried with exponential backoff, the same way rate-limit errors (429) and overload errors (529) already are.
Root cause
In packages/opencode/src/provider/error.ts, parseAPICallError() trusts input.error.isRetryable from the Vercel AI SDK for non-OpenAI providers. The @ai-sdk/anthropic package only marks status codes 429 and 529 as isRetryable: true. Generic 500/502/503/504 responses get isRetryable: false, so SessionRetry.retryable() returns undefined and the retry loop stops immediately.
OpenAI already has a special override in isOpenAiErrorRetryable() — the same approach needs to be applied universally.
Environment
- OpenCode version: latest dev
- Provider: Anthropic (Claude)
Bug Report
What happened?
When Anthropic's API returns a transient server error (HTTP 500, 502, 503, or 504), OpenCode does not retry the request — it immediately fails with an error like:
Expected behavior
Transient server errors should be retried with exponential backoff, the same way rate-limit errors (429) and overload errors (529) already are.
Root cause
In
packages/opencode/src/provider/error.ts,parseAPICallError()trustsinput.error.isRetryablefrom the Vercel AI SDK for non-OpenAI providers. The@ai-sdk/anthropicpackage only marks status codes 429 and 529 asisRetryable: true. Generic 500/502/503/504 responses getisRetryable: false, soSessionRetry.retryable()returnsundefinedand the retry loop stops immediately.OpenAI already has a special override in
isOpenAiErrorRetryable()— the same approach needs to be applied universally.Environment