TL;DR
OpenAI 返回 401 且提示密钥不正确时,先检查凭证、运行时变量和组织或项目配置。429 要根据错误码检查速率、余额或使用上限;403 也需要阅读具体原因。
运行 Python 示例前,在同一个 Python 环境执行 python -m pip install requests。
先分清错误类型
| 响应 | 检查方向 |
|---|---|
| 401,提示 Incorrect API key | 完整密钥、拼写、撤销状态及归属 |
| 401,其他鉴权提示 | 组织成员关系、权限或 IP 限制等具体原因 |
| 403 | 阅读响应原因,包括地区或其他访问限制 |
| 429 | 区分限流、余额和组织或项目使用上限 |
不要仅凭 sk- 前缀判断密钥有效。完整凭证、目标域名及账号配置都需要匹配。
五步检查运行环境
- 确认调用的是 OpenAI 还是兼容平台;每个平台使用自己的密钥。
- 检查实际进程的
OPENAI_API_KEY,排除空值、占位符和误复制。 - 检查环境变量加载优先级;部署平台的值可能覆盖本地
.env。 - 核对密钥是否已撤销,以及它所属的组织和项目。若主动设置了组织或项目请求头,确认这些值一致;不要盲目添加请求头。
- 重新加载运行环境后发起只读检查。持续报错时记录响应的请求 ID,并联系账号负责人。
本地检查不输出凭证
import os
name = "OPENAI_API_KEY"
key = os.environ.get(name, "")
print({
"variable": name,
"present": bool(key),
"length": len(key),
"has_whitespace": any(c.isspace() for c in key),
"wrapped_in_quotes": len(key) >= 2 and key[0] == key[-1] and key[0] in (chr(34), chr(39)),
})
不要使用会打印完整请求头的调试日志,也不要把密钥转成十六进制后贴进工单;那仍然是完整凭证。
只读验证请求
在服务器环境运行以下代码。它读取模型列表,不提交内容生成。受限密钥仍可能因读取权限不足被拒;不能把任何非 200 响应都判为密钥损坏。
import os
import re
import requests
key = os.environ.get("OPENAI_API_KEY", "")
if not key or any(ord(c) < 33 or ord(c) > 126 for c in key) or any(c in key for c in (chr(34), chr(39))):
raise SystemExit("Check the key environment variable: empty, whitespace, control characters, or quotes")
try:
response = requests.get(
"https://api.openai.com/v1/models",
headers={"Authorization": f"Bearer {key}"},
timeout=30,
)
except requests.RequestException as exc:
raise SystemExit("Request failed: " + type(exc).__name__) from None
print("HTTP", response.status_code)
if response.ok:
print("Model list received")
else:
try:
body = response.json()
error = body.get("error", {})
message = str(error.get("message") or body.get("message") or "")
message = message.replace(key, "[REDACTED]")
message = re.sub(r"sk-[A-Za-z0-9_*.-]+", "[REDACTED]", message)
print("code:", error.get("code") or body.get("error_code"))
print("type:", error.get("type"))
print("message:", message)
print("request_id:", error.get("request_id") or response.headers.get("x-request-id"))
except ValueError:
print("Non-JSON response; check the base URL and network path")
切换到 HiAPI 时检查什么
使用 HiAPI 时,密钥换成 HIAPI_API_KEY,Base URL 使用 HiAPI 的地址,再按模型页选择请求入口。先阅读 HiAPI 认证说明 和 接口选择指南。
两次请求必须独立使用各自平台的凭证,不能把 OpenAI 密钥发给 HiAPI 进行所谓的“隔离验证”。
常见问题
密钥前缀正确,就一定可用吗?
不能仅靠前缀判断。还要检查完整值、撤销状态和账号配置。
遇到 401 应该立即充值吗?
先处理响应指出的鉴权原因;余额或使用上限错误需要根据相应错误码单独处理。
所有请求都必须加组织和项目请求头吗?
不要盲目添加。多组织或旧式用户密钥等情况需要正确选择上下文;已经设置的请求头必须与使用的凭证匹配。
HiAPI 密钥能直接请求 OpenAI 吗?
不能互换。HiAPI 和 OpenAI 各自管理凭证,域名和密钥需要对应。





