Function calling
Définition
Mécanisme par lequel le LLM renvoie un appel de fonction structuré (nom + arguments JSON) au lieu d'un texte libre. Permet d'intégrer l'IA dans des workflows métier de façon fiable.
Le terme et son évolution
Function calling est le terme initialement employé par OpenAI en 2023 pour désigner la capacité d'un LLM à renvoyer un appel de fonction structuré plutôt qu'un texte libre. Le mécanisme s'est ensuite généralisé chez Anthropic, Google et les autres fournisseurs sous le nom plus large de tool use. Aujourd'hui, les deux termes sont synonymes : function calling est le vocabulaire OpenAI, tool use celui d'Anthropic et de l'industrie en général. Le mécanisme sous-jacent est identique : on déclare une liste de fonctions au modèle, et il renvoie le nom de la fonction à appeler avec ses arguments au format JSON, validés contre le schéma déclaré.
Comment ça marche
On déclare chaque fonction avec un schéma JSON Schema qui décrit son nom, sa description et ses paramètres. Côté requête API, on passe la liste des fonctions disponibles au modèle. Le modèle analyse la requête utilisateur et, s'il juge qu'une fonction est pertinente, renvoie une réponse avec un objet tool_calls contenant le nom de la fonction et les arguments. Le développeur récupère ce JSON, exécute la fonction réelle dans son code (interroger une base, appeler une API, faire un calcul), et renvoie le résultat au modèle qui poursuit. Le tout se fait sans parsing fragile : le JSON est structuré et typé.
À quoi ça sert
Function calling est l'outil qui permet d'intégrer un LLM dans un produit existant de façon fiable. Cas typiques : à partir d'une demande en langage naturel, déclencher une recherche dans la base produit avec les bons filtres, valider un formulaire complexe avec un schéma métier, orchestrer plusieurs étapes (vérifier le stock, créer la commande, envoyer la confirmation), interroger plusieurs APIs et synthétiser. Sans function calling, on devrait parser du texte libre avec des regex, ce qui est fragile et imprévisible. Avec function calling, le contrat est explicite et la fiabilité monte de plusieurs ordres de grandeur.
Function calling versus Structured Outputs
Function calling et Structured Outputs sont deux faces d'une même médaille. Function calling : le modèle choisit quelle fonction appeler, avec quels arguments. Structured Outputs (chez OpenAI) ou JSON mode strict : le modèle renvoie une réponse forcée à un schéma JSON précis, sans qu'il y ait de choix de fonction. On combine souvent les deux : le modèle décide d'appeler une fonction (function calling) ET ses arguments respectent un schéma strict (structured output au sein des arguments). C'est la base d'un agent fiable en production où chaque action est typée de bout en bout.
L'écosystème et les SDK
Tous les SDK majeurs gèrent function calling nativement. Le SDK OpenAI accepte directement des objets ZodSchema convertis en JSON Schema. Le SDK Anthropic prend les définitions de tools avec leur schéma. Vercel AI SDK propose une abstraction unifiée qui marche avec OpenAI, Anthropic, Google, Mistral, ce qui permet de switcher de fournisseur sans réécrire le code. Côté validation côté serveur, on revalide systématiquement les arguments avec Zod ou un équivalent avant exécution : le modèle peut générer un argument qui passe le JSON Schema mais ne respecte pas une règle métier (ID inexistant, montant négatif).
Les pièges à éviter
Trois erreurs reviennent. Faire confiance à l'argument fourni par le modèle sans validation : même avec un schéma strict, un argument peut être syntaxiquement valide mais sémantiquement faux. On revalide en métier avant exécution. Exposer trop de fonctions au modèle : au-delà de 15-20 fonctions, le modèle commence à se tromper de choix. On regroupe par domaine et on filtre selon le contexte. Et oublier la gestion d'erreur : si la fonction échoue, on renvoie l'erreur au modèle dans le message tool result, ce qui lui permet d'adapter sa stratégie plutôt que de planter silencieusement.