MAF 审批 Agent 实战
一句话简介
通过 ApprovalRequiredAIFunction 为敏感工具加上人工审批环节,快速构建符合企业合规要求的 MAF 人机协作智能体。
🎯 核心收获
- ✅ 区分高/低风险工具,一键套上审批保护层
- ✅ 用
UserInputRequests+FunctionApprovalRequestContent驱动审批循环 - ✅ 同时兼容同步调用与流式响应,审批后继续执行原线程
- ✅ 混合工具集成案例:IT 运维、银行转账、内容发布等
🧠 审批机制一图看懂

🛠️ 实现步骤
1. 标记敏感工具
普通工具函数(如资金转账、账户删除)先用 AIFunctionFactory.Create() 注册,随后再决定是否需要审批。
2. 添加审批包装
对高风险函数使用 new ApprovalRequiredAIFunction(innerFunction),Agent 仍像普通工具一样调用,但框架会在真正执行前抛出审批请求。
3. 处理审批循环
每次 RunAsync 或 RunAsync(messages, thread) 后,检查 response.UserInputRequests:
OfType<FunctionApprovalRequestContent>()获取所有待批项目。- 展示
FunctionCall.Name与Arguments,让人工做出决策。 - 用
CreateResponse(bool approved)生成审批结果,并封装为ChatMessage。 - 将这些消息回传给 Agent,直到没有新的审批请求为止。
4. 流式场景
流式接口使用 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 包装即可共存。
✅ 最佳实践清单
- 🛡️ 风险分级:仅对高风险函数引入审批,避免过度打扰
- 🔁 while 循环:永远用循环处理
UserInputRequests,确保批量审批场景的完整性 - 🧾 审计可追溯:保存函数名、参数、审批人、时间戳,满足合规要求
- 🔄 线程持久化:审批可能跨小时甚至跨天,记得序列化
AgentThread以便恢复上下文 - 📡 流式收集:流式接口必须
ToListAsync()后再解析审批内容
🎯 总结
- ✅ ApprovalRequiredAIFunction 让敏感工具一键升级为“人机协同”模式
- ✅
UserInputRequests+CreateResponse()构成审批闭环,兼容同步与流式调用 - ✅ 分类注册工具 + 审批循环 + 审计记录,才是企业可落地的整体解决方案