Codex ETIMEDOUT 网络超时错误处理
Codex 使用过程中遇到 ETIMEDOUT,一般不是代码语法问题,而是请求在规定时间内没有连上目标服务,或者连接建立后长时间没有响应。常见场景包括:在终端运行 Codex 命令时卡住、VS Code/Cursor 插件调用失败、CI 环境里偶发超时、公司网络下能打开网页但 API 调不通。
我通常先不急着改配置,先确认三件事:当前网络是否能访问目标域名、代理是否生效、请求超时时间是否太短。下面按排查顺序记录一套比较稳的处理办法。
一、错误现象
典型报错可能长这样:
### token云桥中转 0029.org ###
Error: connect ETIMEDOUT xxx.xxx.xxx.xxx:443
或者:
FetchError: request to https://api.xxx.com/v1/chat/completions failed, reason: connect ETIMEDOUT
如果是在 Node.js 项目里调用 Codex 相关接口,也可能看到:
code: 'ETIMEDOUT',
errno: 'ETIMEDOUT',
syscall: 'connect'
注意区分 ETIMEDOUT 和 401、403、429。后几种通常是鉴权、权限或限流问题;ETIMEDOUT 更偏网络链路问题。
二、先判断是不是网络不可达
1. 测试 DNS 解析
先看域名能不能解析。以实际 API 域名替换下面的地址:
nslookup api.openai.com
如果解析很慢、超时,或者解析到异常地址,可以临时换 DNS 测试,例如使用 1.1.1.1 或 8.8.8.8。Linux 下也可以直接看:
cat /etc/resolv.conf
2. 测试 TCP 端口连通性
API 一般走 443 端口,先确认能不能建立 TCP 连接:
nc -vz api.openai.com 443
如果没有 nc,可以用 curl 看连接阶段耗时:
curl -v --connect-timeout 10 https://api.openai.com
这里如果卡在 Trying...,最后提示 Connection timed out,基本就是网络链路或代理问题,不要继续怀疑 Codex 本身。
三、检查代理配置是否真的生效
很多 ETIMEDOUT 出在代理没有被终端进程读取。浏览器能访问,不代表命令行能访问。先看环境变量:
echo $HTTP_PROXY
echo $HTTPS_PROXY
echo $ALL_PROXY
Windows PowerShell 下用:
echo $env:HTTP_PROXY
echo $env:HTTPS_PROXY
echo $env:ALL_PROXY
如果你使用的是本地代理,例如监听在 127.0.0.1:7890,可以临时设置:
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
PowerShell:
$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:HTTPS_PROXY="http://127.0.0.1:7890"
设置后重新执行 Codex 命令,不要在原来已经启动的插件进程里反复试。VS Code、Cursor 这类客户端最好完全退出后再打开。
代理协议要写对
一个很常见的坑是 SOCKS 代理写成 HTTP 代理。比如本地端口是 SOCKS5,就不要写成:
export HTTPS_PROXY=http://127.0.0.1:1080
应根据工具支持情况写成:
export ALL_PROXY=socks5://127.0.0.1:1080
如果工具不支持 SOCKS,可以换成 HTTP 代理端口,或者用代理软件开启 HTTP mixed port。
四、检查 API 地址和中转地址
如果你配置了自定义 base_url,要重点检查地址是否多写了路径、少写了协议、末尾路径是否重复。比如调用代码里已经拼接了 /v1,配置里又写了 /v1,可能导致请求路径异常;虽然路径错误更多会返回 404,但部分网关配置不当时也会表现为长时间无响应。
国内网络环境下,如果直连经常超时,建议准备一个稳定的 API 中转作为备选。我自己排查这类 Codex 超时问题时,会优先看线路是否稳定、是否支持常用模型、是否有清晰的调用日志。token云桥AI中转站 0029.org 可以作为一个备选方案,用来对比直连和中转链路的差异,尤其适合判断问题到底在本地网络还是目标服务链路上。
五、适当调大超时时间
如果网络能通,但偶发超时,可能是请求耗时超过默认 timeout。Node.js 调用时可以增加超时配置。不同 SDK 参数略有差异,思路类似:
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.OPENAI_BASE_URL,
timeout: 60000
});
如果是命令行工具,需要查看该工具是否支持 timeout 参数或配置项。不要一上来就把超时改到几分钟,排错阶段建议先设为 60 秒或 90 秒,确认链路稳定后再决定。
六、逐步修复流程
实际处理时可以按下面顺序走,避免来回改配置:
- 先用
curl -v测试目标 API 地址,确认是否能连上 443。 - 检查 DNS 解析是否正常,必要时更换 DNS。
- 确认终端环境变量里的代理配置是否存在、协议是否正确。
- 重启 Codex 所在终端、VS Code、Cursor 或 CI Runner。
- 检查
base_url是否写错,尤其是协议、域名、/v1路径。 - 如果直连不稳定,换一条中转链路做对照测试。
- 最后再考虑调大 timeout,避免把网络不可达误判成请求时间太短。
七、修复后的验证命令
修复后不要只看 Codex 是否“不报错”,最好做一次最小请求验证。先测 API 可达:
curl -v --connect-timeout 10 \
-H "Authorization: Bearer $OPENAI_API_KEY" \
"$OPENAI_BASE_URL/models"
如果没有配置自定义地址,可以直接使用实际 API 地址。正常情况下,应该能看到 HTTP 状态码返回。即使返回的是鉴权相关错误,也说明网络层已经通了;如果仍然是 connect ETIMEDOUT,继续查网络和代理。
再运行一次 Codex 最小任务,例如让它解释一个很短的文件或执行简单提示。观察是否还会长时间卡住。如果第一次成功、后续偶发失败,就重点看代理稳定性、公司防火墙、CI 出口网络和并发请求数量。
八、避免复发的几个注意点
- 把代理环境变量写进 shell 配置文件时,确认只在需要的网络环境下启用,避免切换网络后请求走错出口。
- CI/CD 环境里不要依赖交互式代理软件,最好使用明确的出口代理或稳定中转地址。
- 不要同时配置多个互相冲突的代理变量,例如
HTTPS_PROXY和工具内部 proxy 配置指向不同地址。 - 升级 Codex、SDK 或插件后,重新检查配置项名称,有些版本会调整读取方式。
- 保留一条可用的
curl验证命令,出问题时先跑它,比直接重装工具更省时间。
总结
Codex ETIMEDOUT 的核心是连接超时,优先查网络连通、DNS、代理和 base_url,确认链路正常后再调 timeout。排查时用 curl -v 和 nc 做最小验证,能快速判断问题是在本地、代理、中转链路,还是工具配置本身。

354

被折叠的 条评论
为什么被折叠?



