Lass jeden LLM-Agentselbst KI für Warcraft III entwerfen
War3AI macht das Spiel zu einer API, die für Agents gebaut ist: alle 50 ms der vollständige Zustand der ganzen Karte, semantische Befehle in etwa einem Frame, jeder mit Quittung und Reason-Code. Gib die Docs an Claude, GPT, Gemini, Qwen oder einen beliebigen Agent – er schreibt einen Bot, spielt, liest die Ergebnisse und verbessert sich selbst.
Windows 10/11 · Warcraft III 1.27a · start.bat doppelklicken, der Rest installiert sich selbst
agent-sessioninst 201.272×
Du
Menschen. Fällt der Held unter 40 % HP, zurück zur Basis; nach Einbruch der Nacht mit mindestens 3 Einheiten das nächste Creep-Lager angreifen.
llms.txt und api.json gelesen, night_raider.py erzeugt – nutzt nur 8 verifizierte APIs.
night_raider.pyapi.jsonBOT_HANDBOOK.md
from openwar3 import Botclass NightRaider(Bot): def on_tick(self, g): # ca. 5-mal pro Sekunde halls = g.my_buildings({"htow", "hkee", "hcas"}) army, camps = g.my_army(), g.creeps() if not halls: return home = halls[0] with g.batch(): # alle Befehle dieses Ticks auf einmal senden for h in g.my_heroes(): if h.hp < h.hp_max * 0.4: # Held retten 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) # nachts creepen def on_event(self, g, ev): if ev.kind == "production.done" and ev.owner == g.me(): print("Fertig", ev.done_code, f"{ev.value:.1f}s")
Minimap 21:40 · Nacht
Event-Stream Live
production.donehbar → hfoo · 14.9s
order.changedHamg → attack
damagehfoo → ngno −14 · normal
receiptattack_move ×5 ✓ angenommen · 6 µs
VerbundenSnapshot #18342 · 50 ms12 Befehle in diesem Tick · als ein Batchfair=True
Kompatibel mit jedem Modell und Agent, der Code oder JSON ausgeben kann
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
Push-Intervall für die ganze Karte
Bis 16 ms einstellbar, ein Client liest eine Kopie in ca. 0.4 ms
Die Zahlen stammen aus Live-Messungen auf einer 1.27-Testinstanz (2026-09-23 / 24); Messmethode unter Plattform · Performance.
Workflow
Von einem Satz zu einer KI, die kämpft
Du kannst nicht programmieren? Kein Problem: Du beschreibst, wie sie spielen soll; der Agent schreibt den Code, spielt, prüft die Ergebnisse und bessert nach, bis es passt.
01
Spielweise in Alltagssprache beschreiben
„Menschen, zuerst der Erzmagier; zwei Kasernen für Fußsoldaten und Schützen; bei 12 Einheiten die gegnerische Expansion angreifen; fällt der Held unter 30 % HP, Rückzug.“
02
Agent liest die Docs und schreibt den Bot
Gib ihm llms.txt, api.json und das Handbuch. Die APIs nutzen die Begriffe des Spiels (Rawcodes, Fähigkeitsnamen) – ein Modell versteht sie auf Anhieb.
03
Mit einem Befehl ins Spiel
tools/play.py startet das Spiel, injiziert, eröffnet die Partie und startet den Bot. Geschwindigkeit, Volk, Schwierigkeit und Fair-Modus sind Parameter.
04
Quittungen und Events lesen, selbst korrigieren
Jeder Befehl hat eine Quittung mit Reason-Code; der Event-Stream erfasst jeden Treffer, jeden Kill und jede fertige Produktion. Damit findet der Agent das Problem, ändert den Code und spielt die nächste Partie.
Schritt 2–4 bilden einen geschlossenen Kreislauf: Quittungen und Events sind strukturierte Daten – der Agent muss nicht aufs Bild schauen, um zu wissen, was schiefging.Agent-Selbstiteration
Fähigkeiten
Eine API, gebaut für Agents
Beobachten ohne Wartezeit, Befehle mit Quittung, Ergebnisse als Events – genau das strukturierte, überprüfbare, selbstkorrigierende Feedback, das Modelle brauchen.
Vollständiger Weltzustand, ohne Wartezeit
Ressourcen und Nahrung von 16 Spielern; für bis zu 1024 Einheiten HP/Mana, Order, aktuelles Angriffsziel, Abklingzeiten, Buffs, Inventar; Gegenstände am Boden, Bäume, Produktionswarteschlangen, Tag/Nacht. Die Runtime pusht alles in Shared Memory, eine Kopie liest sich in ca. 0.4 ms.
Bewegen, angreifen, abbauen, bauen, ausbilden, zaubern, Fähigkeiten lernen, wiederbeleben, Gegenstände benutzen, einkaufen … Ob angenommen und falls nicht, warum – das erfährst du im selben Frame.
✓ move ×8 6 µs
✓ build hbar order → hbar
✗ train hfoo 3 · Nahrung fehlt
✗ attack ogru 1001 · nicht sichtbar
Event-Stream
Einheit erscheint / stirbt, Order-Wechsel, Helden-Level-up, Gegenstand erscheint; jeder einzelne Treffer auf Engine-Ebene (Quelle, Angriffstyp, Schaden vor Rüstung) und fertige Produktion – auch die des Gegners.
Batch in einem Frame
Befehle in with g.batch() werden als ein Batch gesendet. Im Test sanken 8 Bewegungsbefehle von 68 ms auf 6.5 ms.
Kampfberechnung & Wegfindung
stats / time_to_kill nutzen die Konter-Tabellen des Spiels und den aktuellen Techstand; path_distance / walk_path laufen A* auf dem Geländeraster der Engine.
Fair-Modus
Nur Einheiten, Gegenstände, Produktion und Events in Sichtweite; last_seen merkt sich Gegner im Nebel. Genau die Regel der Arena.
Docs für Modelle
api.json wird aus dem Code generiert; jede API trägt Teststatus, Latenzstufe und Mechanismus, das Modell muss nicht raten. Mit llms.txt / llms-full.txt liest ein Agent die ganze Website auf einmal.
{"name": "build_near",
"category": "command",
"status": "verified",
"latency": "Schnellspur × Anzahl getesteter Punkte",
"mechanism": "build Punkt für Punkt + Verfolgung (Baus…",
"signature": "build_near(worker, code, x, y, …)",
"doc": "Sucht um (x,y) von nah nach fern einen f…"}
Die Runtime wird ins Originalspiel injiziert, erfasst auf dem Spiel-Thread die ganze Welt, führt Befehle aus und meldet Ergebnisse. Deine KI spricht über ein versioniertes W3P-Protokoll mit ihr – per Python-SDK oder in jeder Sprache, die Shared Memory lesen und schreiben kann.
Dein Agent / Bot
Jedes Modell, jede Sprache
Claude CodeCursorChatGPTQwen lokalPython-BotReferenz-KI
Entscheidung
import openwar3 · oder WebSocket-/JSON-Gateway · MCP
from openwar3 import Botclass FocusFire(Bot): """Fokusfeuer auf den Gegner, der am schnellsten fällt – nicht auf den nächsten; angeschlagene Einheiten zurück nach Hause.""" 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] # berücksichtigt Konter-Tabelle, Rüstung, Angriffs-/Rüstungs-Upgrades und die aktuellen HP des Ziels target = min(foes, key=lambda e: g.time_to_kill(army, e) or 1e9) with g.batch(): # Dutzende Befehle, nur ein Warten auf den Spiel-Thread for u in army: if u.hp < u.hp_max * 0.35: g.move(u, home.x, home.y) # Verwundete zurückziehen elif (t := g.current_target(u)) is None or t.handle != target.handle: g.attack(u, target) # nur Einheiten, die es noch nicht angreifen
Die vollständige, lauffähige Version steht in brains/examples/micro_bot.py (Fokusfeuer, Verwundete zurückziehen, Helden retten, nachts creepen).
Schreib eine KI (Python) für Warcraft III 1.27. Verwende nur die Game-Methoden aus api.json,erfinde keine Methoden, die es nicht gibt. Erbe von openwar3.Bot und implementiere on_start(g) und on_tick(g).Regeln:- on_tick wird etwa 5-mal pro Sekunde aufgerufen und muss schnell sein (kein sleep darin).- Nicht lesbare Werte sind None, nicht 0 – erst prüfen, dann verwenden.- Befehle liefern eine Quittung: `if r:` heißt, die Engine hat angenommen; sonst steht der Grund in r.reason.- Einen bestimmten Gegner greifst du mit g.attack(units, enemy) an; unsichtbare Ziele werden abgelehnt (1001).- Ein toter Held wird mit g.revive(altar) wiederbelebt; ein zweiter kann nicht ausgebildet werden.- Viele Befehle in einem Tick gehören in with g.batch():.Meine gewünschte Spielweise: Menschen; zum Start 5 Bauern auf Gold, 1 auf Holz; zuerst den Erzmagier; zwei Kasernen für Fußsoldaten und Schützen; bei 12 Einheiten mit dem Helden die gegnerische Expansion angreifen; fällt der Held unter 30 % HP, zurück nach Hause.
Die vollständige Vorlage zum Kopieren mit einem Klick findest du auf der Seite „Einen Bot mit einem LLM schreiben“.
>>> r = g.train(barracks, "hfoo")>>> bool(r), r.reason # = nicht genug Nahrung(False, 'rejected(人口不够)')>>> r = g.attack(footmen, grunt_in_fog)>>> r.verdict, r.reason # = Ziel nicht sichtbar (im Nebel / unerforscht)(1001, 'rejected(目标看不见(在迷雾/黑区里))')>>> r = g.move(footmen, 1200, -800)>>> bool(r), r.exec_us # Mikrosekunden auf dem Spiel-Thread(True, 6)>>> g.can_do(altar, "Hamg") # vorher die Engine fragen: 185 = Altar belebt gerade einen Helden wieder185
Die Quittung macht aus „Warum hat es nicht geklappt?“ einen maschinenlesbaren Reason-Code – genau das lässt Agents ihre Fehler selbst beheben.
// Beobachtung, die der Schiedsrichter dem Bot in jedem Tick schickt (nur, was in seiner Sicht liegt){"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}// Aktionen, die der Bot zurückschickt (von jeder Sprache, jedem Modell erzeugbar){"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}]}
Entwurf des WebSocket-/JSON-Protokolls der Arena – LLMs können direkt spielen, ganz ohne Python.
KI-Agents
Sechs Wege, ein LLM an Warcraft anzuschließen
Fünf funktionieren schon heute, einer ist in Arbeit. Sie schließen sich nicht aus: Im selben Spiel kann ein vom Agent geschriebener Bot spielen, ein lokales Modell beraten, ein weiteres Modell den Einheiten eine Stimme geben – und du meldest dich jederzeit in Claude Code zu Wort.
Mehr als Matches – bau deine eigenen Spielideen ins Spiel
Zeichne deine eigene Oberfläche ins Spielbild – die gezeichneten Buttons sind klickbar, Hotkeys reagieren; ruf von außen alle Funktionen auf, die Kartenautoren haben, und hol dir auf RPG-Karten einen KI-Partner an die Seite, der mit dir kämpft; ein ganzes neues Spielprinzip schreibst du als Mod – per Klick gewechselt und einfach geteilt, genau wie KI-Schemata.
Nicht die Prozessgrenze ist langsam, sondern „jede Anfrage wartet auf einen Durchlauf der Message-Pump“ und „ein Lock für die ganze Maschine“. Die Schnellspur gibt jedem Client eine eigene Spur ohne Lock und führt Batches im Event-Dispatch des Spiel-Threads aus.
Befehlsdurchsatz
Vorher 88 3.000 /s
6 Prozesse parallel
Median-Wartezeit bei Parallelität
Vorher 67 ms 0.06 ms
Alter Steuerkanal → Schnellspur
16 Befehle
Vorher 121 ms 13 ms
Einzeln → als Batch
Eine Entscheidungsrunde des Referenz-Brains
Vorher 0.15~0.56 s 0.02~0.07 s
39-Minuten-Spiel, 0 Fehler
Tools
Nicht nur eine API, sondern eine komplette Werkbank
Vom Spielstart über den Blick in die Gedanken der KI bis zu Analyse und Stream-Kommentar – für alles gibt es fertige Tools.
Lokal, im LAN, in selbst gehosteten Spielen. Keine Änderung an der Game.dll auf der Festplatte, keine Weitergabe von Blizzard-Dateien (Spieldaten werden aus deinem eigenen Spiel extrahiert), keine Nutzung auf Battle.net oder Servern mit Anti-Cheat.
Lies https://war3ai.com/de/llms-full.txt und schreib mir mit OpenWar3 einen Bot für die Menschen – zuerst der Erzmagier, nachts mit der Armee creepen, Rückzug, wenn der Held unter 40 % HP fällt.