Skip to content

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} 占位符。

测试覆盖是否生效

  1. 保存 channel 配置
  2. 用真实 claude CLI 发请求(不要用 new-api 测试按钮,测试按钮发的是 new-api 自己的请求,UA 还是 Go HTTP client)
  3. 看上游日志的 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 字符串可能因此变化。长期方案

  1. 用方案 C(占位符透传),自动适配新版本
  2. 定期跑一次 UA 抓取脚本(用 mock 服务器拦截 claude 的真实请求)

或者监听 Claude Code 版本更新,每次升级后跑一遍测试,及时改 UA。

new-api 测试按钮永远 400 是正常的吗

是的。测试按钮发的是 new-api 自己合成的请求,UA 是 Go HTTP client,不经过「请求头覆盖」的客户端透传逻辑

测试 400 + 实际用户请求能通 = 正常工作。用真实 claude CLI 验证才有意义。

还不行?

内容采用 CC BY-NC-ND 4.0 协议 · 禁止商业使用 / 禁止改编 / 禁止训练 AI 模型