Tách rõ lỗi trước khi phát token đầu tiên và lỗi giữa chừng — hai loại này xử lý khác hẳn nhau.
Chưa phát token nào: retry an toàn, người dùng không thấy gì. Retry khi gặp 429, 500, 502, 503, 529 và lỗi mạng/timeout. Không retry 400 (prompt sai), 401, 403, 422 — thử lại chỉ tốn thêm tiền vì kết quả không đổi.
Đã phát chữ ra màn hình: không thể retry ngầm rồi in lại từ đầu, người dùng thấy chữ nhảy loạn. Hai lựa chọn: dừng lại và hiện nút "Tiếp tục", hoặc gọi lại với phần đã sinh nối vào cuối prompt để model viết tiếp.
Timeout đặt hai mức, không đặt một mức duy nhất:
- Timeout tới token đầu tiên ngắn (10–20 giây) — quá đó coi như provider có vấn đề, chuyển hướng ngay.
- Timeout toàn request dài hơn (60–120 giây) và chỉ tính lại khi còn nhận được chunk. Đặt một timeout cứng 30 giây cho cả request sẽ giết oan những câu trả lời dài đang chạy bình thường.
Backoff: exponential + jitter. Với 429, đọc header retry-after của provider thay vì tự đoán. Giới hạn 2–3 lần thử: retry nhiều hơn chỉ làm tình trạng quá tải nặng thêm và kéo dài thời gian chờ của người dùng.