作用:拦截所有对 LLM的调用,在失败时自动恢复或优雅降级。
1 错误分类 (_classify_error)
将 LLM 异常分为 可重试 和 不可重试 两类:
可重试 (transient/busy):超时、连接错误、5xx 服务器错误、429 限流、以及匹配 _BUSY_PATTERNS 中的关键词(含中文”负载较高””服务繁忙”等)
不可重试:
quota — 账户额度不足(”insufficient_quota””余额不足””额度不足”等)
auth — 认证/授权失败(”invalid api key””forbidden””无权”等)
generic — 兜底,无法归类的一般错误
2 指数退避重试 (Retry with Backoff)
对可重试错误执行最多 3 次 重试,延迟策略为指数退避:
基础延迟 1000ms,每次翻倍,上限 8000ms
如果 LLM 响应头中携带 Retry-After / Retry-After-Ms,则优先使用该值
重试过程中通过 llm_retry 事件向流式输出端发送进度通知
3 熔断器 (Circuit Breaker)
防止持续失败的 LLM 调用拖垮整个系统:
closed (正常) → 连续失败 ≥ 5 次 → open (熔断 60 秒) → 超时后 → half_open (放行一次探测)