Instalación
Instale el paquete en un entorno virtual. En instalaciones recientes de Debian, Ubuntu y Homebrew Python, ejecutarpip install contra Python del sistema falla con error: externally-managed-environment.
Elegir entre query() y ClaudeSDKClient
El SDK de Python proporciona dos formas de interactuar con Claude Code:
Utilice
ClaudeSDKClient para aplicaciones interactivas como interfaces de chat, o cuando la siguiente acción dependa de la respuesta de Claude.
Funciones
Los bloques de firma y fragmentos desnudos de
async for / async with en esta página son ilustrativos. Para ejecutarlos, envuelve el cuerpo en async def main(): ... y llama a asyncio.run(main()).query()
Crea una nueva sesión para cada interacción con Claude Code de forma predeterminada. Devuelve un iterador asincrónico que produce mensajes a medida que llegan. Cada llamada a query() comienza de nuevo sin memoria de interacciones anteriores a menos que pases continue_conversation=True o resume en ClaudeAgentOptions. Consulta Sessions.
Parámetros
Devuelve
Devuelve unAsyncIterator[Message] que produce mensajes de la conversación.
Ejemplo - Con opciones
tool()
Decorador para definir herramientas MCP con seguridad de tipos.
Parámetros
Opciones de esquema de entrada
-
Mapeo de tipo simple (recomendado):
-
Formato JSON Schema (para validación compleja):
-
Clase TypedDict: un esquema tipado cuyas claves
NotRequiredquedan fuera derequired.- Python 3.11 y posteriores: importa
TypedDictyNotRequireddesdetyping. - Python 3.10:
typingno tieneNotRequired. ImportaTypedDictyNotRequireddesdetyping_extensions, que el SDK instala en Python 3.10.
- Python 3.11 y posteriores: importa
Annotated[type, "description"] para establecer la descripción del campo.
Devuelve
Una función decoradora que envuelve la implementación de la herramienta y devuelve una instancia deSdkMcpTool.
Ejemplo
ToolAnnotations
Sugerencias de comportamiento para una herramienta, pasadas como el argumento annotations de tool(). ToolAnnotations extiende mcp.types.ToolAnnotations del SDK de MCP con un campo maxResultSizeChars, y puedes escribir cada sugerencia en camelCase o snake_case: ToolAnnotations(readOnlyHint=True) y ToolAnnotations(read_only_hint=True) son equivalentes. Para volver a leer una sugerencia desde el objeto, usa la escritura que declara tu paquete mcp instalado: .readOnlyHint en mcp 1.x y .read_only_hint en 2.x, mientras que .maxResultSizeChars funciona en ambas. También puedes pasar un mcp.types.ToolAnnotations simple dondequiera que el SDK acepte anotaciones.
Los nombres snake_case y el campo maxResultSizeChars tipado requieren Python Agent SDK 0.2.140 o posterior. Las versiones 0.1.31 a 0.2.139 re-exportan mcp.types.ToolAnnotations sin cambios. En las versiones 0.1.55 a 0.2.139 aún puedes pasar maxResultSizeChars como argumento de palabra clave: la clase MCP acepta campos adicionales, y el SDK reenvía el valor a Claude Code.
Todos los campos son opcionales. Los clientes no deben depender de las sugerencias para decisiones de seguridad.
create_sdk_mcp_server()
Crea un servidor MCP en proceso que se ejecuta dentro de tu aplicación Python.
Parámetros
Devuelve
Devuelve un objetoMcpSdkServerConfig que se puede pasar a ClaudeAgentOptions.mcp_servers.
Ejemplo
list_sessions()
Lista sesiones pasadas con metadatos. Filtra por directorio de proyecto o lista sesiones en todos los proyectos. Sincrónico; devuelve inmediatamente.
Parámetros
Tipo de retorno: SDKSessionInfo
Ejemplo
Imprime las 10 sesiones más recientes para un proyecto. Los resultados se ordenan porlast_modified descendente, por lo que el primer elemento es el más nuevo. Omite directory para buscar en todos los proyectos.
get_session_messages()
Recupera mensajes de una sesión pasada. Sincrónico; devuelve inmediatamente.
Parámetros
Tipo de retorno: SessionMessage
Ejemplo
get_session_info()
Lee metadatos para una única sesión por ID sin escanear el directorio del proyecto completo. Sincrónico; devuelve inmediatamente.
Parámetros
Devuelve
SDKSessionInfo, o None si la sesión no se encuentra.
Ejemplo
Busca los metadatos de una única sesión sin escanear el directorio del proyecto. Útil cuando ya tienes un ID de sesión de una ejecución anterior.rename_session()
Renombra una sesión agregando una entrada de título personalizado. Las llamadas repetidas son seguras; el título más reciente gana. Sincrónico.
Parámetros
Genera
ValueError si session_id no es un UUID válido o title está vacío; FileNotFoundError si la sesión no se puede encontrar.
Ejemplo
Renombra la sesión más reciente para que sea más fácil de encontrar más tarde. El nuevo título aparece enSDKSessionInfo.custom_title en lecturas posteriores.
tag_session()
Etiqueta una sesión. Pasa None para borrar la etiqueta. Las llamadas repetidas son seguras; la etiqueta más reciente gana. Sincrónico.
Parámetros
Genera
ValueError si session_id no es un UUID válido o tag está vacío después de la sanitización; FileNotFoundError si la sesión no se puede encontrar.
Ejemplo
Etiqueta una sesión y luego filtra por esa etiqueta en una lectura posterior. PasaNone para borrar una etiqueta existente.
fork_session()
Copia la transcripción de una sesión en una nueva sesión para que puedas llevar la conversación en otra dirección mientras la original permanece sin cambios. Para crear una rama desde un punto anterior de la conversación, pasa up_to_message_id. Sincrónico.
Parámetros
Devuelve un
ForkSessionResult cuyo session_id es el UUID de la nueva sesión. Pásalo como resume para continuar la bifurcación. La bifurcación no incluye los checkpoints de archivos de la sesión original, por lo que no puedes retrocederla a un checkpoint capturado antes de la bifurcación.
fork_session() genera:
ValueError:session_idoup_to_message_idno es un UUID válidoValueError: la sesión no tiene mensajes, oup_to_message_idno coincide con ningún mensaje de la transcripciónFileNotFoundError: la sesión no se puede encontrar
Ejemplo
Bifurca la sesión más reciente con un nuevo título y luego reanuda la bifurcación. La sesión original conserva su propio historial.Clases
ClaudeSDKClient
Mantiene una sesión de conversación en múltiples intercambios. Este es el equivalente de Python de cómo funciona internamente la función query() del SDK de TypeScript - crea un objeto cliente que puede continuar conversaciones. Consulte la comparación con query().
Métodos
Soporte de gestor de contexto
El cliente se puede usar como un gestor de contexto asincrónico para la gestión automática de conexiones:
Importante: Al iterar sobre mensajes, evite usar break para salir temprano ya que esto puede causar problemas de limpieza de asyncio. En su lugar, deje que la iteración se complete naturalmente o use banderas para rastrear cuándo ha encontrado lo que necesita.
Ejemplo - Continuar una conversación
Ejemplo - Entrada de streaming con ClaudeSDKClient
query() también acepta un iterable asincrónico de dicts de mensaje de usuario, por lo que puede ensamblar el prompt en el momento del envío o incluir bloques de contenido como imágenes. Claude Code comienza a responder al primer mensaje generado tan pronto como llega, sin esperar a que el iterable termine, y receive_response() se detiene en el ResultMessage que termina esa respuesta. Coloque todo lo que Claude debe leer antes de responder en un mensaje, como hace este generador, y empareje cada llamada a query() con su propio bucle receive_response().
Ejemplo - Usar interrupciones
Comportamiento del búfer después de la interrupción:
interrupt() envía una señal de parada pero no borra el búfer de mensajes. Los mensajes ya producidos por la tarea interrumpida, incluyendo su ResultMessage, permanecen en el flujo. Debe drenarlos con receive_response() antes de leer la respuesta a una nueva consulta. Si envía una nueva consulta inmediatamente después de interrupt() y llama a receive_response() solo una vez, recibirá los mensajes de la tarea interrumpida, no la respuesta de la nueva consulta.Ejemplo - Control de permisos avanzado
Tipos
@dataclass vs TypedDict: Este SDK utiliza dos tipos de clases. Las clases decoradas con @dataclass (como ResultMessage, AgentDefinition, TextBlock) son instancias de objetos en tiempo de ejecución y admiten acceso por atributo: msg.result. Las clases definidas con TypedDict (como ThinkingConfigEnabled, McpStdioServerConfig, SyncHookJSONOutput) son dicts simples en tiempo de ejecución y requieren acceso por clave: config["budget_tokens"], no config.budget_tokens. La sintaxis de llamada ClassName(field=value) funciona para ambas, pero solo las dataclasses producen objetos con atributos.SdkMcpTool
Definición para una herramienta MCP del SDK creada con el decorador @tool.
Transport
Clase base abstracta para implementaciones de transporte personalizadas. Úsala para comunicarte con el proceso de Claude a través de un canal personalizado (por ejemplo, una conexión remota en lugar de un subproceso local).
Importación:
from claude_agent_sdk import Transport
ClaudeAgentOptions
Dataclass de configuración para consultas de Claude Code.
Manejar respuestas de API lentas o estancadas
El subproceso de la CLI lee varias variables de entorno que controlan los tiempos de espera de la API y la detección de estancamientos. Pásalas a través deClaudeAgentOptions.env:
-
API_TIMEOUT_MS: tiempo de espera por solicitud en el cliente de Anthropic, en milisegundos. Predeterminado600000. Se aplica al bucle principal y a todos los subagentes. -
CLAUDE_CODE_MAX_RETRIES: máximo de reintentos de la API. Predeterminado10, limitado a15. Cada reintento obtiene su propia ventana deAPI_TIMEOUT_MS. Para ejecuciones desatendidas que necesitan esperar durante interrupciones más largas, estableceCLAUDE_CODE_RETRY_WATCHDOG=1: reintenta indefinidamente los errores transitorios de capacidad y, en Claude Code v2.1.199 o posterior, eleva el predeterminado para otros errores transitorios a300y elimina el límite de esta variable. -
CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS: watchdog de estancamiento para subagentes. Mientras el watchdog de stream está activado, el predeterminado esCLAUDE_STREAM_IDLE_TIMEOUT_MSmás 5 minutos, lo que da600000a menos que aumentes esa variable. Con el watchdog de stream desactivado, el predeterminado es600000. Antes de v2.1.257, el predeterminado era siempre600000. El temporizador se reinicia con cada evento de stream. Ante un estancamiento, Claude Code aborta el subagente e informa el estancamiento al padre. Para un subagente en segundo plano, también marca la tarea como fallida y adjunta cualquier resultado parcial. -
CLAUDE_ENABLE_STREAM_WATCHDOGconCLAUDE_STREAM_IDLE_TIMEOUT_MS: watchdog de stream que aborta la solicitud cuando los encabezados han llegado pero el cuerpo de la respuesta deja de transmitirse en streaming. El watchdog está activado de forma predeterminada para todos los proveedores; estableceCLAUDE_ENABLE_STREAM_WATCHDOG=0para desactivarlo.CLAUDE_STREAM_IDLE_TIMEOUT_MStiene un predeterminado de300000y se ajusta a ese mínimo. Después del aborto, Reintentos automáticos explica lo que hace Claude Code según cuánto haya avanzado la respuesta. Mientras el watchdog espera una respuesta que un gateway detrás deANTHROPIC_BASE_URLmantiene abierta con pings de keep-alive, un host que estableceinclude_partial_messagessigue recibiendo mensajesStreamEventde tipoping. Interpreta esos frames como señal de actividad en lugar de agotar el tiempo de espera de la sesión por silencio. Antes de v2.1.257, los frames se detenían 5 minutos después del último evento de stream real.
OutputFormat
Configuración para la validación de salida estructurada. Pásala como un dict al campo output_format de ClaudeAgentOptions:
SystemPromptPreset
Configuración para usar el prompt del sistema preestablecido de Claude Code con adiciones opcionales.
SystemPromptCustom
Un prompt del sistema personalizado en forma de objeto, equivalente a pasar una cadena como system_prompt, que también puede establecer snapshot. Requiere claude-agent-sdk v0.2.153 o posterior.
SystemPromptFile
Configuración para cargar un prompt del sistema personalizado desde un archivo en lugar de pasarlo como una cadena. El SDK lo asigna al flag de la CLI --system-prompt-file. Usa la forma de archivo cuando el prompt sea grande: el SDK pasa un system_prompt de tipo cadena en el argv del subproceso de la CLI, que está sujeto a los límites de longitud de la línea de comandos del SO antes de que el SDK envíe cualquier solicitud a la API. En Linux, un único argumento de más de aproximadamente 128 KB falla al generar el proceso con Argument list too long. En Windows, toda la línea de comandos está limitada a aproximadamente 32 KB, por lo que la forma de cadena falla con un umbral más bajo.
SettingSource
Controla desde qué fuentes de configuración basadas en el sistema de archivos carga el SDK la configuración.
Comportamiento predeterminado
Cuandosetting_sources se omite o es None y skills no está establecido, query() carga la misma configuración del sistema de archivos que la CLI de Claude Code: de usuario, de proyecto y local. Con skills establecido, la fila setting_sources describe el predeterminado actual. La política administrada por endpoint se carga en todos los casos; la configuración administrada por servidor se obtiene cuando la sesión se autentica con una credencial de organización en una configuración elegible. Para más información, consulta Lo que settingSources no controla.
Por qué usar setting_sources
Deshabilitar la configuración del sistema de archivos:En Python SDK 0.1.59 y anteriores, una lista vacía se trataba igual que omitir la opción, por lo que
setting_sources=[] no deshabilitaba la configuración del sistema de archivos. Actualiza a una versión más reciente si necesitas que una lista vacía tenga efecto. El SDK de TypeScript no se ve afectado."project" en setting_sources. Consulta Modificar prompts del sistema para ver cómo interactúa la carga de CLAUDE.md con las opciones del prompt del sistema.
Precedencia de configuración
Cuando se cargan varias fuentes, la configuración se fusiona con esta precedencia (de mayor a menor):- Configuración local (
.claude/settings.local.json) - Configuración del proyecto (
.claude/settings.json) - Configuración del usuario (
~/.claude/settings.json)
agents, allowed_tools y settings sobrescriben la configuración del sistema de archivos de usuario, de proyecto y local. La configuración de política administrada tiene precedencia sobre las opciones programáticas.
AgentDefinition
Configuración para un subagente definido programáticamente.
Los nombres de campo de
AgentDefinition usan camelCase, como disallowedTools, permissionMode y maxTurns. Estos nombres corresponden directamente al formato de transmisión compartido con el SDK de TypeScript. Esto difiere de ClaudeAgentOptions, que usa snake_case de Python para los campos de nivel superior equivalentes, como disallowed_tools y permission_mode. Como AgentDefinition es una dataclass, pasar una palabra clave en snake_case genera un TypeError al construirla.PermissionMode
Modos de permisos para controlar la ejecución de herramientas.
EffortLevel
Niveles de esfuerzo para guiar la profundidad del pensamiento.
CanUseTool
Alias de tipo para funciones de callback de permisos de herramientas.
tool_name: Nombre de la herramienta que se está llamandoinput_data: Los parámetros de entrada de la herramientacontext: UnToolPermissionContextcon información adicional
PermissionResult (ya sea PermissionResultAllow o PermissionResultDeny).
El callback es el reemplazo del SDK para la solicitud de permiso interactiva: se invoca solo cuando el flujo de evaluación de permisos termina en una solicitud de permiso. Las llamadas a herramientas ya aprobadas por una entrada de allowed_tools, una regla allow de la configuración o el modo de permisos, como acceptEdits o bypassPermissions, nunca lo invocan. Para controlar cada llamada a herramienta, usa en su lugar un hook PreToolUse.
Una regla allow no aprueba previamente las acciones que ningún modo aprueba automáticamente; consulta Cómo se evalúan los permisos para ver cuáles de ellas llegan al callback y qué sucede en los modos dontAsk y auto.
ToolPermissionContext
Información de contexto que se pasa a los callbacks de permisos de herramientas.
PermissionResult
Tipo de unión para los resultados del callback de permisos.
PermissionResultAllow
Resultado que indica que la llamada a herramienta debe permitirse.
PermissionResultDeny
Resultado que indica que la llamada a herramienta debe denegarse.
PermissionUpdate
Configuración para actualizar permisos programáticamente.
PermissionRuleValue
Una regla para agregar, reemplazar o eliminar en una actualización de permisos.
ToolsPreset
Configuración de herramientas preestablecida para usar el conjunto de herramientas predeterminado de Claude Code.
ThinkingConfig
Controla el comportamiento del pensamiento extendido. Una unión de tres configuraciones:
El campo opcional
display controla si el texto del pensamiento se devuelve "summarized" u "omitted". En Claude Opus 4.7 y posteriores, el predeterminado de la API es "omitted", así que establece "summarized" para recibir el contenido del pensamiento en las salidas ThinkingBlock. Claude Code no pasa tu valor de display a algunos proveedores, como Amazon Bedrock y Agent Platform de Google Cloud. En esos proveedores, Opus 4.7 y posteriores devuelven salidas ThinkingBlock vacías incluso cuando estableces display en "summarized".
Como estas son clases TypedDict, son dicts simples en tiempo de ejecución. Puedes construirlas como literales de dict o llamar a la clase como un constructor; ambas formas producen un dict. Accede a los campos con config["budget_tokens"], no con config.budget_tokens:
TaskBudget
Presupuesto de tarea del lado de la API en tokens, que se usa con el campo task_budget de ClaudeAgentOptions.
Como es un
TypedDict, pásalo como un dict simple, por ejemplo ClaudeAgentOptions(task_budget={"total": 50000}).
SdkBeta
Tipo literal para las características beta del SDK.
betas de ClaudeAgentOptions para habilitar características beta.
McpSdkServerConfig
Configuración para servidores MCP del SDK creados con create_sdk_mcp_server().
McpServerConfig
Tipo de unión para configuraciones de servidores MCP.
McpStdioServerConfig
McpSSEServerConfig
McpHttpServerConfig
McpServerStatusConfig
La configuración de un servidor MCP tal como la informa get_mcp_status(). Es la unión de todas las variantes de transporte de McpServerConfig más una variante claudeai-proxy de solo salida para servidores que pasan por proxy a través de claude.ai.
McpSdkServerConfigStatus es la forma serializable de McpSdkServerConfig con solo los campos type ("sdk") y name (str); se omite la instance en proceso. McpClaudeAIProxyServerConfig tiene los campos type ("claudeai-proxy"), url (str) e id (str).
McpStatusResponse
Respuesta de ClaudeSDKClient.get_mcp_status(). Envuelve la lista de estados de servidores bajo la clave mcpServers.
McpServerStatus
Estado de un servidor MCP conectado, contenido en McpStatusResponse.
ContextUsageResponse
Respuesta de ClaudeSDKClient.get_context_usage(). Es el mismo payload que Claude Code renderiza para el comando /context en una sesión interactiva, por lo que, junto con los recuentos de tokens, incluye campos de visualización como color y gridRows que Claude Code usa para dibujar la cuadrícula de uso de /context.
Claude Code construye este payload enviando varias solicitudes a la API de conteo de tokens. Estas solicitudes no aparecen en el stream de mensajes, por lo que el seguimiento de costos que lee el stream no las verá. En la API de Anthropic, el conteo de tokens no se factura.
ContextUsageCategory incluye name, tokens, color y un flag opcional isDeferred. totalTokens es el uso de contexto actual de la sesión, y maxTokens es la ventana con la que se mide ese uso. Esa ventana es la ventana de contexto del modelo, o la ventana de compactación automática más baja cuando corresponde, y rawMaxTokens contiene el mismo valor que maxTokens. apiUsage contiene el uso de la respuesta de API más reciente, no un total acumulado de la sesión. Claude Code deja sin establecer las claves opcionales deferredBuiltinTools, systemTools y systemPromptSections, así que espera que estén ausentes aunque el tipo las declare.
SdkPluginConfig
Configuración para cargar plugins en el SDK.
Ejemplo:
Tipos de mensaje
Message
Tipo de unión de todos los mensajes posibles.
UserMessage
Mensaje de entrada del usuario.
El SDK pasa
tool_use_result a través de la CLI sin modificar. Para una herramienta en un servidor MCP externo cuyo resultado contiene bloques resource_link, el dict tiene una clave resourceLinks que contiene una lista de dicts con las claves del tipo TypeScript SDKMcpResourceLink. Claude recibe cada enlace como una línea de texto en el resultado de la herramienta. Para renderizar los archivos que devolvió el servidor, lee resourceLinks en lugar de analizar ese texto. La clave resourceLinks requiere Python Agent SDK 0.2.150 o posterior y Claude Code v2.1.257 o posterior; la CLI incluida con esa versión del SDK satisface el requisito de Claude Code.
La CLI omite la clave cuando el resultado no tiene enlaces y en resultados de subagentes. La CLI mantiene como máximo 50 enlaces por resultado y deja de agregar enlaces una vez que la lista alcanza 64 KiB de JSON serializado. Una herramienta que defines en proceso con tool() nunca produce la clave, porque el SDK aplana sus bloques resource_link a texto antes de que la CLI vea el resultado.
AssistantMessage
Mensaje de respuesta del asistente con bloques de contenido.
AssistantMessageError
Posibles tipos de error para mensajes del asistente.
max_output_tokens. El SDK pasa el valor sin modificar, así que trata las cadenas fuera de esta lista de la misma manera en que tratas unknown. El tipo TypeScript SDKAssistantMessageError enumera el conjunto completo de valores que la CLI puede emitir.
SystemMessage
Mensaje del sistema con metadatos.
SystemMessage. Para seguir la sesión entre turnos, establece CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS=1 y lee message.data["state"] en cada mensaje cuyo subtype sea session_state_changed. SDKSessionStateChangedMessage enumera los estados que puede llevar. Itera con receive_messages() para leerlos: receive_response() se detiene en el ResultMessage, y un mensaje session_state_changed puede llegar después de ese resultado.
ResultMessage
Mensaje de resultado final con información de costo y uso.
subtype determina cuáles otros campos se rellenan. Es uno de "success", "error_during_execution", "error_max_turns", "error_max_budget_usd", o "error_max_structured_output_retries". La clase de datos de Python aplana todas las variantes en una forma, por lo que los campos que no se aplican al subtipo devuelto son None.
Varios campos llevan detalle de diagnóstico sobre cómo terminó la conversación:
is_error:Truecuando la conversación terminó en un estado de error. SiempreTrueen los subtiposerror_*. Ensubtype="success"esTruecuando la solicitud del modelo final falló, lo que significa que el bucle del agente se completó pero la última llamada a la API devolvió un error.api_error_status: el código de estado HTTP del error de API de terminación.Nonecuando el turno terminó sin uno. Se rellena solo ensubtype="success".result: texto del mensaje del asistente final ensubtype="success", oNoneen los subtiposerror_*. Cuandosubtype="success"eis_error=True, esto contiene la cadena de error de API si una está disponible pero puede estar vacía, así que verificaapi_error_statusy el contenido anterior deAssistantMessagepara obtener detalles.errors: cadenas de error a nivel de bucle como el mensaje de máx-turnos. Se rellena solo en los subtiposerror_*.terminal_reason: por qué terminó el bucle de consulta, como"completed","max_turns","api_error","aborted_streaming", o"aborted_tools". Un valor de"aborted_streaming"o"aborted_tools"significa que el turno fue abortado antes de completarse. Las causas comunes soninterrupt()y una devolución de llamada de permiso que devuelvePermissionResultDenyconinterrupt=True.Noneen versiones de CLI que preceden al campo, en resultados de comandos locales como/voiceo/usage, que omiten el bucle de consulta, o en resultados de error sintetizados emitidos cuando la sesión falla fatalmente. Refleja elSDKResultMessage.terminal_reasondel SDK de TypeScript, que enumera el conjunto completo de valores.origin: origen del mensaje del usuario que activó este turno. En modo de entrada de streaming, verifica esto para distinguir el resultado de tu propio prompt, dondeoriginesNoneo{"kind": "human"}, del resultado de un turno inyectado como una notificación de tarea en segundo plano. Requiere Python Agent SDK 0.2.137 o posterior.
ResultMessage por notificación, en orden, cada uno con un origin cuyo kind es "task-notification". Todos excepto el último tienen num_turns establecido en 0 y un result vacío, y el último lleva el turno que las responde a todas.
El dict usage cubre solo el bucle del agente principal y excluye subagentes y otras llamadas de modelo anidadas o auxiliares. En modo de entrada de streaming, los valores son por turno. Prefiere model_usage para contabilidad de token y costo. El dict usage contiene las siguientes claves cuando está presente:
El dict
model_usage asigna nombres de modelo a uso por modelo. Cubre cada llamada de modelo realizada a través de la canalización de consulta: el bucle principal, subagentes y llamadas internas como compactación y agentes de Workflow. Las llamadas auxiliares fuera de esa canalización, como el clasificador de permisos y solicitudes de conteo de tokens, se excluyen de model_usage. Trata model_usage como una estimación, no como un estado de facturación.
En modo de entrada de streaming, model_usage y total_cost_usd son acumulativos entre turnos, así que lee el resultado más reciente en lugar de sumar entre resultados. Una llamada que reanuda una sesión también cuenta los totales restaurados de las llamadas anteriores de la sesión. Consulta Rastrear costos en modo de entrada de streaming para reiniciaciones y Recuperar totales después de un bloqueo de sesión para resultados puestos a cero.
Cada valor en model_usage es un TypedDict ModelUsage, importado vía from claude_agent_sdk.types import ModelUsage. Sus claves usan camelCase porque el SDK pasa el valor sin modificar desde el proceso CLI subyacente, coincidiendo con el tipo TypeScript ModelUsage:
StreamEvent
Evento de streaming para actualizaciones de mensaje parcial durante el streaming. Solo se recibe cuando include_partial_messages=True en ClaudeAgentOptions. Importar vía from claude_agent_sdk.types import StreamEvent.
RateLimitEvent
Emitido cuando el estado del rate limit cambia (por ejemplo, de "allowed" a "allowed_warning"). Usa esto para advertir a los usuarios antes de que alcancen un límite duro, o para retroceder cuando el estado es "rejected".
RateLimitInfo
Estado del rate limit llevado por RateLimitEvent.
ConversationResetMessage
Emitido cuando la conversación se reemplaza sin terminar la conexión, como después de /clear. Consulta Rastrear costos en modo de entrada de streaming para ver cómo un reinicio afecta los totales en ejecución en objetos ResultMessage posteriores. Requiere Python Agent SDK 0.2.137 o posterior.
TaskStartedMessage
Emitido cuando comienza una tarea en segundo plano. Una tarea en segundo plano es cualquier cosa rastreada fuera del turno principal: un comando Bash en segundo plano, una vigilancia de Monitor, un subagente generado a través de la herramienta Agent, o un agente remoto. El campo task_type te indica cuál. Este nombre no está relacionado con el cambio de nombre de herramienta Task-a-Agent.
TaskUsage
Datos de token y tiempo para una tarea en segundo plano.
TaskProgressMessage
Emitido periódicamente con actualizaciones de progreso para una tarea en segundo plano en ejecución.
TaskNotificationMessage
Emitido cuando una tarea en segundo plano se completa, falla o se detiene. Las tareas en segundo plano incluyen comandos Bash run_in_background, vigilancias de Monitor y subagentes en segundo plano.
Cuando la CLI mueve una llamada a herramienta MCP larga a segundo plano, el resultado de la herramienta para esa llamada contiene solo un marcador de posición y el resultado real de la llamada llega en este mensaje. En una notificación
"completed" para tal llamada, la CLI agrega una clave resource_links que enumera los archivos que devolvió la herramienta por referencia, con las mismas entradas y límites que la clave resourceLinks en UserMessage.tool_use_result. La clave resource_links requiere Python Agent SDK 0.2.150 o posterior y Claude Code v2.1.257 o posterior; la CLI incluida con esa versión del SDK satisface el requisito de Claude Code.
La clase de datos no tiene campo para resource_links. Léelo del dict data que el mensaje hereda de SystemMessage: message.data.get("resource_links"). Haz coincidir la notificación con la llamada usando tool_use_id. La CLI omite la clave cuando el resultado no tenía enlaces y en notificaciones para tareas que no son llamadas a herramientas MCP.
Tipos de bloque de contenido
ContentBlock
Tipo de unión de todos los bloques de contenido.
TextBlock
Bloque de contenido de texto.
ThinkingBlock
Bloque de contenido de pensamiento (para modelos con capacidad de pensamiento).
ToolUseBlock
Bloque de solicitud de uso de herramienta.
ToolResultBlock
Bloque de resultado de ejecución de herramienta.
Tipos de error
Los tipos a continuación definen lo que tu código detecta. Para entradas vinculadas a los mensajes de error que estos tipos generan, con la causa y la solución para cada uno, consulta Solución de problemas.ClaudeSDKError
Clase de excepción base para todos los errores del SDK.
query() de un solo turno termina con un resultado de error, por ejemplo un error de límite de turnos, el SDK genera una ResultError.
CLINotFoundError
Se genera cuando Claude Code CLI no está instalado o no se encuentra.
CLIConnectionError
Se genera cuando la conexión a Claude Code falla.
ProcessError
Se genera cuando el proceso de Claude Code falla.
ResultError
Se genera cuando el proceso de Claude Code se cierra porque la ejecución terminó con un mensaje de resultado de error, como un error de límite de turnos o un error de API. ResultError es una subclase de ProcessError, por lo que un controlador except ProcessError existente también lo detecta. Sus atributos llevan los campos de ese mensaje de resultado, por lo que puedes actuar según por qué falló la ejecución sin analizar el texto del mensaje. Requiere Python Agent SDK 0.2.140 o posterior.
terminal_reason antes de subtype. Cuando la solicitud final falla, como en un error de API, Claude Code informa subtype "success" con la causa en terminal_reason, por ejemplo "api_error"; cuando un límite que estableces termina la ejecución, como max_turns o max_budget_usd, informa un subtipo error_*.
CLIJSONDecodeError
Se genera cuando el análisis JSON falla.
Tipos de hook
Para una guía completa sobre el uso de hooks con ejemplos y patrones comunes, ver la Guía de Hooks.HookEvent
Tipos de evento de hook soportados.
El SDK de TypeScript admite eventos de hook adicionales no disponibles aún en Python. Ver la tabla de disponibilidad de hooks para el soporte por SDK.
HookCallback
Definición de tipo para funciones de devolución de llamada de hook.
input: Entrada de hook fuertemente tipada con uniones discriminadas basadas enhook_event_name(verHookInput)tool_use_id: Identificador de uso de herramienta opcional (para hooks relacionados con herramientas)context: Contexto de hook con información adicional
HookJSONOutput.
HookContext
Información de contexto pasada a devoluciones de llamada de hook.
HookMatcher
Configuración para hacer coincidir hooks con eventos o herramientas específicas.
HookInput
Tipo de unión de todos los tipos de entrada de hook. El tipo real depende del campo hook_event_name.
BaseHookInput
Campos base presentes en todos los tipos de entrada de hook.
PreToolUseHookInput
Datos de entrada para eventos de hook PreToolUse.
PostToolUseHookInput
Datos de entrada para eventos de hook PostToolUse.
PostToolUseFailureHookInput
Datos de entrada para eventos de hook PostToolUseFailure. Se llama cuando la ejecución de una herramienta falla.
UserPromptSubmitHookInput
Datos de entrada para eventos de hook UserPromptSubmit.
StopHookInput
Datos de entrada para eventos de hook Stop.
SubagentStopHookInput
Datos de entrada para eventos de hook SubagentStop.
PreCompactHookInput
Datos de entrada para eventos de hook PreCompact.
NotificationHookInput
Datos de entrada para eventos de hook Notification.
SubagentStartHookInput
Datos de entrada para eventos de hook SubagentStart.
PermissionRequestHookInput
Datos de entrada para eventos de hook PermissionRequest. Permite que los hooks manejen decisiones de permiso programáticamente.
HookJSONOutput
Tipo de unión para valores de retorno de devolución de llamada de hook.
SyncHookJSONOutput
Salida de hook sincrónico con campos de control y decisión.
Usa
continue_ (con guion bajo) en código Python. Se convierte automáticamente a continue cuando se envía al CLI.HookSpecificOutput
Una unión discriminada de tipos de salida específicos del evento TypedDict. El campo hookEventName determina qué campos son válidos. Para detalles completos sobre campos disponibles por evento de hook, ver Controlar la ejecución con hooks.
AsyncHookJSONOutput
Salida de hook asincrónico que difiere la ejecución del hook.
Usa
async_ (con guion bajo) en código Python. Se convierte automáticamente a async cuando se envía al CLI.Ejemplo de uso de hook
Este ejemplo registra dos hooks: uno que bloquea comandos Bash peligrosos comorm -rf /, y otro que registra todo el uso de herramientas para auditoría. El hook de seguridad solo se ejecuta en comandos Bash (a través del matcher), mientras que el hook de registro se ejecuta en todas las herramientas.
Tipos de entrada/salida de herramienta
Documentación de esquemas de entrada/salida para las herramientas integradas de Claude Code. Aunque el SDK de Python no exporta estos como tipos, representan la estructura de entradas y salidas de herramientas en mensajes. Cada salida mostrada es el valor que lees desdeUserMessage.tool_use_result para esa herramienta. Los nombres de clave aparecen exactamente como Claude Code los emite. Una clave anotada | None con un comentario “presente cuando” u “opcional” se omite cuando no aplica.
Agent
Nombre de herramienta:Agent. El nombre anterior Task aún se acepta como alias, y la lista tools en el SystemMessage de inicialización reporta esta herramienta como Task para compatibilidad hacia atrás.
Entrada:
"completed"):
"async_launched"):
"remote_launched"):
status: "completed" para tareas terminadas, "async_launched" para tareas en segundo plano, y "remote_launched" para tareas que Claude Code envió a una sesión en la nube, donde sessionUrl enlaza a esa sesión y taskId la identifica. Si Claude Code mantuvo el worktree aislado del subagente, worktreePath en la variante completed es donde encontrarlo, y worktreeBranch es su rama cuando Claude Code creó el worktree con git.
En la variante completed, resolvedModel nombra el modelo en el que comenzó el subagente, que puede diferir del model de entrada solicitado cuando availableModels u otra sobrescritura se aplica. Este campo requiere Claude Code v2.1.174 o posterior. En la variante async_launched, resolvedModel nombra el modelo en uso cuando el agente se movió al segundo plano, por lo que un cambio que ocurrió antes del envío a segundo plano se refleja allí. El campo modelsUsed en ambas variantes enumera los modelos utilizados en orden, con repeticiones consecutivas colapsadas; se establece solo cuando el modelo se cambió durante la ejecución. modelsUsed y el comportamiento de resolvedModel en el momento del envío a segundo plano requieren Claude Code v2.1.212 o posterior.
Claude Code completa usage y totalTokens desde la solicitud final de API del subagente, no desde toda la ejecución. Cuando está presente, thinking_tokens bajo output_tokens_details en usage es el número de tokens de salida de esa solicitud que fueron tokens de pensamiento. La clave output_tokens_details requiere Python SDK v0.2.136 o posterior, que incluye Claude Code v2.1.228. La clave fallback_credit requiere Python SDK v0.2.162 o posterior, que incluye Claude Code v2.1.285.
AskUserQuestion
Nombre de herramienta:AskUserQuestion
Hace preguntas aclaratorias al usuario durante la ejecución. Consulta Manejar aprobaciones y entrada del usuario para detalles de uso.
Entrada:
Bash
Nombre de herramienta:Bash
Para lo que establece el límite de primer plano, consulta Límites de tiempo de espera y salida. Para el límite de tiempo en segundo plano, consulta Límite de tiempo para comandos en segundo plano.
Entrada:
Monitor
Nombre de herramienta:Monitor
Ejecuta una fuente en segundo plano y entrega cada evento a Claude para que pueda reaccionar sin sondeo: command ejecuta un script y emite un evento por línea stdout, y ws abre un WebSocket y emite un evento por marco de texto. Proporciona exactamente uno de command o ws.
Cuando Monitor ejecuta un comando, sigue las mismas reglas de permisos que Bash; una vigilancia de WebSocket solicita aprobación por separado. La fuente ws requiere Claude Code v2.1.195 o posterior. Consulta la referencia de la herramienta Monitor para comportamiento y disponibilidad de proveedor.
Entrada:
Edit
Nombre de herramienta:Edit
Entrada:
Read
Nombre de herramienta:Read
Entrada:
type para distinguirlas.
Salida (tipo: "text"):
"image"):
"notebook"):
"pdf"):
"parts"):
"file_unchanged"):
Write
Nombre de herramienta:Write
Entrada:
Glob
Nombre de herramienta:Glob
Entrada:
totalMatches y countIsComplete requieren Claude Code v2.1.191 o posterior.
Grep
Nombre de herramienta:Grep
Entrada:
output_mode.
totalFiles requiere Claude Code v2.1.208 o posterior. totalLines requiere Claude Code v2.1.210 o posterior.
NotebookEdit
Nombre de herramienta:NotebookEdit
Entrada:
WebFetch
Nombre de herramienta:WebFetch
Entrada:
WebSearch
Nombre de herramienta:WebSearch
Entrada:
TodoWrite
Nombre de herramienta:TodoWrite
Las siguientes herramientas están disponibles por defecto solo en Claude Opus 4.7, Claude Sonnet 4.6, Claude Haiku 4.5 y modelos anteriores. En todos los demás modelos, incluidos los ID de modelo que Claude Code no reconoce, no están disponibles a menos que optes por incluirlas:
TodoWriteTaskCreateTaskGetTaskUpdateTaskList
TodoWrite en su lugar cuando establece CLAUDE_CODE_ENABLE_TASKS=0.Este conjunto predeterminado se aplica en Claude Code v2.1.268 y posterior, que el TypeScript Agent SDK agrupa desde v0.3.268.Consulta Disponibilidad de modelos para optar por participar.TaskCreate
Nombre de herramienta:TaskCreate
Entrada:
TaskUpdate
Nombre de herramienta:TaskUpdate
Entrada:
TaskGet
Nombre de herramienta:TaskGet
Entrada:
TaskList
Nombre de herramienta:TaskList
Entrada:
TaskOutput
Eliminado en Claude Code v2.1.277. Anteriormente recuperaba la salida de una tarea en segundo plano en ejecución o completada, conBashOutput aceptado como alias; Claude lee el archivo de salida de una tarea en segundo plano con Read en su lugar.
Una entrada disallowed_tools o una regla de denegación que aún nombre cualquiera de estos nombres se ignora sin una advertencia.
TaskStop
Nombre de herramienta:TaskStop. Los nombres anteriores KillShell y KillBash aún se aceptan como alias.
Entrada:
ExitPlanMode
Nombre de herramienta:ExitPlanMode
Entrada:
ListMcpResources
Nombre de herramienta:ListMcpResourcesTool
Entrada:
tool_use_result contiene una list para esta herramienta.
Salida:
ReadMcpResource
Nombre de herramienta:ReadMcpResourceTool
Entrada:
Construir una interfaz de conversación continua
El siguiente ejemplo mantiene unClaudeSDKClient conectado a través de turnos, para que Claude recuerde los mensajes anteriores. Escriba new para desconectar y reconectar para una sesión nueva, o exit para terminar la conversación.
Manejo de errores
El siguiente ejemplo envuelve una llamada aquery() en manejadores para cuatro de los tipos de error que el SDK genera.
Este ejemplo captura ResultError, que requiere Python Agent SDK 0.2.140 o posterior.
Configuración de sandbox
SandboxSettings
Configuración para el comportamiento de sandbox. Use esto para habilitar el sandboxing de comandos y configurar restricciones de red programáticamente.
El sandbox depende de la compatibilidad de la plataforma y, en Linux, de herramientas como
bubblewrap y socat. De forma predeterminada, cuando enabled es True pero el sandbox no puede iniciarse, los comandos se ejecutan sin sandbox con una advertencia en stderr. Este comportamiento predeterminado difiere del SDK de TypeScript, donde failIfUnavailable tiene un valor predeterminado de true.Establece "failIfUnavailable": True en tu configuración de sandbox para detener en su lugar. El SDK reenvía failIfUnavailable a Claude Code junto con los campos declarados de SandboxSettings. query() luego reporta un ResultMessage con subtype="error_during_execution" y la razón en errors. Debido a que se trata de una llamada única a query(), el SDK lanza después de ceder ese resultado de error, así que envuelve el bucle en un bloque try para continuar pasado él. Consulta Manejar el resultado para el contrato de error.denyWrite en tu configuración de sandbox, como "filesystem": {"denyWrite": ["/home/user/project/.env"]}. El SDK reenvía filesystem a Claude Code junto con los campos declarados de SandboxSettings. Una vez que el sandbox se inicia, bloquea las escrituras en cada ruta absoluta que listaste.
Ejemplo de uso
SandboxNetworkConfig
Configuración específica de red para modo sandbox. Estas configuraciones se aplican a comandos Bash en sandbox cuando enabled es True en la SandboxSettings principal. No restringen la herramienta WebFetch, que utiliza reglas de permisos en su lugar.
El proxy de sandbox integrado aplica la lista de permitidos de red basada en el nombre de host solicitado y no termina ni inspecciona el tráfico TLS, por lo que técnicas como domain fronting potencialmente pueden evitarlo. Consulte Limitaciones de seguridad de sandboxing para obtener detalles y Implementación segura para configurar un proxy que termine TLS.
SandboxIgnoreViolations
Configuración para ignorar violaciones de sandbox específicas.
Respaldo de permisos para comandos sin sandbox
CuandoallowUnsandboxedCommands está habilitado, el modelo puede solicitar ejecutar comandos fuera del sandbox estableciendo dangerouslyDisableSandbox: True en la entrada de la herramienta. Estas solicitudes vuelven al sistema de permisos existente, lo que significa que se invocará su controlador can_use_tool, permitiéndole implementar lógica de autorización personalizada.
Sus entradas de excludedCommands en su lugar evitan el sandbox sin participación del modelo; sandbox.excludedCommands cubre cuándo se aplica una entrada.
El siguiente ejemplo registra cada solicitud sin sandbox y la deniega a menos que su propia lógica de autorización la permita:
Ver también
- SDK overview - Conceptos generales del SDK
- TypeScript SDK reference - Documentación del SDK de TypeScript
- Custom tools - Define herramientas MCP en proceso para que Claude llame
- CLI reference - Interfaz de línea de comandos
- Common workflows - Guías paso a paso