Laras RouterDocs

Panduan

Error & retry

Semua kode error yang dikembalikan API, artinya, dan kapan perlu mencoba lagi.

Di halaman ini

Error memakai format error OpenAI, jadi SDK OpenAI memunculkannya sebagai exception biasa. Buat logika berdasarkan error.code (dan error.type), jangan berdasarkan teks pesan.

402 Payment Required
{
  "error": {
    "message": "Insufficient balance. Top up to continue.",
    "type": "insufficient_quota",
    "code": "insufficient_credit",
    "param": null
  }
}

message berbahasa Inggris secara default. Kirim Accept-Language: id untuk menerimanya dalam Bahasa Indonesia. code dan type selalu sama di semua bahasa.

Kode error

StatusKodeTipeArtiYang perlu dilakukan
400invalid_requestinvalid_request_errorBody bukan JSON yang valid atau tidak menyebutkan model.Perbaiki request. Jangan diulang.
400max_tokens_exceededinvalid_request_errormax_tokens atau max_completion_tokens di atas 384.000.Turunkan nilainya. Jangan diulang.
400unsupported_contentinvalid_request_errorAda pesan yang berisi gambar atau bagian non-teks lainnya.Kirim teks saja. Jangan diulang.
401invalid_api_keyinvalid_request_errorKunci tidak ada, formatnya salah, sudah dicabut, atau tidak dikenal.Periksa header dan kuncinya. Jangan diulang.
402insufficient_creditinsufficient_quotaSaldo tersedia Anda $0.00 atau kurang.Isi saldo, lalu coba lagi.
402key_budget_exceededinsufficient_quotaRequest ini akan membuat kunci melampaui anggaran bulanannya.Naikkan atau hapus anggaran di konsol, atau tunggu bulan berikutnya (WIB).
403insufficient_scopeinsufficient_permissionsKunci tidak memiliki scope chat:write.Gunakan kunci dengan scope yang benar. Jangan diulang.
404model_not_foundinvalid_request_errorID model tidak tersedia.Gunakan deepseek-flash. Jangan diulang.
404not_foundinvalid_request_errorEndpoint tidak dikenal.Periksa path; base URL berakhiran /v1.
405method_not_allowedinvalid_request_errorMetode HTTP salah untuk endpoint ini.Gunakan POST untuk chat completions, GET untuk models.
413request_too_largeinvalid_request_errorBody melebihi batas ukuran request.Persingkat prompt atau riwayat percakapan.
429rate_limit_exceededrate_limit_exceededLebih dari 300 request dalam satu menit pada kunci ini.Tunggu sesuai Retry-After, lalu coba lagi.
429concurrency_limit_exceededrate_limit_exceededLebih dari 16 request berjalan bersamaan pada kunci ini.Tunggu sesuai Retry-After atau sampai ada request yang selesai.
429ip_rate_limitedrate_limit_exceededTerlalu banyak request dari satu alamat IP.Tunggu sesuai Retry-After, lalu coba lagi.
500internal_errorapi_errorKesalahan server yang tidak terduga.Coba lagi dengan backoff.
502provider_unavailableapi_errorPenyedia model gagal atau tidak bisa dihubungi.Coba lagi dengan backoff.
503billing_unavailableapi_errorBilling sementara tidak tersedia; request tidak dijalankan.Coba lagi dengan backoff. Anda tidak ditagih.
503service_unavailableapi_errorLayanan sementara tidak tersedia.Coba lagi dengan backoff.

Error lain yang dikembalikan penyedia model — misalnya 400 untuk kombinasi parameter yang tidak didukungnya — diteruskan dengan body error asli dari penyedia.

Kapan mencoba lagi

Ulangi hanya 429, 500, 502, dan 503. Error lainnya perlu perubahan pada request, kunci, atau saldo Anda terlebih dahulu.

  • 429: tunggu sejumlah detik sesuai header Retry-After sebelum mencoba lagi.
  • 5xx: gunakan exponential backoff dengan jitter, misalnya 1 dtk, 2 dtk, 4 dtk, dan berhenti setelah beberapa kali percobaan.
  • Setiap percobaan ulang adalah request baru. Request itu ditahan, diukur, dan ditagih sendiri.

SDK resmi OpenAI sudah otomatis mengulang respons 429 dan 5xx beberapa kali dengan backoff, dan menghormati Retry-After. Anda bisa menaikkan batasnya:

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.larasrouter.com/v1",
    api_key=os.environ["LARAS_API_KEY"],
    max_retries=4,
)

Tangani error berdasarkan kode

Python
import openai

try:
    response = client.chat.completions.create(
        model="deepseek-flash",
        messages=[{"role": "user", "content": "Halo"}],
    )
except openai.APIStatusError as e:
    # SDK menyediakan error.code dari body respons sebagai e.code.
    if e.code == "insufficient_credit":
        notify_owner("Saldo Laras Router habis — isi saldo untuk melanjutkan.")
    elif e.code == "key_budget_exceeded":
        notify_owner("Kunci ini sudah mencapai anggaran bulanannya.")
    else:
        raise

Request yang gagal dan tagihan

  • Request yang ditolak sebelum sampai ke model — semua 400, 401, 402, 403, 404, 413, 429 dari Laras Router — tidak pernah ditagih.
  • Request yang ditolak penyedia model dengan 4xx tidak ditagih; hold-nya dilepas.
  • Request yang gagal dengan 5xx, timeout, atau terputus tetap ditahan hold-nya selama kami melakukan rekonsiliasi. Anda mungkin ditagih untuk pemakaian yang dilaporkan penyedia; jika tidak ada, hold dilepas tanpa biaya.

Request ID

Respons untuk request yang sudah sampai ke tahap billing membawa header X-Laras-Request-ID. Header ini mengidentifikasi tagihan dan hold untuk request tersebut. Sertakan saat Anda menghubungi support soal tagihan. Request yang ditolak sebelum hold dibuat — misalnya 401 — mungkin tidak membawanya.