Inhaltsverzeichnis

AutoGen Core

AutoGen Core für .NET folgt den gleichen Konzepten und Konventionen wie sein Python-Pendant. Tatsächlich empfehlen wir, zuerst die Python-Dokumentation zu lesen, um die Konzepte in der .NET-Version zu verstehen. Sofern nicht anders angegeben, gelten die Konzepte der Python-Version auch für .NET.

Wichtige Unterschiede zwischen den Sprachversionen werden im Abschnitt Unterschiede zu Python dokumentiert. Dinge, die nur eine bestimmte Sprache betreffen, wie z. B. Dependency Injection oder Host Builder-Muster, werden in diesem Dokument nicht aufgeführt.

Erste Schritte

Sie können das SDK als NuGet-Paket erhalten oder das Repository klonen. Das SDK ist auf NuGet verfügbar. Minimal benötigen Sie Folgendes

dotnet add package Microsoft.AutoGen.Contracts
dotnet add package Microsoft.AutoGen.Core

Ausführlichere Hinweise zur Installation aller zugehörigen Pakete finden Sie unter Installation.

Sie können schnell loslegen, indem Sie sich die Beispiele im Verzeichnis samples des Repositorys ansehen.

Agenten erstellen

Um einen Agenten zu erstellen, können Sie von BaseAgent erben und Event-Handler für die Ereignisse implementieren, die Sie interessieren. Hier ist ein minimales Beispiel, das zeigt, wie von BaseAgent geerbt und ein Event-Handler implementiert wird

public class MyAgent : BaseAgent, IHandle<MyMessage>
{
    // ...
    public async ValueTask HandleAsync(MyMessage item, MessageContext context)
    {
        // ...logic here...
    }
}

Durch das Überschreiben von BaseAgent erhalten Sie Zugriff auf die Laufzeit- und Protokollierungsdienstprogramme und durch die Implementierung von IHandlekönnen Sie einfach Event-Handling-Methoden für Ihre benutzerdefinierten Nachrichten definieren.

Agenten in einer Anwendung ausführen

Um Ihren Agenten in einer Anwendung auszuführen, können Sie die Klasse AgentsAppBuilder verwenden. Hier ist ein Beispiel, wie ein Agent 'HelloAgent' in einer Anwendung ausgeführt wird

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 Runtimes

Das .NET SDK enthält sowohl eine InMemory Single Process Runtime als auch eine Remote, Distributed Runtime für die Ausführung Ihrer Agenten in der Cloud. Die Distributed Runtime unterstützt die Ausführung von Agenten in Python und .NET, sodass diese Agenten miteinander kommunizieren können. Die Distributed Runtime verwendet Microsoft Orleans, um Ausfallsicherheit, Persistenz und Integration mit Messaging-Diensten wie Azure Event Hubs zu gewährleisten. Die xlang-Funktionalität erfordert, dass die Nachrichten Ihres Agenten als CloudEvents serialisierbar sind. Die Nachrichten werden als CloudEvents über gRPC ausgetauscht, und die Runtime kümmert sich darum, dass die Nachrichten an die richtigen Agenten geliefert werden.

Um die Distributed Runtime zu verwenden, müssen Sie das folgende Paket zu Ihrem Projekt hinzufügen

dotnet add package Microsoft.AutoGen.Core.Grpc

Dies ist das Paket, das in der Anwendung mit Ihrem/Ihren Agenten ausgeführt wird und sich mit dem verteilten System verbindet.

Um das Backend/Server zu betreiben, benötigen Sie

dotnet add package Microsoft.AutoGen.RuntimeGateway
dotnet add package Microsoft.AutoGen.AgentHost

Sie können das Backend separat ausführen

dotnet run --project Microsoft.AutoGen.AgentHost

oder Sie können es in Ihre eigene Anwendung integrieren

using Microsoft.AutoGen.RuntimeGateway;
using Microsoft.AutoGen.AgentHost;
var autogenBackend = await Microsoft.AutoGen.RuntimeGateway.Grpc.Host.StartAsync(local: false, useGrpc: true).ConfigureAwait(false);

Sie können die Laufzeit auch als .NET-Tool installieren

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 

Mehrere Agenten und die Laufzeit in separaten Prozessen mit .NET Aspire ausführen

Das Projekt Hello.AppHost veranschaulicht, wie ein verteiltes System mit mehreren Agenten und der Laufzeit in separaten Prozessen mit .NET Aspire orchestriert wird. Es verweist auch auf einen Python-Agenten, der zeigt, wie Agenten in verschiedenen Sprachen im selben verteilten System ausgeführt werden.

// 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();

Weitere Beispiele für die Verwendung von Aspire und XLang-Agenten finden Sie im Verzeichnis Microsoft.AutoGen.Integration.Tests.AppHost.

Protokollierung konfigurieren

Das SDK verwendet das Microsoft.Extensions.Logging-Framework für die Protokollierung. Hier ist eine Beispiel-appsettings.json-Datei mit einigen nützlichen Standardeinstellungen

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

Nachrichtentypen in Protocol Buffers definieren

Eine bequeme Möglichkeit, gemeinsame Ereignis- oder Nachrichtentypen zu definieren, die sowohl in Python- als auch in .NET-Agenten verwendet werden können, ist die Definition Ihrer Ereignisse. Dies wird hier behandelt: Verwendung von Protocol Buffers zur Definition von Nachrichtentypen.