Agent coordination
Sotto-agenti
I sotto-agenti sono esecuzioni di agenti in background generate da un'esecuzione di agente esistente.
Vengono eseguiti nella propria sessione (agent:<agentId>:subagent:<uuid>) e,
al termine, annunciano il risultato di nuovo nel canale chat
del richiedente. Ogni esecuzione di sotto-agente viene tracciata come
attività in background.
Obiettivi principali:
- Parallelizzare il lavoro di "ricerca / attività lunga / strumento lento" senza bloccare l'esecuzione principale.
- Mantenere i sotto-agenti isolati per impostazione predefinita (separazione della sessione + sandboxing facoltativo).
- Mantenere la superficie degli strumenti difficile da usare in modo improprio: i sotto-agenti non ricevono strumenti di sessione per impostazione predefinita.
- Supportare una profondità di annidamento configurabile per i pattern di orchestrazione.
Comando slash
Usa /subagents per ispezionare le esecuzioni di sotto-agenti per la sessione corrente:
/subagents list/subagents log <id|#> [limit] [tools]/subagents info <id|#>/subagents info mostra i metadati dell'esecuzione (stato, timestamp, id sessione,
percorso della trascrizione, pulizia). Usa sessions_history per una vista di richiamo limitata
e filtrata per sicurezza; ispeziona il percorso della trascrizione su disco quando
ti serve la trascrizione completa grezza.
Controlli di associazione dei thread
Questi comandi funzionano sui canali che supportano associazioni persistenti dei thread. Vedi Canali che supportano i thread sotto.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>Comportamento di generazione
Gli agenti avviano sotto-agenti in background con sessions_spawn. I completamenti dei sotto-agenti
ritornano come eventi interni della sessione genitore; l'agente genitore/richiedente decide
se è necessario un aggiornamento visibile all'utente.
Completamento non bloccante e basato su push
sessions_spawnè non bloccante; restituisce immediatamente un id esecuzione.- Al completamento, il sotto-agente riferisce alla sessione genitore/richiedente.
- I turni dell'agente che richiedono i risultati dei figli devono chiamare
sessions_yielddopo aver generato il lavoro richiesto. Questo termina il turno corrente e consente agli eventi di completamento di arrivare come messaggio successivo visibile al modello. - Il completamento è basato su push. Una volta generato, non interrogare
/subagents list,sessions_listosessions_historyin un ciclo solo per attendere che termini; ispeziona lo stato solo su richiesta per visibilità di debug. - L'output del figlio è un report/evidenza che l'agente richiedente deve sintetizzare. Non è testo di istruzione scritto dall'utente e non può sovrascrivere policy di sistema, sviluppatore o utente.
- Al completamento, OpenClaw tenta al meglio di chiudere le schede/processi del browser tracciati aperti da quella sessione di sotto-agente prima che prosegua il flusso di pulizia dell'annuncio.
Consegna del completamento
- OpenClaw restituisce i completamenti alla sessione richiedente tramite un turno
agentcon una chiave di idempotenza stabile. - Se l'esecuzione richiedente è ancora attiva, OpenClaw prova prima a risvegliare/orientare quell'esecuzione invece di avviare un secondo percorso di risposta visibile.
- Se non è possibile risvegliare un richiedente attivo, OpenClaw ripiega su un handoff all'agente richiedente con lo stesso contesto di completamento invece di scartare l'annuncio.
- Un handoff genitore riuscito completa la consegna del sotto-agente anche quando il genitore decide che non è necessario alcun aggiornamento utente visibile.
- I sotto-agenti nativi non ricevono lo strumento di messaggistica. Restituiscono testo semplice dell'assistente all'agente genitore/richiedente; le risposte visibili agli esseri umani sono di proprietà della normale policy di consegna dell'agente genitore/richiedente.
- Se non è possibile usare l'handoff diretto, ripiega sull'instradamento in coda.
- Se l'instradamento in coda non è ancora disponibile, l'annuncio viene ritentato con un breve backoff esponenziale prima della rinuncia finale.
- La consegna del completamento mantiene la route del richiedente risolta: le route di completamento vincolate al thread o alla conversazione prevalgono quando disponibili; se l'origine del completamento fornisce solo un canale, OpenClaw compila target/account mancanti dalla route risolta della sessione richiedente (
lastChannel/lastTo/lastAccountId) così la consegna diretta continua a funzionare.
Metadati di handoff del completamento
L'handoff del completamento alla sessione richiedente è contesto interno generato dal runtime (non testo scritto dall'utente) e include:
Result— il testo dell'ultima rispostaassistantvisibile del figlio. L'output Tool/toolResult non viene promosso nei risultati del figlio. Le esecuzioni terminali non riuscite non riutilizzano il testo di risposta catturato.Status—completed; ready for parent review/failed/timed out/unknown.- Statistiche compatte di runtime/token.
- Un'istruzione di revisione che dice all'agente richiedente di verificare il risultato prima di decidere se l'attività originale è completata.
- Una guida di follow-up che dice all'agente richiedente di continuare l'attività o registrare un follow-up quando il risultato del figlio lascia altro lavoro da fare.
- Un'istruzione di aggiornamento finale per il percorso senza ulteriori azioni, scritta nella normale voce dell'assistente senza inoltrare metadati interni grezzi.
Modalità e runtime ACP
--modele--thinkingsovrascrivono i valori predefiniti per quella specifica esecuzione.- Usa
info/logper ispezionare dettagli e output dopo il completamento. - Per sessioni persistenti vincolate a un thread, usa
sessions_spawnconthread: trueemode: "session". - Se il canale richiedente non supporta associazioni dei thread, usa
mode: "run"invece di ritentare combinazioni vincolate a thread impossibili. - Per sessioni di harness ACP (Claude Code, Gemini CLI, OpenCode o Codex ACP/acpx esplicito), usa
sessions_spawnconruntime: "acp"quando lo strumento pubblicizza quel runtime. Vedi Modello di consegna ACP quando esegui il debug di completamenti o loop agente-agente. Quando il plugincodexè abilitato, il controllo chat/thread di Codex dovrebbe preferire/codex ...rispetto ad ACP, a meno che l'utente non chieda esplicitamente ACP/acpx. - OpenClaw nasconde
runtime: "acp"finché ACP non è abilitato, il richiedente non è in sandbox e un plugin backend comeacpxè caricato.runtime: "acp"si aspetta un id harness ACP esterno, oppure una voceagents.list[]conruntime.type="acp"; usa il runtime di sotto-agente predefinito per gli agenti di configurazione OpenClaw normali daagents_list.
Modalità di contesto
I sotto-agenti nativi iniziano isolati a meno che il chiamante non chieda esplicitamente di biforcare la trascrizione corrente.
| Modalità | Quando usarla | Comportamento |
|---|---|---|
isolated |
Ricerca nuova, implementazione indipendente, lavoro con strumenti lenti o qualunque cosa che possa essere descritta nel testo dell'attività | Crea una trascrizione figlia pulita. È l'impostazione predefinita e mantiene più basso l'uso di token. |
fork |
Lavoro che dipende dalla conversazione corrente, da risultati precedenti degli strumenti o da istruzioni sfumate già presenti nella trascrizione del richiedente | Dirama la trascrizione del richiedente nella sessione figlia prima che il figlio inizi. |
Usa fork con parsimonia. Serve per la delega sensibile al contesto, non come
sostituto della scrittura di un prompt di attività chiaro.
Strumento: sessions_spawn
Avvia un'esecuzione di sotto-agente con deliver: false sulla lane globale subagent,
poi esegue un passaggio di annuncio e pubblica la risposta di annuncio nel canale
chat del richiedente.
La disponibilità dipende dalla policy effettiva degli strumenti del chiamante. I profili coding e
full espongono sessions_spawn per impostazione predefinita. Il profilo messaging
no; aggiungi tools.alsoAllow: ["sessions_spawn", "sessions_yield", "subagents"] o usa tools.profile: "coding" per gli agenti che devono delegare
lavoro. Le policy canale/gruppo, provider, sandbox e allow/deny per agente possono
comunque rimuovere lo strumento dopo la fase del profilo. Usa /tools dalla stessa
sessione per confermare l'elenco effettivo degli strumenti.
Valori predefiniti:
- Modello: i sotto-agenti nativi ereditano il chiamante a meno che tu non imposti
agents.defaults.subagents.model(oagents.list[].subagents.modelper agente). Le generazioni del runtime ACP usano lo stesso modello di sotto-agente configurato quando presente; altrimenti l'harness ACP mantiene il proprio valore predefinito. Unsessions_spawn.modelesplicito ha comunque la precedenza. - Thinking: i sotto-agenti nativi ereditano il chiamante a meno che tu non imposti
agents.defaults.subagents.thinking(oagents.list[].subagents.thinkingper agente). Le generazioni del runtime ACP applicano ancheagents.defaults.models["provider/model"].params.thinkingper il modello selezionato. Unsessions_spawn.thinkingesplicito ha comunque la precedenza. - Timeout esecuzione: OpenClaw usa
agents.defaults.subagents.runTimeoutSecondsquando impostato; altrimenti ripiega su0(nessun timeout).sessions_spawnnon accetta override di timeout per chiamata. - Consegna attività: i sotto-agenti nativi ricevono l'attività delegata nel loro primo messaggio
[Subagent Task]visibile. Il prompt di sistema del sotto-agente contiene regole di runtime e contesto di routing, non un duplicato nascosto dell'attività.
Le generazioni di sotto-agenti nativi accettate includono i metadati del modello figlio risolto
nel risultato dello strumento: resolvedModel contiene il riferimento del modello applicato e
resolvedProvider contiene il prefisso del provider quando il riferimento ne ha uno.
Modalità del prompt di delega
agents.defaults.subagents.delegationMode controlla solo la guida del prompt; non cambia la policy degli strumenti né impone la delega.
suggest(predefinito): mantiene il suggerimento standard del prompt di usare sotto-agenti per lavori più grandi o più lenti.prefer: dice all'agente principale di rimanere reattivo e delegare tramitesessions_spawnqualunque cosa più articolata di una risposta diretta.
Gli override per agente usano agents.list[].subagents.delegationMode.
{ agents: { defaults: { subagents: { delegationMode: "prefer", maxConcurrent: 4, }, }, list: [ { id: "coordinator", subagents: { delegationMode: "prefer" }, }, ], },}Parametri dello strumento
taskstringrequiredLa descrizione dell'attività per il sotto-agente.
taskNamestringHandle stabile facoltativo per identificare un child specifico nell'output di stato successivo. Deve corrispondere a [a-z][a-z0-9_-]{0,63} e non può essere un target riservato come last o all.
labelstringEtichetta facoltativa leggibile dall'utente.
agentIdstringGenera sotto un altro id agente configurato quando consentito da subagents.allowAgents.
cwdstringDirectory di lavoro facoltativa dell'attività per l'esecuzione child. I sotto-agenti nativi caricano comunque i file di bootstrap dall'area di lavoro dell'agente target; cwd cambia solo dove gli strumenti runtime e gli harness CLI eseguono il lavoro delegato.
runtime"subagent" | "acp"default: subagentacp è solo per harness ACP esterni (claude, droid, gemini, opencode o Codex ACP/acpx richiesto esplicitamente) e per le voci agents.list[] il cui runtime.type è acp.
resumeSessionIdstringSolo ACP. Riprende una sessione harness ACP esistente quando runtime: "acp"; ignorato per le generazioni di sotto-agenti nativi.
streamTo"parent"Solo ACP. Trasmette l'output dell'esecuzione ACP alla sessione parent quando runtime: "acp"; omettere per le generazioni di sotto-agenti nativi.
modelstringSovrascrive il modello del sotto-agente. I valori non validi vengono ignorati e il sotto-agente viene eseguito sul modello predefinito con un avviso nel risultato dello strumento.
thinkingstringSovrascrive il livello di ragionamento per l'esecuzione del sotto-agente.
threadbooleandefault: falseQuando true, richiede l'associazione al thread del canale per questa sessione di sotto-agente.
mode"run" | "session"default: runSe thread: true e mode è omesso, il valore predefinito diventa session. mode: "session" richiede thread: true.
Se l'associazione al thread non è disponibile per il canale richiedente, usare invece mode: "run".
cleanup"delete" | "keep"default: keep"delete" archivia immediatamente dopo l'annuncio (conserva comunque la trascrizione tramite rinomina).
sandbox"inherit" | "require"default: inheritrequire rifiuta la generazione a meno che il runtime child target sia in sandbox.
context"isolated" | "fork"default: isolatedfork dirama la trascrizione corrente del richiedente nella sessione child. Solo sotto-agenti nativi. Le generazioni associate a thread usano fork per impostazione predefinita; le generazioni senza thread usano isolated per impostazione predefinita.
Nomi delle attività e targeting
taskName è un handle visibile al modello per l'orchestrazione, non una chiave di sessione.
Usalo per nomi child stabili come review_subagents,
linux_validation o docs_update quando un coordinatore potrebbe dover ispezionare
quel child in seguito.
La risoluzione dei target accetta corrispondenze esatte di taskName e prefissi
non ambigui. La corrispondenza è limitata alla stessa finestra di target attivi/recenti usata
dai target numerati /subagents, quindi un child completato obsoleto non rende
ambiguo un handle riutilizzato. Se due child attivi o recenti condividono lo stesso
taskName, il target è ambiguo; usare invece l'indice della lista, la chiave di sessione o
l'id di esecuzione.
I target riservati last e all non sono valori taskName validi
perché hanno già significati di controllo.
Strumento: sessions_yield
Termina il turno corrente del modello e attende che gli eventi runtime, principalmente gli eventi di completamento dei sotto-agenti, arrivino come messaggio successivo. Usalo dopo aver generato il lavoro child richiesto quando il richiedente non può produrre una risposta finale finché non arrivano quei completamenti.
sessions_yield è la primitiva di attesa. Non sostituirla con cicli di polling
su subagents, sessions_list, sessions_history, sleep della shell
o polling di processo solo per rilevare il completamento dei child.
Usa sessions_yield solo quando l'elenco effettivo degli strumenti della sessione lo include.
Alcuni profili di strumenti minimi o personalizzati possono esporre sessions_spawn e
subagents senza esporre sessions_yield; in quel caso, non inventare
un ciclo di polling solo per attendere il completamento.
Quando esistono child attivi, OpenClaw inserisce nei turni normali un blocco prompt
compatto generato dal runtime Active Subagents, così il richiedente può vedere
le sessioni child correnti, gli id di esecuzione, gli stati, le etichette, le attività e
gli alias taskName senza polling. I campi attività ed etichetta in quel
blocco sono racchiusi tra virgolette come dati, non come istruzioni, perché possono provenire
da argomenti di generazione forniti dall'utente/modello.
Strumento: subagents
Elenca le esecuzioni di sotto-agenti generate e possedute dalla sessione richiedente. È limitato al richiedente corrente; un child può vedere solo i propri child controllati.
Usa subagents per stato e debug su richiesta. Usa sessions_yield per
attendere gli eventi di completamento.
Sessioni associate a thread
Quando le associazioni ai thread sono abilitate per un canale, un sotto-agente può restare associato a un thread, così i messaggi utente di follow-up in quel thread continuano a essere instradati alla stessa sessione di sotto-agente.
Canali che supportano i thread
Qualsiasi canale con un adapter di associazione sessione può supportare sessioni
persistenti di sotto-agente associate a thread (sessions_spawn con thread: true).
Gli adapter inclusi attualmente comprendono i thread Discord, i thread Matrix,
gli argomenti forum Telegram e le associazioni alla conversazione corrente per Feishu.
Usa le chiavi di configurazione threadBindings per canale per l'abilitazione,
i timeout e spawnSessions.
Flusso rapido
Genera
sessions_spawn con thread: true (e facoltativamente mode: "session").
Associa
OpenClaw crea o associa un thread a quel target di sessione nel canale attivo.
Instrada i follow-up
Le risposte e i messaggi di follow-up in quel thread vengono instradati alla sessione associata.
Ispeziona i timeout
Usa /session idle per ispezionare/aggiornare il disancoraggio automatico per inattività e
/session max-age per controllare il limite massimo rigido.
Scollega
Usa /unfocus per scollegare manualmente.
Controlli manuali
| Comando | Effetto |
|---|---|
/focus <target> |
Associa il thread corrente (o ne crea uno) a un target sotto-agente/sessione |
/unfocus |
Rimuove l'associazione per il thread associato corrente |
/agents |
Elenca le esecuzioni attive e lo stato di associazione (thread:<id> o unbound) |
/session idle |
Ispeziona/aggiorna il disancoraggio automatico per inattività (solo thread associati focalizzati) |
/session max-age |
Ispeziona/aggiorna il limite massimo rigido (solo thread associati focalizzati) |
Interruttori di configurazione
- Predefinito globale:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours. - Le chiavi di override del canale e di associazione automatica alla generazione sono specifiche dell'adapter. Vedi Canali che supportano i thread sopra.
Vedi Riferimento di configurazione e Comandi slash per i dettagli correnti degli adapter.
Allowlist
agents.list[].subagents.allowAgentsstring[]Elenco di id agente configurati che possono essere indirizzati tramite agentId esplicito (["*"] consente qualsiasi target configurato). Predefinito: solo l'agente richiedente. Se imposti un elenco e vuoi comunque che il richiedente generi se stesso con agentId, includi l'id del richiedente nell'elenco.
agents.defaults.subagents.allowAgentsstring[]Allowlist predefinita dei target-agent configurati usata quando l'agente richiedente non imposta il proprio subagents.allowAgents.
agents.defaults.subagents.requireAgentIdbooleandefault: falseBlocca le chiamate sessions_spawn che omettono agentId (forza la selezione esplicita del profilo). Override per agente: agents.list[].subagents.requireAgentId.
agents.defaults.subagents.announceTimeoutMsnumberdefault: 120000Timeout per chiamata per i tentativi di consegna dell'annuncio agent del gateway. I valori sono millisecondi interi positivi e vengono limitati al massimo timer sicuro per la piattaforma. I tentativi transitori possono rendere l'attesa totale dell'annuncio più lunga di un timeout configurato.
Se la sessione richiedente è in sandbox, sessions_spawn rifiuta i target
che verrebbero eseguiti senza sandbox.
Rilevamento
Usa agents_list per vedere quali id agente sono attualmente consentiti per
sessions_spawn. La risposta include il modello effettivo di ogni agente elencato
e metadati runtime incorporati, così i chiamanti possono distinguere OpenClaw, il server dell'app Codex
e altri runtime nativi configurati.
Le voci allowAgents devono puntare a id agente configurati in agents.list[].
["*"] indica qualsiasi agente target configurato più il richiedente. Se una configurazione agente
viene eliminata ma il suo id resta in allowAgents, sessions_spawn rifiuta quell'id
e agents_list lo omette. Esegui openclaw doctor --fix per pulire le voci
allowlist obsolete, oppure aggiungi una voce minima agents.list[] quando il target deve
restare generabile ereditando i valori predefiniti.
Archiviazione automatica
- Le sessioni dei sotto-agenti vengono archiviate automaticamente dopo
agents.defaults.subagents.archiveAfterMinutes(predefinito60). - L'archiviazione usa
sessions.deletee rinomina la trascrizione in*.deleted.<timestamp>(stessa cartella). cleanup: "delete"archivia immediatamente dopo l'annuncio (conserva comunque la trascrizione tramite rinomina).- L'archiviazione automatica è best-effort; i timer in sospeso vengono persi se il gateway si riavvia.
- I timeout di esecuzione configurati non archiviano automaticamente; interrompono solo l'esecuzione. La sessione resta fino all'archiviazione automatica.
- L'archiviazione automatica si applica allo stesso modo alle sessioni di profondità 1 e profondità 2.
- La pulizia del browser è separata dalla pulizia dell'archivio: le schede/processi del browser tracciati vengono chiusi best-effort quando l'esecuzione termina, anche se il record di trascrizione/sessione viene conservato.
Sotto-agenti annidati
Per impostazione predefinita, i sotto-agenti non possono generare i propri sotto-agenti
(maxSpawnDepth: 1). Imposta maxSpawnDepth: 2 per abilitare un livello di
annidamento — il pattern orchestrator: main → sotto-agente orchestrator →
sotto-sotto-agenti worker.
{ 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 }, }, },}Livelli di profondità
| Profondità | Forma della chiave di sessione | Ruolo | Può generare? |
|---|---|---|---|
| 0 | agent:<id>:main |
Agente principale | Sempre |
| 1 | agent:<id>:subagent:<uuid> |
Sotto-agente (orchestrator quando la profondità 2 è consentita) | Solo se maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> |
Sotto-sotto-agente (worker foglia) | Mai |
Catena di annuncio
I risultati risalgono la catena:
- Il worker di profondità 2 termina → lo annuncia al genitore (orchestratore di profondità 1).
- L'orchestratore di profondità 1 riceve l'annuncio, sintetizza i risultati, termina → lo annuncia al main.
- L'agente main riceve l'annuncio e lo consegna all'utente.
Ogni livello vede solo gli annunci dei propri figli diretti.
Criterio degli strumenti per profondità
- Ruolo e ambito di controllo vengono scritti nei metadati della sessione al momento dello spawn. Questo impedisce a chiavi di sessione piatte o ripristinate di riottenere accidentalmente privilegi da orchestratore.
- Profondità 1 (orchestratore, quando
maxSpawnDepth >= 2): ricevesessions_spawn,subagents,sessions_list,sessions_historycosì può generare figli e ispezionarne lo stato. Gli altri strumenti di sessione/sistema restano negati. - Profondità 1 (foglia, quando
maxSpawnDepth == 1): nessuno strumento di sessione (comportamento predefinito attuale). - Profondità 2 (worker foglia): nessuno strumento di sessione:
sessions_spawnè sempre negato a profondità 2. Non può generare ulteriori figli.
Limite di spawn per agente
Ogni sessione agente (a qualsiasi profondità) può avere al massimo
maxChildrenPerAgent (predefinito 5) figli attivi alla volta. Questo impedisce
un fan-out incontrollato da un singolo orchestratore.
Arresto a cascata
L'arresto di un orchestratore di profondità 1 arresta automaticamente tutti i suoi figli di profondità 2:
/stopnella chat main arresta tutti gli agenti di profondità 1 e si propaga ai loro figli di profondità 2.
Autenticazione
L'autenticazione del sotto-agente viene risolta per id agente, non per tipo di sessione:
- La chiave di sessione del sotto-agente è
agent:<agentId>:subagent:<uuid>. - Lo store di autenticazione viene caricato dall'
agentDirdi quell'agente. - I profili di autenticazione dell'agente main vengono uniti come fallback; i profili agente sovrascrivono i profili main in caso di conflitti.
L'unione è additiva, quindi i profili main sono sempre disponibili come fallback. L'autenticazione completamente isolata per agente non è ancora supportata.
Annuncio
I sotto-agenti riportano i risultati tramite un passaggio di annuncio:
- Il passaggio di annuncio viene eseguito dentro la sessione del sotto-agente (non nella sessione del richiedente).
- Se il sotto-agente risponde esattamente
ANNOUNCE_SKIP, non viene pubblicato nulla. - Se il testo assistant più recente è il token silenzioso esatto
NO_REPLY/no_reply, l'output dell'annuncio viene soppresso anche se in precedenza esistevano progressi visibili.
La consegna dipende dalla profondità del richiedente:
- Le sessioni richiedenti di primo livello usano una chiamata
agentdi follow-up con consegna esterna (deliver=true). - Le sessioni sotto-agente richiedenti annidate ricevono un'iniezione interna di follow-up (
deliver=false) così l'orchestratore può sintetizzare i risultati dei figli nella sessione. - Se una sessione sotto-agente richiedente annidata non esiste più, OpenClaw ripiega sul richiedente di quella sessione quando disponibile.
Per le sessioni richiedenti di primo livello, la consegna diretta in modalità completamento prima risolve qualsiasi route di conversazione/thread associata e override dell'hook, poi completa i campi channel-target mancanti dalla route memorizzata della sessione richiedente. Questo mantiene i completamenti nella chat/argomento corretti anche quando l'origine del completamento identifica solo il canale.
L'aggregazione dei completamenti figlio è limitata all'esecuzione corrente del richiedente quando si costruiscono i risultati di completamento annidati, impedendo agli output figlio di esecuzioni precedenti obsolete di trapelare nell'annuncio corrente. Le risposte di annuncio preservano il routing thread/argomento quando disponibile sugli adattatori di canale.
Contesto dell'annuncio
Il contesto dell'annuncio viene normalizzato in un blocco evento interno stabile:
| Campo | Origine |
|---|---|
| Origine | subagent o cron |
| ID sessione | Chiave/id della sessione figlia |
| Tipo | Tipo di annuncio + etichetta dell'attività |
| Stato | Derivato dall'esito runtime (success, error, timeout o unknown) — non dedotto dal testo del modello |
| Contenuto risultato | Ultimo testo assistant visibile dal figlio |
| Follow-up | Istruzione che descrive quando rispondere rispetto a rimanere in silenzio |
Le esecuzioni terminali non riuscite riportano lo stato di errore senza riprodurre il testo di risposta acquisito. L'output tool/toolResult non viene promosso a testo del risultato figlio.
Riga delle statistiche
I payload di annuncio includono una riga di statistiche alla fine (anche quando wrappati):
- Runtime (per esempio
runtime 5m12s). - Uso dei token (input/output/totale).
- Costo stimato quando il prezzo del modello è configurato (
models.providers.*.models[].cost). sessionKey,sessionIde percorso della trascrizione così l'agente main può recuperare la cronologia tramitesessions_historyo ispezionare il file su disco.
I metadati interni sono destinati solo all'orchestrazione; le risposte rivolte all'utente dovrebbero essere riscritte nella normale voce assistant.
Perché preferire sessions_history
sessions_history è il percorso di orchestrazione più sicuro:
- Il richiamo assistant viene prima normalizzato: tag di ragionamento rimossi; scaffolding
<relevant-memories>/<relevant_memories>rimosso; blocchi di payload XML di chiamata strumento in testo semplice (<tool_call>,<function_call>,<tool_calls>,<function_calls>) rimossi, inclusi payload troncati che non si chiudono correttamente; scaffolding tool-call/result declassato e marcatori di contesto storico rimossi; token di controllo del modello trapelati (<|assistant|>, altri ASCII<|...|>, full-width<|...|>) rimossi; XML di chiamata strumento MiniMax malformato rimosso. - Il testo simile a credenziali/token viene redatto.
- I blocchi lunghi possono essere troncati.
- Le cronologie molto grandi possono eliminare righe più vecchie o sostituire una riga sovradimensionata con
[sessions_history omitted: message too large]. - Usa
nextOffsetquando presente per sfogliare all'indietro finestre di trascrizione più vecchie. - L'ispezione della trascrizione grezza su disco è il fallback quando serve la trascrizione completa byte per byte.
Criterio degli strumenti
I sotto-agenti usano prima la stessa pipeline di profilo e criterio degli strumenti del genitore o dell'agente target. Dopo, OpenClaw applica il livello di restrizione del sotto-agente.
Senza un tools.profile restrittivo, i sotto-agenti ricevono tutti gli strumenti
tranne lo strumento di messaggio, gli strumenti di sessione e gli strumenti di
sistema:
sessions_listsessions_historysessions_sendsessions_spawnmessage
Anche qui sessions_history resta una vista di richiamo limitata e sanificata:
non è un dump grezzo della trascrizione.
Quando maxSpawnDepth >= 2, i sotto-agenti orchestratori di profondità 1
ricevono inoltre sessions_spawn, subagents, sessions_list e
sessions_history così possono gestire i propri figli.
Override tramite configurazione
{ 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 è un filtro finale solo-allow. Può restringere il
set di strumenti già risolto, ma non può riaggiungere uno strumento rimosso
da tools.profile. Per esempio, tools.profile: "coding" include
web_search/web_fetch ma non lo strumento browser. Per consentire ai
sotto-agenti con profilo coding di usare l'automazione del browser, aggiungi
browser nella fase del profilo:
{ tools: { profile: "coding", alsoAllow: ["browser"], },}Usa agents.list[].tools.alsoAllow: ["browser"] per agente quando solo un
agente deve ricevere l'automazione del browser.
Concorrenza
I sotto-agenti usano una lane dedicata in coda in-process:
- Nome lane:
subagent - Concorrenza:
agents.defaults.subagents.maxConcurrent(predefinito8)
Liveness e ripristino
OpenClaw non considera l'assenza di endedAt come prova permanente che un
sotto-agente sia ancora vivo. Le esecuzioni non terminate più vecchie della
finestra di esecuzione obsoleta smettono di contare come attive/in sospeso in
/subagents list, nei riepiloghi di stato, nel gating di completamento dei
discendenti e nei controlli di concorrenza per sessione.
Dopo un riavvio del Gateway, le esecuzioni ripristinate obsolete e non terminate
vengono eliminate a meno che la loro sessione figlia sia marcata
abortedLastRun: true. Quelle sessioni figlie interrotte dal riavvio restano
recuperabili tramite il flusso di recupero orfani dei sotto-agenti, che invia un
messaggio sintetico di ripresa prima di cancellare il marcatore di interruzione.
Il recupero automatico dopo riavvio è limitato per sessione figlia. Se lo stesso
figlio sotto-agente viene accettato ripetutamente per il recupero orfani dentro
la finestra rapida di nuovo blocco, OpenClaw persiste una tombstone di recupero
su quella sessione e smette di riprenderla automaticamente nei riavvii
successivi. Esegui openclaw tasks maintenance --apply per riconciliare il
record dell'attività, oppure openclaw doctor --fix per cancellare flag di
recupero interrotto obsoleti sulle sessioni con tombstone.
Arresto
- L'invio di
/stopnella chat del richiedente interrompe la sessione del richiedente e arresta qualsiasi esecuzione sotto-agente attiva generata da essa, propagandosi ai figli annidati.
Limitazioni
- L'annuncio dei sotto-agenti è best-effort. Se il gateway si riavvia, il lavoro "annuncia indietro" in sospeso viene perso.
- I sotto-agenti condividono comunque le stesse risorse del processo gateway; considera
maxConcurrentcome una valvola di sicurezza. sessions_spawnè sempre non bloccante: restituisce{ status: "accepted", runId, childSessionKey }immediatamente.- Il contesto del sotto-agente inietta solo
AGENTS.mdeTOOLS.md(nessunSOUL.md,IDENTITY.md,USER.md,MEMORY.md,HEARTBEAT.mdoBOOTSTRAP.md). I sotto-agenti nativi Codex seguono lo stesso confine:TOOLS.mdresta nelle istruzioni del thread Codex ereditate, mentre i file persona, identità e utente solo del genitore vengono iniettati come istruzioni di collaborazione limitate al turno così i figli non li clonano. - La profondità massima di annidamento è 5 (intervallo
maxSpawnDepth: 1–5). La profondità 2 è consigliata per la maggior parte dei casi d'uso. maxChildrenPerAgentlimita i figli attivi per sessione (predefinito5, intervallo1–20).