Le résultat que vous allez obtenir
Un outil additionne deux nombres. Vous observez un compteur : il reste à zéro quand l’outil est déclaré, puis passe à un quand vous appelez invoke. Une entrée invalide est rejetée avant d’exécuter votre fonction.
Cet exemple est volontairement local : aucun modèle, aucun secret et aucun appel payant. Il ne simule pas une décision réelle d’un LLM. Vous isolez la partie que votre application doit maîtriser : l’exécution.
Les trois moments à distinguer
- Déclaration : vous décrivez une fonction, son nom et ses arguments attendus.
- Sélection : dans un agent, le modèle peut demander un appel avec des arguments. Cette étape n’est pas exécutée dans notre exemple local.
- Exécution : votre application appelle l’outil, reçoit le résultat et peut le renvoyer au modèle.
Chargement du schéma…
bindTools sert à rendre les outils disponibles au modèle. Pour un outil exécuté par votre application, cette déclaration ne remplace pas l’exécution. Certains fournisseurs proposent aussi des outils exécutés chez eux : c’est un autre mécanisme.
Préparez votre dossier
Vous avez besoin de Node.js 22 ou ultérieur, de npm et d’un terminal. Créez un dossier vide, puis téléchargez les trois fichiers ci-dessous dans ce dossier. Le nom du programme est tool-demo.mts ; conservez cette extension.
npm ci
npm startLe verrou de dépendances rend l’installation reproductible. Cet exemple utilise @langchain/core 1.2.14. Vous pouvez consulter le programme complet.
Lisez le cœur du programme
const addition = tool(
({ a, b }) => {
executions += 1;
return String(a + b);
},
{
name: "addition",
description: "Additionne deux nombres.",
schema: z.object({ a: z.number(), b: z.number() }),
},
);
const result = await addition.invoke({ a: 2, b: 3 });Le schéma décrit les entrées autorisées. La fonction fournit le calcul. invoke déclenche la validation puis l’exécution. Ici, les arguments sont écrits à la main pour rendre le comportement reproductible.
Dans un agent complet, vous récupéreriez les appels demandés par le modèle, vérifieriez quels outils sont autorisés, les exécuteriez puis restitueriez leurs résultats. Un outil qui paie, écrit ou supprime demanderait des protections adaptées ; un schéma valide ne suffit pas à autoriser une action.
Vérifiez votre résultat
Avant invoke : 0 exécution
Résultat : 5
Après invoke : 1 exécution
Entrée invalide : rejetée avant exécutionSi vous n’obtenez pas ces quatre lignes, vérifiez la version de Node.js, l’installation et les noms des fichiers. Aucune clé API ne résoudra une erreur de cet exemple : il n’appelle pas de modèle.
À vous de jouer
Remplacez les arguments par a: 8 et b: 4. Avant de lancer le programme, prédisez le résultat. Puis essayez a: "8" : pourquoi la fonction ne devrait-elle pas s’exécuter ? Adaptez les assertions du programme si vous changez les nombres.
Votre checkpoint : vous savez expliquer la différence entre décrire une capacité et l’exécuter, ainsi que le rôle du schéma d’entrée.
Pour aller plus loin
Le mécanisme des outils est documenté dans la documentation officielle LangChain. Le cours poursuit avec leur composition, les agents ReAct, les graphes et l’évaluation des exécutions.