背景
如果 Codex Desktop 经常出现类似下面的状态:
text
Reconnecting... 2/5
Reconnecting... 3/5
Reconnecting... 4/5
并且你平时依赖本机代理访问网络,那么问题可能不是 Codex 服务本身不稳定,而是 Codex Desktop 启动时没有继承代理环境变量,导致 WebSocket 连接没有正确走代理。
可以先在终端里检查:
bash
codex doctor
如果看到 WebSocket timeout,且终端手动设置代理后可以通过,就可以考虑给 macOS 图形界面 App 设置代理环境变量。
设置代理环境变量
下面示例使用的代理端口是 127.0.0.1:7897。请根据你的代理软件实际端口修改,比如 Clash、Mihomo、Clash Verge、Surge 等。
bash
launchctl setenv HTTP_PROXY http://127.0.0.1:7897
launchctl setenv HTTPS_PROXY http://127.0.0.1:7897
launchctl setenv ALL_PROXY socks5h://127.0.0.1:7897
launchctl setenv NO_PROXY "localhost,127.0.0.1,::1"
设置完成后,需要完全退出 Codex Desktop,再重新打开。
命令含义
HTTP_PROXY
bash
launchctl setenv HTTP_PROXY http://127.0.0.1:7897
让支持 HTTP_PROXY 环境变量的程序,把 HTTP 请求转发到本机代理端口。
HTTPS_PROXY
bash
launchctl setenv HTTPS_PROXY http://127.0.0.1:7897
让支持 HTTPS_PROXY 环境变量的程序,也通过本机代理端口转发 HTTPS 请求。
这里变量名虽然是 HTTPS_PROXY,但值通常仍然写成 http://...,表示使用 HTTP 代理协议转发 HTTPS 流量。
ALL_PROXY
bash
launchctl setenv ALL_PROXY socks5h://127.0.0.1:7897
给不区分 HTTP/HTTPS 的程序设置通用代理。
socks5h:// 表示使用 SOCKS5 代理,并且域名解析也交给代理端处理。
注意:你的代理端口是否支持 SOCKS5,要看代理软件的实际配置。不是所有端口都同时支持 HTTP 和 SOCKS5。
NO_PROXY
bash
launchctl setenv NO_PROXY "localhost,127.0.0.1,::1"
告诉程序访问本机地址时不要走代理。
常见本机地址包括:
localhost127.0.0.1::1
这些地址通常应该直连,否则可能影响本机服务访问。
恢复系统默认环境
如果你想撤销上面的设置,让 Codex Desktop 不再从 launchctl 继承这些代理变量,可以执行:
bash
launchctl unsetenv HTTP_PROXY
launchctl unsetenv HTTPS_PROXY
launchctl unsetenv ALL_PROXY
launchctl unsetenv NO_PROXY
为了兼容部分程序读取小写变量,也可以一并清理小写版本:
bash
launchctl unsetenv http_proxy
launchctl unsetenv https_proxy
launchctl unsetenv all_proxy
launchctl unsetenv no_proxy
执行完成后,同样需要完全退出 Codex Desktop,再重新打开。
查看当前是否已设置
可以用下面的命令查看当前 launchctl 环境变量:
bash
launchctl getenv HTTP_PROXY
launchctl getenv HTTPS_PROXY
launchctl getenv ALL_PROXY
launchctl getenv NO_PROXY
如果命令没有输出,通常表示该变量当前没有设置。
注意事项
launchctl setenv影响的是之后从 macOS 图形界面启动的 App。- 已经启动的 App 不会自动拿到新环境变量,需要完全退出后重开。
- 代理端口要替换成你本机代理软件实际监听的端口。
- 如果你的代理软件 HTTP 端口和 SOCKS5 端口不同,不要直接照抄同一个端口。
- 这套命令不会修改 macOS 系统网络设置里的 Wi-Fi/以太网代理开关,只是设置 App 启动环境变量。