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 :

text
/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.

text
/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_spawn est 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_yield aprĂš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_list ou sessions_history en 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 agent avec 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Ă©ponse assistant visible 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
  • --model et --thinking remplacent les valeurs par dĂ©faut pour cette exĂ©cution spĂ©cifique.
  • Utilisez info/log pour inspecter les dĂ©tails et la sortie aprĂšs la fin.
  • Pour les sessions persistantes liĂ©es Ă  un fil, utilisez sessions_spawn avec thread: true et mode: "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_spawn avec runtime: "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 Plugin codex est 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 que acpx soit chargĂ©. runtime: "acp" attend un identifiant de harnais ACP externe, ou une entrĂ©e agents.list[] avec runtime.type="acp" ; utilisez l’environnement d’exĂ©cution de sous-agent par dĂ©faut pour les agents de configuration OpenClaw normaux depuis agents_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 (ou agents.list[].subagents.model par 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. Un sessions_spawn.model explicite reste prioritaire.
  • Thinking : les sous-agents natifs hĂ©ritent de l’appelant sauf si vous dĂ©finissez agents.defaults.subagents.thinking (ou agents.list[].subagents.thinking par agent). Les lancements d’environnement d’exĂ©cution ACP appliquent aussi agents.defaults.models["provider/model"].params.thinking pour le modĂšle sĂ©lectionnĂ©. Un sessions_spawn.thinking explicite reste prioritaire.
  • DĂ©lai d’exĂ©cution : OpenClaw utilise agents.defaults.subagents.runTimeoutSeconds lorsqu’il est dĂ©fini ; sinon, il revient Ă  0 (aucun dĂ©lai). sessions_spawn n’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 via sessions_spawn tout ce qui est plus impliquĂ© qu’une rĂ©ponse directe.

Les remplacements par agent utilisent agents.list[].subagents.delegationMode.

json5
{  agents: {    defaults: {      subagents: {        delegationMode: "prefer",        maxConcurrent: 4,      },    },    list: [      {        id: "coordinator",        subagents: { delegationMode: "prefer" },      },    ],  },}

Paramùtres de l’outil

taskstringrequired

La description de la tĂąche pour le sous-agent.

taskNamestring

Identifiant 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.

labelstring

Libellé facultatif lisible par un humain.

agentIdstring

Lance sous un autre identifiant d’agent configurĂ© lorsque subagents.allowAgents l’autorise.

cwdstring

RĂ©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: subagent

acp 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.

resumeSessionIdstring

ACP 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.

modelstring

Remplace 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.

thinkingstring

Remplace le niveau de rĂ©flexion pour l’exĂ©cution du sous-agent.

threadbooleandefault: false

Lorsque true, demande une liaison au thread du canal pour cette session de sous-agent.

mode"run" | "session"default: run

Si 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: inherit

require rejette le lancement sauf si l’exĂ©cution enfant cible est sandboxĂ©e.

context"isolated" | "fork"default: isolated

fork 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: false

    Bloque 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: 120000

    DĂ©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Ă©faut 60).
    • L’archivage utilise sessions.delete et 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.

    json5
    {  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 :

    1. Le worker de profondeur 2 termine → annonce à son parent (orchestrateur de profondeur 1).
    2. L’orchestrateur de profondeur 1 reçoit l’annonce, synthĂ©tise les rĂ©sultats, termine → annonce au principal.
    3. 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çoit sessions_spawn, subagents, sessions_list, sessions_history afin 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_spawn est 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 :

    • /stop dans 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 agentDir de 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 agent de 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, sessionId et chemin de transcript afin que l’agent principal puisse rĂ©cupĂ©rer l’historique via sessions_history ou 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 nextOffset lorsqu’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_list
    • sessions_history
    • sessions_send
    • sessions_spawn
    • message

    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

    json5
    {  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 :

    json5
    {  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 (8 par 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 /stop dans 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 maxConcurrent comme une soupape de sĂ©curitĂ©.
    • sessions_spawn est toujours non bloquant : il renvoie { status: "accepted", runId, childSessionKey } immĂ©diatement.
    • Le contexte de sous-agent injecte seulement AGENTS.md et TOOLS.md (pas SOUL.md, IDENTITY.md, USER.md, MEMORY.md, HEARTBEAT.md ni BOOTSTRAP.md). Les sous-agents natifs de Codex suivent la mĂȘme limite : TOOLS.md reste 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.
    • maxChildrenPerAgent limite les enfants actifs par session (5 par dĂ©faut, plage 1–20).

    Connexe

    Was this useful?
    On this page

    On this page