AutoGen 核心
AutoGen Core for .NET 遵循与其 Python 版本相同的概念和约定。事实上,为了理解 .NET 版本中的概念,我们建议先阅读 Python 文档。除非另有说明,Python 版本中的概念与 .NET 版本相对应。
语言版本之间的任何重要差异都在Differences from Python部分中进行了记录。对于仅影响特定语言的内容,例如依赖注入或主机构建模式,这些内容将不会在差异文档中指定。
入门指南
你可以通过nuget包或克隆仓库来获取SDK。SDK在NuGet上可用。你至少需要以下内容:
dotnet add package Microsoft.AutoGen.Contracts
dotnet add package Microsoft.AutoGen.Core
有关安装所有相关包的更多详细说明,请参见安装。
您可以通过查看仓库中samples目录中的示例来快速入门。
创建代理
要创建一个代理,你可以从BaseAgent继承并为你关心的事件实现事件处理程序。以下是一个最小的示例,展示了如何从BaseAgent继承并实现事件处理程序:
public class MyAgent : BaseAgent, IHandle<MyMessage>
{
// ...
public async ValueTask HandleAsync(MyMessage item, MessageContext context)
{
// ...logic here...
}
}
通过重写BaseAgent,您可以访问运行时和日志工具,并通过实现IHandle
在应用程序中运行代理
要在应用程序中运行您的代理,您可以使用AgentsAppBuilder
类。以下是如何在应用程序中运行代理'HelloAgent'的示例:
AgentsAppBuilder appBuilder = new AgentsAppBuilder()
.UseInProcessRuntime(deliverToSelf: true)
.AddAgent<HelloAgent>("HelloAgent");
var app = await appBuilder.BuildAsync();
// start the app by publishing a message to the runtime
await app.PublishMessageAsync(new NewMessageReceived
{
Message = "Hello from .NET"
}, new TopicId("HelloTopic"));
// Wait for shutdown
await app.WaitForShutdownAsync();
.NET SDK 运行时
.NET SDK 包括一个内存中的单进程运行时和一个远程分布式运行时,后者旨在在云中运行您的代理。分布式运行时支持在 Python 和 .NET 中运行代理,使这些代理能够相互通信。分布式运行时使用 Microsoft Orleans 来提供弹性、持久性,并与诸如 Azure Event Hubs 等消息服务集成。xlang 功能要求您代理的消息可序列化为 CloudEvents。消息通过 Grpc 以 CloudEvents 的形式交换,运行时负责确保消息被传递到正确的代理。
要使用分布式运行时,您需要在项目中添加以下包:
dotnet add package Microsoft.AutoGen.Core.Grpc
这是一个在应用程序中与您的代理(agent(s))一起运行并连接到分布式系统的包。
要运行后端/服务器端,您需要:
dotnet add package Microsoft.AutoGen.RuntimeGateway
dotnet add package Microsoft.AutoGen.AgentHost
你可以单独运行后端:
dotnet run --project Microsoft.AutoGen.AgentHost
或者你可以将其包含在你自己的应用程序中运行:
using Microsoft.AutoGen.RuntimeGateway;
using Microsoft.AutoGen.AgentHost;
var autogenBackend = await Microsoft.AutoGen.RuntimeGateway.Grpc.Host.StartAsync(local: false, useGrpc: true).ConfigureAwait(false);
你还可以将运行时作为 dotnet 工具安装:
dotnet pack --no-build --configuration Release --output './output/release' -bl\n
dotnet tool install --add-source ./output/release Microsoft.AutoGen.AgentHost
# run the tool
# dotnet agenthost
# or just...
agenthost
使用.NET Aspire在单独进程中运行多个代理和运行时
Hello.AppHost 项目 展示了如何使用 .NET Aspire 在单独进程中编排具有多个代理和运行时的分布式系统。它还指向了一个 python 代理,该代理演示了如何在同一个分布式系统中运行不同语言的代理。
// Copyright (c) Microsoft Corporation. All rights reserved.
// Program.cs
using Microsoft.Extensions.Hosting;
var builder = DistributedApplication.CreateBuilder(args);
var backend = builder.AddProject<Projects.Microsoft_AutoGen_AgentHost>("backend").WithExternalHttpEndpoints();
var client = builder.AddProject<Projects.HelloAgent>("HelloAgentsDotNET")
.WithReference(backend)
.WithEnvironment("AGENT_HOST", backend.GetEndpoint("https"))
.WithEnvironment("STAY_ALIVE_ON_GOODBYE", "true")
.WaitFor(backend);
// xlang is over http for now - in prod use TLS between containers
builder.AddPythonApp("HelloAgentsPython", "../../../../python/samples/core_xlang_hello_python_agent", "hello_python_agent.py", "../../.venv")
.WithReference(backend)
.WithEnvironment("AGENT_HOST", backend.GetEndpoint("http"))
.WithEnvironment("STAY_ALIVE_ON_GOODBYE", "true")
.WithEnvironment("GRPC_DNS_RESOLVER", "native")
.WithOtlpExporter()
.WaitFor(client);
using var app = builder.Build();
await app.StartAsync();
var url = backend.GetEndpoint("http").Url;
Console.WriteLine("Backend URL: " + url);
await app.WaitForShutdownAsync();
你可以在Microsoft.AutoGen.Integration.Tests.AppHost目录中找到更多关于如何使用Aspire和XLang代理的示例。
配置日志记录
SDK 使用 Microsoft.Extensions.Logging 框架进行日志记录。以下是一个带有一些有用默认设置的 appsettings.json 文件示例:
{
"Logging": {
"LogLevel": {
"Default": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.AspNetCore": "Information",
"Microsoft": "Information",
"Microsoft.Orleans": "Warning",
"Orleans.Runtime": "Error",
"Grpc": "Information"
}
},
"AllowedHosts": "*",
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
}
}
在协议缓冲区中定义消息类型
定义一个在Python和.NET代理中使用的常见事件或消息类型的便捷方法是定义你的事件。这里涵盖了相关内容:使用协议缓冲来定义消息类型。