Hospedaje de A2A

El Agent Framework proporciona paquetes de hospedaje que exponen sus agentes de IA a través del protocolo Agent-to-Agent (A2A). Una vez hospedado, cualquier cliente compatible con A2A puede detectar y comunicarse con los agentes, independientemente de la plataforma o tecnología con la que se creó el cliente.

Paquetes NuGet:

  • Microsoft.Agents.AI.Hosting.A2A.AspNetCore : asignación de puntos de conexión de ASP.NET Core para enlaces de protocolo A2A. Este paquete incluye transitivamente Microsoft.Agents.AI.Hosting.A2A.
  • Microsoft.Agents.AI.Hosting.A2A : lógica de hospedaje principal para puentear agentes de IA al protocolo A2A (registro del servidor, control de solicitudes, administración de sesiones).

Cómo empezar

Instale el paquete de hospedaje ASP.NET Core (extrae automáticamente el paquete principal):

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

En el ejemplo siguiente se muestra una aplicación ASP.NET Core mínima que hospeda un único agente a través de A2A. Usa Microsoft Foundry como proveedor de IA: consulte Proveedores para ver otras opciones.

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

El agente ahora es accesible a /a2a/weather-agent través del enlace de protocolo HTTP+JSON de A2A y su tarjeta de agente se puede detectar en /.well-known/agent.json. Cualquier cliente compatible con A2A puede detectar y comunicarse con este agente.

Enlaces de protocolo

El protocolo A2A define dos enlaces de transporte. Ambos son compatibles:

Binding Método Descripción
HTTP+JSON MapA2AHttpJson Solicitudes HTTP estándar y eventos enviados por el servidor para streaming.
JSON-RPC MapA2AJsonRpc JSON-RPC 2.0 a través de HTTP.

Puede mapear ambos vínculos simultáneamente de manera que los clientes puedan elegir su método de transporte preferido. Se pueden usar rutas de acceso diferentes si es necesario:

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

Tarjeta del agente

Las tarjetas de agente describen los metadatos del agente( nombre, descripción, versión e interfaces admitidas) para que los clientes puedan detectar y comprender sus funcionalidades antes de enviar solicitudes. En la sección Introducción se muestra una tarjeta de agente mínima. Para su uso en producción, proporcione una tarjeta totalmente rellenada:

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",
        }
    ]
});

Nota:

MapWellKnownAgentCard lo proporciona el paquete del SDK de A2A (A2A.AspNetCore), no los paquetes de hospedaje de Agent Framework.

Sugerencia

Solo se puede atender una tarjeta de agente por host, por lo que solo se puede detectar un agente a través de la ruta de acceso conocida. Todavía se puede acceder directamente a otros agentes mediante la URL. Consulte Detección de agentes para obtener más opciones.

Funcionamiento de AddA2AServer

El método AddA2AServer registra un singleton clave A2AServer en el contenedor de inyección de dependencias. Cuando se construye el servidor, resuelve o crea varios componentes internos:

Componente Predeterminado propósito
IAgentHandler A2AAgentHandler Conecta las solicitudes entrantes de A2A al AIAgent. Traduce mensajes, ejecuta el agente y devuelve respuestas como mensajes A2A.
AgentSessionStore InMemoryAgentSessionStore Almacena sesiones de conversación para que el agente pueda mantener el contexto en varias solicitudes con el mismo contextId.
ITaskStore InMemoryTaskStore Realiza un seguimiento del estado de la tarea para las operaciones A2A de ejecución prolongada.
AgentRunMode DisallowBackground Controla si el agente puede devolver respuestas en segundo plano (tareas A2A) en lugar de mensajes inmediatos.

Warning

El valor predeterminado InMemoryAgentSessionStore y InMemoryTaskStore solo están pensados para el desarrollo. El estado se pierde en el reinicio de la aplicación y no se comparte entre varias instancias. Para los despliegues de producción, registre implementaciones duraderas.

Anulación de los valores predeterminados

Puede reemplazar cualquiera de estos componentes mediante el registro de servicios con claves en el contenedor de inserción de dependencias antes de llamar a AddA2AServer. El servidor resuelve los servicios con clave mediante el nombre del agente como clave.

Almacén de sesión personalizado: para el almacenamiento de conversación persistente:

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

builder.AddA2AServer("weather-agent");

Almacén de tareas personalizado : para el seguimiento de tareas duradero:

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

builder.AddA2AServer("weather-agent");

Controlador de agente personalizado : para tomar el control total del procesamiento de solicitudes. Cuando se registra una clave IAgentHandler , reemplaza el valor predeterminado A2AAgentHandler por completo:

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

builder.AddA2AServer("weather-agent");

Modo de ejecución del agente - se configura mediante A2AServerRegistrationOptions:

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

Varios agentes

Puede hospedar varios agentes en una sola aplicación. Cada agente obtiene su propio servidor y punto de conexión A2A:

// 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();

En este ejemplo, ninguno de los agentes tiene una tarjeta de agente, por lo que los clientes deben conocer directamente las direcciones URL del punto de conexión. Puede agregar la detección de tarjetas de agente con MapWellKnownAgentCard, pero solo se puede anunciar un agente por host; consulte Tarjeta del agente.

Respuestas en segundo plano

Nota:

Las respuestas en segundo plano aún no se admiten para agentes hospedados en A2A. El AgentRunMode valor predeterminado es DisallowBackground, lo que significa que todas las respuestas se devuelven como mensajes A2A inmediatos.

Pasos siguientes

Consulte también