镇江网站建设龙华网站建设

广州皇族文化传播有限公司 2026/09/09 18:22:32

前言

最近新出了一个Microsoft Agent Framework框架,我感觉还挺有意思的,就通过它的那个Using function tools with human in the loop approvals例子,做了一个终端助手Agent。我觉得使用这个作为学习人在环上这个例子蛮合适的,因为对于需要执行敏感操作(如系统命令)的场景,人工审批机制显得尤为重要。本文以Rouyan为例,说明如何使用Microsoft Agent Framework创建一个能够执行终端命令并具备人工审批功能的WPF应用。

在详细介绍之前,先来看看它的效果。

1、比如获取当前时间

会先弹出一个人工审批窗口:

image-20251017213637660

然后你点击同意了才会执行:

image-20251017213716893

如果你拒绝了就是这样:

image-20251017213755043

实际上你可以利用终端做很多事情,我再举一个例子。

2、新建一个文件,写入你好:

image-20251017214320364

选择同意,结果如图所示:

image-20251017214407194

image-20251017214543527

在介绍如何具体实现之前,先来介绍一下Microsoft Agent Framework。

Microsoft Agent Framework介绍

GitHub上的简介是:“一个用于构建、编排和部署AI代理及多代理工作流程的框架,支持Python和.NET。”

GitHub地址:https://github.com/microsoft/agent-framework

image-20251017215713327

Microsoft Agent Framework 是一个开源开发工具包,用于为 .NET 和 Python 构建 AI 代理和多代理工作流。它整合并扩展了 Semantic Kernel 和 AutoGen 项目的思想,融合了两者的优点,并新增了多项功能。该框架由同一团队开发,将成为未来构建 AI 代理的统一基础。

Agent Framework 提供了两大主要功能类别:

AI 代理:单个代理利用大语言模型(LLM)处理用户输入,调用工具和 MCP 服务器执行操作,并生成响应。代理支持的模型提供商包括 Azure OpenAI、OpenAI 和 Azure AI。

工作流:基于图形的工作流,用于连接多个代理和功能,以执行复杂的多步骤任务。工作流支持基于类型的路由、嵌套、检查点以及适用于人工干预场景的请求/响应模式。

该框架还提供了基础构建模块,包括模型客户端(聊天补全和响应)、用于状态管理的代理线程、用于代理记忆的上下文提供程序、用于拦截代理操作的中间件,以及用于工具集成的MCP客户端。这些组件共同为您提供灵活性和强大功能,以构建交互性强、稳健且安全的AI应用程序。

image-20251017215856749

具体实现

1、安装Nuget包:

image-20251017220544499

2、编写运行脚本的函数

[Description("Execute a Windows cmd.exe script and return its output.")]

static string ExecuteCmd([Description("The script content to run via 'cmd.exe /c'.")] string script)

{

try

{

var psi = new ProcessStartInfo("cmd.exe", "/c " + script)

{

UseShellExecute = false,

RedirectStandardOutput = true,

RedirectStandardError = true,

CreateNoWindow = true

};

using (var process = new Process())

{

process.StartInfo = psi;

process.Start();

string output = process.StandardOutput.ReadToEnd();

string error = process.StandardError.ReadToEnd();

process.WaitForExit();

if (!string.IsNullOrWhiteSpace(error))

{

return $"错误: {error.Trim()}";

}

return output.Trim();

}

}

catch (Exception ex)

{

return $"执行失败: {ex.Message}";

}

}

3、配置AI Agent

文档中只写了Azure中怎么使用,兼容OpenAI格式的可以这样写:

// 配置AI Agent

DotEnv.Load();

var envVars = DotEnv.Read();

var apiKey = envVars["OPENAI_API_KEY"];

var model = envVars["OPENAI_CHAT_MODEL"];

var baseUrl = new Uri(envVars["OPENAI_BASE_URL"]);

ApiKeyCredential apiKeyCredential = new ApiKeyCredential(apiKey);

OpenAIClientOptions openAIClientOptions = new OpenAIClientOptions();

openAIClientOptions.Endpoint = baseUrl;

AIAgent agent = new OpenAIClient(apiKeyCredential, openAIClientOptions)

.GetChatClient(model)

.CreateAIAgent(instructions: "你是一个乐于助人的助手,可以执行命令行脚本。请使用中文回答。", tools: [new ApprovalRequiredAIFunction(AIFunctionFactory.Create(ExecuteCmd))]);

这里有一个新东西就是ApprovalRequiredAIFunction。

这说明如果调用这个函数需要经过人工审批。

4、审批流程

// Call the agent and check if there are any user input requests to handle.

AgentThread thread = agent.GetNewThread();

var response = await agent.RunAsync(InputText, thread);

var userInputRequests = response.UserInputRequests.ToList();

我们先来看看这个是什么,运行起来打个断点看看:

image-20251017221907635

这就是一个Agent想要执行的函数,那么现在来看看如何审批:

while (userInputRequests.Count > 0)

{

var userInputResponses = new List<ChatMessage>();

foreach (var functionApprovalRequest in userInputRequests.OfType<FunctionApprovalRequestContent>())

{

var scriptContent = functionApprovalRequest.FunctionCall.Arguments?["script"]?.ToString() ?? "未知脚本";

var functionName = functionApprovalRequest.FunctionCall.Name;

var dialogVm = new HumanApprovalDialogViewModel

{

Title = "命令执行审批",

Message = $"是否同意执行以下命令? 函数名称: {functionName} 脚本内容: {scriptContent}"

};

bool? result = _windowManager.ShowDialog(dialogVm);

bool approved = result == true;

userInputResponses.Add(new ChatMessage(ChatRole.User, [functionApprovalRequest.CreateResponse(approved)]));

}

// Pass the user input responses back to the agent for further processing.

response = await agent.RunAsync(userInputResponses, thread);

userInputRequests = response.UserInputRequests.ToList();

}

根据这个地方userInputResponses.Add(new ChatMessage(ChatRole.User, [functionApprovalRequest.CreateResponse(approved)]));中的approved传入的是true还是false表示用户是同意还是拒绝。

然后发送请求获取新的回复,直到没有需要人工审批的函数为止。

5、流式响应

最后再获取一个流式响应:

await foreach (var update in agent.RunStreamingAsync("输出最终答案", thread))

{

OutputText += update.Text;

}

最后

以上就是本期的全部内容,希望对你有所帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

赣州网站建设网站建设中图片

Xplist跨平台配置文件编辑工具完全指南【免费下载链接】XplistCross-platform Plist Editor项目地址: https://gitcode.com/gh_mirrors/x

2026/06/30 13:13:35

天津网站建设杭州营销型网站建设

Beyond Compare 4 对比模型输出差异?高级用法揭秘在大模型开发日益工程化的今天,一个看似简单却常被忽视的问题浮出水面:我们如何确信,

2026/06/30 13:47:37

湖南营销型网站建设江门网站建设

题目描述给定一个包含 n 个元素的整数序列 A,记作 A1​,A2​,A3​,...,An​。求另一个包含 n 个元素的待定整数序列 X,记 S=i=1∑n

2026/06/30 11:37:56

建设网站公司宁波外贸网站建设

如何快速搭建本地AI推理平台:3种高效部署方案详解【免费下载链接】LocalAI项目地址: https://gitcode.com/gh_mirrors/loc/LocalAI在人工智能

2026/06/30 13:09:04

中山网站建设永州网站建设

第一章:量子计算镜像的构建缓存在量子计算环境中,构建和管理可复用的系统镜像是提升开发效率与部署一致性的关键环节。由于量子模拟器和控制软件栈通常依赖复杂的科学计算库与硬件驱动

2026/06/30 13:25:35

大型门户网站建设江苏网站建设

YOLO模型镜像内置Prometheus监控 exporter在智能制造工厂的一条视觉检测产线上,工程师突然收到告警:多个工位出现漏检。系统日志显示“推理超时”࿰

2026/06/30 10:59:23

桂林网站建设青岛网站建设公司

每当为大家提供丰富选择的每年购物季时段来临之际,高端手机市场无一例外地都会出现新品发布会密集举行以及价格作出调整的情况。众多旗舰机型之中可以发现存在两个备受关注的技术方向,

2026/06/30 13:21:05

宜昌网站建设网站建设图片

无需编程基础也能用!IndexTTS2图形化界面轻松生成语音在短视频、播客和智能设备席卷内容生态的今天,语音合成已不再是实验室里的冷门技术。从有声书到教学课件,

2026/06/30 12:58:33

专业网站建设四川网站建设

Web安全的定义和概念Web安全是指保护Web应用程序和Web服务免受恶意攻击的一系列技术、策略和实践。Web服务具有开放性、可扩展性和互联性等特点,因此存在各种不同类型的攻击和威胁&#

2026/06/30 12:11:59

手机网站建设网站建设学习

Linly-Talker 视频时间戳水印的深度实现与工程实践在当前 AI 数字人技术快速落地的背景下,如何让生成的内容具备更强的可信度、可追溯性和合规性,已成为开发者不可忽

2026/06/30 13:55:07