Bumalik sa blog

Pag-troubleshootGabay

Masyadong mahaba ang kahilingan: 400 vs 413, context window at max_tokens

Makilala ang 413 (masyadong maraming bytes) mula sa token-length error (karaniwang 400), suriin ang input kasama ang max_tokens laban sa context window, at paliitin ang kahilingan.

Ni CheapTokens TeamNai-publish noong 7 min na pagbabasa

Cover: isang request-too-long error na may mga code na 400 at 413
Sa pahinang ito
  1. Dalawang limitasyon, dalawang error
  2. Suriin ang matematika bago ka magpadala
  3. Apat na paraan upang paliitin ang isang kahilingan
  4. Ano ang gastos ng mahabang history
  5. Kung nabigo pa rin

Maayos na tumakbo ang iyong chat sa loob ng apatnapung turn, pagkatapos ay nagsimulang mabigo ang bawat kahilingan. Ang maikling sagot: ang "request too long" ay nagtatago ng dalawang magkaibang limitasyon. Ang 413 ay nangangahulugang masyadong malaki ang kahilingan sa bytes at tinanggihan bago pa man ito makita ng anumang modelo. Kung ang error ay nagrereklamo tungkol sa haba sa tokens (karaniwang 400-class invalid request), ang iyong input kasama ang sagot na hinihiling mo ay hindi kasya sa context window; basahin ang error.message upang makita kung alin. Ang solusyon ay sukatin, pagkatapos bawasan.

Ipinapakita ng gabay na ito kung paano makilala ang dalawa, kung paano suriin ang matematika bago ka magpadala, at apat na paraan upang paliitin ang isang kahilingan. Kung bago ang termino, ano ang context window ay sumasaklaw nito sa simpleng salita.

Dalawang limitasyon, dalawang error#

Ang 413 ay ang post office na tumatanggi sa isang parcel na masyadong malaki; ang token error ay ang modelo na nagsasabing hindi kasya ang sulat sa reading window nito. Nabigo sila sa magkaibang lugar at nangangailangan ng magkaibang solusyon.

Inilalarawan ng API errors page ng Anthropic (sinuri noong 29 Oktubre 2026) ang 413 request_too_large bilang isang kahilingan na lumalampas sa maximum na bilang ng bytes: 128 MB para sa Messages API, 256 MB para sa Batch API, 500 MB para sa Files API. Ang 400 invalid_request_error ay sumasaklaw sa mga problema sa format o nilalaman ng kahilingan. Iyon ang mga limitasyon ng Anthropic. Hindi naglilista ang kanilang page ng token-count message, at gayundin ang error-codes guide ng OpenAI, kaya huwag bumuo ng logic batay sa eksaktong salita na nakita mo sa isang forum thread.

Sa pagsasagawa, ang text-only na mga chat ay karaniwang lumalaki sa tokens bago pa sa bytes. Nagiging problema ang bytes kapag nag-attach ka ng base64 na mga larawan o buong dokumento. Nagiging problema ang tokens kapag lumalaki ang history, at iyon ang karaniwang kaso.

Itugma ang mga pares

Itugma ang bawat sintomas sa sanhi nito

  • 413 request_too_largeMasyadong maraming bytes ang body, halimbawa isang malaking base64 attachment
  • Isang token-length error pagkatapos i-paste ang isang malaking logAng prompt lamang ay mas maraming tokens kaysa sa context window
  • 400 pagkatapos ng prompt na humigit-kumulang 375K tokens na may max_tokens=32768 sa isang 380K na modeloKapag pinagsama, maaaring lumampas sila sa window
  • Parehong history, ibang modeloSuriin ang window ng bawat modelo: ang history na kasya sa isa ay maaaring hindi kasya sa iba
413 at 400 na magkatabi: bytes kumpara sa tokens
Dalawang limitasyon: ang 413 ay nagbibilang ng bytes, ang token error ay nagbibilang ng input kasama ang max_tokens.

Ang error body ay JSON na may top-level na type: error, isang error object na may sariling type at message, at isang request id. Basahin ang error.message at itago ang request id; sa mga opisyal na SDK, hulihin ang typed exception sa halip na magtugma ng mga string.

Suriin ang matematika bago ka magpadala#

Ang ugali na pinakamalaking nakakatipid ng oras: huwag hintayin ang error. Bago ang bawat tawag, pagsamahin ang tatlong bagay at ihambing ang mga ito sa window.

  1. Mga token sa iyong mga mensahe (system prompt, history, ang bagong tanong).
  2. Ang max_tokens na hinihiling mo.
  3. Ang context window ng modelo.

Panatilihin ang input kasama ang hinihiling na sagot sa loob ng window. Ang mga window sa CheapTokens ay 390K para sa GLM-5.3-Flash, 380K para sa DeepSeek-V4-Flash at 180K para sa MiniMax-M2.7; ang mga sagot ay umaabot hanggang 8,192 tokens sa GLM at MiniMax at hanggang 32,768 sa DeepSeek-V4-Flash. Tingnan ang pricing at mga pahina ng modelo para sa kasalukuyang listahan.

Isang kahilingan na kasya (104,000 tokens) katabi ng isa na hindi (400K history)
Ang history na 104,000 tokens ay kasya sa window; ang 400K ay hindi kasya sa alinman sa tatlo.

Sabihin nating ang iyong agent ay nagpapadala ng 100K-token na history at humihingi ng 4,000 tokens pabalik. Iyon ay 100,000 + 4,000 = 104,000 tokens, komportable sa alinman sa tatlo. Ngayon ang parehong agent pagkatapos ng isa pang limampung hakbang: 400K. Walang window sa listahan ang tumatanggap nito, anuman ang max_tokens na itakda mo. Iyon ang sandali na lumilitaw ang error, at mukhang biglaan lamang dahil lumaki nang kaunti ang history sa bawat turn.

Ang isang magaspang na counter ay sapat para sa isang guard. Ang English text ay may average na mga 4 na character bawat token; ang code at non-English na text ay gumagamit ng mas maraming tokens bawat character, kaya mag-iwan ng margin:

python
import os
from openai import OpenAI

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

CONTEXT = 380_000      # DeepSeek-V4-Flash window
MAX_OUT = 4_000        # the answer you ask for
MARGIN = 0.85          # rough counter, keep 15% spare

def rough_tokens(messages):
    return sum(len(m['content']) // 4 + 4 for m in messages)

def trim(messages):
    budget = int(CONTEXT * MARGIN) - MAX_OUT
    system, rest = messages[:1], messages[1:]
    while rest and rough_tokens(system + rest) > budget:
        rest.pop(0)          # drop the oldest turn first
    return system + rest

history = [{'role': 'system', 'content': '...'}, {'role': 'user', 'content': '...'}]  # system first

reply = client.chat.completions.create(
    model='deepseek-ai/DeepSeek-V4-Flash-0731',
    messages=trim(history),
    max_tokens=MAX_OUT,
)
print(reply.usage.prompt_tokens, reply.choices[0].finish_reason)

Ang huling linya ay ang iyong calibration: ang usage.prompt_tokens ay kung ano ang aktwal na binilang ng API. Ihambing ito sa rough_tokens(...) ng ilang beses at i-adjust ang divisor at margin sa iyong sariling text.

Apat na paraan upang paliitin ang isang kahilingan#

Piliin ang pinakamurang solusyon na gumagana, sa ganitong pagkakasunod-sunod.

1. Bawasan ang max_tokens. Humingi lamang ng sagot na kailangan mo: input kasama ang max_tokens ang kailangan mong panatilihin sa loob ng window, at ang bawat modelo ay may sariling cap sa sagot (8,192 o 32,768 tokens sa itaas). Huwag itakda ang max_tokens nang mas mataas kaysa sa kailangan ng sagot, at hindi lalampas sa cap ng modelo sa mga sagot. Kung ang sagot ay huminto sa limitasyong itinakda mo, nagtatapos ito sa finish_reason: length, na may sariling solusyon.

2. Bawasan ang history. I-drop ang pinakalumang mga turn, panatilihin ang system prompt at ang huling ilang palitan. Ang trim function sa itaas ay eksaktong ginagawa ito. Para sa isang agent, putulin din ang bulk: ang mga tool output na 5,000 linya ay bihirang kailangang manatiling buo pagkatapos gamitin ng agent ang mga ito.

3. I-summarize sa halip na i-drop. Kapag mahalaga ang mga lumang turn, hilingin sa modelo nang isang beses na i-compress ang mga ito sa isang maikling tala, pagkatapos palitan ang mga lumang mensahe ng talang iyon. Magbabayad ka para sa isang karagdagang tawag at mapanatili ang thread.

4. Lumipat sa mas malaking window. Ang paglipat mula sa MiniMax-M2.7 (180K) patungo sa GLM-5.3-Flash (390K) o DeepSeek-V4-Flash (380K) ay isang linyang pagbabago ng model id. Kung kailangan mo rin ng mahahabang sagot, pinapayagan ng DeepSeek-V4-Flash ang hanggang 32,768 output tokens, at ang tatlo ay may isang balanse, kaya walang gastos sa setup ang paglipat.

Listahan ng dapat gawin

Bago mo muling ipadala ang isang nabigong kahilingan

Ano ang gastos ng mahabang history#

Ang pagbabawas ay hindi lamang tungkol sa mga error. Ang bawat hakbang ng isang agent ay muling nagpapadala ng buong history, kaya ang isang bloated na history ay ang mamahaling bahagi rin ng bill. Kunin ang isang gawain na 30 hakbang kung saan ang bawat hakbang ay nagpapadala ng mga 100K tokens at nakakakuha ng mga 1,500 pabalik:

Modelo Bawat kahilingan 30 mga kahilingan OpenRouter, 30 mga kahilingan
GLM-5.3-Flash $0.0021 $0.0618 $0.127
DeepSeek-V4-Flash $0.0017 $0.0495 $0.15
MiniMax-M2.7 $0.0052 $0.157 $0.954

100,000 input at 1,500 output na token bawat kahilingan. Ang mga presyo kada 1M token ay kasalukuyan at nagbabago kasabay ng aming mga taripa; ang column ng OpenRouter ay nagpapakita ng reference na presyo para sa parehong workload.

Ang table ay nagpepresyo ng parehong gawain sa bawat modelo gamit ang live na mga rate. Bawasan ang history sa isang-kapat at ang input side ay bababa ng mga tatlong-kapat. Upang makita kung saan gumagastos ng tokens ang iyong sariling agent, subaybayan ang paggamit bawat kahilingan sa Python; para sa mekanika, bakit gumagamit ng napakaraming tokens ang mga agent ay dumadaan sa isang 20-hakbang na halimbawa.

Ang DeepSeek-V4-Flash ay kasalukuyang nagkakahalaga ng $0.015 bawat 1M input tokens at $0.10 bawat 1M output tokens, isang presyo sa anumang oras. Subukan ang iyong sariling mga numero:

Calculator ng gastos

Isang 30-hakbang na gawain ng agent na may 100K history

Mga input token bawat kahilingan: 100,000 · Mga output token bawat kahilingan: 1,500 · Mga kahilingan bawat araw: 30

ModeloBawat arawBawat buwan
GLM-5.3-Flash$0.0618$1.85
DeepSeek-V4-Flash$0.0495$1.49
MiniMax-M2.7$0.157$4.70

Kung nabigo pa rin#

Ang mahahabang kahilingan sa mabagal na link ay may hiwalay na kabiguan: pinapayo ng Anthropic ang streaming o ang Batch API para sa mahahabang kahilingan na may malaking max_tokens, dahil maaaring i-drop ng mga network ang mga idle connection, at inaasahan ng kanilang mga SDK na matapos ang non-streaming na mga kahilingan sa loob ng 10 minuto. Kung ang error ay timeout o dropped connection sa halip na 400, tingnan ang connection errors at itakda ang stream=True.

Kung ang mensahe ay 401 o 404, ang problema ay ang key, base URL o model id sa halip: API 401 o 404 error. Para sa eksaktong base URL, model ids at mga halimbawa, buksan ang CheapTokens docs.