Agent V2 cannot continue conversation after a run ends with unprocessed tool calls

在 Dify v1.17.0 自托管环境中,Agent V2(dify-agent 运行时)在一次运行以“未处理完的工具调用”结束时(停止、取消或超时),同一会话继续发送新消息会报 Agent V2 cannot continue conversation after a run ends with

快速结论:在 Dify v1.17.0 自托管环境中,Agent V2(dify-agent 运行时)在一次运行以“未处理完的工具调用”结束时(停止、取消或超时),同一会话继续发送新消息会报 Agent V2 cannot continue conversation after a run ends with unprocessed tool calls;优先排查被中断运行残留的悬空 tool call 是否被写入历史。

适用环境:Dify v1.17.0,Self Hosted(Docker),新建 Agent 应用并配置了至少一个可被 Agent 调用的工具。Issue 未提供操作系统、Python、CUDA、显卡等环境信息。

最快修复方案:暂无确认的一步修复方案。Issue 讨论中给出的修复思路(在取消运行的收尾阶段为孤儿 tool call 补写一条“interrupted/cancelled”的 ToolReturnPart,或在下次 agent.run() 前先修复历史中的悬空 tool call)均属推断,尚未被验证或合并。

注意事项:临时可用开新会话绕过,但原会话不会自动恢复。不要直接手改运行时历史,可能引入不一致状态。修复方向涉及 dify-agent 运行时而非经典 fc_agent_runner.py/cot_agent_runner.py 路径,需维护者确认最终方案。

问题场景

在 Dify v1.17.0 中新建 Agent 应用,并配置至少一个可被 Agent 调用的工具后,开启一个新会话并发送会触发工具调用的消息。在工具调用尚未完全处理完成时停止/结束当前 Agent 运行,或运行终止时消息历史里仍存在未完成的工具调用。随后在同一会话中再发送一条用户消息,运行时拒绝该请求,会话无法继续。

报错原文

cannot provide a new user prompt when message history contains unprocessed tool calls

Issue 标题中对应的完整描述为:Agent V2 cannot continue conversation after a run ends with unprocessed tool calls

原因分析

可能原因(基于 Issue 中维护者/机器人给出的代码分析,非官方定论):

1. dify-agent 运行时把每次 agent.run() 调用包在 pydantic-ai 的 capture_run_messages() 中,并在 finally 块里调用 replace_run_history(),因此无论成功、失败、取消还是超时,历史层都会被覆盖为 pydantic-ai 当时捕获到的内容。这意味着被取消的运行残留的“悬空 tool call”也会被持久化。

2. 运行时设计上希望被中断的部分消息保留 state="interrupted" 标记,让 pydantic-ai 在后续运行中从检查点修复并继续。但历史被直接传入 agent.run(message_history=...),Dify 自身没有先做修复步骤。

3. 如果上一次运行在捕获到工具调用的 ModelResponse 之后、任何 ToolReturnPart 写入之前被取消,下一次 agent.run() 就会看到悬空 tool call 并拒绝新的用户消息。该报错字符串未出现在 dify-agentapi 源码中,与 pydantic-ai 自身在“工具调用必须被应答后才能进入新一轮用户回合”这一约束下抛出该错误一致。

4. 另有相关取消问题(如 agent 运行时事件流在取消时未完全封口、stop API 未完全把取消传递到运行中的节点),说明取消路径整体存在竞态窗口,可能扩大此 bug 的触发窗口。

环境排查

  • 确认 Dify 版本是否为 v1.17.0。
  • 确认部署方式是否为 Self Hosted(Docker)。
  • 确认应用类型为 Agent,且配置了至少一个可被调用的工具。
  • 确认触发问题时上一次运行是“停止/取消/超时”等非成功结束,而非正常完成。
  • 确认失败会话的消息历史中助手消息后是否存在未配对结果的 tool call。
  • 确认新建会话是否可以正常继续(Issue 中确认新会话正常)。

解决步骤

  1. 先复现并确认触发路径:在 Agent 应用里发起一次会调用工具的消息,在工具调用未处理完成时停止该次运行,然后在同一会话继续发送新消息,确认是否出现上述报错。
  2. 确认影响范围:验证新建会话能否正常对话(Issue 中反馈可以),以区分是单会话历史损坏还是全局运行时问题。
  3. 临时规避:停止运行后不要在同一会话继续,改为新建会话;或在触发报错后放弃该会话,等待修复版本。
  4. 可优先尝试的方向(尚未验证):等待官方在取消运行的收尾逻辑中为孤儿 tool call 补写“interrupted/cancelled”的 ToolReturnPart,或在下次 agent.run() 之前修复历史中的悬空 tool call。不建议自行手改会话历史或补丁运行时。
  5. 若需要推进修复,可参考该 Issue 的讨论,向维护者确认预期修复路径(该问题影响 dify-agent 新运行时,而非经典 Agent 运行器)。

验证方法

在应用修复或规避后,重复上述复现路径:发起触发工具调用的消息,在工具调用未完成时停止运行,然后在同一会话发送新消息。若不再返回 cannot provide a new user prompt when message history contains unprocessed tool calls,且 Agent 能正常给出回复,则说明问题已解决。由于目前不存在已确认的修复方案,应重点对比“同一会话继续”和“新建会话”两种表现以确认状态。

参考来源

langgenius/dify #41616

langgenius/dify #40765(取消时事件流未完全封口)

langgenius/dify #37755(stop API 取消传播相关)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23324

发表回复

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