快速结论:当你使用 LiteLLM 的异步 s3_v2 日志回调上传日志、且 S3 端返回 HTTP 500/503 时,会出现 [Bug]: s3_v2 async 500/503 retries are bypassed by HTTPStatusError 这类重试被绕过的问题。优先排查 LiteLLM 版本,该问题已被确认在新版本中修复。
适用环境:LiteLLM 1.100.0 可复现该缺陷;Issue 复现环境为 Python 3.13,验证修复时使用 Python 3.12;修复版本为 v1.102.0 起(回归测试在 v1.102.1 验证)。不涉及真实 AWS 凭据或 S3 端点。
最快修复方案:升级 LiteLLM 到 v1.102.1(或至少包含 #40187 的 v1.102.0 及以上版本)。修复提交更改了 signed_put(),使其在 httpx.HTTPStatusError 时返回响应而非抛出异常,从而让异步 500/503 重试逻辑正常生效。
注意事项:升级后 403 响应也会被重试(使用新签名处理过期凭据),这是 #40187 的有意行为变化,旧测试中“403 不重试”的预期已过时;如果你在最新版本仍遇到该问题,需要提供版本号和复现步骤。
问题场景
用户在使用 LiteLLM 作为代理或库时,启用了 s3_v2 回调(S3 日志上传),配置了 s3_callback_params(如 s3_bucket_name、s3_region_name、访问密钥等)。在异步上传过程中,如果 S3 返回 HTTP 500 或 503,期望代码进行最多三次 PUT 重试(退避 1s/2s),但实际上第一次失败就放弃了上传,并记录了 S3Logger 回调失败。
报错原文
[Bug]: s3_v2 async 500/503 retries are bypassed by HTTPStatusError
litellm.llms.custom_httpx.http_handler.MaskedHTTPStatusError: Server error '503 Service Unavailable'
原因分析
在 LiteLLM 1.100.0 中,异步上传路径 AsyncHTTPHandler.put() 在收到 500/503 时抛出 MaskedHTTPStatusError,该异常在返回响应之前就被抛出,导致 async_upload_data_to_s3() 中的重试循环和状态检查被跳过,直接进入外层 except Exception,立即记录 S3Logger 回调失败。同步路径不受影响,因为 HTTPHandler.put() 会返回错误响应而不抛出异常,所以同步重试循环正常工作。
环境排查
- 确认 LiteLLM 版本,1.100.0 存在该问题,v1.102.1 已无法复现。
- 确认 Python 版本,Issue 初始复现使用 Python 3.13,验证修复时使用 Python 3.12。
- 确认是否启用了异步
s3_v2回调,以及是否配置了s3_callback_params。 - 确认 S3 端是否返回 500/503,或是否存在临时不可用。
- 确认是否使用了包含 #40187 的版本(v1.102.0 起)。
解决步骤
- 将 LiteLLM 从 1.100.0 升级到 v1.102.1,或至少升级到包含 #40187 的 v1.102.0 及以上版本。
- 如果无法立即升级,可关注
litellm/integrations/s3_v2.py中signed_put()的实现,确认其是否在httpx.HTTPStatusError时返回error.response而不是继续抛出异常。 - 升级后重新运行原有触发 500/503 的场景,观察异步上传是否按预期重试。
验证方法
使用 Issue 中提供的可移植回归测试(模拟 503 后返回 200),在修复版本上运行 LITELLM_LOCAL_MODEL_COST_MAP=True python -m pytest test_s3_upload_retries.py -q,确认 500/503 重试案例在异步和同步模式下均通过,包括后续尝试恢复、重试耗尽以及退避期间取消的测试。Issue 验证者在 Python 3.12 上得到 22 passed、4 failed,其中剩余 4 个失败为 403 不重试的旧预期,属于已过时测试预期。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug] Client sends empty _meta:{} on every request; strict servers (Meta Ads MCP) reject with HTTP 400](https://www.chat-gpts.plus/wp-content/uploads/2026/10/3473-a9bea40e-768x403.jpg)

![[Bug]: timestamp_granularities=["segment", "word"] only returns the last granularity for Whisper](https://www.chat-gpts.plus/wp-content/uploads/2026/10/35937-6543e9b1-768x403.jpg)