Protocole Agent2Agent · A2A v1.0

Laissez les agents déployés indépendamment travailler ensemble.

A2A offre à un agent IA un moyen standard de se présenter à un autre agent, d'accepter un travail ou une tâche, de signaler la progression, de demander plus d'informations et de renvoyer des résultats utiles, même lorsque l'autre agent s'exécute dans un autre service d'IA, utilise un langage de programmation ou un framework d'agent différent, ou est déployé dans un autre cloud. Aucun des deux agents n’a besoin de comprendre comment l’autre est construit. Ils utilisent la norme A2A pour communiquer et travailler ensemble.

Opérations 11 v1Cartes d'agentJSON-RPC + RESTSSE streamingTâches multi-toursPush authentifiéRemoteA2aAgent

Architecture de référence ADK-Rust A2A

Architecture des agents distants A2A

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

01

Système d'appel

Agent ou application demandant à un autre agent d'effectuer un travail.

Agent coordonnateur

Décide quel spécialiste à distance doit recevoir la tâche.

Client A2A

Découvre la carte, choisit le streaming et envoie des messages de protocole.

HTTPS

02

Limite de service A2A

Le contrat public que tout client compatible peut comprendre.

Carte d'agent

Nom, compétences, point de terminaison, version du protocole, sécurité et capacités déclarées.

Demander des chèques

Version, type de contenu, identifiants, parties du message, métadonnées, identité et limites.

Gestionnaire de requêtes

Répartit les opérations JSON-RPC ou REST via une implémentation partagée.

appel tapé

03

Exécution ADK-Rust

Le framework exécute la tâche et produit une progression typée.

Runner

Crée le contexte d'appel et diffuse les événements de l'agent.

Système d'agents

LLM, workflow, graphique, logique personnalisée ou multi-agents.

Outils

Outils Rust et MCP

État

Séances et mémoire

l'état de la tâche et les événements sont enregistrés pendant que l'agent travaille

04

Cycle de vie des tâches

Une machine à états validée rend les travaux de longue durée inspectables.

Magasin de tâches

Statut, contexte, historique, artefacts, métadonnées et configuration push.

Machine d'état

Seules les transitions valides sont acceptées ; les tâches terminales restent terminales.

05

Livraison progressive

L'appelant choisit la manière dont il souhaite recevoir la monnaie.

Réponse directe

Renvoyez la tâche complète et ses artefacts.

Flux SSE

Tâche d'abord, puis mises à jour du statut et des artefacts.

06

Travailler après la demande

Les tâches longues peuvent être signalées plus tard sans maintenir une seule connexion ouverte.

Abonnement

Un client écoute les mises à jour pour une tâche existante.

Pousser le webhook

Livraison authentifiée avec nouvelle tentative et contrôles SSRF.

ADK-Rust conserve le contrat de fil A2A, le cycle de vie des tâches, l'exécution des agents et les canaux de livraison en tant qu'éléments distincts afin que chacun puisse être sécurisé, testé et remplacé indépendamment.

Commencez par l'idée

Comment puis-je travailler avec un agent IA hébergé en externe ?

Au sein d'un processus ADK-Rust, les agents peuvent partager des types, des sessions, des outils et des appels de fonction directs Rust. Une fois qu'un agent appartient à un autre service (ou à une autre organisation), ces détails de mise en œuvre privés ne constituent plus un contrat sûr.

A2A définit la langue partagée à cette limite. L'appelant découvre ce que propose l'agent distant, envoie un message structuré, suit une tâche à travers des états connus et reçoit des artefacts sans avoir besoin de savoir quel modèle, framework ou outils s'exécutent derrière le point de terminaison.

ADK-Rust implémente A2A v1 dans adk-server et connecte le protocole directement au Runner. Le même agent que vous testez localement peut devenir un service réseau, tandis que RemoteA2aAgent permet à un autre système ADK-Rust de le consommer via l'interface d'agent normale.

Carte d'agent

Un profil de service pour un agent

Un petit document public indique aux appelants le nom de l’agent, le point de terminaison, les compétences, la version du protocole, les exigences de sécurité et s’il prend en charge le streaming ou les notifications.

Message

Ce qu'un agent dit à un autre

Un message comporte un rôle, un identifiant unique et une ou plusieurs parties telles que du texte ou des données structurées. L'ID unique permet des tentatives sécurisées.

Tâche

Le travail que les deux systèmes peuvent suivre

Une tâche donne au travail à distance un identifiant, un contexte de conversation, un état, un historique des messages, des métadonnées et tous les artefacts produits en cours de route.

Artefact

Le résultat utile du travail

Un artefact est un résultat nommé attaché à la tâche : un rapport, une décision, un plan, un fichier généré ou toute autre sortie structurée qu'un autre système peut utiliser.

Suivre un emploi

Le protocole porte à la fois la demande et la vie de l'œuvre.

Un appelant peut attendre une réponse, ouvrir un flux d'événements en direct, s'abonner à une tâche existante ou enregistrer un webhook pour des mises à jour ultérieures. L'identité et le contexte de la tâche maintiennent chaque mode de livraison attaché au même travail.

Machine à états de tâches

Un travail à distance a une vie que vous pouvez suivre.

A2A fait plus que renvoyer du texte. Cela donne au travail une identité, un contexte de conversation, un état actuel, une histoire et des artefacts. ADK-Rust valide chaque transition avant de la sauvegarder.

SUBMITTED

Le serveur a accepté la tâche.

WORKING

L'agent est en train de l'exécuter.

INPUT REQUIRED

L'agent a besoin de plus d'informations.

AUTH REQUIRED

L'appelant doit fournir une autorisation.

COMPLETED

Les travaux et les artefacts sont prêts.

FAILED

L'exécution s'est terminée par une erreur.

CANCELED

Une annulation autorisée a mis fin à la tâche.

REJECTED

Le serveur a refusé la tâche.

Travail multi-tours : lorsqu'une tâche atteint INPUT_REQUIRED, l'appelant envoie un autre message avec le même contextId. ADK-Rust trouve la tâche, la renvoie à WORKING, ajoute le message et continue le même travail.

Flux logique du monde réel

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.

Ces informations opérationnelles appartiennent à un agent d’exécution déployé séparément. Grâce à A2A, l'agent de support peut découvrir ce que fait l'agent d'exécution, lui envoyer l'enquête sous forme de tâche, suivre sa progression, répondre aux demandes d'informations supplémentaires et recevoir la décision finale de remplacement. Chaque service conserve son propre code, ses données, ses outils, son fournisseur de modèles et ses propres contrôles de sécurité ; ils partagent uniquement les messages, l'état des tâches et les artefacts définis par le contrat A2A.

01

Découvrez le spécialiste

Un coordinateur d’assistance lit la carte de l’agent d’exécution et confirme qu’il gère l’enquête sur les commandes et suit la progression.

02

Envoyer une tâche claire

Il envoie le numéro de commande, la demande du client, un messageId unique et un nouveau contexte de conversation.

03

Itinéraire à l'intérieur du service

L'agent distant ADK-Rust vérifie les outils de commande, l'inventaire, l'historique des livraisons et la politique de l'entreprise sans exposer ces éléments internes à l'appelant.

04

Demandez ce qui manque

Si une preuve de dommage est requise, la tâche devient INPUT_REQUIRED au lieu de deviner ou d'échouer silencieusement.

05

Reprendre la même tâche

Le coordinateur fournit les preuves approuvées en utilisant le même contextId ; l’histoire et l’identité des tâches restent intactes.

06

Renvoie un résultat vérifiable

La tâche se termine avec l'historique des statuts et un artefact contenant la décision de remplacement et les étapes suivantes.

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

appels via A2A
expéditions à Runner
utilise des outils approuvés

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.

Réponses aux codes et aux câbles

Voyez ce que chaque partie envoie et reçoit.

Ces exemples utilisent les mêmes noms d'opération v1, champs de message, états de tâche et formes de réponse SSE que l'implémentation ADK-Rust. Les identifiants et les détails de la commande sont corrigés afin que l'ensemble de la conversation soit facile à suivre.

fulfilment.rsSERVICE D'EXÉCUTION · ROUILLE
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.rsCOORDONNATEUR DE SOUTIEN · ROUILLE
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 · ENVOYER LE TRAVAIL
{
    "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 · PROGRÈS DE LA TÂCHE EN STREAMING
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 · DEMANDER LES PREUVES MANQUANTES
{
    "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 · REPRENDRE LA MÊME TÂCHE
{
    "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 · RECEVOIR L'ARTEFACT ET L'ACHÈVEMENT
{
    "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" }
    }
  }

Le A2A v1 API

Tout ce dont un client a besoin pour démarrer, suivre et terminer son travail sur un agent distant.

ADK-Rust implémente les 11 opérations dans A2A v1. Pour un travail court, appelez SendMessage et attendez le résultat de la tâche. Lorsque le travail peut prendre plus de temps, utilisez SendStreamingMessage pour recevoir d'abord la tâche, suivie des événements d'état et d'artefact en direct sur SSE.

L'ID de tâche renvoyé permet à votre client de se reconnecter sans soumettre à nouveau le travail. Il peut récupérer le dernier état, répertorier les tâches associées, s'abonner à d'autres mises à jour ou demander une annulation. Si le client ne peut pas maintenir une connexion ouverte, il peut enregistrer un webhook authentifié et laisser l'agent distant apporter des modifications ultérieures.

01

Commencer le travail

Envoyez un message et recevez soit une tâche complète, soit un flux en direct.

SendMessageSendStreamingMessage
02

Inspecter et contrôler

Lisez le travail en cours, répertoriez les tâches correspondantes ou annulez une tâche lorsque son état le permet.

GetTaskListTasksCancelTask
03

Suivre les progrès

Ouvrez un abonnement SSE pour les mises à jour d'une tâche qui existe déjà.

SubscribeToTask
04

Recevez des mises à jour ultérieures

Créez, lisez, répertoriez et supprimez les destinations de webhook authentifiées pour une tâche.

CreatePushConfigGetPushConfigListPushConfigsDeletePushConfig
05

En savoir plus

Demandez la version étendue du profil de service publié d’un agent.

GetExtendedAgentCard

Un gestionnaire pour deux liaisons

Les routes JSON-RPC et REST sont réparties dans le même RequestHandler, de sorte que le comportement des tâches ne dérive pas entre les transports.

Exécution basée sur Runner

Les messages A2A entrants deviennent du contenu ADK-Rust. Le Runner exécute l'agent sélectionné et convertit ses événements en statut de tâche et en artefacts.

Nouvelles tentatives sécurisées

Un messageId répété renvoie la tâche existante plutôt que d'exécuter le même travail deux fois. Les déploiements de production doivent conserver ce mappage lors des redémarrages.

Un streaming qui commence par le contexte

Le premier événement SSE est la tâche complète. Les événements ultérieurs comportent des mises à jour de statut et d'artefacts, de sorte qu'un client sait toujours à quoi appartient le flux.

Les agents distants se sentent locaux

RemoteA2aAgent implémente le trait d'agent ADK-Rust. Un coordinateur peut inclure un service réseau dans sa hiérarchie d'agents et recevoir des événements de structure normaux.

Protection à la frontière

La négociation de version, la validation des messages, l'authentification du support, la limitation du débit, les intercepteurs d'audit, l'authentification des webhooks et les contrôles SSRF peuvent protéger le service.

Choisissez la bonne limite

Sous-agent local vs agent A2A distant

A2A introduit un réseau, un contrat public, l'authentification, la gestion des pannes et l'état des tâches à distance. Ces coûts sont précieux lorsqu’ils créent une réelle indépendance ; ils sont inutiles lorsque tous les agents vivent déjà dans le même processus.

Sous-agent local

Agent A2A distant

Meilleur ajustement
Agents appartenant à une seule application
Agents déployés ou détenus indépendamment
Communications
Appels d'agent en cours et événements saisis
HTTP, JSON-RPC ou REST et SSE
État partagé
Peut utiliser les mêmes sessions et services
Partage uniquement les messages, tâches et artefacts déclarés
Limite de défaillance
One runtime and deployment
Pannes de réseau, d'expiration de délai, de nouvelle tentative et de service à distance
Interopérabilité
Composants ADK-Rust
Tout langage ou framework compatible A2A

De l'agent Rust au service réseau

Exposez un agent, puis consommez-le en tant qu'agent.

Le serveur pratique crée une application Axum avec une carte d'agent, des sessions, des itinéraires A2A et la diffusion en continu activés. L'adaptateur distant découvre ce service et reconvertit ses mises à jour de tâches en événements ADK-Rust.

serve.rsExposer un agent
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.rsAppelez-le depuis un autre agent
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()?;
Pour un service v1 entièrement configuré : utiliser le document RequestHandler::with_runner chemin pour choisir explicitement le magasin de tâches, l'expéditeur push, la carte d'agent, les services Runner, la route JSON-RPC, le routeur REST et le middleware de négociation de version.

Avant la production

Déploiement des agents A2A

ADK-Rust fournit les types v1, les gestionnaires, le cycle de vie, les clients, la validation, les primitives de livraison et l'intégration avec Runner. La préparation à la production dépend toujours des politiques de stockage, d’identité, de réseau, d’observabilité et d’exploitation sélectionnées pour votre service.

01

Publier une carte honnête

Annoncez uniquement les compétences, les liaisons, le streaming, la livraison push et les systèmes de sécurité réellement pris en charge par le déploiement.

02

Choisissez un état durable

Le InMemoryTaskStore inclus et la carte d'idempotence en mémoire sont utiles pour le développement. Les travaux de production de longue durée nécessitent un stockage qui survit aux redémarrages des processus.

03

Sécurisez les deux sens

Authentifiez les appels entrants et protégez la livraison push sortante. L'expéditeur push HTTP prend en charge les informations d'identification du porteur, les jetons de notification, les tentatives et le rejet d'adresse privée.

04

Annulation de conception et délais d'attente

Le travail à distance peut survivre à une demande. Définissez les délais d'attente des clients, la politique d'annulation, le comportement des nouvelles tentatives et ce qui se passe lorsque l'un des services devient indisponible.

Connecter le système d'agent

Exposez votre agent via une interface A2A standard.

Commencez avec une carte d'agent honnête et une tâche utile. Ajoutez le streaming, la saisie multi-tours, la persistance des tâches, les abonnements, le push authentifié et les contrôles de limites à mesure que le travail devient plus long et que le service devient plus important.