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

शुरुआत करेंगाइड

Python में requests के साथ CheapTokens को पहला request, बिना SDK

सिर्फ़ requests वाली 20-लाइन की Python स्क्रिप्ट: एक chat completion, एक timeout, HTTP error handling, और answer, finish_reason और usage प्रिंट।

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

requests के साथ CheapTokens chat completions endpoint कॉल करती Python स्क्रिप्ट
इस पृष्ठ पर
  1. पूरी स्क्रिप्ट
  2. हर लाइन क्या कर रही है
  3. Reply पढ़ें
  4. जब यह काम न करे
  5. एक कॉल का खर्च
  6. यहाँ से आगे कहाँ जाएँ

OpenAI-संगत API से बात करने के लिए आपको openai पैकेज की ज़रूरत नहीं है। एक requests.post कॉल, एक Bearer key और एक JSON body काफ़ी है, और आपको ठीक-ठीक दिखता है कि wire पर क्या जाता है। यह गाइड CheapTokens (https://api.cheaptokens.dev/v1/chat/completions) के लिए वही स्क्रिप्ट बनाती है और अंत में यह answer, finish_reason और token usage प्रिंट करती है।

यह तब अच्छी रहती है जब आप किसी locked-down मशीन पर हों जहाँ सिर्फ़ requests इंस्टॉल है, जब किसी छोटे cron job के लिए SDK नहीं चाहिए, या जब आप बस समझना चाहते हैं कि SDK आपके लिए क्या करता है। first-request guide में SDK, curl और Node के तरीके हैं; यह plain-Python वाला है।

पूरी स्क्रिप्ट#

पहले अपनी key एक environment variable में रखें (how to store an API key safely देखें), फिर इसे ask.py के रूप में सेव करें:

python
import os
import requests

url = "https://api.cheaptokens.dev/v1/chat/completions"
headers = {"Authorization": f"Bearer {os.environ['CHEAPTOKENS_API_KEY']}"}
payload = {
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "messages": [
        {"role": "user", "content": "Explain what a token is in two sentences."}
    ],
    "max_tokens": 200,
}

try:
    r = requests.post(url, headers=headers, json=payload, timeout=30)
    r.raise_for_status()
except requests.exceptions.Timeout:
    raise SystemExit("No reply within 30 seconds - try again or raise the timeout")
except requests.exceptions.HTTPError as e:
    raise SystemExit(f"HTTP {e.response.status_code}: {e.response.text}")

data = r.json()
choice = data["choices"][0]
print(choice["message"]["content"])
print("finish_reason:", choice["finish_reason"])
print("usage:", data["usage"])

python ask.py चलाएँ। model id पूरा gateway id है, deepseek-ai/DeepSeek-V4-Flash-0731; अगर आपको पता नहीं कि वहाँ क्या डालना है, तो list the models with GET /v1/models देखें। दूसरा model आज़माने के लिए zai-org/GLM-5.3-Flash डालें और बाकी कुछ न बदलें: एक balance सभी models के लिए चलता है।

The path of one request: key, POST, raise_for_status, choices, usage
One request from your script to the printed answer

हर लाइन क्या कर रही है#

स्क्रिप्ट जिन पाँच बातों पर टिकी है, वे ये हैं। requests Quickstart (living docs, checked 2 November 2026) इनमें से ज़्यादातर समझाता है, और OpenAI का Chat Completions reference reply के fields परिभाषित करता है।

फ्लैशकार्ड

स्क्रिप्ट में पाँच चीज़ें

तीसरा bullet ही वह है जिसे लोग छोड़ देते हैं। cron job में हमेशा के लिए अटकी स्क्रिप्ट 30 सेकंड बाद ज़ोर से fail होने वाली स्क्रिप्ट से कहीं ज़्यादा खराब है।

Reply पढ़ें#

सफल response JSON होता है। Chat Completions reference के अनुसार, जिन हिस्सों की आपको परवाह है:

  • choices[0].message.content text है। यह null हो सकता है, इसलिए उस पर आँख मूँदकर string methods न चलाएँ।
  • choices[0].finish_reason बताता है कि model क्यों रुका: stop (पूरा हुआ), length (max_tokens limit ने काट दिया), tool_calls, content_filter।
  • usage.prompt_tokens, usage.completion_tokens और usage.total_tokens वही हैं जिनका आपको बिल लगता है: input, output, और उनका योग।

Reply का आकार ऐसा है (संख्याएँ placeholder हैं):

json
{
  "choices": [
    {
      "message": {"role": "assistant", "content": "A token is a small piece of text..."},
      "finish_reason": "stop"
    }
  ],
  "usage": {"prompt_tokens": 18, "completion_tokens": 52, "total_tokens": 70}
}
स्वयं आज़माएँआज़माएँ: max_tokens को 5 करें और स्क्रिप्ट फिर चलाएँ। finish_reason क्या कहता है?उत्तर दिखाएँ

यह length कहता है: model आपकी max_tokens limit से रुका, इसलिए answer बीच वाक्य में खत्म हो जाता है। limit बढ़ाएँ और आपको फिर stop मिलता है। पूरी कहानी AI answer cut off? Fix finish_reason "length" में है।

जब यह काम न करे#

स्क्रिप्ट ज़्यादातर failures को output की एक लाइन में बदल देती है। हर एक का आम मतलब यह है:

जोड़े मिलाएँ

हर message को उसके आम कारण से मिलाएँ

  • HTTP 401Key गायब है, गलत टाइप हुई है या वह नहीं है जो आप भेजना चाहते थे
  • HTTP 404URL path या model id गलत है
  • requests.exceptions.Timeouttimeout के अंदर कोई bytes नहीं आए
  • KeyError: 'CHEAPTOKENS_API_KEY'इस terminal में environment variable सेट नहीं है

असली error bodies और key, base URL और model id की step-by-step जाँच के लिए API 401 or 404 error: wrong key, base URL or model id देखें। दो छोटी gotchas: अगर आपको KeyError: 'choices' दिखे, तो आपने error body को success की तरह parse किया, यानी raise_for_status() छूट गया। और अगर आपकी मशीन पर ~/.netrc फ़ाइल है, तो requests आपके सेट किए Authorization header की जगह उसकी credentials इस्तेमाल कर सकता है।

एक कॉल का खर्च#

ऊपर के reply की placeholder संख्याओं के साथ (लगभग 18 tokens in, 52 out), DeepSeek-V4-Flash की एक कॉल की लागत $0.0000055 है। यह ऐसी संख्या है जो महसूस नहीं होती, इसलिए इसे बड़ा करके देखें। मान लें आपकी स्क्रिप्ट रोज़ 1,000 support tickets summarize करती है, हर एक में लगभग 800 tokens in और 300 out:

मॉडल प्रति अनुरोध 1,000 अनुरोध OpenRouter, 1,000 अनुरोध
GLM-5.3-Flash $0.000028 $0.028 $0.0517
DeepSeek-V4-Flash $0.000042 $0.042 $0.098
MiniMax-M2.7 $0.000085 $0.085 $1.02

प्रति अनुरोध 800 इनपुट और 300 आउटपुट टोकन। प्रति 1M टोकन की कीमतें वर्तमान हैं और हमारे टैरिफ के साथ बदलती रहती हैं; OpenRouter कॉलम समान कार्यभार के लिए संदर्भ कीमतें दिखाता है।

कीमतें हर model के लिए तय हैं, कोई peak hours नहीं, इसलिए वही स्क्रिप्ट रात 3 बजे और दोपहर में एक जैसी लागत लेती है। मौजूदा per-model कीमतें pricing page पर हैं, और docs endpoints की सूची देते हैं।

यहाँ से आगे कहाँ जाएँ#

एक बार यह चल जाए, तो आम अगले कदम हैं कई inputs पर loop, 429 पर retry (429 Too Many Requests: retries with backoff देखें), या वही कॉल streaming के साथ। अगर आप HTTP खुद manage नहीं करना चाहते, तो SDK वाला रास्ता बस एक base_url बदलाव दूर है।