Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az Ügynökről ügynökre (A2A) protokoll lehetővé teszi a különböző keretrendszerekkel és technológiákkal létrehozott ügynökök közötti szabványosított kommunikációt. Ez a lap az Agent Framework-ügynökök A2A-kiszolgálóként való felfedéséről nyújt útmutatást.
Távoli A2A-ügynök felderítéséhez és meghívásához tekintse meg az A2A-ügynökszolgáltatást.
Mi az A2A?
Az A2A egy szabványosított protokoll, amely a következőket támogatja:
- Ügynökfelderítés ügynökkártyákon keresztül
- Üzenetalapú kommunikáció ügynökök között
- Hosszú ideig futó ügynökalapú folyamatok feladatokon keresztül
- Platformfüggetlen együttműködés a különböző ügynök-keretrendszerek között
További információkért lásd az A2A protokoll specifikációját.
A Microsoft.Agents.AI.Hosting.A2A.AspNetCore kódtár ASP.NET Core-integrációt biztosít az ügynökök A2A protokollon keresztüli felfedéséhez.
NuGet-csomagok:
Example
Ez a minimális példa bemutatja, hogyan tehet közzé egy ügynököt az A2A-on keresztül. A minta OpenAPI- és Swagger-függőségeket tartalmaz a tesztelés egyszerűsítése érdekében.
1. ASP.NET Core Web API-projekt létrehozása
Hozzon létre egy új ASP.NET Core Web API-projektet, vagy használjon egy meglévőt.
2. A szükséges függőségek telepítése
Telepítse a következő csomagokat:
Futtassa a következő parancsokat a projektkönyvtárban a szükséges NuGet-csomagok telepítéséhez:
# Hosting.A2A.AspNetCore for A2A protocol integration
dotnet add package Microsoft.Agents.AI.Hosting.A2A.AspNetCore --prerelease
# Libraries to connect to Microsoft Foundry
dotnet add package Azure.AI.Projects --prerelease
dotnet add package Azure.Identity
dotnet add package Microsoft.Agents.AI.Foundry --prerelease
# Swagger to test app
dotnet add package Microsoft.AspNetCore.OpenApi
dotnet add package Swashbuckle.AspNetCore
3. A Microsoft Foundry-kapcsolat konfigurálása
Az alkalmazáshoz Microsoft Foundry-projektkapcsolat szükséges. Konfigurálja a végpontot és az üzembe helyezés nevét a dotnet user-secrets vagy a környezeti változók használatával.
Egyszerűen szerkesztheti is a appsettings.jsondokumentumot, de az éles környezetben üzembe helyezett alkalmazások esetében ez nem ajánlott, mivel egyes adatok titkosnak tekinthetők.
dotnet user-secrets set "AZURE_OPENAI_ENDPOINT" "https://<your-openai-resource>.openai.azure.com/"
dotnet user-secrets set "AZURE_OPENAI_DEPLOYMENT_NAME" "gpt-4o-mini"
4. Adja hozzá a kódot a Program.cs
Cserélje le a Program.cs tartalmát a következő kóddal, és futtassa az alkalmazást:
using A2A.AspNetCore;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Hosting;
using Microsoft.Extensions.AI;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenApi();
builder.Services.AddSwaggerGen();
string endpoint = builder.Configuration["AZURE_OPENAI_ENDPOINT"]
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
string deploymentName = builder.Configuration["AZURE_OPENAI_DEPLOYMENT_NAME"]
?? throw new InvalidOperationException("AZURE_OPENAI_DEPLOYMENT_NAME is not set.");
// Register the chat client
IChatClient chatClient = new AIProjectClient(
new Uri(endpoint),
new DefaultAzureCredential())
.GetProjectOpenAIClient()
.GetProjectResponsesClient()
.AsIChatClient(deploymentName);
builder.Services.AddSingleton(chatClient);
// Register an agent
var pirateAgent = builder.AddAIAgent("pirate", instructions: "You are a pirate. Speak like a pirate.");
var app = builder.Build();
app.MapOpenApi();
app.UseSwagger();
app.UseSwaggerUI();
// Expose the agent via A2A protocol. You can also customize the agentCard
app.MapA2A(pirateAgent, path: "/a2a/pirate", agentCard: new()
{
Name = "Pirate Agent",
Description = "An agent that speaks like a pirate.",
Version = "1.0"
});
app.Run();
Warning
DefaultAzureCredential a fejlesztéshez kényelmes, de a termelési környezetben gondos megfontolást igényel. Éles környezetben fontolja meg egy adott hitelesítő adat (pl. ManagedIdentityCredential) használatát a késési problémák elkerülése, a hitelesítő adatok nem szándékos próbálgatásának és a tartalék mechanizmusokból eredő esetleges biztonsági kockázatok elkerülése érdekében.
Az ügynök tesztelése
Az alkalmazás futtatása után tesztelheti az A2A-ügynököt a következő .http fájl vagy a Swagger felhasználói felületén keresztül.
A bemeneti formátum megfelel az A2A specifikációjának. Megadhat értékeket a következőhöz:
-
messageId- Az adott üzenet egyedi azonosítója. Létrehozhat saját azonosítót (például egy GUID-t), vagy beállíthatjanullértékre, hogy az ügynök automatikusan generálhasson egyet. -
contextId- A beszélgetés azonosítója. Adja meg a saját azonosítóját egy új beszélgetés indításához, vagy egy meglévő folytatásához egy korábbicontextIdújrahasználásával. Az ügynök ugyanahhozcontextIdkapcsolódóan fenntartja a beszélgetési előzményeket. Az ügynök önnek is létrehoz egyet, ha nincs megadva.
# Send A2A request to the pirate agent
POST {{baseAddress}}/a2a/pirate/v1/message:stream
Content-Type: application/json
{
"message": {
"kind": "message",
"role": "user",
"parts": [
{
"kind": "text",
"text": "Hey pirate! Tell me where have you been",
"metadata": {}
}
],
"messageId": null,
"contextId": "foo"
}
}
Megjegyzés: Cserélje le a {{baseAddress}} kifejezést a kiszolgáló végpontjával.
Ez a kérés a következő JSON-választ adja vissza:
{
"kind": "message",
"role": "agent",
"parts": [
{
"kind": "text",
"text": "Arrr, ye scallywag! Ye’ll have to tell me what yer after, or be I walkin’ the plank? 🏴☠️"
}
],
"messageId": "chatcmpl-CXtJbisgIJCg36Z44U16etngjAKRk",
"contextId": "foo"
}
A válasz tartalmazza a contextId (beszélgetés azonosítóját), messageId (üzenetazonosító) és a kalózügynök tényleges tartalmát.
AgentCard-konfiguráció
A AgentCard szolgáltatás metaadatokat biztosít az ügynökről a felderítéshez és az integrációhoz:
app.MapA2A(agent, "/a2a/my-agent", agentCard: new()
{
Name = "My Agent",
Description = "A helpful agent that assists with tasks.",
Version = "1.0",
});
Az ügynökkártyát a következő kérés elküldésével érheti el:
# Send A2A request to the pirate agent
GET {{baseAddress}}/a2a/pirate/v1/card
Megjegyzés: Cserélje le a {{baseAddress}} kifejezést a kiszolgáló végpontjával.
AgentCard tulajdonságai
- Név: Az ügynök megjelenítendő neve
- Leírás: Az ügynök rövid leírása
- Verzió: Az ügynök verziószövege
- Url: Végpont URL-címe (automatikusan hozzárendelve, ha nincs megadva)
- Képességek: Választható metaadatok a streamelésről, a leküldéses értesítésekről és más funkciókról
Több ügynök leleplezése
Egyetlen alkalmazásban több ügynököt is közzétehet, feltéve, hogy a végpontok nem ütköznek egymással. Íme egy példa:
var mathAgent = builder.AddAIAgent("math", instructions: "You are a math expert.");
var scienceAgent = builder.AddAIAgent("science", instructions: "You are a science expert.");
app.MapA2A(mathAgent, "/a2a/math");
app.MapA2A(scienceAgent, "/a2a/science");
A agent-framework-a2a csomag egy Agent Framework-ügynököt tesz elérhetővé az A2A protokollon keresztül.
pip install agent-framework-a2a --pre
Biztonságos végpont tesztelése
Használjon egy AuthInterceptor tesztügyfélt egy biztonságos A2A-végpont ellenőrzéséhez:
from a2a.client.auth.interceptor import AuthInterceptor
class BearerAuth(AuthInterceptor):
def __init__(self, token: str):
self.token = token
async def intercept(self, request):
request.headers["Authorization"] = f"Bearer {self.token}"
return request
async with A2AAgent(
name="secure-agent",
url="https://secure-a2a-agent.example.com",
auth_interceptor=BearerAuth("your-token"),
) as agent:
response = await agent.run("Hello!")
Agent Framework-ügynök elérhetővé tétele A2A-n keresztül
A agent-framework-a2a csomag egy előre kialakított A2AExecutor biztosít, amely bármely Agent Framework-ügynököt az A2A kiszolgálóoldali protokollhoz igazítja. Futtatja az ügynököt, a támogatott kimeneti tartalmat A2A-eseményekhez és -artefaktumokhoz rendeli, és a feladatállapot-frissítéseket a hivatalos a2a-sdk segítségével kezeli.
Az alkalmazás összeállítja a környező A2A SDK-kiszolgálót: az ügynökkártyát, DefaultRequestHandlera feladattárat, az útvonalakat vagy az alkalmazásszerkesztőt, a hitelesítést és az üzembe helyezést. Az alkalmazás tulajdonában lévő adapterek és a(z) agent-framework-hosting-a2a önálló konverziós segédprogramok összehasonlítását lásd itt: Saját üzemeltetésű A2A-ügynökök.
import uvicorn
from a2a.server.request_handlers import DefaultRequestHandler
from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
from a2a.server.tasks import InMemoryTaskStore
from a2a.types import AgentCapabilities, AgentCard, AgentInterface, AgentSkill
from agent_framework import Agent
from agent_framework.a2a import A2AExecutor
from agent_framework.openai import OpenAIChatClient
from starlette.applications import Starlette
flight_skill = AgentSkill(
id="Flight_Booking",
name="Flight Booking",
description="Search and book flights across Europe.",
tags=["flights", "travel", "europe"],
examples=[],
)
public_agent_card = AgentCard(
name="Europe Travel Agent",
description="Helps users search and book flights and hotels across Europe.",
version="1.0.0",
default_input_modes=["text"],
default_output_modes=["text"],
capabilities=AgentCapabilities(streaming=True),
supported_interfaces=[
AgentInterface(url="http://localhost:9999/", protocol_binding="JSONRPC"),
],
skills=[flight_skill],
)
agent = Agent(
client=OpenAIChatClient(),
name="Europe Travel Agent",
instructions="You are a helpful Europe Travel Agent.",
)
request_handler = DefaultRequestHandler(
agent_executor=A2AExecutor(agent, stream=True),
task_store=InMemoryTaskStore(),
agent_card=public_agent_card,
)
server = Starlette(
routes=[
*create_agent_card_routes(public_agent_card),
*create_jsonrpc_routes(request_handler, "/"),
]
)
uvicorn.run(server, host="0.0.0.0", port=9999)
A2AExecutor az ügynök frissítéseit A2A-artefaktumokként továbbítja adatfolyamként, ha az alapul szolgáló ügynök támogatja a streamelést, és az A2A context_id elemet az ügynökmunkamenet session_id elemeként propagálja. Alosztályozhatja a A2AExecutor elemet, és felülírhatja a handle_events metódust, hogy az ügynök kimeneti formátumából az A2A protokoll eseményeivé történő egyéni átalakításokat valósítson meg.
A2A protokoll
A Go Agent Framework az Ügynökről ügynökre (A2A) protokollal és a hivatalos A2A Go-kiszolgálókezelőkkel támogatja az provider/a2aprovider Ügynök-keretrendszer-ügynökök üzemeltetését.
Telepítse az Agent Framework és az A2A csomagokat a Go modulban:
go get github.com/microsoft/agent-framework-go
go get github.com/a2aproject/a2a-go/v2
Ügynök üzemeltetése az A2A-on keresztül
Hozzon létre vagy használjon újra egy Agent Framework-ügynököt, írja le egy A2A-ügynökkártyával, és tegye elérhetővé az egyik A2A transzportkötésen keresztül. Ebben a példában bármelyik Ügynök-keretrendszer hostAgentszerepel; *agent.Agent a kiszolgáló egy JSON-RPC végpontot / üzemeltet, és az ügynökkártyát a jól ismert A2A-útvonalon szolgálja ki.
import (
"fmt"
"net/http"
"github.com/a2aproject/a2a-go/v2/a2a"
"github.com/a2aproject/a2a-go/v2/a2asrv"
"github.com/microsoft/agent-framework-go/provider/a2aprovider"
)
url := "http://localhost:5000"
card := &a2a.AgentCard{
Name: "InvoiceAgent",
Description: "Handles requests relating to invoices.",
Version: "1.0.0",
DefaultInputModes: []string{"text"},
DefaultOutputModes: []string{"text"},
Capabilities: a2a.AgentCapabilities{
Streaming: false,
},
SupportedInterfaces: []*a2a.AgentInterface{
a2a.NewAgentInterface(url, a2a.TransportProtocolJSONRPC),
},
}
mux := http.NewServeMux()
requestHandler := a2asrv.NewHandler(
a2aprovider.NewExecutor(hostAgent, a2aprovider.ExecutorConfig{}),
a2asrv.WithExtendedAgentCard(card),
)
mux.Handle("/", a2asrv.NewJSONRPCHandler(requestHandler))
mux.Handle(a2asrv.WellKnownAgentCardPath, a2asrv.NewStaticAgentCardHandler(card))
if err := http.ListenAndServe(":5000", mux); err != nil {
panic(fmt.Errorf("A2A server failed: %w", err))
}
Amikor elérhetővé szeretné tenni a HTTP+JSON szállítási kötést, vegye körül ugyanezt a kéréskezelőt ezzel: a2asrv.NewRESTHandler Állítsa a(z) ExecutorConfig.AllowBackgroundResponses értékét true értékre, ha az üzemeltetett ügynök számára engedélyezni kell, hogy hosszú ideig futó munkákhoz A2A-feladatokat adjon vissza.
Lásd még
- Integrációk áttekintése
- A2A-ügynökszolgáltatás
- OpenAI-integráció
- A2A protokoll specifikációja
- Ügynökfelderítés