Introduction au tool use
Sur cette page
Cette leçon reprend l’idée de l’annexe du tutoriel : l’appel d’outils n’est que substitution et chaînage, Claude demande une fonction, votre code l’exécute, le résultat revient dans la conversation. Le tutoriel le faisait avec un prompt système et des balises maison ; l’API dispose depuis d’un paramètre tools natif, que la leçon utilise, avec la calculatrice et la base de données du tutoriel.
Le principe
L’appel d’outils, ou function calling, paraît complexe mais est simple : vous connaissez déjà tout ce qu’il faut. Dans les substitutions précédentes, on insérait du texte dans les prompts ; ici, on insère des résultats de fonctions. Claude ne peut pas littéralement appeler des outils : il sort le nom de l’outil et ses arguments, s’arrête, et on le relance avec le résultat ajouté à la conversation. Cela étend ses capacités à des tâches à plusieurs étapes : calculatrice, compteur de mots, requêtes SQL, API météo.
Hier un prompt système, aujourd’hui le paramètre tools
En 2024, le tutoriel apprenait à Claude l’appel d’outils par un long prompt système : une explication du mécanisme, un bloc <function_calls> que Claude avait été entraîné à produire, la description des outils en pseudo-schéma, et </function_calls> en stop_sequences pour détecter l’appel ; puis du code qui extrayait les paramètres par recherche de chaînes et renvoyait un bloc <function_results>. Le tutoriel annonçait un format plus simple à venir : c’est le paramètre tools de l’API Messages. On y décrit chaque outil par un nom, une description et un schéma JSON d’entrée ; quand Claude veut l’appeler, la réponse s’arrête avec stop_reason: "tool_use" et un bloc tool_use contenant un identifiant et les arguments déjà analysés ; on renvoie le résultat dans un bloc tool_result portant le même identifiant.
import anthropic
client = anthropic.Anthropic()
tools = [{
"name": "calculator",
"description": "Calculator function for doing basic arithmetic. Supports addition, subtraction, multiplication and division.",
"input_schema": {
"type": "object",
"properties": {
"first_operand": {"type": "integer", "description": "First operand (before the operator)"},
"second_operand": {"type": "integer", "description": "Second operand (after the operator)"},
"operator": {"type": "string", "enum": ["+", "-", "*", "/"], "description": "The operation to perform"},
},
"required": ["first_operand", "second_operand", "operator"],
},
}]
def do_pairwise_arithmetic(num1, num2, operation):
return {"+": num1 + num2, "-": num1 - num2, "*": num1 * num2, "/": num1 / num2}[operation]
messages = [{"role": "user", "content": "Multiply 1,984,135 by 9,343,116"}]
response = client.messages.create(model="claude-opus-5-5", max_tokens=2000, tools=tools, messages=messages)
if response.stop_reason == "tool_use":
call = next(block for block in response.content if block.type == "tool_use")
result = do_pairwise_arithmetic(call.input["first_operand"], call.input["second_operand"], call.input["operator"])
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": [{"type": "tool_result", "tool_use_id": call.id, "content": str(result)}]})
final = client.messages.create(model="claude-opus-5-5", max_tokens=2000, tools=tools, messages=messages)
print(next(block.text for block in final.content if block.type == "text"))
Deux points que le tutoriel soulignait tiennent toujours : la description de l’outil est ce sur quoi Claude s’appuie pour décider de l’appeler, et il sait ne pas l’appeler quand ce n’est pas nécessaire (« quelle est la capitale de la France ? » n’appelle pas la calculatrice). La multiplication 1 984 135 × 9 343 116 est le cas d’école : un modèle de langage produit un résultat plausible mais faux, la calculatrice un résultat exact, non parce que le modèle a progressé en arithmétique, mais parce qu’il a délégué. Pour aller plus loin (boucle d’outils avec le tool runner, outils stricts, outils côté serveur), suivez L’utilisation d’outils (tool use).
À vous de jouer
Exercice 10.2.1 : la plus petite base du monde. Le tutoriel fournit un dictionnaire db avec trois utilisateurs et trois produits, et quatre fonctions : get_user, get_product, add_user, add_product. Décrivez-les dans tools (nom, description, paramètres typés), puis demandez à Claude d’ajouter un utilisateur et de retrouver le prix d’un produit ; votre boucle doit exécuter la fonction demandée et renvoyer le résultat jusqu’à ce que stop_reason vaille end_turn.
Sources officielles : 10.2_Appendix_Tool Use.ipynb (anthropics/prompt-eng-interactive-tutorial) · Tool use with Claude (documentation Claude)
Points clés à retenir
- L’appel d’outils est une substitution : Claude demande, votre code exécute, le résultat revient dans la conversation.
- Le prompt système à balises maison de 2024 est remplacé par le paramètre
tools: nom, description, schéma JSON. stop_reason: "tool_use"signale la demande ; le résultat repart dans un bloctool_resultavec le même identifiant.- La description de l’outil décide de son emploi ; Claude sait ne pas l’appeler quand c’est inutile.
- La calculatrice rend exact ce qu’un modèle de langage ne fait qu’approcher : il a délégué.