Une IA joue à Pokémon Or : Bobcat, d’une nouvelle partie aux 16 badges
Bobcat n’écrit jamais un mot : il lit un état et renvoie une probabilité par option. Nous avons placé la version coréenne de Pokémon Or derrière un harnais qui se contente d’énoncer des faits et de lister les actions que le jeu permet, donné à Bobcat un guide stratégique, et l’avons laissé faire tous les choix depuis une nouvelle partie. Vingt nouvelles parties sur un même commit, sans rien changer pendant qu’elles tournaient : 17 ont remporté les 16 badges, en 19,3 heures de jeu chacune en médiane. Un deuxième lot sur un autre commit s’est terminé de la même façon, 17 sur 20. Des réponses au hasard sur le même harnais n’ont gagné aucun badge. Une partie de plus a été enregistrée en entier ; les six qui se sont enlisées sont listées, avec leur raison.
Sur cette page
Mise à jour (14 octobre 2026) : notre dernier modèle, Bobcat 1.3, est à égalité pour la troisième place du Jev Decision Index, avec 62,8 contre 60,1 pour Jev (plus bas). Les parties de cet article ont été jouées par une version antérieure, Bobcat 1.1, avec Bobcat Flash 1.1 pour les combats.
Bobcat est un modèle qui n’écrit jamais un mot. À partir d’un état et d’une liste d’options, il renvoie une probabilité par option, et c’est tout ce qu’il sait faire. Nous avons placé la version coréenne de Pokémon Or derrière un harnais qui se contente d’énoncer des faits et de lister les actions que le jeu permet à ce moment-là, nous avons donné à Bobcat un guide stratégique à lire, et nous l’avons laissé faire tous les choix depuis une nouvelle partie : où aller, quoi y faire, chaque capacité de chaque combat, quoi acheter, qui capturer, et quand une étape du guide est terminée.
Nous avons ensuite lancé 20 nouvelles parties en même temps, toutes sur un même commit, sans rien changer pendant qu’elles tournaient. 17 des 20 ont remporté les 16 badges, les huit de Johto et les huit de Kanto, en battant au passage le Conseil 4 et le Maître. Une partie terminée a pris en médiane 19,3 heures selon l’horloge du jeu et environ 5 100 décisions. Nous l’avons fait deux fois, sur deux commits à quelques heures d’écart, et les deux lots se sont terminés à 17 sur 20. Le même harnais, avec des réponses au hasard, n’a gagné aucun badge.
Notre propre objectif était de neuf parties sur dix, et nous n’y sommes pas : les six parties qui se sont enlisées sont listées plus bas, avec la raison de chacune. Après les lots, nous avons lancé trois autres parties sur le commit du deuxième lot et les avons enregistrées image par image ; les trois ont remporté les seize badges, battu Red au Mont Argenté et capturé Ho-Oh. Les vidéos de cet article montrent celle qui a fini la première : 4 887 décisions et 19,9 heures de jeu.

La partie enregistrée en temps forts
8 moments de la partie enregistrée, chacun montrant le tableau de bord tel que Bobcat le voyait, en accéléré (une image enregistrée correspond à une seconde de jeu) : à gauche le jeu, à côté l’état envoyé à Bobcat, puis les options qu’il a le mieux notées avec leurs boutons et leurs probabilités, et le journal de ses choix. D’abord les 25 moments, tous les Champions d’Arène compris, en quatre minutes ; puis 8 d’entre eux, un par un.
À quelle fréquence termine-t-il ?
Un lot, ce sont vingt parties lancées ensemble depuis la même nouvelle partie, dans la chambre après l’introduction, sur un même commit du harnais et du guide. Rien n’est modifié pendant qu’elles tournent, et aucune partie ne reprend depuis une sauvegarde : une partie qui s’enlise est une partie qui n’a pas fini. Chacune s’arrête quand elle remporte son seizième badge. Une partie restée sur une même étape du guide pendant des milliers de décisions sans progresser a été arrêtée et comptée comme enlisée.
| Lot | Commit | Les 16 badges | Heures de jeu pour finir (la plus rapide ; médiane ; la plus lente) |
|---|---|---|---|
| A | 13803fe | 17 sur 20 | 17,1 ; 20,3 ; 26,0 |
| B | 6c233f1 | 17 sur 20 | 17,0 ; 19,3 ; 24,2 |
Au total, cela fait 34 sur 40, soit 85 %. Quarante parties ne suffisent pas à cerner un taux de près : l’intervalle à 95 % va de 71 % à 93 %. Les parties qui n’ont pas fini :
- Lot A, partie 7, à 15 badges : Bobcat a perdu encore et encore contre Blue, le dernier Champion d’Arène, et s’éloignait entre les combats au lieu de s’entraîner. Arrêtée après 4 977 décisions sur cette étape, à 56,6 heures de jeu.
- Lot A, partie 11, à 7 badges : Bobcat a continué de perdre contre Sandra avec un seul Pokémon fort et le reste de l’équipe loin derrière, puis s’est éloigné de son arène. Arrêtée après 3 514 décisions sur cette étape, à 22,1 heures de jeu.
- Lot A, partie 15, à 7 badges : le harnais avait mis de côté les rochers de la Route de Glace comme des panneaux déjà lus, alors qu’il faut réutiliser Force à chaque visite (corrigé avant le lot B). Arrêtée après 3 215 décisions sur cette étape, à 19,9 heures de jeu.
- Lot B, partie 2, à 8 badges : Bobcat n’a pas pu apprendre Cascade à son Léviator, qui connaissait déjà quatre capacités : deux des questions du jeu n’ont pas été lues, et l’apprentissage n’a jamais eu lieu. Arrêtée après 5 677 décisions sur cette étape, à 27,6 heures de jeu.
- Lot B, partie 14, à 7 badges : Bobcat a perdu contre Sandra comme l’une des parties du lot A, avec une équipe loin derrière son Pokémon de départ. Arrêtée après 6 450 décisions sur cette étape, à 25,6 heures de jeu.
- Lot B, partie 20, à 11 badges : Bobcat a pris la Piste Cyclable vers Parmanie sans vélo, et le garde du poste l’a fait rebrousser chemin à chaque fois. Arrêtée après 4 681 décisions sur cette étape, à 24,6 heures de jeu.
Trois des six ont perdu un combat que Bobcat devait gagner : un Champion d’Arène coriace face à une équipe construite autour d’un seul Pokémon. Les trois autres venaient de lacunes du harnais : des rochers qu’il mettait de côté, corrigés entre les lots ; des questions qu’il ne lisait pas ; une route dont il ignorait qu’elle était fermée. Ces deux dernières sont les prochaines corrections ; les combats, c’est à Bobcat de les gagner.
Que fait le harnais, et que ne fait-il pas ?
Un speedrunner appellerait le harnais un vérificateur d’état. Il lit le jeu et dit ce qui est vrai : le dialogue à l’écran, lu dans les pixels d’après la police de la cartouche elle-même ; les menus et la position du curseur ; le lieu et la case, l’argent et les badges ; l’équipe, avec le niveau, les PV et les capacités de chaque Pokémon et les PP restants ; le sac et les cartes du Pokématos ; en combat, les deux Pokémon et nos propres types ; et ce qui a été tenté sans succès (une capacité sans effet, une sortie qui ne menait nulle part, un combat perdu, avec les niveaux de l’équipe). Il liste ce que le jeu permet à cet instant : les sorties vers lesquelles le joueur peut marcher, les personnes et les objets à portée, les panneaux, l’eau et les arbres pour une capacité hors combat que connaît l’équipe, les hautes herbes, la radio du Pokématos là où un Ronflex endormi bloque la route, et en combat les capacités qui ont encore des PP, le changement de Pokémon, les objets de soin, les Poké Balls et la fuite. Chaque option indique les boutons qui l’exécutent (« →5 ↑3 A »), comme un joueur les presserait.
Il ne choisit pas, et il tait ce que le jeu ne montre pas. Les types de l’adversaire ne sont jamais donnés, pas plus que l’efficacité d’une capacité ; Bobcat doit le savoir, ou le lire dans ce que le jeu dit après une capacité. Quand Bobcat choisit une action, le harnais l’exécute mécaniquement : « aller au 2e étage de la Tour Radio », c’est un plus court chemin jusqu’à l’escalier et les pressions de boutons pour le monter.
Que décide Bobcat ?
Dans la partie enregistrée :
- Où aller et quoi faire, en une seule requête avec deux Choix, chaque fois que la situation change (2 245 décisions sur la carte). Le lieu choisi est conservé pour ses quelques décisions suivantes, et chaque sortie indique si elle y mène.
- Chaque tour de combat : quelle capacité, s’il faut changer de Pokémon, soigner, lancer une Poké Ball ou fuir (2 234 décisions).
- Chaque question et chaque menu : oui ou non, quoi acheter, quelle capacité oublier, qui apprend une CS (323 décisions).
- S’il faut capturer un Pokémon sauvage quand le guide dit d’en capturer un, et avec quelle Poké Ball (13 décisions).
- Qui passe en tête, question posée dans un Centre Pokémon quand un membre de l’équipe est loin devant ou loin derrière les autres (30 fois).
- Si une étape du guide est terminée, quand aucun fait enregistré par le jeu ne permet de trancher (41 vérifications).
Pourquoi un guide stratégique, et que contient-il ?
Quelqu’un qui joue pour la première fois à un long jeu lit une soluce : Bobcat en a donc une, un texte en coréen avec un chapitre par nombre de badges, publié exactement tel que les parties l’ont utilisé. Il donne l’ordre de l’histoire, les noms des lieux, l’équipe à capturer (Wattouat sur la Route 32, un Pokémon Eau capable d’apprendre Surf, le Léviator rouge), les types efficaces contre chaque Champion d’Arène et, pour les quelques énigmes du jeu qui n’ont qu’une seule solution (les rochers de la Route de Glace, les interrupteurs du souterrain, les téléporteurs de Safrania), cette solution, vérifiée case par case dans le désassemblage du jeu. Bobcat décide quoi en faire. Le harnais ne tourne la page que sur des faits : un objet nommé par l’étape est dans le sac, un lieu où elle se termine a été atteint, un dresseur qu’elle nomme a été battu, un événement que le jeu enregistre (la pièce de la Centrale rendue, Ronflex affronté, Blue rencontré sur Cramois’Île) est marqué.
Quels choix n’étaient pas ceux de Bobcat ?
Le harnais a des règles fixes, chacune dans le code publié avec son seuil, et chacune comptée dans le journal de la partie. Sur la carte, elles écartent l’action préférée de Bobcat quand elle se répète : une action choisie quatre fois sur cinquante sur une même carte, une sortie qui a échoué deux fois, quelqu’un qui a dit trois fois la même chose ; l’action exécutée est alors l’action restante la plus probable pour Bobcat ou, quand tout a été écarté, celle qui a été faite le moins récemment. Dans la partie enregistrée, 79 % des 2 245 actions sur la carte étaient le premier choix de Bobcat lui-même. Les combats, les questions et les captures sont les réponses de Bobcat. Quelques actions se font sans lui demander : l’introduction, le refus des surnoms, la confirmation d’un achat ou d’un apprentissage choisi par Bobcat, et la sortie d’une boucle de menus que le harnais ne comprend pas.

Comment savoir que ce n’est pas le harnais qui joue ?
Avec chaque Choix tiré au hasard sur le même harnais, au même commit et depuis la même nouvelle partie, la partie n’a gagné aucun badge en 9 517 décisions. Le harnais n’est pas neutre : il se rend à ce qui est choisi et signale les sorties qui mènent vers les lieux du guide, et c’est pour cela que des réponses au hasard arrivent quelque part. La différence entre cela et seize badges, c’est Bobcat. Le harnais enregistre aussi, pour chaque décision, l’état envoyé à Bobcat, chaque option avec sa probabilité et la règle éventuelle qui a écarté son choix : l’affirmation peut donc être vérifiée ligne par ligne.
Comment en est-on arrivé là ?
Le harnais a été écrit pour ce jeu avec Bobcat dans la boucle, et l’essentiel du travail a consisté à trouver ce qu’il lisait mal loin dans une partie : un menu de PC resté ouvert, un écran d’équipe après un K.O., une poche du sac lue à moitié dessinée, une poche d’objets vide prise pour la poche des Poké Balls, une liste de boutique qui ignorait les pressions de bouton brèves, un bateau arrivé alors que le guide disait encore de trouver le capitaine. Chacun n’est apparu qu’après des centaines ou des milliers de décisions. Quand une partie s’enlisait sur l’un d’eux, nous corrigions le harnais et reprenions cette partie depuis sa dernière sauvegarde : c’est ainsi que les premières parties ont atteint seize badges, Red et Ho-Oh. Puis sont venus les lots, vingt nouvelles parties à la fois : les blocages de chaque lot devenaient les corrections du commit suivant, et les modifications des indices du guide étaient essayées avec et sans, depuis les mêmes sauvegardes, avant d’être conservées. Les deux lots ci-dessus sont les deux derniers. Entre les deux, nous avons corrigé une chose révélée par le lot A, les rochers de la Route de Glace, et renommé l’escalier entre Doublonville et son souterrain, que des parties avaient pris pour la salle des interrupteurs.
Où Bobcat est-il faible ?
- Les combats contre un Champion d’Arène coriace avec une équipe déséquilibrée, comme ci-dessus. Dans la partie enregistrée, il a perdu 30 combats et en a gagné 229 contre des dresseurs.
- Il s’appuie sur son Pokémon de départ (la partie enregistrée s’est terminée avec Typhlosion au niveau 93, Togetic au niveau 30, Wattouat au niveau 8, Ramoloss au niveau 10, Léviator au niveau 34 et Ho-Oh au niveau 40) ; quand on lui demande qui doit passer en tête, il garde l’ordre la plupart du temps.
- Les règles antiboucle sont nécessaires : 21,0 % des actions sur la carte de la partie enregistrée ont été fixées par l’une d’elles.
Combien cela a-t-il coûté ?
La partie enregistrée a utilisé 9 015 052 tokens d’entrée sur 4 887 décisions. Elle a tourné pendant 0,9 heures sur une RTX PRO 6000 (96 Go) louée, qu’elle partageait avec les autres parties enregistrées ; à 2,76 $ de l’heure, ce temps coûte 2,37 $. Une partie terminée des lots a utilisé en médiane 9,4 millions de tokens d’entrée ; vingt partagent un même GPU. Tout ce qu’il y a derrière les deux lots, y compris les lots précédents et les tests de chaque correction, a pris 39,8 heures d’un GPU à 4,12 $ de l’heure, soit 164,13 $. Pour donner un ordre de grandeur, les tokens de la partie enregistrée au prix catalogue publié de Jev, 0,042 $ par million de tokens d’entrée, coûteraient 0,38 $ ; c’est un point de repère, pas une mesure de l’un ou l’autre service sur cette charge de travail.
Bobcat depuis ces parties
Les parties ci-dessus ont été jouées par Bobcat 1.1, avec Bobcat Flash 1.1 pour les combats. Notre dernière version, Bobcat 1.3 (11 octobre 2026), ne les a pas jouées. Elle a plutôt été mesurée sur le Jev Decision Index, un classement public de modèles de décision dont le score Full compte pour 80 % les tests privés de ses mainteneurs, et ce sont les mainteneurs qui ont eux-mêmes lancé ces tests. Bobcat 1.3 a obtenu 62,8 et est à égalité pour la troisième place avec Perplexity Decider v1.1 (62,8) et Darwin-27B-ZTC (62,5) : cinquième au score sur 166 entrées, et au-dessus des 60,1 de Jev sur les mêmes cas. Comment il en est arrivé là est raconté dans l’histoire de Bobcat.

Limites
- 85 % des 40 nouvelles parties ont fini, en dessous de notre propre objectif de neuf sur dix, et quarante parties forment un petit échantillon.
- Les vingt parties d’un lot partent de la même nouvelle partie et ne diffèrent que par les petites différences numériques d’un serveur de modèle chargé. Ce ne sont pas vingt joueurs indépendants : les parties jouaient souvent les premiers chapitres de la même façon, et les blocages venaient par types plutôt qu’un par un.
- Les deux commits ont été ajustés sur ce jeu : chaque correction et chaque indice venaient de parties antérieures de ce même jeu. Aucun jeu n’a été mis de côté pour l’évaluation, et un autre jeu demanderait son propre harnais.
- C’est nous qui avons écrit le guide, et il contient les solutions des énigmes fixes du jeu et l’équipe à capturer.
- Les parties enregistrées ont été jouées après les lots, sur le commit du lot B, car les lots n’ont pas été enregistrés ; les vidéos montrent la première d’entre elles à avoir fini.
Le code, le guide et les journaux de décisions se trouvent sur github.com/foxl-ai/bobcat, dans demos/pokemon. Il vous faut votre propre dump de cartouche ; aucune ROM ni aucun élément du jeu n’est publié. Pokémon est une marque de Nintendo, Creatures et GAME FREAK. Il s’agit d’une démo de recherche indépendante, qui n’est ni affiliée à eux ni approuvée par eux, ni par TypeSafe AI. Le modèle est décrit dans Bobcat: Typed Decisions from One Forward Pass (en anglais).
Cet article existe aussi en coréen.
Références et lectures complémentaires
- Code, guide et journaux de décisions (GitHub)Référence
- Poids de Bobcat 1.1, le modèle qui a joué ces partiesRéférence
- Poids de Bobcat Flash 1.1, pour la plupart des capacités en combatRéférence
- Poids de Bobcat 1.3, la dernière versionRéférence
- Classement Jev Decision IndexRéférence
- Continual Harness (arXiv)Référence
- Émulateur PyBoyRéférence
- Désassemblage pret/pokegoldRéférence