Sub-Agents
Sub-Agents sind Hintergrund-Agent-Läufe, die aus einem bestehenden Agent-Lauf heraus gestartet werden. Sie laufen in ihrer eigenen Session (agent:<agentId>:subagent:<uuid>) und kündigen ihr Ergebnis nach Abschluss zurück im Chat-Channel des Anfragenden an. Jeder Sub-Agent-Lauf wird als background task verfolgt.
Slash-Befehl
Verwende/subagents, um Sub-Agent-Läufe für die aktuelle Session zu prüfen oder zu steuern:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>/subagents steer <id|#> <message>/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>
/subagents info zeigt Lauf-Metadaten (Status, Zeitstempel, Session-ID, Transkriptpfad, Bereinigung).
Verwende sessions_history für eine begrenzte, sicherheitsgefilterte Ansicht des Verlaufs; prüfe den
Transkriptpfad auf dem Datenträger, wenn du das rohe vollständige Transkript brauchst.
Spawn-Verhalten
/subagents spawn startet einen Hintergrund-Sub-Agenten als Benutzerbefehl, nicht als internen Relay, und sendet ein finales Abschluss-Update zurück in den Chat des Anfragenden, wenn der Lauf beendet ist.
- Der Spawn-Befehl blockiert nicht; er gibt sofort eine Lauf-ID zurück.
- Nach Abschluss kündigt der Sub-Agent eine Zusammenfassung/Ergebnisnachricht im Chat-Channel des Anfragenden an.
- Der Abschluss ist push-basiert. Sobald er gestartet wurde, solltest du nicht in einer Schleife
/subagents list,sessions_listodersessions_historypollen, nur um auf das Ende zu warten; prüfe den Status nur bei Bedarf zur Fehlersuche oder für Eingriffe. - Nach Abschluss schließt OpenClaw best-effort verfolgte Browser-Tabs/Prozesse, die von dieser Sub-Agent-Session geöffnet wurden, bevor der Bereinigungsablauf der Ankündigung weiterläuft.
- Für manuelle Spawns ist die Zustellung robust:
- OpenClaw versucht zuerst direkte
agent-Zustellung mit einem stabilen Idempotenz-Schlüssel. - Wenn direkte Zustellung fehlschlägt, fällt es auf Queue-Routing zurück.
- Wenn Queue-Routing weiterhin nicht verfügbar ist, wird die Ankündigung mit kurzem exponentiellem Backoff erneut versucht, bevor endgültig aufgegeben wird.
- OpenClaw versucht zuerst direkte
- Die Zustellung des Abschlusses behält die aufgelöste Route des Anfragenden bei:
- threadgebundene oder konversationsgebundene Abschlussrouten gewinnen, wenn verfügbar
- wenn der Abschluss-Ursprung nur einen Channel angibt, ergänzt OpenClaw das fehlende Ziel/Konto aus der aufgelösten Route der anfragenden Session (
lastChannel/lastTo/lastAccountId), damit direkte Zustellung weiterhin funktioniert
- Die Abschluss-Übergabe an die Session des Anfragenden ist intern zur Laufzeit erzeugter Kontext (kein vom Benutzer verfasster Text) und enthält:
Result(neuester sichtbarerassistant-Antworttext, andernfalls bereinigter neuestertool-/toolResult-Text)Status(completed successfully/failed/timed out/unknown)- kompakte Laufzeit-/Token-Statistiken
- eine Zustellanweisung, die dem anfragenden Agenten sagt, in normaler Assistentenstimme umzuschreiben (keine rohen internen Metadaten weiterleiten)
--modelund--thinkingüberschreiben die Standardwerte für genau diesen Lauf.- Verwende
info/log, um Details und Ausgabe nach Abschluss zu prüfen. /subagents spawnist Einmalmodus (mode: "run"). Für persistente threadgebundene Sessions verwendesessions_spawnmitthread: trueundmode: "session".- Für ACP-Harness-Sessions (Codex, Claude Code, Gemini CLI) verwende
sessions_spawnmitruntime: "acp"und siehe ACP Agents.
- „Recherche / lange Aufgabe / langsames Tool“-Arbeit parallelisieren, ohne den Hauptlauf zu blockieren.
- Sub-Agents standardmäßig isoliert halten (Session-Trennung + optionales Sandboxing).
- Die Tool-Oberfläche schwer missbrauchbar halten: Sub-Agents erhalten standardmäßig keine Session-Tools.
- Konfigurierbare Verschachtelungstiefe für Orchestrator-Muster unterstützen.
agents.defaults.subagents.model oder agentenspezifische Overrides konfigurieren.
Tool
Verwendesessions_spawn:
- Startet einen Sub-Agent-Lauf (
deliver: false, globale Lane:subagent) - Führt dann einen Ankündigungsschritt aus und postet die Ankündigungsantwort in den Chat-Channel des Anfragenden
- Standardmodell: übernimmt den Aufrufer, außer du setzt
agents.defaults.subagents.model(oder pro Agentagents.list[].subagents.model); ein explizitessessions_spawn.modelgewinnt weiterhin. - Standard-Reasoning: übernimmt den Aufrufer, außer du setzt
agents.defaults.subagents.thinking(oder pro Agentagents.list[].subagents.thinking); ein explizitessessions_spawn.thinkinggewinnt weiterhin. - Standard-Run-Timeout: Wenn
sessions_spawn.runTimeoutSecondsweggelassen wird, verwendet OpenClawagents.defaults.subagents.runTimeoutSeconds, falls gesetzt; andernfalls fällt es auf0zurück (kein Timeout).
task(erforderlich)label?(optional)agentId?(optional; unter einer anderen Agent-ID starten, falls erlaubt)model?(optional; überschreibt das Sub-Agent-Modell; ungültige Werte werden übersprungen und der Sub-Agent läuft mit dem Standardmodell weiter, mit einer Warnung im Tool-Ergebnis)thinking?(optional; überschreibt den Thinking-Level für den Sub-Agent-Lauf)runTimeoutSeconds?(Standard istagents.defaults.subagents.runTimeoutSeconds, wenn gesetzt, sonst0; wenn gesetzt, wird der Sub-Agent-Lauf nach N Sekunden abgebrochen)thread?(Standardfalse; wenntrue, wird für diese Sub-Agent-Session eine Channel-Thread-Bindung angefordert)mode?(run|session)- Standard ist
run - wenn
thread: trueundmodeweggelassen wird, wird der Standard zusession mode: "session"erfordertthread: true
- Standard ist
cleanup?(delete|keep, Standardkeep)sandbox?(inherit|require, Standardinherit;requirelehnt den Spawn ab, wenn die Laufzeit des Ziel-Childs nicht sandboxed ist)sessions_spawnakzeptiert keine Parameter für Channel-Zustellung (target,channel,to,threadId,replyTo,transport). Für Zustellung verwendemessage/sessions_sendaus dem gestarteten Lauf.
Threadgebundene Sessions
Wenn Thread-Bindungen für einen Channel aktiviert sind, kann ein Sub-Agent an einen Thread gebunden bleiben, sodass nachfolgende Benutzernachrichten in diesem Thread weiterhin an dieselbe Sub-Agent-Session geroutet werden.Channels mit Thread-Unterstützung
- Discord (derzeit der einzige unterstützte Channel): unterstützt persistente threadgebundene Subagent-Sessions (
sessions_spawnmitthread: true), manuelle Thread-Steuerung (/focus,/unfocus,/agents,/session idle,/session max-age) und Adapter-Schlüsselchannels.discord.threadBindings.enabled,channels.discord.threadBindings.idleHours,channels.discord.threadBindings.maxAgeHoursundchannels.discord.threadBindings.spawnSubagentSessions.
- Starte mit
sessions_spawnunter Verwendung vonthread: true(und optionalmode: "session"). - OpenClaw erstellt oder bindet einen Thread an dieses Session-Ziel im aktiven Channel.
- Antworten und Folge-Nachrichten in diesem Thread werden an die gebundene Session geroutet.
- Verwende
/session idle, um automatisches Entfokussieren bei Inaktivität zu prüfen/aktualisieren, und/session max-age, um die harte Obergrenze zu steuern. - Verwende
/unfocus, um die Bindung manuell zu lösen.
/focus <target>bindet den aktuellen Thread (oder erstellt einen) an ein Sub-Agent-/Session-Ziel./unfocusentfernt die Bindung für den aktuell gebundenen Thread./agentslistet aktive Läufe und den Bindungszustand auf (thread:<id>oderunbound)./session idleund/session max-agefunktionieren nur für fokussierte gebundene Threads.
- Globaler Standard:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours - Channel-Override- und Spawn-Auto-Bind-Schlüssel sind adapterspezifisch. Siehe Channels mit Thread-Unterstützung oben.
agents.list[].subagents.allowAgents: Liste von Agent-IDs, die überagentIdangesprochen werden dürfen (["*"], um beliebige zu erlauben). Standard: nur der anfragende Agent.agents.defaults.subagents.allowAgents: Standard-Allowlist für Ziel-Agenten, wenn der anfragende Agent nicht seine eigenesubagents.allowAgentssetzt.- Guard für Sandbox-Vererbung: Wenn die anfragende Session sandboxed ist, lehnt
sessions_spawnZiele ab, die unsandboxed laufen würden. agents.defaults.subagents.requireAgentId/agents.list[].subagents.requireAgentId: wenntrue, blockiertsessions_spawn-Aufrufe ohneagentId(erzwingt explizite Profilauswahl). Standard: false.
- Verwende
agents_list, um zu sehen, welche Agent-IDs derzeit fürsessions_spawnerlaubt sind.
- Sub-Agent-Sessions werden nach
agents.defaults.subagents.archiveAfterMinutesautomatisch archiviert (Standard: 60). - Die Archivierung verwendet
sessions.deleteund benennt das Transkript in*.deleted.<timestamp>um (im selben Ordner). cleanup: "delete"archiviert sofort nach der Ankündigung (behält das Transkript dennoch durch Umbenennung).- Auto-Archivierung ist best-effort; ausstehende Timer gehen verloren, wenn das Gateway neu gestartet wird.
runTimeoutSecondsarchiviert nicht automatisch; es stoppt nur den Lauf. Die Session bleibt bis zur Auto-Archivierung bestehen.- Auto-Archivierung gilt gleichermaßen für Sessions der Tiefe 1 und Tiefe 2.
- Browser-Bereinigung ist getrennt von Archiv-Bereinigung: verfolgte Browser-Tabs/Prozesse werden best-effort geschlossen, wenn der Lauf endet, auch wenn Transkript/Session-Eintrag erhalten bleiben.
Verschachtelte Sub-Agents
Standardmäßig können Sub-Agents keine eigenen Sub-Agents starten (maxSpawnDepth: 1). Du kannst eine Ebene der Verschachtelung aktivieren, indem du maxSpawnDepth: 2 setzt; das erlaubt das Orchestrator-Muster: main → Orchestrator-Sub-Agent → Worker-Sub-Sub-Agents.
So wird es aktiviert
Tiefenstufen
| Tiefe | Form des Session-Keys | Rolle | Kann Childs starten? |
|---|---|---|---|
| 0 | agent:<id>:main | Hauptagent | Immer |
| 1 | agent:<id>:subagent:<uuid> | Sub-Agent (Orchestrator, wenn Tiefe 2 erlaubt) | Nur wenn maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Sub-Sub-Agent (Leaf-Worker) | Niemals |
Ankündigungskette
Ergebnisse fließen die Kette zurück nach oben:- Worker der Tiefe 2 beendet → kündigt seinem Parent an (Orchestrator der Tiefe 1)
- Orchestrator der Tiefe 1 erhält die Ankündigung, synthetisiert Ergebnisse, beendet → kündigt main an
- Der Hauptagent erhält die Ankündigung und liefert an den Benutzer aus
- Starte Child-Arbeit einmal und warte auf Abschlussereignisse, statt Poll-
Schleifen um
sessions_list,sessions_history,/subagents listoderexec-Sleep-Befehle zu bauen. - Wenn ein Child-Abschlussereignis eintrifft, nachdem du bereits die finale Antwort gesendet hast,
ist die korrekte Folgeaktion das exakte stille Token
NO_REPLY/no_reply.
Tool-Richtlinie nach Tiefe
- Rolle und Kontrollumfang werden beim Spawn in Session-Metadaten geschrieben. Das verhindert, dass flache oder wiederhergestellte Session-Keys versehentlich wieder Orchestrator-Rechte erhalten.
- Tiefe 1 (Orchestrator, wenn
maxSpawnDepth >= 2): Erhältsessions_spawn,subagents,sessions_list,sessions_history, damit Childs verwaltet werden können. Andere Session-/System-Tools bleiben verweigert. - Tiefe 1 (Leaf, wenn
maxSpawnDepth == 1): Keine Session-Tools (aktuelles Standardverhalten). - Tiefe 2 (Leaf-Worker): Keine Session-Tools —
sessions_spawnist auf Tiefe 2 immer verweigert. Es können keine weiteren Childs gestartet werden.
Spawn-Limit pro Agent
Jede Agent-Session (in beliebiger Tiefe) kann höchstensmaxChildrenPerAgent (Standard: 5) aktive Childs gleichzeitig haben. Das verhindert unkontrolliertes Aufspalten von einem einzelnen Orchestrator aus.
Kaskadierendes Stoppen
Das Stoppen eines Orchestrators der Tiefe 1 stoppt automatisch alle Childs der Tiefe 2:/stopim Hauptchat stoppt alle Agenten der Tiefe 1 und kaskadiert zu deren Childs der Tiefe 2./subagents kill <id>stoppt einen bestimmten Sub-Agenten und kaskadiert zu seinen Childs./subagents kill allstoppt alle Sub-Agents für den Anfragenden und kaskadiert.
Authentifizierung
Die Authentifizierung für Sub-Agents wird anhand der Agent-ID aufgelöst, nicht anhand des Session-Typs:- Der Session-Key des Sub-Agenten ist
agent:<agentId>:subagent:<uuid>. - Der Auth-Store wird aus dem
agentDirdieses Agenten geladen. - Die Auth-Profile des Hauptagenten werden als Fallback zusammengeführt; bei Konflikten überschreiben Agent-Profile die Profile von main.
Ankündigung
Sub-Agents melden sich über einen Ankündigungsschritt zurück:- Der Ankündigungsschritt läuft innerhalb der Sub-Agent-Session (nicht in der Session des Anfragenden).
- Wenn der Sub-Agent exakt
ANNOUNCE_SKIPantwortet, wird nichts gepostet. - Wenn der neueste Assistententext das exakte stille Token
NO_REPLY/no_replyist, wird die Ankündigungsausgabe unterdrückt, selbst wenn es zuvor sichtbaren Fortschritt gab. - Andernfalls hängt die Zustellung von der Tiefe des Anfragenden ab:
- Sessions von Anfragenden auf oberster Ebene verwenden einen nachgelagerten
agent-Aufruf mit externer Zustellung (deliver=true) - verschachtelte Subagent-Sessions des Anfragenden erhalten eine interne Follow-up-Injektion (
deliver=false), sodass der Orchestrator Child-Ergebnisse in der Session synthetisieren kann - wenn eine verschachtelte Session eines anfragenden Subagenten nicht mehr existiert, fällt OpenClaw, wenn möglich, auf den Anfragenden dieser Session zurück
- Sessions von Anfragenden auf oberster Ebene verwenden einen nachgelagerten
- Für Sessions von Anfragenden auf oberster Ebene löst direkte Zustellung im Completion-Modus zuerst jede gebundene Konversations-/Thread-Route und jeden Hook-Override auf und ergänzt dann fehlende Channel-Zielfelder aus der gespeicherten Route der anfragenden Session. So bleiben Abschlüsse im richtigen Chat/Topic, selbst wenn der Abschluss-Ursprung nur den Channel identifiziert.
- Die Aggregation von Child-Abschlüssen ist beim Erstellen verschachtelter Completion-Funde auf den aktuellen Lauf des Anfragenden beschränkt, damit keine veralteten Child-Ausgaben früherer Läufe in die aktuelle Ankündigung gelangen.
- Ankündigungsantworten behalten Thread-/Topic-Routing bei, wenn dies in Channel-Adaptern verfügbar ist.
- Der Ankündigungskontext wird zu einem stabilen internen Ereignisblock normalisiert:
- Quelle (
subagentodercron) - Child-Session-Key/-ID
- Ankündigungstyp + Aufgabenlabel
- Statuszeile aus Laufzeitsignalen (
success,error,timeoutoderunknown) - Ergebnisinhalt aus dem neuesten sichtbaren Assistententext, andernfalls aus bereinigtem neuesten
tool-/toolResult-Text - eine Follow-up-Anweisung, die beschreibt, wann geantwortet und wann still geblieben werden soll
- Quelle (
Statuswird nicht aus der Modellausgabe abgeleitet; er stammt aus Laufzeitsignalen.- Bei Timeout kann die Ankündigung, wenn das Child nur Tool-Aufrufe geschafft hat, diesen Verlauf in eine kurze Zusammenfassung des Teilfortschritts zusammenziehen, statt rohe Tool-Ausgabe erneut wiederzugeben.
- Laufzeit (z. B.
runtime 5m12s) - Token-Verbrauch (Eingabe/Ausgabe/Gesamt)
- Geschätzte Kosten, wenn Modellpreise konfiguriert sind (
models.providers.*.models[].cost) sessionKey,sessionIdund Transkriptpfad (damit der Hauptagent den Verlauf übersessions_historyabrufen oder die Datei auf dem Datenträger prüfen kann)- Interne Metadaten sind nur für Orchestrierung gedacht; benutzerseitige Antworten sollten in normaler Assistentenstimme umgeschrieben werden.
sessions_history ist der sicherere Orchestrierungspfad:
- Assistenten-Recall wird zuerst normalisiert:
- Thinking-Tags werden entfernt
<relevant-memories>/<relevant_memories>-Gerüstblöcke werden entfernt- Klartext-XML-Payload-Blöcke für Tool-Aufrufe wie
<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>und<function_calls>...</function_calls>werden entfernt, einschließlich abgeschnittener Payloads, die nie sauber geschlossen wurden - herabgestuftes Tool-Call-/Result-Gerüst und Marker für historischen Kontext werden entfernt
- durchgesickerte Kontroll-Tokens des Modells wie
<|assistant|>, andere ASCII-<|...|>-Tokens und Full-Width-Varianten<|...|>werden entfernt - fehlerhaftes MiniMax-XML für Tool-Aufrufe wird entfernt
- Credentials-/Token-ähnlicher Text wird geschwärzt
- lange Blöcke können abgeschnitten werden
- sehr große Verläufe können ältere Zeilen verwerfen oder eine übergroße Zeile durch
[sessions_history omitted: message too large]ersetzen - die Prüfung des rohen On-Disk-Transkripts ist der Fallback, wenn du das vollständige Byte-für-Byte-Transkript brauchst
Tool-Richtlinie (Sub-Agent-Tools)
Standardmäßig erhalten Sub-Agents alle Tools außer Session-Tools und System-Tools:sessions_listsessions_historysessions_sendsessions_spawn
sessions_history bleibt auch hier eine begrenzte, bereinigte Recall-Ansicht; es ist
kein roher Transkript-Dump.
Wenn maxSpawnDepth >= 2, erhalten Orchestrator-Sub-Agents der Tiefe 1 zusätzlich sessions_spawn, subagents, sessions_list und sessions_history, damit sie ihre Childs verwalten können.
Per Konfiguration überschreiben:
Nebenläufigkeit
Sub-Agents verwenden eine dedizierte In-Process-Queue-Lane:- Lane-Name:
subagent - Nebenläufigkeit:
agents.defaults.subagents.maxConcurrent(Standard8)
Stoppen
- Das Senden von
/stopim Chat des Anfragenden bricht die anfragende Session ab und stoppt alle aktiven Sub-Agent-Läufe, die daraus gestartet wurden, einschließlich kaskadierender Childs. /subagents kill <id>stoppt einen bestimmten Sub-Agenten und kaskadiert zu seinen Childs.
Einschränkungen
- Die Ankündigung von Sub-Agents ist best-effort. Wenn das Gateway neu startet, geht ausstehende „zurück ankündigen“-Arbeit verloren.
- Sub-Agents teilen sich weiterhin dieselben Prozessressourcen des Gateway; betrachte
maxConcurrentals Sicherheitsventil. sessions_spawnblockiert nie: Es gibt sofort{ status: "accepted", runId, childSessionKey }zurück.- Der Kontext von Sub-Agents injiziert nur
AGENTS.md+TOOLS.md(keinSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdoderBOOTSTRAP.md). - Die maximale Verschachtelungstiefe ist 5 (
maxSpawnDepth-Bereich: 1–5). Tiefe 2 wird für die meisten Anwendungsfälle empfohlen. maxChildrenPerAgentbegrenzt aktive Childs pro Session (Standard: 5, Bereich: 1–20).