anoman
Docs · Errors

Referensi kode error.

Setiap HTTP status dan error.code yang dikembalikan gateway, apa penyebabnya, dan bagaimana client Anda harus menanganinya.

Bentuk response error

Body error standar

Setiap response error dari Anoman adalah satu objek JSON dengan sebuah key error. Bentuknya cocok dengan envelope error OpenAI sehingga penanganan error SDK yang ada bekerja tanpa perubahan.

{
  "error": {
    "type": "invalid_request_error" | "guardrail_error" | "rate_limit_error" | "provider_error" | "billing_error",
    "code": "machine_readable_code",
    "message": "Human-readable explanation",
    "param": "messages.0.content"   // (optional) which field caused the error
  }
}

Field type mengelompokkan error ke dalam lima famili; code adalah string spesifik yang dapat dibaca mesin yang harus Anda switch di kode client.

Referensi

Semua kode error

Kode dikelompokkan berdasarkan famili. Kolom Retry memberi tahu apakah retry-with-backoff adalah respons yang tepat.

HTTPKodeTipePenyebabRetry?
401auth_missinginvalid_requestTidak ada header AuthorizationTidak
401auth_invalidinvalid_requestKey rusak atau tidak dikenalTidak
403auth_revokedinvalid_requestKey dicabutTidak
402budget_exceededbillingCap USD bulanan per key tercapaiTidak
402insufficient_creditsbillingSaldo prabayar habisTidak
402token_quota_exceededbillingToken cap mingguan atau bulanan tercapai untuk sebuah model tier classTidak
403prompt_injectionguardrailClassifier injeksi menandai konten penggunaTidak
403pii_blockedguardrailPII terdeteksi dan mode policy adalah `block`Tidak
403content_violationguardrailModerasi konten memblokir requestTidak
403tool_deniedguardrailNama tool muncul di denylist policyTidak
403tool_not_allowedguardrailTool tidak ada di allowlist policyTidak
400model_not_foundinvalid_requestSlug model tidak ada di katalog kamiTidak
400context_length_exceededinvalid_requestPrompt + completion melebihi context window modelTidak
400vision_not_supportedinvalid_requestInput gambar dikirim ke model teks-sajaTidak
429rate_limit_exceededrate_limitBurst guard RPM atau TPM terpicuYa
429concurrent_limit_exceededrate_limitInflight cap tercapai untuk key iniYa
503provider_unavailableproviderSemua route upstream gagal setelah retryYa
504provider_timeoutproviderUpstream tidak merespons dalam 120sYa
503cost_cap_openproviderCircuit breaker terbuka pada upstreamYa

Error auth + budget + guardrail langsung dikembalikan dan tidak akan berhasil saat retry — perbaiki request atau konfigurasinya. Error rate limit + provider bersifat transien — retry dengan exponential backoff dan hormati header Retry-After.

Blokir guardrail

Membaca error guardrail 403

Ketika guardrail memblokir sebuah request, response-nya adalah 403 dan type adalah guardrail_error. Rincian pass/fail guardrail lengkap juga diekspos pada response yang berhasil di objek _anoman.guardrails, lihat Guardrails.

{
  "error": {
    "type": "guardrail_error",
    "code": "prompt_injection",
    "message": "Request blocked by prompt injection detector (score 0.94 > threshold 0.85)."
  }
}

Blokir guardrail adalah perilaku yang benar — jangan retry secara diam-diam. Entah tampilkan ke end user (dengan pesan penolakan generik) atau eskalasikan ke antrean review manusia jika permukaannya berisiko tinggi.

Batas belanja & rate

Membaca response 402 dan 429

Jangan mengacaukan batas belanja dengan flood guard. 402 token_quota_exceeded berarti Anda mencapai token cap mingguan atau bulanan sebuah model tier class — tidak dapat di-retry sampai jendela bergulir (beli token pack, upgrade, atau ganti model class). 429 rate_limit_exceeded berarti sebuah burst guard RPM/TPM terisi penuh, dan concurrent_limit_exceeded berarti terlalu banyak request inflight bersamaan — keduanya transien, aman untuk di-retry dengan backoff.

// HTTP 402 Payment Required — the spend boundary on flat tiers.

{
  "error": {
    "type": "billing_error",
    "code": "token_quota_exceeded",
    "message": "Monthly token cap reached for the 'premium' model tier class.",
    "model_tier_class": "premium",
    "window": "monthly"
  }
}

Referensi limit per-tier + header lengkap di Rate limits.

Resep retry

Exponential backoff dengan jitter

SDK OpenAI / Anthropic sudah retry secara default, tetapi default-nya konservatif. Berikut pola eksplisit yang menghormati Retry-After:

import time
import random
from openai import OpenAI
from openai import APIStatusError

client = OpenAI(base_url="https://api.anoman.io/v1", api_key="anm-sk-...")

def chat_with_retry(messages, model="gpt-4o-mini", max_attempts=5):
    for attempt in range(max_attempts):
        try:
            return client.chat.completions.create(model=model, messages=messages)
        except APIStatusError as e:
            # Retry on 429 (rate limit), 503 (provider unavailable),
            # 504 (gateway timeout). Bail on 4xx auth/budget errors.
            if e.status_code not in {429, 503, 504}:
                raise
            if attempt == max_attempts - 1:
                raise
            # Respect Retry-After header when present.
            retry_after = float(e.response.headers.get("retry-after", 0))
            sleep = retry_after or min(2 ** attempt + random.random(), 30)
            time.sleep(sleep)

Lihat guardrail bekerja pada request nyata.

Dashboard menampilkan setiap blokir beserta prompt yang menyebabkannya.