Delegar trabajo a subagentes en el Claude Agent SDK
Un subagente es un agente hijo con su propio contexto aislado al que un agente padre puede delegar una subtarea.
Busca en todas las páginas de la documentación
Un subagente es un agente hijo con su propio contexto aislado al que un agente padre puede delegar una subtarea.
En lugar de que un solo agente intente mantener una tarea completa, incluyendo cada paso intermedio de cada subproblema, en una única ventana de contexto, un padre puede delegar piezas autocontenidas a subagentes y solo recibir sus resultados finales.
Los subagentes existen por dos razones relacionadas: aislamiento de contexto y paralelismo.
El aislamiento significa que el razonamiento exploratorio de un subagente, los intentos fallidos y las llamadas a herramientas intermedias nunca contaminan el contexto del padre; el padre ve un resultado limpio.
El paralelismo significa que los subagentes independientes pueden ejecutarse de forma concurrente, ya que ninguno depende del estado intermedio del otro.
Esta página cubre cómo definir subagentes, cuándo una tarea es un buen candidato para la delegación y cómo fluyen el ámbito de las herramientas y los resultados entre el padre y el hijo.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
from claude_agent_sdk import query, AgentOptions, SubagentConfig
options = AgentOptions(
allowed_tools=["file_edit", "bash"],
subagents=[
SubagentConfig(
name="frontend-reviewer",
description="Revisa los cambios en componentes React en cuanto a corrección y estilo.",
allowed_tools=["file_edit"],
),
SubagentConfig(
name="backend-reviewer",
description="Revisa los cambios en rutas de API en cuanto a corrección y seguridad.",
allowed_tools=["file_edit", "bash"],
),
],
)
async for message in query(
prompt="Revisa los cambios de frontend y backend de este PR utilizando los dos subagentes revisores.",
options=options,
):
print(message)Cuándo usar esto:
import asyncio
from claude_agent_sdk import query, AgentOptions, SubagentConfig
async def audit_monorepo_packages(repo_path: str, packages: list[str]) -> None:
subagents = [
SubagentConfig(
name=f"audit-{pkg}",
description=f"Audita el paquete {pkg} en busca de dependencias obsoletas y errores de lint.",
allowed_tools=["bash", "file_edit"],
tool_config={
"bash": {"allowed_commands": ["npm outdated", "npm run lint"]},
"file_edit": {"allowed_paths": [f"packages/{pkg}/**"]},
},
)
for pkg in packages
]
options = AgentOptions(
cwd=repo_path,
allowed_tools=["file_edit"],
subagents=subagents,
)
prompt = (
f"Utiliza los subagentes de auditoría para cada uno de {packages} para comprobar si hay dependencias obsoletas "
"y errores de lint, luego escribe un resumen combinado en AUDIT.md "
"en la raíz del repositorio con una sección por paquete."
)
async for message in query(prompt=prompt, options=options):
if message.get("type") == "text":
print(message["text"], end="", flush=True)
elif message.get("type") == "subagent_result":
print(f"\n[{message['subagent_name']} finalizado]")
asyncio.run(audit_monorepo_packages("/repo", ["billing", "auth", "search"]))Lo que esto demuestra:
bash y file_edit de cada subagente de forma independiente del padre y entre sí.file_edit para sí mismo, ya que su propio trabajo es solo escribir el resumen combinado.name (nombre), una description (descripción) que el modelo padre utiliza para decidir cuándo invocarlo, y sus propias allowed_tools (herramientas permitidas) / tool_config (configuración de herramientas).| Señal | Favorece | Razón |
|---|---|---|
| La tarea necesita una capacidad más, sin exploración independiente | Añadir una herramienta | Más simple; no se necesita un límite de contexto adicional |
| La tarea es una subtarea autocontenida con su propia exploración | Subagente | Mantiene el ruido exploratorio fuera del contexto del padre |
| Múltiples subtareas similares en entradas independientes | Subagentes (uno por entrada) | Permite la ejecución paralela |
| La subtarea necesita un ámbito de herramientas más estrecho o diferente que el padre | Subagente | El ámbito de las herramientas es por subagente, no compartido |
# La descripción de un subagente es lo que el modelo padre lee para decidir
# cuándo invocarlo; trátala como una descripción de herramienta, no como un comentario.
SubagentConfig(
name="test-runner",
description="Ejecuta el conjunto de pruebas del proyecto e informa solo de las pruebas fallidas.",
allowed_tools=["bash"],
tool_config={"bash": {"allowed_commands": ["pytest"]}},
)| Parámetro | Tipo | Descripción |
|---|---|---|
name | str | Identificador que el padre utiliza para invocar este subagente |
description | str | Indica al modelo padre cuándo se aplica este subagente |
allowed_tools | list[str] | Ámbito de herramientas para este subagente, independiente del padre |
tool_config | dict | Ámbito por herramienta para las herramientas de este subagente |
allowed_tools del padre en cada subagente anula el propósito de limitar el trabajo de forma estrecha. Solución: limita cada subagente solo a lo que su trabajo específico requiere.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| Un solo agente con más herramientas | La tarea necesita una capacidad más, no exploración independiente | La subtarea inundaría de lo contrario el contexto con razonamiento irrelevante |
| Llamadas a herramientas secuenciales en un solo agente | Los pasos dependen genuinamente de la salida de otros | Los pasos son independientes y podrían ejecutarse de forma concurrente |
Llamadas query() de nivel superior separadas | Las subtareas no están relacionadas entre sí, no hay una tarea padre compartida | Las subtareas forman parte de una tarea padre coherente que necesita un resultado combinado |
allowed_tools del padre.De la misma manera que decide llamar a cualquier herramienta: el modelo lee la description (descripción) del subagente junto con la conversación y elige invocarlo cuando la tarea coincide.
Sí, cuando son independientes entre sí. Los subagentes cuyas tareas no dependen de la salida de otros pueden ser enviados y esperados de forma concurrente.
No por defecto; normalmente comienza con un contexto fresco para su propia invocación. Pasa explícitamente cualquier contexto necesario en el prompt que le des al subagente.
El modelo de subagentes del SDK admite la anidación en principio, ya que cada subagente ejecuta su propio bucle interno de uso de herramientas, pero la anidación profunda añade sobrecarga real y dificultad de depuración; la mayoría de las tareas se benefician de un solo nivel.
Las que le hayas asignado a través de sus propias allowed_tools y tool_config, independientemente del ámbito de herramientas del padre; a un subagente no se le conceden automáticamente las herramientas del padre.
Una llamada a herramienta ejecuta una acción discreta y devuelve un resultado. Una invocación de subagente ejecuta un bucle interno completo de uso de herramientas, llamando potencialmente a varias herramientas y razonando a través de varios pasos, antes de devolver un resultado final.
Cuando es una acción única y simple que una llamada directa a herramienta manejaría igual de bien; la sobrecarga de un contexto fresco y un bucle interno no vale la pena para pasos triviales.
El fallo (o un resultado incompleto/de error) vuelve al padre como la observación de esa invocación, y el propio bucle del padre tiene que decidir cómo proceder, de la misma manera que manejaría cualquier llamada a herramienta fallida.
Los límites de concurrencia son una preocupación a nivel de aplicación; tú controlas cuántas invocaciones de subagentes envías a la vez en tu propio código de orquestación alrededor de query().
Versiones de pila: Escrito contra la línea de modelos de Claude actual a partir de ~junio de 2026 - Claude Fable 5, Claude Opus 4.8, Claude Sonnet 5 (el predeterminado) y Claude Haiku 4.5 - y el Claude Agent SDK (última versión, Python y TypeScript). Los nombres de los modelos, las versiones del SDK y los precios cambian rápidamente; verifica los detalles actuales en platform.claude.com/docs antes de confiar en ellos.
Revisado por Chris St. John·Última actualización: 16 jul 2026