写在前面

如果你在用 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。 关键有三点:

  1. 用独立 id(如 openai-sub-http),避免和内置 openai 撞名;
  2. requires_openai_auth = true,让它用 ChatGPT 订阅的 OAuth 认证,并自动走 chatgpt_base_url(默认 https://chatgpt.com/backend-api/);
  3. 不要写 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_authsupports_websocketschatgpt_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 桌面版,希望这篇能帮你少走点弯路。

如果在配置过程中遇到问题,欢迎在评论区留言交流。祝你使用愉快!