快速结论:发生在 Docker 本地部署的 AnythingLLM 中,当使用流式 LLM 生成长回复时,用户向上滚动鼠标滚轮阅读历史消息,但视图反复被拉回底部。优先排查浏览器前端自动滚动逻辑——核心是流式生成期间是否强制将视口保持到底部,而忽略了用户的手动滚动意图。
适用环境:AnythingLLM Docker 镜像(latest 或近期版本);流式 LLM 提供者;无额外指定 Python、CUDA 版本。
最快修复方案:本地修改前端构建后的 JS 代码(已在 Docker 镜像内测试通过)。具体修改两处:(1) 将自动滚动判断条件从 !isUserScrolling && (isAtBottom || isStreaming) && scrollToBottom(false) 改为 !isUserScrolling && isAtBottom && scrollToBottom(false),移除 || isStreaming;(2) 在聊天历史容器的 onWheel 事件中立即标记用户滚动:if (event.deltaY < 0) setIsUserScrolling(true)。
注意事项:该方案为社区用户测试的本地补丁,并非官方发布更新,修改后需重新构建前端或替换打包文件。补丁仅针对鼠标滚轮向上滚动场景,未覆盖触摸板或触屏操作,但思路一致。官方仓库已标记为 needs info / can't replicate,未明确合并此修复。
问题场景
用户通过 Docker 本地运行 AnythingLLM,使用流式 LLM 提供者(如 OpenAI、Claude 等)。在与 AI 对话时,如果某条回复很长且仍在流式生成中,用户尝试向上滚动鼠标滚轮查看之前的消息,滚动位置会反复被拉回到生成中的回复底部,导致无法正常阅读历史内容。
报错原文
[BUG]: when scrolling up, scrolling jumps
实际表现为:滚动过程中进度不线性,在长提示/回复中尤为明显。用户从底部向上滚动到最后一条回复的开头时,会被直接弹回上一条提示的顶部。
原因分析
可能原因是前端聊天视图的自动滚动逻辑存在缺陷。在流式生成过程中,只要 isStreaming 为 true,代码就会强制执行 scrollToBottom(false),即使检测到了用户手动向上滚动(isUserScrolling 未及时更新)。
社区用户通过分析构建后的 JS 发现,原逻辑为:!isUserScrolling && (isAtBottom || isStreaming) && scrollToBottom(false)。这意味着即便用户已经开始手动滚动,只要流式生成仍在进行,isStreaming 为真就会持续执行“滚动到底部”操作,导致“跳动”。
修复思路:不再因流式状态而强制滚动,只有当用户处于底部(isAtBottom)且未手动滚动时才自动跟随。同时,在鼠标滚轮向上滚动时立即将 isUserScrolling 设为 true,以尽早停止自动跟随。
环境排查
- 确认 AnythingLLM 运行方式:Docker(本地),镜像标签为
latest - 确认 LLM 提供者是否开启流式输出(例如在 OpenAI Provider 中设置
stream: true) - 可尝试使用任意流式生成模型复现(如 GPT-4、Claude 等)
解决步骤
- 连接 Docker 容器:
docker exec -it <容器名或ID> /bin/sh或bash。 - 定位前端构建文件:通常在容器内的
/app/backend/dist或类似路径,找到包含自动滚动逻辑的 JavaScript 文件(文件名因构建而异,可搜索scrollToBottom关键字定位)。 - 备份原文件:
cp <目标文件> <目标文件>.bak。 - 修改两处逻辑:
- 将形如
!isUserScrolling && (isAtBottom || isStreaming) && scrollToBottom(false)的表达式改为!isUserScrolling && isAtBottom && scrollToBottom(false)。 - 找到聊天历史容器的
onWheel事件处理函数,在函数开头增加:if (event.deltaY < 0) setIsUserScrolling(true);。
- 将形如
- 修改后重新构建前端(如果容器内有构建工具)或直接替换打包文件后重启容器:
docker restart <容器名>。 - 注意:更稳健的方式是从源码构建或等待官方修复,直接修改打包文件可能在下一次镜像更新时被覆盖。
验证方法
在修改后打开一个长对话:1. 发送一个预期很长回复的 prompt(例如“详细解释量子力学”);2. 在回复流式生成过程中,立即用鼠标滚轮向上滚动;3. 确认视图不再被强行拉回底部,可以顺畅阅读历史内容;4. 当用户再次滚动到底部或点击“滚动到底部”按钮后,自动跟随应恢复。
参考来源
Mintplex-Labs/anything-llm #5846
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


