A2A-Hosting

Das Agent Framework stellt Hostingpakete bereit, die Ihre KI-Agents über das Agent-to-Agent(A2A)-Protokoll verfügbar machen. Nach der Bereitstellung kann jeder A2A-kompatible Client unabhängig davon, mit welchem Framework oder welcher Technologie der Client erstellt wurde, Ihre agents erkennen und mit ihnen kommunizieren.

NuGet-Pakete:

Erste Schritte

Installieren Sie das ASP.NET Core-Hostingpaket (es wird automatisch in das Kernpaket übernommen):

dotnet add package Microsoft.Agents.AI.Hosting.A2A.AspNetCore --prerelease
dotnet add package A2A.AspNetCore --prerelease
dotnet add package Azure.AI.Projects --prerelease
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease

Das folgende Beispiel zeigt eine minimale ASP.NET Core-Anwendung, die einen einzelnen Agent über A2A hosten kann. Es verwendet Microsoft Foundry als KI-Anbieter – siehe Anbieter für andere Optionen.

using A2A;
using A2A.AspNetCore;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

string endpoint = builder.Configuration["AZURE_AI_PROJECT_ENDPOINT"]
    ?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
string model = builder.Configuration["AZURE_AI_MODEL"] ?? "gpt-4o-mini";

// 1. Create and register the "weather-agent" agent in the DI container.
builder.Services.AddKeyedSingleton<AIAgent>("weather-agent", (sp, _) =>
{
    return new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
        .AsAIAgent(
            model: model,
            instructions: "You are a helpful weather assistant.",
            name: "weather-agent");
});

// 2. Register the A2A server for the "weather-agent" agent.
builder.AddA2AServer("weather-agent");

var app = builder.Build();

// 3. Map A2A protocol endpoints for the "weather-agent" agent.
app.MapA2AHttpJson("weather-agent", "/a2a/weather-agent");

// 4. Serve a minimal agent card for the "weather-agent" agent discovery.
app.MapWellKnownAgentCard(new AgentCard
{
    Name = "WeatherAgent",
    Description = "A helpful weather assistant.",
    SupportedInterfaces =
    [
        new AgentInterface
        {
            Url = "http://localhost:5000/a2a/weather-agent",
            ProtocolBinding = ProtocolBindingNames.HttpJson,
            ProtocolVersion = "1.0",
        }
    ]
});

app.Run();

Der Agent ist jetzt über /a2a/weather-agent die A2A HTTP+JSON-Protokollbindung erreichbar, und seine Agentkarte ist auffindbar unter /.well-known/agent.json. Jeder A2A-kompatible Client kann diesen Agent ermitteln und kommunizieren.

Protokollbindungen

Das A2A-Protokoll definiert zwei Transportbindungen. Beide werden unterstützt:

Bindung Methode Beschreibung
HTTP+JSON MapA2AHttpJson Standard-HTTP-Anforderungen und Server-Sent-Ereignisse für Streaming.
JSON-RPC MapA2AJsonRpc JSON-RPC 2.0 über HTTP.

Sie können beide Bindungen gleichzeitig zuordnen, damit Clients ihren bevorzugten Transport auswählen können. Bei Bedarf können verschiedene Pfade verwendet werden:

app.MapA2AHttpJson("weather-agent", "/a2a/weather-agent");  // HTTP+JSON
app.MapA2AJsonRpc("weather-agent", "/a2a/weather-agent");   // JSON-RPC

Agent-Karte

Agentkarten beschreiben die Metadaten Ihres Agents – Name, Beschreibung, Version und unterstützte Schnittstellen – damit Clients ihre Funktionen vor dem Senden von Anforderungen ermitteln und verstehen können. Im Abschnitt " Erste Schritte " wird eine minimale Agentkarte angezeigt. Stellen Sie für die Produktionsverwendung eine vollständig ausgefüllte Karte bereit:

using A2A;
using A2A.AspNetCore;

app.MapWellKnownAgentCard(new AgentCard
{
    Name = "WeatherAgent",
    Description = "A helpful weather assistant.",
    Version = "1.0",
    DefaultInputModes = ["text"],
    DefaultOutputModes = ["text"],
    SupportedInterfaces =
    [
        new AgentInterface
        {
            Url = "http://localhost:5000/a2a/weather-agent",
            ProtocolBinding = ProtocolBindingNames.HttpJson,
            ProtocolVersion = "1.0",
        }
    ]
});

Note

MapWellKnownAgentCard wird vom A2A SDK-Paket (A2A.AspNetCore) bereitgestellt, nicht von den Agent Framework-Hostingpaketen.

Tip

Pro Host kann nur eine Agentkarte bedient werden, sodass nur ein Agent über den bekannten Pfad auffindbar ist. Andere Agents können weiterhin direkt über die URL erreicht werden. Weitere Optionen finden Sie unter Agent Discovery .

Funktionsweise von AddA2AServer

Die AddA2AServer-Methode registriert einen A2AServer-Singleton mit Schlüssel im Abhängigkeitsinjektions-Container. Wenn der Server eingerichtet wird, löst er mehrere interne Komponenten auf oder erstellt diese:

Bestandteil Standard Purpose
IAgentHandler A2AAgentHandler Vermittelt eingehende A2A-Anforderungen an die AIAgent. Übersetzt Nachrichten, führt den Agent aus und gibt Antworten als A2A-Nachrichten zurück.
AgentSessionStore InMemoryAgentSessionStore Speichert Sitzungen, damit der Agent den Kontext über mehrere Anforderungen hinweg mit demselben contextId aufrechterhalten kann.
ITaskStore InMemoryTaskStore Verfolgt den Aufgabenstatus für lang andauernde A2A-Vorgänge.
AgentRunMode DisallowBackground Steuert, ob der Agent Hintergrundantworten (A2A-Aufgaben) anstelle von Sofortnachrichten zurückgeben kann.

Warning

Der Standardwert InMemoryAgentSessionStore und InMemoryTaskStore ist nur für die Entwicklung vorgesehen. Der Zustand geht beim Neustart der Anwendung verloren und wird nicht zwischen mehreren Instanzen geteilt. Registrieren Sie bei Produktionsbereitstellungen dauerhafte Implementierungen.

Außerkraftsetzung von Standardwerten

Sie können diese Komponenten ersetzen, indem Sie schlüsselierte Dienste im DI-Container registrieren, bevor Sie aufrufen AddA2AServer. Der Server löst Dienstleistungen mit Schlüssel unter Verwendung des Agentnamens als Schlüssel auf.

Benutzerdefinierter Sitzungsspeicher – für die beständige Speicherung von Sitzungsdaten:

builder.Services.AddKeyedSingleton<AgentSessionStore>("weather-agent", new MyDurableSessionStore());

builder.AddA2AServer("weather-agent");

Benutzerdefinierter Aufgabenspeicher – für dauerhafte Aufgabenverfolgung:

builder.Services.AddKeyedSingleton<ITaskStore>("weather-agent", new MyDurableTaskStore());

builder.AddA2AServer("weather-agent");

Benutzerdefinierter Agent-Handler – um die vollständige Kontrolle über die Anforderungsverarbeitung zu übernehmen. Wenn ein Schlüssel IAgentHandler registriert wird, ersetzt er den Standardwert A2AAgentHandler vollständig:

builder.Services.AddKeyedSingleton<IAgentHandler>("weather-agent", new MyCustomHandler());

builder.AddA2AServer("weather-agent");

Agent-Ausführungsmodus – konfigurieren über A2AServerRegistrationOptions:

builder.AddA2AServer("weather-agent", options =>
{
    options.AgentRunMode = AgentRunMode.DisallowBackground;
});

Mehrere Agents

Sie können mehrere Agents in einer einzigen Anwendung hosten. Jeder Agent erhält einen eigenen A2A-Server und einen eigenen Endpunkt:

// Register agents in DI.
builder.Services.AddKeyedSingleton<AIAgent>("weather-agent", (sp, _) =>
{
    return new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
        .AsAIAgent(model: model, instructions: "You are a helpful weather assistant.", name: "weather-agent");
});

builder.Services.AddKeyedSingleton<AIAgent>("scientist", (sp, _) =>
{
    return new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
        .AsAIAgent(model: model, instructions: "You are a scientist.", name: "scientist");
});

// Register A2A servers.
builder.AddA2AServer("weather-agent");
builder.AddA2AServer("scientist");

var app = builder.Build();

// Map endpoints.
app.MapA2AHttpJson("weather-agent", "/a2a/weather-agent");
app.MapA2AHttpJson("scientist", "/a2a/scientist");

app.Run();

In diesem Beispiel verfügt kein Agent über eine Agentkarte, sodass Clients die Endpunkt-URLs direkt kennen müssen. Sie können die Agenten-Kartenerkennung mit MapWellKnownAgentCard hinzufügen, aber es kann nur ein Agent pro Host angekündigt werden – siehe Agent-Karte.

Hintergrundantworten

Note

Hintergrundantworten werden bei A2A-gehosteten Agenten noch nicht unterstützt. Standardmäßig ist AgentRunMode auf DisallowBackground eingestellt, was bedeutet, dass alle Antworten als sofortige A2A-Nachrichten zurückgegeben werden.

Nächste Schritte

Siehe auch