Назад в блог

Решение проблемИнструкция

Запрос слишком длинный: 400 или 413, контекст и max_tokens

Как отличить 413 (слишком много байт) от ошибки длины в токенах (обычно 400), сверить вход и max_tokens с окном контекста и уменьшить запрос.

Автор: CheapTokens TeamОпубликовано 5 мин чтения

Обложка: ошибка «запрос слишком длинный» с кодами 400 и 413
Содержание
  1. Два лимита — две ошибки
  2. Проверьте арифметику до отправки
  3. Четыре способа уменьшить запрос
  4. Сколько стоит длинная история
  5. Если всё равно падает

Чат сорок ходов работал без проблем, а потом каждый запрос стал падать. Короткий ответ: за словами «запрос слишком длинный» прячутся два разных лимита. 413 значит, что запрос слишком велик в байтах и его отклонили до того, как его увидела модель. Если же ошибка жалуется на длину в токенах (обычно это 400-я, неверный запрос), вход плюс ответ, который вы просите, не помещаются в окно контекста; какой случай ваш, видно в error.message. Лечится так: сначала измерить, потом сократить.

Ниже — как отличить одно от другого, как проверить арифметику до отправки и четыре способа уменьшить запрос. Если термин новый, что такое окно контекста объяснено простыми словами.

Два лимита — две ошибки#

413 — это почта, которая отказывается принять слишком большую посылку; ошибка по токенам — это модель, которая говорит, что письмо не поместится в её окно чтения. Ломаются они в разных местах и чинятся по-разному.

Страница ошибок API Anthropic (проверено 29 октября 2026) описывает 413 request_too_large как запрос, превысивший максимум байт: 128 МБ для Messages API, 256 МБ для Batch API, 500 МБ для Files API. 400 invalid_request_error — проблемы с форматом или содержимым запроса. Это лимиты Anthropic. Сообщения о числе токенов на этой странице нет, как и в руководстве OpenAI по кодам ошибок, поэтому не стройте логику на точной формулировке из ветки форума.

На практике текстовые чаты обычно упираются в токены задолго до байтов. Байты становятся проблемой, когда вы прикладываете картинки в base64 или целые документы. Токены — когда растёт история, и это самый частый случай.

Найдите пары

Сопоставьте симптом и причину

  • 413 request_too_largeТело запроса слишком большое в байтах, например огромное вложение в base64
  • Ошибка длины в токенах сразу после вставки огромного логаОдин промпт уже длиннее окна контекста в токенах
  • 400 после промпта около 375K токенов с max_tokens=32768 на модели с окном 380KВместе они могут выйти за окно
  • Та же история, другая модельСверьте окно каждой модели: история, что влезает в одну, может не влезть в другую
413 и 400 рядом: байты и токены
Два лимита: 413 считает байты, ошибка по токенам — вход плюс max_tokens.

Тело ошибки — JSON с верхним type: error, объектом error со своими type и message и идентификатором запроса. Читайте error.message и сохраняйте идентификатор; в официальных SDK ловите типизированное исключение, а не сравнивайте строки.

Проверьте арифметику до отправки#

Привычка, которая экономит больше всего времени: не ждать ошибки. Перед каждым вызовом сложите три вещи и сравните с окном.

  1. Токены в ваших сообщениях (системный промпт, история, новый вопрос).
  2. max_tokens, который вы просите.
  3. Окно контекста модели.

Держите вход плюс запрошенный ответ внутри окна. Окна в CheapTokens: 390K у GLM-5.3-Flash, 380K у DeepSeek-V4-Flash и 180K у MiniMax-M2.7; ответ — до 8 192 токенов у GLM и MiniMax и до 32 768 у DeepSeek-V4-Flash. Актуальный список — на страницах цен и моделей.

Запрос, который помещается (104 000 токенов), и тот, что не помещается (история 400K)
История в 104 000 токенов помещается в окно; 400K не помещается ни в одно из трёх.

Допустим, агент шлёт историю в 100K токенов и просит в ответ 4 000. Это 100 000 + 4 000 = 104 000 токенов — спокойно для любой из трёх моделей. А теперь тот же агент ещё через пятьдесят шагов: 400K. Ни одно окно из списка его не вместит, какой бы max_tokens вы ни поставили. Ошибка появляется именно тогда, и кажется внезапной лишь потому, что история росла понемногу каждый ход.

Для защиты хватит грубого счётчика. В английском тексте в среднем около 4 символов на токен; код и не английский текст дают больше токенов на символ, так что оставляйте запас:

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
MAX_OUT = 4_000        # ответ, который вы просите
MARGIN = 0.85          # грубый счётчик, держим 15% запаса

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)          # сначала выбрасываем самый старый ход
    return system + rest

history = [{'role': 'system', 'content': '...'}, {'role': 'user', 'content': '...'}]  # system первым

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)

Последняя строка — ваша калибровка: usage.prompt_tokens — это то, сколько токенов насчитал API. Сравните его с rough_tokens(...) пару раз и подберите делитель и запас под свой текст.

Четыре способа уменьшить запрос#

Выбирайте самый дешёвый способ, который работает, в таком порядке.

1. Снизьте max_tokens. Просите только тот ответ, который нужен: в окне должны уместиться вход плюс max_tokens, а у каждой модели свой потолок ответа (8 192 или 32 768 токенов выше). Не ставьте max_tokens больше, чем нужно ответу, и выше потолка ответа модели. Если ответ остановился на заданном вами лимите, он заканчивается finish_reason: length, и у этого есть своё решение.

2. Обрежьте историю. Выбросьте самые старые ходы, оставьте системный промпт и несколько последних реплик. Функция trim выше делает именно это. У агента ещё и режьте объём: вывод инструмента на 5 000 строк редко нужен целиком после того, как агент им воспользовался.

3. Сожмите вместо того, чтобы выбрасывать. Когда старые ходы важны, один раз попросите модель сжать их в короткую заметку и замените ими старые сообщения. Платите за один лишний вызов и сохраняете нить разговора.

4. Перейдите на окно побольше. С MiniMax-M2.7 (180K) на GLM-5.3-Flash (390K) или DeepSeek-V4-Flash (380K) — это правка одного id модели. Если нужны ещё и длинные ответы, DeepSeek-V4-Flash отдаёт до 32 768 токенов, а баланс у всех трёх общий, так что переключение не требует настройки.

Чек-лист

Перед повторной отправкой упавшего запроса

Сколько стоит длинная история#

Обрезка нужна не только из-за ошибок. Каждый шаг агента заново отправляет всю историю, так что раздутая история ещё и самая дорогая часть счёта. Возьмём задачу в 30 шагов, где на каждом шаге уходит около 100K токенов, а возвращается около 1 500:

Модель За запрос 30 запросов OpenRouter, 30 запросов
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 входных и 1 500 выходных токенов на запрос. Цены за 1M токенов актуальны и меняются вместе с нашими тарифами; столбец OpenRouter показывает справочные цены для той же нагрузки.

Таблица считает эту же задачу по каждой модели по живым тарифам. Сократите историю вчетверо — и входная часть упадёт примерно на три четверти. Где ваш агент тратит токены, поможет увидеть учёт расхода по запросам на Python; а как это устроено — в разборе почему агенты расходуют так много токенов на примере из 20 шагов.

DeepSeek-V4-Flash сейчас стоит $0.015 за 1M входных токенов и $0.10 за 1M выходных, одна цена в любое время суток. Подставьте свои числа:

Калькулятор стоимости

Задача агента в 30 шагов с историей 100K

Входные токены на запрос: 100 000 · Выходные токены на запрос: 1 500 · Запросов в день: 30

МодельВ деньВ месяц
GLM-5.3-Flash$0.0618$1.85
DeepSeek-V4-Flash$0.0495$1.49
MiniMax-M2.7$0.157$4.70

Если всё равно падает#

У длинных запросов есть и отдельная беда — медленное соединение. Anthropic советует стриминг или Batch API для длинных запросов с большим max_tokens, потому что сети могут обрывать простаивающие соединения, а её SDK ждут, что запрос без стриминга уложится в 10 минут. Если ошибка — таймаут или обрыв, а не 400, смотрите ошибки соединения и включите stream=True.

Если пришла 401 или 404, дело в ключе, базовом адресе или id модели: ошибка API 401 или 404. Точный базовый адрес, id моделей и примеры — в документации CheapTokens.