بلاگ پر واپس جائیں

API اور SDKگائیڈ

OpenAI Python SDK ٹائم آؤٹ اور ریٹرائز: CheapTokens کے لیے انہیں سیٹ کریں

OpenAI Python SDK میں timeout، max_retries اور max_tokens سیٹ کریں، صحیح ایررز پکڑیں، اور ایک پھنسی درخواست کو 10 منٹ تک چلنے سے روکیں۔

از CheapTokens Teamشائع شدہ 6 منٹ کا مطالعہ

گہرے پس منظر پر timeout=30.0 اور max_retries=2 کے ساتھ Python کوڈ
اس صفحہ پر
  1. جب آپ کچھ سیٹ نہیں کرتے تو SDK کیا کرتا ہے
  2. کلائنٹ پر timeout اور max_retries سیٹ کریں
  3. ایک درخواست کے لیے اسے اوور رائیڈ کریں
  4. وہ ایررز پکڑیں جو اہم ہیں
  5. max_tokens کو محدود کریں تاکہ لمبا جواب بھاگ نہ سکے
  6. ریٹرائز بل پر کیا اثر ڈالتے ہیں
  7. شپ کرنے سے پہلے

آپ کی اسکرپٹ نے ماڈل کو کال کیا، کچھ واپس نہیں آیا، اور دس منٹ بعد بھی وہ انتظار کر رہی ہے۔ یہ OpenAI Python SDK کا ڈیفالٹ ہے: 10 منٹ کا ٹائم آؤٹ اور 2 ریٹرائز۔ اسے تبدیل کرنے کے لیے، timeout=30.0 اور max_retries=2 کو OpenAI(...) میں پاس کریں، ہر کال کے لیے انہیں client.with_options(...) سے اوور رائیڈ کریں، اور جواب کو max_tokens سے محدود کریں۔

SDK کا README (27 اکتوبر 2026 کو چیک کیا گیا) یہ سب دستاویز کرتا ہے۔ ذیل میں اسے CheapTokens اینڈ پوائنٹ، https://api.cheaptokens.dev/v1، پر لاگو کیا گیا ہے، جو OpenAI Chat Completions فارمیٹ بولتا ہے۔ اس سیٹ اپ کی تفصیلات Your first API request with CheapTokens اور docs میں ہیں۔

جب آپ کچھ سیٹ نہیں کرتے تو SDK کیا کرتا ہے#

دو ڈیفالٹس اہم ہیں۔ ٹائم آؤٹ 10 منٹ ہے۔ ریٹرائز 2 ہیں، مختصر ایکسپونینشل بیک آف کے ساتھ، کنکشن ایررز اور 408، 409، 429 اور 5xx جوابات کے لیے، اور صرف اس وقت جب درخواست باڈی محفوظ طریقے سے دوبارہ بھیجی جا سکے۔ ٹائم آؤٹ ہونے والی درخواست بھی دوبارہ کوشش کی جاتی ہے۔

لہٰذا ہر کوشش کو اپنا ٹائم آؤٹ ملتا ہے، اور بدترین صورت حال تقریباً ٹائم آؤٹ ضرب کوششوں کی تعداد، جمع ان کے درمیان وقفے ہے:

  • ڈیفالٹ: 600 × 3 = 1800 سیکنڈ، آدھا گھنٹہ
  • timeout=30.0، max_retries=2: 30 × 3 = 90 سیکنڈ

فرض کریں ایک ویب اینڈ پوائنٹ کو 30 سیکنڈ میں جواب دینا ہے۔ ڈیفالٹس کے ساتھ یہ آدھا گھنٹہ تک لٹک سکتا ہے اس سے پہلے کہ آپ کا کوڈ کوئی ایرر دیکھے۔ آگے پڑھنے سے پہلے اسے کسی اور سیٹنگ پر آزمائیں۔

نمبر کا اندازہ لگائیں

ایک کلائنٹ میں timeout=45.0 اور max_retries=3 ہے۔ استثنا سے پہلے بدترین انتظار سیکنڈوں میں کیا ہے، کوششوں کے درمیان وقفوں کو شمار نہ کرتے ہوئے؟

جواب دکھائیں

جواب: 180

45 × (3 ریٹرائز + 1 پہلی کوشش) = 180 سیکنڈ؛ کوششوں کے درمیان وقفے اس پر تھوڑا اضافہ کرتے ہیں۔

کلائنٹ پر timeout اور max_retries سیٹ کریں#

سب سے آسان حل یہ ہے کہ دونوں کو ایک بار سیٹ کریں، جب آپ کلائنٹ بناتے ہیں:

python
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 ایک غیر منفی انٹیجر ہونا چاہیے۔ timeout ایک فلوٹ لیتا ہے، یا ایک httpx Timeout آبجیکٹ اگر آپ کنیکٹ کرنے اور پڑھنے کے لیے الگ الگ حدود چاہتے ہیں۔ موجودہ مین برانچ کا README اس کے لیے httpx2 امپورٹ کرتا ہے، پرانے ورژن httpx استعمال کرتے تھے، لہٰذا pip show openai چلائیں اور دیکھیں کہ آپ کی انسٹال کون سا استعمال کرتی ہے۔ ایک سادہ فلوٹ کو کوئی امپورٹ درکار نہیں اور یہ دونوں طرح کام کرتا ہے۔

The request path with timeout=30 and two retries
One request: an attempt, a timeout, up to two retries, then an exception

CheapTokens docs سے مکمل ماڈل آئی ڈی استعمال کریں، یہاں deepseek-ai/DeepSeek-V4-Flash-0731: آئی ڈیز پرووائیڈرز کے درمیان مختلف ہوتی ہیں۔ یہ ماڈل فی جواب زیادہ سے زیادہ 32,768 آؤٹ پٹ ٹوکنز لیتا ہے اور اس کا 380K کانٹیکسٹ ہے، اسی لیے اوپر max_tokens لائن جان بوجھ کر موجود ہے۔ اس پر مزید نیچے، اور ماڈل پر cheap DeepSeek میں۔

ایک درخواست کے لیے اسے اوور رائیڈ کریں#

ایک کلائنٹ، مختلف کام۔ چیٹ جواب کو تیزی سے ہار ماننی چاہیے، رات کے خلاصے کو انتظار کر سکتا ہے۔ دوسرا کلائنٹ بنانے کے بجائے، کال کے لیے ایک اخذ کریں:

python
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 نئی اقدار کے ساتھ ایک کاپی واپس کرتا ہے اور client کو اکیلا چھوڑ دیتا ہے۔ max_retries=0 سیٹ کرنا درست فیصلہ ہے جب آپ کا اپنا کوڈ پہلے ہی ریٹرائز کرتا ہو، مثلاً ایک جاب کیو جو ٹاسک کو دوبارہ ان کیو کرتی ہے۔ ورنہ دونوں تہیں ضرب ہو جاتی ہیں: 3 کیو کوششوں کے اندر 3 SDK کوششیں ایک ٹاسک کے لیے 9 درخواستیں ہیں۔

وہ ایررز پکڑیں جو اہم ہیں#

ریٹرائز ختم ہونے کے بعد، SDK ایک استثنا اٹھاتا ہے۔ ہر ایرر کلاس openai.APIError سے وراثت پاتی ہے، اور ناکام درخواستیں request_id لے کر چلتی ہیں، جو آپ لاگ کرتے ہیں:

python
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 None

ترتیب تنگ سے وسیع ہے۔ APIStatusError کسی بھی 4xx یا 5xx جواب کا احاطہ کرتا ہے، لہٰذا اگر یہ پہلے آئے تو یہ RateLimitError کو نگل جائے گا۔ ٹائم آؤٹ کے لیے بھی یہی خیال: یہ عمومی کنکشن ایرر کے اوپر بیٹھتا ہے۔ ایک بیچ اسکرپٹ میں، return None پوری بات ہے: پرامپٹ لاگ کریں، اگلے پر جائیں، اور آخر میں ناکامیوں کو دوبارہ چلائیں۔

جب ٹائم آؤٹ فائر ہوتا ہے اور ریٹرائز ختم ہو جاتے ہیں، تو استثنا ایسا دکھتا ہے:

The APITimeoutError message after retries are used up
What a caught timeout looks like in the log

429 کیس کی تفصیل کے لیے، بشمول کوششوں کے درمیان انتظار، 429 Too Many Requests from an AI API دیکھیں۔

max_tokens کو محدود کریں تاکہ لمبا جواب بھاگ نہ سکے#

ٹائم آؤٹ انتظار روکتا ہے۔ یہ ماڈل کو کم لکھنے پر مجبور نہیں کرتا۔ max_tokens کے بغیر، 32,768 ٹوکن جواب کی حد والا ماڈل بہت لمبا جواب لکھنے کے لیے آزاد ہے، اور لمبا جواب سست ہوتا ہے۔ کام کے مطابق حد سیٹ کریں: ٹکٹ خلاصے کے لیے 800، ہاں/نہیں کے لیے 5۔

قیمت یہ ہے کہ جواب کٹ سکتا ہے۔ resp.choices[0].finish_reason چیک کریں: length کا مطلب ہے کہ ماڈل کے مکمل ہونے سے پہلے حد لگ گئی۔ Why does an AI answer stop mid-sentence? اس کا احاطہ کرتا ہے۔ اگر آپ جواب اسٹریم کرتے ہیں، تو پہلے الفاظ جلدی آتے ہیں اور انتظار کم محسوس ہوتا ہے، Streaming responses in Python دیکھیں۔

ریٹرائز بل پر کیا اثر ڈالتے ہیں#

ایک ریٹرائی ایک نئی درخواست ہے۔ اگر ایک کوشش پر کارروائی ہو گئی، تو یہ اپنے ٹوکنز کے ساتھ ایک الگ درخواست ہے۔ فرض کریں ایک ٹکٹ خلاصہ 1,500 ٹوکن اندر اور 400 باہر ہے: ایک درخواست آج کی قیمتوں پر $0.000063 لاگت کرتی ہے، اور مکمل pricing table میں دیگر ماڈلز ہیں۔ قیمتیں فی ماڈل مقرر ہیں، بغیر کسی پیک آور کے، لہٰذا رات 3 بجے کا ریٹرائی دوپہر کے برابر لاگت کرتا ہے۔

سلائیڈرز کو اپنے بیچ پر منتقل کریں:

لاگت کیلکولیٹر

1,000 ٹکٹ خلاصوں کا ایک بیچ

فی درخواست ان پٹ ٹوکنز: 1,500 · فی درخواست آؤٹ پٹ ٹوکنز: 400 · فی دن درخواستیں: 1,000

ماڈلفی دنفی ماہ
GLM-5.3-Flash$0.046$1.38
DeepSeek-V4-Flash$0.0625$1.88
MiniMax-M2.7$0.135$4.05

ٹیبل ایک پاس دکھاتا ہے۔ اگر بیچ کا دسواں حصہ دوسری کوشش کا متقاضی ہو، تو دسواں حصہ شامل کریں۔ ریٹرائز سستا بیمہ ہیں جب ناکامیاں نایاب ہوں، اور ایک مہنگی عادت جب آپ max_retries=10 کو ایسے اینڈ پوائنٹ کے خلاف سیٹ کریں جو مسلسل ناکام ہو رہا ہو۔

شپ کرنے سے پہلے#

چیک لسٹ

ٹائم آؤٹس اور ریٹرائز، پروڈکشن کے لیے تیار