Sub-Agentes
Los sub-agentes son ejecuciones de agentes en segundo plano generadas desde una ejecución de agente existente. Se ejecutan en su propia sesión (agent:<agentId>:subagent:<uuid>) y, al finalizar, anuncian su resultado de vuelta al canal de chat del solicitante.
Comando de barra
Usa /subagents para inspeccionar o controlar las ejecuciones de sub-agentes para la sesión actual:
/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>]
Controles de vinculación de hilos: Estos comandos funcionan en canales que admiten vinculaciones persistentes de hilos. Consulta Canales compatibles con hilos más abajo.
/focus <subagent-label|session-key|session-id|session-label>/unfocus/agents/session idle <duration|off>/session max-age <duration|off>
/subagents info muestra metadatos de la ejecución (estado, marcas de tiempo, id de sesión, ruta de la transcripción, limpieza).
Comportamiento de generación
/subagents spawn inicia un sub-agente en segundo plano como un comando de usuario, no como un retransmisor interno, y envía una única actualización de finalización al chat del solicitante cuando la ejecución termina.
- El comando de generación es no bloqueante; devuelve un id de ejecución inmediatamente.
- Al completarse, el sub-agente anuncia un mensaje de resumen/resultado de vuelta al canal de chat del solicitante.
- Para generaciones manuales, la entrega es resistente:
- OpenClaw intenta primero la entrega directa
agentcon una clave de idempotencia estable. - Si la entrega directa falla, recurre al enrutamiento por cola.
- Si el enrutamiento por cola tampoco está disponible, el anuncio se reintenta con un retroceso exponencial corto antes de la renuncia final.
- OpenClaw intenta primero la entrega directa
- La transferencia de finalización a la sesión del solicitante es un contexto interno generado en tiempo de ejecución (no texto escrito por el usuario) e incluye:
Result(texto de respuesta delassistant, o el últimotoolResultsi la respuesta del asistente está vacía)Status(completed successfully/failed/timed out/unknown)- estadísticas compactas de tiempo de ejecución/tokens
- una instrucción de entrega que le dice al agente solicitante que reescriba con la voz normal del asistente (no reenviar metadatos internos en bruto)
--modely--thinkinganulan los valores predeterminados para esa ejecución específica.- Usa
info/logpara inspeccionar detalles y salida después de la finalización. /subagents spawnes el modo de un solo uso (mode: "run"). Para sesiones persistentes vinculadas a hilos, usasessions_spawnconthread: trueymode: "session".- Para sesiones del arnés ACP (Codex, Claude Code, Gemini CLI), usa
sessions_spawnconruntime: "acp"y consulta Agentes ACP.
Objetivos principales:
- Paralelizar trabajos de "investigación / tarea larga / herramienta lenta" sin bloquear la ejecución principal.
- Mantener los sub-agentes aislados por defecto (separación de sesión + aislamiento opcional).
- Mantener la superficie de herramientas difícil de usar mal: los sub-agentes no obtienen herramientas de sesión por defecto.
- Soportar profundidad de anidación configurable para patrones de orquestador.
Nota de coste: cada sub-agente tiene su propio contexto y uso de tokens. Para tareas pesadas o repetitivas, configura un modelo más barato para los sub-agentes y mantén tu agente principal en un modelo de mayor calidad. Puedes configurar esto mediante agents.defaults.subagents.model o anulaciones por agente.
Herramienta
Usa sessions_spawn:
- Inicia una ejecución de sub-agente (
deliver: false, carril global:subagent) - Luego ejecuta un paso de anuncio y publica la respuesta del anuncio en el canal de chat del solicitante
- Modelo predeterminado: hereda del llamador a menos que configures
agents.defaults.subagents.model(o por agenteagents.list[].subagents.model); unsessions_spawn.modelexplícito aún prevalece. - Nivel de pensamiento predeterminado: hereda del llamador a menos que configures
agents.defaults.subagents.thinking(o por agenteagents.list[].subagents.thinking); unsessions_spawn.thinkingexplícito aún prevalece. - Tiempo de espera de ejecución predeterminado: si se omite
sessions_spawn.runTimeoutSeconds, OpenClaw usaagents.defaults.subagents.runTimeoutSecondscuando está configurado; de lo contrario, recurre a0(sin tiempo de espera).
Parámetros de la herramienta:
task(requerido)label?(opcional)agentId?(opcional; generar bajo otro id de agente si está permitido)model?(opcional; anula el modelo del sub-agente; los valores no válidos se omiten y el sub-agente se ejecuta en el modelo predeterminado con una advertencia en el resultado de la herramienta)thinking?(opcional; anula el nivel de pensamiento para la ejecución del sub-agente)runTimeoutSeconds?(por defectoagents.defaults.subagents.runTimeoutSecondscuando está configurado, de lo contrario0; cuando se establece, la ejecución del sub-agente se aborta después de N segundos)thread?(por defectofalse; cuando estrue, solicita la vinculación de hilo del canal para esta sesión de sub-agente)mode?(run|session)- el valor por defecto es
run - si
thread: truey se omitemode, el valor por defecto se convierte ensession mode: "session"requierethread: true
- el valor por defecto es
cleanup?(delete|keep, por defectokeep)sandbox?(inherit|require, por defectoinherit;requirerechaza la generación a menos que el tiempo de ejecución del hijo objetivo esté aislado)sessions_spawnno acepta parámetros de entrega por canal (target,channel,to,threadId,replyTo,transport). Para la entrega, usamessage/sessions_senddesde la ejecución generada.
Sesiones vinculadas a hilos
Cuando las vinculaciones de hilos están habilitadas para un canal, un sub-agente puede permanecer vinculado a un hilo para que los mensajes de seguimiento del usuario en ese hilo sigan enrutándose a la misma sesión de sub-agente.
Canales compatibles con hilos
- Discord (actualmente el único canal compatible): admite sesiones de subagentes vinculadas a hilos persistentes (
sessions_spawnconthread: true), controles manuales de hilos (/focus,/unfocus,/agents,/session idle,/session max-age), y claves del adaptadorchannels.discord.threadBindings.enabled,channels.discord.threadBindings.idleHours,channels.discord.threadBindings.maxAgeHours, ychannels.discord.threadBindings.spawnSubagentSessions.
Flujo rápido:
- Genera con
sessions_spawnusandothread: true(y opcionalmentemode: "session"). - OpenClaw crea o vincula un hilo a ese objetivo de sesión en el canal activo.
- Las respuestas y mensajes de seguimiento en ese hilo se enrutan a la sesión vinculada.
- Usa
/session idlepara inspeccionar/actualizar la auto-desvinculación por inactividad y/session max-agepara controlar el límite máximo. - Usa
/unfocuspara desvincular manualmente.
Controles manuales:
/focus <target>vincula el hilo actual (o crea uno) a un objetivo de sub-agente/sesión./unfocuselimina la vinculación para el hilo vinculado actual./agentslista las ejecuciones activas y el estado de vinculación (thread:<id>ounbound)./session idley/session max-agesolo funcionan para hilos vinculados enfocados.
Interruptores de configuración:
- Valor predeterminado global:
session.threadBindings.enabled,session.threadBindings.idleHours,session.threadBindings.maxAgeHours - Las claves de anulación por canal y de auto-vinculación de generación son específicas del adaptador. Consulta Canales compatibles con hilos más arriba.
Consulta Referencia de configuración y Comandos de barra para detalles actuales del adaptador. Lista de permitidos:
agents.list[].subagents.allowAgents: lista de ids de agentes que pueden ser objetivo medianteagentId(["*"]para permitir cualquiera). Por defecto: solo el agente solicitante.- Guardia de herencia de aislamiento: si la sesión del solicitante está aislada,
sessions_spawnrechaza objetivos que se ejecutarían sin aislamiento.
Descubrimiento:
- Usa
agents_listpara ver qué ids de agente están actualmente permitidos parasessions_spawn.
Auto-archivado:
- Las sesiones de sub-agentes se archivan automáticamente después de
agents.defaults.subagents.archiveAfterMinutes(por defecto: 60). - El archivo usa
sessions.deletey renombra la transcripción a*.deleted.<timestamp>(misma carpeta). cleanup: "delete"archiva inmediatamente después del anuncio (aún mantiene la transcripción mediante renombrado).- El auto-archivado es de mejor esfuerzo; los temporizadores pendientes se pierden si el gateway se reinicia.
runTimeoutSecondsno auto-archiva; solo detiene la ejecución. La sesión permanece hasta el auto-archivado.- El auto-archivado se aplica igualmente a sesiones de profundidad 1 y profundidad 2.
Sub-Agentes Anidados
Por defecto, los sub-agentes no pueden generar sus propios sub-agentes (maxSpawnDepth: 1). Puedes habilitar un nivel de anidación configurando maxSpawnDepth: 2, lo que permite el patrón de orquestador: principal → sub-agente orquestador → sub-sub-agentes trabajadores.
Cómo habilitar
{
agents: {
defaults: {
subagents: {
maxSpawnDepth: 2, // permitir que los sub-agentes generen hijos (por defecto: 1)
maxChildrenPerAgent: 5, // máximo de hijos activos por sesión de agente (por defecto: 5)
maxConcurrent: 8, // límite global de concurrencia en el carril (por defecto: 8)
runTimeoutSeconds: 900, // tiempo de espera predeterminado para sessions_spawn cuando se omite (0 = sin tiempo de espera)
},
},
},
}
Niveles de profundidad
| Profundidad | Forma de la clave de sesión | Rol | ¿Puede generar? |
|---|---|---|---|
| 0 | agent:<id>:main | Agente principal | Siempre |
| 1 | agent:<id>:subagent:<uuid> | Sub-agente (orquestador cuando se permite profundidad 2) | Solo si maxSpawnDepth >= 2 |
| 2 | agent:<id>:subagent:<uuid>:subagent:<uuid> | Sub-sub-agente (trabajador hoja) | Nunca |
Cadena de anuncio
Los resultados fluyen de vuelta hacia arriba en la cadena:
- El trabajador de profundidad 2 termina → anuncia a su padre (orquestador de profundidad 1)
- El orquestador de profundidad 1 recibe el anuncio, sintetiza resultados, termina → anuncia al principal
- El agente principal recibe el anuncio y lo entrega al usuario
Cada nivel solo ve anuncios de sus hijos directos.
Política de herramientas por profundidad
- Profundidad 1 (orquestador, cuando
maxSpawnDepth >= 2): Obtienesessions_spawn,subagents,sessions_list,sessions_historypara que pueda gestionar a sus hijos. Otras herramientas de sesión/sistema permanecen denegadas. - Profundidad 1 (hoja, cuando
maxSpawnDepth == 1): Sin herramientas de sesión (comportamiento predeterminado actual). - Profundidad 2 (trabajador hoja): Sin herramientas de sesión —
sessions_spawnsiempre está denegada en profundidad 2. No puede generar más hijos.
Límite de generación por agente
Cada sesión de agente (en cualquier profundidad) puede tener como máximo maxChildrenPerAgent (por defecto: 5) hijos activos a la vez. Esto evita una proliferación descontrolada desde un solo orquestador.
Parada en cascada
Detener un orquestador de profundidad 1 detiene automáticamente a todos sus hijos de profundidad 2:
/stopen el chat principal detiene todos los agentes de profundidad 1 y se propaga en cascada a sus hijos de profundidad 2./subagents kill <id>detiene un sub-agente específico y se propaga en cascada a sus hijos./subagents kill alldetiene todos los sub-agentes del solicitante y se propaga en cascada.
Autenticación
La autenticación de sub-agentes se resuelve por id de agente, no por tipo de sesión:
- La clave de sesión del sub-agente es
agent:<agentId>:subagent:<uuid>. - El almacén de autenticación se carga desde el
agentDirde ese agente. - Los perfiles de autenticación del agente principal se fusionan como respaldo; los perfiles del agente anulan los perfiles principales en conflictos.
Nota: la fusión es aditiva, por lo que los perfiles principales siempre están disponibles como respaldo. La autenticación completamente aislada por agente aún no es compatible.
Anuncio
Los sub-agentes informan de vuelta mediante un paso de anuncio:
- El paso de anuncio se ejecuta dentro de la sesión del sub-agente (no en la sesión del solicitante).
- Si el sub-agente responde exactamente
ANNOUNCE_SKIP, no se publica nada. - De lo contrario, la entrega depende de la profundidad del solicitante:
- las sesiones solicitantes de nivel superior usan una llamada
agentde seguimiento con entrega externa (deliver=true) - las sesiones solicitantes de subagentes anidadas reciben una inyección interna de seguimiento (
deliver=false) para que el orquestador pueda sintetizar los resultados de los hijos en sesión - si una sesión solicitante de subagente anidada ha desaparecido, OpenClaw recurre al solicitante de esa sesión cuando está disponible
- las sesiones solicitantes de nivel superior usan una llamada
- La agregación de finalización de hijos está limitada a la ejecución del solicitante actual al construir hallazgos de finalización anidados, evitando que salidas de hijos de ejecuciones anteriores obsoletas se filtren en el anuncio actual.
- Las respuestas de anuncio preservan el enrutamiento de hilo/tema cuando está disponible en los adaptadores de canal.
- El contexto del anuncio se normaliza a un bloque de evento interno estable:
- fuente (
subagentocron) - clave/id de sesión del hijo
- tipo de anuncio + etiqueta de tarea
- línea de estado derivada del resultado del tiempo de ejecución (
success,error,timeout, ounknown) - contenido del resultado del paso de anuncio (o
(no output)si falta) - una instrucción de seguimiento que describe cuándo responder vs. permanecer en silencio
- fuente (
Statusno se infiere de la salida del modelo; proviene de señales de resultado del tiempo de ejecución.
Las cargas útiles de anuncio incluyen una línea de estadísticas al final (incluso cuando están envueltas):
- Tiempo de ejecución (ej.,
runtime 5m12s) - Uso de tokens (entrada/salida/total)
- Coste estimado cuando la fijación de precios del modelo está configurada (
models.providers.*.models[].cost) sessionKey,sessionId, y ruta de la transcripción (para que el agente principal pueda obtener el historial mediantesessions_historyo inspeccionar el archivo en disco)- Los metadatos internos están destinados solo para orquestación; las respuestas orientadas al usuario deben reescribirse con la voz normal del asistente.
Política de Herramientas (herramientas de sub-agentes)
Por defecto, los sub-agentes obtienen todas las herramientas excepto las herramientas de sesión y las herramientas del sistema:
sessions_listsessions_historysessions_sendsessions_spawn
Cuando maxSpawnDepth >= 2, los sub-agentes orquestadores de profundidad 1 reciben adicionalmente sessions_spawn, subagents, sessions_list, y sessions_history para que puedan gestionar a sus hijos. Anula mediante configuración:
{
agents: {
defaults: {
subagents: {
maxConcurrent: 1,
},
},
},
tools: {
subagents: {
tools: {
// deny gana
deny: ["gateway", "cron"],
// si allow está configurado, se convierte en solo permitir (deny aún gana)
// allow: ["read", "exec", "process"]
},
},
},
}
Concurrencia
Los sub-agentes usan un carril de cola en proceso dedicado:
- Nombre del carril:
subagent - Concurrencia:
agents.defaults.subagents.maxConcurrent(por defecto8)
Detención
- Enviar
/stopen el chat del solicitante aborta la sesión del solicitante y detiene cualquier ejecución de sub-agente activa generada desde ella, propagándose en cascada a los hijos anidados. /subagents kill <id>detiene un sub-agente específico y se propaga en cascada a sus hijos.
Limitaciones
- El anuncio de sub-agente es de mejor esfuerzo. Si el gateway se reinicia, el trabajo pendiente de "anunciar de vuelta" se pierde.
- Los sub-agentes aún comparten los mismos recursos del proceso del gateway; trata
maxConcurrentcomo una válvula de seguridad. sessions_spawnsiempre es no bloqueante: devuelve{ status: "accepted", runId, childSessionKey }inmediatamente.- El contexto del sub-agente solo inyecta
AGENTS.md+TOOLS.md(sinSOUL.md,IDENTITY.md,USER.md,HEARTBEAT.md, oBOOTSTRAP.md). - La profundidad máxima de anidación es 5 (rango de
maxSpawnDepth: 1–5). Se recomienda la profundidad 2 para la mayoría de los casos de uso. maxChildrenPerAgentlimita los hijos activos por sesión (por defecto: 5, rango: 1–20).