# AWS Claude 报 400 怎么办：按报错原文逐条排查

> 400 只说明请求被拒，改法看报错原文：Extra inputs 多是网关丢了 Beta 请求头，thinking 报错要升级 Claude Code，数据保留报错要找管理员。

- URL: https://blog.laozhang.ai/zh/posts/aws-claude-400-error
- Published: 2026-09-21
- Updated: 2026-09-25
- Author: LaoZhang AI Team (https://blog.laozhang.ai/zh/about)
- Topic: API 接入指南
- Tags: AWS Bedrock, Claude, Claude Code, API 排错, ValidationException

---
在 AWS 上用 Claude 拿到 400，先别急着换密钥或换渠道。400 只表示请求被拒绝，真正决定怎么改的是后面那行报错原文：`Extra inputs are not permitted` 多半是网关或中转丢了 `anthropic-beta` 请求头；`"thinking.type.enabled" is not supported` 是 Claude Code 版本太旧；`Input is too long for requested model.` 是上下文超了；`data retention mode 'default'` 则是账户设置问题，代码怎么改都没用，要找 AWS 管理员。

排查前再分清一件事：发请求的是 Claude Code，还是你自己写的代码。Claude Code 在 Bedrock 上只走 Invoke API，不支持 Converse API，所以针对 Converse 请求体的改法对 Claude Code 用户不适用。

文中的版本号和默认模型截至 2026 年 9 月 24 日，来自 [Claude Code 错误参考](https://code.claude.com/docs/en/errors) 与 AWS 官方文档；代码和命令按这些文档整理，没有在 AWS 账号上实际运行，模型 ID、Region 请换成你账户里可用的值。

## 按报错原文直接查

把终端或日志里的完整报错复制出来，找下表第一列的字样。同一条报错里出现多个关键字时，以最具体的那个为准。

| 报错里出现的字样 | 多半是什么问题 | 先做什么 |
| --- | --- | --- |
| `Extra inputs are not permitted`、`Unexpected value(s) for the anthropic-beta header` | Claude Code 和 API 之间的网关或中转丢掉了 `anthropic-beta` 请求头，Beta 字段却还留在请求体里 | 让网关转发该请求头；做不到再设 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` |
| `"thinking.type.enabled" is not supported for this model` | Claude Code 版本低于所选模型要求的最低版本 | `claude update` 后重启 |
| `max_tokens must be greater than thinking.budget_tokens` | `MAX_THINKING_TOKENS` 超过了输出上限 | 调低它，或调高 `CLAUDE_CODE_MAX_OUTPUT_TOKENS` |
| `Input is too long for requested model.` | 输入 token 加上请求的输出额度超出模型上限 | `/compact`、`/clear`，Claude Code 升到 v2.1.217 以上 |
| `tool use concurrency issues`、`orphaned tool_result`、`duplicate tool_use ID` | 对话历史里的工具调用和思考块顺序错乱 | `/rewind` 或连按两次 Esc |
| `on-demand throughput isn't supported` | 用了不支持按需调用的模型 ID | 改用推理配置文件 ID |
| `The provided model identifier is invalid` | 模型 ID 写错、当前 Region 没有这个模型，或经销商账户未加入 Anthropic 计划 | 核对 ID 与 Region，都没问题再问经销商 |
| 在 Mantle 上报 400 且点名了模型 ID | 这个模型不在 Mantle 上提供 | 换成 Mantle 格式 ID，或同时启用 Invoke API |
| `data retention mode 'default' is not available for this model` | Fable 5 / Fable 5.1 要求账户数据保留模式至少为 `aws_review` | 交给 AWS 管理员决定 |
| `Access to Anthropic models is not allowed from unsupported countries, regions, or territories` | 账户税务或账单地址、调用方位置不在 Anthropic 支持范围 | 换 Region 不管用，要改账户信息 |
| `Your AWS account is not authorized to invoke this API operation`、`NotAuthorized` | IAM 策略或 SCP 没有放行 | 找管理员补权限 |
| `IncompleteSignature`、`RequestExpired` | 请求签名不合规，或本机时钟偏差太大 | 升级 SDK、核对密钥、同步系统时间 |
| `Malformed input request: extraneous key [...] is not permitted` | 请求体里有该模型或该接口不认的字段 | 按所用接口核对请求体 |
| `is not supported on this API. Please use the Messages API instead.` | 还在用旧的文本补全格式 | 改成 `messages` 格式 |
| `ServiceQuotaExceededException` | 超出账户的服务配额 | 可以稍后重发；长期要申请提高配额 |

如果状态码根本不是 400，就不属于这张表：Claude Code 把 403 显示为 AWS 认证失败，可能是令牌过期，也可能是缺 IAM 权限或模型没在账户和 Region 里开通；404 的 `FTUFormNotFilled` 表示还没提交 Anthropic 用例表单；429 的 `ThrottlingException` 是限流，处理思路见 [Claude Rate Exceeded 错误：先确认限制归属再重试](https://blog.laozhang.ai/zh/posts/claude-rate-exceeded-error)；529 的 `overloaded_error` 是服务端过载。

## Claude Code 连 AWS 报 400

Claude Code 用户大致有三种接法：设 `CLAUDE_CODE_USE_BEDROCK=1` 直连 Bedrock，设 `CLAUDE_CODE_USE_MANTLE=1` 走 Mantle 端点，或者把 `ANTHROPIC_BASE_URL` 指向某个第三方的“AWS Claude”通道。中文语境里说的“AWS Claude”经常指最后这种中转，它背后接的是 Bedrock，但请求要先经过对方的网关，两者的出错位置不一样。

不确定自己走的是哪条，在 Claude Code 里运行 `/status`：直连会显示 Bedrock 与解析出的 Region，Mantle 会显示 `Amazon Bedrock (Mantle)`。设置方法可以参考 [Claude Code API 配置：先选路由，再设置 Key、模型和网关](https://blog.laozhang.ai/zh/posts/claude-code-api-configuration)。

### Extra inputs are not permitted：先看有没有经过网关

这条报错的典型形态是：

```text
API Error: 400 ... Extra inputs are not permitted ... context_management
API Error: 400 ... Unexpected value(s) for the `anthropic-beta` header
```

Claude Code 会同时发出 `context_management`、`effort` 这类 Beta 字段和一个启用它们的 `anthropic-beta` 请求头。网关转发了请求体却丢掉了请求头，上游就会把这些字段当成多余的输入拒掉。

官方给的修法有先后顺序：

1. 能改网关配置的，让它原样转发 `anthropic-beta` 请求头。这是根治办法，Claude Code 的功能也不受影响。
2. 改不了网关（例如用的是别人的中转），在启动 Claude Code 之前设置 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1`。

临时排查可以在同一个终端里执行：

```bash
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
claude
```

长期使用就写进 `~/.claude/settings.json` 的 `env`，和已有的地址、密钥配置合并在一起，不要覆盖原来的内容：

```json
{
  "env": {
    "ANTHROPIC_BASE_URL": "你的网关地址",
    "ANTHROPIC_AUTH_TOKEN": "你的密钥",
    "CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
  }
}
```

变量必须在进程启动前就存在，已经在运行的 Claude Code 要退出重开才会生效。

这个开关的作用范围很窄。它会去掉 Anthropic 专用的 `anthropic-beta` 请求头，以及 `defer_loading`、`eager_input_streaming` 这类 Beta 工具字段，保留 `name`、`description`、`input_schema`、`cache_control` 等标准字段。代价是 MCP 工具搜索被关闭，所有 MCP 工具定义在一开始就全部载入，你在 `ENABLE_TOOL_SEARCH` 里设的值也会被忽略（v2.1.227 起可以通过托管设置保留工具搜索）。连接的 MCP 服务器多时，上下文会被工具定义挤占，更容易撞上后面的 `Input is too long`，可以参考 [Claude Code MCP 上下文爆掉：为什么服务器太多会吃窗口，怎么筛选和压缩](https://blog.laozhang.ai/zh/posts/claude-code-mcp-context-overload) 精简服务器。

它修不了模型 ID、IAM 权限、配额、数据保留这些问题。设了开关还是 400，就回到上面的表，看报错原文换成了哪一条。

直连 Bedrock、中间没有任何网关时，也有人遇到过 `output_config.effort: Extra inputs are not permitted`：GitHub 上 `claude-code-action` 的一个 issue（2026 年 3 月提交，至今未关闭）报告，Bedrock 加 Sonnet 4.5 的应用推理配置文件时出现这条报错，评论里有人换成 Sonnet 4.6 或 Opus 4.6 后恢复。这只是用户报告，但说明同一个字段也可能是模型或端点本身不接受，不一定每次都是请求头被丢。

如果你用的是老张 API 的 AWS Claude 通道，它的[帮助文档](https://docs.laozhang.ai/faq/claude-code-aws-400-validation-error)给出的就是上面第 2 种做法，只适用于该通道；同一页面也写明 Claude 模型目前因资源不足暂时下线，恢复时间以其公告为准。

*说明：[laozhang.ai 是我们自己的服务](https://blog.laozhang.ai/zh/about#laozhang)，其价格是平台报价，不是独立比较的结论。*

### thinking 相关的两种 400

第一种：

```text
API Error: 400 ... "thinking.type.enabled" is not supported for this model. Use "thinking.type.adaptive" and "output_config.effort" to control thinking behavior.
```

这表示 Claude Code 版本低于所选模型的最低要求，旧版本发出的思考参数新模型已经不接受。运行 `claude update` 后重启即可。各模型要求的最低版本如下（截至 2026 年 9 月 24 日）：

| 模型 | Claude Code 最低版本 |
| --- | --- |
| Opus 4.7 | v2.1.111 |
| Opus 4.8 | v2.1.154 |
| Sonnet 5 | v2.1.197 |
| Opus 5 | v2.1.219 |
| Opus 5.5 | v2.1.280 |

暂时没法升级，就用 `/model` 切到 Opus 4.6 或 Sonnet 4.6。用 Agent SDK 时升级的是 SDK 包本身，比如 Opus 5.5 需要 TypeScript SDK v0.3.280 以上。

AWS 这边的规则与之对应：Claude Fable 5.1、Mythos 5.1、Mythos 5 和 Fable 5 不支持延伸思考，请求里带 `thinking.type: "enabled"` 或 `"disabled"` 都会返回 400，要改成 `{"type": "adaptive"}` 配合 `output_config.effort`，或者干脆不传 `thinking`。

第二种：

```text
API Error: 400 ... max_tokens must be greater than thinking.budget_tokens
```

Claude Code 在 Anthropic 官方 API 上会自动调整这两个值，这条报错主要出现在 Amazon Bedrock 和 Google Cloud 上，原因是 `MAX_THINKING_TOKENS` 设得比平台的输出上限还高，或者计划模式把思考预算调高了。改法二选一：调低 `MAX_THINKING_TOKENS`，或者把 `CLAUDE_CODE_MAX_OUTPUT_TOKENS` 调到高于思考预算。

在 Bedrock 这类第三方平台上，`MAX_THINKING_TOKENS=0` 的效果是不发送 `thinking` 参数；Opus 5.5 和 Fable 系列本身无法关闭思考，设 0 也关不掉。

### Input is too long for requested model.

这是 Bedrock 对上下文超限的说法，属于 `ValidationException`。AWS 计算上限时把输入 token 和请求的输出额度加在一起，所以输入还没到窗口上限、但 `max_tokens` 设得很大时也会触发。

Claude Code 从 v2.1.217 起把这句话和 `Prompt is too long` 同样处理。更早的版本不认识 Bedrock 的这个说法，自动压缩不会触发，手动 `/compact` 也会报同样的错，所以先确认版本。之后按顺序处理：

- `/compact` 压缩当前对话，或 `/clear` 开新对话；
- `/context` 看窗口被什么占满；
- 用 `/mcp disable <name>` 关掉暂时用不到的 MCP 服务器；
- 精简过大的 `CLAUDE.md`。

前面提到的 `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` 会让 MCP 工具全部预载，两者同时出现时，先精简 MCP 服务器。

### 工具调用或思考块错乱

下面这些报错说的是同一件事：历史里的 `tool_use`、`tool_result` 和 `thinking` 块顺序对不上了，通常发生在工具调用被中断或某一轮在流式输出中途被改动之后。

```text
API Error: 400 due to tool use concurrency issues. Run /rewind to recover the conversation.
API Error: 400 orphaned tool_result in conversation history. Run /rewind to recover the conversation.
API Error: 400 duplicate tool_use ID in conversation history. Run /rewind to recover the conversation.
API Error: 400 ... unexpected `tool_use_id` found in `tool_result` blocks
API Error: 400 ... thinking blocks ... cannot be modified
```

运行 `/rewind` 或连按两次 Esc，退回出错那一轮之前的检查点再继续。用 Opus 4.7 或 Opus 4.8 时先运行 `claude update`：v2.1.156 之前的版本在正常调用工具时也可能触发这个错误，而且 `/rewind` 清不掉。这类错误跟 Bedrock 无关，换任何平台都一样。

### 模型 ID、前缀与 Mantle

Claude Code 在 Bedrock 的 Invoke API 上会把内置默认模型解析成跨区域推理配置文件 ID，前缀按 Region 选：

| AWS Region | 优先使用的前缀 |
| --- | --- |
| `us-gov-*` | `us-gov.` |
| `us-*` | `us.` |
| `eu-*` | `eu.` |
| `ap-*` | `apac.` |
| 其他 | `global.` |

想换前缀可以设 `ANTHROPIC_BEDROCK_REGION_PREFIX`（需 v2.1.224 以上，可选值 `us`、`eu`、`apac`、`jp`、`au`、`global`），但它只是偏好，不保证可用。关键在于 Claude Code 能不能列出你账户里的推理配置文件：能列出时，它会找有对应前缀的配置文件，找不到再退而求其次；列不出时，它直接套用前缀、不做检查，账户里没开通这组前缀的配置文件，请求就会 400。所以不要看到教程写 `us.` 或 `global.` 就照抄，先查自己的 Region 实际有什么：

```bash
aws bedrock list-inference-profiles --region us-east-1
```

给 IAM 策略加上 `bedrock:GetInferenceProfile`，Claude Code 才能解析应用推理配置文件的 ARN。你自己配置的推理配置文件 ID 和 ARN，Claude Code 不会改写。

另外几种与模型 ID 有关的 400：

- `on-demand throughput isn't supported`：把模型写成推理配置文件 ID，而不是裸的基础模型 ID。
- 默认模型没开通：不固定版本时，截至 2026 年 9 月 24 日，Claude Code 在 Bedrock 上的主模型默认是 Opus 5.5（`us-*` 下为 `us.anthropic.claude-opus-5-5`），小模型默认是 Sonnet 4.5；v2.1.280 之前主模型默认是 Opus 5。默认值可能指向账户里还没开通的模型，Claude Code 启动时会为本次会话回退到别的模型，但团队部署建议用 `ANTHROPIC_DEFAULT_OPUS_MODEL`、`ANTHROPIC_DEFAULT_SONNET_MODEL`、`ANTHROPIC_DEFAULT_HAIKU_MODEL` 或 `ANTHROPIC_MODEL` 固定版本，例如 `us.anthropic.claude-sonnet-4-6`。
- Mantle：模型 ID 用 `anthropic.` 开头、不带版本后缀的写法，比如 `anthropic.claude-sonnet-5`。报 400 且点名了模型 ID，说明这个模型不在 Mantle 上提供，`us.anthropic.claude-sonnet-4-6` 这类推理配置文件 ID 在 Mantle 上用不了。可以换成 Mantle 格式的 ID，或者同时设置 `CLAUDE_CODE_USE_BEDROCK` 和 `CLAUDE_CODE_USE_MANTLE`，让 Claude Code 按 ID 格式把请求分到两个端点。凭证有效却收到 403，则是账户没有获得该模型的访问权限，要联系 AWS 客户团队。

## 自己写代码调 Bedrock 报 400

自己写代码时，最常见的 400 来源是把一种接口的请求体套到了另一种接口上。Bedrock 上调用 Claude 有三种形状，字段名看着像，位置和取值都不同。

![Converse、InvokeModel 与 Messages API 三种接口的关键请求字段对比](https://blog.laozhang.ai/posts/zh/aws-claude-400-error/img/interface-formats.webp)

几处最容易写错的地方：

- InvokeModel 请求体里的 `anthropic_version` 固定写 `bedrock-2023-05-31`。`2023-06-01` 只用在 Messages API 的 `anthropic-version` 请求头里，写进 InvokeModel 请求体就是错的。
- 模型不写在 InvokeModel 的请求体里，而是放在调用参数 `modelId` 中；Messages API 则相反，`model` 写在请求体里。
- Converse 的 `messages[].content` 是 `[{"text": "..."}]` 这样的数组，最大输出写在 `inferenceConfig.maxTokens`，Claude 专属参数放进 `additionalModelRequestFields`。用 Prompt management 的 ARN 调用时，不能再传 `additionalModelRequestFields`、`inferenceConfig`、`system`、`toolConfig`。
- system 提示在 InvokeModel 里是单独的 `system` 字段，不放进 `messages`；在 Converse 里是顶层的 `system` 数组。

下面是三种接口的最小请求，模型 ID 和 Region 都用环境变量占位。

InvokeModel（boto3）：

```python
import json
import os

import boto3

client = boto3.client("bedrock-runtime", region_name=os.environ["AWS_REGION"])

resp = client.invoke_model(
    modelId=os.environ["BEDROCK_MODEL_ID"],  # 例如推理配置文件 ID
    body=json.dumps({
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 256,
        "messages": [{"role": "user", "content": "只回复 OK"}],
    }),
)
print(json.loads(resp["body"].read())["content"][0]["text"])
```

Converse（boto3）：

```python
resp = client.converse(
    modelId=os.environ["BEDROCK_MODEL_ID"],
    messages=[{"role": "user", "content": [{"text": "只回复 OK"}]}],
    inferenceConfig={"maxTokens": 256},
)
print(resp["output"]["message"]["content"][0]["text"])
```

Bedrock 上的 Anthropic Messages API 有两个端点：`bedrock-runtime` 的 `https://bedrock-runtime.{region}.amazonaws.com/anthropic`（AWS 推荐新应用用这个，Anthropic SDK 指向它时会自动加版本请求头），以及 `bedrock-mantle` 的 `https://bedrock-mantle.{region}.api.aws/anthropic/v1/messages`。直接用 curl 调 Mantle 时要自己带上 `anthropic-version: 2023-06-01`：

```bash
curl -X POST "https://bedrock-mantle.${AWS_REGION}.api.aws/anthropic/v1/messages" \
  -H "x-api-key: ${BEDROCK_API_KEY}" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic.claude-sonnet-5",
    "max_tokens": 256,
    "messages": [{"role": "user", "content": "只回复 OK"}]
  }'
```

### ValidationException 各报错原文的含义

AWS 知识中心列出的 `ValidationException` 报错，在自己写代码时最常见的是这几条：

- `Malformed input request: extraneous key [...] is not permitted`：方括号里的字段该模型不认。常见于把别家模型的参数、Converse 的字段或 Beta 参数塞进了 InvokeModel 请求体。
- `The provided model identifier is invalid`：ID 拼错，或该 Region 没有这个模型。ID 和 Region 都对还报这条，而你的 AWS 账户是通过 Marketplace 合作伙伴或经销商开的，就可能是经销商没有加入 Anthropic 合作计划或 Amazon Bedrock 授权经销商计划。这是账户层面的前提条件，改代码、改 IAM 或申请模型访问都解决不了，只能由经销商完成加入。
- `is not supported on this API. Please use the Messages API instead.`：还在用旧的 `prompt` 文本补全格式，改成 `messages` 数组。
- `Guardrail was enabled but input is in incorrect format`：`guardrailIdentifier` 要填一个有效的护栏 ID，`guardrailVersion` 只填版本号。
- `Input is too long for requested model.`：输入 token 加 `max_tokens` 超过模型上限，缩短输入或调小 `max_tokens`。
- 用延伸思考时，`budget_tokens` 必须小于 `max_tokens`，最小 1,024（带工具的交错思考 Beta 除外）；Fable 和 Mythos 系列只能用 `{"type": "adaptive"}` 或不传 `thinking`。

同样是 HTTP 400，还可能是签名和权限问题，与请求体无关：`IncompleteSignature` 表示签名不符合 AWS 规范，检查 SDK 版本和访问密钥；`RequestExpired` 表示请求时间戳过期，同步系统时钟；`NotAuthorized` 和 `Your AWS account is not authorized to invoke this API operation` 表示 IAM 策略或组织的 SCP 没放行。

其他模型上常见的 400 也可能出现在 Bedrock 上，比如 Opus 4.7 起拒收 `top_p`、assistant 预填充被拒、消息角色不被接受，分别见 [Claude Code 报 top_p deprecated？别先换渠道，先按 Opus 4.7 的新请求规则排](https://blog.laozhang.ai/zh/posts/claude-code-top-p-deprecated)、[Claude 预填充（prefill）400 报错：4.6 起模型全拒收，按用途替换](https://blog.laozhang.ai/zh/posts/claude-opus-prefill-error-fix) 和 [修复 API 400 角色不受支持错误](https://blog.laozhang.ai/zh/posts/api-400-role-system-is-not-supported-on-this-model)。

### 400 能不能重试

大多数 400 原样重发只会得到同样的结果，请求体、模型 ID、账户设置不改，重试多少次都一样。例外是 `ServiceQuotaExceededException`：AWS 把它定为 400，并注明可以稍后重新提交，适合退避后重试；长期超额就去服务配额页面申请提高。限流是 429 的 `ThrottlingException`，`ModelNotReadyException` 由 SDK 自动重试最多 5 次。什么情况该重试、什么情况该换备用模型或直接停下，可以参考 [大模型 API 该重试还是切备用模型？先过这五道门](https://blog.laozhang.ai/zh/posts/llm-api-retry-vs-fallback-model)。

## 账户层面的 400：改代码没用，要找管理员

有几类 400 与客户端、请求体都无关，开发者自己能做的只有确认原因，然后交给 AWS 管理员或合规负责人。

### 数据保留模式不满足模型要求

在 Claude Code 里选了 Fable 5 后每条消息都报：

```text
API Error: 400 data retention mode 'default' is not available for this model
```

这条报错在 GitHub 上有公开报告（模型 `global.anthropic.claude-fable-5`，Claude Code 2.1.170）。按 AWS 的数据保留文档，Claude Fable 5 和 Fable 5.1 要求账户的数据保留模式至少为 `aws_review`；有效模式是 `none` 或 `default` 时，这两个模型在 bedrock-runtime 上返回 `ValidationException`，在 bedrock-mantle 上显示为不可用，原因写作 `This model is not available under data retention mode 'default'.`。Fable 5 之前发布的 Claude 模型不受这项规则影响。

修改前需要知道这几件事：

- 模式从低到高是 `none < default < aws_review < provider_data_share`。`aws_review` 表示 AWS 在自己的边界内保留提示和输出最多 30 天，并可能做人工审查，内容不会共享给模型提供方。`provider_data_share` 是旧模式，目前行为与 `aws_review` 相同，新配置应该用 `aws_review`。
- 在 bedrock-runtime 上，这是按 Region 生效的账户级设置，没有项目级范围。发布时没有控制台界面，要通过控制面 API 修改，对应的 IAM 操作是 `bedrock:PutAccountDataRetention`。
- 组织可能用 SCP 禁止把模式设成 `none` 以外的值。
- 设成 `aws_review` 不会让所有模型都开始保留数据。每个模型自己声明允许的模式，Opus 4.8 这类允许 `none` 的模型仍然不保留数据。

先查当前设置（控制面 API，需要 `bedrock:GetAccountDataRetention` 权限）：

```bash
curl "https://bedrock.${AWS_REGION}.amazonaws.com/data-retention" \
  -H "Authorization: Bearer ${AWS_BEARER_TOKEN_BEDROCK}"
```

改成 `aws_review` 用同一路径的 `PUT`，请求体为 `{"mode": "aws_review"}`。这会影响该 Region 整个账户的调用，是否修改应由管理员和合规负责人决定。如果不能改，就在 Claude Code 里用 `/model` 换一个不要求人工审查的模型。GitHub 评论里有人说设成 `provider_data_share` 后别的模型开始返回 500，这是单个未经证实的报告，与 AWS 当前文档的描述也对不上。

### 地区、经销商与权限

- `Access to Anthropic models is not allowed from unsupported countries, regions, or territories`：AWS 判断时看的不只是调用方所在位置，还包括账户的税务地址和账单地址。换一个 AWS Region 解决不了，要改的是账户信息，或者换一个符合条件的账户。
- 通过经销商开的账户报 `The provided model identifier is invalid`，而 ID 和 Region 都对：见上一节，只能由经销商完成 Anthropic 计划的加入。
- `NotAuthorized` 或 `Your AWS account is not authorized to invoke this API operation`：让管理员检查 IAM 用户或角色的策略、信任关系，以及组织层面的 SCP。

## 用最小请求确认问题出在哪

报错原文看不出头绪，或者改完仍然报错，就把请求缩到最小再逐项加回来。

![用最小请求缩小排查范围：最小请求仍报错时查完整错误、模型与地区、权限和账户；成功后依次加回历史消息、工具和思考参数](https://blog.laozhang.ai/posts/zh/aws-claude-400-error/img/minimal-request-flow.webp)

- 最小请求也失败：问题不在对话内容，重点查完整报错、模型 ID 与 Region、IAM 权限和账户条件。自己写代码的，用上一节的最小请求；用 Claude Code 的，新开一个会话、只发一句短消息。
- 最小请求成功：按历史消息、工具、思考参数的顺序一项一项加回去，每次只加一项，哪一步开始报错，就查新加的那部分。

改完之后这样确认是否真的修好：

- Claude Code：改了环境变量或 `settings.json` 后，退出并重新启动，先用 `/status` 确认提供方、Region 和模型是你预期的值，再重复刚才出错的那个操作。上下文类问题再用 `/context` 看一眼占用。
- 自己写的代码：用同一个模型 ID、同一个 Region 先跑通最小请求，再恢复原来的完整请求。
- 账户设置类（数据保留、经销商、地区）：管理员改完后，用同一个账户和 Region 重新调用；数据保留可以先用上面的 `GET` 确认模式已经变成 `aws_review`。

## 常见问题

### 设置了 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1，还是报 400？

先确认变量在启动前就已生效：Claude Code 要完全退出后重新打开，写在 `settings.json` 的要放进 `env`。生效后仍然 400，说明原因不是 Beta 字段，这个开关只处理请求头和 Beta 字段的兼容问题，管不到模型 ID、权限、配额或数据保留。看新的报错原文，回到开头的对照表。

### bedrock-2023-05-31 应该写在哪里？

只写在 InvokeModel（以及 InvokeModelWithResponseStream）请求体的 `anthropic_version` 字段。Converse 不需要它；Mantle 上的 Messages API 用的是 `anthropic-version: 2023-06-01` 请求头；用 Anthropic SDK 调 bedrock-runtime 的 `/anthropic` 路径时，SDK 会自动加上。

### 模型 ID 要不要加 us. 或 global. 前缀？

看接口和账户。Invoke API 上用推理配置文件 ID，前缀要对应账户里实际开通的配置文件，用 `aws bedrock list-inference-profiles --region <你的 Region>` 查；Mantle 上不加前缀，写成 `anthropic.claude-sonnet-5` 这种形式。照抄别人的前缀是 400 的常见来源。

### 用 Claude Code 连 Bedrock，要不要按 Converse 的格式改请求？

不用。Claude Code 在 Bedrock 上只走 Invoke API，不支持 Converse，请求体也由 Claude Code 自己组装。你能改的是版本、环境变量、模型 ID 和会话本身，对应的做法都在上面 Claude Code 那一节。

## 参考来源

本文引用的外部页面，按正文出现顺序排列。最后更新于 2026-09-25。

- [Claude Code 错误参考](https://code.claude.com/docs/en/errors) (code.claude.com)
