接入 one-api 中转站后,AMD 显卡推理服务如果返回 401/403,或者日志里出现两个 Authorization 头,通常不是硬件或驱动问题,而是中转站和推理服务两边各自维护 token,转发时叠加成两个鉴权头。修复的要点是让 one-api 在向上游转发时只携带一种凭据,而不是在推理代码里硬删请求头。
请求头重复多半是 one-api 与推理服务各自配置了 API Key,转发时叠加了两个 Authorization。修复方向:在 one-api 的渠道密钥中填入推理服务认可的 token,关闭推理服务的自鉴权或统一请求头。改动前先直接请求推理服务确认它要什么凭据,改动后捕获实际请求头验证只剩一个。关闭自鉴权只适用于受控内网。
先确认两套鉴权分别落在哪里
先做两个检查:直接请求推理服务,确认它自己是否要求 API Key;再从 one-api 中转一条请求,观察出口请求头。
# 直接请求推理服务,确认服务启用鉴权后需要的令牌
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <推理服务令牌>" \
-d '{"model":"你的模型","messages":[]}'上面命令如果服务返回正常响应,说明所用的令牌就是服务端认可的。接下来从 one-api 入口发一条请求,并开启详细输出:
curl -v http://one-api.example.com/v1/chat/completions \
-H "Authorization: Bearer <one-api令牌>" \
-H "Content-Type: application/json" \
-d '{"model":"one-api配置的模型名","messages":[]}'重点看 -v 输出里 > Authorization: ... 的内容,以及最终报错中是否有多个 Authorization。也可以用 tcpdump 抓 8000 端口的数据包,看实际到达推理服务的 header。这一步能明确哪个 token 是 one-api 代你生成的,哪个是原样保留下来的。
让 one-api 只携带一种鉴权凭据
第一选择:让渠道密钥与推理服务的 token 对齐
在 one-api 后台找到该 AMD 推理服务对应的渠道,把“密钥”字段填成直接请求时验证成功的 token,渠道类型选择 OpenAI 兼容的对应类型。多数 one-api 版本会用渠道密钥重新构造上游请求,所以不用再额外写 Authorization 到请求头。如果改动后还重复,检查该渠道的“自定义请求头/headers”配置里是否残留了之前手填的认证信息,先删掉。
第二选择:在隔离网络中关闭推理服务的自鉴权
如果推理服务只监听 127.0.0.1 或内网专网,外部无法直接访问,可以关闭推理服务自身的 API Key 校验。这样 one-api 转发时携带的任何 Authorization 头都是唯一的。关闭鉴权前务必确认监听地址和防火墙规则,不要在 0.0.0.0 上关闭鉴权,否则模型会被任意调用。
第三选择:在 one-api 中用自定义请求头覆盖
如果渠道类型或 one-api 版本导致它不以渠道密钥替换 Authorization,可以在该渠道的“请求头/headers”配置里写入下面这段,指定唯一的上游令牌:
{
"Authorization": "Bearer <推理服务令牌>"
}这是最后手段,因为“覆盖”不等于“去重”,某些版本仍可能附加默认 Authorization。具体字段入口以 one-api 当前版本的界面为准,改完需要按下面方法验证。
验证方式与风险边界
改动后按这些步骤收尾:
- 再走一次 one-api 的中转请求,用 curl -v 或 one-api 日志确认上游请求里只有一条 Authorization 头。
- 如果 one-api 与推理服务不在同一台机器,可在推理服务侧抓包或查看服务日志,确认到达的请求头。
- 连续请求 2 到 3 个不同模型,排除单个模型命中了旧的自定义头。
- one-api 若有配置缓存或连接复用,有时需要重启 one-api 进程或重新保存渠道才能生效。
风险边界:关闭推理服务自鉴权后,端口一旦暴露到公网,模型接口就可被任意访问;自定义 Authorization 头如果填错值,可能让 one-api 向推理服务发送非法认证,反而更难排查。如果以上改动后仍报 401/403,回到直接请求推理服务的那个步骤,先确认服务本身能独立跑通,再检查网关配置。
AMD 显卡与这个问题的关联只在推理服务的启动与性能层,不影响 HTTP 鉴权头的拼装。