Agent re-attempts original tool call after HumanInTheLoopMiddleware edit decision

当 LangChain Agent 使用 HumanInTheLoopMiddleware 且人工选择 edit 决策时,编辑后的工具调用会正常执行,但 Agent 在下一步仍会基于原始工具调用重新规划,导致再次发起原始(未编辑)的工具调用,并可能让最终回复引用旧参数。优先排查中间件修改 AIMes

快速结论:当 LangChain Agent 使用 HumanInTheLoopMiddleware 且人工选择 edit 决策时,编辑后的工具调用会正常执行,但 Agent 在下一步仍会基于原始工具调用重新规划,导致再次发起原始(未编辑)的工具调用,并可能让最终回复引用旧参数。优先排查中间件修改 AIMessage 的方式是否能被 LangGraph 持久化,以及 Agent 是否感知到工具调用已被编辑。

适用环境:Issue 中重现示例使用了 langchain.agents.create_agentHumanInTheLoopMiddlewareInMemorySaverlangchain.tools.toollanggraph.types.Command;模型示例为 gpt-5-nanogpt-4o。Issue 未提供操作系统、Python、CUDA、显卡信息。

最快修复方案:Issue 中作者提交了 PR #33789 及后续补丁,核心思路是不要直接原地修改 AIMessage,而是基于编辑后的工具调用创建一个新的 AIMessage,并额外注入一条上下文消息告知模型工具调用已被编辑。可优先尝试安装作者的分支:pip install git+https://github.com/zhangzhefang-github/langchain.git@fix/hitl-edit-persistence#subdirectory=libs/langchain_v1。若该分支已合并,请改用包含修复的正式版本。

注意事项:Issue 讨论中,测试者安装该分支后仍观察到最终 AI 回复引用原始参数,作者随后又推送了“上下文消息”补丁,但该补丁在 Issue 评论中未得到最终验证。修复尚未确认在所有中间件与持久化组合下都生效。

问题场景

用户通过 create_agent 创建带 HumanInTheLoopMiddlewareInMemorySaver 的 Agent,并在 interrupt_on 中为某个工具(如 send_email_toolwrite_file_tool)配置了 approveeditreject 等决策。第一次 invoke 触发中断后,用户以 Command(resume=...) 传入 type: "edit" 的决策,工具确实按编辑后的参数执行,但 Agent 随后重新评估状态,认为用户原始请求仍未完成,于是生成新的 AiMessage 再次发起原始未编辑的工具调用;也有测试者观察到最终 AI 回复仍引用原始参数。

报错原文

Agent re-attempts original tool call after HumanInTheLoopMiddleware edit decision

原因分析

根据 Issue 中作者的说明,可能原因是 HumanInTheLoopMiddlewareedit 决策下直接原地修改了 AIMessage,而 LangGraph 的持久化层不会正确保存这些原地变更,导致 Agent 后续看到的状态仍包含原始工具调用。

另一个可能原因是 Agent 没有收到“工具调用已被编辑”的上下文。即使编辑后的工具执行结果被写入消息历史,模型只看到编辑后的执行结果,却不知道调用参数为什么与原请求不同,因此在生成最终回复或下一步规划时仍引用原始参数。

环境排查

  • 确认 langchainlangchain_v1 相关包的版本,是否包含 PR #33789 及其后续补丁。
  • 确认 HumanInTheLoopMiddlewareinterrupt_on 配置中,目标工具是否允许 edit 决策。
  • 确认 Command(resume=...)edited_actionnameargs 是否符合预期。
  • 确认使用的 checkpointer 是 InMemorySaver 还是其他持久化后端,以及重启后状态是否仍保留旧工具调用。
  • Issue 未提供 Python 版本、CUDA、显卡、操作系统等信息,这些项目无需作为必要排查项。

解决步骤

  1. 先确认当前安装的 LangChain 版本是否已包含 fix/hitl-edit-persistence 相关修复。
  2. 若未包含,可优先尝试作者分支:pip install git+https://github.com/zhangzhefang-github/langchain.git@fix/hitl-edit-persistence#subdirectory=libs/langchain_v1
  3. 安装后使用 Issue 中的最小复现脚本,通过 Command(resume=...) 传入 edit 决策,观察工具是否仅执行编辑后的调用,以及是否还出现原始工具调用的再次发起。
  4. 检查最终 AiMessage 的回复内容是否引用编辑后的参数,而不是原始参数。
  5. 如果仍然复现,说明还需要作者后续添加的“上下文消息”补丁,该补丁在 Issue 评论中未完整展示,可关注 PR #33789 的最终合并状态。

验证方法

重新运行复现脚本后,确认:工具执行一次且参数为编辑后的值;消息历史中不再出现由 Agent 再次生成的原始工具调用;最终 AI 回复引用的参数与 edited_action.args 一致。若以上三点都满足,说明该问题已被修复。

参考来源

langchain-ai/langchain #33787

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24311

发表回复

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