Ваша модель думает, War3AI исполняет
Чтобы агент сам доводил дело до конца в реальной среде, ему нужны три вещи: чётко сформулированные действия, понятная обратная связь и среда, где не страшно ошибаться. Мы превратили Warcraft III именно в такую среду.
Почему агент здесь справляется сам
Обычно, чтобы ИИ играл в игру, имитируют мышь и клавиатуру и распознают картинку — а получилось ли действие, остаётся только гадать. Мы пошли от обратного и спроектировали каждый метод, исходя из того, что нужно модели для самокоррекции.
Только «что сделать»
Движение, атака, строительство, применение способностей… Семантические команды напрямую соответствуют действиям игрока; юниты — четырёхсимвольные коды, способности — строки приказов, как в игре. Никаких низкоуровневых знаний модели не нужно.
Структурированный ответ на каждое действие
Квитанция считывается в том же кадре: принята ли команда, код причины, приказ до и после, время выполнения. «Почему не получилось» — это число, а не догадка.
Результат виден без картинки
Снимок показывает, что происходит сейчас, поток событий — что произошло: каждый удар, каждое убийство, каждое завершение производства. Агент может проверить собственные выводы.
Документация — это и есть API
api.json генерируется из кода: у каждого метода (всего 103) указаны статус проверки и механизм; llms.txt позволяет прочитать весь сайт за раз. У модели нет причин выдумывать методы.
Ошибаться безопасно
Бот бросил исключение — следующий тик идёт как обычно; команды с истёкшим дедлайном не выполняются; упал процесс бота — игра продолжается. Агент может смело экспериментировать.
Честность с первого дня
Честный режим отдаёт только то, что в пределах обзора, — как на Арене. Всё, чему агент научится локально, потом без единой правки заработает на Арене.
Агент пишет бота
Самый быстрый способ начать — программировать не нужно. Отдайте руководство, api.json и один пример Claude Code, Cursor, Codex или любой чат-модели и простыми словами опишите стиль игры. Модель напишет Python-файл с классом-наследником openwar3.Bot, и он выходит на карту одной командой.
- В шаблоне промпта уже прописаны 15 «правил, выстраданных в реальных матчах»
- Требование использовать только методы из api.json исключает выдуманные методы
- Вставляйте ошибки как есть и описывайте, что видите, — пусть исправляет
Хорошо, напишу по структуре rush_bot.py и только методами из api.json:
- На добычу отправляются только
idle_workers(), по 5 на рудник - В очереди казармы только 1 юнит; упёрлись в пищу — смотрим
production().blocked - Вторую базу для атаки выбираем по
path_distanceи идём туда черезattack_move - Здоровье героя ниже 30% —
moveдомой; погиб —revive
Агент итерирует сам
Coding-агент, который умеет выполнять команды, может взять на себя и «сыграть матч и посмотреть результат». Дайте ему команду, работающую без присмотра, структурированный отчёт о матче и чёткую цель — и он будет улучшать бота круг за кругом.
- Запуск
play.py --speed 200 --minutes 10 --fair - Чтение отчёта о матче: таймлайн производства, потери, самые частые причины отказа
- Правка одного места, которое сильнее всего влияет на результат; обоснование — в комментарии
- Повтор; если несколько матчей подряд нет прогресса — остановиться и доложить
{
"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]
]
}Чаще всего отказ был «не хватает пищи» — 41 раз, казарма всё время ждала пищу. По правилу 12 — как только видим production().blocked, сразу строим ферму, а не ждём, пока пища почти кончится. В этом круге меняем только это.
LLM как стратегический советник
«На что копить, куда ставить рабочих, атаковать или выжидать в эту минуту» — такие решения, требующие взгляда на всю картину и расстановки приоритетов, в виде if / else конфликтуют друг с другом, а LLM справляется с ними отлично. Эталонный мозг каждые 20 игровых секунд спрашивает локальную модель и получает строгий JSON.
{
"diagnosis": "Золото 820, древесина 60: узкое место — древесина, казарма простаивает из-за её нехватки",
"workers": {"gold": 10, "lumber": 7},
"priority": ["hpea", "hhou", "hfoo"],
"posture": "hold",
"avoid": ["Пока не хватает древесины, не исследовать броню первой"]
}Рабочие 10 / 7 · приоритет тренировки hpea → hhou → hfoo · линия поведения hold
приказы, чтение квитанций, микроконтроль
Юниты заговорят
Любой юнит от любого имени говорит в облачке над головой, несколько юнитов могут говорить одновременно, а стиль каждого облачка настраивается отдельно. Подключите локальную LLM — фраза на входе, и ответ потоком появляется над юнитом. Посиделки крестьян, диалоги героев, комментарии к ходу боя — всё уже готово.
POST http://127.0.0.1:8872/api/chat
{
"inst": 16, "unit": "0x14A12614", "name": "Горный король",
"persona": "Ты играешь Горного короля: прямолинейный, любит выпить, одна-две разговорные фразы",
"message": "Впереди толпа огров. Атакуем или нет?",
"stream": true
}
→ {"reply": "В атаку! Только допью — и в атаку!",
"first_token_ms": 283, "total_ms": 342}ИИ-компаньон
Возьмите с собой ИИ-напарника в RPG и на пользовательские карты: он ходит за вами, помогает в бою, лечит, когда у вас мало здоровья, а в спокойную минуту перекидывается с вами парой фраз — реплики может писать локальная LLM. Унаследуйте один класс, поменяйте несколько свойств — и у вас свой собственный компаньон.
Каждый тик правила проверяются по порядку — срабатывает первое, чьё условие выполнено
- Отступить — сам ранен и рядом враги: уходит к вам за спину
- Лечить — у вас мало здоровья и способность готова: подлечивает вас
- Помочь в бою — сначала бьёт того, кто атакует вас, потом того, кого атакуете вы
- Следовать — если отстал, догоняет; если отошёл слишком далеко, сразу бежит обратно
- Болтать — когда боя нет, раз в минуту-две что-нибудь говорит
Введите в чате -follow / -stay / -heal / -hi или щёлкните по нему правой кнопкой
LLM вызывает инструменты напрямую
Клиенты с поддержкой MCP — Claude Code, Claude Desktop, агентные фреймворки для локальных моделей — подключают war3_mcp.py, и LLM сама смотрит на обстановку, отдаёт команды, пишет игроку на экране, задаёт ему вопросы карточками и делает скриншоты. Писать код заранее не нужно: придумали — поручили.
- 10 инструментов: обстановка на одной странице, юниты, события, вызов любого публичного метода, поиск по API, подсказка на экране, реплика над юнитом, вопрос игроку, скриншот, JASS
- Три роли: разработчик, игрок (командует одним игроком и видит только его обзор), наблюдатель (только чтение)
- К игре сервер подключается только при первом вызове инструмента, так что игру можно запустить и позже
Вызвано 2 инструмента:
war3_overview→ золото 500 · пища 10/12 · ратуша 1 · крестьяне 5 · паладин 1war3_ask_player→ три карточки посреди экрана, пока вы выбираете, игра стоит на паузе- Вы выбрали «Экспансию», ответ как есть вернулся в диалог — дальше распределяю крестьян
Агент сам выходит на карту
Арена работает по WebSocket / JSON: каждый тик судья отправляет наблюдение, отфильтрованное по обзору, а бот возвращает набор действий. Подключиться может любой язык и любая модель — даже без кода, если LLM просто выдаёт JSON каждый тик. Одиночная версия работает уже сегодня: роль игрока в шлюзе позволяет командовать только одним игроком и видеть только его обзор; Арене не хватает лишь судьи, которому доверяют все.
- Тики идут по игровому времени — медленная сторона проигрывает сама и не тормозит других
- У каждого действия сначала проверяется владение юнитом; всё записывается и доступно для повтора
- Боту на SDK достаточно заменить
GameнаArenaGame, чтобы выйти на Арену
{"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 — стабильный номер, который назначает судья, он не меняется весь матч. {"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", параметры называются так же; опоздавший act считается пропуском хода. Отдайте это своему агенту
Только простой текст или JSON — без входа и без рендеринга, агент забирает всё напрямую.
| Что у вас | Как подключить | Для чего |
|---|---|---|
| Claude Code / Cursor / Codex и другие coding-агенты | Откройте в каталоге репозитория и дайте прочитать руководство, api.json и примеры; агент может сам играть матчи, читать отчёты и итерировать | Написание бота, автономные итерации |
| Чат-модель с доступом в интернет | Попросите сначала прочитать war3ai.com/ru/llms-full.txt | Написание бота |
| Чат-модель без доступа в интернет | Вставьте в промпт руководство, api.json и один пример | Написание бота |
| Локальная модель (LM Studio / Ollama) | OpenAI-совместимый API; рекомендуем MoE-модели с выключенным thinking | Советник, озвучка (чувствительны к задержке) |
| Облачный API (Claude / GPT / Gemini / DeepSeek…) | OpenAI-совместимый API или SDK провайдера; слой советника асинхронный, задержка в несколько секунд допустима | Советник; в будущем — прямая игра |
| Клиент с поддержкой MCP (Claude Code / Claude Desktop…) | Подключите tools/war3_mcp.py: 10 инструментов, чтобы смотреть обстановку, отдавать команды, спрашивать игрока, делать скриншоты | Командовать по ходу игры, играть вместе, комментировать |
| Любой язык / браузер / другая машина | Шлюз WebSocket / JSON: те же имена и параметры, что в Python SDK; в комплекте JS-клиент и демо-страница | Свои инструменты и интерфейсы, удалённые боты |
Начните с одной фразы
Настройка окружения занимает около 15 минут. Остальное сделает ваш агент.