前言

最近在将 Codex 从第三方 API 中转站迁移到官方 ChatGPT 账号时,遇到了一个配置问题。明明已经用官方 Plus 账号完成登录,每次发送请求却依然返回 401 Unauthorized

unexpected status 401 Unauthorized: 
{
"code":"INVALID_API_KEY","message":"Invalid API key"
}, 
url: https://...中转站.com/v1/responses, 
cf-ray: a1adf952aef7cf12-SJC, 
request id: c64faec8-54bc-4723-8862-1761785f3cc76

而日志中的请求地址暴露了真正的问题:

url: https://中转站.com/v1/responses

登录的是官方账号,请求却依然发往旧的中转站地址。

这篇文章完整记录了整个排查过程与底层原理,帮同样在迁移的朋友少走弯路。


问题现象

先交代一下背景:已完成官方 ChatGPT 账号登录,Plus 订阅状态正常,登录态也没有问题。但执行任何 Codex 命令都会报 INVALID_API_KEY 错误。

关键线索在日志里的请求 URL:

https://中转站.com/v1/responses

OpenAI 官方接口的域名应该是 api.openai.com,而不是第三方中转站域名。这说明 Codex 根本没有使用官方 Provider


第一反应:是不是登录没生效?

大多数人遇到这个问题的第一反应都是——是不是登出不干净?于是反复执行:

codex logout
codex login

重新登录后问题依旧。这就排除了登录状态的问题,说明根因在别处。


真正原因:config.toml 中残留的 Custom Provider 配置

打开 Codex 配置文件:

# macOS / Linux
vim ~/.codex/config.toml
Windows
通常位于 C:\Users...用户名>.codex\config.toml

会发现类似这样一段配置:

model = "gpt-5.6-sol"
model_provider = "custom"
[model_providers.custom]
name = "custom"
wire_api = "responses"
requires_openai_auth = true
base_url = "https://中转站.com/v1"

问题就出在这里。

容易误解的参数:requires_openai_auth = true

很多人看到这个参数会以为"开启了官方认证 = 使用官方接口",其实完全不是。

它的真实含义是:

使用 OpenAI 登录获取的身份凭证(Token),但请求仍然发送到 custom provider 指定的地址。

用流程图表示更直观:

OpenAI 登录
    │
    ▼
获取 Access Token
    │
    ▼
请求发往 max.jojocode.com  ← 仍然是中转站

而不是大家直觉中的:

OpenAI 登录
    │
    ▼
请求发往 api.openai.com

登录身份和请求目的地是两个完全独立的配置项。

Codex 的请求路由逻辑

Codex 发请求时的判断流程大致如下:

发起请求
   │
   ▼
读取 model_provider 配置
   │
   ├── model_provider = "openai"  →  走官方 api.openai.com
   │
   └── model_provider = "custom"  →  走 [model_providers.custom]
                                       中的 base_url 地址

由于配置里写死了 model_provider = "custom"base_url = "https://max.jojocode.com/v1"无论你登录哪个账号,请求最终都会被发往中转站。官方登录只是提供了一个 Token,这个 Token 在中转站那边验证不通过,自然就报了 INVALID_API_KEY


解决方案

第一步:清理 Custom Provider 配置

删除 config.toml 中以下整段内容:

model = "gpt-5.6-sol"
model_provider = "custom"
[model_providers.custom]
name = "custom"
wire_api = "responses"
requires_openai_auth = true
base_url = "https://max.jojocode.com/v1"

其余配置(pluginsmcp_serversplaywrightdesktopprojects 等)全部保留即可。

删除后,Codex 会回退到默认的 openai provider,请求自然就走官方 api.openai.com 了。

第二步:重新登录

codex logout
codex login

第三步:完全重启 Codex

注意:不是简单关闭窗口。

需要确保所有相关进程都退出:

  • 退出 Codex 主程序(托盘图标也要退出)
  • 关闭 VS Code / 编辑器中的 Codex 插件
  • 关闭所有正在运行的终端

重新打开后再验证。

第四步:CC-Switch修改

使用官方的账号后,要选择OpenAI Official供应商,防止之后启动再次转接到其他的中转供应商。

最后重启Codex即可解决问题


快速自检:怎么判断是不是还在走中转?

看日志里的请求 URL 是最直接的方法:

请求地址包含 说明
api.openai.com 官方接口,正常
jojocode.com 等第三方域名 仍然在走中转站

只要日志里出现非官方域名,就说明 Provider 或 Base URL 配置还没改干净。


总结与思考

这次踩坑的核心可以用一句话概括:

登录的是官方账号 ≠ 请求走官方接口。

打个比方:登录身份就像身份证,请求地址就像快递收件地址。身份证是真的,但快递仍然寄到了旧地址,对方当然收不到。

INVALID_API_KEY 这个错误信息也很有迷惑性——它会引导你去排查 API Key、账号权限,而真正的问题藏在 Provider 配置里。

排查同类问题的经验法则: 遇到 API 鉴权报错,先看请求 URL 对不对。地址都错了,再怎么折腾 Key 和登录都是徒劳。

希望这篇记录能帮到同样从中转站迁移到官方 Codex 的朋友。如果你也遇到了类似的问题,欢迎在评论区交流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐