Subagentes
Subagentes são execuções de agentes em segundo plano iniciadas a partir de uma execução de agente existente. Eles são executados em sua própria sessão (agent:<agentId>:subagent:<uuid>) e, quando terminam, anunciam seu resultado de volta ao canal de chat solicitante. Cada execução de subagente é rastreada como uma tarefa em segundo plano.
Comando de barra
Use/subagents para inspecionar ou controlar execuções de subagentes para a sessão atual:
/subagents list/subagents kill <id|#|all>/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents send <id|#> <message>/subagents steer <id|#> <message>/subagents spawn <agentId> <task> [--model <model>] [--thinking <level>]
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>
/subagents info mostra os metadados da execução (status, registros de data e hora, id da sessão, caminho da transcrição, limpeza).
Use sessions_history para uma visualização de recordação limitada e filtrada por segurança; inspecione o caminho da transcrição no disco quando precisar da transcrição completa bruta.
Comportamento de spawn
/subagents spawn inicia um subagente em segundo plano como um comando do usuário, não um encaminhamento interno, e envia uma única atualização final de conclusão de volta ao chat solicitante quando a execução termina.
- O comando de spawn não bloqueia; ele retorna um id de execução imediatamente.
- Ao concluir, o subagente anuncia uma mensagem de resumo/resultado de volta ao canal de chat solicitante.
- A entrega da conclusão é baseada em push. Depois de iniciado, não faça polling de
/subagents list,sessions_listousessions_historyem loop apenas para esperar a conclusão; inspecione o status somente sob demanda para depuração ou intervenção. - Ao concluir, o OpenClaw fecha, em regime de melhor esforço, abas/processos de navegador rastreados abertos por essa sessão de subagente antes que o fluxo de limpeza do anúncio continue.
- Para spawns manuais, a entrega é resiliente:
- O OpenClaw tenta primeiro a entrega direta por
agentcom uma chave de idempotência estável. - Se a entrega direta falhar, ele recorre ao roteamento por fila.
- Se o roteamento por fila ainda não estiver disponível, o anúncio será tentado novamente com um curto recuo exponencial antes da desistência final.
- O OpenClaw tenta primeiro a entrega direta por
- A entrega da conclusão mantém a rota solicitante resolvida:
- rotas de conclusão vinculadas à thread ou à conversa têm prioridade quando disponíveis
- se a origem da conclusão fornecer apenas um canal, o OpenClaw preenche o alvo/conta ausente a partir da rota resolvida da sessão solicitante (
lastChannel/lastTo/lastAccountId) para que a entrega direta ainda funcione
- O repasse da conclusão para a sessão solicitante é um contexto interno gerado em tempo de execução (não texto escrito pelo usuário) e inclui:
Result(texto da respostaassistantvisível mais recente; caso contrário, texto mais recente de tool/toolResult sanitizado)Status(completed successfully/failed/timed out/unknown)- estatísticas compactas de runtime/tokens
- uma instrução de entrega dizendo ao agente solicitante para reescrever em voz normal de assistente (não encaminhar metadados internos brutos)
--modele--thinkingsubstituem os padrões para essa execução específica.- Use
info/logpara inspecionar detalhes e saída após a conclusão. /subagents spawné no modo de execução única (mode: "run"). Para sessões persistentes vinculadas a thread, usesessions_spawncomthread: trueemode: "session".- Para sessões de harness ACP (Codex, Claude Code, Gemini CLI), use
sessions_spawncomruntime: "acp"e consulte Agentes ACP.
- Paralelizar trabalhos de “pesquisa / tarefa longa / ferramenta lenta” sem bloquear a execução principal.
- Manter os subagentes isolados por padrão (separação de sessão + sandbox opcional).
- Manter a superfície de ferramentas difícil de usar incorretamente: subagentes não recebem ferramentas de sessão por padrão.
- Oferecer suporte a profundidade de aninhamento configurável para padrões de orquestração.
agents.defaults.subagents.model ou substituições por agente.
Ferramenta
Usesessions_spawn:
- Inicia uma execução de subagente (
deliver: false, faixa global:subagent) - Depois executa uma etapa de anúncio e publica a resposta de anúncio no canal de chat solicitante
- Modelo padrão: herda do chamador, a menos que você defina
agents.defaults.subagents.model(ouagents.list[].subagents.modelpor agente); umsessions_spawn.modelexplícito ainda tem prioridade. - Pensamento padrão: herda do chamador, a menos que você defina
agents.defaults.subagents.thinking(ouagents.list[].subagents.thinkingpor agente); umsessions_spawn.thinkingexplícito ainda tem prioridade. - Tempo limite padrão de execução: se
sessions_spawn.runTimeoutSecondsfor omitido, o OpenClaw usaagents.defaults.subagents.runTimeoutSecondsquando definido; caso contrário, recorre a0(sem tempo limite).
task(obrigatório)label?(opcional)agentId?(opcional; inicia sob outro id de agente se permitido)model?(opcional; substitui o modelo do subagente; valores inválidos são ignorados e o subagente é executado no modelo padrão com um aviso no resultado da ferramenta)thinking?(opcional; substitui o nível de pensamento para a execução do subagente)runTimeoutSeconds?(o padrão éagents.defaults.subagents.runTimeoutSecondsquando definido, caso contrário0; quando definido, a execução do subagente é abortada após N segundos)thread?(padrãofalse; quandotrue, solicita vínculo do canal com thread para esta sessão de subagente)mode?(run|session)- o padrão é
run - se
thread: trueemodefor omitido, o padrão passa a sersession mode: "session"exigethread: true
- o padrão é
cleanup?(delete|keep, padrãokeep)sandbox?(inherit|require, padrãoinherit;requirerejeita o spawn a menos que o runtime filho de destino esteja em sandbox)sessions_spawnnão aceita parâmetros de entrega por canal (target,channel,to,threadId,replyTo,transport). Para entrega, usemessage/sessions_senda partir da execução iniciada.
Sessões vinculadas a thread
Quando vínculos com thread estão ativados para um canal, um subagente pode permanecer vinculado a uma thread para que mensagens subsequentes do usuário nessa thread continuem sendo roteadas para a mesma sessão de subagente.Canais com suporte a thread
- Discord (atualmente o único canal com suporte): oferece suporte a sessões persistentes de subagente vinculadas a thread (
sessions_spawncomthread: true), controles manuais de thread (/focus,/unfocus,/agents,/session idle,/session max-age) e chaves do adaptadorchannels.discord.threadBindings.enabled,channels.discord.threadBindings.idleHours,channels.discord.threadBindings.maxAgeHoursechannels.discord.threadBindings.spawnSubagentSessions.
- Inicie com
sessions_spawnusandothread: true(e opcionalmentemode: "session"). - O OpenClaw cria uma thread ou a vincula a esse destino de sessão no canal ativo.
- Respostas e mensagens de acompanhamento nessa thread são roteadas para a sessão vinculada.
- Use
/session idlepara inspecionar/atualizar o desfoco automático por inatividade e/session max-agepara controlar o limite rígido. - Use
/unfocuspara desvincular manualmente.
/focus <target>vincula a thread atual (ou cria uma) a um destino de subagente/sessão./unfocusremove o vínculo da thread atualmente vinculada./agentslista execuções ativas e o estado do vínculo (thread:<id>ouunbound)./session idlee/session max-agefuncionam apenas para threads vinculadas em foco.
- Padrão global:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours - As chaves de substituição por canal e de vínculo automático no spawn são específicas do adaptador. Consulte Canais com suporte a thread acima.
agents.list[].subagents.allowAgents: lista de ids de agentes que podem ser direcionados viaagentId(["*"]para permitir qualquer um). Padrão: apenas o agente solicitante.agents.defaults.subagents.allowAgents: lista de permissões padrão de agentes de destino usada quando o agente solicitante não define seu própriosubagents.allowAgents.- Proteção de herança de sandbox: se a sessão solicitante estiver em sandbox,
sessions_spawnrejeita destinos que seriam executados sem sandbox. agents.defaults.subagents.requireAgentId/agents.list[].subagents.requireAgentId: quandotrue, bloqueia chamadassessions_spawnque omitiremagentId(força a seleção explícita de perfil). Padrão: false.
- Use
agents_listpara ver quais ids de agentes estão atualmente permitidos parasessions_spawn.
- Sessões de subagente são arquivadas automaticamente após
agents.defaults.subagents.archiveAfterMinutes(padrão: 60). - O arquivamento usa
sessions.deletee renomeia a transcrição para*.deleted.<timestamp>(na mesma pasta). cleanup: "delete"arquiva imediatamente após o anúncio (ainda mantém a transcrição por meio de renomeação).- O arquivamento automático é em regime de melhor esforço; temporizadores pendentes são perdidos se o gateway reiniciar.
runTimeoutSecondsnão arquiva automaticamente; ele apenas interrompe a execução. A sessão permanece até o arquivamento automático.- O arquivamento automático se aplica igualmente a sessões de profundidade 1 e profundidade 2.
- A limpeza do navegador é separada da limpeza de arquivamento: abas/processos de navegador rastreados são fechados em regime de melhor esforço quando a execução termina, mesmo que o registro da sessão/transcrição seja mantido.
Subagentes aninhados
Por padrão, subagentes não podem iniciar seus próprios subagentes (maxSpawnDepth: 1). Você pode habilitar um nível de aninhamento definindo maxSpawnDepth: 2, o que permite o padrão de orquestração: principal → subagente orquestrador → sub-subagentes trabalhadores.
Como habilitar
Níveis de profundidade
| Profundidade | Formato da chave da sessão | Papel | Pode iniciar? |
|---|---|---|---|
| 0 | agent:<id>:main | Agente principal | Sempre |
| 1 | agent:<id>:subagent:<uuid> | Subagente (orquestrador quando a profundidade 2 é permitida) | Somente se maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Sub-subagente (trabalhador folha) | Nunca |
Cadeia de anúncio
Os resultados fluem de volta pela cadeia:- O trabalhador de profundidade 2 termina → anuncia ao seu pai (orquestrador de profundidade 1)
- O orquestrador de profundidade 1 recebe o anúncio, sintetiza os resultados, termina → anuncia ao principal
- O agente principal recebe o anúncio e entrega ao usuário
- Inicie o trabalho filho uma vez e espere pelos eventos de conclusão em vez de criar loops de polling em torno de
sessions_list,sessions_history,/subagents listou comandosexeccomsleep. - Se um evento de conclusão de filho chegar depois que você já enviou a resposta final, a ação correta de acompanhamento é o token silencioso exato
NO_REPLY/no_reply.
Política de ferramentas por profundidade
- O papel e o escopo de controle são gravados nos metadados da sessão no momento do spawn. Isso impede que chaves de sessão planas ou restauradas recuperem acidentalmente privilégios de orquestrador.
- Profundidade 1 (orquestrador, quando
maxSpawnDepth >= 2): recebesessions_spawn,subagents,sessions_list,sessions_historypara que possa gerenciar seus filhos. Outras ferramentas de sessão/sistema continuam negadas. - Profundidade 1 (folha, quando
maxSpawnDepth == 1): sem ferramentas de sessão (comportamento padrão atual). - Profundidade 2 (trabalhador folha): sem ferramentas de sessão —
sessions_spawné sempre negado na profundidade 2. Não pode iniciar mais filhos.
Limite de spawn por agente
Cada sessão de agente (em qualquer profundidade) pode ter no máximomaxChildrenPerAgent (padrão: 5) filhos ativos ao mesmo tempo. Isso evita expansão descontrolada a partir de um único orquestrador.
Parada em cascata
Parar um orquestrador de profundidade 1 interrompe automaticamente todos os seus filhos de profundidade 2:/stopno chat principal interrompe todos os agentes de profundidade 1 e aplica a cascata a seus filhos de profundidade 2./subagents kill <id>interrompe um subagente específico e aplica a cascata a seus filhos./subagents kill allinterrompe todos os subagentes do solicitante e aplica a cascata.
Autenticação
A autenticação do subagente é resolvida por id do agente, não por tipo de sessão:- A chave da sessão de subagente é
agent:<agentId>:subagent:<uuid>. - O armazenamento de autenticação é carregado do
agentDirdesse agente. - Os perfis de autenticação do agente principal são mesclados como um fallback; perfis do agente substituem perfis do principal em caso de conflito.
Anúncio
Subagentes reportam de volta por meio de uma etapa de anúncio:- A etapa de anúncio é executada dentro da sessão do subagente (não na sessão solicitante).
- Se o subagente responder exatamente
ANNOUNCE_SKIP, nada será publicado. - Se o texto mais recente do assistente for o token silencioso exato
NO_REPLY/no_reply, a saída do anúncio será suprimida mesmo que tenha havido progresso visível anterior. - Caso contrário, a entrega depende da profundidade do solicitante:
- sessões solicitantes de nível superior usam uma chamada
agentde acompanhamento com entrega externa (deliver=true) - sessões solicitantes de subagente aninhado recebem uma injeção interna de acompanhamento (
deliver=false) para que o orquestrador possa sintetizar os resultados do filho na sessão - se uma sessão solicitante de subagente aninhado não existir mais, o OpenClaw recorre ao solicitante dessa sessão quando disponível
- sessões solicitantes de nível superior usam uma chamada
- Para sessões solicitantes de nível superior, a entrega direta em modo de conclusão primeiro resolve qualquer rota vinculada de conversa/thread e substituição de hook e depois preenche campos ausentes de destino de canal a partir da rota armazenada da sessão solicitante. Isso mantém as conclusões no chat/tópico correto mesmo quando a origem da conclusão identifica apenas o canal.
- A agregação de conclusões de filhos é limitada à execução solicitante atual ao criar achados de conclusão aninhados, impedindo que saídas antigas de filhos de execuções anteriores vazem para o anúncio atual.
- As respostas de anúncio preservam o roteamento de thread/tópico quando disponível nos adaptadores de canal.
- O contexto de anúncio é normalizado em um bloco estável de evento interno:
- origem (
subagentoucron) - chave/id da sessão filha
- tipo de anúncio + rótulo da tarefa
- linha de status derivada de sinais do resultado em runtime (
success,error,timeoutouunknown) - conteúdo do resultado selecionado a partir do texto visível mais recente do assistente, caso contrário texto mais recente de tool/toolResult sanitizado
- uma instrução de acompanhamento descrevendo quando responder vs. permanecer em silêncio
- origem (
Statusnão é inferido a partir da saída do modelo; ele vem de sinais do resultado em runtime.- Em caso de tempo limite, se o filho só avançou até chamadas de ferramenta, o anúncio pode condensar esse histórico em um breve resumo de progresso parcial em vez de reproduzir a saída bruta da ferramenta.
- Runtime (por exemplo,
runtime 5m12s) - Uso de tokens (entrada/saída/total)
- Custo estimado quando o preço do modelo estiver configurado (
models.providers.*.models[].cost) sessionKey,sessionIde caminho da transcrição (para que o agente principal possa buscar o histórico viasessions_historyou inspecionar o arquivo no disco)- Metadados internos destinam-se apenas à orquestração; respostas voltadas ao usuário devem ser reescritas em voz normal de assistente.
sessions_history é o caminho de orquestração mais seguro:
- a recordação do assistente é normalizada primeiro:
- tags de pensamento são removidas
- blocos de estrutura
<relevant-memories>/<relevant_memories>são removidos - blocos de carga útil XML de chamada de ferramenta em texto simples, como
<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>e<function_calls>...</function_calls>, são removidos, incluindo cargas úteis truncadas que nunca se fecham corretamente - estruturas rebaixadas de chamada/resultado de ferramenta e marcadores de contexto histórico são removidos
- tokens de controle do modelo vazados, como
<|assistant|>, outros tokens ASCII<|...|>e variantes de largura total<|...|>, são removidos - XML malformado de chamada de ferramenta MiniMax é removido
- texto semelhante a credenciais/tokens é redigido
- blocos longos podem ser truncados
- históricos muito grandes podem descartar linhas mais antigas ou substituir uma linha superdimensionada por
[sessions_history omitted: message too large] - a inspeção bruta da transcrição no disco é o fallback quando você precisa da transcrição completa byte a byte
Política de ferramentas (ferramentas de subagente)
Por padrão, subagentes recebem todas as ferramentas, exceto ferramentas de sessão e ferramentas de sistema:sessions_listsessions_historysessions_sendsessions_spawn
sessions_history continua sendo aqui também uma visualização de recordação limitada e sanitizada; não é um despejo bruto da transcrição.
Quando maxSpawnDepth >= 2, subagentes orquestradores de profundidade 1 recebem adicionalmente sessions_spawn, subagents, sessions_list e sessions_history para que possam gerenciar seus filhos.
Substitua via configuração:
Concorrência
Subagentes usam uma faixa dedicada de fila no processo:- Nome da faixa:
subagent - Concorrência:
agents.defaults.subagents.maxConcurrent(padrão8)
Interrupção
- Enviar
/stopno chat solicitante aborta a sessão solicitante e interrompe quaisquer execuções ativas de subagente iniciadas a partir dela, com cascata para filhos aninhados. /subagents kill <id>interrompe um subagente específico e aplica a cascata a seus filhos.
Limitações
- O anúncio de subagente é em regime de melhor esforço. Se o gateway reiniciar, o trabalho pendente de “anunciar de volta” será perdido.
- Subagentes ainda compartilham os mesmos recursos do processo do gateway; trate
maxConcurrentcomo uma válvula de segurança. sessions_spawné sempre não bloqueante: ele retorna{ status: "accepted", runId, childSessionKey }imediatamente.- O contexto do subagente injeta apenas
AGENTS.md+TOOLS.md(semSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.mdnemBOOTSTRAP.md). - A profundidade máxima de aninhamento é 5 (intervalo de
maxSpawnDepth: 1–5). A profundidade 2 é recomendada para a maioria dos casos de uso. maxChildrenPerAgentlimita os filhos ativos por sessão (padrão: 5, intervalo: 1–20).