WiozenAPI

Uzun yanıt bekleyen API isteği neden zaman aşımına düşer: akışlı mı, akışsız mı?

Kısaca: Uzun yanıtlarda zaman aşımı çoğunlukla istemcinin ilk baytı ya da yanıtın tamamını beklerken pes etmesinden olur. Akışlı istekte (stream: true) metin yazıldıkça gelir, bu yüzden uzun işler için en sağlam yol budur. Akışsız istekte Wiozen API 30 saniye sonra yanıt başlıklarını gönderip bağlantıyı boşluk karakterleriyle açık tutar; senin yapman gereken istemcinin toplam süre sınırını 10 dakikaya yakın tutmak ve gövdedeki error alanını kontrol etmek.

Akışlı ve akışsız istek arasındaki fark ne?

Akışsız istekte model yanıtın tamamını yazar, sen de tamamını tek parça JSON olarak alırsın. Model iki dakika düşünüp üç dakika yazıyorsa beş dakika boyunca elinde hiçbir şey olmaz. Akışlı istekte yanıt Server-Sent Events olarak parça parça gelir; ilk kelimeler model yazmaya başlar başlamaz ekrana düşer.

Ücret açısından fark yok, iki biçimde de aynı tokenlar sayılır. Fark bekleme süresinin nasıl geçtiğinde: akışta bağlantı sürekli veri taşır, akışsızda veri en sonda gelir. Zaman aşımlarının çoğu bu sessiz bekleme sırasında olur.

Akışlı istekte bağlantı nasıl açık kalıyor?

Model ilk tokenı üretmeden önce düşünüyor ya da uzun bir istemi işliyor olabilir. Bu sırada Wiozen API en geç 12 saniye içinde 200 başlıklarını gönderir, sonra her 10 saniyede bir : ping yorum satırı yazar. SSE kuralına göre iki nokta ile başlayan satır yorumdur; SDK'lar bunu yok sayar ama bağlantı boşta görünmez.

Model 120 saniye boyunca hiç veri üretmezse akış kopmuş sayılır ve kapatılır. Tek bir isteğin toplam süresi en fazla 10 dakikadır.

stream.py
from openai import OpenAI

client = OpenAI(base_url="https://api.wiozen.com/v1", api_key="sk-gw-...", timeout=600)

stream = client.chat.completions.create(
    model="wiozen-anthropic",
    messages=[{"role": "user", "content": "Bu 300 satırlık dosyayı baştan yaz"}],
    max_tokens=32000,
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Kod editörü eklentileri ve terminal ajanları çoğunlukla zaten akışlı çalışır. Kendi kodunda uzun çıktı bekliyorsan (dosya yeniden yazma, uzun rapor, çeviri) akışı açman en az sorun çıkaran seçim.

Akışsız istekte 30 saniyeden sonra ne olur?

İstek 30 saniyede bitmezse Wiozen API yanıtı beklemeden 200 başlıklarını ve bir boşluk karakteri gönderir. Model yazmaya devam ederken her 15 saniyede bir boşluk daha gider, yanıt bitince JSON gövdesi bu boşlukların arkasına eklenir. JSON standardı değerden önce boşluğa izin verdiği için json.loads, JSON.parse ve SDK'lar gövdeyi normal okur.

Bunun bir bedeli var: başlıklar gittikten sonra bir hata çıkarsa durum kodu artık 200 olarak kalmıştır. Hata bu durumda gövdede error nesnesi olarak gelir. Kendi HTTP kodunu yazıyorsan yalnız durum koduna bakma, gövdede error alanı var mı diye de kontrol et.

plain.py
import requests

r = requests.post(
    "https://api.wiozen.com/v1/chat/completions",
    headers={"Authorization": "Bearer sk-gw-..."},
    json={"model": "wiozen-anthropic", "messages": [...], "max_tokens": 32000},
    timeout=(10, 120),  # bağlanma 10 sn, iki bayt arası en çok 120 sn
)
data = r.json()
if "error" in data:  # durum 200 olsa bile
    raise RuntimeError(data["error"]["message"])
print(data["choices"][0]["message"]["content"])

Örnekteki timeout=(10, 120) iki bayt arasında en çok 120 saniye bekler. Boşluklar 15 saniyede bir geldiği için bu süre dolmaz. Toplam süreye sınır koyan bir istemci kullanıyorsan (çoğu SDK'nın timeout ayarı böyledir) değeri 600 saniyeye yakın ver.

504 "Upstream did not respond in time" alırsam ne yapmalıyım?

Bu yanıt modelin süre içinde hiç cevap üretemediğini söyler. Yanıtla retry-after: 5 başlığı gelir ve istek ücretlenmez. Birkaç saniye bekleyip aynı isteği yeniden göndermek çoğu zaman yeter.

Aynı istek sürekli 504 alıyorsa isteği küçült: çok uzun bir sohbet geçmişi ya da megabaytlarca ek dosya modelin ilk tokena ulaşmasını uzatır. Bağlamın gerçekten gerekli kısmını göndermek hem süreyi hem ücreti düşürür.

Bağlantıyı ben kesersem ücret öder miyim?

İstemcin zaman aşımına düşüp bağlantıyı kapatırsa model o ana kadar çalışmış olabilir. Akış başladıktan sonra kesilen istekte o ana kadar işlenen girdi ve üretilen çıktı ücretlenir. Hiç yanıt almadan vazgeçilen istek wiozen-anthropic gibi Wiozen modellerinde ücretsizdir; Claude, Gemini ve DeepSeek modellerinde ise o ana kadar işlendiği bildirilen tokenlar yazılır.

Bu yüzden istemcinin süre sınırını kısa tutup sürekli yeniden denemek pahalıya patlayabilir: her deneme girdiyi baştan işletir. Süreyi uzun ver, akışı aç ve aynı isteği aynı anda iki kez gönderme. Ücretin nasıl hesaplandığı API maliyeti yazısında.

Sık sorulan sorular

Akışlı istek daha mı pahalı?

Hayır. İki biçimde de aynı girdi ve çıktı tokenları aynı fiyattan sayılır.

Bir isteğin en uzun süresi ne kadar?

10 dakika. Akışta model 120 saniye boyunca hiç veri üretmezse bağlantı daha erken kapatılır.

Akışsız yanıtın başındaki boşluklar JSON'u bozar mı?

Hayır. JSON standardı değerden önce boşluğa izin verir; standart çözümleyiciler ve SDK'lar bunları yok sayar.

Neden durum kodu 200 olduğu hâlde hata aldım?

Akışsız istek 30 saniyeyi geçtiyse başlıklar önceden gönderilmiştir. Sonradan çıkan hata gövdedeki error nesnesinde gelir; durum kodu değiştirilemez.

504 alan istek ücretlenir mi?

Hayır. Model süre içinde yanıt üretmediyse istek ücretsizdir. retry-after süresi kadar bekleyip yeniden dene.

Akışı açmak için isteğine stream: true ekle. Kullanabileceğin bütün parametreler belgelerde.

Hesabını aç

Diğer rehberler: Türkiye'den kredi kartı olmadan yapay zekâ API'si nasıl kullanılır? · OpenAI uyumlu bir API mevcut bir araca nasıl bağlanır? · Yapay zekâ API maliyeti nasıl hesaplanır? · Yapay zekâ API anahtarım sızdıysa ne yapmalıyım? · Yapay zekâ API'siyle görsel nasıl üretilir ve görsel başı maliyeti ne kadar? · Yapay zekâ API'si neden 429 hatası veriyor, nasıl düzeltilir? · Anthropic Messages API mı, OpenAI Chat Completions mı: hangisini kullanmalıyım? · Bağlam penceresi (context window) nedir, 1 milyon token ne işe yarar? · Hangi yapay zekâ modelini seçmeliyim: fiyat, bağlam ve kaliteye göre karar · Düşünen (reasoning) model neden boş cevap döner, düşünme tokenları neden ücretlenir? · API bakiyem neden beklediğimden hızlı bitiyor? Harcamayı istek istek takip etmek · Bir web sayfası yapay zekâya vermek için Markdown'a nasıl çevrilir? · WordPress'te yapay zekâyla otomatik makale nasıl yazdırılır? · Blog için RSS ve Google Trends'ten konu nasıl bulunur? · Yapay zekâyla yazılan içerik Google'da ve yapay zekâ yanıtlarında görünür mü? · WordPress'te yapay zekâyla yazılan makalelere iç bağlantı nasıl ekletilir? · WordPress'te her yazıya birbirine benzemeyen öne çıkan görsel yapay zekâyla nasıl ürettirilir? · Yapay zekâya blog yazısı yazdırırken içerik tarifi (brief) nasıl yazılır? · Yemek tarifi sitesine yapay zekâyla tarif yazdırırken nelere dikkat etmeli? · WordPress eklentisini yapay zekâ API hesabına bağlarken çıkan hatalar nasıl çözülür? · WordPress'te yapay zekâ yazı botu neden yarıda kalıyor? "Tur takıldı" uyarısı ve LiteSpeed · WordPress'te otomatik yazılar neden geç çıkıyor? WP-Cron ve gerçek sunucu cron'u · Yapay zekâ yazı botuyla İngilizce ya da başka dilde blog yazısı nasıl yazdırılır? · "İçerik Botu yazı üretemiyor" uyarısı ne demek? Bot günlüğündeki satırları okumak