Protocolo Agent2Agent · A2A v1.0

Permita que los agentes implementados de forma independiente trabajar juntos.

A2A le brinda a un agente de IA una forma estándar de presentarse a otro agente, aceptar un trabajo o tarea, informar el progreso, solicitar más información y devolver resultados útiles, incluso cuando el otro agente se ejecuta en un servicio de IA diferente, usa un lenguaje de programación o marco de agente diferente, o está implementado en otra nube. Ninguno de los agentes necesita entender cómo está construido el otro. Utilizan el estándar A2A para comunicarse y trabajar juntos.

11 operaciones v1Tarjetas de agenteJSON-RPC + RESTTransmisión de SSETareas de varios turnosEmpuje autenticadoRemoteA2aAgent

Arquitectura de referencia ADK-Rust A2A

Arquitectura de agentes remotos A2A

The network contract stays separate from the agent's model, tools, memory, and internal orchestration.

01

sistema de llamadas

El agente o aplicación que solicita a otro agente que realice un trabajo.

Agente coordinador

Decide qué especialista remoto debe recibir la tarea.

Cliente A2A

Descubre la tarjeta, elige streaming y envía mensajes de protocolo.

HTTPS

02

Límite de servicio A2A

El contrato público que todo cliente compatible puede entender.

Tarjeta de agente

Nombre, habilidades, punto final, versión del protocolo, seguridad y capacidades declaradas.

Solicitar cheques

Versión, tipo de contenido, ID, partes del mensaje, metadatos, identidad y límites.

Controlador de solicitudes

Distribuye operaciones JSON-RPC o REST a través de una implementación compartida.

llamada escrita

03

Runtime de ADK-Rust

El marco ejecuta la tarea y produce progreso escrito.

Runner

Crea el contexto de invocación y transmite eventos del agente.

Sistema de agentes

LLM, lógica de flujo de trabajo, gráfica, personalizada o multiagente.

Herramientas

Herramientas Rust y MCP

Estado

Sesiones y memoria

El estado de la tarea y los eventos se registran mientras el agente trabaja.

04

Ciclo de vida de la tarea

Una máquina de estados validada hace que el trabajo de larga duración sea inspeccionable.

almacén de tareas

Estado, contexto, historial, artefactos, metadatos y configuración push.

máquina de estados

Sólo se aceptan transiciones válidas; las tareas terminales permanecen terminales.

05

Entrega de progreso

La persona que llama elige cómo quiere recibir el cambio.

Respuesta directa

Devuelve la tarea completa y sus artefactos.

Transmisión de SSE

Primero la tarea, luego las actualizaciones de estado y artefactos.

06

Trabajar después de la solicitud.

Las tareas largas pueden informarse más tarde sin mantener abierta una conexión.

Suscripción

Un cliente escucha las actualizaciones de una tarea existente.

Empujar webhook

Entrega autenticada con reintento y comprobaciones SSRF.

ADK-Rust mantiene el contrato de transferencia, el ciclo de vida de la tarea, la ejecución del agente y los canales de entrega de A2A como piezas separadas para que cada uno pueda protegerse, probarse y reemplazarse de forma independiente.

Empezar con la idea

¿Cómo trabajo con un agente de IA alojado externamente?

Dentro de un proceso ADK-Rust, los agentes pueden compartir tipos, sesiones, herramientas y llamadas de función directas de Rust. Una vez que un agente pertenece a otro servicio (u otra organización), esos detalles de implementación privados ya no son un contrato seguro.

A2A define el idioma compartido en ese límite. La persona que llama descubre lo que ofrece el agente remoto, envía un mensaje estructurado, sigue una tarea a través de estados conocidos y recibe artefactos sin necesidad de saber qué modelo, marco o herramientas se ejecutan detrás del punto final.

ADK-Rust implementa A2A v1 en adk-server y conecta el protocolo directamente al Runner. El mismo agente que pruebe localmente puede convertirse en un servicio de red, mientras que RemoteA2aAgent permite que otro sistema ADK-Rust lo consuma a través de la interfaz normal del Agente.

Tarjeta de agente

Un perfil de servicio para un agente

Un pequeño documento público informa a las personas que llaman el nombre del agente, el punto final, las habilidades, la versión del protocolo, los requisitos de seguridad y si admite transmisión o notificaciones.

Mensaje

Lo que un agente le dice a otro

Un mensaje conlleva una función, una identificación única y una o más partes, como texto o datos estructurados. La identificación única hace posibles reintentos seguros.

Tarea

El trabajo que ambos sistemas pueden realizar

Una tarea le da al trabajo remoto una identificación, un contexto de conversación, un estado, un historial de mensajes, metadatos y cualquier artefacto producido a lo largo del camino.

artefacto

El resultado útil del trabajo.

Un artefacto es un resultado con nombre adjunto a la tarea: un informe, decisión, plan, archivo generado u otro resultado estructurado que otro sistema puede utilizar.

Seguir un trabajo

El protocolo conlleva tanto la petición como la vida de la obra.

Una persona que llama puede esperar una respuesta, abrir una transmisión de eventos en vivo, suscribirse a una tarea existente o registrar un webhook para actualizaciones posteriores. La identidad y el contexto de la tarea mantienen todos los modos de entrega adjuntos a la misma pieza de trabajo.

máquina de estado de tareas

Un trabajo remoto tiene una vida que puedes seguir.

A2A hace más que devolver texto. Le da al trabajo una identidad, un contexto de conversación, un estado actual, historia y artefactos. ADK-Rust valida cada transición antes de guardarla.

SUBMITTED

El servidor aceptó la tarea.

WORKING

El agente lo está ejecutando.

INPUT REQUIRED

El agente necesita más información.

AUTH REQUIRED

La persona que llama debe proporcionar autorización.

COMPLETED

El trabajo y los artefactos están listos.

FAILED

La ejecución finalizó con un error.

CANCELED

Una cancelación permitida puso fin a la tarea.

REJECTED

El servidor rechazó la tarea.

Trabajo multivuelta: cuando una tarea llega INPUT_REQUIRED, la persona que llama envía otro mensaje con el mismo contextId. ADK-Rust encuentra la tarea, la devuelve a WORKING, agrega el mensaje y continúa con el mismo trabajo.

Flujo lógico del mundo real

Case Study: Resolve a customer's damaged order across two distinct agent services.

A customer tells the company's support agent that an order arrived damaged. The support agent remains responsible for the conversation: it understands the request, keeps the customer informed, collects any missing evidence, and presents the final decision. It does not have direct access to warehouse stock, delivery records, or replacement policy.

Esa información operativa pertenece a un agente de cumplimiento implementado por separado. A través de A2A, el agente de soporte puede descubrir qué hace el agente de cumplimiento, enviarle la investigación como una tarea, seguir su progreso, responder solicitudes de más información y recibir la decisión final de reemplazo. Cada servicio mantiene su propio código, datos, herramientas, proveedor de modelos y controles de seguridad; solo comparten los mensajes, el estado de la tarea y los artefactos definidos por el contrato A2A.

01

Descubre al especialista

Un coordinador de soporte lee la tarjeta del agente de cumplimiento y confirma que maneja la investigación del pedido y transmite el progreso.

02

Envía un trabajo claro

Envía el número de pedido, la solicitud del cliente, un ID de mensaje único y un nuevo contexto de conversación.

03

Ruta dentro del servicio

El agente remoto ADK-Rust verifica las herramientas de pedidos, el inventario, el historial de entregas y la política de la empresa sin exponer esos elementos internos a la persona que llama.

04

Pregunta por lo que falta

Si se requiere prueba de daño, la tarea se convierte en INPUT_REQUIRED en lugar de adivinar o fallar silenciosamente.

05

Reanudar la misma tarea

El coordinador proporciona la evidencia aprobada utilizando el mismo contextId; la historia y la identidad de la tarea permanecen intactas.

06

Devolver un resultado auditable

La tarea se completa con un historial de estado y un artefacto que contiene la decisión de reemplazo y los próximos pasos.

Sequence diagram

The task pauses and resumes without losing its identity.

Read from top to bottom. The A2A service owns the network contract and task record. The fulfilment agent owns its reasoning and private tools.

Support coordinator

Calling agent

A2A service

Protocol boundary

Fulfilment agent

ADK-Rust Runner

Business systems

Orders · inventory · policy

llamadas a través de A2A
despachos a Runner
utiliza herramientas aprobadas

GET /.well-known/agent-card.json

Discover skills and streaming

Agent Card

Fulfilment capability published

SendStreamingMessage

ORD-1042 · messageId msg-order-1042

Runner invocation

Create task and execute agent

order.lookup + policy.check

Use private business tools

Evidence required

Damage photo is missing

INPUT_REQUIRED

Persist state and context

SSE status update

Ask support for evidence

SendMessage · same contextId

Approved photo reference

Resume task

INPUT_REQUIRED → WORKING

inventory.reserve

Reserve replacement stock

Artifact + COMPLETED

Replacement decision

Final SSE events

Auditable result returned

The support coordinator never receives database credentials or fulfilment code. It receives only the Agent Card, protocol events, task state, and final artifact.

Respuestas de código y cable

Vea lo que envía y recibe cada lado.

Estos ejemplos utilizan los mismos nombres de operación v1, campos de mensaje, estados de tarea y formas de respuesta SSE que la implementación de ADK-Rust. Las identificaciones y los detalles del pedido son fijos para que toda la conversación sea fácil de seguir.

fulfilment.rsSERVICIO DE CUMPLIMIENTO · ÓXIDO
let fulfilment = LlmAgentBuilder::new("fulfilment")
      .description("Investigates orders and delivery")
      .model(model)
      .instruction(
          "Use the approved order, inventory, and policy tools.            Ask for evidence when the replacement policy requires it."
      )
      .build()?;

  A2aServer::builder()
      .agent(Arc::new(fulfilment))
      .agent_card_name("Fulfilment Agent")
      .streaming(true)
      .build()?
      .serve()
      .await?;
support.rsCOORDINADOR DE SOPORTE · RUST
let fulfilment = RemoteA2aAgent::builder("fulfilment")
      .description("Investigates orders and delivery")
      .agent_url("https://agents.example.com/fulfilment")
      .streaming(true)
      .build()?;

  let support = LlmAgentBuilder::new("support")
      .model(model)
      .instruction("Own the customer conversation.")
      .sub_agent(Arc::new(fulfilment))
      .build()?;
SendStreamingMessage.json1 · ENVIAR EL TRABAJO
{
    "jsonrpc": "2.0",
    "id": "replace-1",
    "method": "SendStreamingMessage",
    "params": {
      "message": {
        "messageId": "msg-order-1042",
        "role": "ROLE_USER",
        "parts": [{
          "text": "Investigate damaged order ORD-1042 and prepare a replacement decision."
        }]
      }
    }
  }
text/event-stream2 · TRANSMISIÓN DE PROGRESO DE TAREAS
data: {
    "jsonrpc":"2.0", "id":"replace-1",
    "result":{"task":{
      "id":"task-order-1042",
      "contextId":"ctx-order-1042",
      "status":{"state":"TASK_STATE_SUBMITTED"}
    }}
  }

  data: {
    "jsonrpc":"2.0", "id":"replace-1",
    "result":{"statusUpdate":{
      "taskId":"task-order-1042",
      "contextId":"ctx-order-1042",
      "status":{"state":"TASK_STATE_WORKING"}
    }}
  }
input-required.event.json3 · SOLICITA LAS PRUEBAS QUE FALTAN
{
    "statusUpdate": {
      "taskId": "task-order-1042",
      "contextId": "ctx-order-1042",
      "status": {
        "state": "TASK_STATE_INPUT_REQUIRED",
        "message": {
          "role": "ROLE_AGENT",
          "parts": [{
            "text": "Please provide a photo showing the damaged item."
          }]
        }
      }
    }
  }
SendMessage.follow-up.json4 · REANUDAR LA MISMA TAREA
{
    "jsonrpc": "2.0",
    "id": "replace-2",
    "method": "SendMessage",
    "params": {
      "message": {
        "messageId": "msg-order-1042-photo",
        "contextId": "ctx-order-1042",
        "role": "ROLE_USER",
        "parts": [{
          "text": "Evidence received and approved: damage-photo-8841.jpg"
        }]
      }
    }
  }
final-events.json5 · RECIBIR EL ARTEFACTO Y TERMINARLO
{
    "artifactUpdate": {
      "taskId": "task-order-1042",
      "contextId": "ctx-order-1042",
      "artifact": {
        "artifactId": "replacement-decision-1042",
        "name": "Replacement decision",
        "parts": [{
          "text": "Approved. Reserve SKU-RED-42 and dispatch with priority shipping."
        }]
      }
    }
  }

  {
    "statusUpdate": {
      "taskId": "task-order-1042",
      "contextId": "ctx-order-1042",
      "status": { "state": "TASK_STATE_COMPLETED" }
    }
  }

El A2A v1 API

Todo lo que un cliente necesita para iniciar, seguir y finalizar el trabajo en un agente remoto.

ADK-Rust implementa las 11 operaciones en A2A v1. Para un trabajo breve, llame a SendMessage y espere el resultado de la tarea. Cuando el trabajo pueda tardar más, utilice SendStreamingMessage para recibir la tarea primero, seguido del estado en vivo y eventos de artefactos a través de SSE.

El ID de tarea devuelto permite a su cliente volver a conectarse sin volver a enviar el trabajo. Puede obtener el estado más reciente, enumerar tareas relacionadas, suscribirse a más actualizaciones o solicitar cancelación. Si el cliente no puede mantener una conexión abierta, puede registrar un webhook autenticado y permitir que el agente remoto entregue cambios posteriores.

01

empezar a trabajar

Envíe un mensaje y reciba una tarea completa o una transmisión en vivo.

SendMessageSendStreamingMessage
02

Inspeccionar y controlar

Lea el trabajo actual, enumere las tareas coincidentes o cancele una tarea cuando su estado lo permita.

GetTaskListTasksCancelTask
03

Seguir el progreso

Abra una suscripción SSE para obtener actualizaciones de una tarea que ya existe.

SubscribeToTask
04

Recibir actualizaciones posteriores

Cree, lea, enumere y elimine destinos de webhooks autenticados para una tarea.

CreatePushConfigGetPushConfigListPushConfigsDeletePushConfig
05

Descubre más

Solicite la versión ampliada del perfil de servicio publicado de un agente.

GetExtendedAgentCard

Un manipulador para dos fijaciones

Las rutas JSON-RPC y REST se envían al mismo RequestHandler, por lo que el comportamiento de la tarea no varía entre transportes.

Ejecución respaldada por Runner

Los mensajes entrantes A2A se convierten en contenido ADK-Rust. El Runner ejecuta el agente seleccionado y convierte sus eventos en estado de tarea y artefactos.

Reintentos seguros

Un ID de mensaje repetido devuelve la tarea existente en lugar de ejecutar el mismo trabajo dos veces. Las implementaciones de producción deben conservar esta asignación durante los reinicios.

Streaming que comienza con el contexto

El primer evento SSE es la tarea completa. Los eventos posteriores llevan actualizaciones de estado y artefactos, por lo que un cliente siempre sabe a qué pertenece la transmisión.

Los agentes remotos se sienten locales

RemoteA2aAgent implementa el rasgo del Agente ADK-Rust. Un coordinador puede incluir un servicio de red en su jerarquía de agentes y recibir eventos de marco normales.

Protección en la frontera

La negociación de versiones, la validación de mensajes, la autenticación del portador, la limitación de velocidad, los interceptores de auditoría, la autenticación de webhook y las comprobaciones SSRF pueden proteger el servicio.

Elige el límite correcto

Subagente local frente a agente A2A remoto

A2A presenta una red, un contrato público, autenticación, manejo de fallas y estado de tareas remotas. Esos costos son valiosos cuando crean una independencia real; son innecesarios cuando cada agente ya vive en el mismo proceso.

Subagente local

Agente A2A remoto

Mejor ajuste
Agentes propiedad de una aplicación
Agentes desplegados o de propiedad independiente
comunicación
Llamadas de agentes en proceso y eventos tipados
HTTP, JSON-RPC o REST y SSE
Estado compartido
Puede utilizar las mismas sesiones y servicios.
Comparte solo mensajes, tareas y artefactos declarados
Límite de falla
Un tiempo de ejecución e implementación
Fallos de red, tiempo de espera, reintento y servicio remoto
Interoperabilidad
Componentes ADK-Rust
Cualquier lenguaje o marco compatible con A2A

Del agente Rust al servicio de red

Exponer un agente y luego consumirlo como agente.

El servidor de conveniencia crea una aplicación Axum con una tarjeta de agente, sesiones, rutas A2A y transmisión habilitada. El adaptador remoto descubre ese servicio y convierte las actualizaciones de sus tareas nuevamente en eventos ADK-Rust.

serve.rsexponer a un agente
use adk_server::a2a::convenience::A2aServer;

  let app = A2aServer::quick_start(agent);
  let listener = tokio::net::TcpListener::bind(
      "0.0.0.0:8080"
  ).await?;

  axum::serve(listener, app).await?;
coordinator.rsLlámalo desde otro agente.
use adk_server::a2a::RemoteA2aAgent;

  let fulfilment = RemoteA2aAgent::builder("fulfilment")
      .description("Investigates orders and delivery")
      .agent_url("https://agents.example.com/fulfilment")
      .build()?;

  let coordinator = LlmAgentBuilder::new("support")
      .model(model)
      .sub_agent(Arc::new(fulfilment))
      .build()?;
Para un servicio v1 completamente configurado: utilizar el documentado RequestHandler::with_runner ruta para elegir explícitamente el almacén de tareas, el remitente de inserción, la tarjeta de agente, los servicios Runner, la ruta JSON-RPC, el enrutador REST y el middleware de negociación de versiones.

Antes de la producción

Implementación de agentes A2A

ADK-Rust proporciona los tipos v1, controladores, ciclo de vida, clientes, validación, primitivas de entrega e integración con Runner. La preparación para la producción aún depende del almacenamiento, la identidad, la red, la observabilidad y las políticas operativas seleccionadas para su servicio.

01

Publicar una tarjeta honesta

Anuncie solo las habilidades, enlaces, transmisión, entrega push y esquemas de seguridad que la implementación realmente admite.

02

Elija estado duradero

El InMemoryTaskStore incluido y el mapa de idempotencia en memoria son útiles para el desarrollo. El trabajo de producción de larga duración necesita un almacenamiento que sobreviva a los reinicios del proceso.

03

Asegure ambas direcciones

Autentique las llamadas entrantes y proteja la entrega push saliente. El remitente push HTTP admite credenciales de portador, tokens de notificación, reintentos y rechazo de direcciones privadas.

04

Cancelación de diseño y tiempos de espera

El trabajo remoto puede sobrevivir a una solicitud. Defina los tiempos de espera del cliente, la política de cancelación, el comportamiento de reintento y lo que sucede cuando cualquiera de los servicios deja de estar disponible.

Conecte el sistema del agente

Exponga a su agente a través de una interfaz estándar A2A.

Comience con una Tarjeta de Agente honesta y una tarea útil. Agregue transmisión, entrada de múltiples turnos, persistencia de tareas, suscripciones, envío autenticado y controles de límites a medida que el trabajo se vuelve más largo y el servicio se vuelve más importante.