记录一下那天晚上的排查过程。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,日志里能看到回退事件与耗时。
回退按异常类型和重试次数触发,配置写对但条件没满足一样不生效,验证时要制造真实的失败。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
