Sdílet prostřednictvím


Integrace A2A

Protokol A2A (Agent-to-Agent) umožňuje standardizovanou komunikaci mezi agenty, což umožňuje bezproblémovou komunikaci agentů vytvořených s různými architekturami a technologiemi.

Co je A2A?

A2A je standardizovaný protokol, který podporuje:

  • Zjišťování agentů prostřednictvím karet agenta
  • Komunikace založená na zprávách mezi agenty
  • Dlouhotrvající agentické procesy prostřednictvím úkolů
  • Interoperabilita mezi platformami mezi různými architekturami agentů

Další informace najdete ve specifikaci protokolu A2A.

Knihovna Microsoft.Agents.AI.Hosting.A2A.AspNetCore poskytuje integraci ASP.NET Core pro expozici vašich agentů prostřednictvím protokolu A2A.

Balíčky NuGet:

Example

Tento minimální příklad ukazuje, jak vystavit agenta prostřednictvím A2A. Ukázka zahrnuje závislosti OpenAPI a Swagger, které zjednodušují testování.

1. Vytvoření projektu webového rozhraní API ASP.NET Core

Vytvořte nový projekt webového rozhraní API ASP.NET Core nebo použijte existující projekt.

2. Instalace požadovaných závislostí

Nainstalujte následující balíčky:

Spuštěním následujících příkazů v adresáři projektu nainstalujte požadované balíčky NuGet:

# Hosting.A2A.AspNetCore for A2A protocol integration
dotnet add package Microsoft.Agents.AI.Hosting.A2A.AspNetCore --prerelease

# Libraries to connect to Azure OpenAI
dotnet add package Azure.AI.OpenAI --prerelease
dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.AI
dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease

# Swagger to test app
dotnet add package Microsoft.AspNetCore.OpenApi
dotnet add package Swashbuckle.AspNetCore

3. Konfigurace připojení Azure OpenAI

Aplikace vyžaduje připojení Azure OpenAI. Nakonfigurujte koncový bod a název nasazení pomocí dotnet user-secrets nebo proměnných prostředí. Můžete také jednoduše upravit appsettings.json, ale to se nedoporučuje pro aplikace nasazené v produkčním prostředí, protože některá data se dají považovat za tajná.

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. Přidejte kód do Program.cs

Nahraďte obsah Program.cs následujícím kódem a spusťte aplikaci:

using A2A.AspNetCore;
using Azure.AI.OpenAI;
using Azure.Identity;
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 AzureOpenAIClient(
        new Uri(endpoint),
        new DefaultAzureCredential())
    .GetChatClient(deploymentName)
    .AsIChatClient();
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();

Testování agenta

Po spuštění aplikace můžete agenta A2A otestovat pomocí následujícího .http souboru nebo pomocí uživatelského rozhraní Swagger.

Vstupní formát odpovídá specifikaci A2A. Můžete zadat hodnoty pro:

  • messageId – Jedinečný identifikátor pro tuto konkrétní zprávu. Můžete vytvořit vlastní ID (např. GUID) nebo ho nastavit na null, aby ho agent vygeneroval automaticky.
  • contextId - Identifikátor konverzace. Zadejte vlastní ID, abyste mohli zahájit novou konverzaci nebo pokračovat v existující konverzaci opětovným použitím předchozího contextId. Agent bude spravovat historii konverzací pro tentýž contextId. Agent pro vás vygeneruje také jeden, pokud není k dispozici.
# 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"
  }
}

Poznámka: Nahraďte {{baseAddress}} koncovým bodem serveru.

Tento požadavek vrátí následující odpověď JSON:

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

Odpověď obsahuje contextId (identifikátor konverzace), messageId (identifikátor zprávy) a skutečný obsah od pirátských agentů.

Konfigurace AgentCard

Tento AgentCard poskytuje metadata o vašem agentovi pro objevování a integraci.

app.MapA2A(agent, "/a2a/my-agent", agentCard: new()
{
    Name = "My Agent",
    Description = "A helpful agent that assists with tasks.",
    Version = "1.0",
});

K kartě agenta se dostanete odesláním tohoto požadavku:

# Send A2A request to the pirate agent
GET {{baseAddress}}/a2a/pirate/v1/card

Poznámka: Nahraďte {{baseAddress}} koncovým bodem serveru.

Vlastnosti AgentCard

  • Název: Zobrazovaný název agenta
  • Popis: Stručný popis agenta
  • Verze: Řetězec verze pro agenta
  • Adresa URL: Adresa URL koncového bodu (automaticky přiřazená, pokud není zadána)
  • Možnosti: Volitelná metadata o streamování, nabízených oznámeních a dalších funkcích

Zpřístupnění více agentů

V jedné aplikaci můžete vystavit více agentů, pokud jejich koncové body nekolidují. Tady je příklad:

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");

Balíček agent-framework-a2a umožňuje připojit se k externím agentům kompatibilním s A2A a komunikovat s ní.

pip install agent-framework-a2a --pre

Připojení k agentovi A2A

Použijte A2AAgent k zabalení jakéhokoli vzdáleného koncového bodu A2A. Agent vyřeší možnosti vzdáleného agenta prostřednictvím jeho AgentCard a zpracuje všechny podrobnosti protokolu.

import asyncio
import httpx
from a2a.client import A2ACardResolver
from agent_framework.a2a import A2AAgent

async def main():
    a2a_host = "https://your-a2a-agent.example.com"

    # 1. Discover the remote agent's capabilities
    async with httpx.AsyncClient(timeout=60.0) as http_client:
        resolver = A2ACardResolver(httpx_client=http_client, base_url=a2a_host)
        agent_card = await resolver.get_agent_card()
        print(f"Found agent: {agent_card.name}")

    # 2. Create an A2AAgent and send a message
    async with A2AAgent(
        name=agent_card.name,
        agent_card=agent_card,
        url=a2a_host,
    ) as agent:
        response = await agent.run("What are your capabilities?")
        for message in response.messages:
            print(message.text)

asyncio.run(main())

Odpovědi na streamování

A2A přirozeně podporuje streamování prostřednictvím Server-Sent Events — aktualizace přicházejí v reálném čase, jak vzdálený agent pracuje.

async with A2AAgent(name="remote", url="https://a2a-agent.example.com") as agent:
    async with agent.run("Tell me about yourself", stream=True) as stream:
        async for update in stream:
            for content in update.contents:
                if content.text:
                    print(content.text, end="", flush=True)

        final = await stream.get_final_response()
        print(f"\n({len(final.messages)} message(s))")

Dlouhotrvající úkoly

Ve výchozím nastavení A2AAgent čeká, až vzdálený agent dokončí svou činnost, než se vrátí. U dlouhotrvajících úloh nastavte background=True , abyste získali token pro pokračování, který můžete použít k dotazování nebo opětovnému připisování později:

async with A2AAgent(name="worker", url="https://a2a-agent.example.com") as agent:
    # Start a long-running task
    response = await agent.run("Process this large dataset", background=True)

    if response.continuation_token:
        # Poll for completion later
        result = await agent.poll_task(response.continuation_token)
        print(result)

Autentizace

Použijte AuthInterceptor pro zabezpečené A2A koncové body:

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!")

Viz také

Další kroky