JEV Arena — файтинг-арена для моделей, которые принимают решения
📂 Исходный код на GitHubОткрытая файтинг-арена для моделей принятия решений: настраиваемые бойцы, парные турниры и 420 проверенных реплеев. Работает офлайн на встроенных ботах, запускается по готовому промпту кодинг-агентом.
JEV Arena — это self-hosted файтинг для языковых моделей. Вы пишете бойцу стратегию, выбираете модель — и смотрите, какие ходы она выбирает в бою. Движок симуляции детерминированный: любой бой можно повторить по реплею и получить тот же результат. В репозиторий уже упакован турнир @arenaraw — 21 модель и 420 боёв, которые можно смотреть без API-ключей. Встроенные аркадные и случайные боты работают полностью офлайн.
Это проект RawModels — арена для decision-моделей, то есть моделей, которые не пишут длинные ответы, а выбирают один вариант из списка. Мы уже писали про экосистему вокруг Jev: Jevlike и Jeff. JEV Arena — официальная арена, где такие модели встречаются друг с другом в бою.
Как это устроено
Боец — это конфиг: имя, персонаж, стратегия на естественном языке, финальные инструкции и «мысленные сообщения». Ходом управляет модель: она получает состояние боя и выбирает один из вариантов действий. За симуляцию, наблюдения, «ментальные атаки», формат реплеев и рейтинги отвечает src/core/, за реестр моделей и лимиты запросов — src/providers/. Интерфейс на React показывает таблицу лидеров, конструктор бойцов, плеер реплеев и спрайты пяти персонажей: Leather Jacket, Ship-It Sam, Search Goblin, Safety Monk и Metaverse Lizard.
Запуск локально
Нужен Node.js 22.12 или новее, рекомендуется 24.
git clone https://github.com/rawmodels/jevarena.git
cd jevarena
npm ci
npm run dev
Приложение откроется на http://127.0.0.1:3100. На вкладке Models лежит датированный бенчмарк с записанными боями. Во вкладке Build a fighter можно сохранить своего бойца, а затем выбрать двух бойцов в Start a fight. Для боя без ключей подойдут боты Arcade CPU и Button Masher.
Это локальное рабочее место для экспериментов: ники здесь просто имена конфигов, а не аккаунты. Хостинговые аккаунты RawModels, платежи и почтовые уведомления в это приложение не входят.
Готовый промпт для кодинг-агента
В репозитории есть раздел Run it with an agent — готовый промпт, который можно скопировать в любой кодинг-агент. Рядом лежит AGENTS.md с инструкциями по репозиторию. Промпт описывает весь путь: клонировать репозиторий, проверить версию Node, поставить зависимости из lockfile без API-ключей, прогнать все проверки, запустить турнирный CLI на встроенных ботах и убедиться, что resume не дублирует результаты, поднять прод-сервер и проверить результат.
Отдельно хороша концовка промпта — там стоят проверяемые критерии приёмки. Агент должен убедиться, что приложение отвечает HTTP 200, что в /api/state ровно 21 модель и 420 матчей, что спрайты всех пяти персонажей загружаются. Если браузерных инструментов нет, агент обязан сказать об этом явно. И прямое запрещение: не считать задачу выполненной на основании одной лишь успешной сборки. Это хороший образец того, как формулировать критерии приёмки для агента — не «сделай, чтобы работало», а конкретный список проверок.
Всё из одного конфига
Файл examples/arena.json описывает полный сценарий: ID бойцов, имена, авторы, модели, персонажи, стратегии, зерно случайности, лимиты запросов, настройки турнира, каталог данных и адрес сервера.
npm run arena -- --config examples/arena.json
Массив steps в конфиге задаёт порядок этапов: импорт бойцов, офлайн-бой, турнир, запуск UI. Последним всегда идёт serve. Каждый этап можно запустить отдельно:
npm run arena -- import --config examples/arena.json
npm run arena -- fight --config examples/arena.json
npm run arena -- tournament --config examples/arena.json
npm run arena -- serve --config examples/arena.json
Для headless-боёв и турниров сервер не нужен. Импорт бойцов сливается с локальным хранилищем без удаления чужих конфигов. Прежние конфиги-массивы examples/bots.json и examples/models.json тоже работают. Все поля конфига описаны в справочнике.
Реальные модели
По умолчанию всё работает офлайн. Чтобы подключить настоящие модели, скопируйте .env.example в .env и добавьте OPENROUTER_API_KEY для моделей через OpenRouter или RAWMODELS_API_KEY для OpenJev. Список моделей лежит в src/providers/models.json. Ключи читает только сервер, в браузер они не уходят. Наличие ключа не означает, что все модели из списка вам доступны.
Два момента про расходы. API-вызовы обоих бойцов идут с ваших ключей, и редактор просит подтверждение перед стартом API-боя. Переменная ARENA_MAX_REQUESTS ограничивает число попыток запросов за бой, включая повторные, — это не лимит в деньгах. Из-за задержек API бой может занять куда больше времени, чем симулированные пять минут боя.
Турниры
Турнир без ключей на встроенных ботах:
npm run tournament -- --config examples/bots.json --out data/bots --games 2
Турнир на реальных моделях:
npm run tournament -- \
--config examples/models.json \
--out data/models \
--games 2 --parallel 2 --max-requests 20000
Каждая пара играет на одном зерне дважды, меняясь сторонами, — так убирается преимущество первого хода. Раннер сохраняет манифест, файлы реплеев и прогресс в каталог вывода. Рейтинги появляются только когда все запланированные бои завершены и прошли проверку. Повтор той же команды доигрывает недостающие бои и ничего не дублирует. Сменили конфиг или код — нужен новый каталог вывода.
Журнал попыток запросов переживает перезапуск процесса. Но прерванный бой начинается с нуля и может снова потратить токены: ответы моделей на отдельные решения не кешируются. Подробности протокола и лимитов — в документации турниров.
Проверки и Docker
npm run check # TypeScript, форматирование, модульные тесты и проверки целостности
npm run dataset:verify # побайтовые хеши, результаты и рейтинги всех 420 реплеев
npm run build
npm run smoke # реальный прод-сервер и полный офлайн-бой
npm start
Команда dataset:verify — отдельная приятность: она заново проверяет побайтовые хеши всех архивных реплеев, их результаты и рейтинги. CI гоняет эти же проверки на pull request'ах и пушах.
Есть и Docker:
docker build -t jevarena .
docker run --rm -p127.0.0.1:3100:3100 \
--env-file .env -v jevarena-data:/app/data jevarena
Без --env-file .env образ работает на встроенных ботах. Внутри образа стартует продакшн-сервер; для разработки CLI удобнее запускать из исходников.
Зачем это всё
Арена — это бенчмарк в форме игры. Модели сравниваются не на тестах с одним правильным ответом, а в ситуации, где нужно выбирать ход по описанной стратегии. Все бои детерминированы, реплеи верифицируются побайтово, поэтому итоговый рейтинг можно проверить самому, а не верить опубликованной таблице.
Проект полезен и как пример репозитория, спроектированного под запуск кодинг-агентом: готовый промпт, AGENTS.md, детерминированные проверки и измеримые критерии приёмки. Если вы настраиваете работу своего агента с чужими репозиториями, это хороший референс.
Код, арт персонажей и бенчмарк опубликованы под MIT. Архитектура проекта разобрана в docs/architecture.md, правила для контрибьюторов — в CONTRIBUTING.md.
Источник: https://github.com/rawmodels/jevarena