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.
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.
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
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_distancepour choisir l’expansion, puisattack_move - Héros sous 30 % de PV →
movevers la base ; s’il meurt,revive
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.
- Jouer
play.py --speed 200 --minutes 10 --fair - Lire le rapport de partie : chronologie de production, pertes, raisons de rejet les plus fréquentes
- Corriger le point qui pèse le plus sur le résultat, en justifiant en commentaire
- Rejouer ; après plusieurs parties sans progrès, s’arrêter et faire un rapport
{
"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.
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.
{
"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"]
}Ouvriers 10 / 7 · priorités d’entraînement hpea → hhou → hfoo · posture hold
Ordres, lecture des accusés, micro
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.
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}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
- Repli Ses PV sont bas et des ennemis sont proches : il recule derrière vous
- Soin Vos PV sont bas et le sort est prêt : il vous soigne
- Soutien Il frappe d’abord ce qui vous attaque, puis ce que vous attaquez
- Suivi Trop loin, il vous rattrape ; au-delà d’une certaine distance, il revient droit vers vous
- Discussion Quand il n’y a pas de combat, il dit quelque chose à intervalles d’une à deux minutes
Tapez -follow / -stay / -heal / -hi dans le chat, ou faites un clic droit sur lui
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
2 outils appelés :
war3_overview→ or 500 · nourriture 10/12 · hôtel de ville 1 · paysans 5 · paladin 1war3_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
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
GameparArenaGame
{"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} id est un identifiant stable attribué par l’arbitre, valable toute la partie. {"t": "act", "tick": 57, "actions": [
{"do": "attack", "unit": 101, "target": 733},
{"do": "train", "unit": 5, "code": "hfoo"},
{"do": "cast", "unit": 7, "spell": "thunderbolt", "target": 733},
{"do": "move", "unit": 102, "x": -5000, "y": 2000}]} category == "command", avec les mêmes noms de paramètres ; un act en retard compte comme un tick passé. 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 utilisez | Comment le brancher | Idé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 web | Faites-lui d’abord lire war3ai.com/fr/llms-full.txt | Écrire des Bots |
| Modèles conversationnels sans accès web | Collez 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éflexion | Conseiller, 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 acceptables | Conseiller ; à 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’écran | Commander en cours de partie, jouer à vos côtés, commenter |
| N’importe quel langage / navigateur / autre machine | Passerelle WebSocket / JSON : mêmes noms et mêmes paramètres que le SDK Python, avec un client JS et une page de démonstration | Vos 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.