Перейти к основному содержанию

Ошибка 400 у Claude в AWS: как найти причину и исправить запрос

8 мин чтенияРуководства

Ошибка 400 при вызове Claude через AWS не всегда означает неверный JSON. Разбираем, как по сообщению Bedrock отличить лишние beta-параметры от ошибки формата API, недоступной модели и требований к хранению данных.

Диагностика ошибки 400 у Claude в Amazon Bedrock по сообщению, формату API, модели и настройкам данных

Ошибка 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 для этого предусмотрена переменная среды:

bash
CLAUDE_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 вы вызываете

Сопоставление полей Converse, InvokeModel и Anthropic-совместимого Messages API

Похожее название messages не означает одинаковую схему запроса. У Bedrock есть несколько способов вызвать Claude, и перенос JSON между ними без адаптации способен вызвать 400.

Способ вызоваГде указана модельГде указан максимум ответаКак выглядит текст сообщения
Converse через bedrock-runtimeАргумент операции modelIdinferenceConfig.maxTokenscontent: [{"text": "…"}]
Claude Messages через InvokeModelАргумент операции modelIdmax_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 должны содержать выбранный вами регион и доступный в нём идентификатор модели либо подходящего профиля вывода. Пример составлен по документации, а не получен в результате тестового вызова.

python
import 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, минимальное тело выглядит иначе:

python
import 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, а не доказательство, что прежнее исправление нужно отменить.

#Claude#Amazon Bedrock#Claude Code#Ошибки API
Поделиться: