Sub-agents
Sub-Agenten sind Hintergrund-Agentenläufe, die aus einem bestehenden Agentenlauf heraus gestartet werden. Sie laufen in einer eigenen Sitzung (agent:<agentId>:subagent:<uuid>) und melden ihr Ergebnis nach Abschluss an den anfragenden Chat-Kanal zurück.
Slash command
Verwenden Sie/subagents, um Sub-Agent-Läufe für die aktuelle Sitzung zu inspizieren oder zu steuern:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
/subagents info zeigt Lauf-Metadaten (Status, Zeitstempel, Sitzungs-ID, Transkriptpfad, Aufräumen).
Primäre Ziele:
- Parallelisierung von „Recherche / Langläufer / langsames Tool“, ohne den Hauptlauf zu blockieren.
- Sub-Agenten standardmäßig isolieren (Sitzungstrennung + optionales Sandboxing).
- Die Tool-Oberfläche schwer missbrauchbar halten: Sub-Agenten erhalten keine Sitzungstools standardmäßig.
- Konfigurierbare Verschachtelungstiefe für Orchestrator-Muster unterstützen.
Sie können dies über
agents.defaults.subagents.model oder pro-Agent-Überschreibungen konfigurieren.
Tool
Verwenden Siesessions_spawn:
- Startet einen Sub-Agent-Lauf (
deliver: false, globale Lane:subagent) - Führt anschließend einen Announce-Schritt aus und postet die Announce-Antwort in den anfragenden Chat-Kanal
- Standardmodell: erbt vom Aufrufer, sofern Sie nicht
agents.defaults.subagents.model(oder pro-Agentagents.list[].subagents.model) setzen; ein explizitessessions_spawn.modelhat weiterhin Vorrang. - Standard-Thinking: erbt vom Aufrufer, sofern Sie nicht
agents.defaults.subagents.thinking(oder pro-Agentagents.list[].subagents.thinking) setzen; ein explizitessessions_spawn.thinkinghat weiterhin Vorrang.
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, mit Warnung im Tool-Ergebnis)thinking?(optional; überschreibt die Denkstufe für den Sub-Agent-Lauf)runTimeoutSeconds?(Standard0; wenn gesetzt, wird der Sub-Agent-Lauf nach N Sekunden abgebrochen)cleanup?(delete|keep, Standardkeep)
agents.list[].subagents.allowAgents: Liste von Agent-IDs, die überagentIdadressiert werden dürfen (["*"]erlaubt alle). Standard: nur der anfragende Agent.
- Verwenden Sie
agents_list, um zu sehen, welche Agent-IDs aktuell fürsessions_spawnerlaubt sind.
- Sub-Agent-Sitzungen werden automatisch nach
agents.defaults.subagents.archiveAfterMinutesarchiviert (Standard: 60). - Die Archivierung verwendet
sessions.deleteund benennt das Transkript in*.deleted.<timestamp>um (gleicher Ordner). cleanup: "delete"archiviert unmittelbar nach dem Announce (Transkript bleibt durch Umbenennung erhalten).- Auto-Archivierung ist Best-Effort; ausstehende Timer gehen bei einem Gateway-Neustart verloren.
runTimeoutSecondsarchiviert nicht automatisch; es stoppt nur den Lauf. Die Sitzung bleibt bis zur Auto-Archivierung bestehen.- Auto-Archivierung gilt gleichermaßen für Tiefe 1 und Tiefe 2 Sitzungen.
Nested Sub-Agents
Standardmäßig können Sub-Agenten keine eigenen Sub-Agenten starten (maxSpawnDepth: 1). Sie können eine Ebene Verschachtelung aktivieren, indem Sie maxSpawnDepth: 2 setzen. Dadurch wird das Orchestrator-Muster ermöglicht: Main → Orchestrator-Sub-Agent → Worker-Sub-Sub-Agenten.
How to enable
Depth levels
| Depth | Session key shape | Role | Can spawn? |
|---|---|---|---|
| 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 |
Announce chain
Ergebnisse fließen die Kette nach oben:- Depth-2-Worker beendet → meldet an seinen Parent (Depth-1-Orchestrator)
- Depth-1-Orchestrator erhält das Announce, konsolidiert Ergebnisse, beendet → meldet an Main
- Main-Agent erhält das Announce und liefert an den Benutzer
Tool policy by depth
- Depth 1 (Orchestrator, wenn
maxSpawnDepth >= 2): Erhältsessions_spawn,subagents,sessions_list,sessions_history, um Kinder zu verwalten. Andere Session-/System-Tools bleiben verweigert. - Depth 1 (Leaf, wenn
maxSpawnDepth == 1): Keine Sitzungstools (aktuelles Standardverhalten). - Depth 2 (Leaf-Worker): Keine Sitzungstools —
sessions_spawnist auf Tiefe 2 immer verweigert. Keine weiteren Kinder möglich.
Per-agent spawn limit
Jede Agentensitzung (auf jeder Tiefe) kann maximalmaxChildrenPerAgent (Standard: 5) aktive Kinder gleichzeitig haben. Dies verhindert unkontrolliertes Fan-out eines einzelnen Orchestrators.
Cascade stop
Das Stoppen eines Depth-1-Orchestrators stoppt automatisch alle seine Depth-2-Kinder:/stopim Hauptchat stoppt alle Depth-1-Agenten und kaskadiert zu deren Depth-2-Kindern./subagents kill <id>stoppt einen bestimmten Sub-Agenten und kaskadiert zu dessen Kindern./subagents kill allstoppt alle Sub-Agenten des Anfragenden und kaskadiert.
Authentication
Die Sub-Agent-Authentifizierung wird nach Agent-ID, nicht nach Sitzungstyp, aufgelöst:- Der Sub-Agent-Sitzungsschlüssel ist
agent:<agentId>:subagent:<uuid>. - Der Auth-Store wird aus dem
agentDirdieses Agenten geladen. - Die Auth-Profile des Hauptagenten werden als Fallback zusammengeführt; Agentenprofile überschreiben Hauptprofile bei Konflikten.
Announce
Sub-Agenten melden über einen Announce-Schritt zurück:- Der Announce-Schritt läuft innerhalb der Sub-Agent-Sitzung (nicht der Anfragersitzung).
- Antwortet der Sub-Agent exakt mit
ANNOUNCE_SKIP, wird nichts gepostet. - Andernfalls wird die Announce-Antwort über einen Follow-up-
agent-Aufruf (deliver=true) in den anfragenden Chat-Kanal gepostet. - Announce-Antworten bewahren Thread-/Themen-Routing, sofern verfügbar (Slack-Threads, Telegram-Themen, Matrix-Threads).
- Announce-Nachrichten werden auf ein stabiles Template normalisiert:
Status:abgeleitet aus dem Laufzeitergebnis (success,error,timeoutoderunknown).Result:die Zusammenfassung aus dem Announce-Schritt (oder(not available)falls fehlend).Notes:Fehlerdetails und andere hilfreiche Kontextinformationen.
Statuswird nicht aus der Modellausgabe abgeleitet, sondern aus Laufzeit-Signalen.
- Laufzeit (z. B.
runtime 5m12s) - Tokenverbrauch (input/output/total)
- Geschätzte Kosten, wenn Modellpreise konfiguriert sind (
models.providers.*.models[].cost) sessionKey,sessionIdund Transkriptpfad (damit der Hauptagent persessions_historydie Historie abrufen oder die Datei auf der Festplatte prüfen kann)
Tool Policy (sub-agent tools)
Standardmäßig erhalten Sub-Agenten alle Tools außer Sitzungstools und System-Tools:sessions_listsessions_historysessions_sendsessions_spawn
maxSpawnDepth >= 2, erhalten Depth-1-Orchestrator-Sub-Agenten zusätzlich sessions_spawn, subagents, sessions_list und sessions_history, um ihre Kinder zu verwalten.
Überschreiben per Konfiguration:
Concurrency
Sub-Agenten verwenden eine dedizierte In-Process-Queue-Lane:- Lane-Name:
subagent - Concurrency:
agents.defaults.subagents.maxConcurrent(Standard8)
Stopping
- Das Senden von
/stopim anfragenden Chat bricht die Anfragersitzung ab und stoppt alle aktiven daraus gestarteten Sub-Agent-Läufe, inklusive kaskadierender Kinder. /subagents kill <id>stoppt einen bestimmten Sub-Agenten und kaskadiert zu dessen Kindern.
Limitations
- Sub-Agent-Announce ist Best-Effort. Wenn das Gateway neu startet, geht ausstehende „announce back“-Arbeit verloren.
- Sub-Agenten teilen sich weiterhin die gleichen Gateway-Prozessressourcen; behandeln Sie
maxConcurrentals Sicherheitsventil. sessions_spawnist immer nicht blockierend: es gibt sofort{ status: "accepted", runId, childSessionKey }zurück.- Der Sub-Agent-Kontext injiziert nur
AGENTS.md+TOOLS.md(keinSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdoderBOOTSTRAP.md). - Maximale Verschachtelungstiefe ist 5 (
maxSpawnDepthBereich: 1–5). Tiefe 2 wird für die meisten Anwendungsfälle empfohlen. maxChildrenPerAgentbegrenzt aktive Kinder pro Sitzung (Standard: 5, Bereich: 1–20).