Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
-
Microsoft.Agents.AI.Hosting.A2A.AspNetCore – ASP.NET Core-Endpunktzuordnung für A2A-Protokollbindungen. Dieses Paket schließt
Microsoft.Agents.AI.Hosting.A2Atransitiv ein. - Microsoft.Agents.AI.Hosting.A2A – Kernhostinglogik für das Überbrücken von KI-Agents zum A2A-Protokoll (Serverregistrierung, Anforderungsverarbeitung, Sitzungsverwaltung).
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.