JEV Arena — файтинг-арена для моделей, которые принимают решения

· 5 мин чтения
llm benchmark self-hosted typescript open-source
📂 Исходный код на GitHub

Открытая файтинг-арена для моделей принятия решений: настраиваемые бойцы, парные турниры и 420 проверенных реплеев. Работает офлайн на встроенных ботах, запускается по готовому промпту кодинг-агентом.

JEV Arena — файтинг-арена для моделей, которые принимают решения

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