Skip to main content

Installation

Installez le package dans un environnement virtuel. Sur les installations récentes de Debian, Ubuntu et Homebrew Python, l’exécution de pip install contre le Python système échoue avec error: externally-managed-environment.
Pour uv, Windows PowerShell et la configuration de la clé API, consultez Démarrer dans la vue d’ensemble du Agent SDK.

Choisir entre query() et ClaudeSDKClient

Le SDK Python offre deux façons d’interagir avec Claude Code : Utilisez ClaudeSDKClient pour les applications interactives telles que les interfaces de chat, ou quand l’action suivante dépend de la réponse de Claude.

Fonctions

Les blocs de signature et les fragments async for / async with nus sur cette page sont illustratifs. Pour les exécuter, enveloppez le corps dans async def main(): ... et appelez asyncio.run(main()).

query()

Crée une nouvelle session pour chaque interaction avec Claude Code par défaut. Retourne un itérateur asynchrone qui produit les messages au fur et à mesure qu’ils arrivent. Chaque appel à query() recommence à zéro sans mémoire des interactions précédentes, sauf si vous passez continue_conversation=True ou resume dans ClaudeAgentOptions. Voir Sessions.

Paramètres

Retours

Retourne un AsyncIterator[Message] qui produit les messages de la conversation.

Exemple - Avec options

tool()

Décorateur pour définir des outils MCP avec sécurité des types.

Paramètres

Options de schéma d’entrée

  1. Mappage de type simple (recommandé) :
  2. Format JSON Schema (pour la validation complexe) :
  3. Classe TypedDict : un schéma typé dont les clés NotRequired sont exclues de required.
    • Python 3.11 et ultérieur : importez TypedDict et NotRequired depuis typing.
    • Python 3.10 : typing ne fournit pas NotRequired. Importez TypedDict et NotRequired depuis typing_extensions, que le SDK installe sous Python 3.10.
Dans les formes de mappage simple et TypedDict, enveloppez un type dans Annotated[type, "description"] pour définir la description du champ.

Retours

Une fonction décorateur qui enveloppe l’implémentation de l’outil et retourne une instance SdkMcpTool.

Exemple

ToolAnnotations

Indices comportementaux pour un outil, passés comme argument annotations de tool(). ToolAnnotations étend mcp.types.ToolAnnotations du SDK MCP avec un champ maxResultSizeChars, et vous pouvez écrire chaque indice en camelCase ou snake_case : ToolAnnotations(readOnlyHint=True) et ToolAnnotations(read_only_hint=True) sont équivalents. Pour relire un indice depuis l’objet, utilisez l’orthographe déclarée par votre package mcp installé : .readOnlyHint sur mcp 1.x et .read_only_hint sur 2.x, tandis que .maxResultSizeChars fonctionne sur les deux. Vous pouvez également passer un mcp.types.ToolAnnotations simple partout où le SDK accepte des annotations. Les noms snake_case et le champ typé maxResultSizeChars nécessitent Python Agent SDK 0.2.140 ou ultérieur. Les versions 0.1.31 à 0.2.139 réexportent mcp.types.ToolAnnotations inchangé. Sur les versions 0.1.55 à 0.2.139, vous pouvez toujours passer maxResultSizeChars comme argument de mot-clé : la classe MCP accepte les champs supplémentaires, et le SDK transmet la valeur à Claude Code. Tous les champs sont optionnels. Les clients ne doivent pas s’y fier pour les décisions de sécurité.

create_sdk_mcp_server()

Crée un serveur MCP en processus qui s’exécute dans votre application Python.

Paramètres

Retours

Retourne un objet McpSdkServerConfig qui peut être passé à ClaudeAgentOptions.mcp_servers.

Exemple

list_sessions()

Liste les sessions passées avec métadonnées. Filtrez par répertoire de projet ou listez les sessions dans tous les projets. Synchrone ; retourne immédiatement.

Paramètres

Type de retour : SDKSessionInfo

Exemple

Affiche les 10 sessions les plus récentes pour un projet. Les résultats sont triés par last_modified décroissant, donc le premier élément est le plus récent. Omettez directory pour rechercher dans tous les projets.

get_session_messages()

Récupère les messages d’une session passée. Synchrone ; retourne immédiatement.

Paramètres

Type de retour : SessionMessage

Exemple

get_session_info()

Lit les métadonnées d’une seule session par ID sans scanner le répertoire de projet complet. Synchrone ; retourne immédiatement.

Paramètres

Retourne SDKSessionInfo, ou None si la session n’est pas trouvée.

Exemple

Recherchez les métadonnées d’une seule session sans scanner le répertoire de projet. Utile quand vous avez déjà un ID de session d’une exécution précédente.

rename_session()

Renomme une session en ajoutant une entrée de titre personnalisé. Les appels répétés sont sûrs ; le titre le plus récent gagne. Synchrone.

Paramètres

Lève ValueError si session_id n’est pas un UUID valide ou si title est vide ; FileNotFoundError si la session ne peut pas être trouvée.

Exemple

Renommez la session la plus récente pour qu’elle soit plus facile à trouver plus tard. Le nouveau titre apparaît dans SDKSessionInfo.custom_title lors des lectures ultérieures.

tag_session()

Étiquette une session. Passez None pour effacer l’étiquette. Les appels répétés sont sûrs ; l’étiquette la plus récente gagne. Synchrone.

Paramètres

Lève ValueError si session_id n’est pas un UUID valide ou si tag est vide après nettoyage ; FileNotFoundError si la session ne peut pas être trouvée.

Exemple

Étiquetez une session, puis filtrez par cette étiquette lors d’une lecture ultérieure. Passez None pour effacer une étiquette existante.

fork_session()

Copie la transcription d’une session dans une nouvelle session afin que vous puissiez orienter la conversation dans une autre direction tout en laissant l’originale inchangée. Pour créer une branche à partir d’un point antérieur de la conversation, passez up_to_message_id. Synchrone.

Paramètres

Retourne un ForkSessionResult dont le session_id est l’UUID de la nouvelle session. Passez-le comme resume pour poursuivre le fork. Le fork n’inclut pas les checkpoints de fichiers de la session originale, vous ne pouvez donc pas le ramener à un checkpoint capturé avant le fork. fork_session() lève :
  • ValueError : session_id ou up_to_message_id n’est pas un UUID valide
  • ValueError : la session ne contient aucun message, ou up_to_message_id ne correspond à aucun message de la transcription
  • FileNotFoundError : la session ne peut pas être trouvée

Exemple

Forkez la session la plus récente sous un nouveau titre, puis reprenez le fork. La session originale conserve son propre historique.

Classes

ClaudeSDKClient

Maintient une session de conversation sur plusieurs échanges. C’est l’équivalent Python de la façon dont la fonction query() du SDK TypeScript fonctionne en interne - elle crée un objet client qui peut continuer les conversations. Voir la comparaison avec query().

Méthodes

Support du gestionnaire de contexte

Le client peut être utilisé comme un gestionnaire de contexte asynchrone pour la gestion automatique de la connexion :
Important : Lors de l’itération sur les messages, évitez d’utiliser break pour quitter tôt car cela peut causer des problèmes de nettoyage asyncio. À la place, laissez l’itération se terminer naturellement ou utilisez des drapeaux pour suivre quand vous avez trouvé ce que vous cherchiez.

Exemple - Continuer une conversation

Exemple - Entrée en streaming avec ClaudeSDKClient

query() accepte également un itérable asynchrone de dicts de messages utilisateur, vous permettant d’assembler le prompt au moment de l’envoi ou d’inclure des blocs de contenu tels que des images. Claude Code commence à répondre au premier message cédé dès qu’il arrive, sans attendre que l’itérable se termine, et receive_response() s’arrête au ResultMessage qui termine cette réponse. Mettez tout ce que Claude doit lire avant de répondre dans un seul message, comme le fait ce générateur, et associez chaque appel query() à sa propre boucle receive_response().

Exemple - Utiliser les interruptions

Comportement du buffer après interruption : interrupt() envoie un signal d’arrêt mais ne vide pas le buffer de messages. Les messages déjà produits par la tâche interrompue, incluant son ResultMessage, restent dans le flux. Vous devez les vider avec receive_response() avant de lire la réponse à une nouvelle requête. Si vous envoyez une nouvelle requête immédiatement après interrupt() et appelez receive_response() une seule fois, vous recevrez les messages de la tâche interrompue, pas la réponse de la nouvelle requête.

Exemple - Contrôle avancé des permissions

Types

@dataclass vs TypedDict : Ce SDK utilise deux types de classes. Les classes décorées avec @dataclass (telles que ResultMessage, AgentDefinition, TextBlock) sont des instances d’objets à l’exécution et supportent l’accès par attribut : msg.result. Les classes définies avec TypedDict (telles que ThinkingConfigEnabled, McpStdioServerConfig, SyncHookJSONOutput) sont des dicts simples à l’exécution et nécessitent l’accès par clé : config["budget_tokens"], pas config.budget_tokens. La syntaxe d’appel ClassName(field=value) fonctionne pour les deux, mais seules les dataclasses produisent des objets avec des attributs.

SdkMcpTool

Définition d’un outil MCP SDK créé avec le décorateur @tool.

Transport

Classe de base abstraite pour les implémentations de transport personnalisées. Utilisez ceci pour communiquer avec le processus Claude sur un canal personnalisé (par exemple, une connexion distante au lieu d’un sous-processus local).
Ceci est une API interne de bas niveau. L’interface peut changer dans les versions futures. Les implémentations personnalisées doivent être mises à jour pour correspondre à tout changement d’interface.
Import : from claude_agent_sdk import Transport

ClaudeAgentOptions

Dataclass de configuration pour les requêtes Claude Code.

Gérer les réponses API lentes ou bloquées

Le sous-processus CLI lit plusieurs variables d’environnement qui contrôlent les délais d’attente de l’API et la détection de blocage. Transmettez-les via ClaudeAgentOptions.env :
  • API_TIMEOUT_MS : délai d’attente par requête sur le client Anthropic, en millisecondes. Par défaut 600000. S’applique à la boucle principale et à tous les sous-agents.
  • CLAUDE_CODE_MAX_RETRIES : nombre maximum de nouvelles tentatives d’API. Par défaut 10, plafonné à 15. Chaque tentative obtient sa propre fenêtre API_TIMEOUT_MS. Pour les exécutions sans surveillance qui doivent attendre la fin de pannes plus longues, définissez CLAUDE_CODE_RETRY_WATCHDOG=1 : il réessaie les erreurs de capacité transitoires indéfiniment et, sur Claude Code v2.1.199 ou ultérieur, augmente la valeur par défaut pour les autres erreurs transitoires à 300 et supprime le plafond sur cette variable.
  • CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS : chien de garde de blocage pour les sous-agents. Pendant que le chien de garde de flux est activé, la valeur par défaut est CLAUDE_STREAM_IDLE_TIMEOUT_MS plus 5 minutes, ce qui donne 600000 sauf si vous augmentez cette variable. Avec le chien de garde de flux désactivé, la valeur par défaut est 600000. Avant v2.1.257, la valeur par défaut était toujours 600000. Le minuteur se réinitialise à chaque événement de flux. En cas de blocage, Claude Code abandonne le sous-agent et signale le blocage au parent. Pour un sous-agent en arrière-plan, il marque également la tâche comme échouée et joint tout résultat partiel.
  • CLAUDE_ENABLE_STREAM_WATCHDOG avec CLAUDE_STREAM_IDLE_TIMEOUT_MS : chien de garde de flux qui abandonne la requête quand les en-têtes sont arrivés mais que le corps de la réponse cesse d’être envoyé en streaming. Le chien de garde est activé par défaut pour tous les fournisseurs ; définissez CLAUDE_ENABLE_STREAM_WATCHDOG=0 pour le désactiver. CLAUDE_STREAM_IDLE_TIMEOUT_MS vaut par défaut 300000 et est limité à ce minimum. Après l’abandon, Nouvelles tentatives automatiques décrit ce que fait Claude Code, en fonction de la progression de la réponse. Pendant que le chien de garde attend une réponse qu’une passerelle derrière ANTHROPIC_BASE_URL maintient ouverte avec des pings de maintien de connexion, un hôte qui définit include_partial_messages continue de recevoir des messages StreamEvent de ping. Interprétez ces frames comme un signe d’activité plutôt que de faire expirer la session en cas de silence. Avant v2.1.257, les frames s’arrêtaient 5 minutes après le dernier événement de flux réel.

OutputFormat

Configuration pour la validation de sortie structurée. Passez ceci en tant que dict au champ output_format sur ClaudeAgentOptions :

SystemPromptPreset

Configuration pour utiliser le prompt système prédéfini de Claude Code avec des additions optionnelles.

SystemPromptCustom

Un prompt système personnalisé sous forme d’objet, équivalent à passer une chaîne en tant que system_prompt, qui peut également définir snapshot. Nécessite claude-agent-sdk v0.2.153 ou ultérieur.

SystemPromptFile

Configuration pour charger un prompt système personnalisé à partir d’un fichier au lieu de le passer en tant que chaîne. Le SDK mappe ceci au flag CLI --system-prompt-file. Utilisez la forme fichier quand le prompt est volumineux : le SDK transmet un system_prompt chaîne sur l’argv du sous-processus CLI, qui est soumis aux limites de longueur de ligne de commande du système d’exploitation avant que le SDK n’envoie une requête API. Sur Linux, un seul argument plus long qu’environ 128 KB échoue au lancement du processus avec Argument list too long. Sur Windows, la ligne de commande entière est plafonnée à environ 32 KB, donc la forme chaîne échoue à un seuil inférieur.

SettingSource

Contrôle à partir de quelles sources de configuration basées sur le système de fichiers le SDK charge les paramètres.

Comportement par défaut

Quand setting_sources est omis ou None et skills n’est pas défini, query() charge les mêmes paramètres du système de fichiers que le CLI Claude Code : utilisateur, projet et local. Avec skills défini, la ligne setting_sources décrit la valeur par défaut actuelle. La politique gérée par le point de terminaison est chargée dans tous les cas ; les paramètres gérés par le serveur sont récupérés quand la session s’authentifie avec des identifiants d’organisation sur une configuration éligible. Pour plus d’informations, voir Ce que settingSources ne contrôle pas.

Pourquoi utiliser setting_sources

Désactiver les paramètres du système de fichiers :
Dans Python SDK 0.1.59 et antérieur, une liste vide était traitée de la même manière que l’omission de l’option, donc setting_sources=[] ne désactivait pas les paramètres du système de fichiers. Mettez à niveau vers une version plus récente si vous avez besoin qu’une liste vide prenne effet. Le SDK TypeScript n’est pas affecté.
Charger uniquement des sources de paramètres spécifiques :
Applications SDK uniquement :
Pour charger les instructions de projet CLAUDE.md, incluez "project" dans setting_sources. Voir Modifier les prompts système pour savoir comment le chargement de CLAUDE.md interagit avec les options de prompt système.

Priorité des paramètres

Quand plusieurs sources sont chargées, les paramètres sont fusionnés selon cette priorité (de la plus haute à la plus basse) :
  1. Paramètres locaux (.claude/settings.local.json)
  2. Paramètres de projet (.claude/settings.json)
  3. Paramètres utilisateur (~/.claude/settings.json)
Les options programmatiques telles que agents, allowed_tools, et settings remplacent les paramètres du système de fichiers utilisateur, projet et local. Les paramètres de politique gérée ont priorité sur les options programmatiques.

AgentDefinition

Configuration pour un sous-agent défini par programmation.
Les noms de champs AgentDefinition utilisent camelCase, tels que disallowedTools, permissionMode, et maxTurns. Ces noms correspondent directement au format de fil partagé avec le SDK TypeScript. Cela diffère de ClaudeAgentOptions, qui utilise Python snake_case pour les champs de niveau supérieur équivalents tels que disallowed_tools et permission_mode. Parce que AgentDefinition est une dataclass, passer un mot-clé snake_case lève une TypeError au moment de la construction.

PermissionMode

Modes de permission pour contrôler l’exécution des outils.

EffortLevel

Niveaux d’effort pour guider la profondeur de réflexion.

CanUseTool

Alias de type pour les fonctions de rappel de permission d’outil.
Le rappel reçoit :
  • tool_name : Nom de l’outil appelé
  • input_data : Les paramètres d’entrée de l’outil
  • context : Un ToolPermissionContext avec des informations supplémentaires
Retourne un PermissionResult (soit PermissionResultAllow soit PermissionResultDeny). Le rappel est le remplacement SDK de la demande de permission interactive : il est invoqué uniquement quand le flux d’évaluation des permissions aboutit à une demande de permission. Les appels d’outils déjà approuvés par une entrée allowed_tools, une règle d’autorisation des paramètres, ou le mode de permission, tel que acceptEdits ou bypassPermissions, ne l’invoquent jamais. Pour contrôler chaque appel d’outil, utilisez plutôt un hook PreToolUse. Une règle d’autorisation ne pré-approuve pas les actions qu’aucun mode n’approuve automatiquement ; voir Comment les permissions sont évaluées pour savoir lesquelles d’entre elles atteignent le rappel et ce qui se passe en mode dontAsk et auto.

ToolPermissionContext

Informations de contexte transmises aux rappels de permission d’outil.

PermissionResult

Type union pour les résultats de rappel de permission.

PermissionResultAllow

Résultat indiquant que l’appel d’outil doit être autorisé.

PermissionResultDeny

Résultat indiquant que l’appel d’outil doit être refusé.

PermissionUpdate

Configuration pour mettre à jour les permissions par programmation.

PermissionRuleValue

Une règle à ajouter, remplacer ou supprimer dans une mise à jour de permission.

ToolsPreset

Configuration des outils prédéfinis pour utiliser l’ensemble d’outils par défaut de Claude Code.

ThinkingConfig

Contrôle le comportement de la réflexion étendue. Une union de trois configurations :
Le champ display optionnel contrôle si le texte de réflexion est retourné "summarized" ou "omitted". Sur Claude Opus 4.7 et ultérieur, la valeur par défaut de l’API est "omitted", donc définissez "summarized" pour recevoir le contenu de réflexion dans les sorties ThinkingBlock. Claude Code ne transmet pas votre valeur display à certains fournisseurs, tels qu’Amazon Bedrock et Agent Platform de Google Cloud. Sur ces fournisseurs, Opus 4.7 et ultérieur retournent des sorties ThinkingBlock vides même quand vous définissez display à "summarized". Parce que ce sont des classes TypedDict, ce sont des dicts simples à l’exécution. Construisez-les soit comme des littéraux dict soit appelez la classe comme un constructeur ; les deux produisent un dict. Accédez aux champs avec config["budget_tokens"], pas config.budget_tokens :

TaskBudget

Budget de tâche côté API en tokens, utilisé avec le champ task_budget dans ClaudeAgentOptions.
Parce que c’est un TypedDict, passez-le comme un dict simple, tel que ClaudeAgentOptions(task_budget={"total": 50000}).

SdkBeta

Type littéral pour les fonctionnalités bêta du SDK.
Utilisez avec le champ betas dans ClaudeAgentOptions pour activer les fonctionnalités bêta.
Sur l’API Claude, la bêta context-1m-2025-08-07 est retirée pour Claude Sonnet 4.5 et Claude Sonnet 4. Si vous la passez encore avec l’un de ces modèles, les requêtes qui dépassent la fenêtre de contexte standard de 200K tokens retournent une erreur ; supprimez-la donc de betas. Pour exécuter une session avec une fenêtre de contexte de 1M tokens, définissez model sur un modèle qui utilise la fenêtre de 1M par défaut, tel que claude-sonnet-5-5 ou claude-opus-5-5. Pour un modèle qui n’atteint 1M que via sa variante [1m], ajoutez le suffixe à l’ID du modèle, comme dans claude-opus-4-6[1m].

McpSdkServerConfig

Configuration pour les serveurs MCP SDK créés avec create_sdk_mcp_server().

McpServerConfig

Type union pour les configurations de serveur MCP.

McpStdioServerConfig

McpSSEServerConfig

McpHttpServerConfig

McpServerStatusConfig

La configuration d’un serveur MCP telle que signalée par get_mcp_status(). Ceci est l’union de toutes les variantes de transport McpServerConfig plus une variante de sortie uniquement claudeai-proxy pour les serveurs proxifiés via claude.ai.
McpSdkServerConfigStatus est la forme sérialisable de McpSdkServerConfig avec uniquement les champs type ("sdk") et name (str) ; l’instance en processus est omise. McpClaudeAIProxyServerConfig a les champs type ("claudeai-proxy"), url (str), et id (str).

McpStatusResponse

Réponse de ClaudeSDKClient.get_mcp_status(). Enveloppe la liste des statuts de serveur sous la clé mcpServers.

McpServerStatus

Statut d’un serveur MCP connecté, contenu dans McpStatusResponse.

ContextUsageResponse

Réponse de ClaudeSDKClient.get_context_usage(). Ceci est la même charge utile que Claude Code rend pour la commande /context dans une session interactive, donc aux côtés des comptages de tokens elle porte des champs d’affichage tels que color et gridRows que Claude Code utilise pour dessiner la grille d’utilisation /context. Claude Code construit cette charge utile en envoyant plusieurs requêtes à l’API de comptage de tokens. Ces requêtes n’apparaissent pas dans le flux de messages, donc le suivi des coûts qui lit le flux ne les verra pas. Sur l’API Anthropic, le comptage de tokens n’est pas facturé.
Chaque entrée ContextUsageCategory porte name, tokens, color, et un flag optionnel isDeferred. totalTokens est l’utilisation de contexte actuelle de la session, et maxTokens est la fenêtre par rapport à laquelle cette utilisation est mesurée. Cette fenêtre est la fenêtre de contexte du modèle, ou la fenêtre de compaction automatique inférieure quand elle s’applique, et rawMaxTokens porte la même valeur que maxTokens. apiUsage contient l’utilisation de la dernière réponse API, pas un total cumulé pour la session. Claude Code laisse les clés optionnelles deferredBuiltinTools, systemTools, et systemPromptSections non définies, donc attendez-vous à ce qu’elles soient absentes même si le type les déclare.

SdkPluginConfig

Configuration pour charger les plugins dans le SDK.
Exemple :
Pour des informations complètes sur la création et l’utilisation de plugins, voir Plugins.

Types de messages

Message

Type union de tous les messages possibles.

UserMessage

Message d’entrée utilisateur.
Le SDK transmet tool_use_result inchangé depuis le CLI. Pour un outil sur un serveur MCP externe dont le résultat contient des blocs resource_link, le dict a une clé resourceLinks contenant une liste de dicts avec les clés du type TypeScript SDKMcpResourceLink. Claude reçoit chaque lien sous forme de ligne de texte dans le résultat de l’outil. Pour afficher les fichiers que le serveur a retournés, lisez resourceLinks au lieu d’analyser ce texte. La clé resourceLinks nécessite Python Agent SDK 0.2.150 ou ultérieur et Claude Code v2.1.257 ou ultérieur ; le CLI fourni avec cette version du SDK satisfait l’exigence de Claude Code. Le CLI omet la clé quand le résultat n’a pas de liens et sur les résultats des sous-agents. Le CLI conserve au maximum 50 liens par résultat et arrête d’ajouter des liens une fois que la liste atteint 64 KiB de JSON sérialisé. Un outil que vous définissez en processus avec tool() ne produit jamais la clé, car le SDK aplatit ses blocs resource_link en texte avant que le CLI ne voie le résultat.

AssistantMessage

Message de réponse d’assistant avec blocs de contenu.

AssistantMessageError

Types d’erreur possibles pour les messages d’assistant.
Le processus CLI sous-jacent peut émettre des types d’erreur que ce Literal ne liste pas, tels que max_output_tokens. Le SDK transmet la valeur inchangée, donc traitez les chaînes en dehors de cette liste de la même manière que vous traitez unknown. Le type TypeScript SDKAssistantMessageError liste l’ensemble complet des valeurs que le CLI peut émettre.

SystemMessage

Message système avec métadonnées.
Les sous-types qui n’ont pas de dataclass propre arrivent sous forme de SystemMessage. Pour suivre la session entre les tours, définissez CLAUDE_CODE_EMIT_SESSION_STATE_EVENTS=1 et lisez message.data["state"] sur chaque message dont le subtype est session_state_changed. SDKSessionStateChangedMessage liste les états qu’il peut porter. Itérez avec receive_messages() pour les lire : receive_response() s’arrête au ResultMessage, et un message session_state_changed peut suivre ce résultat.

ResultMessage

Message de résultat final avec informations de coût et d’utilisation.
Le champ subtype détermine quels autres champs sont remplis. C’est l’un de "success", "error_during_execution", "error_max_turns", "error_max_budget_usd", ou "error_max_structured_output_retries". La dataclass Python aplatit toutes les variantes en une seule forme, donc les champs qui ne s’appliquent pas au sous-type retourné sont None. Plusieurs champs portent des détails de diagnostic sur la façon dont la conversation s’est terminée :
  • is_error : True quand la conversation s’est terminée dans un état d’erreur. Toujours True sur les sous-types error_*. Sur subtype="success" c’est True quand la dernière requête de modèle a échoué, ce qui signifie que la boucle d’agent s’est terminée mais le dernier appel API a retourné une erreur.
  • api_error_status : le code de statut HTTP de l’erreur API terminale. None quand le tour s’est terminé sans une. Rempli uniquement sur subtype="success".
  • result : texte du message d’assistant final sur subtype="success", ou None sur les sous-types error_*. Quand subtype="success" et is_error=True, ceci contient la chaîne d’erreur API si une est disponible mais peut être vide, donc vérifiez api_error_status et le contenu AssistantMessage précédent pour plus de détails.
  • errors : chaînes d’erreur au niveau de la boucle telles que le message max-turns. Rempli uniquement sur les sous-types error_*.
  • terminal_reason : pourquoi la boucle de requête s’est terminée, telle que "completed", "max_turns", "api_error", "aborted_streaming", ou "aborted_tools". Une valeur de "aborted_streaming" ou "aborted_tools" signifie que le tour a été interrompu avant de se terminer. Les causes courantes sont interrupt() et un rappel de permission retournant PermissionResultDeny avec interrupt=True. None sur les versions CLI qui précèdent le champ, sur les résultats des commandes locales telles que /voice ou /usage, qui contournent la boucle de requête, ou sur les résultats d’erreur synthétisés émis quand la session échoue fatalement. Reflète le SDKResultMessage.terminal_reason du SDK TypeScript, qui liste l’ensemble complet des valeurs.
  • origin : origine du message utilisateur qui a déclenché ce tour. En mode d’entrée en streaming, vérifiez ceci pour distinguer le résultat de votre propre prompt, où origin est None ou {"kind": "human"}, du résultat d’un tour injecté tel qu’une notification de tâche en arrière-plan. Nécessite Python Agent SDK 0.2.137 ou ultérieur.
Quand plusieurs tâches en arrière-plan se terminent à peu d’intervalle, Claude Code peut répondre à leurs notifications en un seul tour plutôt qu’en un tour pour chacune. Vous recevez toujours un ResultMessage par notification, dans l’ordre, chacun avec un origin dont le kind est "task-notification". Tous sauf le dernier ont num_turns défini à 0 et un result vide, et le dernier porte le tour qui répond à toutes. Le dict usage couvre uniquement la boucle d’agent principal et exclut les sous-agents et autres appels de modèle imbriqués ou auxiliaires. En mode d’entrée en streaming, les valeurs sont par tour. Préférez model_usage pour la comptabilité des tokens et des coûts. Le dict usage contient les clés suivantes quand présentes : Le dict model_usage mappe les noms de modèles à l’utilisation par modèle. Il couvre chaque appel de modèle effectué via le pipeline de requête : la boucle principale, les sous-agents, et les appels internes tels que la compaction et les agents Workflow. Les appels d’assistance en dehors de ce pipeline, tels que le classificateur de permission et les requêtes de comptage de tokens, sont exclus de model_usage. Traitez model_usage comme une estimation, pas une déclaration de facturation. En mode d’entrée en streaming, model_usage et total_cost_usd sont cumulatifs entre les tours, donc lisez le dernier résultat plutôt que de faire la somme entre les résultats. Un appel qui reprend une session compte également les totaux restaurés à partir des appels antérieurs de la session. Voir Suivre les coûts en mode d’entrée en streaming pour les réinitialisations et Récupérer les totaux après un crash de session pour les résultats remis à zéro. Chaque valeur dans model_usage est un TypedDict ModelUsage, importé via from claude_agent_sdk.types import ModelUsage. Ses clés utilisent camelCase car le SDK transmet la valeur inchangée du processus CLI sous-jacent, correspondant au type TypeScript ModelUsage :

StreamEvent

Événement de flux pour les mises à jour de messages partiels pendant le streaming. Reçu uniquement quand include_partial_messages=True dans ClaudeAgentOptions. Importez via from claude_agent_sdk.types import StreamEvent.

RateLimitEvent

Émis quand le statut de limite de débit change (par exemple, de "allowed" à "allowed_warning"). Utilisez ceci pour avertir les utilisateurs avant qu’ils ne frappent une limite dure, ou pour reculer quand le statut est "rejected".

RateLimitInfo

État de limite de débit porté par RateLimitEvent.

ConversationResetMessage

Émis quand la conversation est remplacée sans terminer la connexion, par exemple après /clear. Voir Suivre les coûts en mode d’entrée en streaming pour la façon dont une réinitialisation affecte les totaux en cours d’exécution sur les objets ResultMessage ultérieurs. Nécessite Python Agent SDK 0.2.137 ou ultérieur.

TaskStartedMessage

Émis quand une tâche en arrière-plan démarre. Une tâche en arrière-plan est tout ce qui est suivi en dehors du tour principal : une commande Bash en arrière-plan, une surveillance Monitor, un sous-agent généré via l’outil Agent, ou un agent distant. Le champ task_type vous dit lequel. Ce nommage n’est pas lié au renommage de l’outil Task-à-Agent.

TaskUsage

Données de tokens et de timing pour une tâche en arrière-plan.

TaskProgressMessage

Émis périodiquement avec les mises à jour de progression pour une tâche en arrière-plan en cours d’exécution.

TaskNotificationMessage

Émis quand une tâche en arrière-plan se termine, échoue, ou est arrêtée. Les tâches en arrière-plan incluent les commandes Bash run_in_background, les surveillances Monitor, et les sous-agents en arrière-plan.
Quand le CLI déplace un long appel d’outil MCP en arrière-plan, le résultat de l’outil pour cet appel ne contient qu’un espace réservé et le résultat réel de l’appel arrive dans ce message. Sur une notification "completed" pour un tel appel, le CLI ajoute une clé resource_links listant les fichiers que l’outil a retournés par référence, avec les mêmes entrées et limites que la clé resourceLinks sur UserMessage.tool_use_result. La clé resource_links nécessite Python Agent SDK 0.2.150 ou ultérieur et Claude Code v2.1.257 ou ultérieur ; le CLI fourni avec cette version du SDK satisfait l’exigence de Claude Code. La dataclass n’a pas de champ pour resource_links. Lisez-le à partir du dict data que le message hérite de SystemMessage : message.data.get("resource_links"). Faites correspondre la notification à l’appel avec tool_use_id. Le CLI omet la clé quand le résultat n’avait pas de liens et sur les notifications pour les tâches qui ne sont pas des appels d’outil MCP.

Types de blocs de contenu

ContentBlock

Type union de tous les blocs de contenu.

TextBlock

Bloc de contenu texte.

ThinkingBlock

Bloc de contenu de réflexion (pour les modèles avec capacité de réflexion).

ToolUseBlock

Bloc de requête d’utilisation d’outil.

ToolResultBlock

Bloc de résultat d’exécution d’outil.

Types d’erreur

Les types ci-dessous définissent ce que votre code capture. Pour les entrées associées aux messages d’erreur que ces types lèvent, avec la cause et la correction pour chacun, consultez Dépannage.

ClaudeSDKError

Classe d’exception de base pour toutes les erreurs du SDK.
Quand une requête query() unique se termine par un résultat d’erreur, par exemple une erreur de limite de tours, le SDK lève une ResultError.

CLINotFoundError

Levée quand Claude Code CLI n’est pas installé ou introuvable.

CLIConnectionError

Levée quand la connexion à Claude Code échoue.

ProcessError

Levée quand le processus Claude Code échoue.

ResultError

Levée quand le processus Claude Code se termine parce que l’exécution s’est terminée par un message de résultat d’erreur, comme une erreur de limite de tours ou une erreur API. ResultError est une sous-classe de ProcessError, donc un gestionnaire except ProcessError existant la capture également. Ses attributs portent les champs de ce message de résultat, vous pouvez donc adapter votre logique selon la raison de l’échec de l’exécution sans analyser le texte du message. Nécessite Python Agent SDK 0.2.140 ou version ultérieure.
Pour distinguer les échecs, vérifiez terminal_reason avant subtype. Quand la requête finale échoue, par exemple sur une erreur API, Claude Code rapporte subtype "success" avec la cause dans terminal_reason, par exemple "api_error" ; quand une limite que vous avez définie termine l’exécution, comme max_turns ou max_budget_usd, il rapporte un sous-type error_*.

CLIJSONDecodeError

Levée quand l’analyse JSON échoue.

Types de hooks

Pour un guide complet sur l’utilisation des hooks avec des exemples et des modèles courants, voir le guide Hooks.

HookEvent

Types d’événements de hook supportés.
Le SDK TypeScript supporte des événements de hook supplémentaires non encore disponibles en Python. Voir le tableau de disponibilité des hooks pour le support par SDK.

HookCallback

Définition de type pour les fonctions de callback de hook.
Paramètres :
  • input : Entrée de hook fortement typée avec unions discriminées basées sur hook_event_name (voir HookInput)
  • tool_use_id : Identifiant d’utilisation d’outil optionnel (pour les hooks liés aux outils)
  • context : Contexte de hook avec des informations supplémentaires
Retourne un HookJSONOutput.

HookContext

Informations de contexte passées aux callbacks de hook.

HookMatcher

Configuration pour faire correspondre les hooks à des événements ou des outils spécifiques.

HookInput

Type union de tous les types d’entrée de hook. Le type réel dépend du champ hook_event_name.

BaseHookInput

Champs de base présents dans tous les types d’entrée de hook.

PreToolUseHookInput

Données d’entrée pour les événements de hook PreToolUse.

PostToolUseHookInput

Données d’entrée pour les événements de hook PostToolUse.

PostToolUseFailureHookInput

Données d’entrée pour les événements de hook PostToolUseFailure. Appelé quand l’exécution d’un outil échoue.

UserPromptSubmitHookInput

Données d’entrée pour les événements de hook UserPromptSubmit.

StopHookInput

Données d’entrée pour les événements de hook Stop.

SubagentStopHookInput

Données d’entrée pour les événements de hook SubagentStop.

PreCompactHookInput

Données d’entrée pour les événements de hook PreCompact.

NotificationHookInput

Données d’entrée pour les événements de hook Notification.

SubagentStartHookInput

Données d’entrée pour les événements de hook SubagentStart.

PermissionRequestHookInput

Données d’entrée pour les événements de hook PermissionRequest. Permet aux hooks de gérer les décisions de permission programmatiquement.

HookJSONOutput

Type union pour les valeurs de retour de callback de hook.

SyncHookJSONOutput

Sortie de hook synchrone avec champs de contrôle et de décision.
Utilisez continue_ (avec trait de soulignement) dans le code Python. Il est automatiquement converti en continue quand envoyé au CLI.

HookSpecificOutput

Une union discriminée de types de sortie spécifiques à l’événement TypedDict. Le champ hookEventName détermine quels champs sont valides. Pour les détails complets sur les champs disponibles par événement de hook, voir Contrôler l’exécution avec les hooks.

AsyncHookJSONOutput

Sortie de hook asynchrone qui diffère l’exécution du hook.
Utilisez async_ (avec trait de soulignement) dans le code Python. Il est automatiquement converti en async quand envoyé au CLI.

Exemple d’utilisation de hook

Cet exemple enregistre deux hooks : l’un qui bloque les commandes Bash dangereuses comme rm -rf /, et un autre qui journalise toute l’utilisation d’outils pour l’audit. Le hook de sécurité s’exécute uniquement sur les commandes Bash (via le matcher), tandis que le hook de journalisation s’exécute sur tous les outils.

Types d’entrée/sortie d’outil

Documentation des schémas d’entrée/sortie pour les outils Claude Code intégrés. Bien que le SDK Python n’exporte pas ceux-ci en tant que types, ils représentent la structure des entrées et sorties d’outils dans les messages. Chaque sortie affichée est la valeur que vous lisez à partir de UserMessage.tool_use_result pour cet outil. Les noms de clés apparaissent exactement comme Claude Code les émet. Une clé annotée | None avec un commentaire « présent quand » ou « optionnel » est omise quand elle ne s’applique pas.

Agent

Nom de l’outil : Agent. Le nom précédent Task est toujours accepté comme alias, et la liste tools dans le SystemMessage d’initialisation rapporte cet outil comme Task pour la compatibilité rétroactive. Entrée :
Lance un nouvel agent pour gérer des tâches complexes et multi-étapes de manière autonome. Sortie (statut : "completed") :
Sortie (statut : "async_launched") :
Sortie (statut : "remote_launched") :
Retourne le résultat du sous-agent. La sortie est discriminée sur le champ status : "completed" pour les tâches terminées, "async_launched" pour les tâches en arrière-plan, et "remote_launched" pour les tâches que Claude Code a envoyées à une session cloud, où sessionUrl renvoie à cette session et taskId l’identifie. Si Claude Code a conservé la worktree isolée du sous-agent, worktreePath sur la variante completed est l’endroit où la trouver, et worktreeBranch est sa branche lorsque Claude Code a créé la worktree avec git. Sur la variante completed, resolvedModel nomme le modèle sur lequel le sous-agent a démarré, qui peut différer du model d’entrée demandé lorsque availableModels ou une autre substitution s’applique. Ce champ nécessite Claude Code v2.1.174 ou ultérieur. Sur la variante async_launched, resolvedModel nomme le modèle en cours d’utilisation lorsque l’agent s’est déplacé en arrière-plan, donc un échange qui s’est produit avant la mise en arrière-plan est reflété là. Le champ modelsUsed sur les deux variantes répertorie les modèles utilisés dans l’ordre, avec les répétitions consécutives réduites ; il est défini uniquement lorsque le modèle a été échangé en cours d’exécution. modelsUsed et le comportement resolvedModel au moment de la mise en arrière-plan nécessitent Claude Code v2.1.212 ou ultérieur. Claude Code remplit usage et totalTokens à partir de la dernière requête API du sous-agent, pas de l’ensemble de l’exécution. Lorsqu’il est présent, thinking_tokens sous output_tokens_details dans usage est le nombre de tokens de sortie de cette requête qui étaient des tokens de réflexion. La clé output_tokens_details nécessite le SDK Python v0.2.136 ou ultérieur, qui regroupe Claude Code v2.1.228. La clé fallback_credit nécessite le SDK Python v0.2.162 ou ultérieur, qui regroupe Claude Code v2.1.285.

AskUserQuestion

Nom de l’outil : AskUserQuestion Pose des questions de clarification à l’utilisateur pendant l’exécution. Voir Gérer les approbations et les entrées utilisateur pour les détails d’utilisation. Entrée :
Sortie :

Bash

Nom de l’outil : Bash Pour ce qui définit le plafond au premier plan, voir Limites de délai d’attente et de sortie. Pour la limite de temps en arrière-plan, voir Limite de temps pour les commandes en arrière-plan. Entrée :
Sortie :

Monitor

Nom de l’outil : Monitor Exécute une source de fond et livre chaque événement à Claude pour qu’il puisse réagir sans interrogation : command exécute un script et émet un événement par ligne stdout, et ws ouvre une WebSocket et émet un événement par trame texte. Fournissez exactement l’un de command ou ws. Lorsque Monitor exécute une commande, il suit les mêmes règles de permission que Bash ; une surveillance WebSocket demande une approbation séparément. La source ws nécessite Claude Code v2.1.195 ou ultérieur. Voir la référence de l’outil Monitor pour le comportement et la disponibilité du fournisseur. Entrée :
Sortie :

Edit

Nom de l’outil : Edit Entrée :
Sortie :

Read

Nom de l’outil : Read Entrée :
La sortie prend l’une des formes suivantes selon ce que Claude a lu. Vérifiez la clé type pour les distinguer. Sortie (type : "text") :
Sortie (type : "image") :
Sortie (type : "notebook") :
Sortie (type : "pdf") :
Sortie (type : "parts") :
Sortie (type : "file_unchanged") :

Write

Nom de l’outil : Write Entrée :
Sortie :

Glob

Nom de l’outil : Glob Entrée :
Sortie :
totalMatches et countIsComplete nécessitent Claude Code v2.1.191 ou ultérieur.

Grep

Nom de l’outil : Grep Entrée :
Sortie :
Grep retourne cette forme de dict dans chaque mode de sortie. Les clés optionnelles présentes dépendent de output_mode. totalFiles nécessite Claude Code v2.1.208 ou ultérieur. totalLines nécessite Claude Code v2.1.210 ou ultérieur.

NotebookEdit

Nom de l’outil : NotebookEdit Entrée :
Sortie :

WebFetch

Nom de l’outil : WebFetch Entrée :
Sortie :

WebSearch

Nom de l’outil : WebSearch Entrée :
Sortie :

TodoWrite

Nom de l’outil : TodoWrite
Les outils suivants sont disponibles par défaut uniquement sur Claude Opus 4.7, Claude Sonnet 4.6, Claude Haiku 4.5 et les modèles antérieurs. Sur tous les autres modèles, y compris les identifiants de modèle que Claude Code ne reconnaît pas, ils ne sont pas disponibles sauf si vous les activez :
  • TodoWrite
  • TaskCreate
  • TaskGet
  • TaskUpdate
  • TaskList
Partout où les outils sont disponibles, Claude Code fournit les quatre outils Task, ou TodoWrite à la place lorsque vous définissez CLAUDE_CODE_ENABLE_TASKS=0.Cet ensemble par défaut s’applique dans Claude Code v2.1.268 et versions ultérieures, que le SDK TypeScript Agent regroupe à partir de v0.3.268.Voir Disponibilité du modèle pour vous inscrire.
Entrée :
Sortie :

TaskCreate

Nom de l’outil : TaskCreate Entrée :
Sortie :

TaskUpdate

Nom de l’outil : TaskUpdate Entrée :
Sortie :

TaskGet

Nom de l’outil : TaskGet Entrée :
Sortie :

TaskList

Nom de l’outil : TaskList Entrée :
Sortie :

TaskOutput

Supprimé dans Claude Code v2.1.277. Récupérait auparavant la sortie d’une tâche en arrière-plan en cours d’exécution ou terminée, avec BashOutput accepté comme alias ; Claude lit le fichier de sortie d’une tâche en arrière-plan avec Read à la place. Une entrée disallowed_tools ou une règle de refus qui nomme toujours l’un ou l’autre nom est ignorée sans avertissement.

TaskStop

Nom de l’outil : TaskStop. Les noms précédents KillShell et KillBash sont toujours acceptés comme alias. Entrée :
Sortie :

ExitPlanMode

Nom de l’outil : ExitPlanMode Entrée :
Sortie :

ListMcpResources

Nom de l’outil : ListMcpResourcesTool Entrée :
Le résultat est une liste plutôt qu’un dict, donc tool_use_result contient une list pour cet outil. Sortie :

ReadMcpResource

Nom de l’outil : ReadMcpResourceTool Entrée :
Sortie :

Construire une interface de conversation continue

L’exemple suivant maintient un seul ClaudeSDKClient connecté à travers les tours, afin que Claude se souvienne des messages antérieurs. Tapez new pour vous déconnecter et vous reconnecter pour une nouvelle session, ou exit pour terminer la conversation.

Gestion des erreurs

L’exemple suivant encapsule un appel query() dans des gestionnaires pour quatre des types d’erreurs que le SDK lève. Cet exemple capture ResultError, qui nécessite Python Agent SDK 0.2.140 ou version ultérieure.

Configuration du sandbox

SandboxSettings

Configuration pour le comportement du sandbox. Utilisez ceci pour activer le sandboxing des commandes et configurer les restrictions réseau programmatiquement.
Le sandbox dépend du support de la plateforme et, sur Linux, d’outils comme bubblewrap et socat. Par défaut, quand enabled est True mais que le sandbox ne peut pas démarrer, les commandes s’exécutent sans sandbox avec un avertissement sur stderr. Ce comportement par défaut diffère du SDK TypeScript, où failIfUnavailable est par défaut true.Définissez "failIfUnavailable": True dans vos paramètres de sandbox pour arrêter à la place. Le SDK transmet failIfUnavailable à Claude Code avec les champs déclarés de SandboxSettings. query() rapporte alors un ResultMessage avec subtype="error_during_execution" et la raison dans errors. Comme il s’agit d’un appel query() unique, le SDK lève une exception après avoir produit ce résultat d’erreur, donc enveloppez la boucle dans un bloc try pour continuer au-delà. Voir Gérer le résultat pour le contrat d’erreur.
Pour empêcher les commandes en sandbox d’écrire dans un fichier, indiquez son chemin absolu sous denyWrite dans vos paramètres de sandbox, par exemple "filesystem": {"denyWrite": ["/home/user/project/.env"]}. Le SDK transmet filesystem à Claude Code avec les champs déclarés de SandboxSettings. Une fois le sandbox démarré, il bloque les écritures vers chaque chemin absolu indiqué.

Exemple d’utilisation

Sécurité des sockets Unix : L’option allowUnixSockets peut accorder l’accès à des services système qui s’étendent en dehors du sandbox. Par exemple, permettre /var/run/docker.sock accorde effectivement un accès complet au système hôte via l’API Docker, contournant l’isolation du sandbox. Autorisez uniquement les sockets Unix strictement nécessaires et comprenez les implications de sécurité de chacun.

SandboxNetworkConfig

Configuration spécifique au réseau pour le mode sandbox. Ces paramètres s’appliquent aux commandes Bash en sandbox quand enabled est True dans le parent SandboxSettings. Ils ne restreignent pas l’outil WebFetch, qui utilise à la place des règles de permission.
Le proxy sandbox intégré applique la liste blanche réseau en fonction du nom d’hôte demandé et ne termine pas ou n’inspecte pas le trafic TLS, donc des techniques telles que le domain fronting peuvent potentiellement le contourner. Voir Limitations de sécurité du sandboxing pour les détails et Déploiement sécurisé pour configurer un proxy qui termine TLS.

SandboxIgnoreViolations

Configuration pour ignorer les violations de sandbox spécifiques.

Fallback de permissions pour les commandes sans sandbox

Quand allowUnsandboxedCommands est activé, le modèle peut demander l’exécution de commandes en dehors du sandbox en définissant dangerouslyDisableSandbox: True dans l’entrée d’outil. Ces requêtes reviennent au système de permissions existant, ce qui signifie que votre gestionnaire can_use_tool sera invoqué, vous permettant d’implémenter une logique d’autorisation personnalisée. Vos entrées excludedCommands prennent à la place une sortie du sandbox sans implication du modèle ; sandbox.excludedCommands couvre quand une entrée s’applique. L’exemple suivant enregistre chaque requête sans sandbox et la refuse sauf si votre propre logique d’autorisation l’autorise :
Les commandes s’exécutant avec dangerouslyDisableSandbox: True ont un accès complet au système. Assurez-vous que votre gestionnaire can_use_tool valide ces requêtes avec soin.Si permission_mode est défini sur bypassPermissions et allowUnsandboxedCommands est activé, le modèle peut exécuter de manière autonome des commandes en dehors du sandbox sans aucun prompt d’approbation, à part les actions qu’aucun mode n’approuve automatiquement. Cette combinaison permet effectivement au modèle d’échapper à l’isolation du sandbox silencieusement.

Voir aussi