HITL = Human-in-the-Loop(人在回路中)

我来在代码里查 HITL 的实际用法,而不是凭定义回答。

有专门的 docs/dd/supervisor/HITL.md。我读这个,外加 models.py 里的 HITL 字段和 3_agent_design 里的相关段。

HITL 在这个项目里有一份非常完整的设计文档(docs/dd/supervisor/HITL.md)。我给你讲透。

一句话:HITL 是什么

HITL = Human-in-the-Loop(人在回路中)。在这个项目里,它解决一个具体问题:

写操作(订会议室、提工单、提交食堂反馈)在执行前,必须让用户点一下"确认",不能直接动手。

用户的指令"提交反馈"一旦发出,如果 Agent 直接执行,就等于没经过你同意就帮你发了------HITL 就是那个"暂停等你确认"的闸口。


在这个项目里的应用场景

核心例子(来自文档 §4):

复制代码
用户:"二食堂红烧肉太难吃,提个反馈"
        │
        ▼
supervisor 识别意图 → 调食堂 Agent 的 submit_feedback(写操作)
        │
        ▼ 食堂 Agent 判断"这是写操作,得确认"
   子 Agent 自己 interrupt() 暂停,生成 confirmation_id=c1
   返回 input-required + 确认卡片
        │
        ▼ supervisor 也 interrupt() 暂停,把确认卡推给前端
   前端渲染:"确认提交这条反馈吗?[确认] [取消]"
        │
   用户点"确认提交"
        │
        ▼ 复用同一 thread,带 approved=true + c1 调回去
   食堂 Agent 从 Redis 恢复 → 真正执行 INSERT

本质:一个写操作被拆成两个阶段

  • prepare (阶段1):解析、校验、生成确认卡,但不执行
  • execute (阶段3):用户确认后,带着 approved=true 才真正执行

三个关键设计点(讲给没看过代码的人)

1. 两层 interrupt(最容易混)

整条链路上有两个独立的图,各自会暂停:

  • 子 Agent 的 interrupt:食堂 Agent 自己判断"要确认"→ 暂停自己的图
  • supervisor 的 interrupt:dispatcher 发现"有子 Agent 要确认"→ 暂停 supervisor 的图,把卡推给用户

两层都靠 Redis 共享存储(不在 Pod 内存),保证多实例下任意 Pod 都能恢复。

2. confirmation_id(暂停点身份证)

由子 Agent 生成,prepare 时返回、execute 时透传回去。TTL 30 分钟,过期就 CONFIRMATION_EXPIRED(不可重试)。

3. idempotency_key(防重复执行)

execute 阶段复用同一幂等键 → 即使网络重试,下游也不会重复下单。


和你前面那份并行设计的关联

你之前那份 dispatcher 设计里把 HITL 明确列在"不做什么"------这是对的。原因在这份文档 §11.3 第 7 条不变量:

并行 HITL 必须三段式:asyncio.gather 内不调 interrupt()

也就是说,你那套 group 并行(asyncio.gather 跑 step)和 HITL 的 interrupt 机制是冲突的------gather 里不能暂停等人点确认。所以 HITL 要走独立路径,不混进你那套并行 dispatch。


重要现实:这份设计还没落地

文档 §9 明确写了:§11 整套设计只在文档里,代码未落地。

项 状态
PreparedCall 模型 src/models.py 未实现
dispatcher HITL 逻辑 src/nodes/ 未实现
batch_write_confirmation 常量 只有文档字符串
validate_a2a_contract.py 校验脚本 不存在

所以现在代码里 models.py 搜不到任何 HITL/confirmation_id/PreparedCall 字段(我刚搜过,0 匹配)。


总结给你的一句话

HITL 在本项目 = "写操作执行前的用户确认闸口",用两阶段 A2A(prepare 不执行 / execute 才执行)+ 双层 Redis interrupt 实现,目前是完整文档、零代码落地,且与你的并行 dispatch 设计刻意解耦。

需要我把这份 HITL 设计里**"代码未落地"的部分**,对照你之前那套并行 retry 设计,理出一份"实现时谁先谁后、哪些会互相打架"的依赖图吗?

相关推荐
大江东去浪淘尽千古风流人物2 天前
【HexVIO】DSP卸载双目惯性VIO:Hexagon向量化前端与单帧融合调度深度解析
前端·状态模式·slam·dsp·vio·hexagon·移动端加速
吃一碗粉只付一碗钱3 天前
12-给SPA友好的401和403响应
c#·状态模式
sunlifenger4 天前
嵌入式部署,解锁张家港智慧灯杆的“极简组网”密码
科技·状态模式
上火的金鱼妹5 天前
关于多进程sse连接通知的实战
javascript·状态模式·sse
阿俊-全栈开发5 天前
LikeShop 小程序商城首页可配置弹窗的设计与实现(Java + uni-app)
小程序·状态模式·likeshop·likeshop开源商城
lingyubb5 天前
配音工具怎么选?从 TTS 合成链路看 6 个可量化参数
状态模式
平头哥技术团队7 天前
从预订问到退房:一间山野民宿的数字人「旅程地图」——Theme07_Homestay.vue 端到端拆解
状态模式·数字人
未来之窗软件服务8 天前
web网络请求竞态问题与取消方案-东方仙盟
前端·状态模式·仙盟创梦ide·东方仙盟·网络取消
一级新生9 天前
多智能体协作:常用协作模式详解
人工智能·状态模式·agent·多智能体·智能体
喜欢打篮球的普通人10 天前
LLVM 前端与优化层:Clang 如何把 C 代码变成 IR
c语言·前端·状态模式