# Smaug (2026)
Un bot d'enchères en Python qui a affronté en direct les agents de toute ma classe à l'University of Agder
Smaug est l'agent d'enchères que j'ai développé pour le cours Artificial Intelligence Architecture (IKT110), pendant mon semestre d'échange à l'University of Agder. La consigne : écrire en Python un bot pour un jeu d'enchères tenu par le professeur, puis lui faire affronter en direct les agents de toute la classe, en deux parties de 1000 tours. La note dépend du classement final.
Dans le jeu, un dragon met aux enchères une trentaine de coffres de points chaque seconde. La plus haute mise l'emporte et paie la totalité de son offre, les autres récupèrent la moitié de leur mise ; chaque joueur touche un salaire en or, peut épargner dans une banque qui verse des intérêts, et seuls les points comptent à la fin. Mon agent joue comme un investisseur prudent : il garde son épargne à la banque jusqu'au plafond des intérêts, ignore les enchères qui valent trop peu, mise sur les meilleures le prix du marché récent par point plus une marge, revend quelques points à la banque quand elle les surpaie, et dépense son épargne sur les cent derniers tours, avant la ruée finale.
Chaque réglage a été choisi en mesurant plutôt qu'en devinant. J'ai construit un simulateur sur le moteur de jeu du professeur, qui joue une partie complète en une dizaine de secondes avec le code exact de mon agent, puis lancé un tournoi d'environ 2 300 parties en changeant un réglage à la fois. La bataille m'a aussi montré la limite de l'exercice : une simulation ne vaut que ce que valent ses adversaires, et mes camarades misaient bien plus fort que les agents d'exemple contre lesquels je m'étais entraîné.
Comme un agent qui plante rate des tours, et que le professeur avait prévenu que le serveur enverrait parfois des données piégées, l'agent ne fait jamais confiance à ce qu'il reçoit : chaque champ est vérifié, un tour invalide est sauté, et chaque mise passe par un « airbag » qui la rend valide. Je l'ai testé contre 10 000 messages piégés, des coupures réseau et un processus tué. À côté, un moniteur en terminal construit avec Textual affiche ses signaux en direct (taux de victoire, or perdu, prix du marché) et me permet d'ajuster la marge ou de couper certaines fonctions pendant une partie, via un petit fichier de consignes que l'agent borne avant de l'utiliser.
Côté technique : Python 3.12 et numpy pour l'agent, Textual pour le moniteur, pytest pour 163 tests et GitHub Actions pour les lancer avant chaque fusion.
Le jour J, les parties tournaient à un tour par seconde devant toute la classe, sans seconde chance : un exercice stressant, où chaque décision devait être prise sous pression, sans surréagir. Lors de la première partie, la classe s'est montrée bien plus agressive que mes simulations, et j'ai monté la marge pas à pas. Pour la seconde, je suis parti plus haut et j'ai coupé la vente de points : l'agent a remporté 87 % de ses mises et a terminé 5e sur 20, avec la note B.
J'ai cherché à construire le meilleur bot possible, et ça s'est bien passé. C'était aussi un vrai défi : un très gros projet en Python, réparti entre l'agent, le moniteur et le simulateur, construit en un peu plus de deux semaines au fil de 22 pull requests.