Agenten-Schleife (OpenClaw)
Eine agentische Schleife ist der vollständige „echte“ Lauf eines Agenten: Intake → Kontextaufbau → Modellinferenz → Werkzeugausführung → Streaming-Antworten → Persistenz. Sie ist der maßgebliche Pfad, der eine Nachricht in Aktionen und eine finale Antwort umsetzt und dabei den Sitzungszustand konsistent hält. In OpenClaw ist eine Schleife ein einzelner, serialisierter Lauf pro Sitzung, der Lebenszyklus- und Stream-Ereignisse emittiert, während das Modell denkt, Werkzeuge aufruft und Ausgaben streamt. Dieses Dokument erklärt, wie diese authentische Schleife Ende-zu-Ende verdrahtet ist.Einstiegspunkte
- Gateway-RPC:
agentundagent.wait. - CLI: Befehl
agent.
Funktionsweise (High-Level)
agentRPC validiert Parameter, löst die Sitzung (sessionKey/sessionId) auf, persistiert Sitzungsmetadaten und gibt sofort{ runId, acceptedAt }zurück.agentCommandführt den Agenten aus:- löst Modell- sowie Thinking-/Verbose-Standards auf
- lädt den Skills-Snapshot
- ruft
runEmbeddedPiAgent(pi-agent-core Runtime) auf - emittiert Lifecycle end/error, falls die eingebettete Schleife keines emittiert
runEmbeddedPiAgent:- serialisiert Läufe über pro-Sitzungs- und globale Queues
- löst Modell- und Auth-Profil auf und baut die pi-Sitzung
- abonniert pi-Ereignisse und streamt Assistant-/Tool-Deltas
- erzwingt Timeouts → bricht den Lauf bei Überschreitung ab
- gibt Payloads + Nutzungsmetadaten zurück
subscribeEmbeddedPiSessionüberbrückt pi-agent-core-Ereignisse in den OpenClaw-agent-Stream:- Tool-Ereignisse ⇒
stream: "tool" - Assistant-Deltas ⇒
stream: "assistant" - Lifecycle-Ereignisse ⇒
stream: "lifecycle"(phase: "start" | "end" | "error")
- Tool-Ereignisse ⇒
agent.waitverwendetwaitForAgentJob:- wartet auf Lifecycle end/error für
runId - gibt
{ status: ok|error|timeout, startedAt, endedAt, error? }zurück
- wartet auf Lifecycle end/error für
Queueing + Nebenläufigkeit
- Läufe werden pro Sitzungsschlüssel (Session-Lane) und optional über eine globale Lane serialisiert.
- Dies verhindert Tool-/Sitzungs-Rennen und hält die Sitzungshistorie konsistent.
- Messaging-Kanäle können Queue-Modi (collect/steer/followup) wählen, die dieses Lane-System speisen. Siehe Command Queue.
Sitzung + Workspace-Vorbereitung
- Der Workspace wird aufgelöst und erstellt; sandboxed Läufe können zu einer Sandbox-Workspace-Root umleiten.
- Skills werden geladen (oder aus einem Snapshot wiederverwendet) und in Umgebung und Prompt injiziert.
- Bootstrap-/Kontextdateien werden aufgelöst und in den System-Prompt-Report injiziert.
- Eine Sitzungs-Schreibsperre wird erworben;
SessionManagerwird vor dem Streaming geöffnet und vorbereitet.
Prompt-Zusammenbau + System-Prompt
- Der System-Prompt wird aus dem Basis-Prompt von OpenClaw, dem Skills-Prompt, dem Bootstrap-Kontext und pro Lauf-Overrides aufgebaut.
- Modellspezifische Limits und Reserve-Tokens für Kompaktierung werden erzwungen.
- Siehe System prompt für das, was das Modell sieht.
Hook-Punkte (wo Sie abfangen können)
OpenClaw hat zwei Hook-Systeme:- Interne Hooks (Gateway-Hooks): ereignisgetriebene Skripte für Befehle und Lifecycle-Ereignisse.
- Plugin-Hooks: Erweiterungspunkte innerhalb des Agenten-/Tool-Lebenszyklus und der Gateway-Pipeline.
Interne Hooks (Gateway-Hooks)
agent:bootstrap: läuft beim Erstellen der Bootstrap-Dateien, bevor der System-Prompt finalisiert wird. Verwenden Sie dies, um Bootstrap-Kontextdateien hinzuzufügen/zu entfernen.- Command-Hooks:
/new,/reset,/stopund weitere Befehlsevents (siehe Hooks-Dokument).
Plugin-Hooks (Agenten- + Gateway-Lebenszyklus)
Diese laufen innerhalb der Agenten-Schleife oder der Gateway-Pipeline:before_agent_start: injiziert Kontext oder überschreibt den System-Prompt vor Start des Laufs.agent_end: inspiziert die finale Nachrichtenliste und Laufmetadaten nach Abschluss.before_compaction/after_compaction: beobachtet oder annotiert Kompaktierungszyklen.before_tool_call/after_tool_call: fängt Tool-Parameter/-Ergebnisse ab.tool_result_persist: transformiert Tool-Ergebnisse synchron, bevor sie in das Sitzungsprotokoll geschrieben werden.message_received/message_sending/message_sent: eingehende + ausgehende Nachrichten-Hooks.session_start/session_end: Grenzen des Sitzungs-Lebenszyklus.gateway_start/gateway_stop: Gateway-Lebenszyklusereignisse.
Streaming + Teilantworten
- Assistant-Deltas werden aus pi-agent-core gestreamt und als
assistant-Ereignisse emittiert. - Block-Streaming kann Teilantworten entweder auf
text_endodermessage_endemittieren. - Reasoning-Streaming kann als separater Stream oder als Block-Antworten emittiert werden.
- Siehe Streaming für Chunking- und Block-Antwort-Verhalten.
Werkzeugausführung + Messaging-Werkzeuge
- Tool-Start-/Update-/Ende-Ereignisse werden auf dem
tool-Stream emittiert. - Tool-Ergebnisse werden vor dem Protokollieren/Emittieren hinsichtlich Größe und Bild-Payloads bereinigt.
- Messaging-Tool-Sendungen werden verfolgt, um doppelte Assistant-Bestätigungen zu unterdrücken.
Antwortformung + Unterdrückung
- Finale Payloads werden zusammengestellt aus:
- Assistant-Text (und optional Reasoning)
- Inline-Tool-Zusammenfassungen (bei verbose + erlaubt)
- Assistant-Fehlertext, wenn das Modell einen Fehler hat
NO_REPLYwird als stilles Token behandelt und aus ausgehenden Payloads gefiltert.- Duplikate von Messaging-Tools werden aus der finalen Payload-Liste entfernt.
- Wenn keine darstellbaren Payloads verbleiben und ein Tool einen Fehler hatte, wird eine Fallback-Tool-Fehlerantwort emittiert (es sei denn, ein Messaging-Tool hat bereits eine für Nutzer sichtbare Antwort gesendet).
Kompaktierung + Wiederholungen
- Auto-Kompaktierung emittiert
compaction-Stream-Ereignisse und kann eine Wiederholung auslösen. - Bei einer Wiederholung werden In-Memory-Puffer und Tool-Zusammenfassungen zurückgesetzt, um doppelte Ausgabe zu vermeiden.
- Siehe Compaction für die Kompaktierungs-Pipeline.
Ereignis-Streams (heute)
lifecycle: emittiert vonsubscribeEmbeddedPiSession(und als Fallback vonagentCommand)assistant: gestreamte Deltas aus pi-agent-coretool: gestreamte Tool-Ereignisse aus pi-agent-core
Chat-Kanal-Verarbeitung
- Assistant-Deltas werden in Chat-
delta-Nachrichten gepuffert. - Eine Chat-
finalwird bei Lifecycle end/error emittiert.
Zeitüberschreitungen
agent.waitStandard: 30 s (nur das Warten).timeoutMs-Parameter überschreibt.- Agenten-Runtime:
agents.defaults.timeoutSecondsStandard 600 s; erzwungen imrunEmbeddedPiAgent-Abbruch-Timer.
Wo Dinge frühzeitig enden können
- Agenten-Timeout (Abbruch)
- AbortSignal (Abbrechen)
- Gateway-Trennung oder RPC-Timeout
agent.wait-Timeout (nur Warten, stoppt den Agenten nicht)