Errors
Model-call failures return OpenAI-compatible error objects:
Status Codes
Debug Fields
Retry Check
Do not infinitely retry 400, 401, 402, or 403. Fix the request, auth, budget, or policy first.
Model-call failures return OpenAI-compatible error objects:
1 { 2 "error": { 3 "message": "missing api key", 4 "type": "missing_api_key" 5 } 6 }
| HTTP status | error.type | Cause | Fix |
|---|---|---|---|
400 | invalid_request_error | Invalid body, empty messages, or oversized body | Fix request; do not retry |
401 | missing_api_key | No API key | Add Bearer key |
403 | invalid_api_key | Key is invalid or not ACTIVE | Use a valid key |
403 | policy_rejected | IP, model, tier, or policy is not allowed | Adjust key policy |
402 | insufficient_quota | Quota or wallet balance is insufficient | Top up or adjust budget |
502 | routing_error | No usable model or routing failed | Short backoff retry |
502 | upstream_error | Upstream model failed | Short backoff retry |
503 / 504 | upstream_error | Dependency unavailable or timed out | Exponential backoff retry |
| Field | Source |
|---|---|
X-Request-ID | Request header |
model / tier | Request body |
| HTTP status | Response status |
error.type / error.message | Error response body |
X-DAOE-Used-Model | Successful response header |
X-DAOE-Used-Provider | Successful response header |
1 export function shouldRetryJoyTokenError(status: number, type?: string) { 2 if (status === 503 || status === 504) return true; 3 if (status === 502 && (type === "routing_error" || type === "upstream_error")) return true; 4 return false; 5 }
Do not infinitely retry 400, 401, 402, or 403. Fix the request, auth, budget, or policy first.