Guide complet du protocole A2A : Le standard ouvert de communication entre agents IA de Google pour 2026
Date de publication : Mars 2026 · Version : v0.3.0 · Licence : Apache 2.0 · Mainteneurs : Google + Linux Foundation
En avril 2025, Google a officiellement open sourcé le protocole A2A (Agent2Agent) — un standard ouvert visant à résoudre le problème d’interopérabilité des agents IA. Avec la croissance exponentielle des agents IA en 2026, la question de savoir comment les agents développés par différents frameworks et entreprises peuvent communiquer et collaborer est devenue un défi majeur. Le protocole A2A a été salué comme « le HTTP de l’ère des agents IA ».
L’objectif principal du protocole A2A est de permettre aux agents IA construits sur différents frameworks (tels que Google ADK, LangGraph, BeeAI, etc.) de communiquer et collaborer de manière sécurisée et efficace, sans exposer leurs états internes, leur mémoire ou leurs implémentations d’outils. Ce concept de conception complète le protocole MCP (Model Context Protocol) : MCP connecte les agents aux outils externes, A2A connecte les agents entre eux.
Pourquoi le protocole A2A est-il nécessaire ?
Le problème de la « Tour de Babel » des agents IA
Dans l’écosystème IA de 2026, il existe de nombreux frameworks et plateformes d’agents :
- Google ADK — Le framework officiel de développement d’agents de Google
- LangGraph — Le framework d’agents basé sur les graphes de LangChain
- CrewAI — Framework multi-agents orienté orchestration de tâches
- AutoGen — Framework multi-agents open source de Microsoft
- Goose — Agent local open source de Block
- OpenClaw — Plateforme d’agents open source en croissance rapide
Ces frameworks fonctionnent en silos, les agents ne peuvent pas communiquer directement entre eux. Imaginez : vous avez un agent LangGraph spécialisé dans l’analyse de données et un agent CrewAI expert en génération de rapports, mais ils ne peuvent pas collaborer pour accomplir la tâche « analyser les données et générer un rapport ».
La solution d’A2A
Le protocole A2A permet aux agents, via des interfaces de communication standardisées :
- Découvrir les capacités mutuelles — Déclaration des fonctionnalités via des « cartes d’agent » (Agent Cards)
- Négocier les modalités d’interaction — Support de texte, formulaires, médias et autres modalités
- Collaboration sécurisée pour les tâches longues — Support de la communication en streaming et asynchrone
- Préserver la confidentialité interne — Pas besoin d’exposer la mémoire, les outils ou la logique propriétaire
A2A vs MCP : Quelle est la différence ?
| Caractéristique | Protocole A2A | MCP (Model Context Protocol) |
|---|---|---|
| Objectif | Communication agent ↔ agent | Connexion agent ↔ outil/source de données |
| Scénario | Collaboration et orchestration multi-agents | Extension des capacités d’un agent unique |
| Mode de communication | JSON-RPC 2.0 via HTTP | JSON-RPC 2.0 via stdio/HTTP |
| Mécanisme de découverte | Agent Cards | Registre de serveurs MCP |
| Cas d’usage typique | Agent d’analyse de données + agent de génération de rapports | Agent + GitHub/Base de données/Système de fichiers |
| Relation complémentaire | Le « HTTP » entre agents | L’« USB » entre agent et outil |
Meilleure pratique : Dans les systèmes IA modernes, utilisez A2A et MCP conjointement. Par exemple : un agent coordinateur A2A se connecte aux outils locaux via MCP, tout en appelant des agents spécialisés via A2A.
Concepts clés
1. Agent Card (Carte d’agent)
Chaque agent compatible A2A doit fournir une « carte d’agent » déclarant ses capacités :
{
"name": "Agent d'analyse de données",
"description": "Spécialisé dans les tâches d'analyse de données CSV/Excel",
"url": "https://agents.example.com/data-analyzer",
"version": "1.0.0",
"capabilities": {
"inputFormats": ["text/csv", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
"outputFormats": ["application/json", "text/markdown"],
"skills": ["Analyse statistique", "Visualisation de données", "Détection d'anomalies"]
},
"authentication": {
"type": "bearer",
"required": true
}
}
2. Modes de communication
A2A supporte trois modes de communication :
- Requête/réponse synchrone — Pour les tâches rapides
- Réponse en streaming (SSE) — Pour les tâches longues, retour de progression en temps réel
- Notifications push asynchrones — Pour les tâches chronophages, rappel après achèvement
3. Machine d’état des tâches
[Nouveau] → [En cours] → [Terminé/Échec/Annulé]
↓
[Entrée requise] → [Continuer]
Démarrage rapide
Configuration requise
- Python : 3.10+
- Node.js : 18+ (optionnel, pour le SDK JS)
- Go : 1.21+ (optionnel, pour le SDK Go)
- Java : 17+ (optionnel, pour le SDK Java)
- .NET : 8.0+ (optionnel, pour le SDK .NET)
Installation du SDK
SDK Python (recommandé)
# Installer le SDK A2A Python
pip install a2a-sdk
# Vérifier l'installation
python -c "import a2a; print(a2a.__version__)"
SDK Node.js
npm install @a2a-js/sdk
SDK Go
go get github.com/a2aproject/a2a-go
SDK Java (Maven)
<dependency>
<groupId>org.a2a</groupId>
<artifactId>a2a-sdk</artifactId>
<version>0.3.0</version>
</dependency>
SDK .NET
dotnet add package A2A
Cas pratique : Construire un système de collaboration multi-agents
Description du scénario
Supposons que nous devions construire un « flux de travail de création de contenu » impliquant trois agents spécialisés :
- Agent de recherche — Rechercher et organiser l’information
- Agent de rédaction — Rédiger des articles à partir des résultats de recherche
- Agent de relecture — Vérifier la grammaire et l’exactitude des faits
Étape 1 : Créer le serveur de l’agent de recherche
# research_agent.py
from a2a.server import A2AServer
from a2a.types import AgentCard, Task, TaskStatus
class ResearchAgent:
def __init__(self):
self.card = AgentCard(
name="Agent de recherche",
description="Recherche et organisation d'informations web",
version="1.0.0",
capabilities={
"skills": ["Recherche web", "Extraction d'informations", "Génération de résumés"],
"inputFormats": ["text/plain"],
"outputFormats": ["application/json"]
}
)
async def execute(self, task: Task):
"""Exécuter la tâche de recherche"""
query = task.input.text
# Appeler l'outil de recherche (dans un projet réel, intégrer web_search ou Serper API)
results = await self.search_web(query)
return Task(
id=task.id,
status=TaskStatus.COMPLETED,
output={
"summary": results.summary,
"sources": results.sources,
"key_points": results.key_points
}
)
async def search_web(self, query: str):
# Implémenter la logique de recherche
pass
# Démarrer le serveur
server = A2AServer(
agent=ResearchAgent(),
host="0.0.0.0",
port=8080
)
server.run()
Étape 2 : Créer le client de l’agent de rédaction
# writing_agent.py
from a2a.client import A2AClient
from a2a.types import Task, TaskRequest
class WritingAgent:
def __init__(self):
self.research_client = A2AClient(
agent_url="http://localhost:8080",
api_key="votre-cle-api"
)
async def write_article(self, topic: str):
# Étape 1 : Demander à l'agent de recherche de collecter des informations
research_task = TaskRequest(
input={"text": f"Rechercher le sujet : {topic}, fournir des faits clés, des sources de données et des citations pertinentes"},
mode="streaming" # Mode streaming pour obtenir la progression en temps réel
)
research_result = await self.research_client.execute(research_task)
# Étape 2 : Rédiger l'article à partir des résultats de recherche
article = await self.generate_article(
topic=topic,
research_data=research_result.output
)
return article
async def generate_article(self, topic: str, research_data: dict):
# Appeler le LLM pour générer l'article
pass
# Exemple d'utilisation
async def main():
writer = WritingAgent()
article = await writer.write_article("Guide complet du protocole A2A")
print(article)
import asyncio
asyncio.run(main())
Étape 3 : Orchestrer le flux de travail complet
# workflow_orchestrator.py
from a2a.client import A2AClient
from a2a.types import Task, TaskRequest
class ContentWorkflow:
def __init__(self):
self.research_agent = A2AClient("http://localhost:8080")
self.writing_agent = A2AClient("http://localhost:8081")
self.review_agent = A2AClient("http://localhost:8082")
async def execute_workflow(self, topic: str):
print(f"📝 Démarrage du flux de création de contenu : {topic}")
# Phase 1 : Recherche
print("🔍 Phase 1 : Collecte d'informations...")
research_task = TaskRequest(
input={"text": topic},
mode="sync"
)
research_result = await self.research_agent.execute(research_task)
print(f"✅ Recherche terminée, {len(research_result.output['sources'])} sources trouvées")
# Phase 2 : Rédaction
print("✍️ Phase 2 : Rédaction de l'article...")
writing_task = TaskRequest(
input={
"topic": topic,
"research_data": research_result.output
},
mode="streaming"
)
async for chunk in self.writing_agent.execute_stream(writing_task):
print(f"📝 Progression rédaction : {chunk.progress}%")
draft = chunk.output
print(f"✅ Premier brouillon terminé, {len(draft['content'])} mots")
# Phase 3 : Relecture
print("🔎 Phase 3 : Contrôle qualité...")
review_task = TaskRequest(
input={
"content": draft['content'],
"check_types": ["grammar", "facts", "citations"]
},
mode="sync"
)
review_result = await self.review_agent.execute(review_task)
print("✅ Flux de travail terminé !")
return {
"final_content": review_result.output['revised_content'],
"quality_score": review_result.output['quality_score'],
"suggestions": review_result.output['suggestions']
}
# Exécuter le flux de travail
async def main():
workflow = ContentWorkflow()
result = await workflow.execute_workflow("Tendances des agents IA en 2026")
print("\n📄 Article final :")
print(result['final_content'])
asyncio.run(main())
Fonctionnalités avancées
1. Gestion des réponses en streaming
async def handle_streaming_task(client: A2AClient, task: TaskRequest):
async for event in client.execute_stream(task):
if event.type == "progress":
print(f"Progression : {event.data['progress']}%")
elif event.type == "partial_output":
print(f"Résultat partiel : {event.data['content']}")
elif event.type == "completed":
print(f"Tâche terminée ! Résultat final : {event.data['output']}")
2. Gestion des erreurs et retries
from a2a.exceptions import AgentUnavailable, TaskFailed
async def execute_with_retry(client: A2AClient, task: TaskRequest, max_retries=3):
for attempt in range(max_retries):
try:
return await client.execute(task)
except AgentUnavailable:
if attempt == max_retries - 1:
raise
await asyncio.sleep(2 ** attempt) # Backoff exponentiel
except TaskFailed as e:
print(f"Échec de la tâche : {e.message}")
raise
3. Authentification et sécurité
# Authentification par Bearer Token
client = A2AClient(
agent_url="https://agents.example.com/analyzer",
api_key="votre-cle-secrete",
auth_type="bearer"
)
# OAuth 2.0
from a2a.auth import OAuth2Provider
oauth = OAuth2Provider(
client_id="votre-client-id",
client_secret="votre-client-secret",
token_url="https://auth.example.com/oauth/token"
)
client = A2AClient(
agent_url="https://agents.example.com/analyzer",
auth_provider=oauth
)
Outils de l’écosystème A2A
Ressources officielles
- Repository GitHub : https://github.com/a2aproject/A2A
- Spécification du protocole : https://a2a-protocol.org/latest/specification/
- Site de documentation : https://a2a-protocol.org
- Code exemple : https://github.com/a2aproject/a2a-samples
- Cours gratuit : https://goo.gle/dlai-a2a (co-produit par Google Cloud + IBM Research)
Outils communautaires
| Outil | Description | Lien |
|---|---|---|
| A2A Inspector | Débogage et inspection des Agent Cards | pip install a2a-inspector |
| A2A Gateway | Passerelle d’agents et équilibrage de charge | https://github.com/a2aproject/a2a-gateway |
| A2A Registry | Découverte d’agents et registre de services | https://github.com/a2aproject/a2a-registry |
Bonnes pratiques
✅ Recommandations
- Déclarer clairement les capacités — Décrire en détail les compétences et limitations de l’agent dans la Agent Card
- Utiliser la communication en streaming — Pour les tâches dépassant 5 secondes, privilégier le mode streaming
- Implémenter une dégradation gracieuse — Fournir des solutions alternatives lorsque les agents dépendants sont indisponibles
- Journaliser les interactions — Facilite le débogage et l’audit de la communication entre agents
- Configurer des délais d’expiration — Éviter l’attente infinie, recommander un timeout de 30-60 secondes
❌ Pièges à éviter
- Dépendance excessive à un seul agent — Prévoir des redondances et des solutions alternatives
- Ignorer l’authentification — L’authentification doit être activée en production
- Exposer des données sensibles — Ne pas divulguer de détails d’implémentation dans la Agent Card
- Bloquer de façon synchrone sur les tâches longues — Utiliser les modes asynchrone ou streaming pour les tâches longues
Intégration avec OpenClaw
Si vous utilisez OpenClaw pour construire des assistants IA, voici comment intégrer A2A :
# Appeler un agent A2A depuis une compétence OpenClaw
from a2a.client import A2AClient
async def a2a_research_task(query: str):
"""Appeler un agent de recherche externe"""
client = A2AClient("http://research-agent:8080")
result = await client.execute({
"input": {"text": query},
"mode": "sync"
})
return result.output
# Enregistrer comme compétence OpenClaw
# Définir dans skills/a2a-integration/SKILL.md
Perspectives
Le protocole A2A est actuellement hébergé par la Linux Foundation, avec Google comme principal contributeur. La feuille de route pour 2026 comprend :
- v0.4.0 (T2 2026) — Support multi-modalité (images, audio)
- v0.5.0 (T3 2026) — Mécanisme de découverte du marché d’agents
- v1.0.0 (T4 2026) — Version stable officielle, garantie de compatibilité ascendante
Avec l’arrivée de nouvelles entreprises et projets dans l’écosystème A2A, nous pouvons nous attendre à un réseau d’agents IA véritablement interconnecté, aussi ouvert et interopérable que le Web d’aujourd’hui.
Résumé
Le protocole A2A représente la prochaine phase du développement des agents IA : d’intelligences isolées à des réseaux d’agents collaboratifs. Pour les développeurs, c’est le moment idéal pour apprendre et adopter A2A :
- ✅ Open source et gratuit — Licence Apache 2.0, sans restriction d’utilisation
- ✅ Multi-langages — Python, JS, Go, Java, .NET
- ✅ Soutenu par un géant — Développé par Google, hébergé par la Linux Foundation
- ✅ Écosystème mature — SDK, documentation et exemples riches
- ✅ Design prospectif — Complémentaire à MCP, orienté systèmes multi-agents futurs
Passez à l’action : Visitez https://github.com/a2aproject/A2A pour obtenir le code et la documentation les plus récents, ou apprenez systématiquement le protocole A2A avec le cours gratuit de Google.
Références :
- Repository officiel du protocole A2A
- Spécification du protocole A2A
- Blog officiel Google : Lancement du protocole A2A
- Cours gratuit A2A
- Repository de code exemple A2A