快速结论:当 LangChain Agent 使用 HumanInTheLoopMiddleware 且人工选择 edit 决策时,编辑后的工具调用会正常执行,但 Agent 在下一步仍会基于原始工具调用重新规划,导致再次发起原始(未编辑)的工具调用,并可能让最终回复引用旧参数。优先排查中间件修改 AIMessage 的方式是否能被 LangGraph 持久化,以及 Agent 是否感知到工具调用已被编辑。
适用环境:Issue 中重现示例使用了 langchain.agents.create_agent、HumanInTheLoopMiddleware、InMemorySaver、langchain.tools.tool、langgraph.types.Command;模型示例为 gpt-5-nano 与 gpt-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 创建带 HumanInTheLoopMiddleware 和 InMemorySaver 的 Agent,并在 interrupt_on 中为某个工具(如 send_email_tool、write_file_tool)配置了 approve、edit、reject 等决策。第一次 invoke 触发中断后,用户以 Command(resume=...) 传入 type: "edit" 的决策,工具确实按编辑后的参数执行,但 Agent 随后重新评估状态,认为用户原始请求仍未完成,于是生成新的 AiMessage 再次发起原始未编辑的工具调用;也有测试者观察到最终 AI 回复仍引用原始参数。
报错原文
Agent re-attempts original tool call after HumanInTheLoopMiddleware edit decision
原因分析
根据 Issue 中作者的说明,可能原因是 HumanInTheLoopMiddleware 在 edit 决策下直接原地修改了 AIMessage,而 LangGraph 的持久化层不会正确保存这些原地变更,导致 Agent 后续看到的状态仍包含原始工具调用。
另一个可能原因是 Agent 没有收到“工具调用已被编辑”的上下文。即使编辑后的工具执行结果被写入消息历史,模型只看到编辑后的执行结果,却不知道调用参数为什么与原请求不同,因此在生成最终回复或下一步规划时仍引用原始参数。
环境排查
- 确认
langchain与langchain_v1相关包的版本,是否包含 PR #33789 及其后续补丁。 - 确认
HumanInTheLoopMiddleware的interrupt_on配置中,目标工具是否允许edit决策。 - 确认
Command(resume=...)中edited_action的name和args是否符合预期。 - 确认使用的 checkpointer 是
InMemorySaver还是其他持久化后端,以及重启后状态是否仍保留旧工具调用。 - Issue 未提供 Python 版本、CUDA、显卡、操作系统等信息,这些项目无需作为必要排查项。
解决步骤
- 先确认当前安装的 LangChain 版本是否已包含
fix/hitl-edit-persistence相关修复。 - 若未包含,可优先尝试作者分支:
pip install git+https://github.com/zhangzhefang-github/langchain.git@fix/hitl-edit-persistence#subdirectory=libs/langchain_v1。 - 安装后使用 Issue 中的最小复现脚本,通过
Command(resume=...)传入edit决策,观察工具是否仅执行编辑后的调用,以及是否还出现原始工具调用的再次发起。 - 检查最终
AiMessage的回复内容是否引用编辑后的参数,而不是原始参数。 - 如果仍然复现,说明还需要作者后续添加的“上下文消息”补丁,该补丁在 Issue 评论中未完整展示,可关注 PR #33789 的最终合并状态。
验证方法
重新运行复现脚本后,确认:工具执行一次且参数为编辑后的值;消息历史中不再出现由 Agent 再次生成的原始工具调用;最终 AI 回复引用的参数与 edited_action.args 一致。若以上三点都满足,说明该问题已被修复。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


![[Bug] MCP provider detail endpoint returns 500 "invalid input syntax for type uuid" — server_identifier passed where a provider UUID is expe](https://www.chat-gpts.plus/wp-content/uploads/2026/09/41512-4d065714-768x403.jpg)