API ve SDKKılavuz
OpenAI Python SDK zaman aşımı ve yeniden denemeler: CheapTokens için ayarlayın
OpenAI Python SDK'da timeout, max_retries ve max_tokens ayarlayın, doğru hataları yakalayın ve takılı bir isteğin 10 dakika boyunca çalışmasını önleyin.

Bu sayfada
Betiğiniz modeli çağırdı, hiçbir şey dönmedi ve on dakika sonra hâlâ bekliyor. Bu, OpenAI Python SDK'nın varsayılanıdır: 10 dakikalık zaman aşımı ve 2 yeniden deneme. Bunu değiştirmek için timeout=30.0 ve max_retries=2 değerlerini OpenAI(...)'ye geçirin, her çağrıda client. ile bunları geçersiz kılın ve yanıtı max_tokens ile sınırlayın.
SDK'nın README'si (27 Ekim 2026'da kontrol edildi) tüm bunları belgeliyor. Aşağıda bu, OpenAI Chat Completions formatını konuşan CheapTokens uç noktası https:/ için uygulanmıştır. Bu kurulumun ayrıntıları CheapTokens ile ilk API isteğiniz ve dokümanlar içinde.
Hiçbir şey ayarlamadığınızda SDK ne yapar#
İki varsayılan önemlidir. Zaman aşımı 10 dakikadır. Yeniden denemeler 2'dir; bağlantı hataları ve 408, 409, 429 ve 5xx yanıtları için kısa bir üstel geri çekilme ile ve yalnızca istek gövdesi güvenle yeniden gönderilebiliyorsa. Zaman aşımına uğrayan bir istek de yeniden denenir.
Yani her deneme kendi zaman aşımını alır ve en kötü durum kabaca zaman aşımının deneme sayısıyla çarpımı artı aralarındaki duraklamalardır:
- varsayılan: 600 × 3 = 1800 saniye, yarım saat
timeout=30.0,max_retries=2: 30 × 3 = 90 saniye
Diyelim ki bir web uç noktası 30 saniye içinde yanıt vermek zorunda. Varsayılanlarla, kodunuz bir hata görmeden önce yarım saat boyunca takılı kalabilir. Devam etmeden önce başka bir ayarda deneyin.
Sayıyı tahmin et
Bir istemcinin timeout=45.0 ve max_retries=3 değerleri var. Denemeler arasındaki duraklamaları saymazsak, istisnadan önceki en kötü durum bekleme süresi saniye cinsinden nedir?
Tahminin
0400
Cevabı göster
Cevap: 180
45 × (3 yeniden deneme + 1 ilk deneme) = 180 saniye; denemeler arasındaki duraklamalar bunun üzerine biraz ekler.
İstemcide timeout ve max_retries ayarlayın#
En basit çözüm, istemciyi oluştururken her ikisini bir kez ayarlamaktır:
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheaptokens.dev/v1",
api_key=os.environ["CHEAPTOKENS_API_KEY"],
timeout=30.0, # seconds per attempt
max_retries=2, # 0 turns retries off
)
resp = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[{"role": "user", "content": "Summarize this ticket in two sentences: ..."}],
max_tokens=800,
)
print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, resp.usage.completion_tokens)max_retries negatif olmayan bir tam sayı olmalıdır. timeout bir float alır veya bağlanma ve okuma için ayrı sınırlar istiyorsanız bir httpx Timeout nesnesi alır. Güncel main dalının README'si bunun için httpx2 içe aktarır, eski sürümler httpx kullanırdı, bu yüzden pip show openai çalıştırın ve kurulumunuzun hangisini kullandığını kontrol edin. Düz bir float içe aktarma gerektirmez ve her iki durumda da çalışır.

CheapTokens dokümanlarındaki tam model kimliğini kullanın, burada deepseek-: kimlikler sağlayıcılar arasında farklılık gösterir. Bu model yanıt başına 32.768 çıktı token'ına kadar alır ve 380K bağlamı vardır, bu yüzden yukarıdaki max_tokens satırı bilerek oradadır. Aşağıda bununla ilgili daha fazlası ve model hakkında ucuz DeepSeek içinde.
Tek bir istek için geçersiz kılın#
Tek istemci, farklı işler. Bir sohbet yanıtı hızlı pes etmeli, gece özeti bekleyebilir. İkinci bir istemci oluşturmak yerine, çağrı için bir tane türetin:
quick = client.with_options(timeout=5.0, max_retries=0)
resp = quick.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[{"role": "user", "content": "Reply with one word: ok"}],
max_tokens=5,
)with_options yeni değerlerle bir kopya döndürür ve client'yi olduğu gibi bırakır. Kendi kodunuz zaten yeniden deniyorsa, örneğin görevi yeniden kuyruğa alan bir iş kuyruğu, max_retries=0 ayarlamak doğru seçimdir. Aksi halde iki katman çarpılır: 3 kuyruk denemesi içinde 3 SDK denemesi, bir görev için 9 istek demektir.
Önemli olan hataları yakalayın#
Yeniden denemeler tükendikten sonra SDK bir istisna yükseltir. Her hata sınıfı openai.APIError'den miras alır ve başarısız istekler günlüğe kaydettiğiniz request_id taşır:
import openai
def ask(prompt: str) -> str | None:
try:
r = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[{"role": "user", "content": prompt}],
max_tokens=800,
)
return r.choices[0].message.content
except openai.APITimeoutError:
print("timed out after retries")
except openai.RateLimitError as e:
print("429, slow down:", e.request_id)
except openai.APIConnectionError:
print("cannot reach the API")
except openai.APIStatusError as e:
print("HTTP", e.status_code, e.request_id)
return NoneSıralama dardan gene doğrudur. APIStatusError herhangi bir 4xx veya 5xx yanıtını kapsar, bu yüzden ilk gelseydi RateLimitError'yi yutardı. Zaman aşımı için de aynı fikir: genel bağlantı hatasının üstünde yer alır. Bir toplu iş betiğinde, return None asıl meseledir: istemi günlüğe kaydedin, bir sonrakine geçin ve başarısız olanları sonunda yeniden çalıştırın.
Zaman aşımı tetiklendiğinde ve yeniden denemeler tükendiğinde, istisna şöyle görünür:

Denemeler arasında beklemek dahil, 429 durumu hakkında ayrıntılı bilgi için Bir AI API'sinden 429 Too Many Requests sayfasına bakın.
Uzun bir yanıtın kaçmasını önlemek için max_tokens'ı sınırlayın#
Bir zaman aşımı beklemeyi durdurur. Modelin daha az yazmasını sağlamaz. max_tokens olmadan, 32.768 token'lık yanıt sınırı olan bir model çok uzun bir yanıt yazmakta serbesttir ve uzun bir yanıt yavaş olandır. İşe uyan bir sınır belirleyin: bir bilet özeti için 800, evet/hayır için 5.
Bunun bedeli, bir yanıtın kesilebilmesidir. resp. kontrol edin: length, model bitirmeden önce sınıra ulaşıldığı anlamına gelir. Bir AI yanıtı neden cümle ortasında durur? bunu ele alır. Yanıtı bunun yerine akış olarak alırsanız, ilk kelimeler erken gelir ve bekleme daha kısa hissedilir, bkz. Python'da akış yanıtları.
Yeniden denemeler faturaya ne yapar#
Bir yeniden deneme yeni bir istektir. Bir deneme işlendiyse, kendi token'ları olan ayrı bir istektir. Diyelim ki bir bilet özeti 1.500 token giriş ve 400 çıkış: bir istek bugünkü fiyatlarla $0.000063 tutar ve tam fiyat tablosunda diğer modeller var. Fiyatlar model başına sabittir, yoğun saat yoktur, bu yüzden sabah 3'teki bir yeniden deneme öğlen yapılanla aynı tutardadır.
Kaydırıcıları kendi toplu işinize taşıyın:
Maliyet hesaplayıcı
1.000 bilet özetinden oluşan bir toplu iş
İstek başına giriş token'ı: 1.500 · İstek başına çıkış token'ı: 400 · Günlük istek sayısı: 1.000
| Model | Günlük | Aylık |
|---|---|---|
| GLM-5.3-Flash$0.02$0.04 | $0.046 | $1.38 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.0625 | $1.88 |
| MiniMax-M2.7$0.05$0.15 | $0.135 | $4.05 |
Tablo tek bir geçişi gösterir. Toplu işin onda biri ikinci bir deneme gerektiriyorsa, onda birini ekleyin. Yeniden denemeler, hatalar nadir olduğunda ucuz bir sigortadır ve sürekli başarısız olan bir uç noktaya karşı max_retries=10 ayarladığınızda pahalı bir alışkanlıktır.
Yayına almadan önce#
Kontrol listesi
Zaman aşımları ve yeniden denemeler, üretime hazır



