首页 › API 调用超时
OpenAI / Anthropic API 总超时,网页却正常,该怎么排查
直接用官方SDK调用OpenAI或Anthropic的API时,经常收到APIConnectionError、Connection error或者Request timed out,可是打开网页版聊天窗口测试同样的问题却完全正常。很多人第一反应是账号或者网络被限制了,但更常见的原因,其实藏在两条完全不同的通道和两种完全不同的超时逻辑里。
页面更新:2026-08-25
表现:网页聊天很正常,API调用却总报错
如果你是直接拿官方SDK或者一段简单的Python/Node脚本去调用OpenAI或者Anthropic的接口,大概率见过这几种报错:APIConnectionError、Connection error,或者干脆是Request timed out。奇怪的是,打开浏览器,登录网页版聊天界面,输入同样的问题,回复照样能正常出来,一点问题都没有。
这种一边能用一边不能用的表现,很容易被误判成账号异常或者是被平台限制了访问,于是花大量时间去查账号状态、查计费、查是不是被封,结果查了一圈发现账号本身完全正常。真正值得先弄清楚的,是网页版和API走的到底是不是同一条路。
实际发生的事一:聊天网页和调用接口,走的根本不是同一条路
网页版聊天界面和用于调用模型的API接口,几乎总是挂在不同的主机名下,请求的形态也完全不一样:网页那一路往往是浏览器发起的、带着完整会话状态的长连接或流式推送,中间可能还经过一层专门给网页用的加速或缓存节点;而直接调用API,走的是SDK发出的独立HTTPS请求,没有浏览器那一整套额外链路帮忙扛连通性。
正因为两条路的主机名、协议细节和中间经过的节点都不一样,一条路能通完全不能保证另一条路也能通。网页版能正常打开,只能证明访问聊天页面这件事目前是通的,不能反过来推出调用接口这件事也一定是通的,这是判断这类问题最容易踩的第一个坑。
实际发生的事二:SDK的超时,往往比一次长回答需要的时间短得多
调用API还有一个不容易被注意到的细节:大多数SDK都有自己的默认超时设置,而这个超时设置的初衷是防止脚本永远卡住,并不是按照一次内容较长的回答需要多久来设计的。如果模型正在生成一段比较长的内容,又恰好赶上链路某个环节稍微慢一点,很容易在还没收到完整回复之前,就先撞上SDK自己设的超时。
更容易让人摸不着头绪的是,流式(stream)调用和非流式调用在同样的网络条件下,表现经常完全不同。流式调用会不断吐出一小块一小块的内容,链路上的中间设备很少会把这种一直有数据流动的连接当成空闲连接掐断;非流式调用则要等模型把整段内容生成完,才会一次性把结果发回来,这段看起来什么都没发生的等待时间,一旦超过某个环节的超时阈值,就会直接报错,哪怕模型那边其实正在正常工作。所以同一份代码,把非流式改成流式测试一遍,往往能看出问题到底出在哪一段。
一分钟自查:先辨清是连不通,还是等太久
不用急着改代码,先做一个简单到十秒钟就能出结果的测试:打开终端,直接用curl请求API对应的域名,完全不经过SDK里任何超时或重试设置。
如果curl本身也直接连不上,或者卡很久一点响应都没有,那基本可以确定问题出在链路连通性上,跟SDK的参数没多大关系,继续调大超时时间也没用。如果curl这边能陆陆续续收到数据,只是感觉比预期慢一些,那问题更可能出在SDK或者客户端自己设置的超时时间太短,链路本身其实是通的。这一步测试的价值在于,它能在动手改代码之前,先把网络问题和超时设置问题这两种完全不同的方向分开,避免在错误的方向上反复折腾。
处理次序:按这个次序一步一步来
确认过上面两个实际发生的事之后,建议按这个顺序排查,而不是东一下西一下地乱试:
- 先用
curl直接测试API域名的基础连通性,不带任何客户端设置。 - 确认浏览器里配置的代理或者插件,是不是只对浏览器生效——本机终端和后台脚本默认走的是完全独立的另一条路,不会因为网页能打开就自动跟着通。
- 把同一个请求分别用流式和非流式各测一次,看看是不是只有非流式才会超时,借此判断问题是不是出在等待太久这一类原因上。
- 检查代码里给SDK设置的超时数值,是不是明显短于一次正常长回答需要的时间。
- 如果确认是链路本身不稳定,换一条对整台机器都生效的通道再完整测一次,而不是只在浏览器里换。
- 换通道之后,如果网页和API都能稳定跑通,基本可以确认之前的问题出在链路连通性上,不是账号或者代码逻辑的问题;如果换了通道问题依旧,再回头检查代码里的超时和重试逻辑。
本机跑的脚本有自己的网络栈,浏览器插件里的代理对它不生效。Windows 端由系统层接管出站,终端里跑的脚本和长驻的调用进程都被一并覆盖,不必在每个项目里重复写代理参数。
安卓与 Windows 客户端已上线,macOS 与 Linux 开发中。iPhone 暂无原生客户端。出口服务器的访问日志是关闭状态;会话记录表里没有目标地址、域名或 URL 字段。注册即可使用永久免费套餐,按月发放流量额度。客户端在连上之后会做一次真实探测,探测不通就不显示已连接。
据 IETF RFC 6298(TCP 重传定时器)所定义,重传超时的初始值按 1 秒计算,并且设有下限——一次连不上的尝试本身就会耗掉可观的时间,这跟你在代码里设的超时是两层各自独立的计时。
常见问题
为什么打开网页版聊天没问题,调用API却一直报Connection error?
网页聊天和API走的是两个完全不同的主机名和流量形态,网页能通只能说明访问聊天页面那条路是通的,并不代表专门用于调用模型接口的那条路也一样能通,所以两者的连通结果经常不一致。
APIConnectionError和Request timed out是同一个问题吗?
不是,APIConnectionError通常表示SDK在建立连接或收到响应之前就直接失败或被中断,Request timed out则更多是等待时间超过了本地设置的超时阈值,两者指向的排查方向不同,分清楚可以少走很多弯路。
为什么流式(stream)调用有时候不超时,非流式反而总超时?
流式调用会持续吐出小块数据,中间链路很少会把它当成空闲连接掐断,而非流式调用要等模型把整段回答生成完才一次性返回,如果这段等待时间超过了链路或SDK的超时设置,就会在还没收到任何内容的情况下直接报错,这就是为什么同一个问题在两种调用方式下表现完全不同。
我在浏览器里设置了代理,为什么本机跑的Python脚本还是超时?
只在浏览器里生效的代理插件或系统代理,通常只接管浏览器自身发出的请求,本机命令行或脚本进程发出的连接默认并不会经过那条代理路径,所以浏览器能通和脚本能通是两件需要分别验证的事。
怎么用十秒钟的方法快速区分是网络问题还是超时设置问题?
直接在终端里用curl之类的工具请求API域名,完全绕开SDK的超时参数,如果curl本身也连不上或者长时间没有任何响应,说明是链路连通性问题;如果curl能陆续收到数据只是比较慢,那更可能是SDK或客户端的超时设置设得太短,而不是网络完全不通。
调大SDK里的timeout参数就能解决所有超时问题吗?
调大超时参数只能解决等待时间不够这一种情况,如果根本原因是链路本身不稳定或者中途被中断,单纯拉长超时时间只会让脚本挂着等更久,最终还是拿不到结果,所以要先用连通性测试确认问题类型,再决定要不要改超时参数。
为什么同样的代码,今天能用明天又开始超时?
这类反复出现的超时,更多时候和当时那条链路的稳定性有关,而不是代码本身发生了变化,如果调用API的那条路径本身就不稳定,时好时坏是很正常的表现,建议在出问题的时间点重复做一次连通性测试再下结论。
换了一个能覆盖整机的通道,是不是就能保证API一定连得上?
这类工具能做的是把本机包括终端和后台脚本的流量一起纳入同一条链路,不会出现网页能走脚本不能走这一类割裂,但它本身不能对任何第三方平台的可用性做绝对保证,实际效果仍然取决于当时那条链路本身的连通情况。
继续阅读:首页 · 模型下载中断 · 账号风控与封号 · 编辑器里的 AI 断线