本文内容由AI协助完成
解决 macOS 下 Codex 首条消息反复 Reconnecting 的问题
最近在 macOS 上使用 Codex 时,我遇到了一个非常烦的问题:
每次新开会话,第一条消息都会疯狂重连:
Reconnecting... 2/5
Reconnecting... 3/5
Reconnecting... 4/5
Reconnecting... 5/5
有时候能恢复,有时候直接卡死。
一开始我以为是 OpenAI 服务不稳定,后来排查后发现:
问题根本不在 Codex。
而是:
Codex 没有正确读取本机代理环境变量。
一句话理解问题本质
很多人会误以为:
“我用了 Hysteria2 节点,那 Codex 就应该直连 Hysteria2 地址。”
这是错的。
真正的链路其实是:
Codex
↓
本地 HTTP 代理(127.0.0.1)
↓
Shadowrocket
↓
Hysteria2 节点
↓
OpenAI
Codex 不应该直接连接远程节点。
它应该连接:
127.0.0.1:本地代理端口
一、错误认知:把远程节点当成本地代理
很多人的节点信息类似:
Type: Hysteria2
Address: 149.xx.xx.xxx
Port: 40xxx
于是会写:
export HTTP_PROXY=http://149.xx.xx.xxx:40xxx
这是错误的。
因为:
149.xx.xx.xxx:40xxx
只是 Shadowrocket 用来连接远程服务器的地址。
它不是本机 HTTP 代理。
Codex 无法直接把它当 HTTP Proxy 使用。
二、正确理解:Codex 应该连接本地代理
真正应该使用的是:
Shadowrocket 在本机开放出来的 HTTP 代理端口。
例如:
Proxy Type: HTTP
Proxy Address: 127.0.0.1
Proxy Port: 1087
那么正确配置应该是:
export HTTP_PROXY=http://127.0.0.1:1087
export HTTPS_PROXY=http://127.0.0.1:1087
export ALL_PROXY=http://127.0.0.1:1087
三、最容易踩的坑
很多人会写:
export HTTPS_PROXY=https://127.0.0.1:1087
这是错的。
正确写法仍然是:
export HTTPS_PROXY=http://127.0.0.1:1087
因为:
-
HTTPS_PROXY表示: “访问 HTTPS 网站时使用哪个代理” -
它不代表: “代理服务器本身是 HTTPS”
Shadowrocket 提供的是 HTTP 代理。
所以这里必须是:
http://
不是:
https://
四、临时解决方案
如果只是临时测试,可以直接执行:
export HTTP_PROXY=http://127.0.0.1:1087
export HTTPS_PROXY=http://127.0.0.1:1087
export ALL_PROXY=http://127.0.0.1:1087
然后:
codex
如果问题消失,说明就是代理问题。
但这种方式只在当前终端有效。
关闭终端后会失效。
五、macOS 持久化配置
macOS 默认 shell 基本都是 zsh。
编辑:
nano ~/.zshrc
加入:
export HTTP_PROXY=http://127.0.0.1:1087
export HTTPS_PROXY=http://127.0.0.1:1087
export ALL_PROXY=http://127.0.0.1:1087
保存后执行:
source ~/.zshrc
验证:
echo $HTTP_PROXY
echo $HTTPS_PROXY
echo $ALL_PROXY
如果输出正常,说明环境变量已经生效。
六、为什么只改 zshrc 还不够
很多人到这里还是会:
Reconnecting...
原因是:
Codex 不一定会继承 shell 环境变量。
所以还需要修改:
~/.codex/config.toml
七、修改 Codex 配置
创建配置文件:
mkdir -p ~/.codex
nano ~/.codex/config.toml
加入:
[shell_environment_policy]
inherit = "all"
include_only = [
"PATH",
"HOME",
"HTTP_PROXY",
"HTTPS_PROXY",
"ALL_PROXY"
]
核心作用:
让 Codex 显式继承代理环境变量。
否则:
即使终端能翻,Codex 也可能读不到代理。
八、完整操作流程
1. 打开 Shadowrocket
确保:
- 节点连接成功
- HTTP 本地代理开启
2. 确认本地代理端口
例如:
127.0.0.1:1087
3. 配置 ~/.zshrc
export HTTP_PROXY=http://127.0.0.1:1087
export HTTPS_PROXY=http://127.0.0.1:1087
export ALL_PROXY=http://127.0.0.1:1087
执行:
source ~/.zshrc
4. 配置 ~/.codex/config.toml
[shell_environment_policy]
inherit = "all"
include_only = [
"PATH",
"HOME",
"HTTP_PROXY",
"HTTPS_PROXY",
"ALL_PROXY"
]
5. 重启程序
建议全部重启:
- Terminal
- VS Code
- Codex
尤其:
如果 Codex 是从 VS Code 启动的。
那么只重启终端是不够的。
九、如何验证代理是否生效
方法 1:测试 OpenAI 连通性
curl -I https://api.openai.com
如果返回:
HTTP/2 401
这是正常的。
说明:
- 网络已经打通
- 只是没有认证信息
方法 2:检查出口 IP
curl https://ipinfo.io/ip
如果输出的是代理 IP。
说明当前终端已经走代理。
方法 3:检查环境变量
env | grep -i proxy
正常应该看到:
HTTP_PROXY=http://127.0.0.1:1087
HTTPS_PROXY=http://127.0.0.1:1087
ALL_PROXY=http://127.0.0.1:1087
十、常见踩坑总结
1. 把远程节点当 HTTP 代理
错误:
149.xx.xx.xxx:40xxx
正确:
127.0.0.1:1087
2. HTTPS_PROXY 写成 https://
错误:
https://127.0.0.1:1087
正确:
http://127.0.0.1:1087
3. 改完没重启
至少需要:
source ~/.zshrc
更保险:
重启 VS Code + Codex。
4. Shadowrocket 没启动
环境变量只是:
“告诉程序代理在哪”。
但如果 Shadowrocket 没启动。
那么:
127.0.0.1:1087
这个地址本身就是空的。
十一、最终配置
最终:
~/.zshrc
export HTTP_PROXY=http://127.0.0.1:1087
export HTTPS_PROXY=http://127.0.0.1:1087
export ALL_PROXY=http://127.0.0.1:1087
最终:
~/.codex/config.toml
[shell_environment_policy]
inherit = "all"
include_only = [
"PATH",
"HOME",
"HTTP_PROXY",
"HTTPS_PROXY",
"ALL_PROXY"
]
十二、总结
Codex 根本没有正确经过代理。
Codex 连接的是本地 HTTP 代理,而不是远程 Hysteria2 节点。
发表评论