🙋 工具调用前人工确认
# 工具调用前人工确认
默认不会请求人工确认。接入审批需要两步:为工具设置 ASK 规则,并提供返回用户决定的处理器。
先注册真实业务工具 refund_order,在组件中添加规则:
import io.agentscope.core.permission.PermissionBehavior;
import io.agentscope.core.permission.PermissionContextState;
import io.agentscope.core.permission.PermissionRule;
@Override
protected PermissionContextState permissionContext() {
return PermissionContextState.builder()
.addAskRule("refund_order", new PermissionRule(
"refund_order", null, PermissionBehavior.ASK, "退款需人工确认"))
.build();
}
然后注册 AgentConfirmationHandler Bean。以下示例挂起执行,等待业务审批接口调用 complete(key, approved):
import com.yomahub.liteflow.agent.context.LiteFlowAgentContext;
import com.yomahub.liteflow.agent.hitl.AgentConfirmationHandler;
import io.agentscope.core.event.ConfirmResult;
import io.agentscope.core.event.RequireUserConfirmEvent;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
import reactor.core.publisher.Sinks;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@Component
public class PendingApprovalHandler implements AgentConfirmationHandler {
private final ConcurrentHashMap<String, Sinks.One<Boolean>> pending =
new ConcurrentHashMap<>();
@Override
public Mono<List<ConfirmResult>> confirm(
RequireUserConfirmEvent event, LiteFlowAgentContext context) {
String key = context.getRequestId() + ":" + event.getReplyId();
Sinks.One<Boolean> answer = Sinks.one();
if (pending.putIfAbsent(key, answer) != null) {
return Mono.error(new IllegalStateException("重复审批请求:" + key));
}
// 在应用中发布 key、工具名及参数,等待当前用户审批。
return answer.asMono()
.map(approved -> event.getToolCalls().stream()
.map(tool -> new ConfirmResult(approved, tool)).toList())
.doFinally(ignored -> pending.remove(key, answer));
}
public boolean complete(String key, boolean approved) {
Sinks.One<Boolean> answer = pending.get(key);
return answer != null && answer.tryEmitValue(approved).isSuccess();
}
}
应用需把审批 key、工具名和参数送到自己的审批页面,并在回调接口校验审批者。这个示例的等待状态保存在当前进程,多实例部署时应把审批回调路由到持有该请求的实例,或接入共享消息通道。
只监听 agent.confirm.required 不会完成审批,必须由处理器返回决定。每个待确认工具都要有一个对应的 ConfirmResult。
liteflow.agent.hitl.confirmation-timeout=2m
liteflow.agent.hitl.fail-on-denied-tool=false
默认等待最多 2 分钟,并受 Agent 剩余执行时长限制。拒绝后默认把拒绝结果交给模型继续处理;设置 fail-on-denied-tool=true 时调用失败。等待审批期间,同一会话的后续请求也会等待。
帮助我们改善此文档 (opens new window)
上次更新: 2026/09/20, 11:49:27



