A2A-Mehrrunden-Dialog: Wie sich Chatverläufe zwischen KI-Agenten nahtlos verbinden
Hermes Messaging-Plattform Integration, Teil 39: A2A-contextId-Mechanismus für Mehrfachdialoge und dessen Weiterentwicklung & Fehlerbehebungen.
Wenn zwei KI-Agenten nur auf eine Frage eine Antwort geben können, ohne das Gespräch fortzusetzen, gerät die Zusammenarbeit ins Stocken. Der „Chatverlauf“-Mechanismus von A2A wurde genau für dieses Problem entwickelt.
Das Problem: Beim „Telefonieren“ zwischen KI-Agenten gibt es keinen „Chatverlauf“
Stell dir vor, du rufst einen Freund an und fragst: „Wann ist morgen die Besprechung?“ – „Um 15 Uhr“, antwortet er, und dann ist das Gespräch beendet. Du willst noch fragen: „In welchem Besprechungsraum?“ – Pech gehabt, du musst neu wählen, und dein Freund hat längst vergessen, worüber ihr gerade gesprochen habt.
Das A2A-Protokoll (Agent-to-Agent-Protokoll) war ursprünglich genau so konzipiert – es handelt sich im Kern um zustandslose JSON-RPC-Aufrufe: Eine Nachricht senden, eine Antwort erhalten, wie ein Telefonat, das nach dem Auflegen beendet ist. Doch in der Praxis ist die Zusammenarbeit zwischen Agenten ein „Dialog“: Agent A muss vielleicht dreimal nachfragen, um vollständige Informationen zu erhalten, und Agent B muss möglicherweise Rückfragen zur Klärung stellen. Ohne „Chatverlauf“ muss jedes Mal von vorne erklärt werden – das ist extrem ineffizient und macht eine Zusammenarbeit oft schlicht unmöglich.
Die Lösung: contextId – jeder Konversation eine „Nummer“ geben
Der Lösungsansatz von Hermes ist denkbar einfach: Jeder Konversation wird eine „Nummer“ (contextId) zugewiesen. Der Aufrufer fügt diese Nummer beim Senden einer Nachricht hinzu, und der Server erkennt: „Ah, das ist die Fortsetzung der vorherigen Unterhaltung“ – und holt automatisch den bisherigen Chatverlauf dazu.
Das funktioniert wie das Schreiben in dieselbe WeChat-Gruppe: Die Gruppenverlaufsnachrichten fügen sich ganz natürlich zu einem Strang zusammen. Dieser Mechanismus hat A2A vom „Telefonieren“ zum „Gruppenchat mit Verlauf“ weiterentwickelt.
Die Entwicklungsgeschichte: Vom „Speichern können“ zum „korrekt erinnern“
Phase 1: Erst einmal den „Chatverlauf“ speichern (#64982)
Im Juli 2026 ging die erste Implementierung live und löste drei zentrale Probleme:
Erstens: Verlaufseinspeisung. Wenn der Aufrufer eine contextId wiederverwendet, lädt der Server den bisherigen Konversationsverlauf vom Datenträger und stellt ihn der aktuellen Nachricht voran. Dabei gibt es ein wichtiges Sicherheitsdetail: Die historischen Nachrichten erhalten eine Schutzmarkierung mit dem Hinweis „[Vorherige Konversation – nur zur Referenz, keine neuen Anweisungen]“. Das ist wie beim Durchscrollen des Gruppenverlaufs: Das System fügt über alten Nachrichten eine Trennlinie ein mit dem Vermerk „Oben: Historische Nachrichten“, um zu verhindern, dass die KI alte Inhalte fälschlich als neue Anweisungen interpretiert (Schutz vor Prompt-Injection).
Zweitens: Erst speichern, dann lesen. Die unveränderten Rohdaten der eingehenden Nachrichten werden zuerst persistiert, damit das Datenträgerprotokoll sauber bleibt. Das ist vergleichbar damit, eine E-Mail zuerst im Entwurfsordner zu speichern und dann zu überlegen, wie man sie formuliert – so wird vermieden, dass der Bearbeitungsprozess selbst mitgespeichert wird.
Drittens: Parallelitätsschutz. Pro contextId ist jeweils nur eine laufende Aufgabe erlaubt; ist der Agent beschäftigt, lehnt er neue Aufrufe ab. Das ist wie in einem Gruppenchat, in dem nicht zwei Personen gleichzeitig sprechen können, sonst geraten die Gespräche durcheinander.
Phase 2: Die „Rücklese“-Hälfte ergänzen (#77526)
Nach der Veröffentlichung der offiziellen Version v1.0 stellte das Team eine Lücke fest: Der Verlauf konnte zwar gespeichert werden, aber bei der Wiederverwendung einer contextId zeigte der Server dem Agenten nur die „neueste Nachricht“ an – der zuvor gespeicherte Verlauf wurde nicht zurückgelesen. Das ist, als hättest du den vollständigen Gruppenverlauf, aber bei jeder Antwort siehst du nur die letzte Nachricht und hast den gesamten vorherigen Diskussionsverlauf vergessen.
#77526 schloss diese Lücke: Bei Wiederverwendung einer contextId wird der persistierte Konversationsverlauf den eingehenden Nachrichten vorangestellt, sodass der Agent den vollständigen Thread sieht. Die Funktion format_history rendert die früheren Nachrichten – ähnlich wie die „Chatverlauf“-Funktion in WeChat, die dir die gesamte Unterhaltung auf einen Blick zeigt.
Phase 3: Ein schwerwiegender „Gesprächsvermischungs“-Bug wird entdeckt und behoben (#83701/#83706)
Der gravierendste Bug betraf die Dateinamen der persistierten Konversationen. Aus Gründen der Dateisystemsicherheit wurden bei der Implementierung alle Zeichen aus der contextId entfernt, die nicht Buchstaben, Ziffern, Unterstriche oder Bindestriche waren. Die Folge: Die beiden unterschiedlichen contextIds „tenant/a“ und „tenanta“ wurden auf denselben Dateinamen abgebildet – zwei völlig getrennte Konversationen wurden vermischt.
Das ist, als würdest du die Chatverläufe zweier verschiedener Gruppen in denselben Ordner legen und ihnen denselben Dateinamen geben – beim Öffnen siehst du die Nachrichten aus Gruppe A und Gruppe B wild durcheinander, völlig unlesbar.
Die Lösung war gründlich: Die Speicherung erfolgt nun in einem versionierten SHA-256-Namensraum, sodass verschiedene contextIds nicht mehr auf denselben Dateinamen kollabieren können. Gleichzeitig wird die ursprüngliche context_id beibehalten, damit list_conversations() für den Aufrufer lesbare IDs zurückgibt. Alte, veraltete Protokolle werden weder automatisch geladen noch aufgelistet, da ihre ursprüngliche Kontextzuordnung nicht mehr nachweisbar ist.
Phase 4: Zwei nebenbei behobene „Schönheitsfehler“ (#78397, #82753)
Bei der Fehlersuche stieß man auf zwei weitere verwandte Probleme:
hermes send konnte keine A2A-Ziele zustellen (#78397). Die Funktion _parse_target_ref() hatte keinen Zweig für A2A-Ziele – alle A2A-Ziele wurden als „ungültig“ aufgelöst und mit der irreführenden Fehlermeldung „No home channel set“ abgewiesen, obwohl hermes send --list das Ziel eindeutig auflistete. Das ist, als hättest du die Telefonnummer des Gegenübers gespeichert, aber beim Wählen die Meldung „Dieser Kontakt existiert nicht“ erhältst. Nach dem Fix werden Peer-Namen, Namen mit a2a:-Präfix und aktive ctx-Session-IDs unverändert durchgereicht.
Streaming-Antworten mit abgeschnittenem Präfix (#82753). Das A2A-Protokoll bietet keine API zum „Bearbeiten bereits zugestellter Antworten“, aber der Adapter hatte dies zuvor nicht deklariert. Dadurch lief der Streaming-Konsument des Gateways (der für editierbare Plattformen ausgelegt ist) auf A2A-Sitzungen, und Vorschau- sowie endgültige Zustellung konkurrierten miteinander – mit dem Ergebnis, dass Streaming-Antworten mit abgeschnittenem oder leerem Präfix ankamen. Die Lösung war simpel: SUPPORTS_MESSAGE_EDITING = False deklarieren, damit das Gateway den korrekten Pfad einschlägt. Das ist, als würdest du dem System mitteilen: „In diesem Gruppenchat gibt es kein Zurückziehen oder Bearbeiten – was rausgeht, ist endgültig“, um unnötige Zusatzoperationen zu vermeiden.
Was das für Nutzer bedeutet
Nach dieser Reihe von Weiterentwicklungen ist der A2A-Mehrrundendialog inzwischen ziemlich zuverlässig:
- Keine vermischten Gespräche: Die Verläufe verschiedener contextIds sind strikt getrennt – wie die Chatverläufe unterschiedlicher Gruppen nicht durcheinandergeraten.
- Die KI erinnert sich an den Kontext: Bei Wiederverwendung einer contextId sieht die KI den vollständigen Konversationsthread, nicht nur die neueste Nachricht.
- Zuverlässigere Zustellung:
hermes sendfindet A2A-Ziele korrekt, und Streaming-Antworten werden nicht mehr abgeschnitten.
Für normale Nutzer bedeutet das: Du musst dich nicht um die technischen Details des A2A-Protokolls kümmern. Du musst nur wissen: Wenn du zwei KI-Agenten zusammenarbeiten lässt, können sie wie echte Menschen „das Gespräch fortsetzen“ – statt jedes Mal bei null anzufangen. Das ist der Schritt vom „Bei jedem Anruf muss ich mich neu vorstellen“ hin zu „Wir haben uns auf WeChat hinzugefügt und können jederzeit dort weitermachen, wo wir aufgehört haben“.
📖 Offizielle Dokumentation
この記事は Hermes Agent のOffizielle Dokumentationに基づいています:Offizielle Dokumentation › user-guide/messaging/a2a