Sub-agenten
Sub-agents zijn achtergrond-agentruns die worden gestart vanuit een bestaande agentrun. Ze draaien in hun eigen sessie (agent:<agentId>:subagent:<uuid>) en kondigen hun resultaat na voltooiing aan terug in het chatkanaal van de aanvrager.
Slash-opdracht
Gebruik/subagents om sub-agentruns voor de huidige sessie te inspecteren of te beheren:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
/subagents info toont run-metadata (status, tijdstempels, sessie-id, transcriptpad, opschoning).
Primaire doelen:
- Paralleliseer “research / lange taak / trage tool”-werk zonder de hoofdrun te blokkeren.
- Houd sub-agents standaard geïsoleerd (sessiescheiding + optionele sandboxing).
- Houd het tooloppervlak moeilijk te misbruiken: sub-agents krijgen geen sessietools standaard.
- Ondersteun configureerbare nestingdiepte voor orchestrator-patronen.
agents.defaults.subagents.model of per-agent-overschrijvingen.
Tool
Gebruiksessions_spawn:
- Start een sub-agentrun (
deliver: false, globale lane:subagent) - Voert daarna een announce-stap uit en plaatst het announce-antwoord in het chatkanaal van de aanvrager
- Standaardmodel: erft van de aanroeper tenzij je
agents.defaults.subagents.modelinstelt (of per-agentagents.list[].subagents.model); een explicietesessions_spawn.modelheeft nog steeds voorrang. - Standaard thinking: erft van de aanroeper tenzij je
agents.defaults.subagents.thinkinginstelt (of per-agentagents.list[].subagents.thinking); een explicietesessions_spawn.thinkingheeft nog steeds voorrang.
task(verplicht)label?(optioneel)agentId?(optioneel; start onder een andere agent-id indien toegestaan)model?(optioneel; overschrijft het sub-agentmodel; ongeldige waarden worden overgeslagen en de sub-agent draait op het standaardmodel met een waarschuwing in het toolresultaat)thinking?(optioneel; overschrijft het denkniveau voor de sub-agentrun)runTimeoutSeconds?(standaard0; indien ingesteld wordt de sub-agentrun na N seconden afgebroken)cleanup?(delete|keep, standaardkeep)
agents.list[].subagents.allowAgents: lijst met agent-id’s die viaagentIdmogen worden getarget (["*"]om alles toe te staan). Standaard: alleen de aanvragende agent.
- Gebruik
agents_listom te zien welke agent-id’s momenteel zijn toegestaan voorsessions_spawn.
- Sub-agentsessies worden automatisch gearchiveerd na
agents.defaults.subagents.archiveAfterMinutes(standaard: 60). - Archiveren gebruikt
sessions.deleteen hernoemt het transcript naar*.deleted.<timestamp>(dezelfde map). cleanup: "delete"archiveert onmiddellijk na announce (het transcript blijft behouden via hernoemen).- Auto-archive is best-effort; wachtende timers gaan verloren als de gateway opnieuw wordt gestart.
runTimeoutSecondsarchiveert niet automatisch; het stopt alleen de run. De sessie blijft bestaan tot auto-archive.- Auto-archive geldt zowel voor depth-1- als depth-2-sessies.
Geneste sub-agents
Standaard kunnen sub-agents geen eigen sub-agents starten (maxSpawnDepth: 1). Je kunt één niveau nesting inschakelen door maxSpawnDepth: 2 in te stellen, wat het orchestrator-patroon mogelijk maakt: main → orchestrator-sub-agent → worker-sub-sub-agents.
Hoe inschakelen
Diepteniveaus
| Depth | Session key shape | Rol | Kan starten? |
|---|---|---|---|
| 0 | agent:<id>:main | Hoofdagent | Altijd |
| 1 | agent:<id>:subagent:<uuid> | Sub-agent (orchestrator wanneer depth 2 is toegestaan) | Alleen als maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Sub-sub-agent (leaf worker) | Nooit |
Announce-keten
Resultaten stromen terug omhoog in de keten:- Depth-2 worker voltooit → kondigt aan bij zijn ouder (depth-1 orchestrator)
- Depth-1 orchestrator ontvangt de announce, synthetiseert resultaten, voltooit → kondigt aan bij main
- De hoofdagent ontvangt de announce en levert deze aan de gebruiker
Toolbeleid per diepte
- Depth 1 (orchestrator, wanneer
maxSpawnDepth >= 2): Krijgtsessions_spawn,subagents,sessions_list,sessions_historyzodat hij zijn kinderen kan beheren. Andere sessie-/systeemtools blijven geweigerd. - Depth 1 (leaf, wanneer
maxSpawnDepth == 1): Geen sessietools (huidig standaardgedrag). - Depth 2 (leaf worker): Geen sessietools —
sessions_spawnis altijd geweigerd op depth 2. Kan geen verdere kinderen starten.
Per-agent spawn-limiet
Elke agentsessie (op elk niveau) kan maximaalmaxChildrenPerAgent (standaard: 5) actieve kinderen tegelijk hebben. Dit voorkomt runaway fan-out vanuit één orchestrator.
Cascade stop
Het stoppen van een depth-1-orchestrator stopt automatisch al zijn depth-2-kinderen:/stopin de hoofdchat stopt alle depth-1-agents en cascadeert naar hun depth-2-kinderen./subagents kill <id>stopt een specifieke sub-agent en cascadeert naar zijn kinderen./subagents kill allstopt alle sub-agents voor de aanvrager en cascadeert.
Authenticatie
Sub-agentauthenticatie wordt bepaald op agent-id, niet op sessietype:- De sub-agentsessiesleutel is
agent:<agentId>:subagent:<uuid>. - De auth-store wordt geladen vanuit de
agentDirvan die agent. - De auth-profielen van de hoofdagent worden samengevoegd als fallback; agentprofielen overschrijven hoofdprofielen bij conflicten.
Announce
Sub-agents rapporteren terug via een announce-stap:- De announce-stap draait binnen de sub-agentsessie (niet de sessie van de aanvrager).
- Als de sub-agent exact
ANNOUNCE_SKIPantwoordt, wordt er niets geplaatst. - Anders wordt het announce-antwoord geplaatst in het chatkanaal van de aanvrager via een follow-up
agent-aanroep (deliver=true). - Announce-antwoorden behouden thread-/topicroutering wanneer beschikbaar (Slack-threads, Telegram-topics, Matrix-threads).
- Announce-berichten worden genormaliseerd naar een stabiel sjabloon:
Status:afgeleid van de run-uitkomst (success,error,timeout, ofunknown).Result:de samenvattingsinhoud van de announce-stap (of(not available)indien ontbrekend).Notes:foutdetails en andere nuttige context.
Statuswordt niet afgeleid van modeloutput; het komt van runtime-uitkomstsignalen.
- Runtime (bijv.
runtime 5m12s) - Tokengebruik (input/output/totaal)
- Geschatte kosten wanneer modelprijzen zijn geconfigureerd (
models.providers.*.models[].cost) sessionKey,sessionIden transcriptpad (zodat de hoofdagent geschiedenis kan ophalen viasessions_historyof het bestand op schijf kan inspecteren)
Toolbeleid (sub-agenttools)
Standaard krijgen sub-agents alle tools behalve sessietools en systeemtools:sessions_listsessions_historysessions_sendsessions_spawn
maxSpawnDepth >= 2, krijgen depth-1-orchestrator-sub-agents aanvullend sessions_spawn, subagents, sessions_list en sessions_history zodat zij hun kinderen kunnen beheren.
Overschrijven via configuratie:
Concurrency
Sub-agents gebruiken een aparte in-process queue-lane:- Lane-naam:
subagent - Concurrency:
agents.defaults.subagents.maxConcurrent(standaard8)
Stoppen
- Het versturen van
/stopin de chat van de aanvrager breekt de aanvragersessie af en stopt alle actieve sub-agentruns die daaruit zijn gestart, inclusief geneste kinderen. /subagents kill <id>stopt een specifieke sub-agent en cascadeert naar zijn kinderen.
Beperkingen
- Sub-agent announce is best-effort. Als de gateway opnieuw wordt gestart, gaat wachtend “announce back”-werk verloren.
- Sub-agents delen nog steeds dezelfde gatewayprocesresources; behandel
maxConcurrentals veiligheidsventiel. sessions_spawnis altijd non-blocking: het retourneert onmiddellijk{ status: "accepted", runId, childSessionKey }.- Sub-agentcontext injecteert alleen
AGENTS.md+TOOLS.md(geenSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdofBOOTSTRAP.md). - Maximale nestingdiepte is 5 (
maxSpawnDepthbereik: 1–5). Depth 2 wordt aanbevolen voor de meeste use cases. maxChildrenPerAgentbegrenst actieve kinderen per sessie (standaard: 5, bereik: 1–20).