Skip to content

Jackknifer/codex-proxy-switcher-macos

Repository files navigation

Codex Proxy Switcher for macOS

CI Release License

一个面向 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 或系统代理设置。

快速使用

  1. Releases 下载 codex-proxy-switcher-macos-v*.zip
  2. 同时下载 .sha256 文件并核验压缩包;
  3. 解压后先阅读 首次运行说明.txt
  4. 按下面的首次运行方法允许这个脚本;
  5. 双击 Codex代理切换器.command
  6. 选择 Clash、v2rayN 或自动检测;
  7. 测试通过后,按提示完全重启 Codex。

校验下载:

shasum -a 256 -c codex-proxy-switcher-macos-v1.0.2.sha256

macOS 首次运行提示

通过 Safari 等浏览器下载后,macOS 可能显示:

Apple 无法验证“Codex代理切换器.command”是否包含恶意软件

这是因为本项目是普通开源 shell 脚本,目前没有 Apple Developer ID 签名和公证。它不表示 macOS 已检测到恶意代码,而是表示 Apple 无法验证 发布者。

请先确认下载来源和 SHA256,然后选择以下一种方式。

方法一:使用系统设置

  1. 尝试打开一次脚本并点“完成”,不要移到废纸篓;
  2. 打开“系统设置 → 隐私与安全性”;
  3. 在安全性区域找到被阻止的脚本,点击“仍要打开”;
  4. 按 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/

为什么不能只检查 HTTP 405

对 Codex 接口发送普通 GET 请求时,HTTP 405 通常表示:

  • 本地代理端口可以连接;
  • TLS 握手成功;
  • 请求已经到达 Codex 接口;
  • 只是请求方法不被该接口接受。

但它只验证了几秒钟的短请求。Codex 使用较长的流式响应,代理节点可能在 10 到 30 秒后出现 connection reset by peer、超时或会话中断。

因此切换器默认执行两层检查:

  1. 连续 6 次访问 Codex 接口,均需返回 HTTP 405
  2. 通过同一代理完成约 24 秒、786432 字节的限速持续传输。

只有两层检查都通过才会修改真实配置。

默认端口与自定义端口

默认值是:

软件 默认端口
Clash Verge 7897
v2rayN 10808

这些端口不是系统规定的固定值,可以在运行时覆盖:

CLASH_PORT=7890 ./Codex代理切换器.command clash
V2RAYN_PORT=10809 ./Codex代理切换器.command v2rayn

Clash 和 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 version

test 只测试,不修改 ~/.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/

相关说明

License

MIT

About

macOS Codex proxy switcher for Clash Verge and v2rayN; fixes reconnecting and stream disconnected errors.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages