/pattern/a2a/

04 · ProductionTool IntegrationAgent2Agent ProtocolInter-Agent ProtocolInter-Agent Communication

A2A Protocol.
Agenten adressieren andere Agenten.

Offener Standard für interoperable Agent-zu-Agent-Kommunikation über System- und Netzwerkgrenzen hinweg. Entfernte Agenten können als Tools, innerhalb von Graphen oder in Schwärmen aufgerufen werden, als wären sie lokal.

In der PraxisEin auf Google ADK aufgebauter Planungs-Agent ruft einen auf Microsoft Agent Framework aufgebauten Reisebuchungs-Agenten über A2A auf, ohne dass eines der Systeme eigenen Connector-Code benötigt.

Wann man dazu greift

  • Agenten aus verschiedenen Frameworks interoperieren müssen.
  • Interne Logik privat bleiben muss.
  • Verteilte Skalierung oder vendor-neutrale Schnittstellen erforderlich sind.

Wann es nach hinten losgeht

  • Alle Agenten in einem Framework und Prozess leben.
  • Die Ökosystem-Reife für den Produktionseinsatz nicht ausreicht.
  • Ein einfacherer In-Process-Aufruf genügt.

Die Abwägung

Anbieterunabhängigkeit und Isolation werden auf Kosten eines noch unreifen Tooling-Ökosystems und zusätzlichen Protokolloverheads gewonnen.

Das mentale Modell

Eine Form, die du auf eine Serviette zeichnen kannst.

Stell dir andere Agenten als Dienste in einem gemeinsamen Netzwerk vor. Ein Agent — der Client — orchestriert einen Auftrag; er ruft Remote-Agenten auf, jeder wie ein Tool aufrufbar, egal auf welcher Maschine, von welchem Anbieter oder Framework er läuft.

Der Haken, der es zu einem Protokoll und nicht nur zu einer API macht: Jeder Remote-Agent ist opak. Der Aufrufer sieht eine Capability und ein Ergebnis — nie die Prompts, das Memory, die Tools oder das Reasoning des Remote-Agenten. Agenten arbeiten als opake Peers zusammen, ohne mit der Codebasis des jeweils anderen zu verschmelzen.

A2AA2AA2AA2A-CLIENTOrchestratorplant, delegiert, führt zusammenFlug-AgentREMOTE · ADKPVTHotel-AgentREMOTE · LANGGRAPHPVTWährungs-AgentREMOTE · CREWAIPVT
Der Effekt

Was es tatsächlich tut.

Zwei Agenten arbeiten über ein gemeinsames Protokoll zusammen.

agent AA2Aagent B
Wie es funktioniert

Zwei Rollen, die über das offene Web kommunizieren.

A2A nutzt bewusst den Web-Stack wieder: HTTP, JSON-RPC 2.0 und Server-Sent Events fürs Streaming. Ein Client-Agent entdeckt einen Remote-Agenten über dessen Agent Card, authentifiziert sich und sendet dann Nachrichten, die der Remote-Agent in einen Task mit definiertem Lebenszyklus verwandelt.

CLIENT-AGENTDer OrchestratorA2A-ClientFINDET · DELEGIERTHTTP · JSON-RPCStream über Server-Sent EventsREMOTE-AGENTAgent CardDISCOVERYTasksLIFECYCLEArtefakteERGEBNISSEPRIVATLOGIK

discover → authenticate → message/send → Task & Artefakte streamen

Rolle 01

Client-Agent

Der Agent, der initiiert. Er entdeckt Remote-Agenten, entscheidet, was er delegiert, sendet Nachrichten und führt die zurückkommenden Artefakte in seine eigene Antwort zusammen.

Rolle 02

Remote-Agent

Ein A2A-Server, der eine Agent Card bewirbt und Tasks erfüllt. Er ist opak: Aufrufer sehen Capabilities und Ergebnisse, nie seine Tools, sein Memory oder sein Reasoning.

Rolle 03

Agent Card

JSON-Metadaten, bereitgestellt unter /.well-known/agent-card.json — die Visitenkarte des Remote-Agenten: Skills, Endpoint-URL, Version und die Sicherheitsschemata, die ein Aufrufer erfüllen muss.

Was die Grenze überquert

Drei Kernobjekte.

Objekt · 01

Agent Card

Discovery

Bewirbt, wer der Agent ist und was er kann, sodass ein Aufrufer entscheiden kann, ob und wie er ihn aufruft — ohne Code zu lesen.

name · description · url skills[] · securitySchemes
Objekt · 02

Task

Die Vertragseinheit

Eine ID-basierte Arbeitseinheit mit definiertem Lebenszyklus. Das gemeinsame Objekt zwischen Aufrufer und Aufgerufenem — was verlangt wurde, was in Arbeit ist, was beendet wurde oder fehlschlug.

submitted → working → completed | failed | canceled
Objekt · 03

Message & Artifact

Die Nutzlast

Messages tragen Gesprächszüge zwischen Agenten; Artefakte sind die gegen einen Task zurückgelieferten Ergebnisse — Dokumente, Daten, Bilder. Interner Zustand wird nie mitübertragen.

message.parts[] (text/file/data) artifact: flight-options

Gebaut für den Enterprise-Einsatz und den Dauerbetrieb. A2A geht davon aus, dass Arbeit asynchron ist: Tasks können Minuten oder Stunden laufen, ihren Fortschritt über SSE streamen oder Push-Benachrichtigungen auslösen, wenn sie fertig sind. Es ist modalitätsunabhängig (Text, Dateien, Audio, Video) und stützt sich auf standardmäßige HTTPS-Auth — dieselben Kontrollen, die du bereits für jede Web-API betreibst.

Schritt für Schritt

Ein realer Ablauf, Nachricht für Nachricht.

AufgabePlane eine 4-tägige Reise nach Tokio im Juni — Flüge, Hotel und ein Budget.
6 / 6
DiscoverDer Orchestrator holt die Card des Flight Agent von /.well-known/agent-card.json — und erfährt seinen Skill search_flights, seinen Endpoint und dass er ein Bearer-Token verlangt.
AuthenticateDem Sicherheitsschema der Card folgend, beschafft der Client ein JWT und hängt es an jede Anfrage an. Der Remote-Agent behandelt den Aufrufer als nicht vertrauenswürdig, bis er das tut.
message/sendmessage/send → "Find flights NYC → Tokyo, Jun 10". Der Remote-Agent erstellt einen Task im Zustand submitted und gibt dessen ID zurück.
working (SSE)Der Task wechselt zu working; Status-Updates streamen über Server-Sent Events zurück. Wie der Remote-Agent sucht — seine Tools, Prompts, sein Memory — bleibt vollständig privat.
ArtifactDer Remote-Agent streamt ein flight-options-Artefakt und markiert den Task dann als completed. Der Orchestrator betreibt die Hotel- und Currency-Agenten auf dieselbe Weise, parallel.
AnswerJL005 Hinflug · 4 Nächte im Shinjuku Granbell · geschätztes Budget ¥285.000 (~1.820 $).
Der Sinn des Protokolls: Die Flight-, Hotel- und Currency-Agenten wurden von drei verschiedenen Teams auf drei verschiedenen Frameworks gebaut. Der Orchestrator hat keinen von ihnen importiert — er sprach A2A, und sie antworteten als opake Peers.
Im Code

Das Protokoll in der Praxis.

Server · Pythonpython
# flight_agent.py — expose an agent over A2A
from a2a.types import AgentCard, AgentSkill, AgentCapabilities
from a2a.server.apps import A2AStarletteApplication
from a2a.server.request_handlers import DefaultRequestHandler

card = AgentCard(
    name="Flight Booking Agent",
    description="Searches and books flights between cities.",
    url="https://flights.example.com/a2a",
    version="1.0.0",
    capabilities=AgentCapabilities(streaming=True),
    skills=[AgentSkill(
        id="search_flights",
        name="Search flights",
        description="Find flights between two cities on a date.",
    )],
)

handler = DefaultRequestHandler(agent_executor=FlightExecutor())
# served at /.well-known/agent-card.json + the A2A endpoint
app = A2AStarletteApplication(agent_card=card, http_handler=handler)
Wo es einzuordnen ist

A2A und MCP ergänzen sich, statt zu konkurrieren.

Zwei offene Protokolle überqueren die Grenze eines einzelnen Frameworks. MCP standardisiert, wie ein Agent mit einem Tool spricht; A2A standardisiert, wie ein Agent mit einem anderen Agenten spricht. Häufig werden beide eingesetzt.

Dimension
A2A
MCP
Scope
Agent ↔ Agent
Agent ↔ Tool / Daten
Standardisiert
Agent-Discovery, Task-Lebenszyklus, Artefakt-Austausch
Tool-Discovery, Aufruf, strukturiertes I/O
Kernartefakte
Agent Cards, Tasks, Artifacts
Resources, Tools, Prompts
Initiator
Jeder Agent kann initiieren; Tasks haben einen definierten Lebenszyklus
Agent (Client) ruft MCP-Server auf
Trägerorganisation
Linux Foundation (initiiert von Google, April 2025)
Anthropic (offene Spezifikation)
Kapselungsmodell
Agenten sind füreinander opak; interner Zustand bleibt privat
Tool legt seine Capability-Oberfläche offen; Agent besitzt das Reasoning
Fallstricke

Drei Wege, wie dieses Pattern Probleme verursachen kann.

A2A dort eingesetzt, wo ein Tool-Aufruf ausreicht

Ein lokaler Agent ruft einen entfernten Agenten über A2A für eine einfache Abfrage auf, die ein direkter Funktionsaufruf wäre. Latenz und Kosten vervielfachen sich.

Lösung · A2A für grenzüberschreitende oder framework-übergreifende Aufrufe reservieren. Für gleiche-Runtime-Operationen In-Process-Tools verwenden.

Verwischte Vertrauensgrenzen

Ein interner Agent akzeptiert eine A2A-Nachricht von einem externen Agenten, ohne die Identität oder Berechtigungen des Absenders zu prüfen.

Lösung · Gegenseitiges TLS und signierte Claims für jede A2A-Interaktion. Externe Agenten standardmäßig als nicht vertrauenswürdig behandeln.

Aufgaben als synchron behandeln

Der Client blockiert auf message/send für einen lang laufenden Job, ignoriert Streaming und läuft in einen Timeout, bevor die Aufgabe abgeschlossen ist.

Lösung · Den Task-Lifecycle handhaben. Über SSE streamen oder eine Push-Benachrichtigung für Jobs registrieren, die länger als die Anfrage dauern.

Framework-Unterstützung

Wo A2A Protocol nativ ist.

Google ADKMitbegründer; First-Class-A2A-UnterstützungNativ
Microsoft Agent FrameworkA2A-Mitinitiator; dokumentierte UnterstützungNativ
A2A Python SDKReferenzAnpassbar
LangGraphexperimentellAnpassbar
CrewAIexperimentellAnpassbar

Suche

Patterns, Frameworks und Seiten durchsuchen.