Le modèle ne peut rien exécuter. C’est le point de départ, et il est constamment mal compris.
Vous fournissez au modèle une liste de fonctions disponibles, chacune décrite par un nom, une description en langage naturel et un schéma de ses arguments. Le modèle, plutôt que de répondre en texte, produit une sortie structurée du type « appeler chercher_client avec le paramètre nom égal à Dupont ».
Votre code reçoit cette structure, décide de l’exécuter ou non, appelle la vraie fonction, et renvoie le résultat au modèle sous forme de message. Le modèle poursuit avec cette information.
Elle est la raison pour laquelle un agent peut être sécurisé du tout. Entre l’intention du modèle et l’effet réel, votre code peut :
Un intervieweur qui pose cette question vérifie souvent que vous ne croyez pas que le modèle « a accès » à votre base de données. Il n’y a jamais accès : il demande, vous exécutez.
Les fournisseurs contraignent le décodage sur le schéma déclaré, ce qui garantit que les arguments produits sont syntaxiquement conformes. Ce qui n’est pas garanti, en revanche : que ce soit le bon outil, que les valeurs soient justes, ou qu’un identifiant fourni existe réellement. La validation métier reste à votre charge.
Le résultat, mais aussi les erreurs, en clair. « Client introuvable » ou « paramètre date attendu au format ISO » sont des observations exploitables : le modèle corrige généralement son appel au tour suivant. Faire échouer la boucle sur une erreur d’outil gaspille cette capacité d’autocorrection, qui est l’un des vrais avantages de l’approche.