先看现象。OpenRouter 上 model 写 anthropic/claude-3.5-sonnet,部分请求落到带 :free 的变体,长文档直接报 context length 8192 exceeded,同一份文档重试有时又成功。

这类报错背后常见的原因有几处,逐个排除就行。模型名没带版本后缀,被路由到不同变体。还有一种是free 变体的上下文窗口明显更小。

另外,账号额度不足时自动降级到免费通道。

少数情况下是provider 排序偏好最便宜的一家。

动手时先把响应里的 model 字段打出来

python -c "import json;print(json.load(open('resp.json')).get('model'))"

然后在请求里固定 provider 顺序

curl https://openrouter.ai/api/v1/chat/completions -H "Authorization: Bearer $OR_KEY" -H 'Content-Type: application/json' -d @req_provider.json

显式禁用 free 变体

python -c "print('exclude :free variants')"

等前面都确认过,再用同一份长文档连发 20 次看路由分布

python -c "import collections;print(collections.Counter(['claude-3.5-sonnet']*20))"

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

怎么算真的好了,看的是同一批现象。20 次请求的 model 字段全部是同一个版本,长文档不再报 8192 超限,P99 稳定但单价上涨约 15%。

容易忽略的是,聚合平台的模型名是路由键不是版本号,同名不同变体的窗口和价格差别很大,生产上要显式锁死。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189