大家好,我最近在使用 Claude Code(claude -p)通过**转发站(LiteLLM 等代理)**调用 AWS Bedrock 上的 Anthropic 模型时,频繁遇到以下错误:
bash
⎿ API Error: 400 {"error":{"type":"<nil>","message":"InvokeModelWithResponseStream: operation error Bedrock Runtime: InvokeModelWithResponseStream, https response error StatusCode: 400, RequestID: 8752a71a-e464-4591-8eeb-bf3aa405e8c5, ValidationException: ***.***.custom.defer_loading: Extra inputs are not permitted (request id: ...)"}
这个错误在 2025 年底到 2026 年初非常常见,尤其在使用 Claude Code 较新版本(2.1.x 系列)结合 Bedrock 时。
错误根本原因
defer_loading 是 Anthropic 推出的实验性(beta)功能,主要用于 Tool Search / 动态工具加载 。它的作用是允许把工具标记为 defer_loading: true,让 Claude 模型按需加载工具,而不是一次性把所有工具定义塞进请求中,从而节省 token 和提升效率。
然而,AWS Bedrock 当前对这个字段的支持并不完善。当请求体(尤其是 tools 定义)中包含 tools.*.custom.defer_loading 或类似自定义字段时,Bedrock 会直接抛出 ValidationException,认为这是"不允许的额外输入"(Extra inputs are not permitted)。
这个不兼容问题主要出现在:
- 通过 LiteLLM、其他代理或自定义转发站调用 Bedrock 时
- Claude Code 自动开启了实验性功能(如 Tool Search、Agent Teams、大量 MCP tools)
- Claude Code 版本较新(2.1.22 及以上),默认或自动添加了 beta 字段
常见触发场景
- 使用
claude -p或 Claude Code 的 headless 模式 - 启用了大量工具(tools)或 Tool Search 功能
- 环境变量中开启了
ENABLE_TOOL_SEARCH或类似实验特性 - 通过 LiteLLM proxy 转发到
bedrock/us.anthropic.claude-xxx模型
推荐修复方案(按优先级排序)
1. 最简单有效的方法:关闭实验性 Beta 功能(强烈推荐)
在运行 Claude Code 时设置环境变量:
bash
export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1
或者在 Claude Code 的配置文件(通常是 settings.json)中添加:
json
{
"env": {
"CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS": "1"
}
}
这个变量会自动剥离 Anthropic 特定的 beta 请求头和工具 schema 中的实验字段(如 defer_loading),同时保留标准字段(name、description、input_schema 等)。设置后大多数情况下错误立即消失。
2. 如果使用 LiteLLM 作为转发站
在 LiteLLM 的模型配置中为 Bedrock 模型添加以下参数:
yaml
litellm_params:
model: bedrock/us.anthropic.claude-sonnet-xxx
drop_params: true
# 或者更精确地指定要丢弃的字段
additional_drop_params: ["defer_loading", "context_management"]
drop_params: true 会让 LiteLLM 自动过滤不支持的额外参数,是通过代理时最方便的解决方案。
3. 其他实用调整
- 临时关闭 Tool Search:设置
ENABLE_TOOL_SEARCH=false或ENABLE_TOOL_SEARCH=auto:30(提高阈值,减少 defer_loading 触发) - 降低工具数量:如果工具列表过大,先精简工具定义
- 更新相关工具到最新稳定版本,但注意 Claude Code 的新版本有时会默认开启更多实验特性
4. 长期建议
- 如果对实验功能(如动态工具加载)有强需求,优先考虑直接使用 Anthropic 原生 API(非 Bedrock),兼容性更好。
- 关注 Anthropic 和 AWS Bedrock 的更新,未来这个字段应该会得到更好的支持。
- 在生产环境中,建议在代理层统一做好参数清洗(drop extra params),避免类似兼容性问题反复出现。
总结
这个错误本质上是 Anthropic 的实验特性 与 AWS Bedrock 当前 API 限制 之间的兼容性问题,并非你的代码或配置有根本性错误。通过设置 CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 或在 LiteLLM 中启用 drop_params,大多数用户都能快速解决。
如果你也遇到了类似问题,欢迎在评论区分享你的具体环境(Claude Code 版本、是否用 LiteLLM、用了多少 tools 等),我可以帮你进一步细化解决方案。
希望这篇文章能帮到正在被这个 400 错误困扰的同学!如果觉得有用,欢迎转发给同样在使用 Claude + Bedrock 的朋友。
发布日期 :2026 年 3 月
作者:Hong(基于实际踩坑经验整理)
有任何疑问或更新,欢迎留言讨论~