Agent coordination
Sous-agents
Les sous-agents sont des exĂ©cutions dâagent en arriĂšre-plan lancĂ©es depuis 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 discussion
du demandeur. Chaque exécution de sous-agent est suivie comme une
tĂąche en arriĂšre-plan.
Objectifs principaux :
- ParallĂ©liser les travaux de « recherche / tĂąche longue / outil lent » sans bloquer lâexĂ©cution principale.
- Garder les sous-agents isolés par défaut (séparation des sessions + sandboxing facultatif).
- Rendre la surface dâoutils difficile Ă utiliser de façon incorrecte : 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âorchestrateur.
Commande slash
Utilisez /subagents pour inspecter les exécutions de sous-agents de la session actuelle :
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info affiche les mĂ©tadonnĂ©es dâexĂ©cution (statut, horodatages, identifiant de session,
chemin de transcription, nettoyage). Utilisez sessions_history pour une vue de rappel bornée
et filtrée pour la sécurité ; inspectez le chemin de transcription sur le disque lorsque vous
avez besoin de la transcription brute complĂšte.
ContrĂŽles de liaison aux fils
Ces commandes fonctionnent sur les canaux qui prennent en charge les liaisons de fil persistantes. Voir Canaux prenant en charge les fils ci-dessous.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>Comportement de lancement
Les agents démarrent des sous-agents en arriÚre-plan avec sessions_spawn. Les achÚvements de sous-agents
reviennent sous forme dâĂ©vĂ©nements internes de session parente ; lâagent parent/demandeur dĂ©cide
si une mise Ă jour visible par lâutilisateur est nĂ©cessaire.
Non-blocking, push-based completion
sessions_spawnest non bloquant ; il renvoie immĂ©diatement un identifiant dâexĂ©cution.- Ă lâachĂšvement, le sous-agent renvoie un rapport Ă la session parente/demandeuse.
- Les tours dâagent qui ont besoin des rĂ©sultats dâenfants doivent appeler
sessions_yieldaprĂšs avoir lancĂ© le travail requis. Cela termine le tour actuel et permet aux Ă©vĂ©nements dâachĂšvement dâarriver comme le prochain message visible par le modĂšle. - LâachĂšvement fonctionne par envoi automatique. Une fois lancĂ©, ne sondez pas
/subagents list,sessions_listousessions_historyen boucle uniquement pour attendre sa fin ; inspectez le statut seulement Ă la demande pour la visibilitĂ© de dĂ©bogage. - La sortie de lâenfant est un rapport/Ă©lĂ©ment de preuve que lâagent demandeur doit synthĂ©tiser. Il ne sâagit pas dâun texte dâinstruction rĂ©digĂ© par lâutilisateur et elle ne peut pas remplacer les rĂšgles systĂšme, dĂ©veloppeur ou utilisateur.
- Ă lâachĂšvement, OpenClaw ferme au mieux les onglets/processus de navigateur suivis ouverts par cette session de sous-agent avant que le flux de nettoyage de lâannonce ne continue.
Completion delivery
- OpenClaw remet les achĂšvements Ă la session demandeuse via un tour
agentavec une clĂ© dâidempotence stable. - Si lâexĂ©cution demandeuse est encore active, OpenClaw essaie dâabord de rĂ©veiller/orienter cette exĂ©cution au lieu de dĂ©marrer un second chemin de rĂ©ponse visible.
- Si un demandeur actif ne peut pas ĂȘtre rĂ©veillĂ©, OpenClaw bascule vers un transfert Ă lâagent demandeur avec le mĂȘme contexte dâachĂšvement au lieu dâabandonner lâannonce.
- Un transfert parent rĂ©ussi termine la livraison du sous-agent mĂȘme lorsque le parent dĂ©cide quâaucune mise Ă jour utilisateur visible nâest nĂ©cessaire.
- Les sous-agents natifs ne reçoivent pas lâoutil de message. Ils renvoient du texte dâassistant brut Ă lâagent parent/demandeur ; les rĂ©ponses visibles par les humains relĂšvent de la politique de livraison normale de lâagent parent/demandeur.
- Si le transfert direct ne peut pas ĂȘtre utilisĂ©, le systĂšme revient au routage par file dâattente.
- Si le routage par file dâattente nâest toujours pas disponible, lâannonce est retentĂ©e avec un court backoff exponentiel avant lâabandon final.
- La livraison dâachĂšvement conserve la route demandeuse rĂ©solue : les routes dâachĂšvement liĂ©es Ă un fil ou Ă une conversation lâemportent lorsquâelles sont disponibles ; si lâorigine de lâachĂšvement ne fournit quâun canal, OpenClaw complĂšte la cible/le compte manquant Ă partir de la route rĂ©solue de la session demandeuse (
lastChannel/lastTo/lastAccountId) afin que la livraison directe fonctionne toujours.
Completion handoff metadata
Le transfert dâachĂšvement vers la session demandeuse est un contexte interne gĂ©nĂ©rĂ© par le runtime (et non du texte rĂ©digĂ© par lâutilisateur) et comprend :
Resultâ le dernier texte de rĂ©ponseassistantvisible de lâenfant. La sortie Tool/toolResult nâest pas promue dans les rĂ©sultats de lâenfant. Les exĂ©cutions terminales Ă©chouĂ©es ne rĂ©utilisent pas le texte de rĂ©ponse capturĂ©.Statusâcompleted; ready for parent review/failed/timed out/unknown.- Des statistiques compactes de runtime/jetons.
- Une instruction de revue demandant Ă lâagent demandeur de vĂ©rifier le rĂ©sultat avant de dĂ©cider si la tĂąche dâorigine est terminĂ©e.
- Des consignes de suivi demandant Ă lâagent demandeur de poursuivre la tĂąche ou dâenregistrer un suivi lorsque le rĂ©sultat de lâenfant laisse dâautres actions Ă effectuer.
- Une instruction de mise Ă jour finale pour le chemin sans autre action, rĂ©digĂ©e dans une voix dâassistant normale sans transfĂ©rer les mĂ©tadonnĂ©es internes brutes.
Modes et environnement dâexĂ©cution ACP
--modelet--thinkingremplacent les valeurs par défaut pour cette exécution spécifique.- Utilisez
info/logpour inspecter les détails et la sortie aprÚs la fin. - Pour les sessions persistantes liées à un fil, utilisez
sessions_spawnavecthread: trueetmode: "session". - Si le canal demandeur ne prend pas en charge les liaisons de fil, utilisez plutĂŽt
mode: "run"au lieu de réessayer des combinaisons liées à un fil impossibles. - Pour les sessions de harnais ACP (Claude Code, Gemini CLI, OpenCode ou Codex ACP/acpx explicite), utilisez
sessions_spawnavecruntime: "acp"lorsque lâoutil annonce cet environnement dâexĂ©cution. Consultez le modĂšle de livraison ACP lors du dĂ©bogage des complĂ©tions ou des boucles dâagent Ă agent. Lorsque le Plugincodexest activĂ©, le contrĂŽle de chat/fil Codex doit privilĂ©gier/codex ...plutĂŽt quâACP, sauf si lâutilisateur demande explicitement ACP/acpx. - OpenClaw masque
runtime: "acp"jusquâĂ ce quâACP soit activĂ©, que le demandeur ne soit pas en bac Ă sable et quâun Plugin backend tel queacpxsoit chargĂ©.runtime: "acp"attend un identifiant de harnais ACP externe, ou une entrĂ©eagents.list[]avecruntime.type="acp"; utilisez lâenvironnement dâexĂ©cution de sous-agent par dĂ©faut pour les agents de configuration OpenClaw normaux depuisagents_list.
Modes de contexte
Les sous-agents natifs dĂ©marrent isolĂ©s, sauf si lâappelant demande explicitement de bifurquer la transcription actuelle.
| Mode | Quand lâutiliser | Comportement |
|---|---|---|
isolated |
Recherche fraĂźche, implĂ©mentation indĂ©pendante, travail dâoutil lent, ou tout ce qui peut ĂȘtre dĂ©crit briĂšvement dans le texte de la tĂąche | CrĂ©e une transcription enfant propre. Câest la valeur par dĂ©faut et elle rĂ©duit lâutilisation des jetons. |
fork |
Travail qui dĂ©pend de la conversation actuelle, de rĂ©sultats dâoutils prĂ©cĂ©dents ou dâinstructions nuancĂ©es dĂ©jĂ prĂ©sentes dans la transcription du demandeur | Branche la transcription du demandeur dans la session enfant avant le dĂ©marrage de lâenfant. |
Utilisez fork avec parcimonie. Il sert Ă la dĂ©lĂ©gation sensible au contexte, pas Ă
remplacer la rĂ©daction dâune invite de tĂąche claire.
Outil : sessions_spawn
Démarre une exécution de sous-agent avec deliver: false sur la voie globale subagent,
puis exĂ©cute une Ă©tape dâannonce et publie la rĂ©ponse dâannonce dans le canal de chat
du demandeur.
La disponibilitĂ© dĂ©pend de la politique dâoutils effective de lâappelant. Les profils coding et
full exposent sessions_spawn par défaut. Le profil messaging
ne le fait pas ; ajoutez tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] ou utilisez tools.profile: "coding" pour les agents qui doivent déléguer
du travail. Les politiques dâautorisation/refus par canal/groupe, fournisseur, bac Ă sable et par agent peuvent
toujours retirer lâoutil aprĂšs lâĂ©tape du profil. Utilisez /tools depuis la mĂȘme
session pour confirmer la liste effective des outils.
Valeurs par défaut :
- ModĂšle : les sous-agents natifs hĂ©ritent de lâappelant sauf si vous dĂ©finissez
agents.defaults.subagents.model(ouagents.list[].subagents.modelpar agent). Les lancements dâenvironnement dâexĂ©cution ACP utilisent le mĂȘme modĂšle de sous-agent configurĂ© lorsquâil est prĂ©sent ; sinon, le harnais ACP conserve sa propre valeur par dĂ©faut. Unsessions_spawn.modelexplicite reste prioritaire. - Thinking : les sous-agents natifs hĂ©ritent de lâappelant sauf si vous dĂ©finissez
agents.defaults.subagents.thinking(ouagents.list[].subagents.thinkingpar agent). Les lancements dâenvironnement dâexĂ©cution ACP appliquent aussiagents.defaults.models["provider/model"].params.thinkingpour le modĂšle sĂ©lectionnĂ©. Unsessions_spawn.thinkingexplicite reste prioritaire. - DĂ©lai dâexĂ©cution : OpenClaw utilise
agents.defaults.subagents.runTimeoutSecondslorsquâil est dĂ©fini ; sinon, il revient Ă0(aucun dĂ©lai).sessions_spawnnâaccepte pas de remplacements de dĂ©lai par appel. - Livraison de la tĂąche : les sous-agents natifs reçoivent la tĂąche dĂ©lĂ©guĂ©e dans leur premier message
[Subagent Task]visible. Lâinvite systĂšme du sous-agent transporte les rĂšgles dâenvironnement dâexĂ©cution et le contexte de routage, pas un doublon masquĂ© de la tĂąche.
Les lancements de sous-agents natifs acceptés incluent les métadonnées du modÚle enfant résolu dans
le rĂ©sultat de lâoutil : resolvedModel contient la rĂ©fĂ©rence de modĂšle appliquĂ©e et
resolvedProvider contient le préfixe du fournisseur lorsque la référence en possÚde un.
Mode dâinvite de dĂ©lĂ©gation
agents.defaults.subagents.delegationMode contrĂŽle uniquement le guidage de lâinvite ; il ne modifie pas la politique dâoutils et nâimpose pas la dĂ©lĂ©gation.
suggest(par dĂ©faut) : conserve lâincitation standard de lâinvite Ă utiliser des sous-agents pour les travaux plus importants ou plus lents.prefer: indique Ă lâagent principal de rester rĂ©actif et de dĂ©lĂ©guer viasessions_spawntout ce qui est plus impliquĂ© quâune rĂ©ponse directe.
Les remplacements par agent utilisent agents.list[].subagents.delegationMode.
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}ParamĂštres de lâoutil
taskstringrequiredLa description de la tĂąche pour le sous-agent.
taskNamestringIdentifiant stable facultatif pour identifier un enfant prĂ©cis dans une sortie dâĂ©tat ultĂ©rieure. Doit correspondre Ă [a-z][a-z0-9_-]{0,63} et ne peut pas ĂȘtre une cible rĂ©servĂ©e comme last ou all.
labelstringLibellé facultatif lisible par un humain.
agentIdstringLance sous un autre identifiant dâagent configurĂ© lorsque subagents.allowAgents lâautorise.
cwdstringRĂ©pertoire de travail facultatif de la tĂąche pour lâexĂ©cution enfant. Les sous-agents natifs chargent toujours les fichiers de dĂ©marrage depuis lâespace de travail de lâagent cible ; cwd modifie uniquement lâemplacement oĂč les outils dâexĂ©cution et les harnais CLI effectuent le travail dĂ©lĂ©guĂ©.
runtime"subagent" | "acp"default: subagentacp est réservé aux harnais ACP externes (claude, droid, gemini, opencode, ou Codex ACP/acpx explicitement demandé) et aux entrées agents.list[] dont runtime.type est acp.
resumeSessionIdstringACP uniquement. Reprend une session existante de harnais ACP lorsque runtime: "acp" ; ignoré pour les lancements de sous-agents natifs.
streamTo"parent"ACP uniquement. Diffuse la sortie de lâexĂ©cution ACP vers la session parente lorsque runtime: "acp" ; Ă omettre pour les lancements de sous-agents natifs.
modelstringRemplace le modĂšle du sous-agent. Les valeurs non valides sont ignorĂ©es et le sous-agent sâexĂ©cute sur le modĂšle par dĂ©faut, avec un avertissement dans le rĂ©sultat de lâoutil.
thinkingstringRemplace le niveau de rĂ©flexion pour lâexĂ©cution du sous-agent.
threadbooleandefault: falseLorsque true, demande une liaison au thread du canal pour cette session de sous-agent.
mode"run" | "session"default: runSi thread: true et que mode est omis, la valeur par défaut devient session. mode: "session" nécessite thread: true.
Si la liaison de thread nâest pas disponible pour le canal demandeur, utilisez plutĂŽt mode: "run".
cleanup"delete" | "keep"default: keep"delete" archive immĂ©diatement aprĂšs lâannonce (conserve tout de mĂȘme la transcription via un renommage).
sandbox"inherit" | "require"default: inheritrequire rejette le lancement sauf si lâexĂ©cution enfant cible est sandboxĂ©e.
context"isolated" | "fork"default: isolatedfork branche la transcription actuelle du demandeur dans la session enfant. Sous-agents natifs uniquement. Les lancements liés à un thread utilisent fork par défaut ; les lancements non liés à un thread utilisent isolated par défaut.
Noms de tĂąches et ciblage
taskName est un identifiant exposĂ© au modĂšle pour lâorchestration, pas une clĂ© de session.
Utilisez-le pour des noms dâenfants stables comme review_subagents,
linux_validation ou docs_update lorsquâun coordinateur peut avoir besoin dâinspecter
cet enfant plus tard.
La résolution de cible accepte les correspondances exactes de taskName et les
prĂ©fixes non ambigus. La correspondance est limitĂ©e Ă la mĂȘme fenĂȘtre de cibles
actives/rĂ©centes que celle utilisĂ©e par les cibles numĂ©rotĂ©es /subagents, afin quâun
enfant terminé obsolÚte ne rende pas ambigu un identifiant réutilisé. Si deux enfants
actifs ou rĂ©cents partagent le mĂȘme taskName, la cible est ambiguĂ« ; utilisez plutĂŽt
lâindex de liste, la clĂ© de session ou lâidentifiant dâexĂ©cution.
Les cibles réservées last et all ne sont pas des valeurs taskName valides
car elles ont déjà des significations de contrÎle.
Outil : sessions_yield
Termine le tour de modĂšle actuel et attend que des Ă©vĂ©nements dâexĂ©cution, principalement des Ă©vĂ©nements de fin de sous-agent, arrivent comme message suivant. Utilisez-le aprĂšs avoir lancĂ© le travail enfant requis lorsque le demandeur ne peut pas produire de rĂ©ponse finale tant que ces fins dâexĂ©cution ne sont pas arrivĂ©es.
sessions_yield est la primitive dâattente. Ne la remplacez pas par des boucles
dâinterrogation sur subagents, sessions_list, sessions_history, un sleep
shell ou une interrogation de processus uniquement pour dĂ©tecter la fin dâun enfant.
Utilisez sessions_yield uniquement lorsque la liste effective des outils de la session
lâinclut. Certains profils dâoutils minimaux ou personnalisĂ©s peuvent exposer
sessions_spawn et subagents sans exposer sessions_yield ; dans ce cas, nâinventez
pas une boucle dâinterrogation uniquement pour attendre la fin.
Lorsque des enfants actifs existent, OpenClaw injecte un bloc dâinvite compact gĂ©nĂ©rĂ©
par lâexĂ©cution, Active Subagents, dans les tours normaux afin que le demandeur puisse
voir les sessions enfant actuelles, les identifiants dâexĂ©cution, les statuts, les
libellés, les tùches et les alias taskName sans interrogation. Les champs de tùche et
de libellé de ce bloc sont cités comme des données, pas comme des instructions, car ils
peuvent provenir dâarguments de lancement fournis par lâutilisateur ou le modĂšle.
Outil : subagents
Liste les exécutions de sous-agents lancées et possédées par la session demandeuse. Sa portée est limitée au demandeur actuel ; un enfant ne peut voir que ses propres enfants contrÎlés.
Utilisez subagents pour lâĂ©tat Ă la demande et le dĂ©bogage. Utilisez sessions_yield
pour attendre les événements de fin.
Sessions liées à un thread
Lorsque les liaisons de thread sont activĂ©es pour un canal, un sous-agent peut rester liĂ© Ă un thread afin que les messages utilisateur de suivi dans ce thread continuent dâĂȘtre acheminĂ©s vers la mĂȘme session de sous-agent.
Canaux prenant en charge les threads
Tout canal dotĂ© dâun adaptateur de liaison de session peut prendre en charge des
sessions de sous-agents persistantes liées à un thread (sessions_spawn avec
thread: true). Les adaptateurs intégrés incluent actuellement les threads Discord, les
threads Matrix, les sujets de forum Telegram et les liaisons de conversation actuelle
pour Feishu. Utilisez les clés de configuration threadBindings propres à chaque canal
pour lâactivation, les dĂ©lais dâexpiration et spawnSessions.
Flux rapide
Spawn
sessions_spawn avec thread: true (et éventuellement mode: "session").
Bind
OpenClaw crée ou lie un thread à cette cible de session dans le canal actif.
Route follow-ups
Les réponses et messages de suivi dans ce thread sont acheminés vers la session liée.
Inspect timeouts
Utilisez /session idle pour inspecter/mettre à jour le désépinglage automatique aprÚs inactivité et
/session max-age pour contrĂŽler la limite stricte.
Detach
Utilisez /unfocus pour détacher manuellement.
ContrĂŽles manuels
| Command | Effet |
|---|---|
/focus <target> |
Lie le thread actuel (ou en crée un) à une cible de sous-agent/session |
/unfocus |
Supprime la liaison pour le thread actuellement lié |
/agents |
Liste les exĂ©cutions actives et lâĂ©tat de liaison (thread:<id> ou unbound) |
/session idle |
Inspecte/met à jour le désépinglage automatique aprÚs inactivité (threads liés focalisés uniquement) |
/session max-age |
Inspecte/met à jour la limite stricte (threads liés focalisés uniquement) |
Commutateurs de configuration
- Valeur globale par défaut :
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours. - Les clés de remplacement de canal et de liaison automatique au lancement sont propres à chaque adaptateur. Voir Canaux prenant en charge les threads ci-dessus.
Voir la référence de configuration et les commandes slash pour les détails actuels des adaptateurs.
Liste dâautorisation
agents.list[].subagents.allowAgentsstring[]Liste des identifiants dâagents configurĂ©s pouvant ĂȘtre ciblĂ©s via agentId explicite (["*"] autorise toute cible configurĂ©e). Par dĂ©faut : seulement lâagent demandeur. Si vous dĂ©finissez une liste et souhaitez toujours que le demandeur puisse se lancer lui-mĂȘme avec agentId, incluez lâidentifiant du demandeur dans la liste.
agents.defaults.subagents.allowAgentsstring[]Liste dâautorisation par dĂ©faut des agents cibles configurĂ©s utilisĂ©e lorsque lâagent demandeur ne dĂ©finit pas son propre subagents.allowAgents.
agents.defaults.subagents.requireAgentIdbooleandefault: falseBloque les appels sessions_spawn qui omettent agentId (force la sĂ©lection explicite dâun profil). Remplacement par agent : agents.list[].subagents.requireAgentId.
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000DĂ©lai dâexpiration par appel pour les tentatives de livraison dâannonce agent du Gateway. Les valeurs sont des millisecondes entiĂšres positives et sont plafonnĂ©es au maximum de minuterie sĂ»r de la plateforme. Les nouvelles tentatives transitoires peuvent rendre lâattente totale de lâannonce plus longue quâun dĂ©lai configurĂ©.
Si la session demandeuse est sandboxée, sessions_spawn rejette les cibles
qui sâexĂ©cuteraient sans sandbox.
Découverte
Utilisez agents_list pour voir quels identifiants dâagents sont actuellement autorisĂ©s pour
sessions_spawn. La réponse inclut le modÚle effectif de chaque agent listé et les métadonnées
dâexĂ©cution intĂ©grĂ©es, afin que les appelants puissent distinguer OpenClaw, le serveur
dâapplication Codex et les autres exĂ©cutions natives configurĂ©es.
Les entrĂ©es allowAgents doivent pointer vers des identifiants dâagents configurĂ©s dans agents.list[].
["*"] signifie tout agent cible configurĂ© plus le demandeur. Si une configuration dâagent
est supprimée mais que son identifiant reste dans allowAgents, sessions_spawn rejette cet identifiant
et agents_list lâomet. ExĂ©cutez openclaw doctor --fix pour nettoyer les entrĂ©es obsolĂštes
de la liste dâautorisation, ou ajoutez une entrĂ©e minimale agents.list[] lorsque la cible doit
rester lançable tout en héritant des valeurs par défaut.
Archivage automatique
- Les sessions de sous-agents sont automatiquement archivées aprÚs
agents.defaults.subagents.archiveAfterMinutes(par dĂ©faut60). - Lâarchivage utilise
sessions.deleteet renomme la transcription en*.deleted.<timestamp>(mĂȘme dossier). cleanup: "delete"archive immĂ©diatement aprĂšs lâannonce (conserve tout de mĂȘme la transcription via un renommage).- Lâarchivage automatique est fait au mieux ; les minuteries en attente sont perdues si le Gateway redĂ©marre.
- Les dĂ©lais dâexĂ©cution configurĂ©s nâarchivent pas automatiquement ; ils arrĂȘtent seulement lâexĂ©cution. La session reste jusquâĂ lâarchivage automatique.
- Lâarchivage automatique sâapplique Ă©galement aux sessions de profondeur 1 et de profondeur 2.
- Le nettoyage du navigateur est distinct du nettoyage de lâarchivage : les onglets/processus de navigateur suivis sont fermĂ©s au mieux lorsque lâexĂ©cution se termine, mĂȘme si la transcription ou lâenregistrement de session est conservĂ©.
Sous-agents imbriqués
Par défaut, les sous-agents ne peuvent pas lancer leurs propres sous-agents
(maxSpawnDepth: 1). Définissez maxSpawnDepth: 2 pour activer un niveau
dâimbrication â le modĂšle orchestrateur : agent principal â sous-agent orchestrateur â
sous-sous-agents travailleurs.
{ agents: { defaults: { subagents: { maxSpawnDepth: 2, // allow sub-agents to spawn children (default: 1) maxChildrenPerAgent: 5, // max active children per agent session (default: 5) maxConcurrent: 8, // global concurrency lane cap (default: 8) runTimeoutSeconds: 900, // default timeout for sessions_spawn (0 = no timeout) announceTimeoutMs: 120000, // per-call gateway announce timeout }, }, },}Niveaux de profondeur
| Profondeur | Forme de la clé de session | RÎle | Peut lancer ? |
|---|---|---|---|
| 0 | agent:<id>:main |
Agent principal | Toujours |
| 1 | agent:<id>:subagent:<uuid> |
Sous-agent (orchestrateur lorsque la profondeur 2 est 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 worker 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.
Chaque niveau ne voit que les annonces de ses enfants directs.
Politique dâoutils par profondeur
- Le rĂŽle et le pĂ©rimĂštre de contrĂŽle sont Ă©crits dans les mĂ©tadonnĂ©es de session au moment du spawn. Cela empĂȘche des clĂ©s de session plates ou restaurĂ©es de rĂ©cupĂ©rer accidentellement des privilĂšges dâorchestrateur.
- Profondeur 1 (orchestrateur, quand
maxSpawnDepth >= 2) : reçoitsessions_spawn,subagents,sessions_list,sessions_historyafin de pouvoir lancer des enfants et inspecter leur statut. Les autres outils de session/systÚme restent refusés. - Profondeur 1 (feuille, quand
maxSpawnDepth == 1) : aucun outil de session (comportement par dĂ©faut actuel). - Profondeur 2 (worker feuille) : aucun outil de session â
sessions_spawnest toujours refusĂ© Ă la profondeur 2. Ne peut pas lancer dâautres enfants.
Limite de spawn par agent
Chaque session dâagent (Ă nâimporte quelle profondeur) peut avoir au maximum maxChildrenPerAgent
(5 par défaut) enfants actifs à la fois. Cela évite un déploiement en éventail incontrÎlé
depuis un seul orchestrateur.
ArrĂȘt en cascade
ArrĂȘter 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.
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 store dâauthentification est chargĂ© depuis le
agentDirde cet agent. - Les profils dâauthentification de lâagent principal sont fusionnĂ©s comme solution de repli ; les profils de lâagent remplacent les profils principaux en cas de conflit.
La fusion est additive, donc les profils principaux sont toujours disponibles comme solutions de repli. Lâauthentification entiĂšrement isolĂ©e par agent nâest pas encore prise en charge.
Annonce
Les sous-agents rendent compte 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Ă©. - Si le dernier texte de lâassistant est le jeton silencieux exact
NO_REPLY/no_reply, la sortie dâannonce est supprimĂ©e mĂȘme si des progrĂšs visibles existaient plus tĂŽt.
La livraison dépend de la profondeur du demandeur :
- Les sessions de demandeur de niveau supérieur utilisent un appel
agentde suivi avec livraison externe (deliver=true). - Les sessions de sous-agent demandeur imbriquées reçoivent une injection de suivi interne (
deliver=false) afin que lâorchestrateur puisse synthĂ©tiser les rĂ©sultats des enfants dans la session. - Si une session de sous-agent demandeur imbriquĂ©e a disparu, OpenClaw se replie sur le demandeur de cette session lorsquâil est disponible.
Pour les sessions de demandeur de niveau supĂ©rieur, la livraison directe en mode achĂšvement rĂ©sout dâabord toute route de conversation/fil liĂ©e et tout remplacement de hook, puis remplit les champs channel-target manquants depuis la route stockĂ©e de la session du demandeur. Cela garde les achĂšvements sur le bon chat/sujet mĂȘme lorsque lâorigine de lâachĂšvement identifie seulement le canal.
LâagrĂ©gation des fins dâenfants est limitĂ©e au run demandeur actuel lors de la construction des rĂ©sultats dâachĂšvement imbriquĂ©s, ce qui empĂȘche les sorties dâenfants de runs prĂ©cĂ©dents obsolĂštes de fuir dans lâannonce actuelle. Les rĂ©ponses dâannonce prĂ©servent le routage de fil/sujet lorsquâil est disponible sur les adaptateurs de canal.
Contexte dâannonce
Le contexte dâannonce est normalisĂ© en un bloc dâĂ©vĂ©nement interne stable :
| Champ | Source |
|---|---|
| Source | subagent ou cron |
| Identifiants de session | Clé/id de session enfant |
| Type | Type dâannonce + libellĂ© de tĂąche |
| Statut | DĂ©rivĂ© du rĂ©sultat dâexĂ©cution (success, error, timeout ou unknown) â non dĂ©duit du texte du modĂšle |
| Contenu du rĂ©sultat | Dernier texte dâassistant visible de lâenfant |
| Suivi | Instruction décrivant quand répondre ou rester silencieux |
Les runs terminaux en Ă©chec signalent un statut dâĂ©chec sans rejouer le texte de rĂ©ponse capturĂ©. La sortie tool/toolResult nâest pas promue en texte de rĂ©sultat enfant.
Ligne de statistiques
Les charges utiles dâannonce incluent une ligne de statistiques Ă la fin (mĂȘme lorsquâelles sont enveloppĂ©es) :
- DurĂ©e dâexĂ©cution (par exemple
runtime 5m12s). - Utilisation des 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 transcript afin que lâagent principal puisse rĂ©cupĂ©rer lâhistorique viasessions_historyou inspecter le fichier sur disque.
Les mĂ©tadonnĂ©es internes sont destinĂ©es uniquement Ă lâorchestration ; les rĂ©ponses destinĂ©es aux utilisateurs doivent ĂȘtre réécrites avec une voix normale dâassistant.
Pourquoi préférer sessions_history
sessions_history est le chemin dâorchestration le plus sĂ»r :
- Le rappel de lâassistant est dâabord normalisĂ© : balises de rĂ©flexion supprimĂ©es ; Ă©chafaudage
<relevant-memories>/<relevant_memories>supprimĂ© ; blocs de payload XML dâappels dâoutils en texte brut (<tool_call>,<function_call>,<tool_calls>,<function_calls>) supprimĂ©s, y compris les payloads tronquĂ©s qui ne se ferment jamais proprement ; Ă©chafaudage dâappel/rĂ©sultat dâoutil dĂ©gradĂ© et marqueurs de contexte historique supprimĂ©s ; tokens de contrĂŽle de modĂšle divulguĂ©s (<|assistant|>, autres ASCII<|...|>, pleine chasse<ïœ...ïœ>) supprimĂ©s ; XML dâappel dâoutil MiniMax malformĂ© supprimĂ©. - Le texte ressemblant Ă des identifiants/tokens est expurgĂ©.
- Les longs blocs peuvent ĂȘtre tronquĂ©s.
- Les trÚs grands historiques peuvent supprimer les lignes plus anciennes ou remplacer une ligne surdimensionnée par
[sessions_history omitted: message too large]. - Utilisez
nextOffsetlorsquâil est prĂ©sent pour paginer vers lâarriĂšre dans les anciennes fenĂȘtres de transcript. - Lâinspection du transcript brut sur disque est la solution de repli lorsque vous avez besoin du transcript complet octet pour octet.
Politique dâoutils
Les sous-agents utilisent dâabord le mĂȘme pipeline de profil et de politique dâoutils que le parent ou lâagent cible. Ensuite, OpenClaw applique la couche de restriction des sous-agents.
Sans tools.profile restrictif, les sous-agents obtiennent tous les outils sauf lâoutil
de message, les outils de session et les outils systĂšme :
sessions_listsessions_historysessions_sendsessions_spawnmessage
sessions_history reste ici aussi une vue de rappel bornĂ©e et assainie â ce
nâest pas un vidage de transcript brut.
Lorsque maxSpawnDepth >= 2, les sous-agents orchestrateurs de profondeur 1 reçoivent en plus
sessions_spawn, subagents, sessions_list et
sessions_history afin de pouvoir gérer leurs enfants.
Remplacement via la config
{ agents: { defaults: { subagents: { maxConcurrent: 1, }, }, }, tools: { subagents: { tools: { // deny wins deny: ["gateway", "cron"], // if allow is set, it becomes allow-only (deny still wins) // allow: ["read", "exec", "process"] }, }, },}tools.subagents.tools.allow est un filtre final en autorisation seule. Il peut restreindre
lâensemble dâoutils dĂ©jĂ rĂ©solu, mais il ne peut pas rajouter un outil supprimĂ©
par tools.profile. Par exemple, tools.profile: "coding" inclut
web_search/web_fetch mais pas lâoutil browser. Pour permettre aux
sous-agents de profil coding dâutiliser lâautomatisation du navigateur, ajoutez browser Ă
lâĂ©tape de profil :
{ tools: { profile: "coding", alsoAllow: ["browser"], },}Utilisez agents.list[].tools.alsoAllow: ["browser"] lorsquâun seul
agent doit recevoir lâautomatisation du navigateur.
Concurrence
Les sous-agents utilisent une file dédiée dans le processus :
- Nom de la file :
subagent - Concurrence :
agents.defaults.subagents.maxConcurrent(8par défaut)
Vivacité et récupération
OpenClaw ne considĂšre pas lâabsence de endedAt comme une preuve permanente quâun
sous-agent est encore actif. Les runs non terminĂ©s plus anciens que la fenĂȘtre de runs obsolĂštes
cessent de compter comme actifs/en attente dans /subagents list, les résumés de statut,
le blocage dâachĂšvement des descendants et les contrĂŽles de concurrence par session.
AprÚs un redémarrage du Gateway, les runs restaurés non terminés obsolÚtes sont élagués sauf si
leur session enfant est marquée abortedLastRun: true. Ces
sessions enfants interrompues par redémarrage restent récupérables via le flux de récupération
dâorphelin de sous-agent, qui envoie un message de reprise synthĂ©tique avant
dâeffacer le marqueur dâinterruption.
La rĂ©cupĂ©ration automatique au redĂ©marrage est bornĂ©e par session enfant. Si le mĂȘme
enfant sous-agent est acceptĂ© Ă plusieurs reprises pour rĂ©cupĂ©ration dâorphelin dans la
fenĂȘtre de rĂ©encoincement rapide, OpenClaw persiste une pierre tombale de rĂ©cupĂ©ration sur cette
session et cesse de le reprendre automatiquement lors des redémarrages ultérieurs. Exécutez
openclaw tasks maintenance --apply pour rĂ©concilier lâenregistrement de tĂąche, ou
openclaw doctor --fix pour effacer les indicateurs de récupération interrompue obsolÚtes sur
les sessions avec pierre tombale.
ArrĂȘt
- Lâenvoi de
/stopdans le chat du demandeur interrompt la session du demandeur et arrĂȘte tous les runs de sous-agent actifs lancĂ©s depuis elle, avec propagation aux enfants imbriquĂ©s.
Limitations
- Lâannonce de sous-agent est au mieux. Si le gateway redĂ©marre, le travail « annoncer en retour » en attente est perdu.
- Les sous-agents partagent toujours les mĂȘmes ressources de processus du gateway ; traitez
maxConcurrentcomme une soupape de sécurité. sessions_spawnest toujours non bloquant : il renvoie{ status: "accepted", runId, childSessionKey }immédiatement.- Le contexte de sous-agent injecte seulement
AGENTS.mdetTOOLS.md(pasSOUL.md,IDENTITY.md,USER.md,MEMORY.md,HEARTBEAT.mdniBOOTSTRAP.md). Les sous-agents natifs de Codex suivent la mĂȘme limite :TOOLS.mdreste dans les instructions de fil Codex hĂ©ritĂ©es, tandis que les fichiers de persona, dâidentitĂ© et dâutilisateur propres au parent sont injectĂ©s comme instructions de collaboration limitĂ©es au tour afin que les enfants ne les clonent pas. - La profondeur maximale dâimbrication est 5 (plage de
maxSpawnDepth: 1â5). La profondeur 2 est recommandĂ©e pour la plupart des cas dâusage. maxChildrenPerAgentlimite les enfants actifs par session (5par dĂ©faut, plage1â20).