调用 OpenAI 兼容 API 时报 401 Unauthorized 怎么办
先用一条命令定位
执行以下命令测试:
bash
curl -sS -i https://api.treenew.online/v1/chat/completions \
-H "Authorization: Bearer 你的令牌" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-5.6-luna","messages":[{"role":"user","content":"hi"}],"max_tokens":1}'max_tokens: 1 是刻意的:这条命令只为验证鉴权,不需要模型真的生成内容,消耗可以忽略。
怎么看结果:
- 返回 HTTP 401 —— 问题在 Key 或
Authorization请求头本身,与你的客户端无关,往下看「逐项排查」。 - 返回 HTTP 200 —— Key 是好的,问题出在客户端配置(地址填错、Key 没保存上、被别处的环境变量覆盖等)。
- 返回 404 且提示模型不存在 —— 鉴权其实已经通过了,那是另一个问题,见模型不存在。
先跑这一条,能省掉大半排查时间。
逐项排查
- Bearer 前缀缺失或错误:检查请求头是否严格为
Authorization: Bearer sk-xxx,排除漏前缀、写成 bearer 或 Basic。 - Key 首尾混入空格或换行:从控制台复制 Key 后执行 trim 操作,去除首尾空白字符。
- 使用登录密码而非令牌:确认 Key 来自 https://api.treenew.online 「令牌」页创建,而非账号登录密码。
- 令牌被删/过期/禁用:登录控制台检查令牌状态,额度耗尽可能导致令牌被禁用。
- 令牌 IP 或模型白名单不匹配:检查令牌绑定设置,确保当前 IP 和请求模型符合白名单。
- Key 填入 Base URL 等错位置:Base URL 必须固定为 https://api.treenew.online/v1,Key 仅填 Authorization 头。
- 客户端 Key 存储位置导致修改未生效:修改 Key 后重启客户端,检查环境变量或缓存是否覆盖新值。
401 与 403 的区别
401 表示认证信息无效或缺失;403 表示认证已通过但无访问权限。两者排查方向不同。
还是不行
收集脱敏后的请求头(隐藏 Key 值)、请求时间点、令牌名称进行反馈。