PRISM/genlab-1c / prism
v1.4.0Star10

Как запустить

Вся работа с бенчмарком идёт через одну команду — prism. Команды зовутся через uv run — отдельно активировать окружение не нужно, флаги передаются как есть. Эта страница — полный справочник: установка и каждая команда со всеми флагами.

Шпаргалка

prism без команды печатает короткую подсказку «что делать». Справка по любой команде — uv run prism <команда> --help.

Установка

Что нужно заранее: Docker, Python 3.10+, make. Для категории B — образ учебной 1С (prism-onec, собирается из своего дистрибутива; как получить — подскажет make onec-guide) и ключи API моделей в .env (нужны для генерации; чтобы смотреть готовый лидерборд — нет).

Окружение управляет uv (нет uv? — curl -LsSf https://astral.sh/uv/install.sh | sh; или соберите окружение обычным python -m venv .venv && source .venv/bin/activate && pip install -e . — тогда prism зовётся напрямую). Два инструмента: makeпоставить, prismпользоваться.

make setup-all            # окружение (uv) + docker-образы инструментов A + учебная 1С B
# хостовый dev-режим (без Docker, для категории A): make setup + флаги --runner/--bsl local
ЦельЧто ставит
make setup-allвсё в Docker (дефолт): окружение + образы инструментов A + учебная 1С B
make setup-dockerокружение + docker-образы инструментов A (без учебной 1С B)
make setupхостовый dev-режим: инструменты осей на хост (зови с --runner/--bsl local)
make image-onecобраз учебной 1С для категории B (проведёт по дистрибутиву, если его нет)

Команды одним взглядом

КомандаЧто делает
prism doctorбыстрый чек готовности: инструменты осей и ключи моделей (без сети)
prism pingживой минимальный запрос к моделям — проверить ключ и связь
prism generateмодели пишут код по задачам → results/experiment_*.json
prism scoreпересчитать оценку готового кода по осям S·M·O·P → results/auto/
prism leaderboardмгновенно показать лидерборд из готовой оценки (без пересчёта)
prism checkпроверить целостность: контракты, задания, эталоны, инструменты
prism submitупаковать прогон для шеринга (хеш совместимости) или принять чужой
prism tasksпересобрать видимый банк задач (tasks/README.md)
prism docsпересобрать таблицы лидерборда и бейджи в README и доках из оценок

Первый запуск по шагам: doctor (всё ли готово) → ping (отвечают ли модели) → generate --category A --mock (сухой прогон без сети) → score (оценить) → submit (поделиться).

Где исполняется код кандидата

По умолчанию — в Docker-песочнице (код от нейросети недоверенный): категория A в образах prism-onescript + prism-bsl-ls, категория B — в prism-onec. Хостовый режим включается явно (--runner local / --bsl local). На баллы режим не влияет — только на то, где крутится песочница.


prism doctor

Быстрый (секунды, без прогонов в 1С и сетевых вызовов) ответ на вопрос «всё ли у меня есть, чтобы работать». Три среза: окружение (Python/uv), инструменты осей (OneScript, BSL LS, образ prism-onec) и какие ключи моделей заданы в .env. В конце — вердикт «готов к: генерации · оценке A · оценке B».

uv run prism doctor

Флагов нет. Каждый недостающий пункт несёт подсказку, что доставить.

prism ping

Живой минимальный запрос к каждой модели каталога: проверяет, что ключ канала рабочий и провайдер отвечает. Тратит немного токенов — по одному короткому запросу на модель. Модель без ключа не ошибка, а пропуск (запрос не делается).

uv run prism ping                       # все модели с заданными ключами
uv run prism ping --models deepseek gemini   # только выбранные
ФлагПо умолчаниюНазначение
--models [KEY ...]все из каталогакакие модели пинговать (ключи из generation/models.yaml)

Код возврата: 1, если хоть одна модель с ключом не ответила (годится для CI); пропуски на код не влияют.

prism generate

Модели пишут код кандидатов по задачам выбранной категории. Для каждой пары (задача, модель) собирается контекст (категория B — агентным сбором метаданных), делается прогон, ответы хешируются (для воспроизводимости) и пишутся в results/experiment_*.json — в той же схеме, которую читает prism score.

uv run prism generate --category A --mock                # сухой прогон без сети (проба конвейера)
uv run prism generate --category A --models claude       # одна модель, все задачи A
uv run prism generate --category B --models gigachat gpt # несколько моделей сразу
uv run prism generate --category A --dry-run             # только смета стоимости, без сети
uv run prism generate --category B --tasks B1 B2 --max-cost 5
ФлагПо умолчаниюНазначение
--category {A,B}обязателенкатегория задач
--models [KEY ...]все из каталогаключи моделей (generation/models.yaml)
--tasks [ID ...]все задачи категориикакие задачи генерировать (напр. A1 A2)
--edition EDITIONcoreиздание из editions/ (условия прогона)
--resume EXP_NAMEдозаписать в существующий эксперимент: пропустить готовые пары
--concurrency Nиз params.yamlпараллельных пар задача×модель
--max-cost USDбез капановые пары не запускать сверх порога стоимости
--retries N3повторов при транзиентном сбое сети
--dry-runтолько предполётная смета стоимости, без вызовов сети
--mock [canonical|stub]сухой прогон без сети: имитация модели mock/echo (canonical — эталон задачи, stub — заглушка)

Ключи API задаются в .env (копия .env.example) — он подхватывается автоматически. Какой ключ нужен для модели — по access.adapter в generation/models.yaml.

Надёжность больших прогонов

Каждый готовый результат сразу пишется в results/<exp>.parts/ (атомарно) — падение на 60/100 не теряет готовое. --resume <exp_name> дозапускает только недостающие/упавшие пары. Транзиентные сбои сети (429/5xx/таймаут) повторяются с паузой; перманентные (401/нет кредитов) — сразу. Цены берутся из датированной таблицы generation/pricing.yaml; модель без цены считается нулевой с предупреждением (бюджет недосчитан, а не врёт).

prism score

Авто-оценка Уровня 1 готовых генераций — без новой генерации, но с пересчётом: код кандидатов исполняется в песочнице (по умолчанию Docker), считаются оси S·M·O·P и общий балл Q, результат пишется в results/auto/<exp>_auto_l1.json. Без --experiment оценивается свежий прогон каждой категории (A и B).

uv run prism score                                 # свежий прогон A и B → два лидерборда
uv run prism score --full                          # + построчная таблица S·M·O·P·Q и срезы
uv run prism score --experiment results/experiment_A_<timestamp>.json
uv run prism score --models ygpt5_lite ygpt51_pro  # дооценить только эти модели (дозапись)
uv run prism score --runner local --bsl local      # на хосте вместо Docker
ФлагПо умолчаниюНазначение
--experiment PATHсвежайший каждой категории (A и B)какой набор генераций оценивать
--models [KEY ...]всеоценить только эти модели и дозаписать в существующий auto_l1 (прежние не пересчитываются)
--edition EDITIONcoreиздание (какие оси считать)
--out PATHresults/auto/<exp>_auto_l1.jsonкуда писать (имеет смысл только с явным --experiment)
--fullпострочная таблица S·M·O·P·Q и срезы по тегам вместо лидерборда
--concurrency Nenv / ≤4параллельных прогонов (поверх PRISM_CONCURRENCY)
--runner {local,docker}env / dockerпесочница оси M, OneScript (поверх PRISM_RUNNER)
--bsl {local,docker}env / dockerинструмент осей S/O, BSL LS (поверх PRISM_BSL)

prism leaderboard

Мгновенная сводка из уже посчитанной оценки L1 — читает results/auto/*_auto_l1.json, без пере-исполнения в 1С (доли секунды против минут у score). Без --experiment печатает свежий лидерборд каждой категории (A и B) единым снимком.

uv run prism leaderboard                           # свежий лидерборд A и B
uv run prism leaderboard --full                    # + построчная таблица и срезы по тегам
uv run prism leaderboard --experiment results/auto/<exp>_auto_l1.json   # конкретная оценка
ФлагПо умолчаниюНазначение
--experiment AUTO_L1свежайший каждой категориипуть к конкретной оценке *_auto_l1.json
--fullдобавить построчную таблицу S·M·O·P·Q и срезы по тегам

prism check

Проверка целостности — «прехук» данных бенчмарка. Без аргументов прогоняет всё; флагами можно сузить до одной задачи или категории (быстрая итерация).

uv run prism check                  # полная проверка (гейт перед коммитом)
uv run prism check --task B15       # быстро: эталон только задачи B15
uv run prism check --category A     # эталоны только категории A

Четыре среза, от дешёвого к дорогому:

  1. Контракты метрики — конституция/протокол/издания/генерация грузятся и согласованы.
  2. Контракты заданий — каждая задача валидна; у исполнимых есть тесты и точки входа.
  3. Когерентность эталоновcanonical.bsl каждой задачи проходит свои скрытые тесты на 100% (разом валидирует и тесты, и эталон). Требует песочницы; нет инструмента — срез пропускается.
  4. Инструменты по осям — доступность OneScript (M), BSL LS (S/O), образа prism-onec (B).
ФлагПо умолчаниюНазначение
--task [ID ...]все задачипрогнать эталоны только этих задач
--category {A,B}обепрогнать эталоны только этой категории
--concurrency Nenv / ≤4параллельных прогонов
--runner {local,docker}env / dockerпесочница оси M
--bsl {local,docker}env / dockerинструмент осей S/O

Код возврата: 0 — нарушений нет; 1 — есть хоть один сбой (контракт или эталон, не прошедший свои тесты). Подходит для CI-гейта.

prism submit

Упаковать свой прогон для шеринга — так, чтобы автор бенчмарка мог влить его в лидерборд и быть уверенным, что цифры сравнимы. Оценки L1 на разных версиях бенчмарка несравнимы, поэтому к результату прикладывается compat_hash — отпечаток версии (метрика + набор задач).

# контрибьютор: упаковать свежую оценку
uv run prism submit                                # → results/submissions/<exp>_submission.json
uv run prism submit --experiment results/auto/<exp>_auto_l1.json

# автор: принять чужой пакет
uv run prism submit --verify file_submission.json          # сверить версию бенчмарка
uv run prism submit --verify file_submission.json --apply  # + влить в results/auto/
ФлагПо умолчаниюНазначение
--experiment AUTO_L1свежайшийкакую оценку упаковать
--verify FILEрежим автора: сверить отпечаток чужого пакета с текущим репозиторием
--applyс --verify: при совместимости влить оценку в results/auto/

При совпадении отпечатка пакет можно вливать (--apply кладёт оценку в results/auto/, дальше лидерборд пересобирает prism docs); не совпал — прогон на другой версии, цифры несравнимы (код возврата 1).

prism tasks

Пересобирает видимый банк задач — файл tasks/README.md со списком всех заданий, их навыками и конструкциями 1С — из task.yaml каждой задачи. Запускать после добавления или изменения задач (это же гейтит prism check).

uv run prism tasks

Флагов нет.

prism docs

Пересобирает таблицы лидерборда и счётные бейджи в README.md, docs/leaderboard.md и docs/status.md — подменяет помеченные регионы между <!-- prism:KEY --> данными из results/auto/*_auto_l1.json. Запускать после prism score.

uv run prism docs

Флагов нет. Таблицы — производные данные (источник правды — оценки в results/auto/), поэтому руками их не правят.


Переменные окружения

Управляют исполнением и не входят в идентичность балла. Работают из .env (см. .env.example) и как обычные переменные окружения. Приоритет: флаг CLI > переменная окружения > .env.

ПеременнаяПо умолчаниюЧто делает
PRISM_RUNNERdockerпесочница оси M (OneScript): docker | local
PRISM_BSLdockerинструмент осей S/O (BSL LS): docker | local
PRISM_CONCURRENCY≤4сколько кандидатов считать параллельно
PRISM_JAVAавтопоискпуть к java 21+ для BSL LS в режиме local
PRISM_ONEC_MEMORYлимит памяти контейнера 1С (docker --memory), напр. 2g
PRISM_ONEC_CPUSлимит CPU контейнера 1С (docker --cpus), напр. 1
PRISM_PROXY_RUпрокси для отечественных каналов (YandexGPT, GigaChat)
PRISM_PROXY_INTLпрокси для зарубежных каналов (OpenRouter)

Не хватает памяти при параллельном прогоне категории B — снизьте PRISM_CONCURRENCY или задайте PRISM_ONEC_MEMORY / PRISM_ONEC_CPUS. При нехватке прогон честно помечается «не измерено», а не выдаёт неверный балл.