目录

AutoGen 核心

AutoGen Core for .NET 遵循其 Python 对应版本的相同概念和约定。事实上,为了理解 .NET 版本的概念,我们建议您首先阅读 Python 文档。除非另有说明,Python 版本中的概念也适用于 .NET。

语言版本之间的任何重要差异都记录在 与 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 事件中心等消息服务的集成。xlang 功能要求您的代理消息可序列化为 CloudEvents。消息通过 Grpc 作为 CloudEvents 交换,运行时负责确保消息被传递到正确的代理。

要使用分布式运行时,您需要将以下包添加到您的项目中:

dotnet add package Microsoft.AutoGen.Core.Grpc

这是与您的代理一起在应用程序中运行并连接到分布式系统的包。

要运行后端/服务器端,您需要:

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"
    }
  }
}

在 Protocol Buffers 中定义消息类型

一种方便的方法是在 Python 和 .NET 代理中定义要使用的通用事件或消息类型,即定义您的事件。这在这里有所涵盖:使用 Protocol Buffers 定义消息类型