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

اس صفحہ پر
آپ کی اسکرپٹ چلی، ماڈل نے جواب دیا، اور فنکشن لائن کے بیچ میں ختم ہو گیا۔ یا 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]. ہے: "stop" جب ماڈل مکمل کرے، "length" جب ٹوکن ختم ہو جائیں۔ Anthropic Messages API میں فیلڈ stop_reason ہے، اور کٹ جانے کی قدر "max_tokens" ہے۔ Anthropic کی stop-reason گائیڈ (28 اکتوبر 2026 کو چیک شدہ) بالکل نیچے دیے گئے دو حل تجویز کرتی ہے: max_tokens بڑھائیں یا جواب جاری رکھیں۔
یہاں وہی جانچ تین شکلوں میں ہے۔ OpenAI SDK کے لیے base URL https:/ ہے اور Anthropic SDK کے لیے https:/ (بغیر /v1)۔ max_tokens=200 جان بوجھ کر چھوٹا رکھا گیا ہے، تاکہ آپ خود کٹ دیکھ سکیں۔
ایک جانچ، تین طریقے
Python (OpenAI SDK)
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)
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
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_ تلاش کریں۔
جب یہ تشخیص کے طور پر کام کرے، تو آپ کو یہ جوڑا نظر آئے گا: کم حد length دیتی ہے، کشادہ حد stop دیتی ہے۔

مرحلہ 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- میں سب سے زیادہ گنجائش ہے: فی جواب 32,768 ٹوکن تک، دن کے کسی بھی وقت ایک ہی قیمت۔ ماڈل کی درست ids CheapTokens docs اور models page سے لیں، کیونکہ فراہم کنندگان انہیں مختلف ناموں سے پکارتے ہیں۔
ایک عملی اصول: max_tokens کو سب سے لمبے جواب پر سیٹ کریں جو آپ قبول کریں گے، زیادہ سے زیادہ پر نہیں۔ آپ ان ٹوکنز کی ادائیگی کرتے ہیں جو ماڈل واقعی لکھتا ہے، اس لیے جب جواب مختصر ہوں تو اونچی حد کچھ مہنگی نہیں پڑتی۔
مرحلہ 3: JSON جو آدھے راستے میں رک جائے#
کٹا ہوا JSON جواب سب سے بدترین صورت ہے، کیونکہ متن درست لگتا ہے جب تک پارسر آخر تک نہ پہنچے۔ فرض کریں آپ ایک کال میں 40 انوائسز سے فیلڈز نکالتے ہیں اور ایک array مانگتے ہیں۔ ماڈل 31 آبجیکٹ لکھتا ہے، حد پر پہنچ جاتا ہے، اور array کبھی بند نہیں ہوتا۔

]} شامل کر کے سٹرنگ کو ٹھیک کرنے کی کوشش نہ کریں۔ آپ کو درست JSON ملے گا جس میں ریکارڈز غائب ہوں گے، جو خرابی سے بھی بدتر ہے۔ پہلے finish_reason چیک کریں؛ اگر یہ length ہے، تو یا حد بڑھا کر کال دوبارہ چلائیں، یا ان پٹ کو چھوٹے بیچوں میں تقسیم کریں۔ فارمیٹ خود نافذ کرنے کے لیے valid JSON from an LLM API دیکھیں۔
مرحلہ 4: ماڈل کو جاری رکھنے دیں#
کبھی کبھی جواب واقعی کسی بھی حد سے لمبا ہوتا ہے: کتاب کا ایک باب، ایک بڑا ری فیکٹر۔ تب جو آپ کے پاس ہے وہ واپس دیں اور ماڈل سے کہیں کہ آگے بڑھے۔ نیچے دیا گیا لوپ اب تک کا متن رکھتا ہے، باقی مانگتا ہے، اور چند راؤنڈز کے بعد ہار مان جاتا ہے تاکہ کوئی بگ ہمیشہ کے لیے نہ گھومے۔
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.02$0.04 | $0.018 | $0.54 |
| DeepSeek-V4-Flash$0.015$0.10 | $0.0415 | $1.25 |
| MiniMax-M2.7$0.05$0.15 | $0.065 | $1.95 |
سبق: اس منظر نامے میں آؤٹ پٹ کا پہلو غالب ہے، اس لیے max_tokens میں گنجائش دوبارہ چلانے کے خلاف سستی بیمہ ہے۔ کٹا ہوا جواب جسے آپ دوبارہ جنریٹ کرتے ہیں، دو بار ادا کیا جاتا ہے۔ بل کے دونوں پہلوؤں کی پس منظر معلومات input vs output tokens میں ہیں، اور قیمتوں کے ساتھ مکمل ماڈل فہرست pricing page پر ہے۔
شپ کرنے سے پہلے: ایک مختصر چیک لسٹ#
چیک لسٹ
آپ کے کوڈ کے لیے ٹرنکیشن چیک لسٹ



