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

خرابیوں کا ازالہگائیڈ

AI جواب کٹ گیا؟ finish_reason "length" اور max_tokens ٹھیک کریں

آپ کا API جواب جملے کے بیچ میں رک جاتا ہے یا خراب JSON واپس کرتا ہے؟ finish_reason چیک کریں، حد کے اندر max_tokens بڑھائیں اور continue مرحلہ شامل کریں۔

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

ٹرمینل طرز کا کور جو API جواب میں finish_reason length دکھا رہا ہے
اس صفحہ پر
  1. کٹا ہوا جواب اسکرین پر کیسا دکھتا ہے
  2. مرحلہ 1: وہ فیلڈ پڑھیں جو آپ کو بتاتی ہے
  3. مرحلہ 2: max_tokens بڑھائیں، لیکن حد سے آگے نہیں
  4. مرحلہ 3: JSON جو آدھے راستے میں رک جائے
  5. مرحلہ 4: ماڈل کو جاری رکھنے دیں
  6. لمبے جواب کی لاگت
  7. شپ کرنے سے پہلے: ایک مختصر چیک لسٹ

آپ کی اسکرپٹ چلی، ماڈل نے جواب دیا، اور فنکشن لائن کے بیچ میں ختم ہو گیا۔ یا JSON پارسر ایک بالکل معمول کے جواب پر ایرر دے رہا ہے۔ زیادہ تر معاملات میں ماڈل ناکام نہیں ہوا: اس نے آپ کی مقرر کردہ max_tokens حد (یا کوئی ڈیفالٹ حد جو آپ نے دیکھی ہی نہیں) کو چھو لیا اور API نے اسے لفظ کے بیچ میں روک دیا۔

فوری حل: جواب میں finish_reason پڑھیں۔ اگر یہ "length" ہے (OpenAI-compatible API) یا stop_reason کی قدر "max_tokens" ہے (Anthropic Messages)، تو جواب کاٹ دیا گیا ہے۔ max_tokens کو ماڈل کی آؤٹ پٹ حد تک بڑھا دیں، یا ماڈل سے کہیں کہ جاری رکھے۔ اس صفحے کا باقی حصہ دونوں طریقے کوڈ میں دکھاتا ہے جسے آپ کاپی کر سکتے ہیں۔

اگر آپ اس کی سادہ زبان میں وجہ جاننا چاہتے ہیں کہ ایسا کیوں ہوتا ہے، تو AI کا جواب جملے کے بیچ میں کیوں رک جاتا ہے سے شروع کریں۔ یہ صفحہ ڈیبگنگ والا ورژن ہے۔

کٹا ہوا جواب اسکرین پر کیسا دکھتا ہے#

علامات اس بات پر مختلف ہوتی ہیں کہ آپ نے کیا مانگا تھا، لیکن وجہ ایک ہی ہے۔ انہیں اپنے مشاہدے سے ملا کر دیکھیں:

جوڑے ملائیں

علامت کو اس کی ممکنہ وجہ سے ملائیں

  • فنکشن return resu پر ختم ہوتا ہےکوڈ والا جواب لائن کے بیچ میں max_tokens کی حد پر پہنچ گیا
  • json.loads "Unterminated string" یا "Expecting ',' delimiter" کے ساتھ ناکام ہوتا ہےJSON بیچ میں کٹ گیا
  • ترجمہ متن کے پہلے نصف کے بعد رک جاتا ہےآؤٹ پٹ حد ترجمے سے چھوٹی ہے
  • جواب مکمل ہے اور فیلڈ stop کہتی ہےماڈل نے خود ختم کیا؛ کہیں اور دیکھیں

آخری قطار اہم ہے۔ اگر finish_reason کی قدر stop ہے، تو حد آپ کا مسئلہ نہیں، اور max_tokens بڑھانے سے کچھ نہیں بدلے گا۔

مرحلہ 1: وہ فیلڈ پڑھیں جو آپ کو بتاتی ہے#

ہر جواب بتاتا ہے کہ جنریشن کیوں ختم ہوئی۔ OpenAI-compatible جواب میں یہ choices[0].finish_reason ہے: "stop" جب ماڈل مکمل کرے، "length" جب ٹوکن ختم ہو جائیں۔ Anthropic Messages API میں فیلڈ stop_reason ہے، اور کٹ جانے کی قدر "max_tokens" ہے۔ Anthropic کی stop-reason گائیڈ (28 اکتوبر 2026 کو چیک شدہ) بالکل نیچے دیے گئے دو حل تجویز کرتی ہے: max_tokens بڑھائیں یا جواب جاری رکھیں۔

یہاں وہی جانچ تین شکلوں میں ہے۔ OpenAI SDK کے لیے base URL https://api.cheaptokens.dev/v1 ہے اور Anthropic SDK کے لیے https://api.cheaptokens.dev (بغیر /v1)۔ max_tokens=200 جان بوجھ کر چھوٹا رکھا گیا ہے، تاکہ آپ خود کٹ دیکھ سکیں۔

ایک جانچ، تین طریقے

Python (OpenAI SDK)

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    max_tokens=200,
    messages=[{"role": "user", "content": "Write a Python class for a todo list with tests."}],
)

choice = resp.choices[0]
if choice.finish_reason == "length":
    print("Cut off at the token limit")
print(choice.message.content)
print(resp.usage.completion_tokens)

Python (Anthropic SDK)

python
import os
import anthropic

client = anthropic.Anthropic(
    base_url="https://api.cheaptokens.dev",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

msg = client.messages.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    max_tokens=200,
    messages=[{"role": "user", "content": "Write a Python class for a todo list with tests."}],
)

if msg.stop_reason == "max_tokens":
    print("Cut off at the token limit")
print(msg.content[0].text)

curl

bash
curl https://api.cheaptokens.dev/v1/chat/completions \
  -H "Authorization: Bearer $CHEAPTOKENS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-ai/DeepSeek-V4-Flash-0731",
    "max_tokens": 200,
    "messages": [{"role": "user", "content": "Write a Python class for a todo list with tests."}]
  }'

واپس آنے والے JSON میں "finish_reason": "length" تلاش کریں۔

جب یہ تشخیص کے طور پر کام کرے، تو آپ کو یہ جوڑا نظر آئے گا: کم حد length دیتی ہے، کشادہ حد stop دیتی ہے۔

کم اور زیادہ max_tokens کے ساتھ وہی درخواست: finish_reason length سے stop میں بدل جاتی ہے
finish_reason کی دو قدریں جو آپ کو سب سے زیادہ ملیں گی

مرحلہ 2: max_tokens بڑھائیں، لیکن حد سے آگے نہیں#

ظاہری حل ایک بڑا نمبر ہے۔ احتیاط: ہر ماڈل کی جواب پر اپنی حد ہے۔ اس سے اوپر قدر مقرر نہ کریں: حد فی ماڈل ہے، اس لیے پہلے نیچے دیا گیا جدول دیکھیں۔ یہ CheapTokens پر فی جواب حدود ہیں (حقائق 28 اکتوبر 2026 کو چیک شدہ):

ماڈل فی جواب زیادہ سے زیادہ آؤٹ پٹ کانٹیکسٹ
DeepSeek-V4-Flash 32,768 ٹوکن 380K
GLM-5.3-Flash 8,192 ٹوکن 390K
MiniMax-M2.7 8,192 ٹوکن 180K

9,000 ٹوکن کے ترجمے کے لیے ایسا ماڈل درکار ہے جس کی فی جواب حد زیادہ ہو — DeepSeek-V4-Flash فی جواب 32,768 ٹوکن تک لیتا ہے۔ لمبے کوڈ، لمبے JSON یا پورے دستاویز کے لیے deepseek-ai/DeepSeek-V4-Flash-0731 میں سب سے زیادہ گنجائش ہے: فی جواب 32,768 ٹوکن تک، دن کے کسی بھی وقت ایک ہی قیمت۔ ماڈل کی درست ids CheapTokens docs اور models page سے لیں، کیونکہ فراہم کنندگان انہیں مختلف ناموں سے پکارتے ہیں۔

ایک عملی اصول: max_tokens کو سب سے لمبے جواب پر سیٹ کریں جو آپ قبول کریں گے، زیادہ سے زیادہ پر نہیں۔ آپ ان ٹوکنز کی ادائیگی کرتے ہیں جو ماڈل واقعی لکھتا ہے، اس لیے جب جواب مختصر ہوں تو اونچی حد کچھ مہنگی نہیں پڑتی۔

مرحلہ 3: JSON جو آدھے راستے میں رک جائے#

کٹا ہوا JSON جواب سب سے بدترین صورت ہے، کیونکہ متن درست لگتا ہے جب تک پارسر آخر تک نہ پہنچے۔ فرض کریں آپ ایک کال میں 40 انوائسز سے فیلڈز نکالتے ہیں اور ایک array مانگتے ہیں۔ ماڈل 31 آبجیکٹ لکھتا ہے، حد پر پہنچ جاتا ہے، اور array کبھی بند نہیں ہوتا۔

ٹوکن حد پر کٹے ہوئے array پر json.loads کی خرابی
پارسر میں کٹا ہوا JSON array کیسا دکھتا ہے

]} شامل کر کے سٹرنگ کو ٹھیک کرنے کی کوشش نہ کریں۔ آپ کو درست JSON ملے گا جس میں ریکارڈز غائب ہوں گے، جو خرابی سے بھی بدتر ہے۔ پہلے finish_reason چیک کریں؛ اگر یہ length ہے، تو یا حد بڑھا کر کال دوبارہ چلائیں، یا ان پٹ کو چھوٹے بیچوں میں تقسیم کریں۔ فارمیٹ خود نافذ کرنے کے لیے valid JSON from an LLM API دیکھیں۔

مرحلہ 4: ماڈل کو جاری رکھنے دیں#

کبھی کبھی جواب واقعی کسی بھی حد سے لمبا ہوتا ہے: کتاب کا ایک باب، ایک بڑا ری فیکٹر۔ تب جو آپ کے پاس ہے وہ واپس دیں اور ماڈل سے کہیں کہ آگے بڑھے۔ نیچے دیا گیا لوپ اب تک کا متن رکھتا ہے، باقی مانگتا ہے، اور چند راؤنڈز کے بعد ہار مان جاتا ہے تاکہ کوئی بگ ہمیشہ کے لیے نہ گھومے۔

python
def complete(base_messages, model, max_tokens=4096, rounds=4):
    text = ""
    for _ in range(rounds):
        messages = list(base_messages)
        if text:
            messages += [
                {"role": "assistant", "content": text},
                {"role": "user", "content": "Continue exactly where you stopped. Do not repeat anything."},
            ]
        r = client.chat.completions.create(model=model, max_tokens=max_tokens, messages=messages)
        choice = r.choices[0]
        text += choice.message.content or ""
        if choice.finish_reason != "length":
            return text, True   # finished on its own
    return text, False          # still cut after all rounds

دو عادتیں اسے ایماندار رکھتی ہیں۔ True/False فلیگ واپس کریں اور False پر صارف کو وارننگ دکھائیں، بجائے اس کے کہ آدھی دستاویز کو مکمل بنا کر پیش کریں۔ اور یاد رکھیں کہ ہر راؤنڈ پہلے کا متن بطور ان پٹ دوبارہ بھیجتا ہے، اس لیے جاری کیا گیا جواب ایک بڑے جواب سے زیادہ مہنگا پڑتا ہے۔ ساختیاتی ڈیٹا کے لیے، جاری رکھنے کے بجائے بڑی حد یا چھوٹے بیچ ترجیح دیں۔

لمبے جواب کی لاگت#

فرض کریں ایک لمبا جواب 2,000 ٹوکن ان اور 8,000 ٹوکن آؤٹ ہے۔ DeepSeek-V4-Flash پر وہ درخواست آج کی قیمت پر $0.00083 کی پڑتی ہے، اور مجموعی طور پر، ان پٹ اور آؤٹ پٹ ملا کر، یہ OpenRouter سے سستی ہے۔ نمبر اپنے لوڈ کے مطابق بدلیں:

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

50 لمبے جوابات کا ایک دن

فی درخواست ان پٹ ٹوکنز: 2,000 · فی درخواست آؤٹ پٹ ٹوکنز: 8,000 · فی دن درخواستیں: 50

ماڈلفی دنفی ماہ
GLM-5.3-Flash$0.018$0.54
DeepSeek-V4-Flash$0.0415$1.25
MiniMax-M2.7$0.065$1.95

سبق: اس منظر نامے میں آؤٹ پٹ کا پہلو غالب ہے، اس لیے max_tokens میں گنجائش دوبارہ چلانے کے خلاف سستی بیمہ ہے۔ کٹا ہوا جواب جسے آپ دوبارہ جنریٹ کرتے ہیں، دو بار ادا کیا جاتا ہے۔ بل کے دونوں پہلوؤں کی پس منظر معلومات input vs output tokens میں ہیں، اور قیمتوں کے ساتھ مکمل ماڈل فہرست pricing page پر ہے۔

شپ کرنے سے پہلے: ایک مختصر چیک لسٹ#

چیک لسٹ

آپ کے کوڈ کے لیے ٹرنکیشن چیک لسٹ