Hata kodları — zarf (envelope), kodlar, yeniden deneme anlambilimi
Tek hata zarfı şekli, 14 kodluk katalog, hangi kodlar otomatik-yeniden-deneme için uygun, idempotency anahtarı + hız limiti başlıkları.
Her Moonborn hata yanıtı aynı zarfı (envelope) paylaşır — işleyicin tek bir yerden ayrıştırabilir, sınıflandırabilir, yeniden deneme kararı verebilir.
Bu sayfayı bitirdiğinde
- Hata zarf şeklini bileceksin.
- HTTP durum kodu → hata kodu eşleşmesini ayırt edebileceksin.
- 14 kodluk katalogu ve hangi kodların otomatik yeniden denemeye uygun olduğunu öğreneceksin.
- Idempotency anahtarını ve hız limiti başlıklarını doğru kullanabileceksin.
Ön koşul: Bir API çağrısı yapmış olmak; mevcut bir SDK entegrasyonu olabilir.
Zarf şekli
{
"error": {
"code": "rate_limited",
"message": "Per-minute API rate limit exceeded.",
"details": { "retryAfter": 12 }
}
}| Alan | Anlamı |
|---|---|
code | Stabil, makine-okunabilir metin. Kontrol akışını koda göre yaz. |
message | İnsan-okunabilir; kayıtlarda göstermek güvenli. Son kullanıcıya doğrudan gösterme — çeviri yap. |
details | Koda özgü alanlar (örn. retryAfter saniye, validationErrors[], conflictField). |
HTTP durum kodu → ne anlama gelir
| Durum | Ne zaman |
|---|---|
400 | Bozuk istek — ayrıştırma (parse) hatası, eksik zorunlu alan |
401 | Eksik veya geçersiz Bearer token |
403 | Kimlik doğrulandı ama yetki yok — yetki kapsamı (scope) / rol yetersiz |
404 | Kaynak bulunamadı |
409 | Çakışma — idempotency anahtarı çakışması, drift engellemesi, durum makinesi reddi |
422 | Doğrulama hatası — şekil geçerli, anlam değil |
429 | Hız sınırı veya kota aşıldı |
500 | Beklenmeyen sunucu hatası |
502 / 503 / 504 | Üst akıştaki (upstream) LLM sağlayıcı sorunu — yeniden deneme adayı |
14 kodluk katalog
| Kod | Durum | Anlam |
|---|---|---|
unauthorized | 401 | Bearer token eksik veya süresi dolmuş |
forbidden | 403 | Token geçerli, yetki / rol yetersiz |
not_found | 404 | Kaynak yok veya çağırana görünür değil |
validation_failed | 422 | Gövde (body) şekli geçerli ama değer aralığı / numaralandırma (enum) / zorunlu alan uyumsuzluğu |
idempotency_conflict | 409 | Aynı idempotency anahtarı, farklı yük |
state_conflict | 409 | Durum makinesi geçişi reddetti (örn. zaten silinmiş persona'yı arşivleme) |
drift_blocked | 409 | Drift detection action=block ile tetiklendi |
audit_blocked | 409 | Denetim kararı eşik altı; persona flagged (işaretli) döndü |
moderation_blocked | 422 | Çıktı moderasyonu reddetti |
rate_limited | 429 | Dakika başı üst sınır aşıldı; details.retryAfter saniye taşır |
quota_exceeded | 429 | Aylık kota aşıldı (örn. üretim kotası) |
provider_error | 502 | Üst akıştaki LLM sağlayıcı hatası |
provider_timeout | 504 | Üst akıştaki LLM sağlayıcı zaman aşımı |
internal_error | 500 | Ele alınmamış istisna (bizde kayda alındı) |
Yeniden deneme anlambilimi
SDK'lar bu kodları üstel geri çekilmeyle (exponential backoff) otomatik yeniden dener:
| Kod | Varsayılan yeniden deneme politikası |
|---|---|
provider_error (5xx) | 3 yeniden deneme, üstel geri çekilme (1s, 2s, 4s) |
provider_timeout (504) | 3 yeniden deneme, üstel geri çekilme |
rate_limited (429) | Retry-After başlığına uyar, en fazla 3 yeniden deneme |
Bu kodlar asla otomatik yeniden denenmez — çağıran tarafın kararı gerekir:
| Kod | Neden yeniden deneme değil |
|---|---|
validation_failed | Önce isteği düzelt (yeniden deneme aynı hatayı verir) |
idempotency_conflict | Anahtarı değiştir |
drift_blocked | Arayüzde kullanıcıya uyarı göster, persona'yı refine et |
audit_blocked | Elle inceleme kuyruğuna al |
moderation_blocked | İçerik politikası ihlali — kayda al + elle incele |
forbidden | Yetki / rol düzeltilmedikçe aynı sonuç |
Idempotency anahtarı
Her yazma isteği bir Idempotency-Key başlığı kabul eder:
curl -X POST https://api.moonborn.co/v1/personas \
-H "Authorization: Bearer $MOONBORN_API_KEY" \
-H "Idempotency-Key: persona-build-2026-05-17-mert" \
-H "Content-Type: application/json" \
-d '{"intent": "..."}'24 saat içindeki yeniden gönderimler orijinal yanıtı döndürür — aynı gövde sağlama toplamı (checksum) → önbelleğe alınmış yanıt. SDK'lar varsayılan olarak UUID otomatik üretir; belirleyici (deterministik) iş anahtarın varsa geçersiz kıl.
Hız limiti başlıkları
Her yanıt (başarı veya hata) şunları taşır:
X-RateLimit-Limit: 3000
X-RateLimit-Remaining: 2987
X-RateLimit-Reset: 1747498200429'da ek olarak:
Retry-After: 12İstemci tarafı geri basınç (backpressure) için X-RateLimit-Remaining izle — üst sınırın %10'unun altındaysa yavaşla. Detay: Hız limitleri.
Sık karşılaşılan hatalar
"validation_failed" alıyorum ama alan eksik değil
details.validationErrors[] dizisine bak — hangi alanda hangi kural başarısız oldu:
{
"error": {
"code": "validation_failed",
"message": "Request body validation failed.",
"details": {
"validationErrors": [
{ "path": "soul.desire", "code": "min_length", "value": 5, "expected": 20 }
]
}
}
}soul.desire 20 karakterden kısa demiş — gövdeyi düzelt.
"drift_blocked" sürekli geliyor
engine.pipeline.drift_detection.action_on_alert = block modu etkin. Üretimde çok kullanıcı block nedeniyle şikayet ediyorsa auto_recover'a çevir (sessizce düzeltir) veya eşiği gevşet. Detay: Drift eşik ayarı.
"rate_limited" → "quota_exceeded" arasındaki fark?
Aynı durum kodu (429), farklı code:
rate_limited— dakika başı üst sınırı aştın;Retry-Aftersaniyeleri bekle, devam et.quota_exceeded— aylık kota tükendi; plan yükseltmesi veya bir sonraki faturalama döngüsü beklenmeli.Retry-Aftersaniye değil faturalama sıfırlama zamanını gösterir.
Dürüst kapsam
İlgili
Plan başı üst sınırlar ve istemci-tarafı geri basınç deseni.
forbidden ayıklama — hangi uç nokta hangi yetkiyi gerektirir.
Hata zarfının ana sürümler (major versions) arasındaki kararlılığı.
Eşzamansız hatalar — persona.audit_failed, moderation.flagged.