如何在 macOS 优雅地为 Codex CLI 与 App 设置代理

在国内网络环境或公司内网使用 OpenAI 推出的 Codex 工具时,网络连接问题经常是大家遇到最大的绊脚石。而且O家的软件版本质量吧,真的是一言难尽,代理的设置并不是完全前向兼容。

之前不想浪费时间,都是直接开TUN模式,但是这个模式对全局网络影响比较大,而且有一定的系统性能影响。忍无可忍之下,做了一下 Codex CLI 和 App的单独设置。

本文总结了在 macOS 下为 Codex CLICodex 桌面端 App 完美配置本地代理的实战经验,希望能让大家少浪费时间在网络连接问题上。

💡 提示: 下文均以本地 HTTP/HTTPS 代理端口 7897 为例。请在实际操作中将 7897 替换为你自己的代理软件端口(如 Clash 默认的 7890)。


1. Codex CLI 的代理设置:破除配置误区

很多人以为在 ~/.codex/config.toml 中配置 [features.network_proxy] 就可以让 CLI 连上 OpenAI,这其实是个误区。那个配置仅对 Codex 执行代码的“沙盒环境”有效,无法解决 Codex 本身连接 OpenAI API 的问题

正确的解法: 依赖系统环境变量。

如果你想让终端里的所有命令或仅限 codex 命令走代理,最好的方式是在你的 shell 配置文件(如 ~/.zshrc)中设置:

打开终端执行 nano ~/.zshrc,将以下代码加入文件:

# 方案 A:仅为 codex 命令设置别名(推荐,不污染全局环境)
alias codex='https_proxy="http://127.0.0.1:7897" http_proxy="http://127.0.0.1:7897" codex'

# 方案 B:如果希望当前终端默认全局走代理,直接 export
# export http_proxy="http://127.0.0.1:7897"
# export https_proxy="http://127.0.0.1:7897"

保存后,执行 source ~/.zshrc 生效。从此在终端敲 codex 就能顺畅通信了。


2. Codex 桌面端 App 的代理设置:绕过 Electron 的坑

当你满心欢喜配置好环境变量,打开 Codex 桌面应用时,很可能依然会在日志里看到类似这样的报错:

ERROR [Statsig] A networking error occurred... Error: Timeout of 10000ms expired.
[electron-message-handler] error while bootstrapping post-login client

原因分析:
Codex App 是基于 Electron(Chromium 内核)开发的。常规的环境变量对它的 Node.js 后端进程有效,但其前端界面(Renderer 进程)会忽略环境变量,导致页面请求一直处于直连状态而超时。

优雅解法:一键启动别名(Alias)

我们需要同时为后台进程提供环境变量,并为前端内核传入 Chromium 专属启动参数 --proxy-server。为了不阻塞终端,我们可以用 nohup 让它在后台静默运行。

编辑 ~/.zshrc,在末尾追加如下配置:

# 完美启动 Codex App 的快捷命令
alias codex-app='http_proxy="http://127.0.0.1:7897" https_proxy="http://127.0.0.1:7897" nohup /Applications/Codex.app/Contents/MacOS/Codex --proxy-server="http://127.0.0.1:7897" > /dev/null 2>&1 &'

使配置生效并使用:

  1. 刷新配置:
source ~/.zshrc
  1. 杀掉之前卡住的旧进程(非常重要,否则新参数可能不生效):
pkill -f Codex
  1. 在终端中输入自定义的别名命令:
codex-app

效果:
回车后,终端立即返回空闲状态(你可以直接关掉终端)。同时,Codex App 会秒开,无论是界面的 A/B 测试请求、登录流,还是后续的对话,都能完美通过本地代理发出,不再转圈超时!


总结与备选方案

  • CLI 工具认准 http_proxy / https_proxy 环境变量。不需要乱加 all_proxy 如果你只有 HTTP 节点。
  • Electron 桌面端不仅需要环境变量兜底,更需要传递 --proxy-server 启动参数。
  • 备选大招:如果你觉得配代码太麻烦,或者上述方法因为企业证书抓包拦截依然报错,最一劳永逸的方法是:直接在你的代理客户端中开启 TUN 模式(虚拟网卡接管)。TUN 模式会在系统底层强制劫持所有的网络请求,无需对应用做任何额外配置。