Skip to content

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 тыс. токенов:

json
{
  "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"
  }
}

Вариант, связанный с бюджетом мышления, согласно публичным отчетам:

text
`max_tokens` must be greater than `thinking.budget_tokens`.

А для моделей Claude 4.7 и новее отправка бюджета приводит к следующей ошибке 400 (согласно странице ошибок Anthropic):

text
"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.5claude-opus-5-51M128K
Claude Sonnet 5.5claude-sonnet-5-51M128K
Claude Haiku 5.5claude-haiku-5-51M128K
Claude Opus 4.5claude-opus-4-5-20251101200K64K
Claude Sonnet 4.5claude-sonnet-4-5-20250929200K64K
Claude Haiku 4.5claude-haiku-4-5-20251001200K64K

Важно знать два исключения:

  • 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 для каждой модели:

bash
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}'

Почему это происходит ​

  1. Копирование значений между моделями. 128000 работает для Opus 5.5, но вызывает сбой для Haiku 4.5, чей максимум — 64 тыс.
  2. Ошибки на единицу. Ряд публичных отчетов показывает 128001 > 128000 — само пороговое значение допустимо, а превышение на единицу — нет.
  3. Настройки по умолчанию в клиентах. Инструменты устанавливают max_tokens за вас. Claude Code считывает CLAUDE_CODE_MAX_OUTPUT_TOKENS; согласно документации, если значение выше лимита известной модели, он понижает его до предела, а для модели, ID которой не может распознать, по умолчанию ставит 32000 с лимитом 128000.
  4. Бюджет не ниже max_tokens. При ручном расширенном мышлении токены мышления учитываются в max_tokens, поэтому бюджет должен оставлять место для ответа.
  5. Старая конфигурация мышления в новой модели. Код, написанный для Claude Sonnet 4.6 или более ранних версий, отправляет budget_tokens в модель 4.7+, которая отклоняет расширенное мышление.

Исправление 1: Ограничьте max_tokens для каждой модели ​

Используйте единый источник истины и ограничивайте каждый запрос:

python
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 тыс. Используйте потоковую передачу в паре с большим лимитом:

python
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.5adaptive (всегда включено)"enabled" (бюджет), "disabled"
Claude Sonnet 5.5adaptive, "between_tools""enabled", "disabled"
Claude Haiku 5.5adaptive; "disabled" при effort high или ниже"enabled"
Claude Opus 4.6 / Sonnet 4.6adaptive; "enabled" все еще работает, но устарело—
Claude Opus 4.5 / Sonnet 4.5 / Haiku 4.5только "enabled" с budget_tokens"adaptive"

В Claude 4.7 и новее решение — полностью отказаться от бюджета:

json
{
  "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:

python
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, значение effort xhigh или 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, чтобы на мышление уходило меньше бюджета.

Возникла проблема? Напишите в поддержку или в наш чат.