Mã lỗi
Mọi lỗi — validate, billing, upstream — dùng một envelope mà SDK OpenAI vốn đã parse được. Cùng một request hỏng luôn nhận cùng một lỗi, nên logic retry tin được thứ nó đọc.
Envelope
mọi lỗi, mọi endpoint
{
"error": {
"message": "max_tokens (32768) exceeds the limit for your organization (16384).",
"type": "invalid_request_error",
"param": "max_tokens",
"code": "max_tokens_exceeds_cap",
"metadata": {}
}
}type— taxonomy ổn định để rẽ nhánh (khớp bảng dưới).code— mã chi tiết cho máy xử lý.param— trường gây lỗi, khi xác định được.metadata— dữ liệu phụ ở một số lỗi, ví dụ số dư khả dụng trong lỗi 402.
Toàn bộ mã lỗi
| Mã | HTTP | Type | Ý nghĩa |
|---|---|---|---|
context_length_exceeded | 400 | invalid_request_error | Input cộng max_tokens vượt cửa sổ context của model. Message lỗi kèm số ước lượng và giới hạn. Rút gọn hội thoại hoặc giảm max_tokens; request bị từ chối không bị tính tiền. |
image_url_not_supported | 400 | invalid_request_error | Ảnh phải nhúng thẳng dạng data: URI base64. Link ảnh http(s) không được tải về. |
invalid_json | 400 | invalid_request_error | Body không phải JSON hợp lệ. Kiểm tra dấu phẩy thừa hoặc payload bị cắt cụt. |
invalid_request | 400 | invalid_request_error | Model từ chối body vì không hợp lệ với chính model đó. |
json_mode_no_stream | 400 | invalid_request_error | Không kết hợp được response format JSON với stream. Hãy xin JSON ở chế độ không stream. |
json_mode_not_supported | 400 | invalid_request_error | Model này không ép được response format JSON. |
max_tokens_exceeds_cap | 400 | invalid_request_error | Độ dài output yêu cầu vượt trần của tổ chức. Message ghi rõ trần hiện hành. |
missing_messages | 400 | invalid_request_error | Body thiếu mảng messages. |
missing_model | 400 | invalid_request_error | Body thiếu trường model. Gửi một id lấy từ GET /v1/models. |
n_not_allowed | 400 | invalid_request_error | Xin nhiều hơn một câu trả lời bị tắt mặc định vì nó nhân hóa đơn lên trong im lặng. Liên hệ hỗ trợ nếu cần bật. |
reasoning_effort_not_supported | 400 | invalid_request_error | Model này không nhận mức reasoning_effort đó; message lỗi liệt kê các mức dùng được. |
tools_not_supported | 400 | invalid_request_error | Model này không gọi được tool. Chọn model có tools trong danh sách khả năng. |
unknown_parameter | 400 | invalid_request_error | Một trường cấp cao nhất không thuộc API; tên trường nằm ở param. Hầu như luôn là gõ nhầm. |
vision_not_available | 400 | invalid_request_error | Model này không đọc được ảnh. Chọn model có vision trong danh sách khả năng. |
invalid_api_key | 401 | authentication_error | Key không tồn tại. Kiểm tra đã chép trọn vẹn chưa, kể cả tiền tố sk-gw-. |
ip_not_allowed | 401 | authentication_error | Key đúng nhưng IP gọi nằm ngoài allowlist của key. Cập nhật allowlist trên key. |
key_expired | 401 | authentication_error | Key đã quá hạn. Tạo key mới. |
key_revoked | 401 | authentication_error | Key đã bị thu hồi trong dashboard. Tạo key mới. |
insufficient_credits | 402 | insufficient_credits | Số dư không đủ cho chi phí ước tính của request; metadata mang số dư khả dụng và mức ước tính. Nạp tiền rồi thử lại. |
missing_scope | 403 | permission_error | Key thiếu scope mà endpoint này cần, ví dụ usage:read. |
model_not_allowed | 403 | permission_error | Model có tồn tại nhưng nằm ngoài danh sách model cho phép của key này. |
org_suspended | 403 | permission_error | Tổ chức đang bị khóa. Thử lại không giải quyết được — hãy liên hệ hỗ trợ. |
generation_not_found | 404 | not_found_error | Không có request nào với id đó thuộc tổ chức của bạn, hoặc nó chưa chốt sổ xong. Thử lại sau vài giây. |
model_not_found | 404 | not_found_error | Không có model đó, hoặc nó đang tắt. Xem GET /v1/models để biết danh sách hiện tại. |
route_not_found | 404 | not_found_error | Path không tồn tại. Chạm /chat/completions mà thiếu /v1 nghĩa là base_url thiếu "/v1"; path /v1/v1/ nghĩa là thừa một /v1. |
request_timeout | 408 | timeout_error | Model không trả lời kịp, sau khi hệ thống đã tự thử lại. Thử lại có giãn cách. |
idempotency_key_in_flight | 409 | invalid_request_error | Cùng một Idempotency-Key đang được xử lý dở. Chờ lần gọi đầu tiên xong đã. |
request_too_large | 413 | invalid_request_error | Body vượt trần kích thước. Cắt bớt ngữ cảnh hoặc chia nhỏ công việc. |
idempotency_key_reused | 422 | invalid_request_error | Cùng một Idempotency-Key nhưng body khác. Mỗi request khác nhau phải dùng key mới. |
daily_budget_exceeded | 429 | rate_limit_error | Đã chạm trần chi tiêu ngày. retry-after đếm tới nửa đêm UTC, nên hãy nâng trần thay vì ngồi chờ. |
rpm_exceeded | 429 | rate_limit_error | Quá nhiều request trong phút này. retry-after cho biết còn bao nhiêu giây của cửa sổ; cùng mã này mà retry-after bằng 1 nghĩa là suất chạy song song đang đầy tạm thời. |
tpm_exceeded | 429 | rate_limit_error | Hết hạn mức token của phút này. retry-after cho biết số giây còn lại của cửa sổ. |
internal_error | 500 | api_error | Lỗi phía chúng tôi. Sự cố được ghi nhận tự động; thử lại, còn lặp lại thì liên hệ hỗ trợ. |
upstream_config_error | 500 | api_error | Cấu hình ánh xạ model phía chúng tôi bị sai. Đội kỹ thuật đã được cảnh báo tự động. |
upstream_error | 502 | api_error | Nhà cung cấp lỗi sau khi hệ thống đã thử lại. Thử lại có giãn cách. |
no_capacity | 503 | service_unavailable_error | Năng lực phục vụ tạm thời không còn. retry-after là 10 giây và request này không bị tính tiền. |
Lỗi giữa stream
Stream đã bắt đầu thì HTTP đã là 200 — lỗi đến dưới dạng chunk cuối mang finish_reason: "error" kèm đúng envelope này trong trường error. Mẫu và code bắt lỗi: Streaming.
Hướng dẫn retry
- Retry có giãn cách:
request_timeout,upstream_error,no_capacity, và các 429 kèmretry-after— SDK OpenAI vốn tự làm. - Sửa rồi mới gửi lại: mọi 400/401/403/404/413/422 — vấn đề nằm ở chính request.
- Hành động thay vì retry:
insufficient_credits(nạp tiền) vàdaily_budget_exceeded(nâng trần hoặc chờ 00:00 UTC).
Bắt lỗi 402 trong code của bạn
SDK OpenAI không có exception class riêng cho 402 — nó hiện ra dưới dạng APIStatusError chung (Python) / APIError (Node), nên handler chỉ viết cho RateLimitError hay AuthenticationError sẽ bỏ lọt. Rẽ nhánh theo status hoặc error.code:
bắt 402
# Python
import openai
try:
resp = client.chat.completions.create(...)
except openai.APIStatusError as e:
if e.status_code == 402:
print("Hết credit:", e.body["error"]["message"]) # có sẵn số dư + link nạp
else:
raise
// Node
try {
const resp = await client.chat.completions.create({...});
} catch (err) {
if (err instanceof OpenAI.APIError && err.status === 402) {
console.error('Hết credit:', err.error?.message);
} else throw err;
}