HITL 人机交互
wesgine HITL(Human-in-the-Loop)机制:Agent 主动交互、审批流与超时处理。
核心 API
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /hitl/pending | 待处理请求列表(?run_id=) |
| POST | /hitl/{reqID}/respond | 响应请求 |
SDK API
cell.HITL().ListPending(ctx, runID)
cell.HITL().Respond(ctx, reqID, decision)
HITL 的触发来源
HITL 仅用于 Agent 主动交互,治理链不产生 HITL。
触发场景
| 来源 | 场景 |
|---|---|
ask_user 工具 | Agent 主动向用户提问 |
browser_wait_for_user | 浏览器等待用户操作(AlwaysOn) |
| CycleDetector | 循环检测第二阶段,问用户"怎么办" |
| ErrorStreakDetector | 伪进展检测 HITL 超时 |
不产生 HITL 的
- Hardline 拦截 → 直接 Deny
- Sandbox 边界 → 直接 Deny
- Zone 分类 → GovernMode 决策
请求-响应流程
Agent Loop 阻塞
↓
HITL 请求创建
↓
SSE 事件推送到前端
↓
用户在同一会话内响应
↓
Agent Loop 继续
超时行为
- CycleDetector HITL:60s 超时自动终止 + 保存进度
- ErrorStreakDetector HITL:超时后终止
ask_user:由消费方配置超时
CycleDetector 两阶段协议
| 阶段 | 触发 | 行为 |
|---|---|---|
| 自愈 | 首次 CycleTerm | 注入 system 纠正消息 + 重置 counter |
| HITL | 第二次 CycleTerm | HITL 问用户,超时终止 |
Actor 边界
HITL 请求绑定到创建它的 Run 的 Actor。
- 只有 Run 的 Actor 可以响应
- 空 actor 不是旁路
- 不属于你 = 不可见
browser_wait_for_user
Cell boot 无条件注册的 HITL 安全阀。
当 Agent 需要用户在浏览器中完成操作(如登录、验证码)时:
- Agent 调用
browser_wait_for_user - Agent Loop 阻塞
- 用户在浏览器中完成操作
- 用户点击"继续"
- Agent Loop 恢复
相关文档
- Run 生命周期 →
run-lifecycle.md - 治理模型 →
governance-model.md - Actor 边界 →
actor-boundary.md