ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

AutoGen 0.4 .NET HelloAgent 入门:从事件订阅、gRPC 消息契约到跨语言运行时编排

AutoGen 0.4 .NET HelloAgent 入门:从事件订阅、gRPC 消息契约到跨语言运行时编排 AutoGen 0.4 .NET HelloAgent 入门从事件订阅、gRPC 消息契约到跨语言运行时编排【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen本文基于 AutoGen 仓库中Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgentTests目录的官方示例文档系统讲解 AutoGen 0.4 .NET 编程模型的最小完整闭环如何定义一个订阅主题的 Agent、编写事件处理程序、启动进程内或 gRPC 分布式运行时、发布 protobuf 消息并通过 Aspire AppHost 将 .NET Agent 与 Python Agent 编排在同一事件总线中进行跨语言xLang通信验证。读完本文你可以复刻仓库中的 Hello World 示例并理解每个关键类、注解和命令参数在源码中的真实落点。一、示例定位与前置条件dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgentTests/目录下的文档 README 将其描述为“一个演示如何创建简单的 .NET 控制台应用监听事件并对事件进行一系列动作编排的示例”。它同时承担两个角色教学示例演示 AutoGen 0.4 自定义 Agent 的最小可用形态继承基类 Agent、订阅事件、发布消息、等待关闭集成测试资源它是 Aspire 分布式应用XlangTests.AppHost中的一个可部署资源被 HelloAppHostIntegrationTests.cs 用来验证 .NET 与 Python Agent 之间的消息投递。前置条件原文档明确列出.NET 8.0 或更高版本推荐安装 GitHub CLI 用于克隆仓库。项目文件 HelloAgentTests.csproj 印证了这些依赖TargetFrameworknet8.0/TargetFramework并引用Microsoft.Extensions.Hosting、Google.Protobuf、Grpc.ToolsPrivateAssetsAll仅用于构建期生成代码以及四个源码工程的ProjectReferenceProjectReference Include..\..\..\src\Microsoft.AutoGen\Contracts\Microsoft.AutoGen.Contracts.csproj / ProjectReference Include..\..\..\src\Microsoft.AutoGen\Core\Microsoft.AutoGen.Core.csproj / ProjectReference Include..\..\..\src\Microsoft.AutoGen\Agents\Microsoft.AutoGen.Agents.csproj / ProjectReference Include..\..\..\src\Microsoft.AutoGen\Core.Grpc\Microsoft.AutoGen.Core.Grpc.csproj /这四个工程分别对应消息契约Contracts、运行时核心Core、Agent 抽象Agents与 gRPC 网关客户端Core.Grpc是理解本文所有 API 的来源。二、运行示例原文档给出的运行方式# Clone the repository gh repo clone microsoft/autogen cd dotnet/samples/Hello dotnet run需要注意仓库中存在两处形态几乎一致的 Hello 示例可按需选择测试资源版dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/HelloAgentTests其 Program.cs 在构建时自动判断运行模式示例集版dotnet/samples/Hello包含HelloAgent、HelloAIAgents、HelloAgentState、Hello.AppHost等子项目其中 HelloAgent/Program.cs 额外提供了命令行参数--host hostAddress连接指定地址的 gRPC 网关也可通过环境变量AGENT_HOST设置--nosend不发送初始消息等待其他 Agent 触发文档明确提示使用进程内运行时该参数会导致挂起程序会直接终止并提示。配置层面appsettings.json 将日志级别设为Warning起步并为Grpc、Microsoft.Hosting.Lifetime等命名空间单独开放Information级别同时声明 Kestrel 端点默认使用Http2协议——这是 gRPC over HTTP/2 的前提。三、核心概念事件驱动的 Agent 流程原文档给出的事件流图Mermaid完整描述了一次对话的生命周期结合 HelloAgent.cs 的当前实现这条链路的实际执行过程是主程序向主题HelloTopic发布NewMessageReceived { Message Hello World! }HelloAgent的HandleAsync(NewMessageReceived, ...)打印消息并继续向同一主题发布ConversationClosedUserMessage GoodbyeHandleAsync(ConversationClosed, ...)打印告别语若环境变量STAY_ALIVE_ON_GOODBYE不为true则发布ShutdownHandleAsync(Shutdown, ...)调用hostApplicationLifetime.StopApplication()终止宿主Program.cs中的WaitForShutdownAsync()返回进程退出。STAY_ALIVE_ON_GOODBYE是跨语言编排场景的关键开关在 Aspire 测试中由 XLangTests.AppHost/Program.cs 统一注入为true保证 .NET/Python 两个 Agent 在收发完一轮消息后继续保持存活等待测试框架采集日志。四、编写事件处理程序TypeSubscription 与 IHandle原文档指出“AutoGen 应用的核心是事件处理程序。Agent 通过TopicSubscription选择要监听的主题收到事件时其事件处理程序被调用处理程序内部可以可选地发布新事件交由事件总线分发给其他 Agent。事件类型是声明为 gRPC ProtoBuf 消息的 schema通过IHandle接口在 Agent 中注册。”对照当前源码 HelloAgent.cs一个完整的 Agent 定义如下[TypeSubscription(HelloTopic)] public class HelloAgent( IHostApplicationLifetime hostApplicationLifetime, AgentId id, IAgentRuntime runtime, LoggerBaseAgent? logger null) : BaseAgent(id, runtime, Hello Agent, logger), IHandleNewMessageReceived, IHandleConversationClosed, IHandleShutdown, IHandleConsole { // This will capture the message sent in Program.cs public async ValueTask HandleAsync(NewMessageReceived item, MessageContext messageContext) { Console.Out.WriteLine(item.Message); // Print message to console ConversationClosed goodbye new ConversationClosed { UserId this.Id.Type, UserMessage Goodbye }; await this.PublishMessageAsync(goodbye, new TopicId(HelloTopic)); } // ... ConversationClosed / Shutdown 处理程序同理 }关键点逐一拆解[TypeSubscription(HelloTopic)]第 12 行声明该 Agent 订阅的主题标识。运行时据此把总线上该主题的消息路由到本 Agent继承 BaseAgentMicrosoft.AutoGen.Agents命名空间下的 Agent 基类构造参数为AgentId、IAgentRuntime消息发布/订阅的运行时抽象、描述与可选 Logger实现 IHandleT每个IHandleT接口对应一个HandleAsync(T item, MessageContext messageContext)方法即处理程序契约。本例订阅了NewMessageReceived、ConversationClosed、Shutdown三种内置消息类型IHandleConsole提供控制台输出能力是“继承与组合”思想的一部分见下一节PublishMessageAsync在处理程序中继续向TopicId发布新消息形成链式编排。说明原文档示例片段ConsoleAgent、PublishEventAsync、ToCloudEvent、ISayHello等反映的是该文档编写时的 API 形态当前源码树中对应能力已由BaseAgentIHandleTPublishMessageAsync承载且文档中提到的dotnet/src/Microsoft.AutoGen/Agents/AgentWorker.cs在当前工程中已不存在等价职责由Microsoft.AutoGen.Agents工程csproj 中可见中的BaseAgent与运行时组件承担。阅读文档时应以 HelloAgent.cs 与 Program.cs 的当前实现为准。五、继承与组合原文档专节强调“本示例也展示了 AutoGen 中的继承。HelloAgent继承自提供WriteConsole方法的基类。”在当前源码结构中可以印证这一设计Agent 的通用能力被拆分为基类 接口两层——基类BaseAgent提供身份Id、运行时句柄PublishMessageAsync与生命周期行为接口IHandleT、IHandleConsole按需组合。dotnet/samples/Hello/HelloAgent/HelloAgent.cs 的变体只实现三个IHandle而测试资源版额外加了IHandleConsole两者共享同一套处理逻辑说明能力扩展走“组合接口”而非“加深继承链”的路线更丰富的组合示例见 HelloAgentState 与 HelloAIAgents后者演示了接入 LLM 的 AI Agent 变体同一事件流可驱动不同能力组合的 Agent。六、启动 Application Runtime进程内与 gRPC 双模式原文档说明“AutoGen 提供灵活的运行时可以以多种方式启动。Program.cs演示了如何本地启动运行时并一次性向 Agent 发送消息。”当前 Program.cs 的完整逻辑仅 20 余行是理解双模式切换的最佳入口var appBuilder new AgentsAppBuilder(); // Create app builder // if we are using distributed, we need the AGENT_HOST var defined and then we will use the grpc runtime if (Environment.GetEnvironmentVariable(AGENT_HOST) ! null) { appBuilder.AddGrpcAgentWorker( Environment.GetEnvironmentVariable(AGENT_HOST)) .AddAgentHelloAgent(HelloAgent); } else { // Set up app builder for in-process runtime, allow message delivery to self, and add the Hello agent appBuilder.UseInProcessRuntime(deliverToSelf: true).AddAgentHelloAgent(HelloAgent); } var app await appBuilder.BuildAsync(); // Build the app // Create a custom message type from proto and define message var message new NewMessageReceived { Message Hello World! }; await app.PublishMessageAsync(message, new TopicId(HelloTopic, HelloAgents/dotnet)).ConfigureAwait(false); await app.WaitForShutdownAsync().ConfigureAwait(false); // Wait for shutdown from agent三个要点构建器模式AgentsAppBuilder负责装配运行时UseInProcessRuntime或AddGrpcAgentWorker与 Agent 注册AddAgentT(HelloAgent)BuildAsync()后得到一个可StartAsync/WaitForShutdownAsync的应用对象单命令双模式未设置AGENT_HOST时走进程内运行时deliverToSelf: true允许 Agent 接收自己发布的消息这正是 Hello → Goodbye → Shutdown 自驱动闭环成立的必要条件设置了AGENT_HOST时Agent 通过 gRPC 连接到外部 AgentHost 网关成为分布式拓扑中的一员消息源标识本例发布消息时使用的TopicId为(HelloTopic, HelloAgents/dotnet)——主题键之外还带有source后缀这正是跨语言测试断言source: HelloAgents/dotnet的来源见 HelloAppHostIntegrationTests.cs。原文档中给出的App.PublishMessageAsync(HelloAgents, ..., local: true)一站式写法属于文档时期的静态入口形态其语义本地启动运行时 首发一条消息与上面的构建器写法一一对应。七、定义与发送消息protobuf 契约与 CloudEvents原文档“Sending Messages”一节的要点消息集合由 gRPC ProtoBuf 规范定义经 gRPC 工具生成 C# 类用户可通过新增.proto文件并在.csproj中引入工具来定义自己的消息类型。原文档自带的自定义消息示例来自 DevTeam 场景syntax proto3; package devteam; option csharp_namespace DevTeam.Shared; message NewAsk { string org 1; string repo 2; string ask 3; int64 issue_number 4; } message ReadmeRequested { string org 1; string repo 2; int64 issue_number 3; string ask 4; }对应的工程配置原文档给出且与 HelloAgentTests.csproj 中实际使用的包引用一致ItemGroup PackageReference IncludeGoogle.Protobuf / PackageReference IncludeGrpc.Tools PrivateAssetsAll / Protobuf Include..\Protos\messages.proto LinkProtos\messages.proto / /ItemGroup仓库中可直接查看到的真实契约文件内置 Agent 事件类型dotnet/src/Microsoft.AutoGen/Agents/protos/agent_events.proto、dotnet/samples/Hello/protos/agent_events.proto、dotnet/test/Microsoft.AutoGen.Integration.Tests.AppHosts/protos/agent_events.proto——NewMessageReceived、ConversationClosed、Shutdown等消息即由这类 proto 生成跨语言网关契约protos/agent_worker.proto 定义 Agent Worker 的服务接口protos/cloudevent.proto 定义 CloudEvents 封装结构。原文档同时指出消息以 CloudEvents 规范 封装后发送到事件总线。跨语言测试 HelloAppHostIntegrationTests.cs 中的断言字符串INFO:autogen_core:Received a message from host: cloudEvent {直接证明了 Python 侧收到的正是 CloudEvents 封装的消息体。八、作为集成测试资源xLang 跨语言编排验证HelloAgentTests放在Microsoft.AutoGen.Integration.Tests.AppHosts下并非偶然。XLangTests.AppHost/Program.cs 用 Aspire 将其编排进一个分布式应用var builder DistributedApplication.CreateBuilder(args); var backend builder.AddProjectProjects.Microsoft_AutoGen_AgentHost(AgentHost).WithExternalHttpEndpoints(); // ... dotnet builder.AddProjectProjects.HelloAgentTests(HelloAgentTestsDotNET) .WithReference(backend) .WithEnvironment(AGENT_HOST, backend.GetEndpoint(https)) .WithEnvironment(STAY_ALIVE_ON_GOODBYE, true) .WaitFor(backend); // Python 侧 python builder.AddPythonApp(HelloAgentTestsPython, pythonHelloAgentPath, pythonHelloAgentPy, pythonVEnv) .WithReference(backend) .WithEnvironment(AGENT_HOST, backend.GetEndpoint(http)) .WithEnvironment(STAY_ALIVE_ON_GOODBYE, true) // ...拓扑为AgentHost运行时网关为中枢.NET HelloAgent 走 HTTPS gRPC 接入Pythonhello_python_agent.py见 core_xlang_hello_python_agent走 HTTP 接入三者经同一事件总线互通。XLANG_TEST_NO_DOTNET/XLANG_TEST_NO_PYTHON环境变量用于在测试中裁剪单边资源。HelloAppHostIntegrationTests.cs 中的用例逐一验证了消息路由例如Test_Dotnet_Sends_AgentHost_Delivers_and_Python_Receives等待 Python 资源日志中出现Hello World!证明 .NET → 网关 → Python 的投递Test_Dotnet_Agent_Sends_And_AgentHost_Delivers_Back_To_It断言 .NET 资源日志中先出现Hello World!后出现HelloAgent said Goodbye——后者正是第四节中ConversationClosed处理程序的打印格式${item.UserId} said {item.UserMessage}把示例行为与测试断言严丝合缝地对应起来Test_Python_Agent_Sends_And_AgentHost_Receives断言网关日志中出现source: HelloAgents/python与 .NET 侧的HelloAgents/dotnet形成对称验证。九、小结这篇 Hello World 文档及其配套源码浓缩了 AutoGen 0.4 .NET 编程模型的四个支柱概念文档表述源码落点事件订阅TopicSubscription监听主题事件HelloAgent.cs 的[TypeSubscription(HelloTopic)]事件处理程序通过IHandle注册可继续发布事件HandleAsync三实现 PublishMessageAsyncHelloAgent.cs运行时启动本地进程内或连接网关一条消息触发全链路Program.cs 的AGENT_HOST分支消息契约protobuf 定义 schemaCloudEvents 封装投递agent_events.proto、cloudevent.proto掌握这条“订阅—处理—发布—关闭”的最小闭环后即可沿仓库继续深入dotnet/samples/Hello/HelloAgentState 演示为 Agent 增加状态dotnet/samples/Hello/HelloAIAgents 演示接入 LLM 的 AI Agent而Microsoft.AutoGen.Integration.Tests则展示了同一套 Agent 代码如何零修改地成为分布式跨语言系统中的一个节点。【免费下载链接】autogenA programming framework for agentic AI项目地址: https://gitcode.com/GitHub_Trending/au/autogen创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表