Dein Modell denkt, War3AI setzt es um
Damit ein Agent in einer echten Umgebung selbst etwas erreicht, braucht er drei Dinge: klar formulierbare Aktionen, verständliches Feedback und eine Umgebung, in der Fehler nichts kosten. Genau dazu haben wir Warcraft III umgebaut.
Warum Agents hier selbst ans Ziel kommen
Üblicherweise lässt man eine KI spielen, indem man Maus und Tastatur simuliert und das Bild auswertet – ob etwas geklappt hat, bleibt Raterei. Wir gehen den umgekehrten Weg und entwerfen jede API von der Frage aus, was ein Modell braucht, um sich selbst zu korrigieren.
Nur sagen, was passieren soll
Bewegen, angreifen, bauen, zaubern … Semantische Befehle entsprechen direkt den Aktionen eines Spielers; Einheiten per Rawcode, Fähigkeiten per Order-String, wie im Spiel. Das Modell braucht keinerlei Low-Level-Wissen.
Strukturiertes Feedback für jede Aktion
Die Quittung kommt im selben Frame zurück: angenommen oder nicht, Reason-Code, Order vor und nach dem Befehl, Ausführungszeit. „Warum hat es nicht geklappt?“ ist eine Zahl, keine Vermutung.
Ergebnisse ohne Bildschirm
Der Snapshot zeigt, wie es gerade aussieht, der Event-Stream, was passiert ist: jeder Treffer, jeder Kill, jede fertige Produktion. Der Agent kann seine eigenen Annahmen überprüfen.
Die Docs sind die API
api.json wird aus dem Code generiert, jede der 103 Methoden ist mit Teststatus und Mechanismus versehen; mit llms.txt liest man die ganze Website auf einmal. Das Modell hat keinen Grund, Methoden zu erfinden.
Fehler sind ungefährlich
Wirft der Bot eine Ausnahme, geht es im nächsten Tick weiter; Befehle nach Ablauf ihrer Deadline werden nicht mehr ausgeführt; stürzt der Bot-Prozess ab, läuft das Spiel weiter. Der Agent kann gefahrlos ausprobieren.
Fair vom ersten Tag an
Der Fair-Modus liefert nur, was in Sicht ist – wie die Arena-Regeln. Was ein Agent lokal lernt, funktioniert später auf der Arena ohne eine Zeile Änderung.
Agent schreibt den Bot
Der schnellste Einstieg, ganz ohne Programmierkenntnisse. Gib das Handbuch, api.json und ein Beispiel an Claude Code, Cursor, Codex oder ein beliebiges Chat-Modell und beschreib die Spielweise in Alltagssprache. Heraus kommt eine Python-Datei, die von openwar3.Bot erbt – ein Befehl, und sie spielt.
- Die Prompt-Vorlage enthält die 15 „im Live-Spiel gelernten Regeln“
- Nur Methoden aus api.json erlaubt – nichts wird erfunden
- Fehlermeldungen unverändert zurückgeben, Beobachtungen beschreiben, nachbessern lassen
Gut, ich halte mich an die Struktur von rush_bot.py und nutze nur Methoden aus api.json:
- Abbauen nur mit
idle_workers(), 5 pro Mine - Kasernen-Warteschlange nur 1, Nahrungsengpass über
production().blocked - Angriffsziel per
path_distancewählen, perattack_movezur Expansion - Held unter 30 % HP per
movenach Hause, tot perrevivezurück
Lass den Agent selbst iterieren
Ein Coding Agent, der Befehle ausführen kann, übernimmt auch „Spiel starten, Ergebnis prüfen“. Gib ihm einen unbeaufsichtigten Befehl, einen strukturierten Spielbericht und ein klares Ziel – dann verbessert er Runde um Runde.
- Starten
play.py --speed 200 --minutes 10 --fair - Lesen Spielbericht: Produktions-Timeline, Verluste, häufigste Ablehnungsgründe
- Ändern die Stelle mit der größten Wirkung, Begründung im Kommentar
- Wiederholen und nach mehreren Runden ohne Fortschritt anhalten und berichten
{
"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]
]
}Am häufigsten abgelehnt: „nicht genug Nahrung“, 41-mal – die Kaserne wartet ständig auf Nahrung. Nach Regel 12: Sobald production().blocked auftaucht, sofort eine Farm bauen, statt zu warten, bis die Nahrung fast voll ist. In dieser Runde ändere ich nur diese eine Stelle.
LLM als Strategie-Coach
„Was ansparen, wohin mit den Arbeitern, in dieser Minute angreifen oder abwarten?“ – solche Urteile mit Blick aufs Ganze und klaren Prioritäten widersprechen sich als if / else ständig, sind aber genau die Stärke von LLMs. Das Referenz-Brain fragt alle 20 Spielsekunden ein lokales Modell und bekommt striktes JSON zurück.
{
"diagnosis": "Gold 820, Holz 60 – Holz ist der Engpass, die Kaserne steht mangels Holz still",
"workers": {"gold": 10, "lumber": 7},
"priority": ["hpea", "hhou", "hfoo"],
"posture": "hold",
"avoid": ["Bei Holzmangel nicht zuerst Rüstung erforschen"]
}Arbeiterverteilung 10 / 7 · Ausbildungspriorität hpea → hhou → hfoo · Haltung hold
Befehle erteilen, Quittungen lesen, Mikro
Einheiten zum Sprechen bringen
Jede Einheit, jede Rolle – Sprechblasen über dem Kopf, mehrere Einheiten gleichzeitig, jede Blase individuell gestaltbar. Mit einem lokalen LLM geht ein Satz rein, und die Antwort erscheint gestreamt über der Einheit. Bauern-Kaffeeklatsch, Heldendialoge und Kampfkommentar sind fertig eingebaut.
POST http://127.0.0.1:8872/api/chat
{
"inst": 16, "unit": "0x14A12614", "name": "Bergkönig",
"persona": "Du spielst den Bergkönig: rau, herzlich, trinkfest, ein, zwei Sätze Umgangssprache",
"message": "Da vorne ist ein Haufen Oger. Greifen wir an?",
"stream": true
}
→ {"reply": "Angriff! Nur noch diesen Schluck, dann los!",
"first_token_ms": 283, "total_ms": 342}KI-Begleiter
Hol dir auf RPG- und Custom Maps einen KI-Partner an die Seite: Er folgt dir, hilft beim Kämpfen, heilt dich, wenn du angeschlagen bist, und plaudert mit dir, wenn gerade nichts los ist – die Sätze können von einem lokalen LLM kommen. Eine Klasse erben, ein paar Attribute ändern – schon ist es dein eigener Begleiter.
In jedem Tick der Reihe nach geprüft – was zutrifft, wird ausgeführt
- Rückzug selbst angeschlagen und Gegner in der Nähe: hinter dich zurückziehen
- Heilen deine HP sind niedrig und die Fähigkeit ist bereit: einmal heilen
- Mitkämpfen zuerst, wer dich angreift, dann, wen du angreifst
- Folgen zu weit weg: aufschließen; sehr weit weg: direkt zurücklaufen
- Plaudern wenn kein Kampf läuft, alle ein, zwei Minuten ein Satz
Im Chat -follow / -stay / -heal / -hi eingeben oder ihn per Rechtsklick ansprechen
LLM ruft Tools direkt auf
MCP-fähige Clients – Claude Code, Claude Desktop, Agent-Frameworks für lokale Modelle – binden war3_mcp.py ein, und schon kann das LLM direkt die Lage sehen, Befehle erteilen, auf dem Bildschirm mit dem Spieler sprechen, ihm Karten zur Auswahl zeigen und Screenshots ansehen. Ohne vorher Code zu schreiben – was dir einfällt, erledigt es.
- 10 Tools: Lage auf einer Seite, Einheiten, Events, beliebige öffentliche API aufrufen, APIs nachschlagen, Bildschirmhinweis, über dem Kopf sprechen, Spieler fragen, Screenshot, JASS
- Drei Rollen: Entwickler, Spieler (befehligt nur einen Spieler, sieht nur dessen Sicht), Zuschauer (nur lesen)
- Verbindet sich erst beim ersten Tool-Aufruf mit dem Spiel – das Spiel kann also später starten
2 Tools aufgerufen:
war3_overview→ Gold 500 · Nahrung 10/12 · Hauptgebäude 1 · Bauern 5 · Paladin 1war3_ask_player→ drei Karten in der Bildschirmmitte, das Spiel pausiert während der Wahl- Du hast „Expandieren“ angeklickt; das Ergebnis kommt unverändert zurück ins Gespräch, und ich schicke die Bauern los
Agent spielt selbst
Die Arena nutzt WebSocket / JSON: Der Schiedsrichter schickt in jedem Tick eine nach Sicht gefilterte Beobachtung, der Bot antwortet mit einer Liste von Aktionen. Jede Sprache, jedes Modell – sogar ganz ohne Code, indem ein LLM Tick für Tick JSON ausgibt – kann teilnehmen. Lokal geht das schon heute: Die Spielerrolle des Gateways lässt dich nur einen Spieler befehligen und nur dessen Sicht sehen; was der Arena noch fehlt, ist ein Schiedsrichter, dem alle vertrauen.
- Takt nach Spielzeit – wer langsam ist, schadet nur sich selbst, nicht den anderen
- Jede Aktion wird zuerst auf Einheitenbesitz geprüft und für Replays aufgezeichnet
- Ein SDK-Bot ersetzt einfach
GamedurchArenaGameund ist startklar
{"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 ist eine vom Schiedsrichter vergebene Nummer, die das ganze Spiel über gleich bleibt. {"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" in api.json, mit gleichnamigen Parametern; ein verspätetes act zählt als ausgesetzter Tick. Gib das deinem Agent
Alles reiner Text oder JSON, kein Login, kein Rendering – ein Agent kann es direkt abrufen.
| Du nutzt | Anbindung | Geeignet für |
|---|---|---|
| Coding Agents wie Claude Code / Cursor / Codex | Im Repo-Verzeichnis öffnen und Handbuch, api.json und Beispiele lesen lassen; kann selbst spielen, Berichte lesen und iterieren | Bot schreiben, autonom iterieren |
| Chat-Modell mit Internetzugang | Lass es zuerst war3ai.com/de/llms-full.txt lesen | Bot schreiben |
| Chat-Modell ohne Internetzugang | Handbuch, api.json und ein Beispiel in den Prompt kopieren | Bot schreiben |
| Lokales Modell (LM Studio / Ollama) | OpenAI-kompatible API; MoE-Modell empfohlen, Thinking abschalten | Coach, Einheiten-Dialoge (latenzkritisch) |
| Cloud-API (Claude / GPT / Gemini / DeepSeek …) | OpenAI-kompatibel oder das jeweilige SDK; die Coach-Schicht ist asynchron, ein paar Sekunden Latenz sind okay | Coach; später direkt spielen |
| MCP-fähige Clients (Claude Code / Claude Desktop …) | tools/war3_mcp.py einbinden: 10 Tools, um direkt die Lage zu sehen, Befehle zu erteilen, den Spieler zu fragen, Screenshots zu machen | Beim Spielen anleiten, Mitspieler, Kommentar |
| Jede Sprache / Browser / anderer Rechner | WebSocket-/JSON-Gateway: gleiche Namen und Parameter wie das Python-SDK, mit JS-Client und Demoseite | Eigene Tools und Oberflächen, Remote-Bots |
Fang mit einem Satz an
Die Einrichtung dauert etwa 15 Minuten. Den Rest übernimmt dein Agent.