Instala el paquete Python: pip install claude-agent-sdk.
Configura una clave API en tu entorno: export ANTHROPIC_API_KEY=sk-ant-....
Estos ejemplos asumen que ya conoces la estructura de una única llamada query(); si no es así, empieza primero con los conceptos básicos del SDK de Claude Agent.
"Orquestación" aquí significa código de aplicación (o un agente de nivel superior) que decide cuándo llamar a subagentes y cómo combinar sus resultados, no ninguna característica individual del SDK en sí.
El orquestador más pequeño posible: delega una tarea a un único subagente y lee su resultado.
import asynciofrom claude_agent_sdk import query, AgentOptions, SubagentConfigasync def main(): options = AgentOptions( allowed_tools=["file_edit"], subagents=[ SubagentConfig( name="changelog-writer", description="Escribe una entrada en CHANGELOG.md a partir de un resumen de diff.", allowed_tools=["file_edit"], ) ], ) async for message in query( prompt="Usa el subagente changelog-writer para añadir una entrada en CHANGELOG.md para este lanzamiento.", options=options, ): if message.get("type") == "subagent_result": print(f"Resultado: {message['result']}")asyncio.run(main())
El orquestador aquí es una única llamada query() de nivel superior; el propio modelo decide invocar al único subagente que tiene.
Este es todo el patrón: un agente orquestador, un trabajador con su propio ámbito y un resultado que se devuelve.
Nada de esto necesita ser más complejo hasta que surja una necesidad real de descomposición o especialización.
Ejecuta una secuencia fija de pasos, cada uno dependiendo del anterior.
import asynciofrom claude_agent_sdk import query, AgentOptionsasync def summarize_then_translate(text: str, language: str) -> str: summary_chunks = [] async for message in query(prompt=f"Resume en tres viñetas:\n\n{
Cada paso es una llamada query() separada cuyo prompt se construye a partir de la salida del paso anterior.
No hay una decisión dinámica aquí sobre qué paso ejecutar a continuación; la secuencia está fijada por el código de llamada.
Esta es una cadena de prompts, el patrón de orquestación más simple, y a menudo todo lo que una tarea necesita cuando sus pasos son siempre los mismos y siempre en el mismo orden.
Un subagente por paquete significa que cada auditoría se ejecuta en su propio contexto, sin estado compartido entre ellos.
Dado que los paquetes no están relacionados, el bucle subyacente puede despachar estas invocaciones de subagente concurrentemente en lugar de serialmente.
Este es el patrón al que recurrir siempre que una tarea sea "haz lo mismo N veces, sobre N entradas independientes".
Evita que un subagente genere sus propios subagentes más allá de un nivel.
from claude_agent_sdk import AgentOptions, SubagentConfigworker = SubagentConfig( name="research-worker", description="Investiga un tema; no puede delegar más.", allowed_tools=["web_search"], # No hay campo `subagents` en el propio worker: no tiene capacidad de delegación # propia, por lo que la profundidad se limita a un nivel aquí.)options =
El orquestador puede delegar a research-worker, pero research-worker no tiene subagentes propios a los que delegar.
Limitar la profundidad de esta manera es una elección de diseño deliberada, no un valor predeterminado del SDK; nada te impide anidar subagentes más si lo configuras.
La profundidad sin límites hace que los costos y los modos de fallo sean mucho más difíciles de razonar a medida que un sistema crece.
Envuelve la invocación de un subagente con un reintento básico en lugar de fallar toda la tarea en un intento fallido.
import asynciofrom claude_agent_sdk import query, AgentOptions, SubagentConfigasync def run_with_retry(prompt: str, options: AgentOptions, attempts: int = 3): last_error = None for attempt in range(attempts): try: results =
Una llamada fallida a un subagente se trata como cualquier otro fallo que se pueda reintentar, no como un caso especial que el orquestador ignora.
El retroceso exponencial entre intentos evita sobrecargar una dependencia inestable inmediatamente después de que falle.
Los sistemas reales también necesitan un límite en el número total de intentos y una solución alternativa para cuando se agotan los reintentos, cubierto en el artículo de recuperación de errores.
El disyuntor rastrea los fallos consecutivos y deja de emitir nuevas llamadas una vez que se cruza un umbral, en lugar de reintentar una dependencia que claramente está caída.
Después de reset_after segundos, permite pasar exactamente un intento (semiabierto) para probar si la dependencia se ha recuperado.
Esto protege al resto del orquestador de gastar tiempo y tokens en llamadas que probablemente volverán a fallar inmediatamente.
Añade una comprobación ligera que rechaza un resultado combinado obviamente malo en lugar de devolverlo sin verificar.
import asynciofrom claude_agent_sdk import query, AgentOptions, SubagentConfigdef looks_reasonable(result: str) -> bool: return len(result.strip()) > 20 and "TODO" not in resultasync def orchestrate_with_check(prompt: str, options: AgentOptions) ->
looks_reasonable es un sustituto de cualquier comprobación determinista y ligera que tenga sentido para tu tarea: longitud, campos requeridos, ausencia de texto de marcador de posición.
Comprobar la salida antes de que llegue a un llamador detecta una clase de fallos que un reintento por sí solo no haría, ya que la llamada en sí tuvo éxito, el contenido simplemente estaba mal.
Esta es una vista previa ligera de la disciplina de evaluación cubierta en su totalidad en la lista de verificación de preparación para producción.
Versiones de la pila: Escrito contra la línea de modelos 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 SDK de Claude Agent (última versión). 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.
=
[
"file_edit"
],
),
SubagentConfig(
name="backend-summary",
description="Resume los cambios del backend en un PR.",
allowed_tools=["file_edit"],
),
],
)
results = {}
async for message in query(
prompt="Usa ambos subagentes de resumen, luego escribe una descripción combinada del PR.",