Construire des agents IA production-ready avec le Claude Agent SDK et TypeScript

AI Bot
Par AI Bot ·

Chargement du lecteur de synthèse vocale...

Anthropic n'a pas seulement construit Claude — ils ont construit l'infrastructure permettant à quiconque de créer des agents aussi capables que Claude Code. Le Claude Agent SDK vous donne la même boucle d'agent, les mêmes outils et la même gestion de contexte qui alimentent Claude Code, disponibles sous forme de bibliothèque programmable en TypeScript (et Python).

Dans ce tutoriel, vous passerez de zéro à un agent IA production-ready capable de lire des fichiers, exécuter des commandes, appeler des outils personnalisés et orchestrer des sous-agents — le tout en TypeScript.

Pourquoi le Claude Agent SDK ? Contrairement aux frameworks LLM génériques, l'Agent SDK vous donne la boucle d'agent éprouvée de Claude Code prête à l'emploi. Pas besoin d'implémenter la logique de retry, la gestion de contexte ou l'exécution d'outils — tout est intégré. Vous vous concentrez sur ce que fait votre agent, pas sur comment il fonctionne.

Ce que vous apprendrez

À la fin de ce tutoriel, vous serez capable de :

  • Mettre en place un projet TypeScript avec le Claude Agent SDK
  • Exécuter une boucle d'agent autonome avec la fonction query
  • Utiliser les outils intégrés (Bash, Read, Write, Edit, Glob, Grep) sans les implémenter vous-même
  • Créer des outils MCP personnalisés et les connecter à votre agent
  • Configurer les modes de permissions pour une exécution autonome sécurisée
  • Construire des sous-agents pour l'orchestration multi-agents
  • Gérer les messages en streaming et extraire les résultats
  • Déployer des agents avec gestion d'erreurs et contrôles de budget

Prérequis

Avant de commencer, assurez-vous d'avoir :

  • Node.js 20+ installé (node --version)
  • Connaissance de TypeScript 5.2+ (itérateurs asynchrones, await using)
  • Une clé API Anthropic (obtenez-en une sur console.anthropic.com)
  • Claude Code CLI installé (npm install -g @anthropic-ai/claude-code)
  • Un éditeur de code — VS Code ou Cursor recommandé

Important : Le Claude Agent SDK fonctionne avec Claude Code sous le capot. Vous devez avoir le CLI Claude Code installé et authentifié avant d'utiliser le SDK. Exécutez claude dans votre terminal pour vérifier qu'il fonctionne.


Comment fonctionne l'Agent SDK

Les bibliothèques LLM traditionnelles vous donnent un seul appel API : prompt en entrée, texte en sortie. L'Agent SDK vous donne une boucle d'agent complète — la même qui alimente Claude Code :

Votre prompt → Boucle d'agent → Claude réfléchit à la tâche
                    ↓
                Claude appelle un outil (Read, Bash, Edit, etc.)
                    ↓
                L'outil s'exécute et retourne le résultat
                    ↓
                Claude réfléchit au résultat
                    ↓
                Claude appelle un autre outil (ou répond)
                    ↓
                ... la boucle continue jusqu'à complétion ...
                    ↓
                Résultat final retourné

L'idée clé : vous n'implémentez pas la boucle. Le SDK gère l'exécution des outils, la gestion du contexte, les budgets de tokens et la récupération d'erreurs. Vous fournissez le prompt et la configuration.

Architecture

┌──────────────────────────────────────────┐
│           Votre Application              │
│                                          │
│   query({ prompt, options }) ──────┐     │
│                                    ▼     │
│   ┌────────────────────────────────────┐ │
│   │      Boucle d'Agent Claude        │ │
│   │                                    │ │
│   │  ┌──────────┐  ┌───────────────┐  │ │
│   │  │  Outils  │  │  Outils MCP   │  │ │
│   │  │ intégrés │  │ personnalisés │  │ │
│   │  │          │  │               │  │ │
│   │  │ - Bash   │  │ - Vos APIs    │  │ │
│   │  │ - Read   │  │ - Bases de    │  │ │
│   │  │ - Write  │  │   données     │  │ │
│   │  │ - Edit   │  │ - Services    │  │ │
│   │  │ - Glob   │  │ - Tout        │  │ │
│   │  │ - Grep   │  │               │  │ │
│   │  └──────────┘  └───────────────┘  │ │
│   │                                    │ │
│   │        ┌──────────────┐            │ │
│   │        │ Sous-agents  │            │ │
│   │        │ (optionnel)  │            │ │
│   │        └──────────────┘            │ │
│   └────────────────────────────────────┘ │
│                                          │
│   async for (message) ← streaming ◄─────│
└──────────────────────────────────────────┘

Étape 1 : Configuration du projet

Créez un nouveau projet TypeScript et installez le SDK :

mkdir claude-agent-project && cd claude-agent-project
npm init -y
npm install @anthropic-ai/claude-agent-sdk
npm install -D typescript @types/node tsx

Initialisez TypeScript :

npx tsc --init --target ES2022 --module NodeNext --moduleResolution NodeNext --outDir dist

Mettez à jour votre package.json pour activer les modules ES :

{
  "type": "module",
  "scripts": {
    "start": "tsx src/index.ts",
    "build": "tsc"
  }
}

Créez la structure du projet :

mkdir src

Étape 2 : Votre premier agent

Créez src/index.ts — un agent simple qui liste et analyse les fichiers d'un répertoire :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
async function main() {
  console.log("Démarrage de l'agent...\n");
 
  for await (const message of query({
    prompt: "Quels fichiers sont dans ce répertoire ? Donne-moi un résumé de la structure du projet.",
    options: {
      allowedTools: ["Bash", "Glob", "Read"],
      maxTurns: 10,
    },
  })) {
    // Gérer les différents types de messages
    if ("result" in message) {
      console.log("\n--- Résultat de l'agent ---");
      console.log(message.result);
    }
  }
}
 
main().catch(console.error);

Exécutez-le :

npx tsx src/index.ts

C'est tout. L'agent va :

  1. Recevoir votre prompt
  2. Décider qu'il doit lister les fichiers (appelle Glob ou Bash)
  3. Lire les résultats
  4. Possiblement lire des fichiers spécifiques pour plus de contexte
  5. Retourner un résumé structuré

Vous n'avez pas implémenté la lecture de fichiers, le pattern matching ou l'exécution shell — le SDK fournit tout cela.


Étape 3 : Comprendre les types de messages

La fonction query retourne un itérateur asynchrone de messages. Construisons un gestionnaire de messages plus robuste :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
async function main() {
  for await (const message of query({
    prompt: "Trouve tous les fichiers TypeScript et compte le total de lignes de code.",
    options: {
      allowedTools: ["Bash", "Glob", "Read"],
      maxTurns: 15,
    },
  })) {
    switch (message.type) {
      case "assistant":
        // Texte de raisonnement ou réponse de Claude
        const textBlocks = message.message.content
          .filter((block: { type: string }) => block.type === "text")
          .map((block: { type: string; text: string }) => block.text);
        if (textBlocks.length > 0) {
          console.log("[Claude]", textBlocks.join(""));
        }
        break;
 
      case "tool_use":
        // Claude appelle un outil
        console.log(`[Appel outil] ${message.name}(${JSON.stringify(message.input).slice(0, 100)}...)`);
        break;
 
      case "tool_result":
        // Résultat d'exécution d'un outil
        console.log(`[Résultat outil] ${message.content?.slice(0, 200)}...`);
        break;
 
      case "result":
        if (message.subtype === "success") {
          console.log("\n✓ Agent terminé avec succès");
          console.log(message.result);
        } else {
          console.error("\n✗ Échec de l'agent :", message.error);
        }
        break;
    }
  }
}
 
main().catch(console.error);

Types de messages clés

TypeDescription
assistantTexte de réponse ou raisonnement de Claude
tool_useClaude demande un appel d'outil
tool_resultRésultat d'une exécution d'outil
resultRésultat final (succès ou erreur)

Étape 4 : Outils intégrés

L'Agent SDK inclut les mêmes outils qui alimentent Claude Code. Pas d'implémentation requise — autorisez-les simplement :

OutilCe qu'il fait
BashExécuter des commandes shell
ReadLire le contenu des fichiers
WriteCréer ou écraser des fichiers
EditEffectuer des modifications ciblées
GlobTrouver des fichiers par pattern
GrepChercher dans le contenu des fichiers avec des regex
TaskLancer un sous-agent pour du travail parallèle
WebFetchRécupérer et traiter du contenu web
WebSearchRechercher sur le web

Voici un agent qui utilise plusieurs outils intégrés pour refactoriser du code :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
async function refactorAgent(targetFile: string, instruction: string) {
  for await (const message of query({
    prompt: `Refactorise le fichier ${targetFile} : ${instruction}`,
    options: {
      allowedTools: ["Read", "Edit", "Glob", "Grep"],
      permissionMode: "acceptEdits", // Auto-approuver les modifications de fichiers
      maxTurns: 20,
    },
  })) {
    if ("result" in message) {
      return message.result;
    }
  }
}
 
// Utilisation
const result = await refactorAgent(
  "src/utils.ts",
  "Extrais toutes les fonctions helpers dans des modules séparés selon leur domaine"
);
console.log(result);

Modes de permissions

L'option permissionMode contrôle ce que Claude peut faire sans demander :

ModeComportement
"default"Demande avant toute utilisation d'outil
"acceptEdits"Auto-approuve lectures et modifications de fichiers
"bypassPermissions"Auto-approuve tout (à utiliser avec précaution)

Conseil sécurité : En production, commencez avec "default" ou "acceptEdits". N'utilisez "bypassPermissions" que dans des environnements sandboxés où l'agent ne peut pas causer de dommages.


Étape 5 : Outils MCP personnalisés

La vraie puissance vient de la connexion de vos propres outils. L'Agent SDK supporte les serveurs MCP (Model Context Protocol) — le même standard utilisé par Claude Desktop et Cursor.

Créer un serveur MCP in-process

Vous pouvez définir des outils directement dans votre code TypeScript avec createSdkMcpServer :

import { query } from "@anthropic-ai/claude-agent-sdk";
import { createSdkMcpServer, tool } from "@anthropic-ai/claude-agent-sdk/mcp";
 
// Définir des outils personnalisés
const analyticsServer = createSdkMcpServer({
  name: "analytics",
  version: "1.0.0",
  tools: [
    tool(
      "get_page_views",
      "Obtenir les analytics de pages vues pour un chemin URL et une plage de dates",
      {
        type: "object",
        properties: {
          path: { type: "string", description: "Chemin URL (ex: /blog/my-post)" },
          startDate: { type: "string", description: "Date de début (YYYY-MM-DD)" },
          endDate: { type: "string", description: "Date de fin (YYYY-MM-DD)" },
        },
        required: ["path", "startDate", "endDate"],
      },
      async ({ path, startDate, endDate }) => {
        // Votre véritable appel API analytics ici
        const response = await fetch(
          `https://api.analytics.example.com/views?path=${path}&start=${startDate}&end=${endDate}`
        );
        const data = await response.json();
        return JSON.stringify(data);
      }
    ),
    tool(
      "get_top_pages",
      "Obtenir les N pages les plus visitées",
      {
        type: "object",
        properties: {
          limit: { type: "number", description: "Nombre de pages à retourner" },
          period: { type: "string", enum: ["day", "week", "month"], description: "Période" },
        },
        required: ["limit", "period"],
      },
      async ({ limit, period }) => {
        const response = await fetch(
          `https://api.analytics.example.com/top?limit=${limit}&period=${period}`
        );
        const data = await response.json();
        return JSON.stringify(data);
      }
    ),
  ],
});
 
// Utilisation avec entrée streaming (requis pour les serveurs MCP)
async function* generateMessages() {
  yield {
    type: "user" as const,
    message: {
      role: "user" as const,
      content: "Quelles sont les 10 pages les plus visitées ce mois-ci ? Puis analyse la tendance de la page #1 sur les 30 derniers jours.",
    },
  };
}
 
for await (const message of query({
  prompt: generateMessages(),
  options: {
    mcpServers: {
      analytics: analyticsServer,
    },
    allowedTools: [
      "mcp__analytics__get_page_views",
      "mcp__analytics__get_top_pages",
    ],
    maxTurns: 10,
  },
})) {
  if ("result" in message) {
    console.log(message.result);
  }
}

Connecter des serveurs MCP externes

Vous pouvez aussi vous connecter à n'importe quel serveur MCP existant — comme un serveur de base de données, GitHub ou vos propres microservices :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
for await (const message of query({
  prompt: "Liste les issues ouvertes labellisées 'bug' et résume les plus critiques.",
  options: {
    mcpServers: {
      github: {
        command: "npx",
        args: ["-y", "@modelcontextprotocol/server-github"],
        env: {
          GITHUB_TOKEN: process.env.GITHUB_TOKEN!,
        },
      },
    },
    allowedTools: ["mcp__github__*"], // Wildcard : autoriser tous les outils GitHub
    maxTurns: 15,
  },
})) {
  if ("result" in message) {
    console.log(message.result);
  }
}

Transports SSE et HTTP

Pour les serveurs MCP distants, utilisez le transport SSE ou HTTP :

options: {
  mcpServers: {
    "remote-api": {
      type: "sse",
      url: "https://mcp.example.com/sse",
      headers: {
        Authorization: `Bearer ${process.env.API_TOKEN}`,
      },
    },
  },
}

Étape 6 : Prompts système et comportement de l'agent

Personnalisez la personnalité, les contraintes et l'expertise de votre agent :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
const CODE_REVIEW_PROMPT = `Vous êtes un revieweur de code expert spécialisé en TypeScript et React.
 
Votre processus de review :
1. Lire les fichiers modifiés
2. Vérifier les bugs, problèmes de sécurité et de performance
3. Vérifier que les types TypeScript sont corrects et complets
4. S'assurer des bonnes pratiques React (règles des hooks, props key, usage de memo)
5. Fournir une review structurée avec niveaux de sévérité
 
Format de sortie :
- 🔴 Critique : Doit être corrigé avant le merge
- 🟡 Avertissement : Devrait être corrigé, mais non bloquant
- 🟢 Suggestion : Améliorations appréciables
 
Soyez spécifique. Référencez les numéros de ligne. Suggérez des corrections avec du code.`;
 
async function reviewCode(diffOrPath: string) {
  for await (const message of query({
    prompt: `Reviewez ce code :\n\n${diffOrPath}`,
    options: {
      systemPrompt: CODE_REVIEW_PROMPT,
      allowedTools: ["Read", "Glob", "Grep"],
      maxTurns: 25,
    },
  })) {
    if ("result" in message) {
      return message.result;
    }
  }
}

Étape 7 : Sous-agents pour l'orchestration multi-agents

Pour les tâches complexes, vous pouvez définir des sous-agents spécialisés auxquels l'agent principal peut déléguer :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
for await (const message of query({
  prompt: "Analyse la couverture de tests de ce projet, puis écris des tests pour toute fonction non couverte dans src/utils/.",
  options: {
    allowedTools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep", "Task"],
    agents: {
      "test-analyzer": {
        description: "Analyse la couverture de tests et identifie les chemins de code non testés",
        tools: ["Bash", "Read", "Glob", "Grep"],
        prompt: "Vous êtes un analyste de couverture de tests. Exécutez les outils de couverture, analysez les rapports et identifiez les fonctions non testées.",
        model: "haiku", // Utiliser un modèle plus rapide pour l'analyse
      },
      "test-writer": {
        description: "Écrit des tests unitaires complets pour les fonctions TypeScript",
        tools: ["Read", "Write", "Edit", "Glob"],
        prompt: "Vous êtes un ingénieur de tests. Écrivez des tests unitaires complets avec Vitest incluant le mocking approprié et la couverture des cas limites.",
        model: "sonnet",
      },
    },
    maxTurns: 30,
  },
})) {
  if ("result" in message) {
    console.log(message.result);
  }
}

Comment fonctionnent les sous-agents

Quand vous définissez agents dans les options, l'agent principal obtient accès à l'outil Task. Il peut lancer des sous-agents par nom en leur passant un prompt. Chaque sous-agent :

  • Fonctionne dans son propre contexte avec son propre ensemble d'outils
  • Peut utiliser un modèle différent (économisez avec haiku pour les tâches simples)
  • Retourne les résultats à l'agent principal pour synthèse

Ce pattern est puissant pour :

  • Diviser pour régner : séparer analyse et implémentation
  • Optimisation des coûts : utiliser des modèles moins chers pour les sous-tâches simples
  • Travail parallèle : plusieurs sous-agents peuvent fonctionner simultanément
  • Séparation des préoccupations : chaque agent a une expertise ciblée

Étape 8 : Contrôles de budget et sécurité

Les agents en production nécessitent des garde-fous. Le SDK en fournit plusieurs :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
for await (const message of query({
  prompt: "Migre tous les fichiers JavaScript vers TypeScript avec des types appropriés.",
  options: {
    allowedTools: ["Read", "Write", "Edit", "Glob", "Grep", "Bash"],
 
    // Limites de tours
    maxTurns: 50,           // Maximum d'appels d'outils avant arrêt
 
    // Contrôles de coût
    maxBudgetUsd: 2.0,      // Arrêter si le coût dépasse $2.00
 
    // Sélection du modèle
    model: "claude-sonnet-4-5-20250929",  // Utiliser un modèle spécifique
 
    // Restrictions d'outils
    disallowedTools: ["WebSearch", "WebFetch"],  // Bloquer des outils spécifiques
 
    // Répertoire de travail
    cwd: "/path/to/project",
 
    // Variables d'environnement disponibles pour l'outil Bash
    env: {
      NODE_ENV: "development",
      DATABASE_URL: process.env.DATABASE_URL!,
    },
 
    // Mode de permissions
    permissionMode: "acceptEdits",
  },
})) {
  // Traiter les messages
}

Le callback canUseTool

Pour un contrôle granulaire, implémentez un gestionnaire de permissions personnalisé :

import { query } from "@anthropic-ai/claude-agent-sdk";
 
for await (const message of query({
  prompt: "Nettoie et optimise la codebase.",
  options: {
    allowedTools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"],
    canUseTool: async (toolName, input) => {
      // Bloquer les commandes bash destructives
      if (toolName === "Bash") {
        const command = (input as { command: string }).command;
        const dangerous = ["rm -rf", "DROP TABLE", "git push --force"];
        if (dangerous.some((d) => command.includes(d))) {
          return { allowed: false, reason: "Les commandes destructives ne sont pas autorisées" };
        }
      }
 
      // Bloquer l'écriture dans les fichiers critiques
      if (toolName === "Write" || toolName === "Edit") {
        const filePath = (input as { file_path: string }).file_path;
        const protected_paths = [".env", "package-lock.json", "prisma/schema.prisma"];
        if (protected_paths.some((p) => filePath.includes(p))) {
          return { allowed: false, reason: `Impossible de modifier le fichier protégé : ${filePath}` };
        }
      }
 
      return { allowed: true };
    },
  },
})) {
  if ("result" in message) {
    console.log(message.result);
  }
}

Étape 9 : Construire un projet complet — Bot de review de code IA

Assemblons tout pour construire un bot de review de code pratique qui analyse les diffs git et fournit des retours structurés :

// src/review-bot.ts
import { query } from "@anthropic-ai/claude-agent-sdk";
 
interface ReviewResult {
  summary: string;
  issues: Array<{
    severity: "critical" | "warning" | "suggestion";
    file: string;
    line?: number;
    message: string;
    suggestion?: string;
  }>;
  score: number;
}
 
const REVIEW_SYSTEM_PROMPT = `Vous êtes un expert en review de code. Analysez les diffs git et fournissez des retours structurés.
 
Règles :
- Concentrez-vous sur les bugs, vulnérabilités de sécurité et problèmes de performance
- Vérifiez la sûreté des types TypeScript
- Vérifiez que la gestion d'erreurs est complète
- Cherchez les conditions de course potentielles dans le code async
- Ne suggérez des améliorations que quand elles apportent une valeur claire
 
Terminez toujours votre review avec un bloc JSON dans ce format exact :
\`\`\`json
{
  "summary": "Résumé en un paragraphe",
  "issues": [
    {
      "severity": "critical|warning|suggestion",
      "file": "path/to/file.ts",
      "line": 42,
      "message": "Description du problème",
      "suggestion": "Comment le corriger"
    }
  ],
  "score": 85
}
\`\`\`
 
Score : 0-100 où 100 est un code parfait.`;
 
async function reviewPullRequest(baseBranch: string = "main"): Promise<ReviewResult | null> {
  let result: string | null = null;
 
  for await (const message of query({
    prompt: `Reviewez le diff git actuel par rapport à ${baseBranch}.
Lisez les fichiers modifiés pour le contexte complet, puis fournissez une review de code structurée.`,
    options: {
      systemPrompt: REVIEW_SYSTEM_PROMPT,
      allowedTools: ["Bash", "Read", "Glob", "Grep"],
      maxTurns: 30,
      maxBudgetUsd: 1.0,
      permissionMode: "acceptEdits",
    },
  })) {
    if ("result" in message && message.subtype === "success") {
      result = message.result;
    }
  }
 
  if (!result) return null;
 
  // Extraire le JSON du résultat
  const jsonMatch = result.match(/```json\n([\s\S]*?)\n```/);
  if (jsonMatch) {
    return JSON.parse(jsonMatch[1]) as ReviewResult;
  }
 
  return null;
}
 
// Lancer la review
async function main() {
  console.log("Démarrage de la review de code...\n");
 
  const review = await reviewPullRequest();
 
  if (review) {
    console.log(`\nScore de review : ${review.score}/100`);
    console.log(`Résumé : ${review.summary}\n`);
 
    for (const issue of review.issues) {
      const icon =
        issue.severity === "critical" ? "🔴" :
        issue.severity === "warning" ? "🟡" : "🟢";
      console.log(`${icon} [${issue.file}${issue.line ? `:${issue.line}` : ""}] ${issue.message}`);
      if (issue.suggestion) {
        console.log(`   Correction : ${issue.suggestion}`);
      }
    }
  }
}
 
main().catch(console.error);

Exécutez-le sur votre branche actuelle :

npx tsx src/review-bot.ts

Étape 10 : Sessions V2 (Preview)

L'Agent SDK inclut aussi une API v2 en preview avec gestion explicite des sessions, utile pour les conversations multi-tours :

import { unstable_v2_createSession } from "@anthropic-ai/claude-agent-sdk";
 
async function interactiveSession() {
  await using session = unstable_v2_createSession({
    model: "claude-sonnet-4-5-20250929",
  });
 
  // Premier tour
  await session.send("Bonjour ! Dans quel projet TypeScript suis-je ?");
  for await (const msg of session.stream()) {
    if (msg.type === "assistant") {
      const text = msg.message.content
        .filter((block: { type: string }) => block.type === "text")
        .map((block: { type: string; text: string }) => block.text)
        .join("");
      console.log(text);
    }
  }
 
  // Deuxième tour — la session se souvient du contexte
  await session.send("Maintenant liste les dépendances principales du package.json");
  for await (const msg of session.stream()) {
    if (msg.type === "assistant") {
      const text = msg.message.content
        .filter((block: { type: string }) => block.type === "text")
        .map((block: { type: string; text: string }) => block.text)
        .join("");
      console.log(text);
    }
  }
}
 
interactiveSession().catch(console.error);

Note : L'API de sessions v2 est en preview (unstable_v2_createSession). L'API peut changer dans les versions futures. Pour l'utilisation en production, la fonction query est l'API stable.


Tester votre agent

Créez un test simple pour vérifier que votre agent fonctionne :

// src/test-agent.ts
import { query } from "@anthropic-ai/claude-agent-sdk";
 
async function testAgent() {
  const tests = [
    {
      name: "Liste de fichiers basique",
      prompt: "Liste les fichiers dans le répertoire courant",
      tools: ["Glob"],
      expectResult: true,
    },
    {
      name: "Analyse de code",
      prompt: "Lis package.json et dis-moi le nom du projet",
      tools: ["Read"],
      expectResult: true,
    },
  ];
 
  for (const test of tests) {
    console.log(`\nTest : ${test.name}`);
    let gotResult = false;
 
    for await (const message of query({
      prompt: test.prompt,
      options: {
        allowedTools: test.tools,
        maxTurns: 5,
      },
    })) {
      if ("result" in message) {
        gotResult = true;
        console.log(`  ✓ Résultat : ${message.result.slice(0, 100)}...`);
      }
    }
 
    if (gotResult === test.expectResult) {
      console.log(`  ✓ RÉUSSI`);
    } else {
      console.log(`  ✗ ÉCHOUÉ`);
    }
  }
}
 
testAgent().catch(console.error);

Dépannage

"Claude Code CLI not found"

L'Agent SDK nécessite que Claude Code soit installé globalement :

npm install -g @anthropic-ai/claude-code
claude --version  # Vérifier l'installation

Erreurs "Permission denied"

Si l'agent ne peut pas exécuter les outils, vérifiez votre permissionMode et allowedTools :

// Assurez-vous que les outils nécessaires sont dans la liste autorisée
options: {
  allowedTools: ["Bash", "Read", "Write", "Edit", "Glob", "Grep"],
  permissionMode: "acceptEdits",
}

L'agent tourne trop longtemps

Définissez maxTurns et maxBudgetUsd pour éviter les exécutions incontrôlées :

options: {
  maxTurns: 20,        // Arrêter après 20 appels d'outils
  maxBudgetUsd: 0.50,  // Arrêter si le coût dépasse $0.50
}

Échec de connexion au serveur MCP

Pour les serveurs stdio, assurez-vous que la commande existe et fonctionne seule :

# Tester le serveur MCP directement
npx -y @modelcontextprotocol/server-github

Pour les serveurs SSE, vérifiez que l'URL est accessible et que les headers CORS sont corrects.


Prochaines étapes

Maintenant que vous pouvez construire des agents avec le Claude Agent SDK, voici quelques idées à explorer :

  • Construire un agent CI/CD qui review les PRs, lance les tests et poste les résultats sur GitHub
  • Créer un agent de documentation qui lit votre codebase et génère la documentation API
  • Construire un agent de migration qui convertit JavaScript en TypeScript avec des types appropriés
  • Intégrer vos propres serveurs MCP — connectez bases de données, APIs et outils internes
  • Explorer l'API de sessions v2 pour construire des applications de chat interactives

Tutoriels connexes


Conclusion

Le Claude Agent SDK retire les parties les plus difficiles de la construction d'agents IA — la gestion de la boucle, l'exécution des outils, la gestion du contexte et la récupération d'erreurs. Ce qui nécessitait des centaines de lignes de code personnalisé est maintenant un seul appel query avec la bonne configuration.

Vous avez appris à :

  1. Configurer un projet TypeScript avec l'Agent SDK
  2. Exécuter des agents avec la fonction query et les outils intégrés
  3. Créer des outils personnalisés via des serveurs MCP
  4. Configurer les permissions pour une exécution autonome sécurisée
  5. Construire des sous-agents pour l'orchestration multi-agents
  6. Ajouter des garde-fous avec des limites de budget et des gestionnaires de permissions personnalisés
  7. Construire un projet pratique — un bot de review de code IA

Le passage de "construire des wrappers LLM" à "programmer des agents autonomes" est la tendance définissante des développeurs en 2026. Avec le Claude Agent SDK, vous êtes désormais équipé pour construire des agents qui ne se contentent pas de répondre aux questions — ils accomplissent le travail.


Vous voulez lire plus de tutoriels? Découvrez notre dernier tutoriel sur 11 Les Bases de Laravel 11 : Gestion des Erreurs.

Discutez de votre projet avec nous

Nous sommes ici pour vous aider avec vos besoins en développement Web. Planifiez un appel pour discuter de votre projet et comment nous pouvons vous aider.

Trouvons les meilleures solutions pour vos besoins.

Articles connexes