Ошибка 400 при работе с Claude через Amazon Bedrock не имеет одного универсального исправления. Если сообщение содержит extra inputs are not permitted, проверяйте названное поле и поддержку функции в вашем способе подключения. Если упомянуты model identifier, inference profile или data retention, начинать нужно с модели, профиля вывода или политики хранения данных — переключатель beta-функций здесь не поможет.
Сначала сохраните полный код и текст ошибки, название операции, регион и идентификатор модели. Затем определите, кто отправляет запрос: Claude Code, ваш SDK или API-посредник. Именно эти сведения позволяют выбрать исправление, а не перебирать советы про «AWS 400». Ниже — порядок проверки по документации, актуальной на 21 сентября 2026 года; реальные запросы к платному API в рамках статьи не выполнялись.
Что сообщает Bedrock помимо числа 400
В документации AWS ValidationException охватывает несколько разных причин: недопустимые поля, неверный идентификатор модели, неподдерживаемую операцию, превышение ограничения на токены и проблемы с настройкой guardrails. Среди описанных случаев встречается и отсутствие необходимых прав на вызов. Поэтому правило «400 — это всегда тело запроса, а права можно не смотреть» ненадёжно. Разбор ValidationException от AWS.
| Что видно в сообщении | Что проверить первым | Чего не стоит делать вслепую |
|---|---|---|
extraneous key, extra inputs are not permitted | Имя отклонённого поля, формат API и поддержку beta-функции | Повторять тот же запрос без изменений |
invalid model identifier | Точный modelId, регион и доступность выбранного способа вызова | Подставлять случайный префикс региона в ID |
Указание на inference profile | Требуется ли этой модели профиль вывода и какой профиль доступен вам | Считать любой ID модели взаимозаменяемым с ID профиля |
| Указание на размер входа или число токенов | Объём истории и запрошенный максимум ответа | Просто увеличивать max_tokens |
Указание на thinking или бюджет рассуждений | Режим, разрешённый для конкретной модели | Отключать thinking одним и тем же способом у всех моделей |
Указание на data retention | Допустимые режимы хранения для модели и действующую политику аккаунта | Менять настройки хранения без согласования |
ServiceQuotaExceededException | Действующую сервисную квоту аккаунта и нагрузку | Считать запрос некорректным только из-за HTTP 400 |
| Подпись, срок запроса или авторизация | Учетные данные, время, подпись и необходимые права | Искать ошибку только в messages |
HTTP-статус сам по себе не заменяет код ошибки. Например, справочник Converse различает ValidationException — 400, AccessDeniedException — 403 и ThrottlingException — 429, а общий справочник Bedrock относит к 400 также отдельные ошибки подписи и авторизации. Сохраняйте оба значения. Ошибки Converse, общие коды Bedrock.
У InvokeModel есть ещё один важный случай: ServiceQuotaExceededException тоже возвращается с HTTP 400. Это превышение сервисной квоты аккаунта; AWS допускает повторную отправку позже. Проверьте код исключения, применимую квоту и текущую нагрузку, прежде чем менять JSON. Запрет на повторные попытки относится к неизменённому запросу с уже выявленной ошибкой схемы, а не ко всем ответам 400. Ошибки InvokeModel.
Если 400 появляется в Claude Code
Когда сообщение называет лишнее поле инструмента или beta-параметр, полезно проверить экспериментальные возможности клиента. В текущем Claude Code для этого предусмотрена переменная среды:
bashCLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 claude
Пример рассчитан на Bash или Zsh и запускает новый процесс Claude Code с этой настройкой. Уже работающая сессия не получает переменную автоматически. Если Claude Code стартует из IDE, контейнера или другого приложения, убедитесь, что настройка передаётся именно запускаемому процессу.
У переключателя есть важные границы. По официальному справочнику переменных Claude Code, он убирает специфичные для Anthropic beta-заголовки и beta-поля схемы инструментов, но сохраняет обычные name, description, input_schema и cache_control. Это не полное отключение кеширования запросов. Кроме того, по умолчанию отключается поиск MCP-инструментов: инструменты загружаются заранее. Начиная с версии 2.1.227 управляемые настройки организации могут сохранять поиск инструментов.
Практическая проверка выглядит так: запишите исходную ошибку, запустите новый процесс с переменной и повторите небольшой запрос. Если ошибка исчезла, это указывает на несовместимость части экспериментальных параметров. Если сообщение осталось прежним и по-прежнему говорит о модели или хранении данных, переходите к соответствующей проверке ниже.
Если между Claude Code и Bedrock стоит шлюз, причина может находиться в нём: шлюз передаёт beta-поле в теле, но удаляет заголовок anthropic-beta. При поддержке этой функции на стороне конечного API исправляют передачу заголовка; в противном случае отключают неподдерживаемую экспериментальную возможность. Официальный справочник ошибок Claude Code отдельно разбирает этот сценарий. Из него не следует, что Bedrock вообще не поддерживает beta-функции.
Версию клиента можно узнать через claude --version; штатная команда обновления — claude update. Обновление имеет смысл, когда документация связывает конкретную ошибку с минимальной версией клиента. Оно не заменяет проверку настроек модели и AWS.
Для подключения через AWS-канал LaoZhang API есть отдельная инструкция по ошибке 400 в Claude Code. Она относится к этому каналу; настройки посредника не исправляют IAM в вашем собственном AWS-аккаунте.
В своём коде сначала проверьте, какой API вы вызываете

Похожее название messages не означает одинаковую схему запроса. У Bedrock есть несколько способов вызвать Claude, и перенос JSON между ними без адаптации способен вызвать 400.
| Способ вызова | Где указана модель | Где указан максимум ответа | Как выглядит текст сообщения |
|---|---|---|---|
Converse через bedrock-runtime | Аргумент операции modelId | inferenceConfig.maxTokens | content: [{"text": "…"}] |
Claude Messages через InvokeModel | Аргумент операции modelId | max_tokens в JSON-теле | content: [{"type": "text", "text": "…"}] |
Anthropic-совместимый /anthropic/v1/messages | Поле model в теле | По схеме Messages API | По схеме Messages API |
В нативном InvokeModel для Claude Messages поле anthropic_version в JSON принимает значение bedrock-2023-05-31, а системные инструкции задаются отдельным полем system. Нельзя переносить туда inferenceConfig из Converse или параметры старого completion-формата prompt и max_tokens_to_sample. Схема Claude Messages в AWS.
Но добавлять anthropic_version в тело любого запроса к AWS тоже неверно. AWS документирует Anthropic-совместимый путь /anthropic/v1/messages для bedrock-runtime и bedrock-mantle: там версия передаётся HTTP-заголовком anthropic-version, а модель — в теле. Для стороннего посредника сверяйтесь с контрактом именно его конечного адреса. Messages API в Amazon Bedrock.
Для проверки через Converse можно начать с такого Python-примера. Он предполагает настроенные AWS-учётные данные и библиотеку boto3. Переменные AWS_REGION и BEDROCK_MODEL_ID должны содержать выбранный вами регион и доступный в нём идентификатор модели либо подходящего профиля вывода. Пример составлен по документации, а не получен в результате тестового вызова.
pythonimport os import boto3 from botocore.exceptions import ClientError client = boto3.client( "bedrock-runtime", region_name=os.environ["AWS_REGION"], ) try: response = client.converse( modelId=os.environ["BEDROCK_MODEL_ID"], messages=[{ "role": "user", "content": [{"text": "Ответь одним словом: готово."}], }], inferenceConfig={"maxTokens": 64}, ) print(response["output"]["message"]["content"]) except ClientError as exc: error = exc.response.get("Error", {}) metadata = exc.response.get("ResponseMetadata", {}) print({ "code": error.get("Code"), "message": error.get("Message"), "http_status": metadata.get("HTTPStatusCode"), "request_id": metadata.get("RequestId"), }) raise
Успешный ответ на этот короткий запрос показывает, что выбранное сочетание операции, модели, региона и учётных данных работает для базового вызова. Он ещё не проверяет инструменты, длинную историю, thinking и остальные параметры вашего приложения. Возвращайте их по одному: так можно увидеть, после какого изменения сервер начинает отклонять запрос.
Если нужен именно InvokeModel, минимальное тело выглядит иначе:
pythonimport json body = { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 64, "messages": [{ "role": "user", "content": [{"type": "text", "text": "Ответь: готово."}], }], } response = client.invoke_model( modelId=os.environ["BEDROCK_MODEL_ID"], contentType="application/json", accept="application/json", body=json.dumps(body), )
Этот фрагмент использует client из предыдущего примера и предполагает, что выбранная модель доступна через InvokeModel. Для Converse дополнительные поддерживаемые параметры модели передают через additionalModelRequestFields; это не разрешение отправлять туда произвольные поля. У вызова с ARN из Prompt management также есть отдельные ограничения на поля запроса. Схема запроса Converse.
Модель, профиль вывода, токены и история
Если даже минимальный запрос отклоняется, проверьте точный идентификатор вместе с регионом и операцией. Ошибка о том, что вызов on-demand не поддерживается, может требовать подходящего профиля вывода. Возьмите его ID или ARN из доступных вам профилей AWS; не добавляйте к ID модели префикс вроде us. наугад. Один пример из чужой статьи не гарантирует доступность того же профиля в вашем аккаунте.
В Claude Code команда /status помогает проверить активного провайдера. Если используется Mantle, нужен его идентификатор модели вида anthropic.*: ID профиля для Invoke, например с префиксом us.anthropic.*, не становится от этого допустимым ID модели Mantle. Не переносите идентификаторы между способами вызова без проверки. Claude Code с Amazon Bedrock.
Региональная доступность модели и ограничения по стране или местонахождению аккаунта — разные условия. Смена региона не является универсальным способом устранить ограничение доступа. Если текст указывает на авторизацию, проверяйте разрешения конкретной операции и ресурса вместе с администратором, а не выдавайте приложению полный доступ к Bedrock. Причины ошибок валидации у AWS.
Если сервер сообщает о превышении лимита контекста, учитывайте и входные данные, и запрошенный ответ. История, определения инструментов и вложения могут занимать существенную часть допустимого объёма. Для диагностики сократите запрос до одного короткого сообщения и небольшого лимита ответа. Если он проходит, восстановите только необходимый контекст и подберите лимит под конкретную модель.
С thinking важна модель, а не только число токенов. Для обычного расширенного режима AWS требует бюджет рассуждений меньше max_tokens, но отдельно оговаривает исключение для interleaved thinking. Некоторые новые модели используют адаптивный режим и отклоняют старые значения enabled или disabled с кодом 400. Поэтому совет «всегда отключите thinking» может сам создать ошибку. Проверяйте режимы thinking в документации AWS для выбранной модели.
Наконец, если ошибка называет несоответствие tool_use, tool_result или блоков thinking, проверьте целостность истории. В Claude Code для возврата к состоянию до проблемного хода предусмотрены /rewind или двойное нажатие Esc. Это целевое действие при ошибке истории, а не повод очищать все разговоры при любом 400. Разбор несовпадения блоков в Claude Code. Ошибку, связанную именно с assistant prefill, отдельно разбирает руководство по prefill у Claude.
Отдельная причина: модель требует другой режим хранения данных
Если ValidationException прямо говорит о data retention, корректного JSON может быть недостаточно: выбранная модель требует режим хранения, который не разрешён действующей настройкой аккаунта. Это вопрос политики обработки данных, поэтому сначала нужно выяснить допустимые режимы для модели и согласовать изменение с ответственным за AWS-аккаунт.
По текущей документации AWS о хранении данных, для новых настроек используется aws_review. Имя provider_data_share сохранено как устаревшее; сейчас этот режим не означает отправку содержимого запросов поставщику модели. Проверка на злоупотребления выполняется внутри AWS. Для перечисленных в документации моделей Fable срок хранения может составлять до 30 дней. Старые публикации, связывающие название provider_data_share с обязательной передачей содержимого Anthropic, не описывают текущие правила.
Проверять нужно конкретное сочетание аккаунта, региона и модели. Настройки задаются по регионам, а для bedrock-runtime действуют на уровне аккаунта, без отдельного уровня проекта. Есть и исключения: аккаунтам с явно одобренным ZDR (Zero Data Retention) может быть разрешён режим none для определённых моделей. При этом inherit или значение по умолчанию сами по себе не доказывают, что данные нигде не сохраняются.
Полезный результат этой проверки — не просто исчезновение 400, а понятное решение: модель работает при согласованной политике; действует подтверждённое исключение ZDR; либо нужно выбрать модель, совместимую с требованиями вашей организации. Не меняйте общую настройку хранения только ради проверки случайного совета из поиска.
Как убедиться, что исправление помогло

Повторите сначала минимальный запрос через тот же регион, аккаунт и способ подключения, затем исходный сценарий. Если базовый вызов проходит, а исходный снова падает, проверьте добавленные обратно параметры и историю: проблема ещё не устранена для рабочего сценария.
Если нужна помощь администратора или поддержки, передайте время запроса, регион, операцию или конечный адрес API, modelId, версию клиента, код и полный текст ошибки, а также RequestId. Перед отправкой проверьте журнал: в нём не должно быть ключей, токенов доступа и конфиденциального содержимого запросов. По возможности приложите минимальный пример с нейтральным текстом.
Не настраивайте бесконечные повторы одного и того же запроса с ошибкой схемы. Повторные попытки и переключение модели решают другую задачу; выбор между ними разобран в руководстве по retry и fallback для LLM API. Если после исправления вместо 400 вы получили 429, это уже отдельный диагноз — ограничение частоты запросов Claude, а не доказательство, что прежнее исправление нужно отменить.



