§12 人机协同:关键操作必须你点头
先给结论:敏感工具执行前,可以让代理停下来等人类批准。这叫 Human-in-the-Loop(HITL)。
删除文件、发邮件、部署代码——这些不能让 Agent 自作主张。 DeepAgents 用 interrupt_on 配置哪些工具要人确认。
配置中断
from langgraph.checkpoint.memory import MemorySaver
agent = create_deep_agent(
tools=[delete_file, send_email],
interrupt_on={
"delete_file": True, # 全部决策都允许
"send_email": {"allowed_decisions": ["approve", "reject"]},
},
checkpointer=MemorySaver(), # 必须!否则恢复不了
)
中断与恢复(v2 格式)
result = agent.invoke(
{"messages": [{"role": "user", "content": "删掉 temp.txt"}]},
config=config, version="v2",
)
if result.interrupts: # v2:属性访问
action = result.interrupts[0].value["action_requests"][0]
print(f"要执行: {action['name']}, 参数: {action['args']}")
decisions = [{"type": "approve"}] # approve/edit/reject
result = agent.invoke(
Command(resume={"decisions": decisions}), # 恢复执行
config=config, version="v2",
)
四种决策:approve(批准)、edit(改参数再执行)、reject(拒绝)、respond(回复)。
风险分级建议
| 风险 | 工具 | 允许决策 |
|---|---|---|
| 高 | 删除/发送/部署 | approve、edit、reject |
| 中 | 写文件/改配置 | approve、reject(禁 edit) |
| 低 | 读/列 | 不打断 |
标叔的经验:我见过的真实 bug:在父 Agent 层面对
generate_image设中断。但那是子代理的工具,父 Agent 的中断传不到它。正确做法是去子代理自己的interrupt_on里设。这个坑后面 §19 会展开。
标叔的结论:敏感操作,宁可多问一次。HITL 配置错,比不配置更危险——因为它给你"已保护"的错觉。
注意:HITL 必须配
checkpointer。中断恢复靠它。没有 checkpointer,流程断不了也续不上。
下一章,讲给代理划边界:权限与沙箱。