RuntimeError: Response content longer than Content-Length`, raised inside uvicorn while `BaseHTTPMiddleware.__call__` is re-sending a body chunk. The client has already received a `200` status l

用户在 Open WebUI 中使用 OpenAI 兼容的 TTS 后端( AUDIO_TTS_ENGINE=openai ),通过 Docker Compose ( ghcr.io/open-webui/open-webui:main ) 部署单实例,无反向代理。当多个并发请求访问 POST /a

RuntimeError: Response content longer than Content-Length`, raised inside uvicorn while `BaseHTTPMiddleware.__call__` is re-sending a body chunk. The client has already received a `200` status l

RuntimeError: Response content longer than Content-Length`, raised inside uvicorn while `BaseHTTPMiddleware.__call__` is re-sending a body chunk. The client has already received a `200` status l

快速结论:此报错通常出现在 Open WebUI 代理流式响应(如 TTS 音频路由 /api/v1/audio/speech)时,原因是 SecurityHeadersMiddleware 是唯一尚未迁移的 BaseHTTPMiddleware,该中间件在处理流式响应时与 uvicorn 的 content-length 校验发生冲突,导致响应内容长度不一致。优先排查 SecurityHeadersMiddleware 是否正确迁移为纯 ASGI 中间件。

问题场景

用户在 Open WebUI 中使用 OpenAI 兼容的 TTS 后端(AUDIO_TTS_ENGINE=openai),通过 Docker Compose (ghcr.io/open-webui/open-webui:main) 部署单实例,无反向代理。当多个并发请求访问 POST /api/v1/audio/speech 且每次请求使用不同的 input 文本时,TTS 响应会中断,UI 上点击扬声器图标后图标短时间翻转然后复位,无错误提示。

报错原文

Exception in ASGI application
  + Exception Group Traceback (most recent call last):
    ...
    | Traceback (most recent call last):
RuntimeError: Response content longer than Content-Length`, raised inside uvicorn while `BaseHTTPMiddleware.__call__` is re-sending a body chunk. The client has already received a `200` status l

原因分析

可能原因:Open WebUI 中 SecurityHeadersMiddleware 是唯一仍在使用的 BaseHTTPMiddleware,其余中间件已迁移至纯 ASGI 模式(位于 open_webui/utils/asgi_middleware.py)。BaseHTTPMiddleware 在处理流式响应时已知存在缺陷,尤其是在重新发送 body chunk 时与 uvicorn 的 content-length 校验冲突,导致 RuntimeError: Response content longer than Content-Length。此问题间歇性出现,在并发 ≥ 8 时更容易触发(用户报告约 1/93 的实际请求失败率)。

环境排查

  • Open WebUI 版本:v0.9.6(镜像 digest sha256:7f1b0a1a50cfbac23da3b16f96bc968fd757b26dc9e54e93813d61768ea9184e,构建于 2026-06-02)
  • 部署方式:Docker Compose,无反向代理
  • TTS 引擎:OpenAI 兼容后端(AUDIO_TTS_ENGINE=openai
  • 安全头环境变量:CACHE_CONTROLHSTSPERMISSIONS_POLICY 等均未设置,set_security_headers() 返回空字典 {}
  • 数据库:SQLite(未设置 DATABASE_URL

解决步骤

  1. 检查 SecurityHeadersMiddleware 实现方式:确认该中间件是否仍基于 BaseHTTPMiddleware,而非纯 ASGI 中间件。打开 open_webui/utils/asgi_middleware.py 查看实现。
  2. 升级 Open WebUI 到包含修复的版本:Issue 作者已提交 PR #26924,将 SecurityHeadersMiddleware 转换为纯 ASGI 中间件,安全头逻辑不变。可优先尝试拉取该分支测试(如需编译运行),或等待官方 dev 分支合并后使用 ghcr.io/open-webui/open-webui:dev 镜像。
  3. 临时规避措施:如果无法立即升级,可尝试降低并发请求量,或为 TTS 路由添加请求排队逻辑,减少同时触发响应流冲突的概率。
  4. 确认所有环境变量:确保 AUDIO_TTS_ENGINE 等配置正确,并验证数据库中的 audio 配置键为空({}),避免残留配置干扰。

验证方法

部署修复后的版本(PR #26924 分支或后续 dev 镜像),使用相同的高并发场景(并发 ≥ 8,不同 TTS 输入文本)测试 POST /api/v1/audio/speech 路由,确认不再出现 RuntimeError: Response content longer than Content-Length 报错,且所有 TTS 音频响应正常返回。可通过 TTS 后端日志确认每次请求都成功完成,问题仅出现在 Open WebUI 的转发路径中。

参考来源

open-webui/open-webui #26922

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 12486

发表回复

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