现象

环境:Windows 11 + Codex 桌面版 26.1023 + SakuraCat 代理。

  • Codex 启动后长时间卡在 logo 界面
  • 偶尔能进主界面,但左下角用户信息一直是骨架屏,加载不出来
  • 右侧输入框上方提示:Couldn’t load workspace settings / Retry to continue chatting
  • 对话功能完全不可用,点 Retry 也没用

背景

之前让 Codex 里的 AI 帮忙“让 Codex 走系统代理”,它改了 Windows 的系统代理设置:

Text
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
  ProxyEnable = 1
  ProxyServer = 127.0.0.1:7897

改完就开始出问题。

原因

问题有三层,刚好叠在一起。

1. 7897 不是 SakuraCat 当前可用的代理端口。

当时 7897 确实在监听,TCP 能连上,甚至 CONNECT 也能返回 200,所以看起来很“正常”。但它其实不是 SakuraCat 真正在用的代理:真正可用的是 core 进程监听的 127.0.0.1:12450。7897 是很久以前版本留下的组件端口,握手能做到一半,TLS 一建立就被重置,所有 HTTPS 请求都会失败。用 curl 打一个 https 地址就能看出来。

2. Codex 的内核不读 Windows 系统代理。

Codex 的请求分两套:内核(codex.exe,Rust 写的)只认 HTTP_PROXY / HTTPS_PROXY / ALL_PROXY 环境变量;界面层(Electron/Chromium)才会读系统代理。所以只改注册表,模型请求这一层根本没生效。

3. 那次写入进了 Codex 自己的“虚拟注册表”,真实注册表当时其实没变。

Codex 桌面版是 MSIX 打包应用,它的进程读写 HKCU 时,会被重定向到应用容器里的虚拟注册表(SystemAppData\Helium)。那次 Set-ItemProperty 成功写进去的是这份副本,只有 Codex 自己看得到。

结果就是:真实系统代理不管改成 12450 还是关掉,Codex 都按 127.0.0.1:7897 走,然后报 net::ERR_PROXY_CONNECTION_FAILED。这也解释了为什么重装 SakuraCat 完全没用。

怎么定位

先分清楚是“代理本身死了”还是“应用用错了代理”。

第一步,测端口能不能真的走 HTTPS。

只看 CONNECT 200 会骗人,要完整跑一次 HTTPS:

PowerShell
curl.exe -s -o NUL -w "%{http_code}" -x http://127.0.0.1:12450 --max-time 15 https://api.openai.com/v1/models

返回 401 说明网络通了(没带 key 被拒绝,属于正常);返回 000 就是没通。两个端口都测一遍,很快就知道哪个能用。

第二步,看真实的系统代理。

PowerShell
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' |
  Select-Object ProxyEnable, ProxyServer, AutoConfigURL
netsh winhttp show proxy

第三步,看 Codex 自己的日志。

  • 内核日志:C:\Users\<用户名>\.codex\logs_2.sqlite,看 logs 表的 feedback_log_body 字段,搜 error sending request、timed out
  • 界面日志:C:\Users\<用户名>\AppData\Local\Packages\OpenAI.Codex_*\LocalCache\Local\Codex\Logs\年\月\日\*.log,搜 ERR_ 和 sa_server_request_failed

我当时看到的关键信息是 sa_server_request_failed errorCode=ERR_PROXY_CONNECTION_FAILED。

第四步,看两个进程各自连的是哪个端口。

PowerShell
Get-NetTCPConnection -State Established |
  Where-Object { $_.RemotePort -in 12450, 7897 } |
  Select-Object RemotePort, OwningProcess

结论很直接:codex.exe 连 12450(正常),ChatGPT.exe 连 7897(失败);而真实注册表里明明是 12450。两边对不上,说明 Codex 读代理的来源另有出处,也就是上面说的虚拟注册表。

修复

1. 把系统代理恢复成 SakuraCat 的正确端口

最省事的办法是在 SakuraCat 里把“系统代理”关掉再打开,它自己会写对端口。要手动写的话:

PowerShell
$p = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
$bypass = 'localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*'

Set-ItemProperty $p -Name ProxyEnable -Value 1 -Type DWord
New-ItemProperty $p -Name ProxyServer -Value 'http://127.0.0.1:12450' -PropertyType String -Force | Out-Null
New-ItemProperty $p -Name ProxyOverride -Value $bypass -PropertyType String -Force | Out-Null
Remove-ItemProperty $p -Name AutoConfigURL -ErrorAction SilentlyContinue
netsh winhttp reset proxy

2. 给 Codex 内核写代理环境变量

PowerShell
$proxy = 'http://127.0.0.1:12450'
[Environment]::SetEnvironmentVariable('HTTP_PROXY',  $proxy, 'User')
[Environment]::SetEnvironmentVariable('HTTPS_PROXY', $proxy, 'User')
[Environment]::SetEnvironmentVariable('ALL_PROXY',   $proxy, 'User')
[Environment]::SetEnvironmentVariable('NO_PROXY', 'localhost,127.0.0.1,::1', 'User')

改完不会立刻对已经开着的程序生效。重启一下资源管理器(任务管理器里找到“Windows 资源管理器”,右键重新启动),或者重新登录一次,之后新开的程序才会继承。

3. 清掉 Codex 容器里的错误代理(关键一步)

先把 Codex 完全退出,然后开 管理员 PowerShell:

PowerShell
Get-Process ChatGPT, codex -ErrorAction SilentlyContinue | Stop-Process -Force
Start-Sleep 3

$h = "$env:LOCALAPPDATA\Packages\OpenAI.Codex_2p2nqsd0c76g0\SystemAppData\Helium"
Rename-Item $h ($h + '.bak-' + (Get-Date -Format 'yyyyMMdd-HHmmss'))

再正常打开 Codex。

这一步会重置 Codex 的应用数据(窗口布局、缓存这类),但登录信息和会话记录在 C:\Users\<用户名>\.codex,不会丢。

不想敲命令的话,图形界面里也能做:设置 → 应用 → 已安装的应用 → 搜 Codex(开始菜单里可能显示为 ChatGPT)→ 高级选项 → 重置。效果类似,只是会多清一些缓存。

4. 验证

  • 界面上左下角头像和邮箱能正常显示,右侧不再提示 workspace settings
  • 连接检查:ChatGPT.exe 和 codex.exe 都连 127.0.0.1:12450
  • 界面日志里 ERR_PROXY_CONNECTION_FAILED 归零,内核日志里能看到 status=200 OK

几点提醒

  • 不要手动改 HKCU 的系统代理。交给 SakuraCat 自己的开关,它知道自己当前用哪个端口。
  • 代理软件的端口会变。这次 7897 是旧组件留下的,真正可用的是 12450。判断端口别只看“能不能连”,要实际跑一次 HTTPS。
  • 改完代理要重启 Codex。界面层是在启动时读代理配置的,不重启不生效。
  • MSIX / Microsoft Store 版应用可能有一份自己的注册表副本。如果改真实注册表后应用行为不变,先怀疑它读的是虚拟注册表,可以试着重置应用数据。

回滚

如果之后想撤掉这些改动:

PowerShell
foreach ($n in 'HTTP_PROXY','HTTPS_PROXY','ALL_PROXY','NO_PROXY') {
  [Environment]::SetEnvironmentVariable($n, $null, 'User')
}

虚拟注册表备份在 %LOCALAPPDATA%\Packages\OpenAI.Codex_2p2nqsd0c76g0\SystemAppData\Helium.bak-<时间戳>,确认 Codex 一切正常后可以直接删掉。```

阅读进度 0%