Claude Code SDK: Tutorial Completo

Por: Artiko
claudeagent-sdkiaautomatizacionpythontypescript

Claude Code SDK: Tutorial Completo

Guía práctica de 20 capítulos para construir agentes de IA autónomos usando el SDK oficial de Anthropic. Cada capítulo incluye ejemplos completos en Python y TypeScript.


Arquitectura del SDK

flowchart TB
    subgraph TuApp["Tu Aplicación"]
        Python["Python\nclaude-code-sdk"]
        TS["TypeScript\n@anthropic-ai/claude-code-sdk"]
    end

    subgraph SDK["Claude Code SDK"]
        QueryFn["query()"]
        Client["ClaudeSDKClient"]
        Options["ClaudeCodeOptions"]
    end

    subgraph CLI["Claude Code CLI (subproceso)"]
        AgentLoop["Agent Loop"]
        Tools["Herramientas integradas\nRead, Edit, Write, Bash..."]
        MCPServers["MCP Servers"]
        Hooks["Hooks\nPreTool, PostTool, Stop"]
    end

    subgraph External["Servicios Externos"]
        AnthAPI["Anthropic API\n(LLM)"]
        FS["Sistema de\nArchivos"]
        Terminal["Terminal\n(Bash)"]
        MCP["Servidores\nMCP"]
    end

    Python --> QueryFn
    TS --> QueryFn
    QueryFn --> Client
    Client --> |"spawn subprocess\nJSON Lines stdio"| AgentLoop
    AgentLoop --> Tools
    AgentLoop --> MCPServers
    AgentLoop --> Hooks
    AgentLoop --> AnthAPI
    Tools --> FS
    Tools --> Terminal
    MCPServers --> MCP

Tabla de Contenidos

Bloque 1: Fundamentos

CapTítuloDescripción
01IntroducciónQué es el SDK, casos de uso, comparación con otras herramientas
02Instalación y ConfiguraciónSetup de Python/TS, API key, primera ejecución
03Query BásicoLa función query(), opciones, iteración de mensajes
04Herramientas IntegradasRead, Edit, Write, Bash, Glob, Grep y cuándo usarlas
05Model Context ProtocolIntegrar servidores MCP para extender capacidades

Bloque 2: Core Features

CapTítuloDescripción
06Sistema de HooksPreToolUse, PostToolUse, Stop — interceptar y controlar
07SubagentesPatrones de orquestación y delegación de tareas
08Manejo de SesionesReanudar sesiones, session_id, estado persistente
09Casos de Uso PrácticosCode review, migración de código, análisis de repositorios
10Mejores PrácticasSeguridad, performance, mantenibilidad, testing

Bloque 3: Funcionalidades Avanzadas

CapTítuloDescripción
11Streaming y Eventos en Tiempo RealSSE, WebSockets, terminal output, cancelación
12Testing de AgentesUnit, integration, e2e, evals, LLM-as-judge, CI/CD
13Manejo de Errores y ResilienciaRetry, circuit breaker, rollback, human-in-the-loop
14Seguridad y Permisos AvanzadosThreat model, sandboxing, RBAC, secrets management
15Performance y OptimizaciónPrompt caching, paralelismo, model routing, costos
16Integración con FrameworksFastAPI, Express, Hono, Next.js, queues

Bloque 4: Producción y Escala

CapTítuloDescripción
17Deployment en ProducciónDocker, Kubernetes, serverless, CI/CD, Railway, Render
18Monitoreo y ObservabilidadLogs estructurados, Prometheus, OpenTelemetry, Grafana
19Patrones Multi-Agente AvanzadosReflection, Debate, Ensemble, Verificación cruzada
20SDK Internals y ExtensionesCómo funciona el SDK, extensiones, interoperabilidad
21Referencia Rápida y CookbookCheat sheets, recetas listas, troubleshooting guide

Paquetes Oficiales

LenguajePaqueteInstalaciónImportación
Pythonclaude-code-sdkpip install claude-code-sdkfrom claude_code_sdk import query, ClaudeCodeOptions
TypeScript@anthropic-ai/claude-code-sdknpm install @anthropic-ai/claude-code-sdkimport { query, ClaudeCodeOptions } from "@anthropic-ai/claude-code-sdk"

Nota importante: El paquete Python se instala como claude-code-sdk pero se importa como claude_code_sdk (guiones → guiones bajos). El paquete TypeScript usa el scope @anthropic-ai.


Ejemplo Rápido: Hello World

Python

import asyncio
from claude_code_sdk import query, ClaudeCodeOptions

async def main():
    async for message in query(
        prompt="¿Cuántos archivos .py hay en el directorio actual?",
        options=ClaudeCodeOptions(
            allowed_tools=["Bash"],
            max_turns=5
        )
    ):
        if hasattr(message, 'content') and message.content:
            print(message.content)

asyncio.run(main())

TypeScript

import { query, ClaudeCodeOptions } from "@anthropic-ai/claude-code-sdk";

async function main(): Promise<void> {
  for await (const message of query(
    "¿Cuántos archivos .ts hay en el directorio actual?",
    {
      allowedTools: ["Bash"],
      maxTurns: 5,
    } as ClaudeCodeOptions
  )) {
    if ("content" in message && message.content) {
      console.log(message.content);
    }
  }
}

main();

Ejemplo más completo: Agente de análisis de código

import asyncio
from claude_code_sdk import query, ClaudeCodeOptions

async def code_analyzer(file_path: str) -> dict:
    """Analiza un archivo de código y retorna hallazgos."""
    results = []
    session_id = None
    total_cost = 0.0

    async for message in query(
        prompt=f"""
        Analiza el archivo {file_path}:
        1. Lista los bugs potenciales
        2. Sugiere mejoras de rendimiento
        3. Verifica el manejo de errores
        """,
        options=ClaudeCodeOptions(
            allowed_tools=["Read", "Bash"],
            max_turns=20
        )
    ):
        if hasattr(message, 'session_id') and message.session_id:
            session_id = message.session_id

        if hasattr(message, 'cost_usd') and message.cost_usd:
            total_cost += float(message.cost_usd)

        if hasattr(message, 'content') and message.content:
            results.append(str(message.content))

    return {
        "analysis": "\n".join(results),
        "session_id": session_id,
        "cost_usd": round(total_cost, 6)
    }

async def main():
    result = await code_analyzer("src/main.py")
    print(f"Análisis completado (costo: ${result['cost_usd']})")
    print(result["analysis"])

asyncio.run(main())

Requisitos Previos

Obligatorios

Conocimientos necesarios

Verificar instalación

# Verificar Claude Code CLI
claude --version

# Verificar variable de entorno
echo $ANTHROPIC_API_KEY

# Test rápido desde Python
python3 -c "
import asyncio
from claude_code_sdk import query, ClaudeCodeOptions

async def test():
    async for msg in query('Hola', options=ClaudeCodeOptions(allowed_tools=[], max_turns=1)):
        print('SDK funcionando:', type(msg).__name__)

asyncio.run(test())
"

Diagrama de Flujo de un Query

sequenceDiagram
    participant Code as Tu código
    participant SDK as Claude Code SDK
    participant CLI as claude -p (CLI)
    participant API as Anthropic API
    participant Tools as Herramientas

    Code->>SDK: query(prompt, options)
    SDK->>CLI: spawn subprocess
    CLI->>API: POST /messages (LLM call 1)
    API-->>CLI: AssistantMessage (puede incluir tool_use)
    CLI-->>SDK: JSON line: AssistantMessage
    SDK-->>Code: yield AssistantMessage

    CLI->>Tools: Ejecutar herramienta (ej: Read file)
    Tools-->>CLI: Resultado de herramienta
    CLI-->>SDK: JSON line: ToolResultMessage
    SDK-->>Code: yield ToolResultMessage

    CLI->>API: POST /messages (LLM call 2, con tool result)
    API-->>CLI: AssistantMessage final
    CLI-->>SDK: JSON line: ResultMessage
    SDK-->>Code: yield ResultMessage (con cost_usd)

    CLI->>CLI: exit
    SDK->>SDK: cerrar proceso

RecursoURL
Documentación principaldocs.anthropic.com/claude-code
SDK Python en GitHubgithub.com/anthropics/claude-code-sdk-python
SDK TypeScript en GitHubgithub.com/anthropics/claude-code-sdk-js
Claude Code CLIgithub.com/anthropics/claude-code
MCP Protocolmodelcontextprotocol.io
PyPI - claude-code-sdkpypi.org/project/claude-code-sdk
npm - @anthropic-ai/claude-code-sdknpmjs.com/package/@anthropic-ai/claude-code-sdk
Referencia de API Anthropicdocs.anthropic.com/api