sone centralgeliştirici

Hatalar

Hata yanıtının biçimi, bütün hata kodları, hangisinin yeniden denenebileceği ve her birinde ne yapılacağı.

Hatalar OpenAI'nin hata biçimiyle gelir. OpenAI SDK'ları onları kendi hata sınıflarına çevirir.

{
  "error": {
    "message": "Bu tarayıcı anahtarı bu sitede kullanılamaz. Siteyi anahtarın izinli siteleri arasına ekleyin.",
    "type": "permission_error",
    "param": null,
    "code": "origin_not_allowed"
  }
}
  • message Türkçedir ve son kullanıcıya gösterilebilecek kadar sadedir.
  • code İngilizcedir ve değişmez. Kodunuzda her zaman code'a bakın, message'a değil.
  • param hatayı doğuran alanın adıdır, örneğin model, messages, input ya da after. İlgili bir alan yoksa null olur.

POST /chat bu kuralın tek istisnasıdır. Orada gövde JSON değil, düz metindir: message'daki Türkçe metnin kendisi. Vercel AI SDK bu metni olduğu gibi useChat'in error.message değerine koyar. Kod X-Sone-Error-Code başlığında gelir; bu başlık tarayıcıdaki koda açılmaz, yalnız sunucudan yapılan isteklerde okunur.

Kodlar

x-should-retry sütununda false olan hatalarda aynı isteği yeniden göndermeyin. Retry-After sütunu, başlığın taşıdığı bekleme süresidir.

Durumcodex-should-retryRetry-AfterAnlamı ve ne yapmalı
400invalid_bodyyokyokGövde boş ya da okunamadı. İsteği JSON gövdeyle gönderin.
400invalid_jsonyokyokGövde geçerli JSON değil ya da bir alanın türü yanlış. message ayrıntıyı verir.
400missing_user_messageyokyokSon mesaj metin taşıyan bir user mesajı değil. Ziyaretçinin yeni mesajını sona koyun.
400invalid_roleyokyokTanınmayan bir mesaj rolü ya da Responses'ta rolü olmayan bir mesaj öğesi.
400invalid_contentyokyokBir mesajın içeriği metin ya da parça dizisi değil.
400unsupported_contentyokyokYeni mesajda görsel, ses ya da dosya var. Yalnız metin gönderin.
400message_too_longyokyokYeni bir mesaj 4.000 karakterden uzun. Mesajı kısaltın.
400too_many_new_messagesyokyokTek istekte 12'den fazla yeni ziyaretçi mesajı var. Asistanın yanıtını geçmişe ekleyip devam edin ya da yeni sohbet başlatın.
400tools_not_supportedyokyoktools, functions ya da işlev çağrısı öğeleri gönderildi. Asistan işletmenin kendi araçlarını kullanır; bu alanları çıkarın.
400unsupported_parameteryokyokn 1 dışında, response_format ya da text.format text dışında ya da background: true. param alanın adını verir.
400missing_inputyokyokResponses isteğinde input yok.
400invalid_inputyokyokResponses isteğinde input bir metin ya da öğe dizisi değil.
400unsupported_itemyokyokResponses isteğinde tanınmayan bir girdi öğesi türü var.
400conflicting_parametersyokyokprevious_response_id ile conversation birlikte gönderildi. Birini bırakın.
400instructions_too_longyokyokResponses isteğinde instructions 2.000 karakterden ya da JSON olarak 4 KB'tan uzun.
400invalid_metadatayokyokResponses isteğinde metadata sınırı aşıyor: en fazla 16 anahtar, anahtar en fazla 64 karakter, değer en fazla 512 karakterlik metin, tamamı JSON olarak en fazla 4 KB.
400safety_identifier_too_longyokyokResponses isteğinde safety_identifier 64 karakterden uzun.
400user_too_longyokyokResponses isteğinde user 64 karakterden uzun.
400previous_response_id_too_longyokyokprevious_response_id, boşlukları atıldıktan sonra bir yanıt kimliğinden uzun. Yanıtın id değerini olduğu gibi gönderin.
400item_id_too_longyokyokResponses isteğinde bir item_reference kimliği 64 karakterden uzun.
400conversation_model_mismatchfalseyokSohbet başka bir asistanla açılmış. Aynı model ile sürdürün ya da yeni sohbet başlatın.
400conversation_fullfalseyokSohbette 200 ziyaretçi mesajına ulaşıldı. Yeni sohbet başlatın.
400invalid_cursoryokyokafter bu sohbete ait bir mesajın kimliği değil. İmleci bırakıp sohbeti baştan okuyun.
400not_cancellableyokyokPOST /responses/{id}/cancel çağrıldı. Yanıtlar istek içinde tamamlanır, iptal edilecek iş yoktur.
401missing_api_keyyokyokAnahtar gönderilmedi.
401invalid_api_keyyokyokAnahtar tanınmadı, biçimi bozuk ya da öneki türüyle uyuşmuyor.
401revoked_api_keyyokyokAnahtar iptal edilmiş. Yenisini oluşturun.
402plan_requiredfalseyokÇalışma alanının paketi asistan yanıtlarına açık değil. Asistan yanıt vermedi.
403origin_not_allowedyokyokTarayıcı anahtarı izin verilen siteler dışından ya da Origin başlığı olmadan kullanıldı. Siteyi anahtara ekleyin.
403secret_key_in_browseryokyokSunucu anahtarı bir tarayıcıdan kullanıldı. Tarayıcıda tarayıcı anahtarı kullanın.
404model_not_foundyokyokBu kimlikte, anahtarın çağırabildiği yayında bir asistan yok. GET /models kullanılabilenleri listeler.
404conversation_not_foundyokyokSohbet bu çalışma alanında bir API sohbeti değil ya da anahtarınızın çağıramadığı bir asistanın. Sakladığınız kimliği bırakıp yeni sohbet başlatın.
404previous_response_not_foundyokyokprevious_response_id ile gösterilen yanıt yok, silinmiş, store: false ile üretilmiş ya da anahtarınızın çağıramadığı bir asistanın sohbetinde.
404response_not_foundyokyokSaklanan yanıt yok, silinmiş, 30 günü geçmiş ya da anahtarınızın çağıramadığı bir asistanın sohbetinde. DELETE /responses/{id}'de ayrıca: yanıtı başka bir anahtar saklamış.
404file_not_foundyokyokDosya bağlantısının süresi dolmuş ya da bağlantı bozuk. Sohbetin mesajlarını yeniden okuyup yeni bağlantıyı alın.
409conversation_busyyok2Aynı sohbette önceki mesaj hâlâ yanıtlanıyor; bu mesaj kaydedilmedi. Bekleyip aynı Idempotency-Key ile yeniden gönderin.
413request_too_largeyokyokGövde 1 MB'den büyük. Bütün geçmiş yerine sohbet kimliğini gönderin.
422idempotency_key_reusedfalseyokAynı Idempotency-Key başka bir metinle gönderildi. Her yeni mesajda yeni bir anahtar kullanın.
429rate_limit_exceededyokPencereye göreAnahtarın istek ya da okuma sınırı aşıldı. Retry-After kadar bekleyin.
429ai_turn_ceilingfalse300Çalışma alanının API için saatlik ya da günlük otomatik yanıt sınırı, tarayıcı anahtarıyla gelen istekte tarayıcı anahtarlarının payı doldu. Asistan yanıt vermedi.
429assistant_quota_exhaustedfalseyokSonecentral'ın yapay zekâ kapasitesi şu an dolu. Çalışma alanınızın bir hakkı bitmiş değildir; API yanıtları paketinizden düşmez. Asistan yanıt vermedi: message "Asistan şu an yanıt veremiyor." der.
429file_download_limityokPencereye göreAynı dosya kimliği son bir saatte 10 kez indirildi. Retry-After kadar bekleyin.
429file_egress_limityokUTC gece yarısına kadarÇalışma alanının günlük dosya indirme sınırı doldu.
503assistant_pausedMesaj ekibe ulaştıysa false60Otomatik yanıtlar şu an kapalı. Asistan yanıt vermedi.
503assistant_unavailableyok30Asistan şu an yanıt veremiyor. Bekleyip aynı Idempotency-Key ile yeniden gönderin.
503conversation_not_createdyokyokSohbet açılamadı. Biraz sonra yeniden deneyin.
503message_not_storedyokyokMesaj kaydedilemedi. Aynı Idempotency-Key ile yeniden deneyin.
503messages_unavailableyokyokSohbetin mesajları şu an okunamadı. Sonraki okumada yeniden deneyin.
503file_unavailableyokyokDosya şu an indirilemiyor. Biraz sonra yeniden deneyin.
503response_not_deletedyokyokSaklanan yanıt şu an silinemedi. Biraz sonra yeniden deneyin.

Retry-After saniye cinsindendir ve yukarı yuvarlanır.

Bu kodların dışında iki durum vardır. Aynı adresten dakikada 120'den fazla dosya indirme isteği 429 alır ve bu yanıtın gövdesi OpenAI biçiminde değildir. Beklenmeyen bir sunucu hatasında da gövde bu biçimde olmayabilir; böyle bir 5xx yanıtını aynı Idempotency-Key ile yeniden deneyin.

Asistan yanıt vermediğinde mesaj nereye gider

plan_required, assistant_quota_exhausted, ai_turn_ceiling ve assistant_paused asistanın yanıt veremediğini söyler. Mesajın ne olduğu sohbete bağlıdır:

  • Sohbet zaten açıksa ziyaretçinin mesajı kaydedilir ve ekibe ulaşır. message bunu "Mesajınız ekibe iletildi." diye söyler; assistant_quota_exhausted'te "Mesajınız ekibe iletildi, ekipten biri size yanıt verecek." der. Ekibin yanıtı sohbetin mesajlarında gelir: Asistan yanıt vermediğinde.
  • Yeni bir sohbet açılacaksa hiçbir şey kaydedilmez ve sohbet açılmaz. message "Biraz sonra yeniden deneyin." der.

assistant_unavailable da iki türlü gelir. Asistan tura hiç başlayamadıysa hiçbir şey olmamıştır ve message "Biraz sonra yeniden deneyin." der. Tur başlayıp yarıda kaldıysa ziyaretçinin mesajı kaydedilmiştir ve message "Mesajınız ekibe iletildi." der; aynı anahtarla yeniden gönderirseniz mesaj ikinci kez kaydedilmez, asistan onu yanıtlar.

type değerleri

typeHangi hatalarda
invalid_request_error400, 404, 409, 413 ve 422
authentication_error401
permission_error403
insufficient_quota402 plan_required ve 429 assistant_quota_exhausted
rate_limit_error429 rate_limit_exceeded, ai_turn_ceiling, file_download_limit ve file_egress_limit
server_error503

Yanıt başlıkları

BaşlıkNe işe yarar
x-request-idİsteğin kimliği, her yanıtta gelir. Destek isterken bunu paylaşın.
retry-afterKaç saniye sonra yeniden deneyebileceğiniz.
x-should-retryfalse gelirse aynı isteği yeniden göndermeyin. OpenAI SDK'ları buna kendiliğinden uyar.
x-sone-conversation-idSohbetin kimliği. Bir tur yanıtında gelir; akışta, akış başlarken.
x-sone-error-codeYalnız POST /chat hatalarında: hatanın kodu. Tarayıcıdaki koda açılmaz.

Tarayıcıdaki kodunuz x-request-id, retry-after, x-should-retry ve x-sone-conversation-id başlıklarını okuyabilir.

Yeniden denemek

  • x-should-retry: false gelirse yeniden denemeyin; aynı istek aynı sonucu alır. Bu başlık plan_required, assistant_quota_exhausted, ai_turn_ceiling, idempotency_key_reused, conversation_model_mismatch ve conversation_full ile, mesaj ekibe ulaştıysa assistant_paused ile de gelir.
  • Retry-After başlığı varsa ve x-should-retry: false yoksa o kadar bekleyip yeniden deneyin. rate_limit_exceeded, conversation_busy, assistant_paused, assistant_unavailable, file_download_limit ve file_egress_limit bu başlığı taşır. ai_turn_ceiling de taşır ama yeniden denemeyin.
  • Retry-After taşımayan 503 yanıtlarında ve ağ hatalarında aynı isteği aynı Idempotency-Key başlığıyla yeniden gönderin. Artan aralıklarla bekleyin: önce 1, sonra 2, 4 ve 8 saniye. Sonecentral aynı mesajı ikinci kez kaydetmez. Örnek ve tarayıcı anahtarındaki tek istisna: Tekrar denemek.
  • conversation_busy bir yarış durumudur: aynı sohbete aynı anda iki mesaj gitti. Arayüzünüzde bir tur bitmeden yenisini göndermeyin.
  • Geri kalan 4xx hatalarında yeniden denemek işe yaramaz; isteği düzeltin.

OpenAI SDK'ları 408, 409, 429 ve 5xx yanıtlarını varsayılan olarak iki kez kendiliğinden yeniden dener. x-should-retry başlığına uyar; retry-after en fazla 60 saniyeyse o kadar bekler. Idempotency-Key başlığını ise kendileri eklemez; isteğin seçeneklerinde siz verin: Chat Completions.

Akış sırasında hata

"stream": true gönderseniz de anahtar, sınır, asistan, sohbet ve paket kontrolleri akış başlamadan yapılır. Bu kontrollerden geçmeyen istek yukarıdaki gibi sıradan bir HTTP hatası alır. Akış başladıktan sonra bir hata olursa HTTP durumu artık değişemez. Bu durumda akışa bir hata yazılır ve akış kapanır:

  • Chat Completions: data: {"error": {…}} parçası, yukarıdaki error nesnesiyle; ardından data: [DONE]. OpenAI SDK'ları bunu hata olarak fırlatır.
  • Responses: önce type, code, message, param ve sequence_number taşıyan bir error olayı, ardından response.failed. response.failed olayındaki yanıtın status değeri failed olur, error alanı aynı code ve message'ı taşır. [DONE] gelmez. OpenAI'nin Node SDK'sı error olayında APIError fırlatır, kod error.code'dadır; Python SDK'sı onu type değeri "error" olan bir olay olarak verir.
  • Vercel AI SDK: {"type":"error","errorText":"…"} parçası, ardından data: [DONE]. useChat'in status değeri error olur ve error.message bu metni taşır.

Akış başladıktan sonra gelebilecek hatalar ai_turn_ceiling, sınır tur sırasında dolarsa, ve tur yarıda kalırsa assistant_unavailable'dır. Hata gelmeden önce gönderilen mesajlar sohbete kaydedilmiştir. Onları GET /conversations/{id}/messages ile okuyabilirsiniz.

Kullanıcıya ne gösterilir

message alanı ziyaretçiye gösterilebilir ama çoğu zaman daha iyisi, ziyaretçinin yapabileceği bir şeyi söylemektir. Örneğin 429 ve 503 için "Şu an yanıt veremiyoruz, birazdan yeniden deneyin." Açık bir sohbette ai_turn_ceiling, assistant_quota_exhausted, plan_required ya da assistant_paused geldiyse mesaj ekibe ulaşmıştır: "Mesajınız ekibimize ulaştı, en kısa sürede buradan yanıt vereceğiz." Hata kodlarını ziyaretçiye göstermeyin.

Bu sayfada