网关转发原理

接入与开发

讲清 AI 网关从收到请求到把结果吐回去这条链路里,每一跳在做什么、哪一跳最容易出问题。

调中转站接口时报错,最难的地方是不知道错在哪一段:是自己的代码、网关、上游厂商,还是中间的鉴权与限流。这篇按请求经过的顺序把网关转发拆成几段讲,每段给出你能自己验证的动作,让你在排错时能先定位到跳,而不是靠猜。

调中转站接口报错,最难的地方是不知道错在哪一段:是自己的代码、网关、上游厂商,还是中间的鉴权与限流。这篇按请求经过的顺序,把网关转发拆成几段讲,每段给出你能自己验证的动作,让你排错时能先定位到跳,而不是靠猜。

先给一个整体印象:网关本质上是一个「会改目标地址的中间人」。它收到你的请求,做几件固定的事,再把请求丢给上游厂商,拿到响应后再回给你。中间任何一跳出问题,表现都会不一样,所以定位的关键是分清「这一段谁负责」。

网关转发到底转了什么

网关不改语义,只做三件事:换目标地址、补鉴权头、按需改写请求体里的个别字段(最常见的就是 model 名映射)。请求体和响应体基本原样透传,字段兼容性问题往往出在上游厂商那边,而不是网关自己写错了什么。

还有一件容易被忽略的事:流式响应能不能转发,取决于网关是否按块转发,而不是先把整包缓冲下来。如果是先缓冲再吐,你会看到「等很久,然后一次性全出来」,而不是逐字往外冒。这一点自己发一次流式请求就能感受到,不用猜。

  • 换个角度看,网关只是中转,不会帮你把上游不支持的参数变出来;上游不认,网关也大概率不认
  • 写请求前先确认你要的字段上游到底认不认,别把锅先甩给网关
  • 流式和非流式是两条不同的处理路径,排查时要分开试

一次请求的完整链路,从头数到尾

把链路摊开看:客户端 → 你的域名或网关入口 → 鉴权与额度校验 → 渠道选择(路由)→ 上游厂商接口 → 响应回传。每一跳都可能加延迟,比如 DNS 与 TLS 握手、鉴权查询、路由匹配、上游首字等待。你要做的不是背下这条链,而是出问题时知道该往哪一跳查。

  1. 量自己的基线延迟先到 /tools/speed-test 打一次,把网关和直连的数字放一起比。差得不多说明网关这一跳开销小,差得多就要往中间环节想。
  2. 确认鉴权在哪一跳被拦把返回体的格式拿出来看。网关自己的错误格式通常带 code 和 message 字段,上游原样透传的多半是厂商那边的格式。
  3. 分离渠道问题和代码问题同一个 Key 换另一条线路试一次,能通就说明是渠道,不是你的代码。

几个必须知道的转发机制

这一段说的是几个你迟早会碰到的机制。知道它们怎么运作,报错时你才有判断依据,而不是只能看到一句「请求失败」。

鉴权替换
客户端拿的是网关 Key,网关换成上游 Key 再发出去,所以你的 Key 泄露和上游 Key 泄露是两件事,处理方式也不一样
模型名映射
客户端写的名字和实际调用的模型可以不是同一个,对不上时报错多半卡在这一层
超时与重试
网关有自己的超时阈值,超过了就返回 502 或 504;重试该由客户端做还是网关做,要提前约定清楚
流式透传
SSE 场景下网关如果不逐块转发,你会看到「等很久然后一次性出来」,而不是边生成边出来
现象先怀疑哪一段可以做的动作
返回体是网关自己的错误格式鉴权或路由这一跳核对请求头字段名有没有写错,比如多包了一层 Bearer
报错内容和上游厂商格式一致上游那一跳换一条渠道再试一次,看是否只在某条线路上出现
等很久才一次性出结果流式转发没开或没生效换非流式对比,确认是不是按块转发的问题
客户端超时但服务端其实成功了超时设置不匹配把客户端 timeout 调得比网关阈值长一些再试

按链路定位问题:一份排查顺序

下面这份顺序是从「看一眼就能判断」到「需要动手试」排的。照着走,大部分问题在第一步或第二步就能缩小范围。每条都给了验证动作,不是让你凭感觉猜。

  • 先看返回体:网关自己的错误格式通常带 code 和 message,上游原样透传的多半是厂商格式,先分清是谁在报错
  • 再换直连或换渠道试一次:同一 Key 换另一条线路,能通就说明是渠道问题而不是你的代码
  • 然后查请求头:鉴权头字段名写错、多包了一层 Bearer,都会在鉴权这一跳被拦下来
  • 最后看超时设置:客户端 timeout 比网关短,就会出现你这边超时、服务端其实已经成功的情况

如果你手上有多个中转站要对比,与其一个个手动试,不如先到 /sites 看各家的说明和当前状态,再到 /rankings 核对当时的数字,把范围缩小到两三家再动手调。

什么情况下这套机制不适用

转发这套机制不是万能的,有些场景它天然帮不上忙。提前知道边界,比出了问题再找原因省事。

  • 需要厂商私有能力时,比如某些没有对外暴露的参数,网关透传会直接丢掉,这种情况得走官方通道
  • 对延迟极敏感的场景,多一跳就多一段开销,能不能接受要先测再定,别默认网关一定够快
  • 有数据合规要求时,请求经过第三方网关意味着多一个处理方,选型要看合规口径,而不是只看价格

价格和线路这类会变的数字,别凭记忆判断。到 /price-watch 看当时的记录,再到 /sites 对照各家的条款,两条信息放一起再决定。

下一步光看原理不如自己打一次。先到 /tools/speed-test 量一组网关和直连的延迟,再到 /sites 挑两三家对照说明,你就能把「哪一跳慢、哪一跳报错」这件事落到数字上。

常见问题

网关转发会不会改动我发出去的请求内容?

多数只改鉴权头和 model 字段,正文一般原样透传。但不同实现做法不一样,遇到参数被吃掉的情况,用最小请求体逐个字段试,是最快的验证方式。

为什么直连能通、走网关就不通?

常见就三类:鉴权头格式不匹配、model 名没在网关的映射表里、或者网关到上游那条线路本身有问题。按这个顺序查,基本能定位到具体哪一跳。

流式输出经过网关会变慢吗?

慢不慢取决于网关是不是边收边转。如果它先把整段响应缓冲完再发给你,首字延迟会明显变大;先量一次基线,再判断要不要换线路。

本文依据各平台公开文档与官方公告整理,只做中文归纳;具体做法、参数与限制以官方文档为准。