Codex 调用 apply_patch 一直报错,尝试过让它自己修,但是一直没解决。

今天发现了这个报错的根本原因: Codex 本身需要使用代理,但沙箱辅助程序也继承了代理环境变量。 之前为了解决 Codex 每次回复前都要 reconnecting 5 次的问题,设置了 Codex 走本地代理
HTTP_PROXY="http://127.0.0.1:10808"
HTTPS_PROXY="http://127.0.0.1:10808"
ALL_PROXY="socks5h://127.0.0.1:10808"
NO_PROXY="localhost,127.0.0.1,::1"
这导致 Codex 在~\.codex\sandbox\setup_marker.json这个文件中反复写入:
"proxy_ports": [ 10808 ],
随后,当执行 apply_patch 时,会触发 codex-windows-sandbox-setup.exe。这个程序会尝试刷新 Windows 沙箱/防火墙状态,于是产生 COM+ 错误。
简单说就是:Codex 主程序可以用代理,但沙箱 helper 不能继承这些代理变量;否则它会反复把代理端口写回配置文件,导致 apply_patch 触发沙箱/防火墙刷新时报错。
但是单独清空 setup_marker.json 并不能持久解决问题,因为旧的 Codex 进程仍然在它们自己的进程环境中保留着这些代理变量,并且会把代理端口再次写回去。
推荐解决方法:保留 Codex 网络代理,但禁止沙箱继承代理环境变量
先完全退出 Codex ,包括托盘和后台进程。然后打开config.toml,在里面加入或合并下面内容:
[features]
network_proxy = true
[shell_environment_policy]
inherit = "all"
exclude = [
"HTTP_PROXY",
"HTTPS_PROXY",
"ALL_PROXY",
"http_proxy",
"https_proxy",
"all_proxy"
]
shell_environment_policy.exclude 可用于移除传给子进程的环境变量,inherit 控制子进程继承环境变量的范围。
这里的逻辑是:Codex 自己仍然可以使用网络代理,但执行工具、沙箱命令、apply_patch、Get-Content 等子进程时,不再继承这些代理变量。
然后用 PowerShell 结束残留 Codex 进程:
Get-Process | Where-Object { $_.ProcessName -match "codex|openai" } | Stop-Process -Force
再清理一次沙箱 marker ,打开setup_marker.json:
找到类似:
"proxy_ports": [10808]
改成:
"proxy_ports": []
保存后重新启动 Codex ,再测试 apply_patch 、读取文件、查看图片等操作,可以直接让 Codex 执行以下操作简单测试:
请创建一个 apply_patch_test.txt ,内容写入 hello ,然后用 apply_patch 把 hello 改成 hello codex 。
若不报错则代表修复成功。
如果继续出现这个错误,只能考虑临时改成 unelevated 沙箱。