Que cualquier agente LLMdiseñe por sí solo la IA de Warcraft III
War3AI convierte el juego en una interfaz pensada para agentes: el estado completo de todo el mapa cada 50 ms y comandos semánticos que se aplican en ~1 fotograma, cada uno con su recibo y su código de motivo. Dale la documentación a Claude, GPT, Gemini, Qwen o cualquier agente: escribirá un Bot, jugará partidas, leerá los resultados y se mejorará solo.
Windows 10/11 · Warcraft III 1.27a · Doble clic en start.bat, el resto se instala solo
agent-sessioninst 201.272×
Tú
Humanos. Si la vida del héroe baja del 40%, que vuelva a casa; de noche, cuando haya 3 unidades, ve al campamento de creeps más cercano.
He leído llms.txt y api.json y he generado night_raider.py, que solo usa 8 interfaces verificadas.
night_raider.pyapi.jsonBOT_HANDBOOK.md
from openwar3 import Botclass NightRaider(Bot): def on_tick(self, g): # unas 5 veces por segundo halls = g.my_buildings({"htow", "hkee", "hcas"}) army, camps = g.my_army(), g.creeps() if not halls: return home = halls[0] with g.batch(): # los comandos de este tick, en un solo envío for h in g.my_heroes(): if h.hp < h.hp_max * 0.4: # salvar al héroe 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 nocturno def on_event(self, g, ev): if ev.kind == "production.done" and ev.owner == g.me(): print("Listo", ev.done_code, f"{ev.value:.1f}s")
Minimapa 21:40 · noche
Flujo de eventos En vivo
production.donehbar → hfoo · 14.9s
order.changedHamg → attack
damagehfoo → ngno −14 · normal
receiptattack_move ×5 ✓ Aceptado · 6 µs
ConectadoSnapshot #18342 · 50 ms12 comandos en este tick · un solo lotefair=True
Compatible con cualquier modelo o agente que escriba código o genere 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
Ciclo de publicación del estado del mapa
Ajustable a 16 ms; el cliente lee una copia en ~0.4 ms
~1 fotograma
Latencia de los comandos
4~8 µs por comando en el hilo del juego
3000 comandos/s
Caudal de comandos
6 procesos concurrentes, espera mediana de 0.06 ms
103
interfaces
98 con la ruta de bajo nivel verificada en partida
1024
unidades con estado completo
Vida y maná, órdenes, a quién ataca, enfriamientos, buffs, inventario
Cifras medidas en partidas reales sobre instancias de prueba 1.27 (2026-09-23 / 24); el método está en Plataforma · Rendimiento.
Flujo de trabajo
De una frase a una IA que sabe combatir
No hace falta saber programar: tú explicas cómo quieres que juegue y el agente escribe el código, juega, mira los resultados y lo corrige hasta que quedes satisfecho.
01
Describe tu estrategia con tus palabras
“Humanos, primero el Archimago; dos cuarteles sacando soldados y fusileros; con 12 unidades, a por la expansión rival; si la vida del héroe baja del 30%, retirada.”
02
El agente lee la documentación y escribe el Bot
Dale llms.txt, api.json y el manual. La interfaz usa la terminología del juego (códigos de cuatro caracteres, nombres de habilidades), así que el modelo la entiende a la primera.
03
Una partida con un solo comando
tools/play.py arranca el juego, inyecta el runtime, inicia la partida y lanza el Bot. Velocidad, raza, dificultad y modo justo son parámetros.
04
Lee recibos y eventos, y corrige
Cada comando tiene su recibo y su código de motivo, y el flujo de eventos registra cada golpe, cada muerte y cada producción. Con eso el agente localiza el problema, cambia el código y juega otra partida.
Los pasos 2 a 4 forman un bucle cerrado: recibos y eventos son datos estructurados, así que el agente sabe qué falló sin mirar la pantalla.Iteración autónoma del agente
Capacidades
Una interfaz pensada para agentes
Observación sin espera, comandos con recibo, resultados en forma de eventos: justo el feedback estructurado, verificable y autocorregible que necesita un modelo.
Estado completo del mundo, sin espera
Recursos y comida de 16 jugadores; vida, maná, órdenes, a quién ataca, enfriamientos, buffs e inventario de hasta 1024 unidades; objetos en el suelo, árboles, colas de producción, día y noche. El runtime lo publica en memoria compartida y leer una copia cuesta ~0.4 ms.
Oro 320 Madera 150 Comida 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 noche
Comandos semánticos, cada uno con recibo
Mover, atacar, recolectar, construir, entrenar, lanzar hechizos, aprender habilidades, revivir, usar objetos, comprar… Si se aceptó y, si no, por qué: lo sabes en el mismo fotograma.
✓ move ×8 6 µs
✓ build hbar order → hbar
✗ train hfoo 3 · sin comida
✗ attack ogru 1001 · no visible
Flujo de eventos
Unidades que aparecen o mueren, cambios de orden, subidas de nivel de héroes, objetos que aparecen; cada golpe a nivel de motor (origen, tipo de ataque, daño antes de armadura) y cada producción completada, también las del rival.
Lotes, en un solo fotograma
Los comandos dentro de with g.batch() se envían como un lote. Medido: 8 movimientos pasan de 68 ms a 6.5 ms.
Cálculo de combate y rutas
stats / time_to_kill usan la tabla de tipos de ataque y armadura del propio juego y la tecnología en tiempo real; path_distance / walk_path ejecutan A* sobre la malla de terreno del motor.
Modo justo
Solo ves las unidades, objetos, producción y eventos dentro de tu visión; last_seen recuerda a los enemigos en la niebla. Es la regla de la Arena.
Documentación pensada para modelos
api.json se genera desde el código y cada interfaz indica su estado de pruebas, su nivel de latencia y su mecanismo de bajo nivel, así que el modelo no tiene que adivinar; con llms.txt / llms-full.txt un agente lee todo el sitio de una vez.
{"name": "build_near",
"category": "command",
"status": "verified",
"latency": "Carril rápido × puntos probados",
"mechanism": "build punto a punto + seguimiento (apare…",
"signature": "build_near(worker, code, x, y, …)",
"doc": "Busca alrededor de (x,y), de cerca a lej…"}
El runtime se inyecta en el juego original y, en el hilo del juego, recoge el mundo entero, ejecuta comandos e informa de los resultados. Tu IA habla con él mediante un protocolo versionado, W3P, con el SDK de Python o con cualquier lenguaje que lea y escriba memoria compartida.
Tu agente / Bot
Cualquier modelo, cualquier lenguaje
Claude CodeCursorChatGPTQwen en localBot en PythonIA de referencia
Decisión
import openwar3 · o pasarela WebSocket / JSON · MCP
OpenWar3 SDK
Python · openwar3
Game / Botsnapshot w3worldcarril rápido w3fastcombat (cálculo de combate)pathing (rutas)w3claim (arbitraje)canvas (lienzo)jass (canal JASS)schemes (esquemas)
Interfaz
Mundo publicado cada 50 ms · comandos en ~1 fotograma · un recibo por comando
Protocolo W3P v2
Memoria compartida · cero copias · versionado
War3WorldWar3EventsWar3MapWar3TreesWar3Fast (carriles de comandos)War3Canvas (lienzo)
Protocolo
Ejecución por lotes en el hilo del juego · 4~8 µs por comando · 4 ms de presupuesto por vaciado
W3 Runtime
Se ejecuta en el hilo del juego
Publicador del estado del mundoFlujo de eventosEjecutor de comandos semánticosConsultasPermisos y perspectivaLienzo propioLlamadas JASSAdaptación de versionesSalud y disyuntores
Runtime
War3.exe 1.27 · juego original, sin modificar ningún archivo en disco
La fachada tiene solo dos clases: Bot marca el ritmo y Game observa y actúa. Las unidades se nombran por código de cuatro caracteres y las habilidades por nombre de orden, igual que en el juego.
Lo que no se puede leer es None, no 0
Un comando acepta una unidad o una lista
Cola con Shift: queue='after'
Recibo aceptado ≠ hecho: el efecto se ve en el snapshot y los eventos
from openwar3 import Botclass FocusFire(Bot): """Concentra el fuego en el enemigo que antes se puede matar, no en el más cercano; los heridos vuelven a casa.""" 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] # tiene en cuenta la tabla de tipos, la armadura, las mejoras de ataque/armadura y la vida actual del objetivo target = min(foes, key=lambda e: g.time_to_kill(army, e) or 1e9) with g.batch(): # decenas de comandos, una sola espera al hilo del juego for u in army: if u.hp < u.hp_max * 0.35: g.move(u, home.x, home.y) # retirar heridos elif (t := g.current_target(u)) is None or t.handle != target.handle: g.attack(u, target) # solo a quien no lo está atacando ya
La versión completa y ejecutable está en brains/examples/micro_bot.py (concentrar fuego, retirar heridos, salvar al héroe, creeping nocturno).
Vas a escribir una IA (en Python) para Warcraft III 1.27. Usa solo los métodos de Game que aparecen en api.json;no inventes métodos que no existan. Hereda de openwar3.Bot e implementa on_start(g) y on_tick(g).Reglas:- on_tick se llama unas 5 veces por segundo y debe ser rápido (nada de sleep dentro).- Los valores que no se pueden leer son None, no 0: compruébalos antes de usarlos.- Los comandos devuelven un recibo: `if r:` significa que el motor lo aceptó; si no, r.reason explica el motivo.- Para atacar a un enemigo concreto usa g.attack(unidades, enemigo); los objetivos no visibles se rechazan (1001).- Si el héroe muere, revívelo con g.revive(altar); no se puede entrenar otro.- Si en un tick hay que dar muchos comandos, envuélvelos en with g.batch():.La estrategia que quiero: Humanos: al empezar, 5 campesinos al oro y 1 a la madera; primero el Archimago; dos cuarteles sacando soldados y fusileros; con 12 unidades, lleva al héroe a atacar la expansión rival; si la vida del héroe baja del 30%, vuelve a casa.
La plantilla completa está en la página “Escribe un Bot con un LLM”, lista para copiar.
>>> r = g.train(barracks, "hfoo")>>> bool(r), r.reason(False, 'rejected(人口不够)') # = comida insuficiente>>> r = g.attack(footmen, grunt_in_fog)>>> r.verdict, r.reason(1001, 'rejected(目标看不见(在迷雾/黑区里))') # = objetivo no visible (en la niebla / máscara negra)>>> r = g.move(footmen, 1200, -800)>>> bool(r), r.exec_us # microsegundos que tardó en el hilo del juego(True, 6)>>> g.can_do(altar, "Hamg") # pregunta al motor antes de ordenar: 185 = el altar está reviviendo a un héroe185
El recibo convierte “por qué no se hizo” en un código de motivo legible por máquina: esa es la clave para que un agente corrija sus propios errores.
// Observación que el árbitro envía al Bot en cada tick (solo lo que está en su visión){"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}// Acciones que devuelve el Bot (cualquier lenguaje o modelo puede generarlas){"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}]}
Borrador del protocolo WebSocket / JSON de la Arena: un LLM puede jugar directamente, sin escribir Python.
Agentes de IA
Seis formas de conectar un LLM a Warcraft
Cinco se pueden usar hoy y una está en desarrollo. No se excluyen: en una misma partida, un Bot escrito por un agente puede ejecutar, un modelo local asesorar y otro modelo poner voz a las unidades, mientras tú intervienes cuando quieras desde Claude Code.
Más allá del combate: crea tu propio modo de juego dentro del juego
Dibuja tu propia interfaz en pantalla, con botones que se pueden pulsar y atajos de teclado que responden; llama desde fuera a todas las funciones que usan los autores de mapas y lleva en los mapas RPG un compañero de IA que juega contigo; escribe un modo de juego nuevo completo como mod y, igual que los esquemas de IA, cámbialo con un clic y compártelo cuando quieras.
Cruzar procesos no es lento en sí; lo lento es “cada petición espera una vuelta del bucle de mensajes” y “un único cerrojo para toda la máquina”. El carril rápido da a cada cliente su propio carril, sin cerrojos, y ejecuta por lotes dentro del despacho de eventos del hilo del juego.
Caudal de comandos
Antes 88 3000 comandos/s
6 procesos concurrentes
Espera mediana con concurrencia
Antes 67 ms 0.06 ms
Canal de control antiguo → carril rápido
16 comandos
Antes 121 ms 13 ms
Uno a uno → en un solo lote
Una ronda del cerebro de referencia
Antes 0.15~0.56 s 0.02~0.07 s
Partida de 39 minutos, 0 errores
Herramientas
No solo una interfaz, todo un banco de trabajo
Desde lanzar una partida y ver qué piensa la IA hasta el análisis posterior y la narración en directo, hay herramientas listas para usar.
Tu equipo, LAN, partidas propias. No modifica Game.dll en disco ni distribuye ningún archivo de Blizzard (los datos del juego se extraen de tu propia copia). No debe usarse en Battle.net ni en ningún servidor con antitrampas.
Lee https://war3ai.com/es/llms-full.txt y luego usa OpenWar3 para escribirme un Bot de Humanos: primero el Archimago, de noche lleva al ejército a hacer creeping y retira al héroe si su vida baja del 40%.