A2A Agent

Umožňuje A2AAgent vaší aplikaci připojit se ke vzdáleným agentům, kteří jsou vystaveni prostřednictvím protokolu Agent-to-Agent (A2A). Zabalí každý koncový bod kompatibilní s A2A jako standard AIAgent, takže můžete používat známé metody jako RunAsync a RunStreamingAsync pracovat se vzdálenými agenty bez ohledu na to, s jakou architekturou nebo technologií byly vytvořeny.

Začínáme

Přidejte do projektu požadovaný balíček NuGet:

dotnet add package Microsoft.Agents.AI.A2A --prerelease

Zjišťování agentů

Před komunikací se vzdáleným agentem A2A ho musíte zjistit a vytvořit AIAgent instanci. Protokol A2A definuje tři strategie zjišťování, které podporuje rozhraní Agent Framework.

identifikátor URI Well-Known

Agenti A2A mohou zjistit svou kartu agenta na standardizované cestě: https://{domain}/.well-known/agent-card.json. A2ACardResolver Použijte k načtení karty a vytvoření agenta v jednom volání:

using A2A;
using Microsoft.Agents.AI;

// Initialize a resolver pointing at the remote agent's host.
A2ACardResolver resolver = new(new Uri("https://a2a-agent.example.com"));

// Resolve the agent card and create an AIAgent in one step.
AIAgent agent = await resolver.GetAIAgentAsync();

// Use the agent.
Console.WriteLine(await agent.RunAsync("Hello!"));

Tip

GetAIAgentAsync také přijímá volitelný A2AClientOptions parametr pro výběr protokolu.

zjišťování Catalog-Based

V podnikových prostředích nebo veřejných marketplacech se karty agentů často spravují centrálním registrem. Pokud již máte AgentCard získaný z takového registru, převeďte ho přímo na AIAgent:

using A2A;
using Microsoft.Agents.AI;

// Assume agentCard was retrieved from a registry or catalog.
AgentCard agentCard = await GetAgentCardFromRegistryAsync("travel-planner");

AIAgent agent = agentCard.AsAIAgent();

Console.WriteLine(await agent.RunAsync("Plan a trip to Paris."));

Přímá konfigurace

V případě úzce propojených systémů nebo vývojových scénářů, ve kterých je koncový bod agenta známý předem, vytvořte A2AClient přímo a převeďte ho na AIAgent:

using A2A;
using Microsoft.Agents.AI;

// Create a client pointing at the known agent endpoint.
A2AClient a2aClient = new(new Uri("https://a2a-agent.example.com"));

AIAgent agent = a2aClient.AsAIAgent(name: "my-agent", description: "A helpful assistant.");

Console.WriteLine(await agent.RunAsync("What can you help me with?"));

Výběr protokolu

Agenti A2A můžou vystavit více vazeb protokolu, jako jsou HTTP+JSON a JSON-RPC. Ve výchozím nastavení se upřednostňují protokoly HTTP+JSON před protokolem JSON-RPC. Slouží A2AClientOptions.PreferredBindings k explicitnímu řízení použité vazby protokolu:

Note

Vzdálený agent A2A musí být dostupný v koncovém bodu, který podporuje vybranou vazbu protokolu.

using A2A;
using Microsoft.Agents.AI;

A2ACardResolver agentCardResolver = new(new Uri("https://a2a-agent.example.com"));

AgentCard agentCard = await agentCardResolver.GetAgentCardAsync();

// Prefer HTTP+JSON protocol binding. For JSON-RPC, set PreferredBindings = [ProtocolBindingNames.JsonRpc]
A2AClientOptions options = new()
{
    PreferredBindings = [ProtocolBindingNames.HttpJson]
};

AIAgent agent = agentCard.AsAIAgent(options: options);

Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate."));

Streaming

A2A podporuje streamování odpovědí prostřednictvím Server-Sent Událostí. Umožňuje RunStreamingAsync přijímat aktualizace v reálném čase, protože vzdálený agent zpracovává požadavek:

using A2A;
using Microsoft.Agents.AI;

A2ACardResolver resolver = new(new Uri("https://a2a-agent.example.com"));
AIAgent agent = await resolver.GetAIAgentAsync();

await foreach (var update in agent.RunStreamingAsync("Write a short story about a robot."))
{
    if (!string.IsNullOrEmpty(update.Text))
    {
        Console.Write(update.Text);
    }
}

Odezvy na pozadí

Agenti A2A podporují odpovědi na pozadí pro zpracování dlouhotrvajících operací. Když vzdálený agent A2A místo okamžité zprávy vrátí úlohu, poskytuje rozhraní agenta token pokračování, který můžete použít k dotazování výsledků nebo opětovné připojení k přerušeným datovým proudům.

Dotazování na dokončení úkolu

V případě scénářů bez streamování použijte AllowBackgroundResponses k získání tokenu pokračování a dotazování, dokud se úloha nedokončí:

using A2A;
using Microsoft.Agents.AI;

A2ACardResolver resolver = new(new Uri("https://a2a-agent.example.com"));
AIAgent agent = await resolver.GetAIAgentAsync();

AgentSession session = await agent.CreateSessionAsync();

// AllowBackgroundResponses must be true so the server returns immediately with a continuation token
// instead of blocking until the task is complete.
AgentRunOptions options = new() { AllowBackgroundResponses = true };

// Start the initial run with a long-running task.
AgentResponse response = await agent.RunAsync(
    "Conduct a comprehensive analysis of quantum computing applications in cryptography.",
    session,
    options: options);

// Poll until the response is complete.
while (response.ContinuationToken is { } token)
{
    // Wait before polling again.
    await Task.Delay(TimeSpan.FromSeconds(2));

    // Continue with the token.
    response = await agent.RunAsync(session, options: new AgentRunOptions { ContinuationToken = token });
}

Console.WriteLine(response);

Opětovné připojení streamu

Ve scénářích streamování může každá aktualizace obsahovat token pro pokračování. Pokud dojde k přerušení datového proudu, pomocí tokenu se znovu připojte a získejte stream odpovědí od začátku:

using A2A;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;

A2ACardResolver resolver = new(new Uri("https://a2a-agent.example.com"));
AIAgent agent = await resolver.GetAIAgentAsync();

AgentSession session = await agent.CreateSessionAsync();

ResponseContinuationToken? continuationToken = null;

await foreach (var update in agent.RunStreamingAsync(
    "Conduct a comprehensive analysis of quantum computing applications in cryptography.",
    session))
{
    // Save the continuation token to reconnect later if the stream is interrupted.
    // Continuation tokens are only returned for long-running tasks. If the A2A agent
    // returns a message instead of a task, the continuation token will not be initialized.
    if (update.ContinuationToken is { } token)
    {
        continuationToken = token;
    }
}

// If the stream was interrupted and a continuation token was captured,
// reconnect to the response stream using the saved continuation token.
if (continuationToken is not null)
{
    await foreach (var update in agent.RunStreamingAsync(
        session,
        options: new() { ContinuationToken = continuationToken }))
    {
        if (!string.IsNullOrEmpty(update.Text))
        {
            Console.WriteLine(update.Text);
        }
    }
}

Note

Agenti A2A podporují opětovné připojení streamu (získání stejného streamu odpovědí od začátku), ne obnovení streamu z konkrétního bodu v datovém proudu.

Note

Dokumentace k agentům PythonU A2A bude brzy k dispozici.

Další kroky