Sous-agents
Les sous-agents sont des exécutions d’agent en arrière-plan lancées à partir d’une exécution d’agent existante. Ils s’exécutent dans leur propre session (agent:<agentId>:subagent:<uuid>) et, une fois terminés, annoncent leur résultat dans le canal de chat demandeur.
Commande slash
Utilisez/subagents pour inspecter ou contrôler les exécutions de sous-agents pour la session en cours :
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>
/subagents info affiche les métadonnées d’exécution (statut, horodatages, identifiant de session, chemin de transcription, nettoyage).
Objectifs principaux :
- Paralléliser les tâches de « recherche / tâche longue / outil lent » sans bloquer l’exécution principale.
- Garder les sous-agents isolés par défaut (séparation de session + sandboxing optionnel).
- Rendre la surface d’outils difficile à mal utiliser : les sous-agents ne reçoivent pas les outils de session par défaut.
- Prendre en charge une profondeur d’imbrication configurable pour les modèles d’orchestration.
Vous pouvez configurer cela via
agents.defaults.subagents.model ou via des surcharges par agent.
Outil
Utilisezsessions_spawn :
- Démarre une exécution de sous-agent (
deliver: false, voie globale :subagent) - Exécute ensuite une étape d’annonce et publie la réponse d’annonce dans le canal de chat demandeur
- Modèle par défaut : hérite de l’appelant sauf si vous définissez
agents.defaults.subagents.model(ouagents.list[].subagents.model) ; unsessions_spawn.modelexplicite a toujours priorité. - Réflexion par défaut : hérite de l’appelant sauf si vous définissez
agents.defaults.subagents.thinking(ouagents.list[].subagents.thinking) ; unsessions_spawn.thinkingexplicite a toujours priorité.
task(obligatoire)label?(optionnel)agentId?(optionnel ; lancer sous un autre identifiant d’agent si autorisé)model?(optionnel ; remplace le modèle du sous-agent ; les valeurs invalides sont ignorées et le sous-agent s’exécute avec le modèle par défaut avec un avertissement dans le résultat de l’outil)thinking?(optionnel ; remplace le niveau de réflexion pour l’exécution du sous-agent)runTimeoutSeconds?(par défaut0; si défini, l’exécution du sous-agent est interrompue après N secondes)cleanup?(delete|keep, par défautkeep)
agents.list[].subagents.allowAgents: liste des identifiants d’agents pouvant être ciblés viaagentId(["*"]pour autoriser tous). Par défaut : uniquement l’agent demandeur.
- Utilisez
agents_listpour voir quels identifiants d’agents sont actuellement autorisés poursessions_spawn.
- Les sessions des sous-agents sont automatiquement archivées après
agents.defaults.subagents.archiveAfterMinutes(par défaut : 60). - L’archivage utilise
sessions.deleteet renomme la transcription en*.deleted.<timestamp>(dans le même dossier). cleanup: "delete"archive immédiatement après l’annonce (la transcription est conservée via renommage).- L’archivage automatique est exécuté au mieux ; les minuteurs en attente sont perdus si la passerelle redémarre.
runTimeoutSecondsn’archive pas automatiquement ; il arrête seulement l’exécution. La session reste jusqu’à l’archivage automatique.- L’archivage automatique s’applique aussi bien aux sessions de profondeur 1 que de profondeur 2.
Sous-agents imbriqués
Par défaut, les sous-agents ne peuvent pas lancer leurs propres sous-agents (maxSpawnDepth: 1). Vous pouvez activer un niveau d’imbrication en définissant maxSpawnDepth: 2, ce qui permet le modèle d’orchestration : principal → sous-agent orchestrateur → sous-sous-agents travailleurs.
Comment activer
Niveaux de profondeur
| Depth | Session key shape | Role | Can spawn? |
|---|---|---|---|
| 0 | agent:<id>:main | Agent principal | Toujours |
| 1 | agent:<id>:subagent:<uuid> | Sous-agent (orchestrateur si profondeur 2 autorisée) | Seulement si maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Sous-sous-agent (travailleur feuille) | Jamais |
Chaîne d’annonce
Les résultats remontent la chaîne :- Le travailleur de profondeur 2 termine → annonce à son parent (orchestrateur de profondeur 1)
- L’orchestrateur de profondeur 1 reçoit l’annonce, synthétise les résultats, termine → annonce au principal
- L’agent principal reçoit l’annonce et la transmet à l’utilisateur
Politique d’outils par profondeur
- Profondeur 1 (orchestrateur, lorsque
maxSpawnDepth >= 2) : reçoitsessions_spawn,subagents,sessions_list,sessions_historyafin de gérer ses enfants. Les autres outils de session/système restent refusés. - Profondeur 1 (feuille, lorsque
maxSpawnDepth == 1) : aucun outil de session (comportement par défaut actuel). - Profondeur 2 (travailleur feuille) : aucun outil de session —
sessions_spawnest toujours refusé à la profondeur 2. Impossible de lancer d’autres enfants.
Limite de création par agent
Chaque session d’agent (à n’importe quelle profondeur) peut avoir au maximummaxChildrenPerAgent (par défaut : 5) enfants actifs simultanément. Cela évite une explosion incontrôlée depuis un seul orchestrateur.
Arrêt en cascade
L’arrêt d’un orchestrateur de profondeur 1 arrête automatiquement tous ses enfants de profondeur 2 :/stopdans le chat principal arrête tous les agents de profondeur 1 et se propage à leurs enfants de profondeur 2./subagents kill <id>arrête un sous-agent spécifique et se propage à ses enfants./subagents kill allarrête tous les sous-agents du demandeur et se propage.
Authentification
L’authentification des sous-agents est résolue par identifiant d’agent, et non par type de session :- La clé de session du sous-agent est
agent:<agentId>:subagent:<uuid>. - Le magasin d’authentification est chargé depuis le
agentDirde cet agent. - Les profils d’authentification de l’agent principal sont fusionnés en tant que repli ; les profils de l’agent remplacent ceux du principal en cas de conflit.
Annonce
Les sous-agents rapportent via une étape d’annonce :- L’étape d’annonce s’exécute dans la session du sous-agent (pas dans la session du demandeur).
- Si le sous-agent répond exactement
ANNOUNCE_SKIP, rien n’est publié. - Sinon, la réponse d’annonce est publiée dans le canal de chat demandeur via un appel
agentde suivi (deliver=true). - Les réponses d’annonce conservent l’acheminement par fil/sujet lorsque disponible (fils Slack, sujets Telegram, fils Matrix).
- Les messages d’annonce sont normalisés selon un modèle stable :
Status:dérivé du résultat d’exécution (success,error,timeoutouunknown).Result:le contenu résumé de l’étape d’annonce (ou(not available)si absent).Notes:détails d’erreur et autres informations utiles.
Statusn’est pas déduit de la sortie du modèle ; il provient des signaux d’exécution.
- Durée d’exécution (ex.
runtime 5m12s) - Consommation de tokens (entrée/sortie/total)
- Coût estimé lorsque la tarification du modèle est configurée (
models.providers.*.models[].cost) sessionKey,sessionIdet chemin de transcription (afin que l’agent principal puisse récupérer l’historique viasessions_historyou inspecter le fichier sur disque)
Politique d’outils (outils des sous-agents)
Par défaut, les sous-agents reçoivent tous les outils sauf les outils de session et les outils système :sessions_listsessions_historysessions_sendsessions_spawn
maxSpawnDepth >= 2, les sous-agents orchestrateurs de profondeur 1 reçoivent en plus sessions_spawn, subagents, sessions_list et sessions_history afin de gérer leurs enfants.
Remplacement via configuration :
Concurrence
Les sous-agents utilisent une voie de file d’attente dédiée en mémoire :- Nom de la voie :
subagent - Concurrence :
agents.defaults.subagents.maxConcurrent(par défaut8)
Arrêt
- Envoyer
/stopdans le chat demandeur interrompt la session demandeur et arrête toute exécution active de sous-agent lancée depuis celle-ci, avec propagation aux enfants imbriqués. /subagents kill <id>arrête un sous-agent spécifique et se propage à ses enfants.
Limitations
- L’annonce des sous-agents est au mieux. Si la passerelle redémarre, les annonces en attente sont perdues.
- Les sous-agents partagent toujours les ressources du même processus de passerelle ; considérez
maxConcurrentcomme une soupape de sécurité. sessions_spawnest toujours non bloquant : il retourne immédiatement{ status: "accepted", runId, childSessionKey }.- Le contexte du sous-agent injecte uniquement
AGENTS.md+TOOLS.md(pas deSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdouBOOTSTRAP.md). - La profondeur maximale d’imbrication est 5 (
maxSpawnDepthplage : 1–5). La profondeur 2 est recommandée pour la plupart des cas d’usage. maxChildrenPerAgentlimite le nombre d’enfants actifs par session (par défaut : 5, plage : 1–20).