Galat
Galat mengikuti format endpoint yang dipanggil, sehingga SDK OpenAI dan Anthropic bisa membacanya. Status HTTP menentukan apakah SDK mencoba ulang otomatis.
Format
OpenAI (/v1/chat/completions, /v1/responses, /v1/models, gambar, dan video):
{
"error": {
"message": "Insufficient balance for this request. Top up your balance and try again.",
"type": "insufficient_balance",
"param": null,
"code": "insufficient_balance"
}
}
Anthropic (/v1/messages):
{
"type": "error",
"error": {
"type": "insufficient_balance",
"message": "Insufficient balance for this request. Top up your balance and try again."
}
}
Kode galat
| HTTP | code | Arti | Coba ulang? |
|---|---|---|---|
| 400 | invalid_json | Body bukan JSON valid. | Tidak |
| 400 | invalid_request | Parameter salah; param menunjukkan bidangnya. Misalnya max_tokens melebihi batas model, n bukan 1, atau messages kosong. | Tidak, perbaiki dulu |
| 401 | invalid_api_key | Key tidak ada, salah format, dicabut, atau kedaluwarsa. | Tidak |
| 402 | insufficient_balance | Saldo kurang untuk tahanan permintaan ini. | Tidak, isi saldo atau kecilkan max_tokens |
| 403 | account_suspended | Akun ditangguhkan. | Tidak, hubungi dukungan |
| 403 | key_spend_limit_exceeded | Key mencapai batas belanjanya. | Tidak |
| 403 | model_not_allowed | Key tidak diizinkan memakai model ini. | Tidak |
| 404 | model_not_found | Model tidak ada atau tidak tersedia. | Tidak, cek /v1/models |
| 404 | not_found | Jalur tidak dikenal. | Tidak |
| 405 | method_not_allowed | Metode HTTP salah. | Tidak |
| 413 | request_too_large | Body melebihi batas (bawaan 8 MiB; 64 KiB untuk gambar dan video). | Tidak |
| 415 | unsupported_media_type | Content-Type bukan application/json. | Tidak |
| 429 | rate_limit_exceeded | Batas permintaan per menit (key, akun, atau IP) terlampaui. | Ya, setelah Retry-After |
| 429 | too_many_concurrent_requests | Antrean permintaan bersamaan pada akun penuh. | Ya, setelah Retry-After |
| 500 | internal_error | Galat internal. | Ya, dengan jeda |
| 502 | upstream_error | Penyedia model menjawab galat. Tidak ditagih. | Ya |
| 503 | overloaded | Kapasitas penuh sementara. | Ya, setelah Retry-After |
| 503 | model_unavailable | Model sementara tidak tersedia. | Ya, atau pakai model lain |
| 504 | upstream_timeout | Penyedia model terlalu lama menjawab. Tidak ditagih. | Ya |
Kondisi yang tidak sembuh dengan mencoba ulang (saldo habis, batas belanja key) sengaja tidak memakai 429, supaya SDK tidak mengulang sia-sia. Permintaan yang Anda batalkan sendiri tercatat sebagai 499 client_closed_request di dashboard.
Strategi coba ulang
SDK OpenAI dan Anthropic otomatis mencoba ulang status 408, 409, 429, dan 5xx. Untuk klien sendiri, pakai jeda eksponensial dengan acak (jitter), hormati Retry-After, dan batasi jumlah percobaan.
import os
import openai
from openai import OpenAI
client = OpenAI(base_url="https://api.markas.ai.id/v1", api_key=os.environ["MARKASAI_API_KEY"], max_retries=3)
try:
resp = client.chat.completions.create(
model="MODEL_ID",
messages=[{"role": "user", "content": "Halo"}],
max_tokens=100,
)
except openai.APIStatusError as e:
body = e.body if isinstance(e.body, dict) else {}
print(e.status_code, body.get("code"), e.response.headers.get("x-request-id"))
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://api.markas.ai.id/v1", apiKey: process.env.MARKASAI_API_KEY, maxRetries: 3 });
try {
await client.chat.completions.create({
model: "MODEL_ID",
messages: [{ role: "user", content: "Halo" }],
max_tokens: 100,
});
} catch (err) {
if (err instanceof OpenAI.APIError) {
console.log(err.status, err.code, err.headers?.["x-request-id"]);
} else {
throw err;
}
}