多模型路由报错怎么解决

接入与开发

给搭多模型路由的开发者一份报错速查:按报错类型分层定位,从请求形状、渠道配置到上游限流逐层缩小范围。

路由层一出问题,报错往往长得一样:有时是 400,有时是 502,有时干脆没返回。线上只看到一句「请求失败」,很难判断是自己的拼装逻辑、某个渠道的配置,还是上游在限流。这篇按「报错类型 → 逐层定位 → 收敛动作」给一条排错路径,让你在日志里先分清是哪一层出的事,再决定改代码还是换渠道。

路由层一出事,报错信息常常长得一样:有时是 400,有时是 502,有时干脆连接被断。线上只看到一句「请求失败」,很难立刻判断是自己的拼装逻辑写错了、某个渠道配置漂了,还是上游正卡在限流。先别改代码,先给报错归个类,再一层一层往里剥。

这篇给搭多模型路由的开发者一条排错顺序:按报错类型分层定位,从请求形状、渠道配置到上游限流逐层缩小范围,最后把偶发问题变成能看出来的可观测问题。判断标准会写清楚,什么情况下这套分层不适用也会点明。

先把报错分成四类,别一上来就改代码

路由报错最怕混着修。同一个「请求失败」,可能是字段拼错,也可能是渠道挂了。先按下面四类归位,归类错了,后面怎么改都是白费。归类的依据是报错内容加复现规律,不是状态码本身。

报错类型典型表现先改哪里
请求形状类字段缺失、类型不符、多包一层本地拼装逻辑
鉴权与权限类Key 无效、渠道未授权、模型不在可用清单渠道配置
上游限流与容量类间歇性失败,同一请求重试可能成功分流规则或上游
传输与网关类超时、连接被断、网关返回非业务错误链路中间环节
  • 请求形状类:拿同一条请求换个模型也照样报,基本就是拼装逻辑的锅
  • 鉴权与权限类:换回自己验证过的 Key 就通,说明问题在渠道的授权或模型清单
  • 上游限流与容量类:低峰期正常、高峰期冒错,先怀疑分流策略而不是代码
  • 传输与网关类:内容完全一样却时通时不通,问题常在超时设置或中间转发

逐层定位:从自己这层开始往外剥

分层的目的不是多绕几步,而是每一步都能拿到二选一的结论:问题在里层还是外层。按下面顺序走,一旦某层通过了,就说明它往里都正常,继续往外剥就行。

  1. 固定一条最小请求单模型、非流式、最短提示词,先确认路由逻辑本身没毛病;这条都过不了,别急着测别的渠道
  2. 绕开路由直连单一渠道直连通了说明问题在分发规则,不通说明在渠道配置或上游;这一步把「代码问题」和「渠道问题」分家
  3. 对照各渠道的参数写法同一个模型在不同渠道,模型名、路径、必填字段可能不同;逐项对照,别拿一个渠道的写法套所有渠道
  4. 看失败的时间分布只在高峰失败指向限流,只在某个渠道失败指向单渠道故障,只在长请求失败指向超时

第三层最容易漏:不同渠道对同一个模型的命名和参数要求未必一致,映射表里对不上的时候,报错往往被归成「请求形状类」,实际改的却是配置。这一层对完仍旧不通,再去看上游状态。

路由规则本身的检查清单

如果前面已经确认故障在分发规则这一层,就按清单逐条过。检查重点不是规则写得多漂亮,而是它有没有制造回环、有没有只测了一半、有没有让慢渠道拖累快渠道。

  • 映射表里模型名与各渠道可用名是否一一对上,改名或下架后有没有同步
  • 重试与降级是否成环:A 失败转 B、B 失败又转回 A,会把一个错误放大成一片
  • 流式与非流式是否走了不同分支,只测一种容易漏掉另一种的报错
  • 超时与并发上限是否按渠道分别设置,全局一个值会把慢渠道的问题传染给快的
  • 同一组固定请求在改动前后各跑一遍,确认没把别的渠道带坏

并发与超时的具体参考值没法一刀切,跟你的请求长度、渠道响应速度都有关。要横向对比各渠道的实际表现,到 、/tools/speed-test 这类站内工具页看当时的数字,再决定按渠道怎么分档。

定位之后:把偶发问题变成可观测问题

排错排到最后,最常见的结局是「偶尔还会崩,但抓不到」。这时候问题不在代码,而在日志记的信息不够。日志里至少要有渠道标识、模型名、状态码和耗时,缺一项,事后就复不了盘。

日志字段用来回答什么
渠道标识失败是否集中在某个渠道
模型名是特定模型的问题还是全量
状态码属于哪一类报错
耗时是超时还是上游直接拒绝
  • 对间歇性失败单独统计计数,别只看整体成功率,偶发错误会被平均值吃掉
  • 把重试次数和最终结果一起记,重试成功也算一次失败信号
  • 同一组固定请求在改动前后各跑一遍,作为回归基线
  • 不确定某个中转渠道值不值得留,先去 /sites 看它的可信度检测记录再决定
  • 需要对照官方价格与模型资料时,到 /price-watch 和资料库页核对当时的数字
下一步把上面的清单保存下来,下次路由报错时按层走一遍,比对着报错猜要快。渠道选择和对比数据可以顺手在站内核对。

常见问题

同一段代码换了个渠道就 400,是路由写错了吗?

多数不是路由分发的问题,而是两个渠道对同一模型的参数要求不同:有的不接受某些字段,有的要求字段嵌套层级不一样。先把请求体原样打到新渠道单独测一次,对照两边的字段说明,再决定在路由层做字段裁剪还是改造调用方。

偶发失败到底算上游问题还是自己的问题?

看失败是否与请求内容相关:同一请求重试能过,多半是限流或上游抖动;每次都挂在同一个模型或同一类长请求上,更可能是自己这层的超时或并发设置不合理。把失败样本按渠道和耗时分开统计,比看整体成功率有用。

降级切到备用渠道后还要不要继续报错?

降级本身应该吞掉错误,但要把切换事件记进日志,否则你会以为备用渠道一直很稳。另外备用渠道的能力和参数未必和主渠道一致,切换后返回结构变了,调用方也得能兼容,这一点要在接入时就验证。

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