Agent app: parallel tool calls leave permanently spinning, empty tool entries in the thought panel

该问题通常出现在自托管 Dify 的 Agent 应用里,当同一轮对话中模型并发调用多个工具(parallel tool calls)时,思考面板(thought panel)会出现一直转圈、结果为空或重复的条目。优先排查前端聊天 hook 的 thought 合并逻辑,而不是工具本身或后端执行环节

快速结论:该问题通常出现在自托管 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 中无证据,不属于本问题的排查重点。

解决步骤

  1. 先按 Issue 的复现步骤确认问题:使用至少两个可独立调用的查询工具,发送一条触发同一轮并发工具调用的消息,在流式输出期间打开思考面板,观察是否出现转圈空条目与重复追加条目。
  2. 检查 web/app/components/base/chat/chat/hooks.ts 中的 onThought 与发送消息处理逻辑,确认入站 thought 只与 agent_thoughts 最后一条比较合并(可优先尝试的定位点)。
  3. 按 Issue 建议修改两处逻辑:先用 findIndex 按 id 在 agent_thoughts 中查找已有条目;找到则用 mergeStreamingThought 原地合并,未找到再 push 新条目。两处 onThought 处理函数都需要改。
  4. 重新构建前端并部署修改后的版本。
  5. 按相同复现步骤再次测试,重点观察原始工具条目是否获得自己的 observation、是否还出现重复条目。

注意:上述修改属于 Issue 评论中的推测性方案,Issue 中未记录已验证的补丁或正式修复提交,落地前建议先在测试环境验证。

验证方法

在 Agent 应用中发送一条会触发同一轮并发调用两个工具的消息,流式过程中打开思考面板:正常情况下条目数应与工具调用数一致(N 个而非约 2N 个),每个工具条目在结果返回后结束转圈并显示对应 observation,且消息结束后不残留空白的重复条目。

参考来源

langgenius/dify #43823

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29357

发表回复

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