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_productsest mieux quesearch - 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.