title: " AI排查API 401/403 | Key权限和环境变量" category: 人工智能 tags:


这一篇开始写模型 API 接入层的报错。

第一个必须写:

401 Unauthorized
403 Forbidden

这两个错误很常见。

尤其是把 Claude、GPT、Gemini、DeepSeek、Fable 5 等模型统一接入 4SAPI 或企业 API 网关时,新手最容易卡在:

Key 填了。
Base URL 也填了。
为什么还是 401/403?

先说结论:

401 多半是身份认证失败。
403 多半是身份通过了,但没有权限。

但真实排查时,不能只看状态码。

要同时看:

Key 是否读取到。
Header 是否正确。
Base URL 是否正确。
模型名是否在权限内。
项目 Key 是否有余额。
环境变量是否在当前进程生效。
代理或网关是否改写 Header。

1. 401 和 403 的区别

粗略表:

状态码 常见含义
401 没带 Key、Key 格式错、Key 无效、环境变量没读到
403 Key 有效,但模型无权限、项目被禁、IP/来源限制、策略拒绝

在 4SAPI 这类大模型 API 中转站里,还要多看:

这个 Key 是否允许调用目标模型。
这个 Key 是否属于正确项目。
是否开了模型白名单。
是否超过预算或被管理员禁用。

企业级大模型接入里,403 很多时候不是坏事。

它说明权限边界在工作。

2. 不要把真实 Key 发给 AI

排查 401/403,最容易犯的错误是:

把完整 API Key 贴给模型。

不要这样。

给 AI 的方式应该是:

Key 来源:环境变量 SAPI_API_KEY
Key 是否为空:否
Key 前缀:sk-****
Key 后四位:abcd
是否刚轮换:是/否

或者更安全:

Key 已配置,不展示值。

AI 不需要知道完整 Key。

它只需要判断:

有没有读到。
是不是读错变量。
是不是请求头没带。
是不是模型权限不匹配。

3. 给 AI 的 401/403 排错包

【现象】
- 状态码:401 / 403
- 错误原文:
- 是本地失败还是线上失败:
- 哪个工具失败:curl / Python / Node / Dify / n8n / Codex / Claude Code

【请求】
- Base URL:例如 https://4sapi.com/v1
- Endpoint:/chat/completions
- Model:目标模型名
- Header:只列字段名,不给 Key 值
- Body 脱敏后:

【Key】
- Key 来源:环境变量 / 配置文件 / 控制台
- 环境变量名:
- 当前进程是否读到:是/否
- Key 所属项目:
- 是否允许目标模型:

【4SAPI后台】
- Key 是否启用:
- 余额/预算是否充足:
- 模型白名单:
- 最近调用日志错误:

【边界】
- 不输出真实 Key
- 不建议把 Key 放前端
- 先给只读验证步骤

这份包能让 Fable 5 准确判断。

4. 最小 curl 验证

可以先用 curl 排除 SDK 问题。

示例:

curl https://4sapi.com/v1/chat/completions \
  -H "Authorization: Bearer $SAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "你的模型名",
    "messages": [{"role": "user", "content": "ping"}],
    "max_tokens": 20
  }'

注意:

不要把命令里真实 Key 贴给 AI。

如果 curl 成功,SDK 失败,问题在代码或环境变量读取。

如果 curl 也失败,问题可能在 Key、Base URL、模型权限或网关侧配置。

5. 常见根因一:环境变量没进进程

你在终端里设置了:

export SAPI_API_KEY=...

但服务是 systemd、Docker、PM2、GitHub Actions 启动的。

它们不一定读到你当前 shell 的变量。

AI 要看:

服务怎么启动。
环境变量在哪里配置。
进程内是否真的读取到。

只读验证:

printenv | grep SAPI_API_KEY | sed 's/=.*/=[set]/'

Docker:

docker compose exec app printenv | grep SAPI_API_KEY | sed 's/=.*/=[set]/'

只显示是否存在,不显示值。

6. 常见根因二:Header 写错

OpenAI 兼容接口通常是:

Authorization: Bearer <key>

常见错误:

少写 Bearer。
写成 X-API-Key。
Header 大小写或字段名被代理改了。
前端 fetch 没带 Authorization。
Nginx 没转发 Authorization。

如果你的请求经过 Nginx,要确认:

proxy_set_header Authorization $http_authorization;

并不是所有反代默认都会按你想的方式保留 Header。

7. 常见根因三:模型名不在 Key 权限内

4SAPI 里企业常会设置:

普通 Key 只能调用低成本模型。
高级 Key 才能调用 Fable 5。
生产 Key 不允许试验模型。

如果你拿普通 Key 调 Fable 5,就可能 403。

AI 排查时要看:

Key 分组。
允许模型列表。
请求 model 字段。
4SAPI 调用日志里的拒绝原因。

不要简单说:

模型不可用。

更准确是:

当前 Key 对该模型无权限。

8. 常见根因四:前端直连 API

如果你在浏览器前端直接写:

fetch("https://4sapi.com/v1/chat/completions", {
  headers: { Authorization: `Bearer ${key}` }
})

这是两个问题:

Key 泄露。
CORS 风险。

正确架构:

前端 -> 你的后端 -> 4SAPI -> 模型

后端负责:

保管 Key。
检查用户权限。
控制预算。
记录日志。
做模型路由。

AI 排查时,如果发现 Key 在前端,应标记为架构风险,而不是只修 401。

9. AI Prompt

你是大模型 API 401/403 排查助手。

请根据请求信息、Base URL、Header 字段名、模型名、环境变量状态和 4SAPI Key 权限,判断错误原因。

重点检查:
1. Key 是否为空或未读取
2. Authorization Header 是否正确
3. Base URL 是否正确
4. model 名是否正确
5. 当前 Key 是否允许调用目标模型
6. 是否余额、预算、项目权限或白名单限制
7. 是否错误地在前端直连 API

要求:
- 不要求我提供真实 Key。
- 不输出敏感信息。
- 先给只读验证步骤。
- 不建议把 API Key 放到浏览器前端。

10. 4SAPI 日志字段

建议记录:

request_id
project
key_group
model
status_code
error_code
route_reason
user_agent
environment

有了这些,401/403 很快能判断:

是应用没带 Key。
还是 Key 过期。
还是权限拒绝。
还是模型白名单。
还是预算策略。

11. 总结

401/403 不要先怀疑模型。

先查:

Key。
Header。
Base URL。
模型名。
环境变量。
项目权限。
4SAPI 日志。

AI 的价值是帮你把认证链路拆开。

不是让你把真实 Key 贴出去。

一句话:

401 看身份,403 看权限。

下一篇写 429。

因为 Key 通过以后,最常见的问题就是限流和预算。