?
Guideintermédiaire

Tool use : donner des outils à Claude

Architecture et patterns pour l'utilisation d'outils via l'API Claude.

Le concept de Tool Use

Le Tool Use (ou function calling) permet à Claude d'appeler des fonctions que vous définissez. Claude ne les exécute pas directement — il génère les paramètres d'appel, et votre code exécute la fonction puis retourne le résultat à Claude.

Flux d'exécution

1. Vous envoyez un message avec des définitions d'outils 2. Claude décide s'il doit utiliser un outil 3. Claude retourne un tool_use content block avec les paramètres 4. Votre code exécute l'outil 5. Vous renvoyez le résultat dans un message tool_result 6. Claude formule sa réponse finale

Définir des outils

Les outils sont définis avec un JSON Schema :

const tools = [
  {
    name: "get_weather",
    description: "Obtient la météo actuelle pour une ville donnée. Utiliser quand l'utilisateur demande le temps qu'il fait.",
    input_schema: {
      type: "object",
      properties: {
        city: {
          type: "string",
          description: "Le nom de la ville, ex: 'Paris, France'"
        },
        unit: {
          type: "string",
          enum: ["celsius", "fahrenheit"],
          description: "Unité de température"
        }
      },
      required: ["city"]
    }
  }
];

Implémenter la boucle agentique

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

async function runAgent(userMessage: string) {
  let messages = [{ role: "user", content: userMessage }];

  while (true) {
    const response = await client.messages.create({
      model: "claude-sonnet-4-20250514",
      max_tokens: 1024,
      tools,
      messages
    });

    // Si pas d'appel d'outil, on a la réponse finale
    if (response.stop_reason === "end_turn") {
      return response.content[0].text;
    }

    // Traiter les appels d'outils
    const toolUseBlocks = response.content.filter(b => b.type === "tool_use");
    messages.push({ role: "assistant", content: response.content });

    const toolResults = await Promise.all(
      toolUseBlocks.map(async (block) => ({
        type: "tool_result",
        tool_use_id: block.id,
        content: await executeFunction(block.name, block.input)
      }))
    );

    messages.push({ role: "user", content: toolResults });
  }
}

Bonnes pratiques pour les descriptions

  • Soyez précis : Décrivez quand utiliser l'outil ET quand ne PAS l'utiliser
  • Documentez les paramètres : Ajoutez des exemples dans les descriptions
  • Nommez clairement : search_products est mieux que search
  • Limitez le nombre : Claude fonctionne mieux avec 10-20 outils maximum

Forcer l'utilisation d'un outil

// Forcer un outil spécifique
tool_choice: { type: "tool", name: "get_weather" }

// Forcer l'utilisation d'au moins un outil
tool_choice: { type: "any" }

// Laisser Claude décider (par défaut)
tool_choice: { type: "auto" }

Appels parallèles

Claude peut appeler plusieurs outils dans une même réponse. Gérez-les en parallèle avec Promise.all pour réduire la latence.

Sources

APItool-useagents