Claude Agent SDK : construire des agents programmatiques
Utilisez le Claude Agent SDK pour créer des agents en TypeScript et Python. Intégration d'outils, monitoring automatisé, pipelines de déploiement et comparaison avec les subagents natifs.
Qu'est-ce que le Claude Agent SDK ?
Le Claude Agent SDK est un kit de développement officiel d'Anthropic qui permet de créer des agents programmatiques directement dans votre code TypeScript ou Python. Contrairement aux subagents natifs de Claude Code (qui vivent dans le terminal), les agents SDK s'intègrent dans vos applications, scripts et pipelines.
L'analogie de la télécommande vs la domotique
Les subagents natifs de Claude Code, c'est comme une télécommande : vous appuyez sur un bouton et l'agent exécute une action prédéfinie. Le Claude Agent SDK, c'est la domotique complète : vous programmez des scénarios complexes qui se déclenchent automatiquement selon des conditions, avec un contrôle total sur chaque étape.
Pourquoi utiliser le SDK plutôt que les subagents natifs ?
| Critère | Subagents natifs | Agent SDK |
|---|---|---|
| Environnement | Terminal Claude Code | Votre application (serveur, script, CI) |
| Langage | Prompts en Markdown | TypeScript ou Python |
| Contrôle | Délégation au modèle | Contrôle programmatique total |
| Intégration | Outils Claude Code (Bash, Read, Edit...) | Outils custom que vous définissez |
| Déclenchement | Manuel via le terminal | Automatique (webhook, cron, événement) |
| Persistance | Durée de la session | Votre choix (base de données, fichier...) |
| Scalabilité | Une session à la fois | Plusieurs agents en parallèle |
En résumé : les subagents natifs sont parfaits pour le travail interactif dans le terminal, le SDK est fait pour l'automatisation et l'intégration dans vos systèmes.
Installation
TypeScript
# Installation du SDK TypeScriptnpm install @anthropic-ai/claude-code-sdk# Prérequis : Claude Code doit être installé globalementnpm install -g @anthropic-ai/claude-code
Le SDK TypeScript utilise Claude Code en sous-jacent. Assurez-vous que Claude Code est installé et authentifié.
Python
# Installation du SDK Pythonpip install claude-code-sdk# Prérequis : Claude Code accessible dans le PATHnpm install -g @anthropic-ai/claude-code
Le SDK Python fonctionne de la même manière : il orchestre Claude Code via un processus enfant.
Premier agent en TypeScript
Voici un agent minimal qui analyse un fichier et produit un rapport.
import { claude } from "@anthropic-ai/claude-code-sdk";async function analyzeFile(filePath: string): Promise<string> {// Lancer un agent avec un prompt et des optionsconst result = await claude({prompt: `Analyse le fichier ${filePath} et produis un rapportavec : nombre de lignes, fonctions exportées,complexité cyclomatique estimée et suggestions.`,options: {maxTurns: 10,allowedTools: ["Read", "Bash", "Grep"],},});// Le résultat contient le texte de réponsereturn result.text;}// Utilisationconst report = await analyzeFile("src/lib/utils.ts");console.log(report);
maxTurns contrôle la profondeur
Le paramètre maxTurns limite le nombre d'itérations de l'agent. Un agent de review simple a besoin de 5 à 10 tours. Un agent de refactoring complexe peut en nécessiter 20 à 30. Commencez bas et augmentez si l'agent s'arrête trop tôt.
Premier agent en Python
Le même agent en Python, avec une syntaxe similaire.
import asynciofrom claude_code_sdk import claude, ClaudeOptionsasync def analyze_file(file_path: str) -> str:"""Analyse un fichier et produit un rapport structuré."""result = await claude(prompt=f"Analyse le fichier {file_path} et produis un rapport "f"avec : nombre de lignes, fonctions exportées, "f"complexité cyclomatique estimée et suggestions.",options=ClaudeOptions(max_turns=10,allowed_tools=["Read", "Bash", "Grep"],),)return result.text# Utilisationreport = asyncio.run(analyze_file("src/lib/utils.ts"))print(report)
Intégration d'outils externes
Le vrai pouvoir du SDK réside dans la possibilité d'ajouter vos propres outils. L'agent peut appeler des fonctions de votre codebase, des API, des bases de données, tout ce que vous pouvez coder.
import { claude, Tool } from "@anthropic-ai/claude-code-sdk";// Définir un outil customconst slackNotifier: Tool = {name: "notify_slack",description: "Envoie une notification sur un channel Slack",parameters: {type: "object",properties: {channel: { type: "string", description: "Le channel Slack" },message: { type: "string", description: "Le message à envoyer" },},required: ["channel", "message"],},// L'implémentation de l'outilasync execute({ channel, message }) {const response = await fetch(SLACK_WEBHOOK_URL, {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify({ channel, text: message }),});return { success: response.ok };},};// Utiliser l'agent avec l'outil customconst result = await claude({prompt: "Vérifie que tous les tests passent. Si un test échoue, "+ "notifie le channel #dev sur Slack avec le détail de l'erreur.",options: {maxTurns: 15,allowedTools: ["Bash", "Read"],customTools: [slackNotifier],},});
Exemples concrets
1. Monitoring automatisé
Un agent qui tourne en cron et surveille la santé de votre application.
import { claude } from "@anthropic-ai/claude-code-sdk";async function healthCheck() {const result = await claude({prompt: `Tu es un agent de monitoring. Vérifie :1. Que le serveur répond sur http://localhost:3000/health2. Que la base de données est accessible3. Que l'espace disque est suffisant (> 20% libre)4. Que les logs récents ne contiennent pas d'erreurs critiquesProduis un rapport JSON avec le statut de chaque vérification.Si un problème est détecté, utilise notify_slack pour alerter.`,options: {maxTurns: 10,allowedTools: ["Bash"],customTools: [slackNotifier],},});return JSON.parse(result.text);}// Lancer toutes les 5 minutes via un cron ou un scheduler
2. Pipeline de déploiement
Un agent qui orchestre un déploiement complet.
import asynciofrom claude_code_sdk import claude, ClaudeOptionsasync def deploy_pipeline(version: str) -> dict:"""Pipeline de déploiement en 4 étapes."""# Étape 1 : Vérifications pré-déploiementpre_check = await claude(prompt=f"Vérifie que la branche main est propre, "f"que tous les tests passent et que le build "f"de la version {version} est OK.",options=ClaudeOptions(max_turns=10,allowed_tools=["Bash", "Read"],),)if "ÉCHEC" in pre_check.text:return {"status": "blocked", "reason": pre_check.text}# Étape 2 : Build et tagbuild = await claude(prompt=f"Crée le tag v{version}, build l'image Docker "f"et pousse-la sur le registry.",options=ClaudeOptions(max_turns=15,allowed_tools=["Bash"],),)# Étape 3 : Déploiementdeploy = await claude(prompt="Déploie la nouvelle image sur l'environnement staging. ""Vérifie que le health check passe.",options=ClaudeOptions(max_turns=10,allowed_tools=["Bash"],),)return {"status": "success","version": version,"pre_check": pre_check.text,"build": build.text,"deploy": deploy.text,}
3. Triage automatique de bugs
Un agent qui lit les nouvelles issues GitHub et les catégorise automatiquement.
import { claude, Tool } from "@anthropic-ai/claude-code-sdk";const githubTool: Tool = {name: "github_api",description: "Interagit avec l'API GitHub",parameters: {type: "object",properties: {action: { type: "string", enum: ["list_issues", "add_labels", "add_comment"] },repo: { type: "string" },issueNumber: { type: "number" },labels: { type: "array", items: { type: "string" } },comment: { type: "string" },},required: ["action", "repo"],},async execute(params) {// Implémentation avec l'API GitHub (Octokit, gh CLI, etc.)// ...return { success: true };},};async function triageNewIssues() {const result = await claude({prompt: `Tu es un agent de triage de bugs. Pour chaque nouvelleissue non-triée dans le repo "mon-org/mon-app" :1. Lis le titre et la description2. Catégorise : bug, feature-request, question, documentation3. Estime la priorité : P0 (critique), P1 (haute), P2 (moyenne), P3 (basse)4. Ajoute les labels appropriés5. Si c'est un P0, ajoute un commentaire pour alerter l'équipeTraite toutes les issues créées dans les dernières 24h.`,options: {maxTurns: 30,customTools: [githubTool],},});return result.text;}
Options de configuration du SDK
Les principales options pour contrôler le comportement de l'agent :
| Option | Type | Description |
|---|---|---|
prompt | string | La mission de l'agent |
maxTurns | number | Nombre maximum d'itérations (défaut : 10) |
allowedTools | string[] | Outils Claude Code autorisés |
customTools | Tool[] | Vos outils custom |
cwd | string | Répertoire de travail de l'agent |
model | string | Modèle à utiliser (sonnet, opus, haiku) |
outputFormat | string | Format de sortie (text, json, stream-json) |
systemPrompt | string | Instructions système additionnelles |
// Exemple avec toutes les optionsconst result = await claude({prompt: "Refactore le module auth pour utiliser des tokens JWT",options: {maxTurns: 25,allowedTools: ["Read", "Edit", "Bash", "Grep", "Glob"],cwd: "/home/user/mon-projet",model: "sonnet",outputFormat: "json",systemPrompt: "Tu es un expert en sécurité. "+ "Privilégie toujours la sécurité sur la performance.",},});
Comparaison détaillée avec les subagents natifs
Quand choisir quoi ?
Utilisez les subagents natifs pour le développement interactif au quotidien : review, debug, refactoring pendant que vous codez. Utilisez le SDK quand vous avez besoin d'automatisation sans intervention humaine : CI/CD, monitoring, triage, pipelines nocturnes.
Subagents natifs : les forces
- Configuration simple (fichier Markdown)
- Accès complet aux outils Claude Code
- Intégration naturelle dans le workflow terminal
- Pas de code à écrire ni à maintenir
- Idéal pour l'exploration et le prototypage
Agent SDK : les forces
- Contrôle programmatique total (conditions, boucles, erreurs)
- Intégration dans vos applications et pipelines existants
- Outils custom illimités (API, bases de données, services)
- Exécution automatique (cron, webhooks, événements)
- Gestion fine des erreurs et des retries
- Logging et observabilité intégrés
Bonnes pratiques
1. Limitez la portée de chaque agent
Un agent doit avoir une mission claire et délimitée. Si la tâche est trop large, découpez-la en plusieurs agents coordonnés.
// MAUVAIS : un agent qui fait toutconst result = await claude({prompt: "Refactore le projet, écris les tests, fais la review, "+ "mets à jour la doc et déploie en production",});// BON : des agents spécialisés et coordonnésconst refactorResult = await claude({prompt: "Refactore le module auth selon le plan fourni",options: { maxTurns: 20 },});const testResult = await claude({prompt: "Écris les tests pour le module auth refactoré",options: { maxTurns: 15 },});
2. Gérez les erreurs explicitement
try {const result = await claude({prompt: "Exécute les migrations de base de données",options: { maxTurns: 10 },});if (result.text.includes("ERROR")) {// Rollback ou notificationawait notifyTeam("Migration échouée", result.text);}} catch (error) {// Timeout, erreur réseau, etc.console.error("Agent SDK error:", error);await notifyTeam("Agent indisponible", String(error));}
3. Utilisez le format JSON pour les résultats structurés
const result = await claude({prompt: "Analyse les dépendances du projet et produis un rapport "+ "au format JSON avec : total, outdated, vulnerable, suggestions.",options: {maxTurns: 10,outputFormat: "json",},});const report = JSON.parse(result.text);console.log(`${report.vulnerable} vulnérabilités trouvées`);
Prochaines étapes
Maintenant que vous connaissez le Claude Agent SDK, explorez les sujets connexes.
- Performance et limites des agents : Coûts, profondeur de récursion et bonnes pratiques production
- Orchestration multi-agents : Patterns pour combiner plusieurs agents
- Mode Headless et CI/CD : Intégrer Claude Code dans vos pipelines