- SDK oficial de Anthropic en TypeScript y Python para construir agentes con Claude. Licencia Apache 2.0, gratuito para cualquier uso comercial.
- La clase Agent centraliza tres parámetros esenciales:
model,instructionsytools. Con eso es suficiente para un agente funcional en producción. - Incluye herramientas integradas de bajo nivel: computer use (control del escritorio), bash (ejecución de comandos) y edición de archivos. No requieren configuración adicional.
- Soporta ejecución en sandbox con Docker y E2B para ejecutar código generado por el agente de forma aislada y segura frente a inputs no confiables.
- Compatible con Claude Sonnet 4.6, Opus 4.7 y Haiku 4.5 a mayo de 2026. El precio sigue el esquema de la API de Anthropic: pago por token, sin cuota mensual obligatoria.
¿Qué es Claude Agent SDK y cómo encaja con la API de Claude?
La API de Anthropic permite llamar a los modelos Claude con mensajes y herramientas, pero construir un agente real sobre ella requiere implementar bucles de conversación, gestionar el historial de mensajes, procesar las llamadas a herramientas, manejar errores y controlar el streaming. Claude Agent SDK hace todo eso por ti. Es una capa de abstracción diseñada específicamente para el ciclo de agente: recibir una tarea, planificar, ejecutar herramientas, observar el resultado y repetir hasta completar el objetivo.
El SDK no es un framework de propósito general como LangChain ni un sistema de equipos como CrewAI. Es la capa más cercana a la API, sin abstracciones intermedias innecesarias. Esto lo hace especialmente útil cuando necesitas control preciso sobre el comportamiento del agente, cuando quieres usar las capacidades exclusivas de Claude (computer use, extended thinking) o cuando construyes sobre infraestructura propia sin dependencias de terceros.
A nivel de repositorio, el SDK se distribuye dentro del proyecto github.com/anthropics/claude-code bajo Apache 2.0. La documentación oficial está en docs.anthropic.com. Las versiones de Claude disponibles a mayo de 2026 son Haiku 4.5 (rápido y económico), Sonnet 4.6 (equilibrio calidad-precio) y Opus 4.7 (máxima capacidad de razonamiento).
En el contexto de los modelos LLM disponibles, el SDK es la forma más directa y controlada de construir sobre Claude. Si la prioridad es la integración con múltiples proveedores o el acceso a un ecosistema amplio de integraciones preconstruidas, los frameworks de nivel superior pueden ser más adecuados. Consulta la sección de comparativas para datos concretos.
¿Cuáles son los conceptos clave: Agent, tools y turnos?
El SDK se articula en torno a tres primitivas. Comprenderlas es suficiente para construir agentes de producción con cualquier nivel de complejidad.
La clase Agent es la unidad central del SDK. Se instancia con tres parámetros:
model (el identificador del modelo Claude que usará el agente),
instructions (el system prompt que define el comportamiento, la personalidad
y las restricciones del agente) y tools (la lista de herramientas que el
agente puede invocar para interactuar con sistemas externos).
Una vez instanciado, el agente expone dos métodos principales: run() para
ejecución de tarea única y chat() para conversación multi-turno con historial
persistente. Ambos métodos soportan streaming de respuesta para interfaces de usuario reactivas.
Las herramientas son funciones que el agente puede invocar cuando necesita información o capacidades que no tiene por defecto. En TypeScript se definen con un objeto que describe el nombre, la descripción (lo que el modelo lee para decidir cuándo usar la herramienta) y el schema JSON de parámetros. En Python se pueden usar decoradores que infieren el schema automáticamente a partir de los type hints y el docstring.
El SDK incluye herramientas integradas listas para usar: computer use
(captura de pantalla, clicks, teclado), bash (ejecución de comandos shell)
y file editing (leer, crear y modificar archivos). Estas herramientas
no requieren implementación: se pasan directamente en el array tools.
Un turn es un ciclo completo de razonamiento del agente: el modelo recibe el contexto actual, decide si invocar una herramienta o responder directamente, el SDK ejecuta la herramienta si procede, y el resultado se añade al historial para el siguiente turno. Este bucle continúa hasta que el agente produce una respuesta final o se alcanza el límite de turnos configurado.
El parámetro max_turns controla el número máximo de ciclos por ejecución.
Para tareas de larga duración, el historial puede comprimirse automáticamente mediante
prompt caching, que reduce el coste de tokens de forma significativa
en sesiones largas sobre el mismo contexto.
El SDK expone tres niveles de control de seguridad. Las instrucciones del sistema definen qué puede y qué no puede hacer el agente en lenguaje natural. Los filtros de herramientas permiten validar los parámetros antes de ejecutar una herramienta e incluso bloquear la ejecución si se detecta un intento malicioso. El sandbox de ejecución aisla el código generado del sistema host mediante Docker o E2B.
Para agentes expuestos a inputs de usuarios no confiables, la combinación de instrucciones restrictivas + validación de parámetros + sandbox es la configuración de seguridad recomendada por Anthropic a .
¿Cómo se instala y configura Claude Agent SDK?
El SDK se distribuye como paquete npm para TypeScript/JavaScript y como paquete PyPI para Python. La única dependencia externa es una clave de API de Anthropic, que se puede obtener en console.anthropic.com.
# TypeScript / JavaScript
npm install @anthropic-ai/claude-code
# Python
pip install anthropic
# Con uv (recomendado para proyectos Python nuevos)
uv add anthropic
Primer agente en TypeScript
El siguiente ejemplo crea un agente mínimo que responde preguntas sobre clima usando una herramienta simulada. Sirve como plantilla para cualquier agente de tarea única:
import Anthropic from "@anthropic-ai/claude-code";
const client = new Anthropic();
// Definicion de herramienta: nombre, descripcion y schema de parametros
const getWeatherTool = {
name: "get_weather",
description:
"Obtiene el clima actual para una ciudad. " +
"Usa esta herramienta cuando el usuario pregunte sobre el tiempo.",
input_schema: {
type: "object" as const,
properties: {
city: {
type: "string",
description: "Nombre de la ciudad",
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
description: "Unidad de temperatura",
},
},
required: ["city"],
},
};
// Implementacion de la herramienta
function getWeather(city: string, unit = "celsius"): string {
// En produccion aqui iria una llamada a una API meteorologica real
return JSON.stringify({
city,
temperature: unit === "celsius" ? 22 : 72,
condition: "Parcialmente nublado",
humidity: "65%",
});
}
// Instancia del agente
const agent = new Anthropic.Agent({
model: "claude-sonnet-4-6",
instructions:
"Eres un asistente meteorologico preciso. " +
"Usa siempre la herramienta get_weather para obtener datos actuales. " +
"Responde en espanol y usa grados Celsius.",
tools: [getWeatherTool],
});
// Bucle de ejecucion con gestion de herramientas
async function runAgent(userMessage: string): Promise {
const messages: Anthropic.MessageParam[] = [
{ role: "user", content: userMessage },
];
while (true) {
const response = await agent.run(messages);
if (response.stop_reason === "end_turn") {
// El agente ha terminado: imprimir la respuesta final
const text = response.content.find((b) => b.type === "text");
if (text && text.type === "text") {
console.log("Agente:", text.text);
}
break;
}
if (response.stop_reason === "tool_use") {
// El agente quiere invocar una herramienta
messages.push({ role: "assistant", content: response.content });
const toolResults: Anthropic.ToolResultBlockParam[] = [];
for (const block of response.content) {
if (block.type === "tool_use") {
const input = block.input as { city: string; unit?: string };
const result = getWeather(input.city, input.unit);
toolResults.push({
type: "tool_result",
tool_use_id: block.id,
content: result,
});
}
}
messages.push({ role: "user", content: toolResults });
}
}
}
runAgent("Que tiempo hace hoy en Madrid?");
Primer agente en Python
La versión Python permite usar decoradores para definir herramientas a partir de funciones con type hints, lo que reduce el código de definición de schema al mínimo:
import anthropic
import json
client = anthropic.Anthropic()
# Herramienta de busqueda simulada
def search_knowledge_base(query: str, max_results: int = 3) -> str:
"""
Busca en la base de conocimiento interna.
Usa esta herramienta para responder preguntas sobre productos y politicas.
Args:
query: Termino o pregunta a buscar.
max_results: Numero maximo de resultados a devolver.
Returns:
Resultados relevantes en formato JSON.
"""
# En produccion: llamada real a una BD vectorial o buscador
results = [
{"id": 1, "title": "Politica de devolucion", "content": "30 dias desde la compra..."},
{"id": 2, "title": "Soporte tecnico", "content": "Disponible 24/7 via chat..."},
]
return json.dumps(results[:max_results], ensure_ascii=False)
# Definicion del agente
MODEL = "claude-sonnet-4-6"
SYSTEM = (
"Eres un agente de soporte al cliente experto. "
"Usa la herramienta search_knowledge_base para encontrar informacion precisa "
"antes de responder. Nunca inventes datos. Responde siempre en espanol."
)
TOOLS = [
{
"name": "search_knowledge_base",
"description": (
"Busca en la base de conocimiento interna sobre productos, politicas y soporte. "
"Usa esta herramienta siempre que el usuario pregunte algo especifico."
),
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Consulta a buscar"},
"max_results": {
"type": "integer",
"description": "Resultados maximos",
"default": 3,
},
},
"required": ["query"],
},
}
]
def process_tool_call(tool_name: str, tool_input: dict) -> str:
"""Enruta la llamada a la funcion correcta."""
if tool_name == "search_knowledge_base":
return search_knowledge_base(**tool_input)
return json.dumps({"error": f"Herramienta desconocida: {tool_name}"})
def chat(conversation_history: list, user_message: str) -> tuple[str, list]:
"""
Ejecuta un turno de conversacion y devuelve la respuesta y el historial actualizado.
"""
conversation_history.append({"role": "user", "content": user_message})
while True:
response = client.messages.create(
model=MODEL,
max_tokens=4096,
system=SYSTEM,
tools=TOOLS,
messages=conversation_history,
)
if response.stop_reason == "end_turn":
# Respuesta final del agente
assistant_message = response.content[0].text
conversation_history.append(
{"role": "assistant", "content": response.content}
)
return assistant_message, conversation_history
if response.stop_reason == "tool_use":
# Procesar llamadas a herramientas
conversation_history.append(
{"role": "assistant", "content": response.content}
)
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = process_tool_call(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
conversation_history.append({"role": "user", "content": tool_results})
# Uso
history = []
reply, history = chat(history, "Cual es vuestra politica de devoluciones?")
print(f"Agente: {reply}")
reply, history = chat(history, "Y si el producto esta defectuoso?")
print(f"Agente: {reply}")
Tanto el método run() como chat() soportan streaming mediante el
parámetro stream=True en Python o el método stream() en TypeScript.
El streaming es imprescindible para cualquier interfaz de usuario donde el agente tarda
más de uno o dos segundos en responder: el usuario ve el texto aparecer progresivamente
en lugar de esperar a que la respuesta esté completa. En producción, el streaming también
reduce la latencia percibida en agentes que ejecutan múltiples herramientas.
¿Qué patrones de orquestación multi-agente ofrece?
Claude Agent SDK soporta cuatro patrones para componer agentes en sistemas más complejos. Cada patrón resuelve una clase de problema diferente.
Patrón secuencial: pipelines de procesamiento
Los agentes se ejecutan en cadena. El output del primer agente se convierte en el input del segundo, y así sucesivamente. Este patrón es ideal para pipelines de transformación de datos donde cada etapa requiere un comportamiento diferente: por ejemplo, un agente extractor de información, seguido de un agente clasificador y terminando con un agente redactor. La ventaja es la separación clara de responsabilidades; el inconveniente es que el tiempo total es la suma de todos los tiempos individuales.
Patrón paralelo: distribución de carga
Varios agentes ejecutan subtareas simultáneamente. Un agente orquestador divide el
trabajo, lanza los subagentes en paralelo (usando Promise.all en TypeScript
o asyncio.gather en Python) y consolida los resultados cuando todos
han terminado. Este patrón reduce drásticamente el tiempo total en tareas
paralelizables: investigar múltiples fuentes, analizar varios documentos o generar
variaciones de un mismo contenido. El orquestador necesita lógica para consolidar
resultados potencialmente contradictorios.
Patrón de enrutamiento: especialización por dominio
Un agente clasificador analiza la solicitud entrante y decide cuál de varios agentes especializados debe manejarla. El clasificador no resuelve la tarea: solo decide quién lo hace. Los agentes especializados tienen instrucciones y herramientas específicas para su dominio: soporte técnico, facturación, ventas, recursos humanos. Este patrón permite mantener cada agente simple y bien definido, evitando el problema del "agente que hace todo" con instrucciones contradictorias.
Patrón de transferencia (handoff): delegación de control
Un agente cede el control completo a otro agente más especializado para completar
una subtarea. A diferencia del enrutamiento, el agente que recibe la transferencia
puede a su vez transferir a un tercero. Este patrón es el más flexible y el más
cercano al modelo de trabajo humano: un agente de primer nivel resuelve lo que puede
y escala lo que no puede. La implementación en el SDK consiste en exponer otros agentes
como herramientas: el agente A tiene en su array tools una herramienta
que llama al agente B, pasándole el contexto relevante.
import anthropic
import json
client = anthropic.Anthropic()
# ----- AGENTES ESPECIALIZADOS -----
def run_billing_agent(query: str) -> str:
"""Agente especializado en facturacion y pagos."""
response = client.messages.create(
model="claude-haiku-4-5", # Haiku para agentes rapidos de primer nivel
max_tokens=1024,
system=(
"Eres un especialista en facturacion. "
"Solo respondes preguntas sobre facturas, pagos y suscripciones."
),
messages=[{"role": "user", "content": query}],
)
return response.content[0].text
def run_technical_agent(query: str) -> str:
"""Agente especializado en soporte tecnico."""
response = client.messages.create(
model="claude-sonnet-4-6", # Sonnet para tareas con razonamiento medio
max_tokens=2048,
system=(
"Eres un ingeniero de soporte tecnico experto. "
"Resuelves problemas de configuracion, integraciones y errores del sistema."
),
messages=[{"role": "user", "content": query}],
)
return response.content[0].text
# ----- AGENTE ORQUESTADOR (ENRUTADOR) -----
ROUTER_TOOLS = [
{
"name": "handle_billing",
"description": (
"Transfiere al agente de facturacion. "
"Usa esta herramienta para preguntas sobre facturas, cargos, "
"suscripciones, reembolsos o metodos de pago."
),
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Consulta del usuario"},
},
"required": ["query"],
},
},
{
"name": "handle_technical",
"description": (
"Transfiere al agente de soporte tecnico. "
"Usa esta herramienta para problemas de configuracion, errores, "
"integraciones de API o comportamiento inesperado del sistema."
),
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Consulta del usuario"},
},
"required": ["query"],
},
},
]
def route_and_handle(user_message: str) -> str:
"""Enruta la solicitud al agente correcto y devuelve la respuesta."""
messages = [{"role": "user", "content": user_message}]
while True:
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=512,
system=(
"Eres un agente de primer contacto. Tu unica funcion es "
"determinar si la consulta es de facturacion o tecnica "
"y transferirla al agente correcto. No respondas directamente."
),
tools=ROUTER_TOOLS,
messages=messages,
)
if response.stop_reason == "end_turn":
return response.content[0].text
if response.stop_reason == "tool_use":
messages.append({"role": "assistant", "content": response.content})
tool_results = []
for block in response.content:
if block.type == "tool_use":
if block.name == "handle_billing":
result = run_billing_agent(block.input["query"])
elif block.name == "handle_technical":
result = run_technical_agent(block.input["query"])
else:
result = "Agente no encontrado"
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
messages.append({"role": "user", "content": tool_results})
# El orquestador recibe la respuesta del subagente y la devuelve al usuario
return tool_results[0]["content"] if tool_results else ""
# Uso
print(route_and_handle("No puedo descargar mi factura del mes de abril"))
print(route_and_handle("El webhook de mi integracion no recibe eventos"))
¿Cómo funciona la ejecución en sandbox?
Cuando el agente genera y ejecuta código, el sandbox garantiza que ese código no puede acceder al sistema host ni a datos fuera del entorno aislado.
La opción más sencilla para desarrollo y para producción en infraestructura propia. El SDK lanza un contenedor Docker con el entorno necesario (Python, Node.js, etc.), ejecuta el código del agente dentro del contenedor y devuelve el output al agente. El contenedor no tiene acceso a la red del host ni al sistema de archivos fuera del volumen montado explícitamente.
Requiere Docker instalado en el host. Útil cuando el control total sobre el entorno de ejecución es crítico o cuando los datos no pueden salir de la infraestructura propia.
E2B es un servicio de microvirtual machines diseñado específicamente para ejecutar código generado por LLMs. El SDK se integra con E2B sin configuración adicional: cada llamada de herramienta de código crea un microentorno efímero, lo ejecuta y lo destruye. Tiempo de arranque: menos de 200 ms.
Ideal para SaaS y productos con múltiples usuarios donde no es posible gestionar Docker en el servidor de la aplicación. E2B ofrece plan gratuito con cuota y planes de pago según uso a mayo de 2026.
Si el agente ejecuta código generado a partir de inputs de usuarios finales (no de desarrolladores de confianza), el sandbox no es opcional: es imprescindible. Un usuario malintencionado puede intentar inyectar código que acceda a variables de entorno, lea archivos de configuración o realice llamadas de red no autorizadas. El sandbox elimina esta superficie de ataque al completo. Para agentes internos donde todos los inputs los genera el propio equipo de desarrollo, el sandbox es opcional pero sigue siendo una buena práctica.
¿Qué casos de uso resuelve mejor Claude Agent SDK?
Seis escenarios donde el SDK ofrece ventajas claras frente a frameworks de nivel superior o frente al uso directo de la API sin abstracciones de agente.
¿Cómo compara Claude Agent SDK con LangChain, CrewAI y Pydantic AI?
Tabla de referencia para elegir el framework correcto según las necesidades del proyecto. Para comparativas más detalladas, ver la sección de comparativas.
| Criterio | Claude Agent SDK | LangChain | CrewAI | Pydantic AI |
|---|---|---|---|---|
| Proveedor LLM | Solo Anthropic (Claude) | Multi-proveedor (>30) | Multi-proveedor via LiteLLM | Multi-proveedor |
| Lenguajes | TypeScript, Python | Python, JavaScript | Python | Python |
| Curva de aprendizaje | Baja — API mínima | Alta — muchas abstracciones | Baja — roles intuitivos | Media — orientado a tipos |
| Multi-agente nativo | Si (4 patrones) | Si (LangGraph) | Si (crews y pipelines) | Limitado |
| Ejecución en sandbox | Si (Docker + E2B) | Parcial (via plugins) | Si (CodeInterpreterTool) | No |
| Computer use | Si (herramienta integrada) | No nativo | No | No |
| Validación de datos | Manual | Parcial | Parcial | Nativa (Pydantic models) |
| Integraciones preconstruidas | Pocas (API first) | Más de 600 | ~50 (crewai-tools) | Pocas |
| Licencia | Apache 2.0 | MIT | MIT | MIT |
| Mejor para | Proyectos Claude-first con control preciso | Ecosistema amplio, RAG avanzado | Equipos de agentes con roles | Agentes con outputs fuertemente tipados |
¿Cuándo elegir Claude Agent SDK sobre los frameworks de nivel superior?
El SDK es la opción correcta cuando el proyecto cumple alguna de estas condiciones: el equipo ya ha decidido usar Claude como único proveedor y no necesita multi-proveedor; se necesitan las herramientas exclusivas de Claude (computer use, extended thinking) sin la capa de indirection de un framework; se está construyendo una abstracción propia sobre el SDK para uso interno; o el proyecto requiere el mínimo número posible de dependencias de terceros para reducir la superficie de actualización y mantenimiento.
LangChain sigue siendo la mejor opción cuando se necesitan más de 600 integraciones preconstruidas o cuando el proyecto tiene que ser agnóstico al proveedor LLM desde el inicio. CrewAI es mejor cuando el problema se describe naturalmente como un equipo de especialistas con roles claros y se prefiere configuración YAML. Pydantic AI es la opción cuando la validación estricta de los outputs del agente es un requisito no negociable.
Preguntas frecuentes sobre Claude Agent SDK
¿Qué es Claude Agent SDK y para qué sirve?
Claude Agent SDK es la biblioteca oficial de Anthropic para construir agentes de
inteligencia artificial en TypeScript y Python. Proporciona la clase Agent
con los parámetros model, instructions y tools;
bucles de conversación multi-turno con gestión automática del historial; herramientas
integradas como computer use, bash y edición de archivos; ejecución de código en sandbox
con Docker o E2B; y patrones de orquestación multi-agente (secuencial, paralelo,
enrutamiento, handoff). Está disponible con licencia Apache 2.0 en el repositorio de
Claude Code en GitHub.
¿Cuánto cuesta usar Claude Agent SDK?
El SDK en sí es gratuito y de código abierto. El coste proviene del uso de la API de Anthropic, que factura por tokens consumidos. A : Claude Sonnet 4.6 cuesta 3 USD por millón de tokens de entrada y 15 USD por millón de salida. Claude Haiku 4.5 cuesta 1 USD de entrada y 5 USD de salida. Claude Opus 4.7 cuesta 5 USD de entrada y 25 USD de salida. El prompt caching puede reducir el coste entre un 70% y un 90% en sesiones largas donde el contexto del sistema no cambia entre turnos. Consulta los precios actualizados en anthropic.com/pricing.
¿Cuál es la diferencia entre agent.run() y agent.chat()?
agent.run() ejecuta una tarea en un único turno de conversación y devuelve
el resultado final directamente. Es el método adecuado para tareas autónomas donde no
es necesaria interacción continua con el usuario: procesar un documento, analizar datos,
generar un informe. agent.chat() inicia o continúa una conversación multi-turno,
manteniendo el historial de mensajes entre llamadas y permitiendo que el usuario haga
preguntas de seguimiento. Es el método correcto para asistentes conversacionales, bots
de soporte o cualquier interfaz donde el usuario interactúa en múltiples pasos.
¿Claude Agent SDK soporta ejecución de código en sandbox?
Sí. El SDK incluye soporte nativo para ejecución en entornos aislados mediante Docker (para infraestructura propia) y E2B (sandbox en la nube con arranque en menos de 200 ms). Esto permite al agente ejecutar código generado de forma segura sin acceso al sistema de archivos ni a los procesos del host. La ejecución en sandbox es imprescindible cuando el agente procesa inputs arbitrarios de usuarios no confiables. Para agentes internos de desarrollo, es opcional pero recomendable.
¿Qué patrones de orquestación multi-agente soporta el SDK?
El SDK soporta cuatro patrones principales: secuencial (los agentes se ejecutan en cadena, el output de uno es el input del siguiente), paralelo (varios agentes ejecutan subtareas simultáneamente y el orquestador consolida los resultados), enrutamiento (un agente clasificador decide qué agente especializado maneja cada solicitud) y transferencia o handoff (un agente cede el control a otro más especializado). Los agentes se pueden usar como herramientas de otros agentes mediante el patrón subagente, lo que permite composiciones arbitrariamente complejas.
¿Claude Agent SDK vs LangChain vs CrewAI: cuál elegir?
Elige Claude Agent SDK cuando el proyecto usa Claude como único proveedor LLM, necesitas acceso a herramientas exclusivas de Claude (computer use, extended thinking) o quieres el mínimo número de dependencias de terceros. Elige LangChain para proyectos multi-proveedor con más de 600 integraciones disponibles o arquitecturas RAG complejas. Elige CrewAI cuando el problema se modela como equipos de agentes con roles especializados y prefieres una API de más alto nivel con configuración YAML. La sección de comparativas tiene análisis detallados con casos de uso reales para cada par de frameworks.
¿Quieres ver cómo usar Claude Code junto con el SDK?
Claude Code es el agente de programación autónomo que usa el SDK internamente. Aprende a combinar ambas herramientas para acelerar tu flujo de desarrollo.
Ver guía de Claude Code