fix(responses-api): raise APIError on in-stream error events; widen ErrorEventError.param to accept dict

用户在调用 LiteLLM Responses API 的流式接口时,Provider 返回了流中错误事件( type: "error" 或 type: "response.failed" ),但当前实现没有触发 Python 异常,而是将错误事件作为普通流式块发回给调用者。导致 LiteLLM R

fix(responses-api): raise APIError on in-stream error events; widen ErrorEventError.param to accept dict

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 共同作用导致路由器回退机制失效:

  1. 无异常抛出逻辑ResponsesAPIStreamingIterator.__anext__ 中,_process_chunk 只做数据转换,不会对 ErrorEventResponseFailedEvent 触发 raise。
  2. Pydantic 类型校验错误ErrorEventError.param 声明为 Optional[str],但某些 Provider 发送 error.param 时为 dict 类型,导致 Pydantic ValidationErrortransform_streaming_response 中被吞掉,错误事件被丢弃。

环境排查

  • LiteLLM 版本:建议更新至包含此修复的最新版本
  • 相关文件:litellm/types/llms/openai.pyErrorEventError.param 字段类型
  • 相关文件:litellm/responses/streaming_iterator.pyBaseResponsesAPIStreamingIterator
  • 测试文件:tests/llm_responses_api_testing/test_base_responses_api_streaming_iterator.py
  • 确认使用的 Provider 是否在流式错误事件中返回 error.param 为字典类型

解决步骤

  1. 优先尝试: 确认并更新 LiteLLM 至包含此修复的版本。修复包含两个核心修改:
    • litellm/types/llms/openai.py 中将 ErrorEventError.paramOptional[str] 改为 Optional[Union[str, Dict[str, Any]]]
    • litellm/responses/streaming_iterator.pyBaseResponsesAPIStreamingIterator 类添加 _maybe_raise_for_error_event 方法,并在 __anext____next__ 中调用
  2. 如果手动修补,按以下顺序操作:
    • 先修改 litellm/types/llms/openai.py 中的类型声明(零逻辑变更)
    • 再修改 litellm/responses/streaming_iterator.py,添加 _maybe_raise_for_error_event 方法
    • __anext____next___process_chunk 返回非 None 值后立即调用该方法
  3. 运行现存的测试套件确认不变性,可扩展 test_base_responses_api_streaming_iterator.py 添加模拟测试:模拟一个 yield ErrorEvent SSE 载荷的迭代器,断言迭代时抛出 litellm.APIError 而非返回值。
  4. 状态码映射规则(_maybe_raise_for_error_event 中的逻辑):
    • error.code 以 “rate_limit” 开头 -> 429
    • error.code 为整数 -> 直接使用
    • 其他 -> 500

验证方法

确认方法:

  • 运行扩展后的测试套件,确保模拟流式错误事件的测试通过并抛出 litellm.APIError
  • 使用真实 Provider(如返回 dict 类型 error.param 的 Provider)发起流式请求,确认速率限制/上下文超长错误现在会正确触发路由器的回退/重试/冷起动机制
  • 检查路由器的负载均衡日志,确认发生错误事件后不再被静默处理

参考来源

BerriAI/litellm #31786 – fix(responses-api): raise APIError on in-stream error events; widen ErrorEventError.param to accept dict

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 12528

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注