一个面向 macOS Codex Desktop 的本地代理切换器,用来解决以下常见问题:
stream disconnected before completion: error sending request for url
(https://chatgpt.com/backend-api/codex/responses)
它可以让 Codex 在 Clash Verge 和 v2rayN 的本地代理端口之间切换,并在 修改配置前执行连续请求和持续传输测试,避免把“短请求能通、流式响应会断” 的代理线路误判为可用。
- 浏览器可以访问 ChatGPT,但 Codex 一直
Reconnecting; - Codex 最终提示
stream disconnected before completion; - 从 v2rayN 切到 Clash 后,Codex 仍然连接旧端口;
- 关闭其中一个代理软件后,Codex 完全无法联网;
curl返回HTTP 405,但 Codex 长回复仍会断流;- Clash 和 v2rayN 使用不同端口,需要安全地切换 Codex。
本项目只适用于 macOS。它不会提供代理节点,也不会修改 Clash 或 v2rayN 的订阅、节点、规则、TUN 或系统代理设置。
- 从 Releases
下载
codex-proxy-switcher-macos-v*.zip; - 同时下载
.sha256文件并核验压缩包; - 解压后先阅读
首次运行说明.txt; - 按下面的首次运行方法允许这个脚本;
- 双击
Codex代理切换器.command; - 选择 Clash、v2rayN 或自动检测;
- 测试通过后,按提示完全重启 Codex。
校验下载:
shasum -a 256 -c codex-proxy-switcher-macos-v1.0.2.sha256通过 Safari 等浏览器下载后,macOS 可能显示:
Apple 无法验证“Codex代理切换器.command”是否包含恶意软件
这是因为本项目是普通开源 shell 脚本,目前没有 Apple Developer ID 签名和公证。它不表示 macOS 已检测到恶意代码,而是表示 Apple 无法验证 发布者。
请先确认下载来源和 SHA256,然后选择以下一种方式。
- 尝试打开一次脚本并点“完成”,不要移到废纸篓;
- 打开“系统设置 → 隐私与安全性”;
- 在安全性区域找到被阻止的脚本,点击“仍要打开”;
- 按 macOS 提示确认。
在终端中输入 xattr -dr com.apple.quarantine,空格后把解压得到的整个文件夹
拖进终端窗口,然后按回车。例如:
xattr -dr com.apple.quarantine \
"$HOME/Downloads/codex-proxy-switcher-macos-v1.0.2"这个命令只删除指定下载文件夹的隔离标记,不会关闭 Gatekeeper,也不会 修改 macOS 的全局安全策略。完成后再次双击脚本。
若只有执行权限丢失,再运行:
chmod +x "/你的路径/Codex代理切换器.command"Codex Desktop 启动时会读取:
~/.codex/.env
如果文件仍指向 v2rayN 的 127.0.0.1:10808,即使 macOS 系统代理已经
切换到 Clash,Codex 也可能继续访问旧端口。反过来也一样。
切换器会在目标代理通过稳定性检查后,将 .env 中的代理变量更新为对应
端口:
HTTP_PROXY="http://127.0.0.1:7897"
HTTPS_PROXY="http://127.0.0.1:7897"
ALL_PROXY="http://127.0.0.1:7897"
http_proxy="http://127.0.0.1:7897"
https_proxy="http://127.0.0.1:7897"
all_proxy="http://127.0.0.1:7897"
NO_PROXY="localhost,127.0.0.1,::1"
no_proxy="localhost,127.0.0.1,::1"每次写入前,原文件都会备份到:
~/.codex/proxy-switch-backups/
对 Codex 接口发送普通 GET 请求时,HTTP 405 通常表示:
- 本地代理端口可以连接;
- TLS 握手成功;
- 请求已经到达 Codex 接口;
- 只是请求方法不被该接口接受。
但它只验证了几秒钟的短请求。Codex 使用较长的流式响应,代理节点可能在
10 到 30 秒后出现 connection reset by peer、超时或会话中断。
因此切换器默认执行两层检查:
- 连续 6 次访问 Codex 接口,均需返回
HTTP 405; - 通过同一代理完成约 24 秒、786432 字节的限速持续传输。
只有两层检查都通过才会修改真实配置。
默认值是:
| 软件 | 默认端口 |
|---|---|
| Clash Verge | 7897 |
| v2rayN | 10808 |
这些端口不是系统规定的固定值,可以在运行时覆盖:
CLASH_PORT=7890 ./Codex代理切换器.command clash
V2RAYN_PORT=10809 ./Codex代理切换器.command v2raynClash 和 v2rayN 不能在运行时同时监听同一个 IP:端口,否则后启动的软件
会遇到 address already in use。详见
工作原理与排障。
./Codex代理切换器.command status
./Codex代理切换器.command test clash
./Codex代理切换器.command test v2rayn
./Codex代理切换器.command clash
./Codex代理切换器.command v2rayn
./Codex代理切换器.command auto
./Codex代理切换器.command restore
./Codex代理切换器.command versiontest 只测试,不修改 ~/.codex/.env。
脚本化调用时可禁止重启提示:
CODEX_SWITCHER_NO_RESTART=1 ./Codex代理切换器.command clash切换器会分别显示:
- Clash/v2rayN 的本地端口是否监听;
- Codex 接口短请求是否可达;
~/.codex/.env当前指向的端口;- 正在运行的 Codex 后端实际连接的端口。
如果配置端口和运行端口不同,说明 .env 已改变,但 Codex 还没有完全重启。
脚本会:
- 访问本地代理端口;
- 通过代理访问 Codex 和 Cloudflare 测试地址;
- 备份并更新
~/.codex/.env; - 在用户确认后退出并重新打开 Codex。
脚本不会:
- 读取或上传代理订阅、节点密码和 API Key;
- 修改代理软件配置;
- 关闭 Clash 或 v2rayN;
- 修改 macOS 系统代理、TUN、DNS 或路由;
- 绕过 Cloudflare challenge;
- 向第三方发送你的
.env内容。
由于 Release 中的脚本未经过 Apple Developer ID 签名和公证,首次运行时 可能触发 Gatekeeper。请只从本仓库 Release 下载,并在解除隔离前核验 SHA256。
bash -n Codex代理切换器.command
./tests/test.sh
./scripts/build-release.sh生成的发布包位于 dist/。