Comment créer un agent IA : boucle, outils, mémoire, garde-fous | We.Inc
Créez un agent IA à partir des bases : la boucle décider, agir, observer, les définitions d'outils, la mémoire, les limites d'étapes, la validation humaine et les tests. Avec un simulateur pas à pas.
Comment créer un agent IA
Un agent IA est une boucle. Un modèle de langage lit l'objectif et tout ce qui s'est passé jusque-là, puis appelle l'un des outils que vous avez définis ou donne une réponse finale. Votre code exécute l'outil, ajoute le résultat et redemande. Les limites d'étapes, les permissions, la validation humaine et les tests gardent cette boucle sûre.
Les cinq parties d'un agent
Partie
Ce que vous construisez
Ce qui déraille sans elle
Boucle
Du code qui appelle le modèle, exécute les outils et recommence
Rien ne se passe après la première réponse
Outils
Des fonctions nommées avec une description et un schéma d'entrée
Le modèle peut seulement parler, pas agir
Mémoire
La transcription en cours, plus les notes conservées entre deux exécutions
Le modèle refait des appels déjà effectués
Garde-fous
Limites d'étapes et de coût, moindre privilège, validation des actions risquées
Des tâches de test fixes avec des vérifications relancées après chaque changement
Ce sont les utilisateurs qui découvrent les régressions
Lancez le simulateur pour suivre une tâche à travers la boucle. Désactivez puis réactivez la validation pour voir où un garde-fou interrompt une étape risquée. Le déroulé est scénarisé pour que vous puissiez l'étudier ; une vraie exécution interrogerait un modèle à chaque étape de décision.
Appuyez sur Étape suivante pour faire avancer la boucle d'un mouvement à la fois.
Lisez chaque ligne : décider, c'est le modèle qui choisit, agir, c'est votre code qui exécute un outil, observer, c'est le résultat ajouté à la mémoire.
Activez ou désactivez la validation pour send_email et relancez pour comparer les deux déroulés.
Appuyez sur Réinitialiser pour recommencer.
Commencez avec un seul outil et une seule tâche. N'ajoutez des outils que lorsqu'une tâche de test échoue faute d'en avoir un, car chaque outil supplémentaire est un choix de plus que le modèle peut rater.
Gardez les résultats d'outils courts et factuels. Toute la transcription est renvoyée au modèle à chaque étape, donc les longs résultats coûtent de l'argent et noient l'essentiel.
Placez les contrôles de permission dans le code de l'outil, pas dans les instructions. On peut convaincre un modèle d'ignorer une instruction ; il ne peut pas contourner un contrôle imposé par votre fonction.
Journalisez chaque étape avec son entrée, sa sortie et son coût. Quand une exécution tourne mal, le journal est le seul moyen de voir quelle décision était mauvaise.
Questions fréquentes
Faut-il un framework pour créer un agent ?
Non. Le cœur est une boucle while autour d'un appel au modèle et d'un switch sur les noms d'outils, comme le montre l'exemple de cette page. Les frameworks ajoutent les nouvelles tentatives, le traçage et les intégrations, utiles plus tard, mais ils masquent la boucle pendant l'apprentissage.
Comment le modèle appelle-t-il un outil ?
Vous envoyez les définitions d'outils avec chaque requête. Quand le modèle veut en utiliser un, il répond avec le nom de l'outil et ses arguments au lieu d'un simple texte. Votre code exécute la fonction et renvoie le résultat comme message suivant.
Quelle est la différence entre mémoire et contexte ?
Le contexte, c'est ce que le modèle voit lors de cet appel : instructions, objectif et transcription jusque-là. La mémoire, c'est tout ce que vous stockez et choisissez de remettre dans le contexte plus tard, comme des notes d'une exécution précédente.
Comment empêcher un agent de tourner indéfiniment ?
Plafonnez le nombre d'étapes et la dépense totale, et terminez l'exécution avec un message clair quand l'un des deux est atteint. L'OWASP classe Unbounded Consumption parmi ses risques 2025 pour les applications construites sur des modèles de langage.
Comment tester un agent ?
Écrivez un ensemble de tâches fixes aux résultats vérifiables : le bon outil a été appelé, une action risquée a attendu la validation, la réponse finale contient un chiffre. Relancez l'ensemble après chaque modification de prompt ou d'outil et comparez le nombre de réussites.
Des garde-fous qui tiennent vraiment
La liste 2025 de l'OWASP cite Excessive Agency comme un risque central et l'attribue à trois causes : fonctionnalités excessives, permissions excessives et autonomie excessive. Chacune correspond à une correction que vous maîtrisez dans le code.
Ne donnez à l'agent que les outils dont la tâche a besoin, donnez à chaque outil les identifiants les plus restreints qui fonctionnent, et exigez qu'une personne valide les actions à fort impact comme envoyer, payer ou supprimer. Vérifiez les autorisations dans le système que l'outil appelle plutôt que de compter sur le bon comportement du modèle.
Le texte non fiable est la principale surface d'attaque
Tout ce qu'un outil récupère, comme une page web, un e-mail ou un fichier, peut contenir des instructions destinées à votre modèle. L'OWASP appelle cela l'injection de prompt indirecte.
Signalez clairement le contenu récupéré comme des données, gardez-le séparé de vos propres instructions et ne laissez jamais le texte d'un résultat d'outil débloquer à lui seul un outil plus puissant. La validation humaine des étapes privilégiées sert de dernier rempart quand les autres défenses échouent.
La boucle en JavaScript pur
Sans framework ni SDK de fournisseur. callModel est un bouchon qui rejoue des décisions fixes pour que le fichier s'exécute tel quel ; remplacez-le par une requête au service de modèle que vous utilisez.
Les outils sont regroupés dans un objet, les plus risqués exigent une validation, et la boucle s'arrête à une limite d'étapes. Lancez-la avec node agent.mjs.
Les risques à prévoir dès la conception
Entrées de l'OWASP Top 10 for LLM Applications 2025 qui comptent le plus pour les agents
Risque
Comment il se manifeste dans un agent
Correction dans le code
LLM01:2025 Prompt Injection
Une page récupérée demande au modèle d'envoyer vos données ailleurs par e-mail
Séparer le contenu non fiable, valider les actions privilégiées
LLM06:2025 Excessive Agency
L'agent peut supprimer des enregistrements qu'il n'avait besoin que de lire
Moins d'outils, identifiants restreints, validation des actions à fort impact
LLM10:2025 Unbounded Consumption
Une boucle relance toute la nuit un outil qui échoue
Limite d'étapes, limite de dépense, timeouts, limites de débit
LLM05:2025 Improper Output Handling
La sortie du modèle est insérée dans du SQL ou du HTML sans contrôle
Valider et échapper avant toute utilisation en aval
Objectif : trouver le moins cher de trois devis fournisseurs et envoyer le résumé par e-mail au responsable administratif.
Le modèle choisit read_quotes pour voir ce qui est arrivé.
Le code exécute read_quotes() et renvoie trois fichiers.
Résultat ajouté à la mémoire : A $1,240, B $1,180, C $1,315.
Le modèle a ce qu'il lui faut et choisit send_email avec un brouillon de résumé.
send_email est marqué à fort impact, donc l'exécution se met en pause pour qu'une personne valide le brouillon.
Validé. Le code exécute send_email() avec le texte validé.
Résultat ajouté à la mémoire : message envoyé.
Le modèle renvoie une réponse finale : le devis B est le moins cher à $1,180 ; résumé envoyé. 3 appels au modèle, sous la limite de 10 étapes.
Le modèle choisit read_quotes pour voir ce qui est arrivé.
Le code exécute read_quotes() et renvoie trois fichiers.
Résultat ajouté à la mémoire : A $1,240, B $1,180, C $1,315.
Le modèle a ce qu'il lui faut et choisit send_email avec un brouillon de résumé.
Aucune règle de validation, donc le code envoie le brouillon aussitôt. Personne ne l'a vu avant.
Résultat ajouté à la mémoire : message envoyé.
Le modèle renvoie une réponse finale. Cela a marché cette fois, mais un chiffre erroné ou une instruction injectée serait aussi parti sans contrôle.