Agents IA

Votre modèle réfléchit, War3AI exécute

Pour accomplir seul une tâche dans un environnement réel, un agent a besoin de trois choses : des actions faciles à exprimer, un retour lisible et un environnement où l’erreur est sans danger. Nous avons fait de Warcraft III un tel environnement.

Principes de conception

Pourquoi un agent peut réussir seul ici

Pour faire jouer une IA, on simule souvent la souris et le clavier et on analyse l’image ; savoir si l’action a réussi relève alors de la devinette. Nous avons fait l’inverse, en concevant chaque interface à partir de la question « de quoi un modèle a-t-il besoin pour se corriger lui-même ? ».

Dire seulement « quoi faire »

Déplacer, attaquer, construire, lancer un sort… les commandes sémantiques correspondent directement aux actions du joueur ; les unités par leur code à quatre caractères, les sorts par leur nom d’ordre, comme dans le jeu. Le modèle n’a besoin d’aucune connaissance bas niveau.

Un retour structuré pour chaque action

L’accusé de réception est relu dans la même frame : accepté ou non, code de raison, ordre avant et après, durée d’exécution. « Pourquoi ça n’a pas marché » est un nombre, pas une supposition.

Des résultats sans regarder l’écran

L’instantané montre l’état présent, le flux d’événements ce qui s’est passé : chaque coup, chaque élimination, chaque fin de production. L’agent peut vérifier ses propres hypothèses.

La doc, c’est l’interface

api.json est généré depuis le code ; chacune des 103 méthodes indique son statut de test et son mécanisme sous-jacent ; llms.txt permet de lire tout le site d’un coup. Le modèle n’a aucune raison d’inventer des méthodes.

L’échec est sans danger

Si le Bot lève une exception, il reprend au tick suivant ; une commande qui a dépassé son échéance n’est jamais exécutée ; si le processus du Bot plante, le jeu continue. L’agent peut essayer sans crainte.

L’équité dès le premier jour

Le mode équitable ne donne que ce qui est dans le champ de vision, comme la règle de l’arène. Ce que l’agent apprend en local passera sur l’Arène sans changer une ligne.

01 Hors ligne · code

L’agent écrit le Bot

Le moyen le plus rapide de démarrer, sans savoir programmer. Donnez le manuel, api.json et un exemple à Claude Code, Cursor, Codex ou à n’importe quel modèle conversationnel, et décrivez la stratégie avec vos mots. Il écrit un fichier Python qui hérite de openwar3.Bot, lancé en une commande.

  • Le modèle de prompt contient les 15 « règles apprises en vraie partie »
  • Il exige de n’utiliser que les méthodes d’api.json, pour empêcher toute invention
  • Recollez les erreurs telles quelles, décrivez ce que vous voyez, et laissez-le corriger
Modèle de prompt complet
Vous
Humains ; en début de partie, 5 paysans à l’or et 1 au bois ; Archimage en premier ; deux casernes pour des fantassins et des fusiliers ; à 12 soldats, attaquer l’expansion adverse avec le héros ; si les PV du héros passent sous 30 %, repli à la base.

D’accord, je reprends la structure de rush_bot.py et n’utilise que les méthodes d’api.json :

  • Récolte confiée uniquement aux idle_workers(), 5 par mine
  • 1 seule unité en file à la caserne ; nourriture bloquée repérée via production().blocked
  • Attaque avec path_distance pour choisir l’expansion, puis attack_move
  • Héros sous 30 % de PV → move vers la base ; s’il meurt, revive
my_bot.py · 96 lignes
$ python tools/play.py --bot brains/my_bot.py --race 1
02 Hors ligne · boucle fermée

Laissez l’agent itérer seul

Un agent de code capable d’exécuter des commandes peut aussi prendre en charge « jouer une partie, lire le résultat ». Donnez-lui une commande sans surveillance, un rapport de partie structuré et un objectif clair : il itère, tour après tour.

  1. Jouer play.py --speed 200 --minutes 10 --fair
  2. Lire le rapport de partie : chronologie de production, pertes, raisons de rejet les plus fréquentes
  3. Corriger le point qui pèse le plus sur le résultat, en justifiant en commentaire
  4. Rejouer ; après plusieurs parties sans progrès, s’arrêter et faire un rapport
Rapport de partie et modèle de tâche
run_1790237551.json Exemple
{
  "reason": "到时间了",
  "clock": 612.4,
  "timeline": [
    [15, "training", "hpea"],
    [118, "construction", "hbar"],
    [161, "training", "Hamg"],
    [402, "upgrade", "hkee"]
  ],
  "lost":   {"hfoo": 7, "Hamg": 1},
  "killed": {"ogru": 4, "ngno": 6},
  "rejects": [
    ["train hfoo: rejected(人口不够)", 41],
    ["attack ogru: rejected(目标看不见…)", 9]
  ]
}

Le rejet le plus fréquent est « nourriture insuffisante » (41 fois) : la caserne attend constamment de la nourriture. Selon la règle 12, construire une ferme dès que production().blocked apparaît, au lieu d’attendre que la nourriture soit presque au maximum. Cette itération ne change que ce point.

03 En ligne · conseiller

Un LLM comme coach stratégique

« Que faut-il accumuler, où affecter les ouvriers, faut-il attaquer ou temporiser cette minute-ci » — ces jugements globaux de priorités se contredisent dès qu’on les écrit en if / else, mais c’est précisément ce que les LLM font bien. Toutes les 20 secondes de jeu, le cerveau de référence interroge un modèle local et reçoit un JSON strict.

Jamais d’ordres directs aux unités : il ne change que les objectifs et les priorités ; le commandement n’a qu’un seul maître
Asynchrone : ne bloque jamais un tick ; en cas de délai dépassé ou de réponse incohérente, tout se passe comme si cette couche n’existait pas
Liste blanche + bornage : tout contenu inconnu est compté puis ignoré
Tout est compté : succès, délais dépassés, valeurs bornées, conseils adoptés, tout est visible
Couches, contrat et squelette d’implémentation
LLM (conseiller)Toutes les 20 s de jeu · asynchrone
{
  "diagnosis": "Or 820, bois 60 : le bois est le goulot d'étranglement, la caserne est à l'arrêt faute de bois",
  "workers":   {"gold": 10, "lumber": 7},
  "priority":  ["hpea", "hhou", "hfoo"],
  "posture":   "hold",
  "avoid":     ["Ne pas rechercher l'armure de fer tant que le bois manque"]
}
liste blanche + bornage + veto
Couche de règles (à chaque tick)Transforme les conseils en biais

Ouvriers 10 / 7 · priorités d’entraînement hpea → hhou → hfoo · posture hold

Commandes sémantiques
Couche d’exécution (SDK / couche réflexe)~1 frame

Ordres, lecture des accusés, micro

1.09 s de latence médiane · 1.45 s au pire · 5/5 réponses directement analysables
Qwen3.6-35B-A3B en local (LM Studio)
04 En ligne · personnage

Faire parler les unités

N’importe quelle unité, sous n’importe quelle identité, affiche une bulle au-dessus de sa tête ; plusieurs unités peuvent parler en même temps, et le style de chaque bulle se règle séparément. Branchez un LLM local : une phrase entre, la réponse s’affiche en streaming au-dessus de l’unité. Pause-café des paysans, dialogues de héros, commentaire de la partie : tout est prêt à l’emploi.

0.3 s Latence du premier token
32 Bulles simultanées
0.1~0.2 ms Coût par frame
API des bulles et choix du modèle
Roi de la montagne Chargez ! Je finis ma bière et on y va !
Archimage Je m’occupe du Blizzard.
Paysan · Gérard Encore réquisitionné par l’IA pour miner en début de partie, comme données d’entraînement…
POST http://127.0.0.1:8872/api/chat
{
  "inst": 16, "unit": "0x14A12614", "name": "Roi de la montagne",
  "persona": "Vous incarnez le Roi de la montagne, jovial, amateur de bière ; une ou deux phrases parlées",
  "message": "Il y a une bande d'ogres devant, on charge ou pas ?",
  "stream": true
}
→ {"reply": "Chargez ! Je finis ma bière et on y va !",
   "first_token_ms": 283, "total_ms": 342}
05 En ligne · compagnon

Compagnon IA

Dans les cartes RPG et personnalisées, offrez-vous un compagnon IA : il vous suit, combat avec vous, vous soigne quand vos PV sont bas et fait un brin de conversation dans les moments calmes — ses répliques peuvent venir d’un LLM local. Héritez d’une classe, changez quelques attributs, et voilà votre propre compagnon.

À chaque tick, les règles sont testées dans l’ordre ; la première qui s’applique l’emporte

  1. Repli Ses PV sont bas et des ennemis sont proches : il recule derrière vous
  2. Soin Vos PV sont bas et le sort est prêt : il vous soigne
  3. Soutien Il frappe d’abord ce qui vous attaque, puis ce que vous attaquez
  4. Suivi Trop loin, il vous rattrape ; au-delà d’une certaine distance, il revient droit vers vous
  5. Discussion Quand il n’y a pas de combat, il dit quelque chose à intervalles d’une à deux minutes
Allié Occupe un emplacement de joueur libre, avec sa propre couleur et son propre nom
À vous Créé sous votre contrôle ; vous pouvez en prendre le commandement à tout moment
Reprise Prend le contrôle du familier ou du serviteur que la carte vous attribue
Voix seule Ne modifie pas le monde ; fonctionne aussi en multijoueur
Documentation du compagnon RPG
Compagnon · Lumi
Action : vous aide au combat Humeur : enthousiaste Éliminations 12 · soins 5
Vous -follow
Lumi Compris, je vous suis partout !
Vous -heal
Lumi Lumière sacrée ! Je vous soigne !
Lumi Bien joué ! Encore un murloc de moins.

Tapez -follow / -stay / -heal / -hi dans le chat, ou faites un clic droit sur lui

06 En ligne · outils

Un LLM appelle directement des outils

Branchez war3_mcp.py sur un client compatible MCP — Claude Code, Claude Desktop, un framework d’agents pour modèles locaux — et le LLM peut directement observer la partie, donner des ordres, parler au joueur à l’écran, lui poser des questions avec des cartes et prendre des captures d’écran. Pas besoin d’écrire du code d’abord : demandez-lui ce qui vous passe par la tête.

  • 10 outils : la partie en une page, unités, événements, appel de n’importe quelle interface publique, recherche dans l’API, notifications à l’écran, paroles au-dessus des unités, questions au joueur, captures d’écran, JASS
  • Trois rôles : dev, joueur (ne commande qu’un joueur et ne voit que sa vision), observateur (lecture seule)
  • La connexion au jeu n’a lieu qu’au premier appel d’outil ; le jeu peut être lancé après
Documentation MCP
Vous
Regarde où en est la partie, puis demande-moi à l’écran : prochaine étape, expansion, masser des troupes ou monter de tier ?

2 outils appelés :

  • war3_overview → or 500 · nourriture 10/12 · hôtel de ville 1 · paysans 5 · paladin 1
  • war3_ask_player → trois cartes au centre de l’écran, le jeu est en pause pendant le choix
  • Vous avez cliqué sur « Expansion » ; le résultat revient tel quel dans la conversation, et j’enchaîne avec les paysans
$ claude mcp add war3 -- python tools/war3_mcp.py --inst 9
07 Bientôt · en direct

L’agent joue lui-même

L’Arène utilise WebSocket / JSON : à chaque tick, l’arbitre envoie une observation filtrée selon la vision, et le Bot répond par une liste d’actions. N’importe quel langage, n’importe quel modèle — même sans code, avec un LLM qui produit directement du JSON à chaque tick — peut se connecter. La version locale est utilisable dès aujourd’hui : le rôle joueur de la passerelle ne vous laisse commander qu’un seul joueur et ne voir que sa vision ; ce qui manque encore à l’Arène, c’est un arbitre en qui tout le monde a confiance.

  • Ticks cadencés sur le temps de jeu ; le plus lent en pâtit seul, sans ralentir les autres
  • Chaque action est d’abord contrôlée (propriété de l’unité), puis enregistrée pour pouvoir être rejouée
  • Un Bot écrit avec le SDK entre dans l’arène en remplaçant simplement Game par ArenaGame
Conception de l’Arène
{"t": "obs", "tick": 57, "gameMs": 11400, "me": 1,
 "res": {"gold": 320, "lumber": 150, "food": [18, 30]},
 "units": [
   {"id": 101, "type": "hfoo", "owner": 1,
    "x": -4500, "y": 2200, "hp": 380, "hpMax": 420}],
 "visibleEnemies": [
   {"id": 733, "type": "ogru", "owner": 2,
    "x": -3900, "y": 2500, "hp": 700}],
 "deadlineMs": 180}
Uniquement ce qui est dans la vision de cet emplacement ; id est un identifiant stable attribué par l’arbitre, valable toute la partie.
Lisible par les machines

Donnez tout ça à votre agent

Tout est en texte brut ou en JSON, sans connexion ni rendu ; l’agent n’a qu’à le récupérer.

Vous utilisezComment le brancherIdéal pour
Agents de code (Claude Code / Cursor / Codex…)Ouvrez-le dans le dossier du dépôt et faites-lui lire le manuel, api.json et les exemples ; il peut jouer lui-même, lire les rapports et itérerÉcrire des Bots, itération autonome
Modèles conversationnels avec accès webFaites-lui d’abord lire war3ai.com/fr/llms-full.txtÉcrire des Bots
Modèles conversationnels sans accès webCollez le manuel, api.json et un exemple dans le promptÉcrire des Bots
Modèles locaux (LM Studio / Ollama)API compatible OpenAI ; préférez un modèle MoE et désactivez la phase de réflexionConseiller, doublage (sensible à la latence)
API cloud (Claude / GPT / Gemini / DeepSeek…)API compatible OpenAI ou SDK de chaque fournisseur ; la couche conseiller est asynchrone, quelques secondes de latence sont acceptablesConseiller ; à terme, jeu en direct
Clients compatibles MCP (Claude Code / Claude Desktop…)Branchez tools/war3_mcp.py : 10 outils pour observer la partie, donner des ordres, interroger le joueur et prendre des captures d’écranCommander en cours de partie, jouer à vos côtés, commenter
N’importe quel langage / navigateur / autre machinePasserelle WebSocket / JSON : mêmes noms et mêmes paramètres que le SDK Python, avec un client JS et une page de démonstrationVos propres outils et interfaces, Bots à distance

Commencez par une phrase

L’installation prend environ 15 minutes. Le reste, c’est le travail de votre agent.