记录一下那天晚上的排查过程。config 里给 gpt-4o 配了回退到 claude-3-5-sonnet,主模型返回 500 时请求把错误直接抛给业务,网关日志里没有回退记录,重试次数也是零。

刚开始盯着「重试次数为 0 时不会进入回退」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。回退只对特定异常类型生效。另一种情况是路由配置里没写 fallbacks 段。

不容易想到的是,上下文超长类错误不在回退范围。

动手时先打印网关的路由配置

python -c "import yaml;print(yaml.safe_load(open('config.yaml')).get('router_settings'))"

显式配置回退与重试

python -c "print({'fallbacks':[{'gpt-4o':['claude-3-5-sonnet']}],'num_retries':2})"

接着用坏 key 触发主模型失败

curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:4000/v1/chat/completions -H 'Authorization: Bearer bad' -H 'Content-Type: application/json' -d '{"model":"gpt-4o","messages":[{"role":"user","content":"hi"}]}'

剩下的就是看日志里的回退触发链路

docker compose logs --tail 100 litellm | Select-String -Pattern 'fallback|retry'

改完先别撤,确认这几项。主模型失败时请求自动切到备用模型并返回 200,日志里能看到回退事件与耗时。

回退按异常类型和重试次数触发,配置写对但条件没满足一样不生效,验证时要制造真实的失败。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189