
fix(responses-api): raise APIError on in-stream error events; widen ErrorEventError.param to accept dict
快速结论:在使用 LiteLLM Responses API 流式模式时,如果遇到速率限制或上下文超长等错误,这些错误可能不会回调路由器的重试/回退机制,而是被静默处理成普通的流式数据块。优先检查 litellm/responses/streaming_iterator.py 中的 raise-on-error 逻辑以及 ErrorEventError.param 字段类型声明。
问题场景
用户在调用 LiteLLM Responses API 的流式接口时,Provider 返回了流中错误事件(type: "error" 或 type: "response.failed"),但当前实现没有触发 Python 异常,而是将错误事件作为普通流式块发回给调用者。导致 LiteLLM Router 不会执行冷启动、重试或回退机制,且如果 error.param 字段是字典类型,Pydantic 还会抛出 ValidationError 并被吞掉,使错误检查逻辑完全失效。
报错原文
# 没有直接的 Python 异常抛出,但观察到的现象:
# - 速率限制/上下文超长错误被作为普通流式块返回
# - 如果 error.param 是 dict 类型,可能在某处静默抛出并吞掉:
# ValidationError: 1 validation error for ErrorEventError
# param
# str type expected (type=type_error.str)
# - 路由器不会触发 fallback/retry/cooldown
原因分析
两个 bug 共同作用导致路由器回退机制失效:
- 无异常抛出逻辑:
ResponsesAPIStreamingIterator.__anext__中,_process_chunk只做数据转换,不会对ErrorEvent和ResponseFailedEvent触发 raise。 - Pydantic 类型校验错误:
ErrorEventError.param声明为Optional[str],但某些 Provider 发送error.param时为dict类型,导致 PydanticValidationError在transform_streaming_response中被吞掉,错误事件被丢弃。
环境排查
- LiteLLM 版本:建议更新至包含此修复的最新版本
- 相关文件:
litellm/types/llms/openai.py中ErrorEventError.param字段类型 - 相关文件:
litellm/responses/streaming_iterator.py中BaseResponsesAPIStreamingIterator类 - 测试文件:
tests/llm_responses_api_testing/test_base_responses_api_streaming_iterator.py - 确认使用的 Provider 是否在流式错误事件中返回
error.param为字典类型
解决步骤
- 优先尝试: 确认并更新 LiteLLM 至包含此修复的版本。修复包含两个核心修改:
- 在
litellm/types/llms/openai.py中将ErrorEventError.param从Optional[str]改为Optional[Union[str, Dict[str, Any]]] - 在
litellm/responses/streaming_iterator.py中BaseResponsesAPIStreamingIterator类添加_maybe_raise_for_error_event方法,并在__anext__和__next__中调用
- 在
- 如果手动修补,按以下顺序操作:
- 先修改
litellm/types/llms/openai.py中的类型声明(零逻辑变更) - 再修改
litellm/responses/streaming_iterator.py,添加_maybe_raise_for_error_event方法 - 在
__anext__和__next__中_process_chunk返回非 None 值后立即调用该方法
- 先修改
- 运行现存的测试套件确认不变性,可扩展
test_base_responses_api_streaming_iterator.py添加模拟测试:模拟一个 yieldErrorEventSSE 载荷的迭代器,断言迭代时抛出litellm.APIError而非返回值。 - 状态码映射规则(
_maybe_raise_for_error_event中的逻辑):error.code以 “rate_limit” 开头 -> 429error.code为整数 -> 直接使用- 其他 -> 500
验证方法
确认方法:
- 运行扩展后的测试套件,确保模拟流式错误事件的测试通过并抛出
litellm.APIError - 使用真实 Provider(如返回 dict 类型
error.param的 Provider)发起流式请求,确认速率限制/上下文超长错误现在会正确触发路由器的回退/重试/冷起动机制 - 检查路由器的负载均衡日志,确认发生错误事件后不再被静默处理



