通过 ApprovalRequiredAIFunction 为敏感工具加上人工审批环节,快速构建符合企业合规要求的 MAF 人机协作智能体。
UserInputRequests + FunctionApprovalRequestContent 驱动审批循环
普通工具函数(如资金转账、账户删除)先用 AIFunctionFactory.Create() 注册,随后再决定是否需要审批。
对高风险函数使用 new ApprovalRequiredAIFunction(innerFunction),Agent 仍像普通工具一样调用,但框架会在真正执行前抛出审批请求。
每次 RunAsync 或 RunAsync(messages, thread) 后,检查 response.UserInputRequests:
OfType<FunctionApprovalRequestContent>() 获取所有待批项目。FunctionCall.Name 与 Arguments,让人工做出决策。CreateResponse(bool approved) 生成审批结果,并封装为 ChatMessage。流式接口使用 await agent.RunStreamingAsync(...).ToListAsync() 收集全部 ChatResponseUpdate,再从中提取审批请求;审批结束后再次流式调用即可继续输出。
// 1. 定义并包装敏感工具
var transferTool = AIFunctionFactory.Create(TransferMoney);
var approvalTool = new ApprovalRequiredAIFunction(transferTool);
// 2. 创建 Agent
var agent = chatClient.CreateAIAgent(
instructions: "执行转账前必须获得用户确认",
name: "BankAssistant",
tools: [approvalTool]);
// 3. 审批循环
var thread = agent.GetNewThread();
var response = await agent.RunAsync(userRequest, thread);
var pending = response.UserInputRequests.ToList();
while (pending.Count > 0)
{
var approvals = pending.OfType<FunctionApprovalRequestContent>();
var replies = approvals
.Select(req => req.CreateResponse(approved: true))
.Select(content => new ChatMessage(ChatRole.User, [content]))
.ToList();
response = await agent.RunAsync(replies, thread);
pending = response.UserInputRequests.ToList();
}提示:在真实系统中应将 approved 由管理员输入决定,并记录审计日志。
场景 | 审批策略 |
|---|---|
💰 银行助手:转账、退款 | 所有资金操作默认要求审批;查询余额可直接返回 |
🏢 IT 助手:服务器操作 | 查询/诊断无需审批;RestartServer、DeleteUser 必须人工确认 |
📢 内容发布:公告推送 | 发布、上线、群发均需审批;草稿保存与预览无需审批 |
混合工具技巧: 低风险工具直接注册,高风险工具使用 ApprovalRequiredAIFunction 包装即可共存。
UserInputRequests,确保批量审批场景的完整性AgentThread 以便恢复上下文ToListAsync() 后再解析审批内容UserInputRequests + CreateResponse() 构成审批闭环,兼容同步与流式调用