Error
Error dikembalikan dengan status HTTP dan body JSON dalam format endpoint yang Anda panggil, sehingga SDK Anda memunculkan exception seperti biasa:
{ "error": { "message": "Your prepaid balance is used up. Add funds to continue sending requests." } }
Endpoint Messages menggunakan format Anthropic, yaitu {"type": "error", "error": {"type": "...", "message": "..."}}. message selalu menjelaskan apa yang salah dan apa yang harus dilakukan.
Kode status
| Status | Penyebab | Yang harus dilakukan | Coba ulang? |
|---|---|---|---|
400 | Request tidak valid: model tidak ada, JSON tidak valid, atau ada opsi yang tidak didukung model. | Perbaiki request. | Tidak |
401 | Key tidak ada, formatnya salah, sudah dihapus, atau sudah dirotasi. | Periksa key dan header. | Tidak |
402 | Saldo atau kredit plan sudah habis, atau pembayaran plan belum dilunasi. | Tambahkan dana atau tunggu plan diperpanjang; pesan error menyebutkan yang mana. | Setelah diperbaiki |
403 | Workspace key tidak dapat menggunakan model atau endpoint ini, misalnya key plan yang memanggil model yang tidak dicakup plan tersebut. | Gunakan key dari workspace yang memiliki akses. | Tidak |
404 | Model tidak tersedia di endpoint ini (pesan error mencantumkan model yang tersedia), path tidak ada, atau resource milik project lain. | Periksa ID model dan endpoint. | Tidak |
405 | Method tidak didukung pada path ini. | Gunakan method yang tercantum di header Allow. | Tidak |
409 | Idempotency key digunakan ulang, atau resource belum siap. | Gunakan key baru untuk request baru; tunggu resource siap. | Kadang-kadang |
413 | Body request lebih besar dari 64 MiB. | Kirim URL alih-alih data inline, atau bagi input. | Tidak |
415 | Body bukan JSON atau multipart form data. | Atur Content-Type. | Tidak |
429 | Terlalu banyak request, atau terlalu banyak yang sedang diproses sekaligus. | Tunggu sesuai Retry-After. | Ya |
500, 502 | Model gagal menyelesaikan request. | Coba ulang dengan backoff. | Ya |
503 | Masalah sementara, termasuk saat key atau saldo Anda tidak dapat diperiksa. Tidak ada yang dikirim atau ditagih. | Coba ulang sebentar lagi. | Ya |
Request yang ditolak sebelum model berjalan — semua 4xx di atas dan 503 — tidak dikenai biaya.
Mencoba ulang
Coba ulang 429, 500, 502, dan 503 dengan exponential backoff dan jitter, serta patuhi Retry-After jika ada:
async function withRetries(call, attempts = 5) {
for (let attempt = 0; ; attempt++) {
try {
return await call();
} catch (error) {
const status = error.status;
const retryable = status === 429 || status >= 500;
if (!retryable || attempt + 1 >= attempts) throw error;
const retryAfter = Number(error.headers?.["retry-after"]);
const delay = Number.isFinite(retryAfter) && retryAfter > 0
? retryAfter * 1000
: Math.min(30_000, 500 * 2 ** attempt) * (0.5 + Math.random());
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
}
SDK OpenAI dan Anthropic sudah mencoba ulang status-status ini beberapa kali; untuk job batch, naikkan maxRetries alih-alih membungkusnya dengan retry lagi.
Tambahkan Idempotency-Key pada request yang Anda coba ulang, agar retry setelah error jaringan tidak akan pernah diproses dua kali.
Error dalam stream
Setelah stream dimulai, error dikirim sebagai event di dalam stream, bukan sebagai status HTTP. Lihat streaming.
Error model
Ketika model itu sendiri tidak dapat menyelesaikan request, pesannya bersifat netral: "The model could not complete this request. Please try again." Coba ulang, atau gunakan model lain jika hal ini terus terjadi.