Claude API 400: max_tokens слишком велико — лимиты и способы устранения
Запрос к /v1/messages завершается с ошибкой HTTP 400 invalid_request_error из-за параметра max_tokens — либо он превышает возможности модели по генерации, либо конфликтует с вашими настройками мышления. Это чисто ошибки валидации параметров: код не выполнялся, а решение заключается в изменении числа или поля в теле запроса.
Краткий ответ
max_tokens не может превышать максимальный объем вывода модели. Для текущих моделей Anthropic — Claude Opus 5.5, Sonnet 5.5 и Haiku 5.5 — это 128 тыс. токенов в синхронном API Messages; Claude Opus 4.5, Sonnet 4.5 и Haiku 4.5 допускают 64 тыс. Устанавливайте лимит в соответствии с конкретной моделью. Если вы используете ручное расширенное мышление (thinking.type: "enabled"), budget_tokens должен быть не менее 1 024 и меньше, чем max_tokens. В моделях Claude 4.7 и новее расширенное мышление не поддерживается: удалите budget_tokens, используйте thinking: {"type": "adaptive"} и управляйте глубиной через output_config.effort.
Симптомы и значение ошибки
В документации Anthropic указано, что max_tokens имеет специфические для каждой модели максимумы, но точный текст ошибки не публикуется. Публичные отчеты об ошибках показывают следующий формат — ниже реальный пример, отправленный модели с лимитом вывода 128 тыс. токенов:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "max_tokens: 250001 > 128000, which is the maximum allowed number of output tokens for claude-opus-4-6"
}
}Вариант, связанный с бюджетом мышления, согласно публичным отчетам:
`max_tokens` must be greater than `thinking.budget_tokens`.А для моделей Claude 4.7 и новее отправка бюджета приводит к следующей ошибке 400 (согласно странице ошибок Anthropic):
"thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.Похожие по виду, но другие ошибки:
stop_reason: "max_tokens"в успешном ответе — ответ достиг вашего потолка и был обрезан. Увеличьтеmax_tokensв рамках лимита модели или уменьшитеeffort, чтобы на мышление уходило меньше бюджета.- "prompt is too long" — входные данные превышают контекстное окно. См. prompt is too long.
- Python-исключение
ValueErrorдо отправки запроса — SDK отклоняет длинный нестриминговый вызов, это не ошибка API. См. Anthropic API timeout.
Лимиты вывода по моделям
Согласно обзору моделей Anthropic (синхронный API Messages):
| Модель | API ID | Контекстное окно | Макс. вывод (max_tokens) |
|---|---|---|---|
| Claude Opus 5.5 | claude-opus-5-5 | 1M | 128K |
| Claude Sonnet 5.5 | claude-sonnet-5-5 | 1M | 128K |
| Claude Haiku 5.5 | claude-haiku-5-5 | 1M | 128K |
| Claude Opus 4.5 | claude-opus-4-5-20251101 | 200K | 64K |
| Claude Sonnet 4.5 | claude-sonnet-4-5-20250929 | 200K | 64K |
| Claude Haiku 4.5 | claude-haiku-4-5-20251001 | 200K | 64K |
Важно знать два исключения:
- Batch API. В API Message Batches модели Claude Opus 5.5, Sonnet 5.5, Haiku 5.5 и ряд других актуальных моделей поддерживают до 300 тыс. выходных токенов при использовании бета-заголовка
output-300k-2026-03-24. - Минимум.
max_tokensможет быть равен0, что заполняет кэш промпта без генерации ответа. Это нельзя сочетать с ручным расширенным мышлением, так как бюджет должен быть меньшеmax_tokens.
Вместо хардкодинга таблицы считывайте лимиты из источника. API Models от Anthropic возвращает max_input_tokens и max_tokens для каждой модели:
curl -s https://api.anthropic.com/v1/models \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
| jq '.data[] | {id, max_input_tokens, max_tokens}'Почему это происходит
- Копирование значений между моделями.
128000работает для Opus 5.5, но вызывает сбой для Haiku 4.5, чей максимум — 64 тыс. - Ошибки на единицу. Ряд публичных отчетов показывает
128001 > 128000— само пороговое значение допустимо, а превышение на единицу — нет. - Настройки по умолчанию в клиентах. Инструменты устанавливают
max_tokensза вас. Claude Code считываетCLAUDE_CODE_MAX_OUTPUT_TOKENS; согласно документации, если значение выше лимита известной модели, он понижает его до предела, а для модели, ID которой не может распознать, по умолчанию ставит 32000 с лимитом 128000. - Бюджет не ниже
max_tokens. При ручном расширенном мышлении токены мышления учитываются вmax_tokens, поэтому бюджет должен оставлять место для ответа. - Старая конфигурация мышления в новой модели. Код, написанный для Claude Sonnet 4.6 или более ранних версий, отправляет
budget_tokensв модель 4.7+, которая отклоняет расширенное мышление.
Исправление 1: Ограничьте max_tokens для каждой модели
Используйте единый источник истины и ограничивайте каждый запрос:
MAX_OUTPUT = {
"claude-opus-5-5": 128_000,
"claude-sonnet-5-5": 128_000,
"claude-haiku-5-5": 128_000,
"claude-haiku-4-5-20251001": 64_000,
}
def safe_max_tokens(model: str, wanted: int) -> int:
cap = MAX_OUTPUT.get(model, 32_000) # консервативное значение по умолчанию для неизвестных ID
return max(1, min(wanted, cap))Большие значения имеют второе ограничение: время выполнения. Anthropic рекомендует использовать потоковую передачу или Batch API для длинных запросов; в примерах кода Anthropic отмечено, что Python SDK требует потоковую передачу для max_tokens более ~21 тыс. Используйте потоковую передачу в паре с большим лимитом:
import anthropic
client = anthropic.Anthropic()
model = "claude-sonnet-5-5"
with client.messages.stream(
model=model,
max_tokens=safe_max_tokens(model, 64_000),
messages=[{"role": "user", "content": "Write the full migration guide."}],
) as stream:
message = stream.get_final_message()
print(message.stop_reason, message.usage.output_tokens)max_tokens — это потолок, а не цель: модель может остановиться задолго до него, и вы платите за фактически сгенерированные токены. Если длинные потоки обрываются на середине, см. streaming connection dropped.
Исправление 2: Используйте верную конфигурацию мышления для модели
Ошибки мышления зависят от модели, к которой вы обращаетесь, поэтому перед изменением параметров сверьтесь с таблицей устранения неполадок Anthropic. Модели, которые сегодня чаще всего используют разработчики, ведут себя так:
| Модель | Принимает | Отклоняет с кодом 400 |
|---|---|---|
| Claude Opus 5.5 | adaptive (всегда включено) | "enabled" (бюджет), "disabled" |
| Claude Sonnet 5.5 | adaptive, "between_tools" | "enabled", "disabled" |
| Claude Haiku 5.5 | adaptive; "disabled" при effort high или ниже | "enabled" |
| Claude Opus 4.6 / Sonnet 4.6 | adaptive; "enabled" все еще работает, но устарело | — |
| Claude Opus 4.5 / Sonnet 4.5 / Haiku 4.5 | только "enabled" с budget_tokens | "adaptive" |
В Claude 4.7 и новее решение — полностью отказаться от бюджета:
{
"model": "claude-sonnet-5-5",
"max_tokens": 32000,
"thinking": {"type": "adaptive"},
"output_config": {"effort": "high"},
"messages": [{"role": "user", "content": "Plan the refactor step by step."}]
}Claude Opus 5.5 думает без какой-либо конфигурации, поэтому там поле thinking можно опустить. Effort по умолчанию — medium для Opus 5.5 и Haiku 5.5, и high для большинства других моделей, поддерживающих настройку интенсивности (effort).
Для моделей, которые все еще используют ручное расширенное мышление, соблюдайте правила для бюджета — не менее 1 024 и меньше, чем max_tokens:
def thinking_params(max_tokens: int, desired_budget: int) -> dict:
# Оставьте место для видимого ответа; бюджет должен быть меньше max_tokens
budget = min(desired_budget, max_tokens - 4_096)
if budget < 1_024:
raise ValueError("raise max_tokens: budget_tokens must be >= 1024 and < max_tokens")
return {"type": "enabled", "budget_tokens": budget}
params = dict(model="claude-haiku-4-5-20251001", max_tokens=16_000,
thinking=thinking_params(16_000, 10_000))Единственное задокументированное исключение — чередующееся мышление в ручном режиме, где бюджет охватывает каждый блок мышления в рамках хода ассистента и может превышать max_tokens.
Исправление 3: Проверьте другие ошибки валидации параметров (400)
Если ограничение лимитов не помогло, ошибка 400 может быть вызвана другой проверкой. Все они задокументированы Anthropic:
- Параметры сэмплирования в новейшей версии API. В
anthropic-version: 2026-10-21параметрыtemperature,top_pиtop_kудалены, и их отправка для любой модели возвращает 400. - Принудительное использование инструментов.
tool_choiceсо значением{"type": "any"}или именованным инструментом возвращает 400 для Claude Opus 5.5 и Sonnet 5.5;autoиnoneпринимаются. - Effort при выключенном мышлении. Для Sonnet 5.5 с
between_toolsили Haiku 5.5 сdisabled, значение effortxhighилиmaxвозвращает 400, как и попытка установить effort для сообщения, отличающийся от текущего уровня. between_toolsв других моделях. Только Claude Sonnet 5.5 принимает этот параметр; другие модели возвращают 400.
Каждое сообщение об ошибке указывает на проблемное поле, поэтому внимательно прочитайте текст ошибки перед изменением кода.
Если вы вызываете Claude через byesu
byesu — это шлюз AI API с совместимым с OpenAI эндпоинтом (https://byesu.com/v1) и родным эндпоинтом Anthropic (/v1/messages на том же хосте), с оплатой по факту использования (pay-as-you-go) без подписки. Для данной ошибки важны два момента:
- Лимит принадлежит модели, а не эндпоинту.
claude-opus-5-5,claude-sonnet-5-5иclaude-haiku-5-5(вызываемые также через точечные псевдонимы вродеclaude-sonnet-5.5) имеют лимит вывода Anthropic в 128 тыс. токенов независимо от используемого формата, поэтому используйте таблицу из Исправления 1. Поскольку биллинг идет за фактически сгенерированные токены, разумный потолок не увеличивает стоимость; реальный драйвер затрат — это то, сколько модель пишет и думает. - Мышление подчиняется правилам модели. Отправите
budget_tokensв модель 5.5 — получите ошибку"thinking.type.enabled" is not supported; используйте вместо этого адаптивное мышление и effort. В Claude Code (ANTHROPIC_BASE_URL=https://byesu.com, без/v1) держитеCLAUDE_CODE_MAX_OUTPUT_TOKENSна уровне 128000 или ниже.
Чтобы начать, создайте токен в консоли и выберите ID модели. Полная настройка: Quick Start.
FAQ
Каков лимит max_tokens для моделей Claude?
Это зависит от модели. Claude Opus 5.5, Sonnet 5.5 и Haiku 5.5 поддерживают до 128 тыс. выходных токенов в синхронном API Messages, а Claude Opus 4.5, Sonnet 4.5 и Haiku 4.5 — 64 тыс. В API Message Batches многие актуальные модели, включая версии 5.5, поддерживают до 300 тыс. токенов при использовании бета-заголовка output-300k-2026-03-24. API Models от Anthropic возвращает значение max_tokens для каждой модели.
Почему я получаю ошибку "max_tokens must be greater than thinking.budget_tokens"?
При использовании ручного расширенного мышления токены мышления учитываются в общем лимите max_tokens, поэтому budget_tokens должен быть не менее 1 024 и меньше, чем max_tokens, чтобы оставить место для ответа. Увеличьте max_tokens или уменьшите бюджет. Единственным задокументированным исключением является чередующееся мышление в ручном режиме, где бюджет может превышать max_tokens.
Можно ли использовать budget_tokens с Claude Opus 5.5?
Нет. Модели Claude 4.7 и новее, включая Opus 5.5, Sonnet 5.5 и Haiku 5.5, отклоняют thinking.type "enabled" с ошибкой 400. Используйте тип мышления "adaptive" и настраивайте глубину через output_config.effort. В Opus 5.5 мышление всегда включено, поэтому поле thinking можно полностью опустить.
Влияет ли установка большого значения max_tokens на стоимость?
Сама по себе — нет. max_tokens — это только потолок; оплата взимается за фактически сгенерированные токены, включая токены мышления. Высокое значение делает возможными длинные и медленные ответы, поэтому для больших запросов используйте потоковую передачу — Anthropic рекомендует потоковую передачу или Batch API для длительных вызовов, а Python SDK отклоняет длинные нестриминговые запросы.
Чем это отличается от stop_reason "max_tokens"?
Ошибка 400 означает, что запрос был отклонен до начала генерации, так как параметры max_tokens или настройки мышления были неверны. stop_reason "max_tokens" появляется в успешном ответе, который был прерван, так как достиг вашего лимита. В последнем случае увеличьте max_tokens в рамках лимита модели или уменьшите effort, чтобы на мышление уходило меньше бюджета.
