本文内容由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 节点。