Function Calling OpenAI : Guide Complet pour Connecter Anthropic, Mistral et une API Météo
Le function calling connecte un LLM à une API météo via une boucle agent en 4 étapes.
- LLM raisonne, code exécute : séparation des responsabilités.
- Interface ITool avec Name et Description pour guider le modèle.
- 10-15 itérations max et timeout global pour éviter les boucles.
- Parallel calling réduit la latence de 3 à 5 fois (250ms).
- Contrat JSON en 2 temps : description puis appel structuré.
- Schéma JSON : nom, description, paramètres attendus.
Les 4 Étapes de la Boucle Agent (Fondation du Function Calling)
Le function calling repose sur une architecture simple mais puissante : le LLM raisonne, le code exécute. Cette séparation des responsabilités transforme un modèle de langage statique en un agent capable d’agir sur le monde réel. Concrètement, la boucle se décompose en quatre étapes répétées jusqu’à obtenir une réponse finale claire.
- Définir les outils : chaque fonction expose un schéma JSON décrivant son nom, sa description et ses paramètres attendus.
- Appeler le modèle : la requête utilisateur et la liste des outils sont envoyées au LLM, qui décide s’il doit invoquer une fonction.
- Exécuter et retourner : le code exécute la fonction (ex. appel API météo) puis renvoie le résultat structuré au modèle pour synthèse.
- Répéter : la boucle continue jusqu’à ce que le modèle fournisse une réponse finale, sans appel d’outil.
La gestion du cycle de vie est cruciale. En production, une boucle agent typique limite son exécution à 10-15 itérations maximum pour éviter les boucles infinies. Un timeout global de 30 secondes s’applique en mode interactif, contre 5 minutes en mode asynchrone. Ces garde-fous protègent votre infrastructure et vos coûts.
L’optimisation de la latence est un autre facteur clé, , notamment pour l’automatisation des workflows,. Historiquement, l’appel séquentiel de 5 fonctions prend environ 1 seconde. Avec le parallel calling activé par défaut sur OpenAI, la latence chute de 3 à 5 fois, pour un maximum de 250ms par cycle d’appels parallèles. Ce gain transforme l’expérience utilisateur, notamment pour les agents météo qui interrogent plusieurs villes simultanément.
L’interface ITool (avec Name et Description) est la pierre angulaire de ce pattern. Elle permet au modèle de comprendre précisément ce que chaque fonction fait, réduisant les erreurs de sélection. Comme le souligne la pratique, le LLM agit comme un cerveau qui planifie, tandis que le code constitue le système nerveux qui exécute les actions concrètes.
Contrat JSON : Description des Outils et Schéma de Réponse

| Temps | Qui parle | Contenu |
|---|---|---|
| 1. Description | Vous → LLM | Nom, description, paramètres |
| 2. Appel | LLM → Vous | Fonction + arguments JSON |
Le function calling repose sur un contrat en deux temps. D’abord, vous décrivez au modèle les outils disponibles via un schéma JSON (nom, description, paramètres attendus). Ensuite, le modèle vous renvoie un appel structuré : le nom de la fonction choisie et un objet JSON contenant les arguments. C’est ce double échange qui transforme un simple chatbot en agent capable d’agir.
Rôle du schéma JSON dans l’appel structuré
Le schéma JSON n’est pas une formalité : il constitue la seule interface entre le raisonnement du LLM et votre code. Plus il est précis, plus l’appel retourné sera exploitable. Par exemple, pour un outil météo, vous spécifierez une propriété obligatoire city de type string, et une propriété optionnelle unit avec des valeurs énumérées (celsius, fahrenheit). Sans ce contrat, le modèle pourrait inventer un argument ville ou temperature_unit que votre fonction ne comprendra pas.
Sur des modèles comme GPT-4o ou Claude Sonnet-4.6, ce schéma doit être décrit avec des exemples concrets dans le champ description. Les modèles récents tolèrent mal les descriptions vagues. Les statistiques de production le confirment : exposer entre 10 et 20 outils maximum garantit une sélection fiable. Au-delà de 50 outils, la précision chute sensiblement c’est là qu’une fonctionnalité comme Tool Search s’avère indispensable, permettant d’économiser plus de 90% des tokens dédiés aux descriptions.
Validation Pydantic comme source unique de vérité
Le schéma JSON envoyé au LLM et la validation des arguments reçus doivent reposer sur un même modèle Pydantic. Cette classe sert à la fois à générer le schéma (via model_json_schema()) et à valider la réponse du modèle avant exécution. Concrètement :
– JSON cassé : le parser répare ou rejette proprement
– Argument manquant : Pydantic lève une erreur de validation
– Exécution échouée : l’exception est capturée et renvoyée au modèle
Cette double utilisation évite la duplication de code et garantit que ce que le modèle voit est exactement ce que votre code valide. Sans cela, un argument temperature manquant ou une valeur absurde comme city=12345 passerait jusqu’à l’exécution, provoquant des crashs difficiles à tracer.
L’ordre reste non négociable en production : parser, valider avec Pydantic, puis exécuter. Toute exception levée par l’outil doit être convertie en message d’erreur structuré renvoyé au modèle, qui pourra alors se corriger lui-même en proposant un nouvel appel. Cette boucle de correction est le cœur de la robustesse des agents modernes.
Gestion des Erreurs et Dépannage en Production
Cette approche s’inscrit dans la tendance plus large des agent ia open source, qui privilégient la transparence et la modularité pour construire des systèmes autonomes fiables.
Dans une boucle agent, l’ordre est non négociable : parser, valider, exécuter. Un JSON malformé, un argument manquant ou un outil qui échoue sont les trois pannes classiques. Pour les couvrir, structurez votre code en trois défenses distinctes : un parser tolérant, une validation Pydantic stricte des arguments, puis l’exécution de l’outil qui retourne une erreur structurée au modèle. Cette dernière lui permet de s’auto-corriger au tour suivant.
En production, ajoutez une validation sémantique : des valeurs absurdes passent le JSON mais doivent être rejetées. Limitez la boucle à 10-15 itérations maximales et fixez un timeout global de 30 secondes en interactif, 5 minutes en asynchrone. Respectez aussi les cinq règles d’or : descriptions détaillées, 10 à 20 outils maximum, et épinglez les versions de modèles pour éviter les comportements imprévisibles lors des mises à jour. Testez avec 50 à 100 exemples de données réelles avant tout déploiement.
Outil Météo : Implémentation avec API Open-Meteo Réelle
Pour passer de la théorie à la pratique, rien ne vaut un cas d’usage concret. Nous allons créer un outil météo complet connecté à l’API Open-Meteo, une API publique et gratuite qui ne nécessite aucune clé d’authentification. Ce choix élimine les frictions d’inscription et permet de se concentrer sur l’essentiel : la mécanique du function calling. , dont le prix anthropic reste compétitif,
Création de l’outil : interface ITool, WeatherTool et contrat
La première étape consiste à définir une interface commune pour tous vos outils. Cette abstraction vous permettra d’ajouter de nouvelles capacités au modèle sans réécrire la boucle agent. Voici la structure à respecter :
- Définir l’interface ITool : chaque outil expose un
Name, uneDescriptionet une méthodeExecute. Le contrat JSON est généré automatiquement à partir de cette interface. - Implémenter WeatherTool : cet outil effectue 2 requêtes API successives d’abord un géocodage pour convertir le nom de la ville en coordonnées GPS, puis l’appel météo à proprement parler.
- Valider avec Pydantic : la classe
WeatherArgsdéfinit les paramètres attendus (ville, unités). Pydantic génère le schéma JSON et valide les arguments reçus du modèle avant toute exécution.
Le point crucial : un outil bien conçu ne lève jamais d’exception. Si la ville n’existe pas ou que l’API météo est injoignable, l’outil retourne un message d’erreur structuré que le LLM pourra interpréter et corriger. Cette approche évite les crashs silencieux et les boucles infinies.
Test de l’outil en conditions réelles
Avant de brancher le modèle, testez chaque composant isolément. La stratégie couvre 3 faces distinctes : le contrat (le schéma JSON est-il valide ?), la validation (Pydantic rejette-t-il les arguments manquants ?) et l’outil lui-même (l’API Open-Meteo répond-elle correctement ?).
Tester sur des 50 à 100 exemples de données réelles avant déploiement permet de repérer les villes ambiguës (« Paris » au Texas ou en France ?) et les formats d’unités incohérents. Un exemple type avec get_weather s’exécute en moins de 250ms une fois la boucle rodée un délai parfaitement acceptable pour une expérience interactive.
Cette architecture sert de squelette universel : une fois le WeatherTool opérationnel, vous pouvez dupliquer le pattern pour tout autre service base de données, envoi d’emails, calculs métier avec un effort minimal.
Prérequis et Coûts d’Exploitation (OpenAI vs Anthropic vs Mistral)
| Fournisseur | Coût mensuel estimé | Spécificité function calling |
|---|---|---|
| OpenAI (GPT-5.5) | 40 $/mois | Strict=True, sorties garanties |
| Anthropic (Sonnet) | 50-80 $/mois | Cache schémas 24h |
| Mistral (7B) | Variable selon hébergement | Compatibilité OpenAI standard |
Pour une PME traitant 1 000 requêtes/jour avec 3 tool calls par requête, le dimensionnement est simple. Chaque appel consomme environ 500 tokens en entrée et 200 tokens en sortie, soit 150K tokens input et 60K tokens output quotidiennement. Sur GPT-5.5, cela revient à 0,40 $/jour en input et 0,90 $/jour en output, pour un total de 1,30 $/jour environ 40 $/mois.
Côté Anthropic Sonnet, l’écart de 50 à 80 $/mois s’explique par la tarification différente et les schémas d’outils automatiquement cachés pendant 24h. Cette mise en cache réduit la redondance des tokens de description, mais exige de surveiller les coûts dès que le volume d’outils exposés augmente. Mistral reste l’option économique avec une API calquée sur le standard OpenAI.
Avant de déployer en production, épinglez vos versions de modèles. Un comportement peut changer entre deux versions de GPT-4o ou Claude Sonnet, et vos prompts d’outils doivent être testés sur des versions précises. Planifiez 50 à 100 exemples de tests avec données réelles avant mise en production, et monitorer chaque appel pour ajuster les tokens si nécessaire.
Patterns Avancés : Appels Parallèles et Optimisation (à Placer en Fin)
L’appel parallèle est l’optimisation la plus rentable. Là où 5 fonctions séquentielles exigent près d’une seconde, l’exécution simultanée les réduit à environ 250 ms de latence. Cette réduction est spectaculaire : le gain atteint 3 à 5 fois la vitesse initiale. Pour les agents devant enchaîner géocodage, météo et trafic, cette baisse de latence transforme l’expérience utilisateur finale.
Toutefois, tous les modèles ne le gèrent pas nativement. Si votre fournisseur ne supporte pas le parallélisme, implémentez une boucle séquentielle classique : vous exécutez chaque appel, pus vous consolidez les résultats avant de les renvoyer au LLM. Ce pattern reste compatible avec les modèles de la génération précédente. Prévoyez aussi un timeout global 30 secondes en interactif, 5 minutes en asynchrone pour éviter qu’un outil bloqué ne fige tout l’agent.
Pour des performances optimales, gardez le nombre d’outils exposés entre 10 et 20. Au-delà de 50 outils, activez le Tool Search dynamique : il ne charge que les schémas pertinents, économisant jusqu’à 90 % des tokens de définition. Enfin, plafonnez la boucle agent à 10 à 15 itérations ; au-delà, le coût explose sans gain qualitatif.
FAQ : Dépannage et Bonnes Pratiques du Function Calling
Quelles erreurs de validations Pydantic sont les plus fréquentes avec les outils ?
Les erreurs les plus courantes sont les types de données incorrects, comme une chaîne de caractères envoyée pour un entier, et les champs obligatoires manquants. Pydantic rejette systématiquement ces appels malformés, ce qui force le modèle à reformuler sa demande. Pour limiter ces échecs, définissez des valeurs par défaut et autorisez des champs optionnels dans votre contrat JSON.
Comment gérer les appels parallèles sur les modèles qui ne le supportent pas ?
Détectez que le modèle a renvoyé plusieurs appels d’outils et exécutez-les en séquence dans votre boucle agent. Pour chaque outil, attendez la fin de son exécution avant d’envoyer tous les résultats au modèle en un seul message. Cette approche garantit la compatibilité tout en préservant la richesse des réponses générées en parallèle.
Combien d’outils faut-il exposer à un modèle pour une sélection fiable ?
Limitez votre sélection à cinq outils maximum par requête pour garantir une précision optimale. Au-delà de ce seuil, le modèle souffre de confusion et fait des choix hasardeux. Regroupez les fonctionnalités similaires en un seul outil paramétré avec des arguments pour maintenir un catalogue réduit et efficace.
