主题
400 User Agent Not Allowed
错误样例
API Error: 400 user agent not allowed
(cch_session_id: ...) (request id: ...)含义
本页主要面向在 Shuro 前面自建 new-api 网关做二次转发的用户(你的 new-api → Shuro)。
请求链路中的上游网关启用了 Claude Code 客户端白名单,只接受特定 User-Agent。你发的请求 UA 不在白名单。
常见触发场景:
- 自建 new-api 网关转发到 Shuro,中间环节没透传客户端 UA(new-api 自己合成请求的 UA 是 Go HTTP client)
- 用了 非官方 Claude CLI(魔改版 / 老版本 v1.x)
- 用了 第三方 SDK 直接调 API(其 UA 不是 Claude CLI 格式)
Claude Code 真实 UA
claude-code/2.1.137来自 Claude CLI 二进制内部的 I3() 函数:
js
function I3() {
return `claude-code/${VERSION}` // VERSION = "2.1.137"
}别用老格式
v1.x 时代叫 claude-cli,UA 是 claude-cli/1.x.x (external, cli)。v2.0 起改名 claude-code,老格式上游会拒。
修复(在你 new-api 网关的 channel 编辑页)
找到「请求头覆盖」字段,填:
方案 A:写死 UA(最稳)
json
{
"User-Agent": "claude-code/2.1.137"
}方案 B:透传客户端 UA
如果你 new-api 版本支持通配透传:
json
{
"*": true
}透传可能把 auth 也传过去
{"*": true} 通配可能把客户端的 x-api-key 一起转给上游,导致 401。如果 A 能用就用 A。
方案 C:占位符(部分版本支持)
json
{
"User-Agent": "{client_user_agent}"
}只透传 UA,auth 用 channel 自己存的。是最优解,但需要你 new-api 版本支持 {client_xxx} 占位符。
测试覆盖是否生效
- 保存 channel 配置
- 用真实 claude CLI 发请求(不要用 new-api 测试按钮,测试按钮发的是 new-api 自己的请求,UA 还是 Go HTTP client)
- 看上游日志的 UA 字段是不是变成了
claude-code/2.1.x
备选 UA 字符串(按概率从高到低)
如果 claude-code/2.1.137 还是不通,按这个顺序试:
claude-code/2.1.137
claude-code/2.1.137 Anthropic/JS 0.81.0
@anthropic-ai/claude-code/2.1.137
claude-code/2.1.137 (Linux; arm64; node-v20.18.0)
Anthropic/JS 0.81.0不同上游网关的白名单策略不同,多试几个直到通。
上游 UA 白名单变化时
Anthropic SDK 版本会变,UA 字符串可能因此变化。长期方案:
- 用方案 C(占位符透传),自动适配新版本
- 定期跑一次 UA 抓取脚本(用 mock 服务器拦截 claude 的真实请求)
或者监听 Claude Code 版本更新,每次升级后跑一遍测试,及时改 UA。
new-api 测试按钮永远 400 是正常的吗
是的。测试按钮发的是 new-api 自己合成的请求,UA 是 Go HTTP client,不经过「请求头覆盖」的客户端透传逻辑。
测试 400 + 实际用户请求能通 = 正常工作。用真实 claude CLI 验证才有意义。
还不行?
- 新api 渠道配置详细字段说明
- 向平台确认上游 UA 白名单具体策略(TODO/VERIFY:Shuro 反馈渠道待确认)
- FAQ
