Bug: auto-scroll does not follow streamed response with reasoning-parser models, only pops to bottom on completion

该问题出现在 Open WebUI 使用“推理流式输出”模型(如 vLLM 挂 reasoning parser、GLM 混合思考)时,前端自动滚动只在思维链阶段跟随,思维链折叠为答案的那一刻停住,直到整段回答生成完才一次性弹到底部。优先排查前端 Messages.svelte 的 autoScro

快速结论:该问题出现在 Open WebUI 使用“推理流式输出”模型(如 vLLM 挂 reasoning parser、GLM 混合思考)时,前端自动滚动只在思维链阶段跟随,思维链折叠为答案的那一刻停住,直到整段回答生成完才一次性弹到底部。优先排查前端 Messages.svelte 的 autoScroll 判定逻辑,以及推理折叠块在 think→answer 切换时造成的布局跳变。

适用环境:Open WebUI v0.11.0、v0.11.1、v0.11.2(Issue 报告版本);Fedora 44;桌面 Chrome/Firefox 及 Android,LAN 与远程访问均可复现;后端为 OpenAI 兼容的 vLLM(本地),模型为 Qwen3 系列经 --reasoning-parser qwen3 输出 reasoning_content,或 GLM-4.x/5.x 混合思考模型。Issue 未提供 Python、CUDA、PyTorch、显卡版本信息。

最快修复方案:暂无确认的一步修复方案。Issue 为已确认(confirmed issue)的前端逻辑缺陷,正文和评论均未给出维护者验证通过的补丁或配置开关。

注意事项:该缺陷与传输路径无关——同一实例、同一端口、同一设置下,非推理模型(普通 delta.content 流)自动滚动完全正常,可作为判定依据。Issue 也明确说明这不是 #28579(Responses API 路径缺少 autoscroll)的重复,因为本问题发生在标准 chat-completions 路径上;也不是 #29163(推理内容渲染位置错误)的重复,本问题中推理内容显示正常,仅视口不再跟随。在官方修复合入前,用户侧只能通过在生成过程中手动滚动到底部来临时恢复跟随。

问题场景

在 Open WebUI 中开启「Settings → Interface → Response Auto-Scroll」(响应自动滚动),并使用会以独立 reasoning_content 字段流式输出推理过程的模型进行对话。典型配置是 Open WebUI 通过单个 OpenAI-API 连接指向自托管 vLLM,模型经 --reasoning-parser qwen3 输出推理内容,或使用 GLM-4.x/5.x 的混合思考路径。发送一个需要中等或较长回答的提示(例如“写一段约 200 字的故事”)后不要触碰鼠标或触控板。

现象是:思维链阶段视口正常跟随,正好在「思维链折叠块收起、答案开始流式输出」的切换点停止跟随;此后答案持续增长但视口冻结,直到生成结束才一次性跳到最底部。

报错原文

Bug: auto-scroll does not follow streamed response with reasoning-parser models, only pops to bottom on completion

Messages.svelte triggerScroll() re-derives the autoScroll latch on every update from a
~50px distance-from-bottom check (autoScroll = scrollHeight - scrollTop 50px layout jump caused by the
reasoning <details type="reasoning"> block collapsing/reflowing the moment the answer starts.

One bad render tick disables following for the rest of the stream;
only completion events scroll again (the visible "pop to bottom at the end").

原因分析

Issue 作者给出的代码级结论(code-confirmed cause):Messages.svelte 中的 triggerScroll() 在每次更新时都用「距底部约 50px」这一距离判断重新推导 autoScroll 闩锁:

autoScroll = scrollHeight - scrollTop <= clientHeight + 50

这个判断无法区分两种截然不同的情况:一是用户主动向上滚动(应暂停跟随),二是推理折叠块在答案开始的那一刻收起/重排造成的瞬时大于 50px 的布局跳变。

生成过程中布局重排最大的一刻,恰好就是思维链折叠块关闭、文本分块陆续落入、待处理重渲染完成的这个交接点。只要有一个渲染 tick 把 autoScroll 误判为 false,后续整个流式过程都不会再跟随,仅在完成事件触发时重新滚动,表现为结尾处一次性弹到底部。

Issue 评论进一步排除了其他可能:该问题走的是标准 chat-completions 路径(chatCompletionEventHandler),而该路径本身工作正常(非推理模型在相同环境下滚动流畅),因此与 #28579 报告的 Responses API 路径缺少 autoscroll 逻辑不是同一原因。

环境排查

  • 确认 Open WebUI 版本:Issue 报告覆盖 v0.11.0、v0.11.1、v0.11.2;其中复现构建为 v0.11.0(build 01f4282f)。
  • 确认浏览器:桌面 Chrome、Firefox 及 Android 均可复现,可排除单一浏览器兼容性问题。
  • 确认网络路径:LAN 与远程(tailscale)访问现象一致,可排除传输层问题。
  • 确认模型输出形态:后端是否为 OpenAI 兼容接口且模型经 reasoning parser 输出独立 reasoning_content 字段,或属于混合思考模型。
  • 对照验证:在同一实例、同一端口、同一设置下部署一个不经过 reasoning parser、仅流式输出 delta.content 的模型,观察自动滚动是否正常——这是区分“推理流式形态触发”与“通用滚动缺陷”的关键。
  • 确认「Response Auto-Scroll」为开启状态。
  • Issue 未提供 Python、CUDA、PyTorch、显卡、Ollama 版本信息,这些项目无法据本 Issue 判断。

解决步骤

  1. 先做最小化对照实验:在同一实例和端口上,分别用推理流式模型(如经 --reasoning-parser qwen3 的 Qwen3 系列)和非推理模型(仅 delta.content)各发一条长回答请求,观察自动滚动差异。若仅前者失败,即可确认命中本 Issue 描述的前端问�题,而非环境或传输故障。
  2. 确认「Settings → Interface → Response Auto-Scroll」已启用,排除设置被关闭造成的误判。
  3. 在生成过程中手动滚动到底部,观察是否恢复跟随。若恢复,说明正是 autoScroll 闩锁被误置为 false,符合本 Issue 的机制判断。
  4. 关注上游修复:该 Issue 已标记为 bug / confirmed issue 并关闭,但讨论中未提供可用的补丁或配置项。可优先尝试跟踪 dev 分支及后续版本中 Messages.sveltetriggerScroll() 判定的改动。
  5. 在官方修复可用前,避免依赖自动滚动阅读长回答;已知 workspace 或自定义模型配置不影响复现(它们只改提示词和参数,不改变流式形态),因此调整这些配置不是有效的规避手段。

验证方法

按以下条件确认问题是否解决:在开启 Response Auto-Scroll 的情况下,使用经 reasoning parser 输出 reasoning_content 的模型发送长回答请求,全程不触碰滚动;如果思维链折叠块收起、答案开始输出之后视口仍持续跟随直至生成结束,且不再出现结尾一次性弹到底部的现象,即表示修复生效。若手动向上滚动仍能正常暂停跟随、滚回底部后恢复跟随,说明 #19365 / discussion #19372 定义的语义也未被破坏。

参考来源

open-webui/open-webui #29317

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23760

发表回复

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