Agent2Agent-Protokoll · A2A v1.0

Lassen Sie unabhängig voneinander eingesetzte Agenten zusammenarbeiten.

A2A bietet einem KI-Agenten eine Standardmöglichkeit, sich einem anderen Agenten vorzustellen, einen Job oder eine Aufgabe anzunehmen, den Fortschritt zu melden, weitere Informationen anzufordern und nützliche Ergebnisse zurückzugeben – selbst wenn der andere Agent in einem anderen KI-Dienst ausgeführt wird, eine andere Programmiersprache oder ein anderes Agenten-Framework verwendet oder in einer anderen Cloud bereitgestellt wird. Keiner der Agenten muss verstehen, wie der andere aufgebaut ist. Zur Kommunikation und Zusammenarbeit nutzen sie den A2A-Standard.

11 v1-OperationenAgentenkartenJSON-RPC + RESTSSE-StreamingAufgaben mit mehreren RundenAuthentifizierter PushRemoteA2aAgent

ADK-Rust A2A Referenzarchitektur

Architektur der A2A-Remoteagenten

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

01

Rufsystem

Der Agent oder die Anwendung, die einen anderen Agenten auffordert, Arbeit zu erledigen.

Koordinator-Agent

Entscheidet, welcher Remote-Spezialist die Aufgabe erhalten soll.

A2A-Client

Erkennt die Karte, wählt Streaming und sendet Protokollnachrichten.

HTTPS

02

A2A-Dienstgrenze

Der öffentliche Auftrag kann von jedem kompatiblen Kunden verstanden werden.

Agentenkarte

Name, Fähigkeiten, Endpunkt, Protokollversion, Sicherheit und deklarierte Fähigkeiten.

Schecks anfordern

Version, Inhaltstyp, IDs, Nachrichtenteile, Metadaten, Identität und Einschränkungen.

Anforderungshandler

Versendet JSON-RPC- oder REST-Vorgänge über eine gemeinsame Implementierung.

getippter Anruf

03

ADK-Rust-Laufzeit

Das Framework führt die Aufgabe aus und erzeugt einen typisierten Fortschritt.

Runner

Erstellt den Aufrufkontext und streamt Agentenereignisse.

Agentensystem

LLM, Workflow-, Diagramm-, benutzerdefinierte oder Multi-Agent-Logik.

Werkzeuge

Rust-Werkzeuge und MCP

Staat

Sitzungen und Erinnerung

Aufgabenstatus und Ereignisse werden aufgezeichnet, während der Agent arbeitet

04

Aufgabenlebenszyklus

Eine validierte Zustandsmaschine macht lang laufende Arbeiten überprüfbar.

Aufgabenspeicher

Status, Kontext, Verlauf, Artefakte, Metadaten und Push-Konfiguration.

Zustandsmaschine

Es werden nur gültige Übergänge akzeptiert; Terminalaufgaben bleiben Terminal.

05

Fortschrittliche Lieferung

Der Anrufer wählt aus, wie er das Wechselgeld erhalten möchte.

Direkte Antwort

Gibt die vollständige Aufgabe und ihre Artefakte zurück.

SSE-Stream

Zuerst die Aufgabe, dann Status- und Artefaktaktualisierungen.

06

Arbeiten Sie nach der Anfrage

Lange Aufgaben können später gemeldet werden, ohne dass eine Verbindung offen gehalten wird.

Abonnement

Ein Client lauscht auf Aktualisierungen für eine vorhandene Aufgabe.

Webhook pushen

Authentifizierte Zustellung mit Wiederholungsversuchen und SSRF-Prüfungen.

ADK-Rust behält den A2A-Drahtvertrag, den Aufgabenlebenszyklus, die Agentenausführung und die Bereitstellungskanäle als separate Teile bei, sodass jeder unabhängig voneinander gesichert, getestet und ersetzt werden kann.

Beginnen Sie mit der Idee

Wie arbeite ich mit einem extern gehosteten KI-Agenten?

Innerhalb eines ADK-Rust-Prozesses können Agenten Rust-Typen, Sitzungen, Tools und direkte Funktionsaufrufe gemeinsam nutzen. Sobald ein Agent einem anderen Dienst – oder einer anderen Organisation – angehört, sind diese privaten Implementierungsdetails kein sicherer Vertrag mehr.

A2A definiert die gemeinsame Sprache an dieser Grenze. Der Anrufer erkennt, was der Remote-Agent anbietet, sendet eine strukturierte Nachricht, verfolgt eine Aufgabe durch bekannte Zustände und empfängt Artefakte, ohne wissen zu müssen, welches Modell, welches Framework oder welche Tools hinter dem Endpunkt ausgeführt werden.

ADK-Rust implementiert A2A v1 in adk-server und verbindet das Protokoll direkt mit dem Runner. Derselbe Agent, den Sie lokal testen, kann zu einem Netzwerkdienst werden, während RemoteA2aAgent es einem anderen ADK-Rust-System ermöglicht, ihn über die normale Agentenschnittstelle zu nutzen.

Agentenkarte

Ein Serviceprofil für einen Agenten

Ein kleines öffentliches Dokument informiert Anrufer über den Namen des Agenten, Endpunkt, Fähigkeiten, Protokollversion, Sicherheitsanforderungen und ob er Streaming oder Benachrichtigungen unterstützt.

Nachricht

Was ein Agent zu einem anderen sagt

Eine Nachricht enthält eine Rolle, eine eindeutige ID und einen oder mehrere Teile wie Text oder strukturierte Daten. Die eindeutige ID ermöglicht sichere Wiederholungsversuche.

Aufgabe

Der Aufgabe können beide Systeme folgen

Eine Aufgabe gibt der Remote-Arbeit eine ID, einen Konversationskontext, einen Status, einen Nachrichtenverlauf, Metadaten und alle dabei erzeugten Artefakte.

Artefakt

Die nützliche Ausgabe der Arbeit

Ein Artefakt ist ein benanntes Ergebnis, das an die Aufgabe angehängt ist: ein Bericht, eine Entscheidung, ein Plan, eine generierte Datei oder eine andere strukturierte Ausgabe, die ein anderes System verwenden kann.

Folgen Sie einem Job

Das Protokoll trägt sowohl die Anfrage als auch die Lebensdauer des Werkes.

Ein Anrufer kann auf eine Antwort warten, einen Live-Ereignisstream öffnen, eine bestehende Aufgabe abonnieren oder einen Webhook für spätere Updates registrieren. Aufgabenidentität und -kontext sorgen dafür, dass jeder Bereitstellungsmodus mit derselben Arbeit verknüpft ist.

Task-Zustandsmaschine

Ein Remote-Job hat ein Leben, dem Sie folgen können.

A2A leistet mehr als nur die Rückgabe von Text. Es verleiht der Arbeit eine Identität, einen Gesprächskontext, einen aktuellen Zustand, eine Geschichte und Artefakte. ADK-Rust validiert jeden Übergang, bevor er gespeichert wird.

SUBMITTED

Der Server hat die Aufgabe angenommen.

WORKING

Der Agent führt es aus.

INPUT REQUIRED

Der Agent benötigt weitere Informationen.

AUTH REQUIRED

Der Anrufer muss eine Autorisierung vorlegen.

COMPLETED

Arbeit und Artefakte sind fertig.

FAILED

Die Ausführung wurde mit einem Fehler beendet.

CANCELED

Ein erlaubter Abbruch beendete die Aufgabe.

REJECTED

Der Server hat die Aufgabe abgelehnt.

Mehrgangarbeit: wenn eine Aufgabe erreicht wird INPUT_REQUIRED, sendet der Anrufer eine weitere Nachricht mit derselben Nachricht contextId. ADK-Rust findet die Aufgabe und gibt sie an zurück WORKING, hängt die Nachricht an und setzt den gleichen Job fort.

Logikfluss in der realen Welt

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.

Diese Betriebsinformationen gehören zu einem separat eingesetzten Fulfillment-Agenten. Über A2A kann der Support-Mitarbeiter herausfinden, was der Fulfillment-Agent tut, ihm die Untersuchung als Aufgabe senden, den Fortschritt verfolgen, Anfragen nach weiteren Informationen beantworten und die endgültige Ersatzentscheidung erhalten. Jeder Dienst behält seinen eigenen Code, seine eigenen Daten, Tools, Modellanbieter und Sicherheitskontrollen. Sie teilen nur die Nachrichten, den Aufgabenstatus und die Artefakte, die im A2A-Vertrag definiert sind.

01

Entdecken Sie den Spezialisten

Ein Support-Koordinator liest die Karte des Fulfillment-Agenten und bestätigt, dass dieser die Auftragsuntersuchung durchführt und den Fortschritt überträgt.

02

Senden Sie einen klaren Auftrag

Es sendet die Bestellnummer, die Anfrage des Kunden, eine eindeutige Nachrichten-ID und einen neuen Konversationskontext.

03

Route innerhalb des Dienstes

Der Remote-ADK-Rust-Agent überprüft Bestelltools, Inventar, Lieferhistorie und Unternehmensrichtlinien, ohne diese Interna dem Anrufer preiszugeben.

04

Fragen Sie nach dem, was fehlt

Wenn ein Schadensnachweis erforderlich ist, wird die Aufgabe zu INPUT_REQUIRED, anstatt zu raten oder stillschweigend fehlzuschlagen.

05

Setzen Sie die gleiche Aufgabe fort

Der Koordinator stellt die genehmigten Nachweise unter Verwendung derselben contextId bereit; Verlauf und Aufgabenidentität bleiben erhalten.

06

Geben Sie ein überprüfbares Ergebnis zurück

Die Aufgabe wird mit einem Statusverlauf und einem Artefakt abgeschlossen, das die Ersetzungsentscheidung und die nächsten Schritte enthält.

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

Anrufe über A2A
Versand an Runner
verwendet zugelassene Werkzeuge

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.

Code- und Drahtantworten

Sehen Sie, was jede Seite sendet und empfängt.

Diese Beispiele verwenden dieselben v1-Operationsnamen, Nachrichtenfelder, Aufgabenstatus und SSE-Antwortformen wie die ADK-Rust-Implementierung. IDs und Bestelldetails sind festgelegt, sodass das gesamte Gespräch leicht zu verfolgen ist.

fulfilment.rsFULFILLMENT-SERVICE · ROST
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.rsSUPPORT-KOORDINATOR · 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 · DEN AUFTRAG SENDEN
{
    "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 · STREAMEN SIE DEN AUFGABENFORTSCHRITT
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 · Fordern Sie die fehlenden Beweise an
{
    "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 · DIESELBE AUFGABE FORTSETZEN
{
    "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 · ERHALTEN SIE DAS ARTEFAKT UND FERTIGSTELLEN
{
    "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" }
    }
  }

Der A2A v1 API

Alles, was ein Kunde benötigt, um die Arbeit an einem Remote-Agenten zu beginnen, zu verfolgen und abzuschließen.

ADK-Rust implementiert alle 11 Operationen in A2A v1. Rufen Sie für einen kurzen Job SendMessage auf und warten Sie auf das Ergebnis der Aufgabe. Wenn die Arbeit länger dauern kann, verwenden Sie SendStreamingMessage, um zuerst die Aufgabe zu empfangen, gefolgt von Live-Status- und Artefaktereignissen über SSE.

Mit der zurückgegebenen Aufgaben-ID kann Ihr Client die Verbindung wiederherstellen, ohne den Auftrag erneut zu übermitteln. Es kann den neuesten Status abrufen, verwandte Aufgaben auflisten, weitere Updates abonnieren oder eine Stornierung beantragen. Wenn der Client eine Verbindung nicht offen halten kann, kann er einen authentifizierten Webhook registrieren und den Remote-Agenten spätere Änderungen übermitteln lassen.

01

Beginnen Sie mit der Arbeit

Senden Sie eine Nachricht und erhalten Sie entweder eine vollständige Aufgabe oder einen Live-Stream.

SendMessageSendStreamingMessage
02

Inspizieren und kontrollieren

Lesen Sie die aktuelle Arbeit, listen Sie passende Aufgaben auf oder brechen Sie eine Aufgabe ab, wenn ihr Status dies zulässt.

GetTaskListTasksCancelTask
03

Verfolgen Sie den Fortschritt

Öffnen Sie ein SSE-Abonnement für Updates einer bereits vorhandenen Aufgabe.

SubscribeToTask
04

Erhalten Sie spätere Updates

Erstellen, lesen, auflisten und entfernen Sie authentifizierte Webhook-Ziele für eine Aufgabe.

CreatePushConfigGetPushConfigListPushConfigsDeletePushConfig
05

Entdecken Sie mehr

Fordern Sie die erweiterte Version des veröffentlichten Serviceprofils eines Agenten an.

GetExtendedAgentCard

Ein Handler für zwei Bindungen

JSON-RPC und REST leiten den Versand an denselben RequestHandler weiter, sodass das Aufgabenverhalten zwischen den Transporten nicht schwankt.

Runner-gestützte Ausführung

Eingehende A2A-Nachrichten werden zu ADK-Rust-Inhalten. Der Runner führt den ausgewählten Agenten aus und wandelt seine Ereignisse in Aufgabenstatus und Artefakte um.

Sichere Wiederholungsversuche

Eine wiederholte messageId gibt die vorhandene Aufgabe zurück, anstatt dieselbe Arbeit zweimal auszuführen. Produktionsbereitstellungen sollten diese Zuordnung über Neustarts hinweg beibehalten.

Streaming, das mit dem Kontext beginnt

Das erste SSE-Ereignis ist die vollständige Aufgabe. Spätere Ereignisse enthalten Status- und Artefaktaktualisierungen, sodass ein Client immer weiß, zu welchem ​​Stream der Stream gehört.

Remote-Agenten fühlen sich vor Ort

RemoteA2aAgent implementiert die Agenteneigenschaft ADK-Rust. Ein Koordinator kann einen Netzwerkdienst in seine Agentenhierarchie aufnehmen und normale Framework-Ereignisse empfangen.

Schutz an der Grenze

Versionsaushandlung, Nachrichtenvalidierung, Trägerauthentifizierung, Ratenbegrenzung, Audit-Interceptoren, Webhook-Authentifizierung und SSRF-Prüfungen können den Dienst schützen.

Wählen Sie die richtige Grenze

Lokaler Subagent vs. Remote-A2A-Agent

A2A führt ein Netzwerk, einen öffentlichen Vertrag, Authentifizierung, Fehlerbehandlung und den Remote-Task-Status ein. Diese Kosten sind wertvoll, wenn sie echte Unabhängigkeit schaffen; Sie sind unnötig, wenn jeder Agent bereits im selben Prozess lebt.

Lokaler Subagent

Remote-A2A-Agent

Beste Passform
Agenten, die einer Anwendung gehören
Agenten, die unabhängig voneinander eingesetzt oder verwaltet werden
Kommunikation
In Bearbeitung befindliche Agentenanrufe und eingegebene Ereignisse
HTTP, JSON-RPC oder REST und SSE
Geteilter Zustand
Kann dieselben Sitzungen und Dienste nutzen
Gibt nur deklarierte Nachrichten, Aufgaben und Artefakte frei
Fehlergrenze
Eine Laufzeit und Bereitstellung
Netzwerk-, Zeitüberschreitungs-, Wiederholungs- und Remotedienstfehler
Interoperabilität
ADK-Rust-Komponenten
Jede A2A-kompatible Sprache oder jedes Framework

Vom Rust-Agent zum Netzwerkdienst

Machen Sie einen Agenten verfügbar und nutzen Sie ihn dann als Agenten.

Der Convenience-Server erstellt eine Axum-Anwendung mit einer Agentenkarte, Sitzungen, A2A-Routen und aktiviertem Streaming. Der Remote-Adapter erkennt diesen Dienst und wandelt seine Aufgabenaktualisierungen wieder in ADK-Rust-Ereignisse um.

serve.rsEinen Agenten entlarven
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.rsRufen Sie es von einem anderen Agenten an
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()?;
Für einen vollständig konfigurierten v1-Dienst: Verwenden Sie die dokumentierten RequestHandler::with_runner Pfad, um den Aufgabenspeicher, den Push-Absender, die Agentenkarte, die Runner-Dienste, die JSON-RPC-Route, den REST-Router und die Versionsaushandlungs-Middleware explizit auszuwählen.

Vor der Produktion

Bereitstellen von A2A-Agenten

ADK-Rust stellt die v1-Typen, Handler, Lebenszyklus, Clients, Validierung, Bereitstellungsprimitive und Integration mit Runner bereit. Die Produktionsbereitschaft hängt weiterhin von den für Ihren Dienst ausgewählten Speicher-, Identitäts-, Netzwerk-, Beobachtbarkeits- und Betriebsrichtlinien ab.

01

Veröffentlichen Sie eine ehrliche Karte

Bewerben Sie nur die Fähigkeiten, Bindungen, Streaming, Push-Bereitstellung und Sicherheitsschemata, die die Bereitstellung wirklich unterstützt.

02

Wählen Sie einen dauerhaften Zustand

Der enthaltene InMemoryTaskStore und die In-Memory-Idempotenzkarte sind für die Entwicklung nützlich. Langfristige Produktionsarbeiten benötigen Speicher, der Prozessneustarts übersteht.

03

Sichern Sie beide Richtungen

Authentifizieren Sie eingehende Anrufe und schützen Sie die ausgehende Push-Zustellung. Der HTTP-Push-Sender unterstützt Inhaberanmeldeinformationen, Benachrichtigungstoken, Wiederholungsversuche und die Ablehnung privater Adressen.

04

Designabbruch und Timeouts

Remote-Arbeit kann eine Anfrage überleben. Definieren Sie Client-Timeouts, Stornierungsrichtlinien, Wiederholungsverhalten und was passiert, wenn einer der Dienste nicht verfügbar ist.

Verbinden Sie das Agentensystem

Stellen Sie Ihren Agenten über eine Standard-A2A-Schnittstelle bereit.

Beginnen Sie mit einer ehrlichen Agentenkarte und einer nützlichen Aufgabe. Fügen Sie Streaming, Multi-Turn-Eingabe, Aufgabenpersistenz, Abonnements, authentifiziertes Push und Grenzkontrollen hinzu, wenn die Arbeit länger und der Dienst wichtiger wird.