问题现象
Codex Desktop 在新建或恢复任务后,第一次发送消息时反复显示正在重新连接:

关键是5次连接之后就自动连上了,好像也不是网络连接的问题。
text
Reconnecting... 1/5
Reconnecting... 2/5
...
Reconnecting... 5/5
像这样,等待一段时间后又开始正常思考,任务仍能正常执行,但每次开始前都会产生明显延迟。
问题背景
OpenAI Codex 仓库的 Issue #24045 记录了相同现象。日志显示,Codex 会先尝试通过 WebSocket 连接 Responses 服务;如果 WebSocket 建连超时,就会连续重试,最后回退到 HTTP/SSE。任务能够继续执行,是因为 HTTP/SSE 通道仍然可用。
#mermaid-svg-nqKeoOSQPLoeIUuv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nqKeoOSQPLoeIUuv .error-icon{fill:#552222;}#mermaid-svg-nqKeoOSQPLoeIUuv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nqKeoOSQPLoeIUuv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nqKeoOSQPLoeIUuv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nqKeoOSQPLoeIUuv .marker.cross{stroke:#333333;}#mermaid-svg-nqKeoOSQPLoeIUuv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nqKeoOSQPLoeIUuv p{margin:0;}#mermaid-svg-nqKeoOSQPLoeIUuv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv .cluster-label text{fill:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv .cluster-label span{color:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv .cluster-label span p{background-color:transparent;}#mermaid-svg-nqKeoOSQPLoeIUuv .label text,#mermaid-svg-nqKeoOSQPLoeIUuv span{fill:#333;color:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv .node rect,#mermaid-svg-nqKeoOSQPLoeIUuv .node circle,#mermaid-svg-nqKeoOSQPLoeIUuv .node ellipse,#mermaid-svg-nqKeoOSQPLoeIUuv .node polygon,#mermaid-svg-nqKeoOSQPLoeIUuv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nqKeoOSQPLoeIUuv .rough-node .label text,#mermaid-svg-nqKeoOSQPLoeIUuv .node .label text,#mermaid-svg-nqKeoOSQPLoeIUuv .image-shape .label,#mermaid-svg-nqKeoOSQPLoeIUuv .icon-shape .label{text-anchor:middle;}#mermaid-svg-nqKeoOSQPLoeIUuv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nqKeoOSQPLoeIUuv .rough-node .label,#mermaid-svg-nqKeoOSQPLoeIUuv .node .label,#mermaid-svg-nqKeoOSQPLoeIUuv .image-shape .label,#mermaid-svg-nqKeoOSQPLoeIUuv .icon-shape .label{text-align:center;}#mermaid-svg-nqKeoOSQPLoeIUuv .node.clickable{cursor:pointer;}#mermaid-svg-nqKeoOSQPLoeIUuv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nqKeoOSQPLoeIUuv .arrowheadPath{fill:#333333;}#mermaid-svg-nqKeoOSQPLoeIUuv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nqKeoOSQPLoeIUuv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nqKeoOSQPLoeIUuv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nqKeoOSQPLoeIUuv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nqKeoOSQPLoeIUuv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nqKeoOSQPLoeIUuv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nqKeoOSQPLoeIUuv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nqKeoOSQPLoeIUuv .cluster text{fill:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv .cluster span{color:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nqKeoOSQPLoeIUuv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nqKeoOSQPLoeIUuv rect.text{fill:none;stroke-width:0;}#mermaid-svg-nqKeoOSQPLoeIUuv .icon-shape,#mermaid-svg-nqKeoOSQPLoeIUuv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nqKeoOSQPLoeIUuv .icon-shape p,#mermaid-svg-nqKeoOSQPLoeIUuv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nqKeoOSQPLoeIUuv .icon-shape .label rect,#mermaid-svg-nqKeoOSQPLoeIUuv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nqKeoOSQPLoeIUuv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nqKeoOSQPLoeIUuv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nqKeoOSQPLoeIUuv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 成功
超时
Codex 发起请求
尝试建立 WebSocket 连接
连接是否成功
开始处理任务
重复连接,最多显示 5/5
回退到 HTTP/SSE
开始处理任务,但首轮延迟较长
常见链路可以概括为:
text
WebSocket 建连超时
→ Codex 连续重试
→ 显示 Reconnecting 1/5 到 5/5
→ 自动回退到 HTTP/SSE
→ 任务恢复正常
解决路线一:交给 Codex 或其他 Agent 工具处理
省流,将本文链接直接发送给 Codex 或任意能够读写本机文件、执行命令的 AI Agent,再附上这句提示词:
text
请阅读本文,先以只读方式判断我的 Codex 重连问题是否与文中描述一致。若一致,请按文中解决路线二的步骤:备份配置、完成修复并验证结果;若不一致或证据不足,则不要修改任何文件并告诉我原因。
由于配置文件位于用户目录,Agent 可能会请求写入权限。批准后,它可以完成备份、修改和检查。Codex Desktop 可能需要重启才能生效。
解决路线二:手动强制使用 HTTP
1. 备份配置文件
Codex 的用户配置文件位于:
text
%USERPROFILE%\.codex\config.toml
USERPROFILE 代表 Windows 提供的环境变量,表示当前登录用户的主目录,通常是 C:\Users\用户名。
如果实在找不到这个位置,Codex 设置页中"配置 → 打开 config.toml"打开的就是这个文件。


不熟悉命令行的话,手动复制一份加个.bak的后缀,方便未来如果有需要还能找到恢复。
下面的备份命令不会修改该文件,而是在同一目录中复制出一个名为 config.toml.bak 的备份文件。
在 PowerShell 中,可以直接使用完整路径执行备份:
powershell
Copy-Item "C:\Users\你的用户名\.codex\config.toml" "C:\Users\你的用户名\.codex\config.toml.bak"
如果使用 Git Bash:
bash
cp "/c/Users/你的用户名/.codex/config.toml" "/c/Users/你的用户名/.codex/config.toml.bak"
执行前,需要把命令中的 你的用户名 替换为实际的 Windows 用户名。
2. 修改默认 provider
打开 config.toml,找到:
toml
model_provider = "openai"
改为:
toml
model_provider = "openai_http"
3. 添加 HTTP provider
在顶层配置项之后、第一个 TOML 表格段之前加入:
toml
[model_providers.openai_http]
name = "OpenAI HTTP only"
base_url = "https://chatgpt.com/backend-api/codex"
wire_api = "responses"
requires_openai_auth = true
supports_websockets = false
如果文件中已有 [projects.*]、[plugins.*] 等配置,建议把上面的内容放在这些段落之前。
这项配置会关闭当前 provider 的 WebSocket,直接使用 HTTP/SSE。其他模型、项目和插件配置不需要修改。
4. 重启并验证
完全退出 Codex Desktop,包括后台进程,然后重新打开并创建一个新任务。
可以在 PowerShell 中运行:
powershell
codex doctor --summary --ascii
正常结果应包含:
text
[ok] config loaded
[ok] websocket Responses WebSocket is not enabled for the active provider
[ok] reachability active provider endpoints are reachable over HTTP
如果终端中的 codex 不是桌面版自带的同一版本,以新任务是否还出现 Reconnecting 1/5...5/5 作为最终验证结果。
恢复原配置
如果需要恢复 WebSocket,将:
toml
model_provider = "openai_http"
改回:
toml
model_provider = "openai"
然后删除 [model_providers.openai_http] 整段配置并重启 Codex。也可以直接用备份文件覆盖当前的 config.toml。