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

شروعاتگائیڈ

requests کے ساتھ پائتھون میں CheapTokens کو پہلی درخواست، بغیر SDK

صرف requests کے ساتھ 20 لائنوں کا پائتھون اسکرپٹ: ایک چیٹ کمپلیشن، ٹائم آؤٹ، HTTP ایرر ہینڈلنگ، اور جواب، finish_reason اور usage پرنٹ۔

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

requests کے ساتھ CheapTokens چیٹ کمپلیشنز اینڈ پوائنٹ کو کال کرنے والا پائتھون اسکرپٹ
اس صفحہ پر
  1. پورا اسکرپٹ
  2. ہر لائن کیا کر رہی ہے
  3. جواب پڑھیں
  4. جب یہ کام نہ کرے
  5. ایک کال کی لاگت
  6. یہاں سے کہاں جائیں

آپ کو OpenAI-مطابق API سے بات کرنے کے لیے openai پیکیج کی ضرورت نہیں ہے۔ ایک requests.post کال، ایک Bearer کلید اور ایک JSON باڈی کافی ہے، اور آپ کو بالکل نظر آتا ہے کہ کیا کچھ وائر پر جاتا ہے۔ یہ گائیڈ CheapTokens (https://api.cheaptokens.dev/v1/chat/completions) کے لیے وہ اسکرپٹ بناتی ہے اور اس کے آخر میں یہ جواب، finish_reason اور ٹوکن استعمال پرنٹ کرتا ہے۔

یہ اس وقت موزوں ہے جب آپ کسی لاک ڈاؤن مشین پر ہوں جہاں صرف requests انسٹال ہے، جب کوئی چھوٹا کرون جاب SDK نہیں لانا چاہیے، یا جب آپ صرف یہ سمجھنا چاہیں کہ SDK آپ کے لیے کیا کرتا ہے۔ پہلی درخواست گائیڈ SDK، curl اور Node کے راستے بتاتی ہے؛ یہ سادہ پائتھون والا ہے۔

پورا اسکرپٹ#

پہلے اپنی کلید ایک ماحول متغیر میں رکھیں (دیکھیں API کلید محفوظ طریقے سے کیسے اسٹور کریں)، پھر اسے 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 چلائیں۔ ماڈل آئی ڈی مکمل گیٹ وے آئی ڈی ہے، deepseek-ai/DeepSeek-V4-Flash-0731؛ اگر آپ کو یقین نہیں کہ وہاں کیا رکھنا ہے، تو GET /v1/models کے ساتھ ماڈلز کی فہرست بنائیں۔ کوئی اور ماڈل آزمانے کے لیے، zai-org/GLM-5.3-Flash رکھیں اور کچھ اور نہ بدلیں: ایک بیلنس تمام ماڈلز کے لیے کافی ہے۔

ایک درخواست کا راستہ: کلید، POST، raise_for_status، choices، usage
آپ کے اسکرپٹ سے پرنٹ شدہ جواب تک ایک درخواست

ہر لائن کیا کر رہی ہے#

یہاں پانچ تصورات ہیں جن پر اسکرپٹ ٹیک لگاتا ہے۔ requests کوئیک اسٹارٹ (زندہ دستاویزات، 2 نومبر 2026 کو چیک کیا گیا) ان میں سے زیادہ تر کی وضاحت کرتا ہے، اور OpenAI کا Chat Completions حوالہ جواب میں موجود فیلڈز کی تعریف کرتا ہے۔

فلیش کارڈز

اسکرپٹ میں پانچ چیزیں

تیسری شق وہ ہے جسے لوگ چھوڑ دیتے ہیں۔ کرون جاب میں ہمیشہ کے لیے لٹکا ہوا اسکرپٹ 30 سیکنڈ کے بعد بلند آواز میں ناکام ہونے والے سے کہیں زیادہ خراب ہے۔

جواب پڑھیں#

کامیاب جواب JSON ہے۔ آپ کو جن حصوں کی پرواہ ہے، Chat Completions حوالے کے مطابق:

  • choices[0].message.content متن ہے۔ یہ null ہو سکتا ہے، لہٰذا اس پر آنکھ بند کر کے سٹرنگ میتھڈز نہ کالیں۔
  • choices[0].finish_reason بتاتا ہے کہ ماڈل کیوں رکا: stop (یہ مکمل ہوا)، length (max_tokens حد نے اسے کاٹ دیا)، tool_calls، content_filter۔
  • usage.prompt_tokens، usage.completion_tokens اور usage.total_tokens وہ ہیں جن کی آپ کو بلنگ ہوتی ہے: ان پٹ، آؤٹ پٹ، اور ان کا مجموعہ۔

جواب کی یہ شکل ہے (اعداد پلیس ہولڈر ہیں):

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 کہتا ہے: ماڈل آپ کی max_tokens حد کی وجہ سے رکا، لہٰذا جواب درمیان جملے میں ختم ہوتا ہے۔ حد بڑھائیں اور آپ کو دوبارہ stop ملے گا۔ پوری کہانی AI جواب کٹ گیا؟ finish_reason "length" ٹھیک کریں میں ہے۔

جب یہ کام نہ کرے#

اسکرپٹ زیادہ تر ناکامیوں کو آؤٹ پٹ کی ایک لائن میں بدل دیتا ہے۔ یہاں ہر ایک کا عام مطلب ہے:

جوڑے ملائیں

ہر پیغام کو اس کی عام وجہ سے ملائیں

  • HTTP 401کلید غائب ہے، غلط ٹائپ ہے یا وہ نہیں جو آپ بھیجنا چاہتے تھے
  • HTTP 404URL پاتھ یا ماڈل آئی ڈی غلط ہے
  • requests.exceptions.Timeoutٹائم آؤٹ کے اندر کوئی بائٹ نہیں آیا
  • KeyError: 'CHEAPTOKENS_API_KEY'ماحول متغیر اس ٹرمینل میں سیٹ نہیں ہے

اصل ایرر باڈیز اور کلید، بیس URL اور ماڈل آئی ڈی کی مرحلہ وار جانچ کے لیے، API 401 یا 404 ایرر: غلط کلید، بیس URL یا ماڈل آئی ڈی استعمال کریں۔ دو چھوٹی پکڑیں: اگر آپ KeyError: 'choices' دیکھیں، تو آپ نے ایرر باڈی کو کامیابی کے طور پر پارس کیا، جس کا مطلب ہے کہ raise_for_status() چھوڑ دیا گیا۔ اور اگر آپ کی مشین میں ~/.netrc فائل ہے، تو requests آپ کے سیٹ کردہ Authorization ہیڈر کے بجائے اس کی اسناد استعمال کر سکتا ہے۔

ایک کال کی لاگت#

اوپر جواب کے پلیس ہولڈر اعداد کے ساتھ (تقریباً 18 ٹوکن ان، 52 آؤٹ)، DeepSeek-V4-Flash کو ایک کال $0.0000055 کی لاگت آتی ہے۔ یہ ایسا عدد ہے جسے آپ محسوس نہیں کر سکتے، تو اسے بڑھا دیں۔ فرض کریں آپ کا اسکرپٹ روزانہ 1,000 سپورٹ ٹکٹس کا خلاصہ کرتا ہے، ہر ایک میں تقریباً 800 ٹوکن ان اور 300 آؤٹ:

ماڈل فی درخواست 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 کالم اسی ورک لوڈ کے لیے حوالہ جاتی قیمتیں دکھاتا ہے۔

قیمتیں فی ماڈل مقرر ہیں، کوئی پیک آورز نہیں، لہٰذا وہی اسکرپٹ رات 3 بجے اور دوپہر میں یکساں لاگت کا ہوتا ہے۔ موجودہ فی ماڈل قیمتیں قیمتوں کے صفحے پر ہیں، اور دستاویزات اینڈ پوائنٹس کی فہرست دیتی ہیں۔

یہاں سے کہاں جائیں#

ایک بار یہ کام کر جائے، تو عام اگلے قدم بہت سے ان پٹس پر لوپ، 429 پر دوبارہ کوشش (دیکھیں 429 Too Many Requests: بیک آف کے ساتھ دوبارہ کوششیں)، یا اسٹریمنگ کے ساتھ وہی کال ہے۔ اگر آپ خود HTTP کا انتظام نہیں کرنا چاہتے، تو SDK کا راستہ ایک base_url تبدیلی کی دوری پر ہے۔