命令行里 AI API 连不上,最常见的原因是终端程序不读取系统代理,浏览器能打开 ChatGPT、Claude,命令行却仍在直连。最快的办法是在终端设置 HTTPS_PROXY 环境变量,或者开启客户端的 TUN 模式,并确认出口节点位于服务支持的地区。命令行和网页的分流规则最好保持一致,避免同一账号从不同地区发出请求。
问题表现
curl、Python/Node.js 脚本或 SDK 报Connection timed out、ECONNRESET、Connection refused;- API 返回 403 或类似「unsupported country / region」「User location is not supported」的提示;
- Claude Code、Codex 启动时提示无法连接服务,或登录授权后卡住;
- 流式输出写到一半突然中断,长任务频繁报错重试。
可能原因
- 终端没有走代理:系统代理主要对浏览器和部分应用生效,多数命令行工具只认
HTTPS_PROXY等环境变量; - 出口地区不受支持:API 和网页一样按出口 IP 判断地区。根据本文更新时查阅的官方页面,OpenAI API 与 Gemini API 的支持列表中都没有中国大陆、香港和澳门,Anthropic 的支持列表同样不含这三地,台湾三家都在列。各家页面会调整,以官方最新列表为准;
- 代理协议不被支持:例如 Claude Code 官方文档说明不支持 SOCKS 代理,必须使用 HTTP(S) 代理地址;
- 节点自动切换:AI 域名放在
url-test、load-balance这类自动策略组里,测速后换节点会切断正在进行的长连接; - 节点或中转不稳定:流式响应可能持续数分钟,丢包或中转空闲超时都会让连接被重置。
排查方法
-
先测网络是否通(端口以客户端显示的混合端口为准,示例用 7890):
curl -I https://api.openai.com/v1/models curl -I -x http://127.0.0.1:7890 https://api.anthropic.com/v1/models不带 API Key 时能收到 HTTP 响应(通常是
401)就说明网络已连通;第一条超时、第二条正常,说明终端没有走代理。 -
确认出口地区:通过代理请求一个 IP 查询接口,看国家/地区是否在服务支持列表中,必要时参考《AI 登录失败与地区不支持》。
-
查看客户端连接页:找到
api.openai.com、api.anthropic.com、generativelanguage.googleapis.com等连接,确认命中的规则和节点。 -
检查策略组类型:AI 相关域名是否在自动测速或负载均衡组中。
解决步骤
1. 为终端设置代理环境变量
本机代理通常是 HTTP 代理,所以 HTTPS_PROXY 的值也写 http://。只对当前终端窗口有效:
Windows 命令提示符(cmd),等号两边不要加空格:
set HTTPS_PROXY=http://127.0.0.1:7890
set HTTP_PROXY=http://127.0.0.1:7890
set NO_PROXY=localhost,127.0.0.1
Windows PowerShell:
$env:HTTPS_PROXY="http://127.0.0.1:7890"
$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:NO_PROXY="localhost,127.0.0.1"
macOS / Linux:
export HTTPS_PROXY=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
export NO_PROXY=localhost,127.0.0.1
设置后在同一窗口重新启动工具。Claude Code 只在启动时读取一次环境变量,也可以写进 ~/.claude/settings.json 的 env 字段长期生效;在会话中运行 /status 可以看到当前使用的代理。NO_PROXY 用来让本机回调地址不走代理,避免浏览器授权回到终端时失败。
2. 环境变量无效时改用 TUN
Python 的 openai、anthropic SDK 底层使用 httpx,默认会读取这些变量;但部分 Node.js 程序、Go 程序或自带网络栈的工具不一定读取。这时开启 TUN 模式 接管全部流量更省事,并确保 TUN 下 DNS 也经过客户端。
3. 给 AI 域名固定一个节点
新建一个手动选择(select)策略组,把 OpenAI、Anthropic、Google AI 相关域名都分到这个组,固定使用一个支持地区的稳定节点。写法见《分流规则教程》。长任务进行中不要手动切换节点。
4. 处理流式中断和超时
- 换延迟稳定、丢包低的节点,比单纯追求低延迟更重要;
- 网络较慢时可适当调大工具或 SDK 的超时,例如 Claude Code 支持
API_TIMEOUT_MS,SDK 一般提供timeout参数; - 批量请求时降低并发,避免触发服务方的速率限制被误以为是网络问题(速率限制通常返回
429)。
验证结果
- 不加
-x的curl -I https://api.anthropic.com/v1/models也能很快收到 HTTP 响应,不再超时; - SDK 示例脚本可以完整返回流式结果;
- Claude Code、Codex 能正常登录并连续完成多轮任务,没有反复重试。
其他方案
- 如果网页端出现 Cloudflare 验证循环而 API 正常,属于浏览器侧问题,见《ChatGPT Cloudflare 验证死循环》;账号层面的限制见《Claude 地区限制与账号停用排查》;
- 客户端不支持 TUN 或规则功能较弱时,可以在《机场客户端大全》中换一个合适的客户端;
- 主要用于编程助手的用户,可以参考 Codex 网络环境 与 AI 使用场景 的说明,了解对节点稳定性的要求;
- 请遵守各服务的使用条款,不要通过他人账号或转售接口规避地区限制。
常见问题
设置了 HTTPS_PROXY,Claude Code 还是连不上?
先确认是在设置变量之后重新启动的 Claude Code,它只在启动时读取一次环境变量。再确认代理地址以 http:// 开头且端口正确,地址无法解析时 Claude Code 会在启动时报错。官方文档还说明 Claude Code 不支持 SOCKS 代理。
为什么 curl 返回 401,算不算连上了?
算。401 表示请求已经到达服务器,只是没有带 API Key。真正的网络问题通常表现为超时、连接被重置或无法解析域名。
返回 429 是网络问题吗?
不是。429 表示请求频率或额度超出限制,应降低并发、等待后重试,或检查账户额度,换节点无法解决。
环境变量每次都要重新设置吗?
上面的写法只对当前窗口有效。可以写进 shell 配置文件(如 ~/.zshrc、~/.bashrc),Windows 可在“系统属性 → 环境变量”中添加用户变量;Claude Code 也可以在 ~/.claude/settings.json 的 env 字段中设置。