写在前面
如果你在用 ChatGPT 订阅账号登录的 Codex 桌面版(v26 / gpt-5.5 这一代),可能遇到过两个恼人的问题:
- 每次发出消息后,都要卡在
connecting... (5/5)/reconnecting 5/5几秒,连上后才正常回复; - 为了消除重连,改了配置强制走 HTTP 后,反而冒出
403 Forbidden: Country, region, or territory not supported。
这篇文章记录了完整的排查过程,以及最后真正有效的配置方案。结论先说:这两个问题其实是同一个误区的两面——把「ChatGPT 订阅通道」和「OpenAI API 付费通道」搞混了。 适合同样在折腾 Codex、且用订阅账号登录的用户。
环境:Windows 11,Codex 桌面版 v26.616,模型 gpt-5.5,ChatGPT 订阅账号(OAuth)登录。
一、两个问题的真正根因
排查初期走了不少弯路:以为 403 是代理节点 IP 被封,于是查系统代理、换机场节点、设置 HTTPS_PROXY……全都没用。直到查了 Codex 的 auth.json,才发现问题根本不在网络。
关键事实是:Codex 有两条完全独立的接入通道。
| 订阅通道(默认) | API 直连通道 | |
|---|---|---|
| 认证方式 | ChatGPT 账号 OAuth(access_token) |
api.openai.com 的 API Key |
| 实际连接的服务器 | chatgpt.com/backend-api/codex |
api.openai.com/v1/responses |
| 传输方式 | WebSocket(实时) | HTTP |
| 地区封锁 | 不经过,正常可用 | Cloudflare 按 IP 封锁,受限地区 403 |
把这张表看明白,两个问题就都解释清楚了:
- 「5/5 重连」:订阅通道默认用 WebSocket 实时连接,每轮对话都要重新握手,于是每次发消息都先卡一下重连。
- 403:为了关掉 WebSocket,我把
model_provider改成了一个指向api.openai.com的自定义 provider——这等于强行切到了「API 直连通道」。它既撞上地区封锁(所以报unsupported_country_region_territory),又和订阅账号的认证方式不符。
换句话说,403 是「为了治重连而切错通道」引入的,跟代理、节点一点关系都没有。
二、确认登录方式
先看一眼 Codex 的认证文件,确认自己是哪种登录方式。配置目录在 ~/.codex/(Windows 上是 C:\Users\你的用户名\.codex\)。
用 PowerShell 看 auth.json 的结构(只看字段,不打印密钥):
$auth = Get-Content "$env:USERPROFILE\.codex\auth.json" -Raw | ConvertFrom-Json
"顶层字段: " + ($auth.PSObject.Properties.Name -join ', ')
"有 API Key: " + [bool]$auth.OPENAI_API_KEY
"有 OAuth tokens: " + [bool]$auth.tokens
如果输出里 有 OAuth tokens: True、有 API Key: False,说明你是 ChatGPT 订阅账号登录,那就应该走订阅通道,绝不能把请求指向 api.openai.com。
三、错误示范:不要这样配
很多人(包括我)为了关 WebSocket,会写出这样的配置——这正是 403 的来源:
model_provider = "openai_http"
[model_providers.openai_http]
base_url = "https://api.openai.com/v1" # 错误:切到了 API 直连通道
env_key = "CODEX_API_KEY" # 错误:订阅账号没有这个 Key
wire_api = "responses"
supports_websockets = false
supports_websockets = false 这个开关本身是对的,错在把它挂到了一个指向 api.openai.com 的 provider 上。
还有一个坑:不要直接覆盖内置的 [model_providers.openai]。它和 Codex 内置的同名 provider 撞 id,而 Codex 运行时会自动重写 config.toml,合并时极易把文件搞乱,导致 Codex 直接起不来。
四、正确方案:自定义订阅 provider + 关闭 WebSocket
思路是:用一个独立 id 的 provider,走订阅通道的 OAuth 认证,同时关掉 WebSocket。 关键有三点:
- 用独立 id(如
openai-sub-http),避免和内置openai撞名; - 加
requires_openai_auth = true,让它用 ChatGPT 订阅的 OAuth 认证,并自动走chatgpt_base_url(默认https://chatgpt.com/backend-api/); - 不要写
base_url——一旦写成api.openai.com就又回到 403 的老路;不写则自动落到订阅后端。
1. 完全退出 Codex
这一步非常重要。Codex 运行时会重写 config.toml,必须先彻底退出(含托盘 / 后台进程)再改,否则改动会被它覆盖甚至弄坏。
# 确认没有残留进程
Get-Process -Name "Codex","codex" -ErrorAction SilentlyContinue
2. 备份现有配置
Copy-Item "$env:USERPROFILE\.codex\config.toml" "$env:USERPROFILE\.codex\config.toml.bak" -Force
3. 修改 config.toml
把 model_provider 指向新 provider,并加上 provider 定义:
model_provider = "openai-sub-http"
# 订阅通道(ChatGPT OAuth)+ 关闭 websocket,改 HTTP 流式,消除每轮 5/5 重连。
# 独立 id 避免与内置 openai 撞名;不设 base_url,自动走订阅后端,不碰 api.openai.com。
[model_providers.openai-sub-http]
name = "ChatGPT subscription (HTTP, websocket off)"
requires_openai_auth = true
wire_api = "responses"
supports_websockets = false
4. 重启 Codex 验证
重新打开 Codex,发一条消息,重点看两点:能否正常回复(无 401/403),以及发消息时是否还卡 connecting (5/5)。
五、实测验证(2026-06-25)
- 删掉指向
api.openai.com的强制 HTTP 配置、回到订阅通道后,403 地区限制报错消失,Codex 恢复正常收发。 - 在订阅 provider 上加
supports_websockets = false后,传输从 WebSocket 切换为 HTTP 流式,针对的正是每轮重连的根源。
提醒:这一代桌面版的部分 provider 字段官方文档尚未完整公开(
requires_openai_auth、supports_websockets、chatgpt_base_url等均可在程序内验证存在)。不同版本行为可能略有差异,建议改完后在自己的环境里实测一遍。
六、常见问题与排错(FAQ)
改完后 Codex 起不来 / 报 TOML 错误
多半是在 Codex 还运行时改了配置,被它重写污染了。先彻底退出 Codex,再用备份覆盖回去,然后重新按步骤修改:
Copy-Item "$env:USERPROFILE\.codex\config.toml.bak" "$env:USERPROFILE\.codex\config.toml" -Force
还是报 403 unsupported_country
检查 config.toml 里有没有任何 base_url = "https://api.openai.com/..."。订阅通道下不应该出现这个地址。确认 model_provider 指向的是带 requires_openai_auth = true 的那个 provider。
报 401 / 认证失败
说明走的还是 API Key 路径。确认 provider 里没有 env_key,且 requires_openai_auth = true 已生效;必要时在 Codex 里重新登录一次 ChatGPT 账号。
重连依旧存在
说明当前版本对自定义 provider 未必读取 supports_websockets。可先回退到纯订阅通道(删掉自定义 provider、model_provider 留空或设为 openai)保证可用,再关注后续版本更新。
七、总结
这次排查最大的教训,是先分清自己走的是哪条通道,再动手:
- 用 ChatGPT 订阅账号 → 走订阅通道(
chatgpt.com后端 + OAuth),不要碰api.openai.com; - 「5/5 重连」是 WebSocket 实时传输的特性,正确的关法是在订阅 provider 上设
supports_websockets = false,而不是切到 API 直连通道; - 改
config.toml前务必完全退出 Codex,并用独立 id 的 provider,避免被自动重写弄坏。
绕开「换代理、换节点」的弯路,真正的修复其实只有几行配置。如果你也在折腾 Codex 桌面版,希望这篇能帮你少走点弯路。
如果在配置过程中遇到问题,欢迎在评论区留言交流。祝你使用愉快!