Codex 沙箱报错 `apply_patch` 调用失败?那是代理环境变量捣鬼
最近在折腾 Codex 的时候遇到了一个让人头秃的问题:每当我让 AI 修改本地代码,也就是调用 apply_patch 功能时,程序就会崩掉,报错提示还莫名其妙,提到了什么 COM+ 错误。
试过让 AI 自己修,甚至重装,结果问题依旧。后来仔细排查了一下,终于发现了罪魁祸首——原来是我为了加速 Codex 也就是主程序的联网,在系统环境变量里挂的代理,竟然把沙箱子进程也给“带偏”了。
Codex 在尝试修改代码时崩溃,提示 COM+ 错误。
今天就把自己踩坑排雷的全过程分享一下,希望能帮到同样遇到这个问题的朋友。
报错背后的真相
事情的起因很简单,因为网络原因,我给系统设置了代理,确保 Codex 主程序能顺利访问 API。环境变量大概长这样:
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 让 AI 修改代码时,Codex 会唤醒 codex-windows-sandbox-setup.exe 来处理文件操作。这个辅助程序读到配置里有代理端口,就会尝试去刷新 Windows 沙箱和防火墙的状态,试图适配代理。结果这一步直接触发了系统的 COM+ 组件错误,导致整个操作失败。
核心矛盾在于: Codex 主程序确实需要代理来联网,但沙箱工作在本地,根本不需要代理,更不应该去刷新防火墙状态。子进程一旦继承了父进程的代理环境变量,就会引发连锁反应。
使用 PowerShell 命令强制退出所有 Codex 相关进程,确保配置修改生效。
简单粗暴的办法(无效)
我一开始以为,把 setup_marker.json 里的端口删了不就行了吗?
改成了 "proxy_ports": [] 之后,重启确实好了一会儿。但没过多久,只要后台残留的 Codex 进程还在,它们就会因为内存里还带着旧的环境变量,再次把代理端口写回配置文件,报错卷土重来。
所以,单纯的删改文件治标不治本。
终极解决方案:隔离环境变量
要彻底根治,得让 Codex 主程序继续走代理(毕竟是刚需),但要禁止沙箱、工具调用等子进程继承这些环境变量。
以下是具体的操作步骤,建议一步步来:
1. 彻底退出 Codex
首先,不要只是关闭窗口,一定要完全退出程序。可以去任务管理器把托盘和后台的所有 Codex 相关进程全杀了,或者用下面这条 PowerShell 命令“暴力”清理:
Get-Process | Where-Object { $_.ProcessName -match "codex|openai" } | Stop-Process -Force
2. 修改 config.toml
找到 Codex 的配置文件 config.toml,我们需要添加针对子进程的环境变量策略。如果配置里已经有 [features],就合并进去;如果没有,直接追加以下内容:
[features]
network_proxy = true
[shell_environment_policy]
inherit = "all"
exclude = [
"HTTP_PROXY",
"HTTPS_PROXY",
"ALL_PROXY",
"http_proxy",
"https_proxy",
"all_proxy"
]
这段配置的逻辑非常清晰:
[features] network_proxy = true:保持主程序的代理功能开启,不影响聊天联网。[shell_environment_policy]:这是重点。inherit = "all"表示默认继承环境,但exclude列表中的所有代理相关变量(HTTP_PROXY等)都会被剔除。这意味着,当 Codex 调用apply_patch、执行Get-Content或其他沙箱工具命令时,这些子进程是“纯净”的,不会带有代理配置,也就不会触发错误的防火墙刷新了。
3. 清理残留配置并重启
修改完配置文件后,再次打开 ~\.codex\sandbox\setup_marker.json,确保把里面的代理端口数组清空:
"proxy_ports": []
保存文件,重新启动 Codex。
验证修复
为了确认问题是否真的解决了,我们可以直接在对话框里给 AI 下达一个包含文件读写和补丁操作的测试指令:
“请创建一个
apply_patch_test.txt文件,内容写入hello,然后用apply_patch把hello改成hello codex。”
如果 AI 能顺利完成这一系列操作不再报错,那就说明 COM+ 错误已经被我们成功“隔离”了。
备选方案
如果你的情况比较特殊,按照上述方法修改后依然报错,作为应急措施,可以考虑将 Codex 的沙箱模式临时改为 unelevated(非特权模式),虽然在权限管理上会有所不同,但往往能绕过部分系统级错误。
希望这篇教程能帮大家省下几个小时的排查时间,让 AI 写代码的体验回归丝滑!
评论已关闭