Powrót do bloga

Rozwiązywanie problemówPrzewodnik

Żądanie za długie: 400 vs 413, okno kontekstu i max_tokens

Odróżnij 413 (zbyt wiele bajtów) od błędu długości tokenów (zwykle 400), sprawdź wejście plus max_tokens względem okna kontekstu i zmniejsz żądanie.

Autor: CheapTokens TeamOpublikowano 6 min czytania

Okładka: błąd żądania za długiego z kodami 400 i 413
Na tej stronie
  1. Dwa limity, dwa błędy
  2. Sprawdź matematykę przed wysłaniem
  3. Cztery sposoby na zmniejszenie żądania
  4. Ile kosztuje długa historia
  5. Jeśli nadal zawodzi

Twoja rozmowa działała dobrze przez czterdzieści tur, a potem każde żądanie zaczęło zawodzić. Krótka odpowiedź: "request too long" ukrywa dwa różne limity. 413 oznacza, że żądanie jest za duże w bajtach i zostało odrzucone, zanim jakikolwiek model je zobaczył. Jeśli błąd narzeka na długość w tokenach (zwykle nieprawidłowe żądanie z klasy 400), twoje wejście plus odpowiedź, o którą prosisz, nie mieszczą się w oknie kontekstu; przeczytaj error.message, aby zobaczyć który. Rozwiązaniem jest zmierzyć, a potem przyciąć.

Ten przewodnik pokazuje, jak odróżnić oba przypadki, jak sprawdzić matematykę przed wysłaniem i cztery sposoby na zmniejszenie żądania. Jeśli termin jest nowy, czym jest okno kontekstu wyjaśnia to prostymi słowami.

Dwa limity, dwa błędy#

413 to poczta odmawiająca przyjęcia zbyt dużej paczki; błąd tokenów to model mówiący, że list nie zmieści się w jego oknie odczytu. Zawodzą w różnych miejscach i wymagają różnych poprawek.

Strona błędów API Anthropic (sprawdzona 29 października 2026) opisuje 413 request_too_large jako żądanie przekraczające maksymalną liczbę bajtów: 128 MB dla Messages API, 256 MB dla Batch API, 500 MB dla Files API. 400 invalid_request_error obejmuje problemy z formatem lub zawartością żądania. To są limity Anthropic. Ich strona nie wymienia komunikatu o liczbie tokenów, podobnie jak przewodnik po kodach błędów OpenAI, więc nie buduj logiki na dokładnym brzmieniu, które widziałeś w wątku na forum.

W praktyce rozmowy tylko tekstowe zwykle rosną w tokenach znacznie wcześniej niż w bajtach. Bajty stają się problemem, gdy dołączasz obrazy base64 lub całe dokumenty. Tokeny stają się problemem, gdy rośnie historia, i to jest typowy przypadek.

Dopasuj pary

Dopasuj każdy objaw do jego przyczyny

  • 413 request_too_largeTreść ma zbyt wiele bajtów, na przykład duży załącznik base64
  • Błąd długości tokenów zaraz po wklejeniu ogromnego loguSam prompt ma więcej tokenów niż okno kontekstu
  • 400 po prompcie około 375K tokenów z max_tokens=32768 na modelu 380KRazem mogą przekroczyć okno
  • Ta sama historia, inny modelSprawdź okno każdego modelu: historia, która mieści się w jednym, może nie mieścić się w innym
413 i 400 obok siebie: bajty versus tokeny
Dwa limity: 413 liczy bajty, błąd tokenów liczy wejście plus max_tokens.

Treść błędu to JSON z najwyższego poziomu type: error, obiektem error z własnym type i message oraz identyfikatorem żądania. Przeczytaj error.message i zachowaj identyfikator żądania; w oficjalnych SDK przechwytuj typowany wyjątek zamiast dopasowywać ciągi znaków.

Sprawdź matematykę przed wysłaniem#

Nawyk, który oszczędza najwięcej czasu: nie czekaj na błąd. Przed każdym wywołaniem zsumuj trzy rzeczy i porównaj je z oknem.

  1. Tokeny w twoich wiadomościach (prompt systemowy, historia, nowe pytanie).
  2. max_tokens, o który prosisz.
  3. Okno kontekstu modelu.

Trzymaj wejście plus żądaną odpowiedź w oknie. Okna w CheapTokens to 390K dla GLM-5.3-Flash, 380K dla DeepSeek-V4-Flash i 180K dla MiniMax-M2.7; odpowiedzi sięgają do 8 192 tokenów w GLM i MiniMax oraz do 32 768 w DeepSeek-V4-Flash. Sprawdź strony cen i modeli, aby zobaczyć aktualną listę.

Żądanie, które się mieści (104 000 tokenów), obok takiego, które się nie mieści (historia 400K)
Historia 104 000 tokenów mieści się w oknie; 400K nie mieści się w żadnym z trzech.

Powiedzmy, że twój agent wysyła historię 100K tokenów i prosi o 4 000 tokenów odpowiedzi. To 100 000 + 4 000 = 104 000 tokenów, komfortowo w każdym z trzech. Teraz ten sam agent po kolejnych pięćdziesięciu krokach: 400K. Żadne okno z listy tego nie przyjmie, niezależnie od tego, jaki max_tokens ustawisz. To jest moment, w którym pojawia się błąd, i wygląda nagle tylko dlatego, że historia rosła trochę z każdą turą.

Przybliżony licznik wystarczy jako zabezpieczenie. Tekst angielski ma średnio około 4 znaków na token; kod i tekst nieangielski zużywają więcej tokenów na znak, więc zostaw margines:

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)

Ostatnia linia to twoja kalibracja: usage.prompt_tokens to, co API faktycznie policzyło. Porównaj to z rough_tokens(...) kilka razy i dostosuj dzielnik oraz margines do własnego tekstu.

Cztery sposoby na zmniejszenie żądania#

Wybierz najtańszą poprawkę, która działa, w tej kolejności.

1. Obniż max_tokens. Proś tylko o odpowiedź, której potrzebujesz: wejście plus max_tokens to, co musisz utrzymać w oknie, a każdy model ma własny limit odpowiedzi (8 192 lub 32 768 tokenów powyżej). Nie ustawiaj max_tokens wyżej, niż wymaga odpowiedź, i nie powyżej limitu modelu na odpowiedzi. Jeśli odpowiedź zatrzyma się na ustawionym limicie, kończy się finish_reason: length, co ma własne rozwiązanie.

2. Przytnij historię. Odrzuć najstarsze tury, zachowaj prompt systemowy i kilka ostatnich wymian. Funkcja trim powyżej robi dokładnie to. W przypadku agenta odetnij też masę: wyniki narzędzi o 5 000 linii rzadko muszą pozostać w całości po tym, jak agent ich użył.

3. Podsumuj zamiast odrzucać. Gdy stare tury mają znaczenie, poproś model raz o skompresowanie ich do krótkiej notatki, a następnie zastąp stare wiadomości tą notatką. Płacisz za jedno dodatkowe wywołanie i zachowujesz wątek.

4. Przełącz się na większe okno. Przejście z MiniMax-M2.7 (180K) na GLM-5.3-Flash (390K) lub DeepSeek-V4-Flash (380K) to zmiana identyfikatora modelu w jednej linii. Jeśli potrzebujesz też długich odpowiedzi, DeepSeek-V4-Flash pozwala na do 32 768 tokenów wyjściowych, a wszystkie trzy dzielą jedno saldo, więc przełączenie nic nie kosztuje w konfiguracji.

Lista kontrolna

Zanim ponownie wyślesz nieudane żądanie

Ile kosztuje długa historia#

Przycinanie to nie tylko kwestia błędów. Każdy krok agenta ponownie wysyła całą historię, więc rozdęta historia to także kosztowna część rachunku. Weź zadanie 30 kroków, gdzie każdy krok wysyła około 100K tokenów i otrzymuje około 1 500 z powrotem:

Model Za żądanie 30 żądań OpenRouter, 30 żądań
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 tokenów wejściowych i 1500 tokenów wyjściowych na żądanie. Ceny za 1 mln tokenów są aktualne i zmieniają się wraz z naszymi taryfami; kolumna OpenRouter pokazuje ceny referencyjne dla tego samego obciążenia.

Tabela wycenia to samo zadanie na każdym modelu według aktualnych stawek. Przytnij historię do jednej czwartej, a strona wejściowa spadnie o około trzy czwarte. Aby zobaczyć, gdzie twój własny agent zużywa tokeny, śledź użycie na żądanie w Pythonie; co do mechaniki, dlaczego agenci zużywają tak wiele tokenów przechodzi przez przykład 20 kroków.

DeepSeek-V4-Flash kosztuje obecnie $0.015 za 1M tokenów wejściowych i $0.10 za 1M tokenów wyjściowych, jedna cena o każdej porze. Wypróbuj własne liczby:

Kalkulator kosztów

Zadanie agenta 30 kroków z historią 100K

Tokeny wejściowe na żądanie: 100 000 · Tokeny wyjściowe na żądanie: 1500 · Żądania dziennie: 30

ModelDziennieMiesięcznie
GLM-5.3-Flash$0.0618$1.85
DeepSeek-V4-Flash$0.0495$1.49
MiniMax-M2.7$0.157$4.70

Jeśli nadal zawodzi#

Długie żądania przez wolne łącze mają osobną awarię: Anthropic zaleca strumieniowanie lub Batch API dla długich żądań z dużym max_tokens, ponieważ sieci mogą zrywać bezczynne połączenia, a jego SDK oczekują, że żądania niestrumieniowe zakończą się w ciągu 10 minut. Jeśli błąd to przekroczenie limitu czasu lub zerwane połączenie, a nie 400, zobacz błędy połączenia i ustaw stream=True.

Jeśli komunikat to 401 lub 404, problemem jest klucz, bazowy URL lub identyfikator modelu: błąd API 401 lub 404. Aby poznać dokładny bazowy URL, identyfikatory modeli i przykłady, otwórz dokumentację CheapTokens.