Construire des Agents IA Autonomes : Tool Calling, Machines à États et Boucles ReAct
Concevoir des agents fiables avec appel de fonctions typées en JSON, gestion d’erreurs et garde-fous de sécurité.
1. L’architecture de boucle ReAct (Reason + Act)
Le patron ReAct structure l’exécution d’un agent comme une boucle entrelacée de raisonnement et d’action : le modèle produit une pensée sur ce qu’il doit faire ensuite, sélectionne et appelle un outil en fonction de cette pensée, observe le résultat de l’outil, puis réinjecte cette observation dans l’étape de raisonnement suivante, en répétant jusqu’à disposer d’assez d’informations pour produire une réponse finale. C’est un écart significatif par rapport à un simple appel prompt-réponse en une seule fois, car cela permet au modèle de se corriger en fonction de résultats intermédiaires réels, plutôt que de devoir planifier correctement toute une tâche à plusieurs étapes en une seule passe.
Implémenter cette boucle de façon fiable exige une machine à états explicite, pas une simple boucle while implicite, car les agents de production ont besoin de transitions bien définies entre états (raisonnement, en attente du résultat d’un outil, erreur d’outil, en attente d’approbation humaine, terminal) qui puissent être journalisées, reprises après un crash, et raisonnées indépendamment de l’appel au LLM lui-même. Traiter la boucle comme un simple for autour d’un appel API fonctionne pour une démonstration mais s’effondre dès qu’il faut persister l’état, relancer un appel d’outil échoué sans rejouer toute la chaîne de raisonnement, ou mettre en pause pour une approbation humaine en cours de tâche.
La machine à états a aussi besoin dès le départ d’un budget d’itérations explicite, à la fois un nombre maximal d’itérations de boucle et une durée maximale en temps réel, car un agent bloqué dans un schéma de raisonnement improductif (appelant par exemple le même outil de façon répétée avec des arguments légèrement différents) tournera sinon jusqu’à atteindre un plafond de tokens ou de coût, au lieu d’échouer rapidement et de faire remonter le problème.
2. Validation stricte des schémas d’outils avec Zod
Les API de function calling des fournisseurs de LLM décrivent les arguments des outils via un schéma JSON, mais rien ne garantit que le modèle produise des arguments respectant réellement ce schéma, et traiter les arguments bruts d’un appel d’outil comme une entrée de confiance est l’une des sources les plus courantes d’échecs silencieux et, dans le pire des cas, de véritables failles de sécurité (un argument de traversée de chemin passé directement à un outil de lecture de fichier, par exemple). Les arguments de chaque appel d’outil doivent être validés contre un schéma strict au moment de l’exécution, pas seulement au niveau des types pendant le développement.
Zod est le choix standard dans une stack TypeScript, car une seule définition de schéma remplit un double rôle : elle génère le schéma JSON que le LLM voit et qui décrit les arguments attendus par l’outil, et elle valide les arguments réellement retournés à l’exécution, ce qui garde les deux synchronisés par construction plutôt que de maintenir un schéma JSON écrit à la main et un validateur écrit à la main séparé, susceptibles de diverger silencieusement.

