Handshake-Protokolle zwischen zwei Agents
Auch Agents brauchen "Verträge". Die request_id ist die Vertragsnummer.
Warum Protokolle?
In s09 kann send_message beliebige Inhalte übermitteln. Wenn zwei Agents aber in einer bestimmten Sache eine Einigung erzielen müssen (z.B. "darf ich dich jetzt herunterfahren?"), reicht ein einfacher String nicht aus — du brauchst:
- Eindeutige Anfrage-ID (request_id), damit Antworten zugeordnet werden können.
- Zustandsmaschine (FSM): pending → approved | rejected, jeder Zustand hat klare Konsequenzen.
- Konsistente Felder: Beide Seiten wissen, was
approve: truebedeutet.
Dafür gibt es shutdown_request / shutdown_response / plan_approval / plan_approval_response.
Shutdown-Protokoll vollständig
lead möchte alice herunterfahren:
lead: # shutdown_request senden, request_id auf Server speichern req_id = uuid4()[:8] shutdown_requests[req_id] = {"target": "alice", "status": "pending"} send("alice", "shutdown_request", extra={"request_id": req_id}) alice: # nächste Loop-Runde: Postfach lesen, shutdown_request sehen # entscheidet: erst aktuelle Aufgabe fertigstellen, dann zustimmen tool_use("shutdown_response", request_id=req_id, approve=True) lead: # shutdown_response empfangen, Tracker auf approved aktualisieren shutdown_requests[req_id]["status"] = "approved" # alice erkennt Shutdown-Zustimmung, setzt status=shutdown und beendet Loop
Shutdown FSM visualisiert
FSM Schritt für Schritt durchgehen. alice kann auch ablehnen — "ich bin mitten in einer kritischen Aufgabe".
Plan Approval · Gleiches Muster, andere Domäne
Teammate übermittelt einen Plan zur Genehmigung, bevor er eine große Aktion durchführt:
alice: tool_use("plan_approval", plan="Ich plane, das auth-Modul komplett auf JWT umzuschreiben") # alice wartet idle auf lead lead: # alices plan_approval_response-Anfrage sehen tool_use("plan_approval", request_id="...", approve=False, feedback="auth noch nicht anfassen, nächsten Monat kommt ein Gesamt-Refactor")
Im s10-Quellcode fällt auf: Beide Protokolle verwenden exakt dasselbe request_id-Tracking-Muster — nur die Dictionary-Namen unterscheiden sich (shutdown_requests vs. plan_requests). Ein Muster, zwei Domänen.
Warum keine gemeinsame Protocol-Basisklasse? s10 abstrahiert bewusst nicht. Bei nur zwei Protokollen ist der Gewinn noch nicht klar; jedes ist für sich allein verständlich. Wenn ein viertes oder fünftes Protokoll kommt, lohnt die Abstraktion (rule of three).