Bỏ qua, tới nội dung chính

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

HTTPTypeÝ nghĩa
context_length_exceeded400invalid_request_errorInput 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_supported400invalid_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_json400invalid_request_errorBody 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_request400invalid_request_errorModel từ chối body vì không hợp lệ với chính model đó.
json_mode_no_stream400invalid_request_errorKhông kết hợp được response format JSON với stream. Hãy xin JSON ở chế độ không stream.
json_mode_not_supported400invalid_request_errorModel này không ép được response format JSON.
max_tokens_exceeds_cap400invalid_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_messages400invalid_request_errorBody thiếu mảng messages.
missing_model400invalid_request_errorBody thiếu trường model. Gửi một id lấy từ GET /v1/models.
n_not_allowed400invalid_request_errorXin 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_supported400invalid_request_errorModel 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_supported400invalid_request_errorModel này không gọi được tool. Chọn model có tools trong danh sách khả năng.
unknown_parameter400invalid_request_errorMộ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_available400invalid_request_errorModel này không đọc được ảnh. Chọn model có vision trong danh sách khả năng.
invalid_api_key401authentication_errorKey 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_allowed401authentication_errorKey đúng nhưng IP gọi nằm ngoài allowlist của key. Cập nhật allowlist trên key.
key_expired401authentication_errorKey đã quá hạn. Tạo key mới.
key_revoked401authentication_errorKey đã bị thu hồi trong dashboard. Tạo key mới.
insufficient_credits402insufficient_creditsSố 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_scope403permission_errorKey thiếu scope mà endpoint này cần, ví dụ usage:read.
model_not_allowed403permission_errorModel có tồn tại nhưng nằm ngoài danh sách model cho phép của key này.
org_suspended403permission_errorTổ 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_found404not_found_errorKhô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_found404not_found_errorKhông có model đó, hoặc nó đang tắt. Xem GET /v1/models để biết danh sách hiện tại.
route_not_found404not_found_errorPath 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_timeout408timeout_errorModel 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_flight409invalid_request_errorCùng một Idempotency-Key đang được xử lý dở. Chờ lần gọi đầu tiên xong đã.
request_too_large413invalid_request_errorBody 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_reused422invalid_request_errorCù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_exceeded429rate_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_exceeded429rate_limit_errorQuá 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_exceeded429rate_limit_errorHế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_error500api_errorLỗ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_error500api_errorCấ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_error502api_errorNhà cung cấp lỗi sau khi hệ thống đã thử lại. Thử lại có giãn cách.
no_capacity503service_unavailable_errorNă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èm retry-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;
}