目录

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代理中使用的常见事件或消息类型的便捷方法是定义你的事件。这里涵盖了相关内容:使用协议缓冲来定义消息类型