Laissez n’importe quel agent LLMconcevoir seul l’IA de Warcraft III
War3AI transforme le jeu en interface pensée pour les agents : l’état complet de la carte poussé toutes les 50 ms, des commandes sémantiques appliquées en environ une frame, chacune avec un accusé de réception et un code de raison. Confiez la doc à Claude, GPT, Gemini, Qwen ou à n’importe quel agent — il écrira un Bot, jouera des parties, lira les résultats et s’améliorera seul.
Windows 10/11 · Warcraft III 1.27a · Double-cliquez sur start.bat, le reste s'installe tout seul
agent-sessioninst 201.272×
Vous
Humains. Si les PV du héros passent sous 40 %, repli à la base ; à la nuit tombée, dès qu’il y a 3 soldats, attaquer le camp de creeps le plus proche.
J’ai lu llms.txt et api.json, puis généré night_raider.py, qui n’utilise que 8 interfaces vérifiées.
night_raider.pyapi.jsonBOT_HANDBOOK.md
from openwar3 import Botclass NightRaider(Bot): def on_tick(self, g): # environ 5 fois par seconde halls = g.my_buildings({"htow", "hkee", "hcas"}) army, camps = g.my_army(), g.creeps() if not halls: return home = halls[0] with g.batch(): # les commandes du tick partent en une fois for h in g.my_heroes(): if h.hp < h.hp_max * 0.4: # survie du héros g.move(h, home.x, home.y) if g.is_night() and len(army) >= 3 and camps: camp = min(camps, key=lambda c: g.path_distance(home, c) or 1e9) g.attack_move(army, camp.x, camp.y) # creeping de nuit def on_event(self, g, ev): if ev.kind == "production.done" and ev.owner == g.me(): print("Terminé", ev.done_code, f"{ev.value:.1f}s")
Minicarte 21:40 · nuit
Flux d’événements En direct
production.donehbar → hfoo · 14.9s
order.changedHamg → attack
damagehfoo → ngno −14 · normal
receiptattack_move ×5 ✓ Accepté · 6 µs
ConnectéInstantané #18342 · 50 ms12 commandes ce tick · envoyées en un lotfair=True
Compatible avec tout modèle ou agent capable d’écrire du code ou de produire du JSON
Claude GPT Gemini DeepSeek Qwen Kimi GLM Llama Claude Code Cursor Codex LM Studio Ollama Claude GPT Gemini DeepSeek Qwen Kimi GLM Llama Claude Code Cursor Codex LM Studio Ollama
50 ms
Période de publication de l’état complet
Réglable jusqu’à 16 ms ; environ 0.4 ms pour lire une copie côté client
~1 frame
Application d’une commande
4~8 µs par commande sur le thread du jeu
3 000 cmd/s
Débit de commandes
6 processus en parallèle, attente médiane de 0.06 ms
103
interfaces
98 avec chemin bas niveau vérifié en jeu
1 024
unités, état complet
PV et mana, ordres, cible attaquée, temps de recharge, buffs, inventaire
Chiffres mesurés en jeu sur des instances de test 1.27 (2026-09-23 / 24) ; méthode de mesure dans Plateforme · Performances.
Flux de travail
D’une phrase à une IA qui sait se battre
Pas besoin de savoir programmer : vous expliquez clairement comment elle doit jouer ; l’agent écrit le code, joue, analyse les résultats et corrige jusqu’à ce que vous soyez satisfait.
01
Décrivez la stratégie avec vos mots
« Humains, Archimage en premier ; deux casernes pour des fantassins et des fusiliers ; à 12 soldats, attaquer l’expansion adverse ; repli du héros sous 30 % de PV. »
02
L’agent lit la doc et écrit le Bot
Donnez-lui llms.txt, api.json et le manuel. L’interface utilise les noms du jeu (codes à quatre caractères, noms de sorts) : le modèle comprend tout de suite.
03
Une commande pour jouer une partie
tools/play.py lance le jeu, injecte le runtime, démarre la partie et lance le Bot. Vitesse, race, difficulté et mode équitable sont des paramètres.
04
Lire accusés et événements, puis corriger
Chaque commande a un accusé de réception et un code de raison ; le flux d’événements enregistre chaque coup, chaque élimination et chaque production. L’agent s’en sert pour localiser le problème, corriger le code et rejouer.
Les étapes 2 à 4 forment une boucle fermée : accusés et événements sont des données structurées, l’agent sait ce qui ne va pas sans regarder l’écran.Itération autonome de l’agent
Capacités
Une interface conçue pour les agents
Observation sans attente, commandes avec accusé de réception, résultats sous forme d’événements — exactement le retour structuré, vérifiable et propice à l’autocorrection dont un modèle a besoin.
État complet du monde, sans attente
Ressources et nourriture de 16 joueurs ; pour jusqu’à 1024 unités, PV et mana, ordres, cible attaquée, temps de recharge, buffs, inventaire ; objets au sol, arbres, files de production, jour/nuit. Le runtime pousse tout en mémoire partagée ; lire une copie prend environ 0.4 ms.
Or 320 Bois 150 Nourriture 18/30
units 112 · items 3 · prods 2
unithpordertargetcd
Hamg · Lv3attackngno#2AHbz 3.2s
hfoomove——
hrifattackngno#2—
hbartrainhfoo 62%—
snapshot #18,342clock 253.4s · 21:40 nuit
Commandes sémantiques, chacune avec accusé
Déplacer, attaquer, récolter, construire, entraîner, lancer un sort, apprendre une compétence, ressusciter, utiliser un objet, acheter… Acceptée ou non, et pourquoi — vous le savez dans la même frame.
✓ move ×8 6 µs
✓ build hbar order → hbar
✗ train hfoo 3 · nourriture insuffisante
✗ attack ogru 1001 · invisible
Flux d’événements
Apparition / mort des unités, changements d’ordre, montées de niveau des héros, apparition d’objets ; chaque coup au niveau du moteur (source, type d’attaque, dégâts avant armure) et chaque fin de production, adversaire compris.
Par lots, exécutés en une frame
Les commandes d’un with g.batch() partent en un seul lot. En test, 8 déplacements passent de 68 ms à 6.5 ms.
Calculs de combat et recherche de chemin
stats / time_to_kill utilisent la table des contres du jeu et les technologies en temps réel ; path_distance / walk_path lancent un A* sur la grille de terrain du moteur.
Mode équitable
Seuls les unités, objets, productions et événements dans le champ de vision sont visibles ; last_seen garde en mémoire les ennemis passés dans le brouillard. C’est la règle de l’arène.
Une doc pensée pour les modèles
api.json est généré depuis le code ; chaque interface indique son statut de test, son niveau de latence et son mécanisme sous-jacent, le modèle n’a rien à deviner. llms.txt / llms-full.txt permettent à un agent de lire tout le site d’un coup.
{"name": "build_near",
"category": "command",
"status": "verified",
"latency": "Voie rapide × nombre de points essayés",
"mechanism": "build point par point + suivi (fondation…",
"signature": "build_near(worker, code, x, y, …)",
"doc": "Cherche autour de (x,y), du plus proche …"}
Le runtime est injecté dans le jeu d’origine ; sur le thread du jeu, il capture le monde entier, exécute les commandes et renvoie les résultats. Votre IA dialogue avec lui via un protocole W3P versionné — avec le SDK Python, ou dans tout langage capable de lire et d’écrire la mémoire partagée.
Votre agent / Bot
N’importe quel modèle, n’importe quel langage
Claude CodeCursorChatGPTQwen en localBot PythonIA de référence
Décision
import openwar3 · ou passerelle WebSocket / JSON · MCP
SDK OpenWar3
Python · openwar3
Game / Botinstantanés w3worldvoie rapide w3fastcombat · calculs de combatpathing · recherche de cheminw3claim · arbitragecanvas · canevasjass · canal JASSschemes · schémas d’IA
Interface
État du monde poussé toutes les 50 ms · commandes appliquées en ~1 frame · accusé de réception pour chacune
Protocole W3P v2
Mémoire partagée · zéro copie · versionné
War3WorldWar3EventsWar3MapWar3TreesWar3Fast · voie de commandesWar3Canvas · canevas
Protocole
Exécution par lots sur le thread du jeu · 4~8 µs par commande · budget de 4 ms par vidage
W3 Runtime
S’exécute sur le thread du jeu
publication de l’état du mondeflux d’événementsexécution des commandes sémantiquesrequêtespermissions et points de vuecanevas dessiné par le runtimeappels JASScompatibilité des versionssanté et disjoncteurs
Runtime
War3.exe 1.27 · jeu d’origine, aucun fichier modifié sur le disque
La façade ne compte que deux classes : Bot donne le rythme, Game observe et agit. Les unités par leur code à quatre caractères, les sorts par leur nom d’ordre, comme dans le jeu.
Une valeur illisible vaut None, pas 0
Une commande accepte une unité ou une liste
File Shift : queue='after'
Accepté ≠ réussi : jugez l’effet d’après l’instantané et les événements
from openwar3 import Botclass FocusFire(Bot): """Focus sur l'ennemi « le plus vite tuable » plutôt que le plus proche ; les blessés rentrent à la base.""" def on_tick(self, g): army, halls = g.my_army(), g.my_buildings() foes = [e for e in g.enemies(fighters_only=True) if e.visible_to(g.me())] if not army or not foes or not halls: return home = halls[0] # tient compte de la table des contres, de l'armure, des améliorations et des PV actuels de la cible target = min(foes, key=lambda e: g.time_to_kill(army, e) or 1e9) with g.batch(): # des dizaines de commandes, une seule attente du thread du jeu for u in army: if u.hp < u.hp_max * 0.35: g.move(u, home.x, home.y) # retrait des blessés elif (t := g.current_target(u)) is None or t.handle != target.handle: g.attack(u, target) # ordre seulement à ceux qui ne l'attaquent pas déjà
Version complète et exécutable dans brains/examples/micro_bot.py (focus, retrait des blessés, survie du héros, creeping de nuit).
Vous allez écrire une IA (Python) pour Warcraft III 1.27. Utilisez uniquement les méthodes de Game listées dans api.json,n'inventez pas de méthodes qui n'existent pas. Héritez de openwar3.Bot et implémentez on_start(g) et on_tick(g).Règles :- on_tick est appelé environ 5 fois par seconde et doit être rapide (pas de sleep dedans).- Une valeur illisible vaut None, pas 0 : vérifiez-la avant de l'utiliser.- Les commandes renvoient un accusé de réception : `if r:` signifie que le moteur a accepté ; sinon, r.reason donne la raison.- Pour attaquer un ennemi précis, utilisez g.attack(soldats, ennemi) ; une cible invisible est rejetée (1001).- Un héros mort se ressuscite avec g.revive(autel) ; impossible d'en entraîner un autre.- Quand un tick envoie beaucoup de commandes, regroupez-les dans with g.batch():.La stratégie que je veux : 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.
Le modèle complet se trouve sur la page « Écrire un Bot avec un LLM », à copier en un clic.
>>> r = g.train(barracks, "hfoo")>>> bool(r), r.reason(False, 'rejected(人口不够)')>>> r = g.attack(footmen, grunt_in_fog)>>> r.verdict, r.reason(1001, 'rejected(目标看不见(在迷雾/黑区里))')>>> r = g.move(footmen, 1200, -800)>>> bool(r), r.exec_us # durée de cette commande sur le thread du jeu, en µs(True, 6)>>> g.can_do(altar, "Hamg") # demander au moteur avant l'ordre : 185 = l'autel ressuscite un héros185
L’accusé de réception transforme le « pourquoi ça n’a pas marché » en code de raison lisible par une machine — c’est ce qui permet à un agent de corriger ses erreurs seul.
// Observation envoyée au Bot par l'arbitre à chaque tick (uniquement ce qui est dans sa vision){"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}// Actions renvoyées par le Bot (n'importe quel langage, n'importe quel modèle peut les produire){"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}]}
Brouillon du protocole WebSocket / JSON de l’Arène — un LLM peut jouer directement, sans écrire de Python.
Agents IA
Six façons de brancher un LLM sur Warcraft
Cinq sont utilisables dès aujourd’hui, une est en cours. Elles ne s’excluent pas : dans une même partie, un Bot écrit par un agent peut jouer, un modèle local conseiller, un autre modèle doubler les unités, et vous pouvez glisser une consigne à tout moment depuis Claude Code.
Au-delà des matchs : créez votre propre gameplay dans le jeu
Dessinez votre propre interface à l’écran, avec des boutons cliquables et des raccourcis clavier qui répondent ; appelez de l’extérieur toutes les fonctions des créateurs de cartes, emmenez dans les cartes RPG un compagnon IA qui se bat à vos côtés ; écrivez tout un nouveau gameplay sous forme de mod, à changer en un clic et à partager librement, comme un schéma d’IA.
Passer d’un processus à l’autre n’est pas lent en soi ; ce qui l’est, c’est « une requête = une attente de la pompe à messages » et « un seul verrou pour toute la machine ». La voie rapide donne à chaque client sa propre voie, sans verrou, et exécute les commandes par lots dans la distribution des événements du thread du jeu.
Débit de commandes
Avant 88 3 000 cmd/s
6 processus en parallèle
Attente médiane en parallèle
Avant 67 ms 0.06 ms
ancien canal de contrôle → voie rapide
16 commandes
Avant 121 ms 13 ms
une par une → un seul lot
Un cycle de décision du cerveau de référence
Avant 0.15~0.56 s 0.02~0.07 s
partie complète de 39 minutes, 0 erreur
Outils
Plus qu’une API, un atelier complet
Lancer une partie, voir ce que pense l’IA, analyser après coup, commenter en direct — chaque étape a son outil prêt à l’emploi.
Uniquement avec un client que vous possédez légalement
En local, en réseau local, dans des parties que vous hébergez. Aucune modification du Game.dll sur le disque, aucun fichier de Blizzard distribué (les données sont extraites de votre propre jeu), interdit sur Battle.net et sur tout serveur doté d’un anti-triche.
Lisez https://war3ai.com/fr/llms-full.txt, puis écrivez-moi un Bot Humains avec OpenWar3 : Archimage en premier, creeping de nuit avec l’armée, repli du héros sous 40 % de PV.