500 và 502 nghĩa là có sự cố, không phải đạt giới hạn. Vì vậy đây là loại lỗi duy nhất trong nhóm này đáng được thử lại gần như ngay lập tức — khác với 429, là giới hạn tốc độ của chính bạn, và 529, là nhà cung cấp đang quá tải. Thử lại nhầm một trong ba lỗi có thể biến sự cố nhỏ thành sự cố của chính bạn.
Lỗi
// Straight from the model provider (HTTP 500)
{
"type": "error",
"error": { "type": "api_error", "message": "Internal server error" }
}
// From a gateway or proxy in between (HTTP 502)
{
"error": {
"message": "Failed to reach upstream provider",
"type": "upstream_error",
"code": "upstream_error",
"param": null
}
}Tổng quan nguyên nhân và cách khắc phục
| Nguyên nhân | Cách khắc phục |
|---|---|
| Lỗi tạm thời phía nhà cung cấp | Thử lại với exponential backoff và jitter, tối đa khoảng 5 lần. |
| Kết nối được chấp nhận nhưng sau đó không có phản hồi | Bị treo, không phải lỗi. Giới hạn riêng thời gian đến byte đầu tiên và tổng thời lượng. |
| Một thành phần trung gian trả về 502 của chính nó | Không liên quan đến mô hình. Kiểm tra xem phần thân phản hồi có dạng của nhà cung cấp hay proxy. |
| Mù quáng thử lại trong một sự cố thực sự | Giới hạn số lần thử và backoff — nếu không, các lần thử lại của bạn sẽ trở thành một phần của sự cố ngừng dịch vụ. |
Phân biệt 500 với 529 và 429 trước khi chọn cách khắc phục
429 là giới hạn tốc độ bạn đang vượt quá — hãy giảm tốc độ. 529 là nhà cung cấp đã đạt công suất — hãy backoff mạnh hơn và lâu hơn nhiều. 500/502 là lỗi, thường ngắn và thường chỉ ảnh hưởng đến một yêu cầu. Chỉ loại thứ ba đáng được thử lại nhanh, và đối xử với cả ba như nhau là lý do các vòng lặp thử lại khiến sự cố tệ hơn.
Thử lại 5xx, không bao giờ thử lại 4xx
Exponential backoff kèm jitter, tối đa năm lần thử. Cùng một helper hoạt động cho mọi nhà cung cấp — 400 hoặc 422 sẽ thất bại giống hệt ở lần thử tiếp theo, nên thử lại chỉ làm tăng độ trễ để đi đến cùng lỗi đó.
import time, random
from openai import OpenAI, APIStatusError
client = OpenAI(base_url="https://api.kunavo.com/v1", api_key="sk-kn-...")
def with_backoff(fn, max_retries=5):
for attempt in range(max_retries):
try:
return fn()
except APIStatusError as e:
if e.status_code not in (429, 500, 529):
raise # don't retry auth/validation errors
retry_after = e.response.headers.get("retry-after")
delay = float(retry_after) if retry_after else min(2 ** attempt, 30)
time.sleep(delay + random.uniform(0, 0.5)) # jitter avoids herds
raise RuntimeError("retries exhausted")
resp = with_backoff(lambda: client.chat.completions.create(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "ping"}],
max_tokens=32,
))
print(resp.choices[0].message.content)Giới hạn riêng thời gian đến byte đầu tiên và tổng thời lượng
Một timeout cho toàn bộ yêu cầu không thể phân biệt quá trình sinh nội dung lâu với kết nối đã chết. Đặt deadline ngắn cho byte đầu tiên và deadline rộng rãi cho phần còn lại; khi đó kết nối treo sẽ thất bại nhanh, còn câu trả lời thực sự chậm được phép tiếp tục.
Ghi log trạng thái và độ trễ cho từng lần thử
Không có bản ghi theo từng lần thử, sau đó bạn sẽ không thể phân biệt sự cố của nhà cung cấp với timeout của chính mình. Mã trạng thái, độ trễ và số lần thử là đủ để phân biệt chúng vào sáng hôm sau.
Nếu bạn gọi qua Kunavo
Tính đến tháng 9 năm 2026, mọi mô hình Claude trên Kunavo đều được cung cấp qua một kênh upstream duy nhất, vì vậy lỗi 5xx từ kênh đó không được thử lại bên trong yêu cầu: lỗi được chuyển đến bạn dưới dạng 502 kèm thông báo “Upstream provider error” (kiểu api_error trên /v1/messages), và yêu cầu được ghi nhận với chi phí bằng không. Cơ chế thử lại trong yêu cầu của Kunavo chỉ chạy cho mô hình được cấu hình kênh thứ hai: khi đó timeout, lỗi 5xx, 429 hoặc việc khóa upstream riêng của Kunavo bị từ chối sẽ được thử lại trên kênh đó trước khi đến bạn, trên /v1/messages, /v1/responses và các mô hình Claude trên /v1/chat/completions. Một stream được giữ lại cho đến khi nội dung đầu tiên xuất hiện, nên lỗi trong stream chưa bắt đầu cũng được thử lại; khi nội dung đã bắt đầu chảy, lỗi giữa stream là việc bạn phải tự xử lý. Dù thế nào, hãy giữ chính sách thử lại trên trang này ở phía bạn. Định tuyến phía sau hành vi đó được mô tả trong hướng dẫn cổng AI của chúng tôi.
Câu hỏi thường gặp
Yêu cầu trả về 500 có bị tính phí không?
Trên Kunavo thì không — các yêu cầu thất bại được ghi nhận với chi phí bằng không. Khi thanh toán trực tiếp cho nhà cung cấp, cách tính phí có thể khác, nhưng lỗi 5xx nhìn chung không bị tính phí.
Thử lại 500 có thể tạo ra hai lần hoàn tất không?
Có. Một yêu cầu có thể thất bại sau khi mô hình đã sinh nội dung. Nếu công việc có tác dụng phụ, hãy làm cho nó idempotent ở tầng của bạn trước khi thêm cơ chế thử lại.
Khác biệt một dòng giữa 500, 502 và 529 là gì?
500 là nhà cung cấp gặp lỗi, 502 là một thành phần đứng trước không thể kết nối với nhà cung cấp, còn 529 là nhà cung cấp đã đạt công suất — hãy sớm thử lại hai lỗi đầu, nhưng chờ lâu hơn nhiều với lỗi thứ ba.
Hướng dẫn liên quan
- Claude API 529 overloaded_error — lỗi này là gì và cách vượt qua
- Claude API 429 rate_limit_error — nguyên nhân và cách khắc phục hiệu quả
Thông tin chi tiết hơn về ý nghĩa lỗi có trong tài liệu tham chiếu lỗi; bạn chỉ mất một phút để lấy khóa qua đăng ký và hướng dẫn xác thực.