400 invalid_request_error
400 invalid_request_error в Claude Fable 5
Либо в payload передан параметр, удалённый из Fable 5, либо настройка хранения данных вашей организации полностью блокирует модель.
Кратко за 30 секунд
Большинство ошибок 400 в Fable 5 вызваны параметрами, которые новые модели Claude больше не принимают: ненулевыми значениями temperature, top_p или top_k, prefill сообщения assistant, thinking с типом disabled и ручным extended thinking с budget_tokens. Другая группа ошибок 400 относится к организации: Fable 5 требует хранения данных 30 дней, и организация с меньшим сроком хранения получает 400 для каждого запроса независимо от payload.
Что вызывает 400 в Fable 5
Сначала прочитайте сообщение об ошибке. Оно называет проблемное поле, а для ошибок в блоках thinking ещё и позицию блока.
Предзаполненное сообщение assistant
Модели Claude 4.6 и новее не поддерживают предзаполнение хода assistant. Если массив messages заканчивается сообщением assistant, возвращается 400 с указанием, что диалог должен заканчиваться сообщением user. Вместо этого используйте структурированные ответы, output_config.format или инструкции в системном промпте.
Срок хранения данных организации меньше 30 дней
Fable 5 — Covered Model, для которой требуется хранение данных 30 дней; при нулевом хранении данных она недоступна. В Claude API запрос из организации с настройкой хранения, не отвечающей этому требованию, возвращает 400 invalid_request_error. Признак: одинаково завершается ошибкой каждый запрос, включая минимальный hello-world payload.
Блоки thinking, которые отредактировали или отфильтровали
Если последнее сообщение assistant содержит блоки thinking или redacted_thinking, которые перед повторной отправкой были переставлены, отфильтрованы или собраны заново, запрос вернёт 400. Сообщение начинается с позиции проблемного блока, например messages.1.content.0.
temperature, top_p или top_k имеют значение, отличное от значения по умолчанию
Установка любого из этих параметров в значение, отличное от значения по умолчанию, возвращает 400. Это не особенность Fable: правило действует с Claude Opus 4.7 и распространяется на Sonnet 5, Opus 5 и Fable 5. Типы запросов SDK по-прежнему содержат эти поля для совместимости со старыми моделями, поэтому код компилируется, но API отклоняет запрос на сервере.
Конфигурация thinking, которую Fable 5 не принимает
Адаптивный thinking всегда включён. И thinking с типом disabled, и ручной extended thinking со значением budget_tokens возвращают 400. В ошибке для случая disabled предлагается thinking.type.enabled, но эта форма также отклоняется в Fable 5, поэтому нужно полностью убрать параметр thinking.
Исправляйте в таком порядке
Сначала проведите одну проверку: если минимальный запрос тоже не проходит, перестаньте отлаживать payload и проверьте настройку организации.
- 1
3. Настройте хранение данных на уровне организации или рабочего пространства
Если для организации действует нулевое хранение данных, вы всё равно можете включить хранение в течение 30 дней для одного рабочего пространства в разделе Privacy controls настроек рабочего пространства Console, оставив во всех остальных рабочих пространствах нулевое хранение. В противном случае обратитесь к менеджеру Anthropic, который ведёт ваш аккаунт.
- 2
4. Передавайте блоки thinking обратно байт в байт
При использовании инструментов возвращайте из хода assistant каждый блок thinking и redacted_thinking в точности полученным, включая блоки с пустым полем thinking. Если код фильтрует блоки content по типу перед повторной отправкой, добавьте оба типа блоков в список разрешённых.
- 3
1. Отправьте минимальный запрос, чтобы отделить payload от аккаунта
Отправьте однострочное сообщение user, указав только model и max_tokens. Если оно успешно, проблема в payload. Если оно завершается той же ошибкой 400, проблема в настройке хранения данных организации, и изменение payload не поможет.
- 4
2. Удалите параметры, которые Fable 5 отклоняет
Удалите из запроса temperature, top_p и top_k, а не устанавливайте им значения по умолчанию. Удалите весь объект thinking вместо попытки указать другой тип. Удалите завершающее сообщение assistant, используемое для prefill.
Всё-таки это не 400?
Если ответ — HTTP 200 с пустым массивом content, перед вами отказ классификатора, а не некорректный запрос. Для него требуется совершенно другая обработка.