快速结论:该问题通常出现在自托管 Dify 的 Agent 应用里,当同一轮对话中模型并发调用多个工具(parallel tool calls)时,思考面板(thought panel)会出现一直转圈、结果为空或重复的条目。优先排查前端聊天 hook 的 thought 合并逻辑,而不是工具本身或后端执行环节。
适用环境:Issue 中确认的环境为 Dify 1.17.1、Self Hosted(Docker)。其余操作系统、Python、CUDA、显卡、依赖版本在 Issue 中没有明确证据,不做补充。
最快修复方案:暂无确认的一步修复方案。Issue 中给出的方向是前端补丁(可优先尝试):在两个 onThought 处理函数中,按 id 在 agent_thoughts 中查找已有条目(findIndex),找到则用 mergeStreamingThought 原地合并,找不到再追加新条目。
注意事项:上述前端补丁是 Issue 评论中的推测性修复建议,未在 Issue 中标注为已验证,也未说明是否已合入主线,需要维护者确认。修复前请先备份或使用独立分支,升级后注意改动可能被覆盖。
问题场景
用户在自托管 Dify 中创建一个 Agent 应用,并配置至少两个可独立调用的查询工具。发送一条会促使模型在同一轮内并发调用两个工具的���息(任何会发出 parallel tool calls 的模型均可复现)。在回答仍在流式输出时打开思考面板,即可看到异常条目。该问题在消息结束后依然会残留空的重复条目。
报错原文
Agent app: parallel tool calls leave permanently spinning, empty tool entries in the thought panel
具体表现为:N 个并发工具调用在流式过程中会使面板出现约 2N 个条目,较早的并行工具条目持续显示 loading spinner 且展开结果为空,实际结果以额外追加的重复条目形式出现。
原因分析
Issue 评论分析认为这是前端合并逻辑的 bug,核心依据如下:
- 后端为每个工具调用创建一条 thought 记录。工具结果返回时,按
tool_call_id找到对应行、更新其 observation,并重新发布相同的 thought id,因此后端能够正确定位到目标行。 - 前端聊天 hook 只把新到达的 thought 与
agent_thoughts中的最后一条条目比较合并。如果 id 与最后一条不匹配,就直接作为新条目追加(onThought位于web/app/components/base/chat/chat/hooks.ts,发送消息处理逻辑中也存在同样写法)。 - 以两个并发调用为例,列表为
[A(call), B(call)]。A 的结果返回时,其 id 不是最后一条的 id,于是被追加为第三条;原始 A 行始终拿不到 observation,因此一直转圈且结果为空。消息结束后 spinner 停止,但重复的空条目仍然保留。
以上分析来自 Issue 评论,评论者说明自己未实际复现,因此这属于可能原因,需维护者确认。
环境排查
- 确认 Dify 版本:Issue 报告为 1.17.1,可对照自身部署版本是否一致或相近。
- 确认部署方式:Issue 为 Self Hosted(Docker),云端部署是否受影响未在 Issue 中说明。
- 确认前端资源版本:检查
web/app/components/base/chat/chat/hooks.ts中两个onThought处理逻辑是否仍为“仅与最后一条条目合并”。 - 确认应用类型为 Agent,且工具可在同一轮中被并发调用。
- Python、CUDA、PyTorch、显卡、依赖版本在 Issue 中无证据,不属于本问题的排查重点。
解决步骤
- 先按 Issue 的复现步骤确认问题:使用至少两个可独立调用的查询工具,发送一条触发同一轮并发工具调用的消息,在流式输出期间打开思考面板,观察是否出现转圈空条目与重复追加条目。
- 检查
web/app/components/base/chat/chat/hooks.ts中的onThought与发送消息处理逻辑,确认入站 thought 只与agent_thoughts最后一条比较合并(可优先尝试的定位点)。 - 按 Issue 建议修改两处逻辑:先用
findIndex按id在agent_thoughts中查找已有条目;找到则用mergeStreamingThought原地合并,未找到再 push 新条目。两处onThought处理函数都需要改。 - 重新构建前端并部署修改后的版本。
- 按相同复现步骤再次测试,重点观察原始工具条目是否获得自己的 observation、是否还出现重复条目。
注意:上述修改属于 Issue 评论中的推测性方案,Issue 中未记录已验证的补丁或正式修复提交,落地前建议先在测试环境验证。
验证方法
在 Agent 应用中发送一条会触发同一轮并发调用两个工具的消息,流式过程中打开思考面板:正常情况下条目数应与工具调用数一致(N 个而非约 2N 个),每个工具条目在结果返回后结束转圈并显示对应 observation,且消息结束后不残留空白的重复条目。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![Misc. bug: stack buffer overflow in clip_encode MiniCPM-V position buckets via malicious mmproj (bucket_coords_h[1024] written for i < pos_h](https://www.chat-gpts.plus/wp-content/uploads/2026/10/27166-45771059-768x403.jpg)