ИИ-агенты

Ваша модель думает, War3AI исполняет

Чтобы агент сам доводил дело до конца в реальной среде, ему нужны три вещи: чётко сформулированные действия, понятная обратная связь и среда, где не страшно ошибаться. Мы превратили Warcraft III именно в такую среду.

Принципы

Почему агент здесь справляется сам

Обычно, чтобы ИИ играл в игру, имитируют мышь и клавиатуру и распознают картинку — а получилось ли действие, остаётся только гадать. Мы пошли от обратного и спроектировали каждый метод, исходя из того, что нужно модели для самокоррекции.

Только «что сделать»

Движение, атака, строительство, применение способностей… Семантические команды напрямую соответствуют действиям игрока; юниты — четырёхсимвольные коды, способности — строки приказов, как в игре. Никаких низкоуровневых знаний модели не нужно.

Структурированный ответ на каждое действие

Квитанция считывается в том же кадре: принята ли команда, код причины, приказ до и после, время выполнения. «Почему не получилось» — это число, а не догадка.

Результат виден без картинки

Снимок показывает, что происходит сейчас, поток событий — что произошло: каждый удар, каждое убийство, каждое завершение производства. Агент может проверить собственные выводы.

Документация — это и есть API

api.json генерируется из кода: у каждого метода (всего 103) указаны статус проверки и механизм; llms.txt позволяет прочитать весь сайт за раз. У модели нет причин выдумывать методы.

Ошибаться безопасно

Бот бросил исключение — следующий тик идёт как обычно; команды с истёкшим дедлайном не выполняются; упал процесс бота — игра продолжается. Агент может смело экспериментировать.

Честность с первого дня

Честный режим отдаёт только то, что в пределах обзора, — как на Арене. Всё, чему агент научится локально, потом без единой правки заработает на Арене.

01 Офлайн · пишет код

Агент пишет бота

Самый быстрый способ начать — программировать не нужно. Отдайте руководство, api.json и один пример Claude Code, Cursor, Codex или любой чат-модели и простыми словами опишите стиль игры. Модель напишет Python-файл с классом-наследником openwar3.Bot, и он выходит на карту одной командой.

  • В шаблоне промпта уже прописаны 15 «правил, выстраданных в реальных матчах»
  • Требование использовать только методы из api.json исключает выдуманные методы
  • Вставляйте ошибки как есть и описывайте, что видите, — пусть исправляет
Полный шаблон промпта
Вы
Люди. В начале 5 крестьян на золото, 1 на лес; первым героем — Архимаг; две казармы, пехотинцы и стрелки; накопили 12 бойцов — вместе с героем атакуем вторую базу соперника; у героя меньше 30% здоровья — отступает домой.

Хорошо, напишу по структуре rush_bot.py и только методами из api.json:

  • На добычу отправляются только idle_workers(), по 5 на рудник
  • В очереди казармы только 1 юнит; упёрлись в пищу — смотрим production().blocked
  • Вторую базу для атаки выбираем по path_distance и идём туда через attack_move
  • Здоровье героя ниже 30% — move домой; погиб — revive
my_bot.py · 96 строк
$ python tools/play.py --bot brains/my_bot.py --race 1
02 Офлайн · замкнутый цикл

Агент итерирует сам

Coding-агент, который умеет выполнять команды, может взять на себя и «сыграть матч и посмотреть результат». Дайте ему команду, работающую без присмотра, структурированный отчёт о матче и чёткую цель — и он будет улучшать бота круг за кругом.

  1. Запуск play.py --speed 200 --minutes 10 --fair
  2. Чтение отчёта о матче: таймлайн производства, потери, самые частые причины отказа
  3. Правка одного места, которое сильнее всего влияет на результат; обоснование — в комментарии
  4. Повтор; если несколько матчей подряд нет прогресса — остановиться и доложить
Отчёт о матче и шаблон задачи
run_1790237551.json Пример
{
  "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, сразу строим ферму, а не ждём, пока пища почти кончится. В этом круге меняем только это.

03 Онлайн · советник

LLM как стратегический советник

«На что копить, куда ставить рабочих, атаковать или выжидать в эту минуту» — такие решения, требующие взгляда на всю картину и расстановки приоритетов, в виде if / else конфликтуют друг с другом, а LLM справляется с ними отлично. Эталонный мозг каждые 20 игровых секунд спрашивает локальную модель и получает строгий JSON.

Не отдаёт приказы юнитам напрямую: меняет только цели и приоритеты, у управления один хозяин
Асинхронно: никогда не блокирует тик; тайм-аут или бессмысленный ответ — как будто этого слоя нет
Белый список + ограничение значений: всё незнакомое учитывается в счётчике и отбрасывается
Счётчики на всём: успехи, тайм-ауты, ограничения, принятые советы — всё на виду
Слои, контракт и каркас реализации
LLM (советник)каждые 20 игровых секунд · асинхронно
{
  "diagnosis": "Золото 820, древесина 60: узкое место — древесина, казарма простаивает из-за её нехватки",
  "workers":   {"gold": 10, "lumber": 7},
  "priority":  ["hpea", "hhou", "hfoo"],
  "posture":   "hold",
  "avoid":     ["Пока не хватает древесины, не исследовать броню первой"]
}
белый список + ограничение + вето
Слой правил (каждый тик)превращает советы в смещения приоритетов

Рабочие 10 / 7 · приоритет тренировки hpea → hhou → hfoo · линия поведения hold

семантические команды
Слой исполнения (SDK / рефлекторный слой)≈ 1 кадр

приказы, чтение квитанций, микроконтроль

1.09 s медианная задержка · максимум 1.45 s · 5/5 ответов сразу разбираются
локальная Qwen3.6-35B-A3B (LM Studio)
04 Онлайн · роли

Юниты заговорят

Любой юнит от любого имени говорит в облачке над головой, несколько юнитов могут говорить одновременно, а стиль каждого облачка настраивается отдельно. Подключите локальную LLM — фраза на входе, и ответ потоком появляется над юнитом. Посиделки крестьян, диалоги героев, комментарии к ходу боя — всё уже готово.

0.3 s задержка первого токена
32 облачка одновременно
0.1~0.2 ms накладные расходы за кадр
API облачков и выбор модели
Горный король В атаку! Только допью — и в атаку!
Архимаг Сейчас будет снежная буря.
Крестьянин · Дядя Ваня Опять ИИ с самого старта погнал на рудник — ради обучающих данных…
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}
05 Онлайн · напарник

ИИ-компаньон

Возьмите с собой ИИ-напарника в RPG и на пользовательские карты: он ходит за вами, помогает в бою, лечит, когда у вас мало здоровья, а в спокойную минуту перекидывается с вами парой фраз — реплики может писать локальная LLM. Унаследуйте один класс, поменяйте несколько свойств — и у вас свой собственный компаньон.

Каждый тик правила проверяются по порядку — срабатывает первое, чьё условие выполнено

  1. Отступить — сам ранен и рядом враги: уходит к вам за спину
  2. Лечить — у вас мало здоровья и способность готова: подлечивает вас
  3. Помочь в бою — сначала бьёт того, кто атакует вас, потом того, кого атакуете вы
  4. Следовать — если отстал, догоняет; если отошёл слишком далеко, сразу бежит обратно
  5. Болтать — когда боя нет, раз в минуту-две что-нибудь говорит
Союзник Занимает свободный слот игрока, со своим цветом и именем
Свой юнит Создаётся от вашего имени, командование можно взять в любой момент
Захват Берёт под контроль питомцев и спутников, которых вам даёт карта
Только разговор Не меняет мир, работает и в многопользовательской игре
Документация по RPG-компаньону
Компаньон · Светик
Сейчас: помогает в бою Настроение: азарт Убийств 12 · лечений 5
Вы -follow
Светик Понял, иду за тобой!
Вы -heal
Светик Свет небес, исцели!
Светик Отлично! Ещё один мурлок готов.

Введите в чате -follow / -stay / -heal / -hi или щёлкните по нему правой кнопкой

06 Онлайн · инструменты

LLM вызывает инструменты напрямую

Клиенты с поддержкой MCP — Claude Code, Claude Desktop, агентные фреймворки для локальных моделей — подключают war3_mcp.py, и LLM сама смотрит на обстановку, отдаёт команды, пишет игроку на экране, задаёт ему вопросы карточками и делает скриншоты. Писать код заранее не нужно: придумали — поручили.

  • 10 инструментов: обстановка на одной странице, юниты, события, вызов любого публичного метода, поиск по API, подсказка на экране, реплика над юнитом, вопрос игроку, скриншот, JASS
  • Три роли: разработчик, игрок (командует одним игроком и видит только его обзор), наблюдатель (только чтение)
  • К игре сервер подключается только при первом вызове инструмента, так что игру можно запустить и позже
Документация по MCP
Вы
Посмотри, что сейчас на карте, и спроси меня на экране: что дальше — экспансия, армия или улучшение ратуши?

Вызвано 2 инструмента:

  • war3_overview → золото 500 · пища 10/12 · ратуша 1 · крестьяне 5 · паладин 1
  • war3_ask_player → три карточки посреди экрана, пока вы выбираете, игра стоит на паузе
  • Вы выбрали «Экспансию», ответ как есть вернулся в диалог — дальше распределяю крестьян
$ claude mcp add war3 -- python tools/war3_mcp.py --inst 9
07 Скоро · прямая игра

Агент сам выходит на карту

Арена работает по 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 — стабильный номер, который назначает судья, он не меняется весь матч.
Машиночитаемо

Отдайте это своему агенту

Только простой текст или 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 минут. Остальное сделает ваш агент.