ब्लॉग पर वापस जाएं

API और SDKगाइड

OpenAI Python SDK timeout और retries: उन्हें CheapTokens के लिए सेट करें

OpenAI Python SDK में timeout, max_retries और max_tokens सेट करें, सही त्रुटियों को पकड़ें, और एक अटके हुए अनुरोध को 10 मिनट तक चलने से रोकें।

CheapTokens Team द्वाराप्रकाशित 9 मिनट का पाठ

गहरे बैकग्राउंड पर 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 को एक ऐसे एंडपॉइंट के खिलाफ सेट करते हैं जो लगातार विफल हो रहा है।

शिप करने से पहले#

चेकलिस्ट

टाइमआउट और रीट्राई, उत्पादन के लिए तैयार