Presentamos los subagentes dinámicos en Deep Agents

@sydneyrunkle
INGLÉShace 2 días · 29 jun 2026
138K
300
52
12
555

TL;DR

Sydney Runkle detalla el cambio de la invocación de herramientas a la orquestación programática en Deep Agents, permitiendo que los modelos escriban scripts que gestionan flujos de trabajo complejos de subagentes en múltiples fases.

A medida que los agentes asumen tareas más ambiciosas, tienen dificultades para:

  1. Completar trabajo de manera confiable a escala
  2. Gestionar su propio contexto

Hemos estado experimentando con cómo manejar estos desafíos en forma de lo que llamamos subagentes dinámicos: en lugar de emitir tareas de subagentes a través de llamadas genéricas a herramientas, el agente escribe un script corto que impulsa la ejecución del subagente. Esto significa que los modelos pueden confiar en patrones de código en los que son buenos (como bucles, bifurcaciones o concurrencia) para escribir lógica de orquestación adaptada a la tarea.

¿Por qué subagentes dinámicos?

Deep Agents ya admite subagentes. Aíslan el contexto, permiten que el agente principal delegue unidades discretas de trabajo y mantienen los resultados intermedios fuera de la ventana de contexto principal. Entonces, ¿por qué necesitamos subagentes dinámicos?

Con los subagentes normales, se llaman uno a la vez, invocándolos directamente el modelo principal. Eso funciona a pequeña escala. Se rompe cuando necesitas generar cientos de subagentes, o cuando la lógica de orquestación es condicional o multifase.

Los subagentes dinámicos resuelven esto con orquestación programática. En lugar de hacer llamadas a herramientas turno por turno, el agente escribe un script corto que orquesta y llama a subagentes, y lo ejecuta en un intérprete ligero.

El ejemplo canónico: un subagente por cada página de un documento de 300 páginas. En lugar de llamar a la herramienta de subagente 300 veces, el agente escribe un bucle:

javascript
1const results = await Promise.all(pages.map(page =>
2 task({ description: `Summarize page ${page.number}`, subagentType: "summarizer" })
3));

Esto desbloquea dos cosas que la orquestación basada en llamadas a herramientas no puede ofrecer de manera confiable:

Cobertura determinista a escala. Sin estructura, los agentes toman decisiones subjetivas sobre el alcance, revisando 75 de 500 ítems y dando por terminado. Un bucle de envío no lo hace. La cobertura se convierte en una garantía estructural, no en un problema de ingeniería de prompts.

Orquestación compleja confiable. Escribir la orquestación como código es más confiable que hacer que el modelo la reproduzca como una secuencia de llamadas a herramientas, especialmente para expansión + síntesis, tuberías multifase o bifurcación condicional.

Esta es la misma idea detrás de los flujos de trabajo en Claude Code y los Modelos de Lenguaje Recursivos (RLMs): un modelo escribe código, y ese código envía más agentes.

Inicio rápido

Los subagentes dinámicos requieren dos cosas: subagentes a los que enviar trabajo, y un intérprete de código: un entorno de ejecución seguro y ligero donde el modelo escribe y ejecuta código de orquestación. Deep Agents incluye un intérprete de código opcional basado en QuickJS. Para usarlo, instala el paquete middleware de QuickJS, luego pasa CodeInterpreterMiddleware a través del argumento middleware en create_deep_agent.

bash
1pip install -U "deepagents[quickjs]"
python
1from deepagents import create_deep_agent
2from langchain_quickjs import CodeInterpreterMiddleware
3
4agent = create_deep_agent(
5 model="openai:gpt-5.5",
6 middleware=[CodeInterpreterMiddleware()],
7)

Deep Agents viene con un subagente de propósito general integrado, por lo que ya existe un perfil de subagente general que se puede usar en flujos de trabajo. Para flujos de trabajo especializados, configura subagentes personalizados con sus propios nombres, descripciones y prompts de sistema: los nombres y las descripciones son cómo el agente sabe qué rol usar.

Para activar subagentes dinámicos, indícale a tu agente la palabra "workflow", así:

python
1result = await agent.ainvoke({
2 "messages": [{"role": "user", "content": "Run a workflow that reviews every file in src/routes/ and summarizes the top risks."}]
3})

Uso con un agente de código

La forma más rápida de probar subagentes dinámicos es con dcode, nuestro agente de código de terminal construido con Deep Agent. Viene con el intérprete de código habilitado, así que no hay nada que configurar: los subagentes dinámicos funcionan de inmediato.

Instala

bash
1curl -LsSf https://langch.in/dcode | bash

Ejecuta

bash
1dcode

Para activar subagentes dinámicos, solo pide un “workflow”. En lugar de hacer el trabajo directamente o intentar gestionar expansiones de subagentes con su herramienta de tarea nativa, el agente escribe un script de orquestación que llama al global task() incorporado y lo ejecuta en el intérprete de código. Por ejemplo: “ejecuta un workflow para revisar cada archivo en src/ en busca de inyección SQL.”

A medida que se generan subagentes, dcode los muestra en vivo en el panel de subagentes dinámicos agrupados en fases por envío.

Sydney Runkle - inline image

Puedes probar esto más rápido con dcode, pero también puedes usarlo en tu herramienta preferida a través de ACP (como Zed)

Cómo funciona

Al agente se le proporciona una herramienta eval. Escribe JavaScript que se ejecuta de forma segura dentro del intérprete. Cuando se configuran subagentes, el intérprete expone un global task() incorporado que los envía desde el código. Según la tarea en cuestión, el modelo escribe diferentes códigos — un bucle, una bifurcación, un Promise.all — y el intérprete lo ejecuta de manera determinista.

Sydney Runkle - inline image

task() toma una descripción, un subagentType y un responseSchema opcional — cuando se proporciona, el resultado ya es un objeto tipado, listo para filtrar o pasar al siguiente paso.

javascript
1const result = await task({
2 description: "Revisa src/auth/login.ts por problemas de seguridad.",
3 subagentType: "reviewer",
4 responseSchema: {
5 type: "object",
6 properties: {
7 severity: { type: "string", enum: ["high", "medium", "low"] },
8 issues: { type: "array", items: { type: "string" } },
9 },
10 },
11});
12
13const critical = result.severity === "high" ? result.issues : [];
14critical; // el modelo ve la última línea

Para más información, consulta Subagentes programáticos e Intérpretes en la documentación.

Patrones comunes de orquestación

Los flujos de trabajo dinámicos de Anthropic popularizaron un conjunto de patrones de orquestación para el trabajo paralelo de agentes. No son características que se activan. Son formas que surgen naturalmente del trabajo, y el agente se adapta a una diferente a medida que la tarea cambia. La tabla a continuación mapea cada forma al tipo de trabajo que encaja.

Sydney Runkle - inline image

A continuación, profundizaremos en cómo funciona cada uno en Deep Agents, con trazas en vivo. También preparamos un video explicando estos seis patrones, que puedes ver aquí.

Clasificar y actuar

Los ítems se clasifican primero, luego cada ítem es manejado por un subagente especializado según su clasificación. Esto permite procesar entradas mixtas donde diferentes ítems necesitan diferentes conocimientos.

Sydney Runkle - inline image

Casos de uso: Triaje de tickets de soporte, registros de errores, comentarios de usuarios, o cualquier lote de ítems que necesiten un manejo diferente según su tipo.

Ejemplo: triaje de un backlog de tickets de soporte. El agente lee los tickets y clasifica cada uno como error, solicitud de funcionalidad o pregunta. Los errores van a un investigador de errores, las solicitudes de funcionalidad a un analista de funcionalidades, y las preguntas a un respondedor de soporte. El resultado es un resumen agrupado por categoría.

Ver la traza aquí.

Expansión y síntesis

El agente envía el mismo tipo de trabajo a muchos ítems en paralelo, luego combina los resultados.

Sydney Runkle - inline image

Casos de uso: Revisión de código en un directorio, análisis de un lote de documentos, procesamiento de archivos de registro, ejecución de la misma verificación en muchos servicios.

Ejemplo: una revisión de seguridad por archivo en un árbol de fuente. El agente descubre cada archivo TypeScript en src/ y envía un revisor de seguridad por archivo en paralelo. Luego fusiona los resultados en un solo informe priorizado con calificaciones de gravedad y las líneas que deben cambiar.

Ver la traza aquí.

Verificación adversarial

Un patrón de dos pasadas. La primera pasada produce hallazgos. La segunda pasada envía cada hallazgo a verificadores independientes, y solo se conservan los hallazgos que sobreviven al acuerdo. Esto reduce falsos positivos cuando la confianza importa más que la velocidad.

Sydney Runkle - inline image

Casos de uso: Auditorías de seguridad donde los falsos positivos son costosos, verificaciones de cumplimiento, cualquier revisión donde necesites alta confianza en los hallazgos.

Ejemplo: una auditoría de seguridad donde los falsos positivos son inaceptables. Un auditor lanza una red amplia en busca de vulnerabilidades potenciales, luego cada hallazgo se entrega a un verificador independiente que lee el código de nuevo y devuelve un veredicto de CONFIRMADO o REFUTADO. Solo los hallazgos confirmados sobreviven al informe final.

Ver la traza aquí.

Generar y filtrar

Múltiples subagentes generan soluciones independientes al mismo problema. El agente compara, puntúa y filtra los resultados en código, conservando solo los mejores.

Sydney Runkle - inline image

Casos de uso: Propuestas de arquitectura, estrategias de refactorización, variaciones de contenido, cualquier tarea donde explorar múltiples opciones antes de comprometerse produzca un mejor resultado.

Ejemplo: rediseños competitivos de rate-limiter, clasificados. El agente tiene un arquitecto para producir varios rediseños independientes de rate-limiter.ts, cada uno escrito en su propio archivo para que no se sobrescriban entre sí. Luego los puntúa según corrección bajo ráfagas, soporte multi-instancia y complejidad. El más fuerte gana, con una justificación de por qué.

Ver la traza aquí.

Torneo

Las variaciones se comparan cara a cara por un subagente juez, y los ganadores avanzan a través de rondas eliminatorias.

Sydney Runkle - inline image

Casos de uso: Optimización bajo criterios subjetivos, selección de estilo, elección entre implementaciones competidoras.

Ejemplo: un bracket por pares sobre reescrituras de un manejador createOrder desordenado. Varios escritores producen cada uno una reescritura candidata con diferentes prioridades, luego un juez las compara cara a cara, avanzando ganadores ronda por ronda hasta que un campeón se destaca. Vuelve con el razonamiento del juez.

Ver la traza aquí.

Bucle hasta terminar

El agente ejecuta un bucle de descubrimiento, deduplicando contra lo que ya ha encontrado, hasta que no aparezcan nuevos resultados. Útil cuando el alcance del trabajo no se conoce de antemano.

Sydney Runkle - inline image

Casos de uso: Búsqueda exhaustiva, detección de código muerto, auditorías de dependencias, cualquier barrido donde quieras completitud en lugar de un número fijo de resultados.

Ejemplo: un barrido de seguridad basado en pasadas. El agente ejecuta una pasada de escaneo, inspecciona lo que encontró en el código, y solo inicia otra pasada si la anterior generó nuevos problemas. Se detiene cuando una pasada no encuentra nada nuevo. Reporta los hallazgos consolidados y cuántas pasadas tomó.

Ver la traza aquí.

Conclusión

Los subagentes dinámicos son cómo le das a los agentes más autonomía y mayor confiabilidad. El código maneja la cobertura y el contexto intermedio, y el modelo sigue haciendo el trabajo pesado de juicio. Los patrones anteriores son un punto de partida. En la práctica, los agentes los componen y mezclan según lo que demande la tarea.

Esta es la idea del Modelo de Lenguaje Recursivo en su forma más simple. Un agente que escribe código, y ese código envía más agentes. Es un agente llamándose a sí mismo recursivamente y no está limitado por una ventana de contexto ni encajonado en un flujo de trabajo fijo. Un agente puede descomponer el problema tanto como sea necesario y reensamblar las piezas en la forma que mejor se ajuste. Los patrones de orquestación destacados anteriormente son vislumbres tempranos de lo que es posible, pero el techo solo seguirá elevándose a medida que los modelos mejoren en escribir código.

Subagentes dinámicos es cómo Deep Agents pone esto en tus manos hoy. Comienza agregando un intérprete de código a tu agente, o recurre a dcode donde los subagentes dinámicos funcionan de inmediato.

Agradecimientos

Coescrito por @colifran_ y @huntlovell. Gracias a @hwchase17, @masondrxy y @chester_curme por su cuidadosa revisión.

Save to YouMind

Use YouMind to read viral articles deeply

Save the source, ask focused questions, summarize the argument, and turn a viral article into reusable notes in one AI workspace.

Explore YouMind

Más patrones por descifrar

Artículos virales recientes

Explorar más artículos virales