botruntime
CLI

Справочник команд brt

Практический справочник публичных workflow brt: сборка, деплой, каталог, переменные, логи и локальная разработка.

brt — CLI и dev-kit платформы botruntime: путь «код → работающий бот». Одна команда собирает агент-проект в самодостаточный бандл, другая — деплоит его в платформу, третья — подключает канал. Ниже собраны поддерживаемые публичные workflow: сигнатура → назначение → важные флаги → пример с выводом. Машинным источником полного набора опций остаётся brt <command> --help той версии CLI, которую вы запускаете.

Стандартный endpoint — https://botruntime.ru. Необязательный --api-url переопределяет его для прокси, staging и разработки платформы. Это технический override; он не меняет модель поставки платформы. Профили и per-bot ключи лежат в ~/.brt.

Значения config set, secret set и integration config передавайте через stdin или файл (--value-file / --config-file). У CLI остаются явные auth-флаги для CI и migration (login --token, link --key), но интерактивно безопаснее device login и --key-stdin.

Общие флаги

Парсер CLI принимает эти флаги на верхнем уровне, но эффект зависит от команды. В частности, --json является контрактом только там, где команда явно описывает machine-readable output (например, brt dev --check). brt logs и интерактивный brt chat пишут напрямую в свои потоки и не обещают глобальный JSON-режим.

ФлагТипНазначение
--verbose, -vbooleanПодробный лог.
--confirm, -ybooleanПодтвердить все интерактивные запросы (для скриптов и агентов).
--jsonbooleanЗапросить structured output у команд, которые его явно поддерживают.
--profile, -pstringИспользовать именованный профиль CLI вместо активного.
--botpress-homestringКаталог состояния CLI вместо ~/.brt (профили, cache и per-bot keys).

--confirm/-y не подтверждает destructive table changes. Для удаления таблицы, колонки или изменения типа требуется отдельный --allow-destructive-table-changes.

Аутентификация и профили

brt login

brt login [--device | --no-device] [--token <PAT>] [--workspace-id <id>] [--api-url <url>]

Записывает профиль CLI: endpoint, персональный токен доступа (PAT) и воркспейс. По умолчанию использует https://botruntime.ru и открывает device authorization в браузере. --no-device переключает на интерактивную вставку PAT, а --token предназначен для CI. Без --workspace-id команда предлагает выбрать доступный workspace. Профиль пишется в ~/.brt/profiles.json.

ФлагТипПо умолчаниюНазначение
--tokenstringГотовый PAT (для CI/скриптов; минует интерактивный промпт).
--workspace-idstringВоркспейс, в который деплоить по умолчанию.
--api-urlstringhttps://botruntime.ruAdvanced override для прокси, staging и разработки платформы.
--device / --no-devicebooleantrueBrowser device flow или ручная вставка PAT.
Вход в платформу
brt login
# откроет device authorization, даст выбрать workspace и запишет профиль

brt logout

brt logout

Очищает текущий global cache CLI, включая active-profile selection. Именованные профили в profiles.json и per-bot ключи в bots.json остаются.

brt profiles

brt profiles list   [--display-token]
brt profiles active [--display-token]
brt profiles use    <profileName>
brt profiles get    <profileName> [--display-token]

Управление профилями CLI. Одна установка brt держит несколько профилей (разные воркспейсы или окружения) и переключается между ними. Активный профиль хранится в ~/.brt. Токен по умолчанию замаскирован — покажет только --display-token.

Каждый профиль привязан к одному воркспейсу. Используйте отдельные профили для разных аккаунтов или рабочих окружений.

ПодкомандаНазначение
list (ls)Все профили.
activeСвойства текущего активного профиля.
use <name>Сделать профиль активным.
get <name>Один профиль по имени.
brt profiles list
brt profiles use ci

Боты

brt bots

brt bots create --name <name> [--if-not-exists]
brt bots get    <botId>
brt bots delete <botId>
brt bots list   [--dev]

CRUD над ботами воркспейса через профиль CLI.

brt bots get и brt bots delete принимают только ID бота, не имя. ID вы получаете из brt bots list или из вывода деплоя.

ПодкомандаФлагиНазначение
create (new)--name, --if-not-existsСоздать бота (--name); с --if-not-exists — не создавать, если бот с таким именем уже есть.
getОдин бот по ID.
delete (rm)Удалить бота по ID.
list (ls)--devСписок ботов; --dev — только dev-боты.
brt bots list
# botId               name            type
# 42                  support-bot     adk

Каталог интеграций, интерфейсов и плагинов

brt integrations / interfaces / plugins

brt integrations get    <name[@version]>
brt integrations list   [--name <n>] [--version-number <v>] [--owned] [--public] [--limit <n>] [--dev]
brt integrations delete <name[@version]>

brt interfaces get    <ref>
brt interfaces list
brt interfaces delete <ref>
brt plugins get    <ref>
brt plugins list   [--name <n>] [--version-number <v>]
brt plugins delete <ref>

Чтение и удаление записей каталога. get/delete адресуют пакет по имени с опциональной версией (telegram, telegram@1.1.3). Список фильтруется.

Флаг (list)ТипНазначение
--namestringФильтр по имени.
--version-numberstringФильтр по версии (не --version — его yargs занимает под свою версию CLI).
--ownedbooleanТолько ваши записи.
--publicbooleanТолько публичные.
--limitnumberОграничить число результатов.
--devbooleanТолько dev-версии.
brt integrations list --owned
brt interfaces get llm@5.1.0

Проект и сборка

brt init

brt init [--type bot|integration|plugin] [--template <id>] [--name <n>] [--work-dir <path>]

Скаффолдит интеграцию, плагин или ADK agent-проект.

brt init --type bot --template empty создаёт пустой ADK-проект, а --template hello-world — минимальный запускаемый пример. Оба используют agent.config.ts и совместимы с brt check, brt dev и brt deploy --adk; classic bot scaffold больше не создаётся.

brt check

brt check [--work-dir <path>]

Проверяет ADK agent-проект полностью локально: загружает agent.config.ts, выполняет primitive discovery и валидирует расписания Workflow.schedule. Команда не требует login, PAT или сети и не изменяет Cloud. Ошибки импорта, невалидные primitive-конструкторы, непустой src без найденных primitives и scheduled workflow с обязательными input-полями завершают проверку с ошибкой, вместо генерации пустого бота.

brt check
# Agent project check passed

brt build (classic project)

brt build [--source-map] [--no-minify] [--work-dir <path>]

Для classic-проекта на *.definition.ts выполняет generate + bundle. Root agent-проект на agent.config.ts эта команда намеренно не принимает: его generation/build встроены в brt dev и brt deploy --adk.

ФлагТипПо умолчаниюНазначение
--source-mapbooleanfalseСгенерировать sourcemaps.
--minifybooleantrueМинифицировать бандл. --no-minify — читаемый вывод для отладки.
--work-dirstringтекущий каталогКаталог проекта.
brt build
# .botpress/dist/index.cjs

brt generate, bundle, read, lint (classic project)

brt generate            # alias: gen — типы для intellisense (codegen без бандла)
brt bundle [--source-map] [--no-minify]   # только собрать бандл (без codegen)
brt read                # разобрать и напечатать определение интеграции
brt lint                # EXPERIMENTAL: линт определения интеграции

build = generate + bundle за один вызов. Отдельные подкоманды нужны, когда хотите обновить только типы (gen после правки схем) или только пересобрать бандл.

Линковка и деплой

brt link --bot-id <id> (--key-stdin | --key <k>) [--workspace-id <id>] [--api-url <url>]

Привязывает текущий проект к существующему боту без провижининга. Для agent-проекта пишет agent.json, для classic — bot.json. Per-bot key сохраняется в ~/.brt/bots.json раньше link-файла, чтобы аварийный обрыв не оставил невосстановимую привязку.

Команда использует активный профиль и сохраняет связь с ботом в проекте.

ФлагТипНазначение
--bot-idstring (обяз.)ID бота, к которому привязываемся.
--key-stdinbooleanЧитать per-bot ключ из stdin (предпочтительно).
--keystringКлюч в аргументе — может утечь в историю оболочки; берите --key-stdin.
--workspace-idstringЯвная проверка workspace: значение должно совпасть с активным профилем.
--api-urlstringAdvanced override; endpoint должен совпасть с активным профилем.
Привязка к существующему боту
printf '%s' "$BOT_KEY" | brt link --bot-id 42 --key-stdin

brt deploy --adk

brt deploy --adk [--name "<имя>"] [--bot-id <id>] [--noBuild]
                 [--watch] [--allow-destructive-table-changes]

Деплоит агент-проект в production: создаёт бота при первом deploy, собирает и загружает bundle и синхронизирует объявленные таблицы.

В обычном пути CLI сначала доказывает точный target и сверяет его integrations и plugins с Cloud, затем генерирует и собирает .botpress/dist/index.cjs, загружает bundle и применяет diff объявленных таблиц. Первый deploy без link создаёт production-бота и сохраняет его key раньше project link; повторный deploy использует уже привязанный target. Сверка Cloud всегда происходит до generation и build, поэтому stale или неоднозначное dependency state останавливает команду до upload.

Форматы snapshots, target attestation, provenance для --noBuild и порядок fail-closed recovery вынесены в Dependency snapshots. Для обычной выкатки эти файлы не нужно читать или редактировать.

ФлагТипПо умолчаниюНазначение
--adkbooleanfalseВключает деплой агент-проекта (обязателен для агент-проектов).
--namestringID ботаИмя бота — используется при провижининге.
--bot-idstringиз файла ссылкиЗадать/переопределить целевого бота.
--noBuildbooleanfalseПовторно использовать аттестованный бандл того же target; без провижининга.
--watchbooleanfalseЯвный постоянный rebuild + production redeploy-loop.
--allow-destructive-table-changesbooleanfalseРазрешить destructive table diff; -y недостаточно.

--dry-run не поддержан в сочетании с --adk: CLI завершается fail-loud до project bootstrap, build, авторизованного target API и записи project-файлов. Для classic deploy флаг сохраняет свою прежнюю семантику.

--watch нельзя сочетать с --noBuild: watch-режим обязан пересобирать изменившийся source перед каждым redeploy и отклоняет эту комбинацию до auth bootstrap, авторизованного target API и записи project-файлов.

--noBuild предназначен только для повторной отправки уже собранного artifact тому же target. Он требует существующий target и точный adjacent provenance; после изменения source или Cloud dependencies используйте обычный deploy со сборкой. BRT_BUNDLE_PATH — продвинутый trusted override и не отменяет provenance-проверку в сочетании с --noBuild.

Для automation сначала создайте или выберите профиль через brt login --token ... --workspace-id .... Для прокси или staging добавьте --api-url ... при создании профиля. Затем запускайте deploy с --profile <имя>.

Production rollout с новой интеграцией
# 1. Первый deploy создаёт target и загружает текущий код
brt deploy --adk --name "support-bot"

# 2. Install/register меняют состояние интеграции в Cloud
printf '{"botToken":"%s"}' "$PROD_TG" \
  | brt integrations install telegram@1.1.3 --config-stdin
export PROD_WEBHOOK_ID='wh_replace_from_install_output'
brt integrations register "$PROD_WEBHOOK_ID"

# 3. Второй deploy сверяет Cloud, генерирует и загружает новый bundle
brt deploy --adk

# 4. После успешного deploy — приёмочная проверка в реальном канале

install/register обновляют готовый production snapshot, но не запускают генерацию/сборку и не загружают bundle. Поэтому второй deploy обязателен перед приёмочной проверкой. Он пропускает провижининг уже привязанного target, заново сверяет точное состояние с Cloud, загружает новую версию и применяет table diff.

Зависимости classic-проекта

brt add / remove

brt add    <ref> [--alias <name>] [--use-dev] [--install-path <path>]   # alias: i, install
brt remove <alias>                                                       # alias: rm

Устанавливает пакет каталога (интеграцию, интерфейс или плагин) в зависимости classic-проекта на *.definition.ts: обновляет bpDependencies и генерирует bp_modules. ref — ID или имя с опциональной версией: teams, teams@0.2.0, llm@5.1.0.

Для agent-проекта brt add/remove не меняют Cloud dependencies. Публичный жизненный цикл интеграции уже доступен через brt integrations install/register. Публичной команды установки или удаления plugin у agent target в текущем brt нет.

ФлагТипНазначение
--aliasstringПсевдоним установки (по умолчанию — имя пакета).
--use-devbooleanВзять dev-версию, если она есть.
--install-pathstringПуть установки.
brt add telegram@1.1.3
brt remove telegram

Переменные и интеграции бота

Без --dev эти команды адресуют production target через project link и per-bot key. С --dev они выбирают проверенный dev target и используют PAT активного профиля.

brt config / secret

brt config set  <NAME> [--value-file <f>] [--dev]
brt config list [--dev]                         # alias: ls
brt config rm   <NAME> [--dev]                  # alias: delete
brt secret set  <NAME> [--value-file <f>] [--dev]

Задаёт per-bot переменные бота. configuration и secrets из agent.config.ts резолвятся против них. Значения запечатываются на сервере.

config set и secret set на проводе идентичны — оба запечатывают значение server-side. Разница только в намерении: секрет или обычная настройка. Имя валидируется регэкспом ^[A-Za-z_][A-Za-z0-9_]*$. Значение читается из stdin или --value-file, никогда из argv.

Установка секрета и просмотр переменных
printf '%s' "$EXTERNAL_API_KEY" | brt secret set EXTERNAL_API_KEY
# secret EXTERNAL_API_KEY -> ok

brt config list
# EXTERNAL_API_KEY 2026-07-05T09:12:44.031Z
# LLM_MODEL        2026-07-05T09:15:02.114Z

Токен Telegram не является bot secret: передавайте его в sealed-конфигурации brt integrations install botruntime/telegram@… --config-stdin. Модельные credentials обычного диалога принадлежат LLM-шлюзу платформы, а не каждому боту.

brt integrations install / register / upgrade / publish

brt integrations install <name@version> (--config-stdin | --config-file <f>) [--alias <a>]
                         [--dev]
brt integrations register <webhookId> [--dev]
brt integrations upgrade <name@version> [--alias <a>] [--dev] [--wait]
brt integrations publish [--name <name>] [--version-number <semver>]
                         [--config-schema-file <path>] [--no-bundle]
                         [--dryRun] [--noBuild] [--api-url <url>]

install устанавливает точную версию integration на production target либо, с --dev, на отдельный dev target и возвращает webhookId; register активирует её webhook на том же target. upgrade переключает существующую installation на другую опубликованную точную версию без повторного install/register. publish отправляет полное определение и bundle через канонический deploy-контракт с visibility=public; команда использует profile PAT, а не per-bot key.

Допустимы name@version и каталожный namespace/name@version; version обязателен и должен быть canonical exact SemVer. Например: telegram@1.1.3 для приватного определения или botruntime/yookassa@0.1.0 для публичного. Bare name, latest, range (^1.1.0), v-prefix, пустая/двойная @ и более одного / отклоняются до сетевого запроса; неявного fallback на 0.0.1 больше нет.

Для подготовленного agent target install, register и upgrade после подтверждённой Cloud mutation обновляют dependency snapshot. В dev запущенный watcher замечает обновление и повторяет generation. В production обновление snapshot не является build/deploy: выполните brt deploy --adk и только затем проводите приёмочную проверку.

upgrade сначала получает installation выбранного бота и требует ровно одно совпадение effective alias. Явно сохранённый alias имеет приоритет; для пустого alias подходит canonical integration name или его последний сегмент. Затем CLI отправляет один атомарный direct repoint. Cloud сохраняет installation ID, webhook, alias, статус и credentials и отклоняет несовместимые config schema или webhook auth mode с 409. Отдельного preflight нет.

--wait пока не поддержан и отклоняется до выбора target, сетевых запросов и mutation. Только ответ 4xx считается подтверждённым отказом. При network error, 5xx, malformed или противоречивом 2xx результат неизвестен: проверьте текущий ref installation, прежде чем выполнять напечатанную rollback-команду. Локальный snapshot в таком случае не меняется.

КомандаКлючевые флагиНазначение
install--config-stdin, --config-file, --alias, --devУстановить интеграцию с конфигом на выбранный target.
register--devАктивировать webhook на том же target.
upgrade--alias, --dev, --waitАтомарно переключить существующую installation на другую точную версию; --wait пока fail-loud.
publish--name, --version-number, --config-schema-file, --no-bundle, --dryRun, --noBuild, --api-urlПроверить или опубликовать полное определение + bundle в публичный каталог; URL override нужен только для прокси или разработки платформы.
Подключение канала
printf '{"botToken":"%s"}' "$DEV_TG" | brt integrations install botruntime/telegram@1.1.3 --config-stdin --dev
# installed botruntime/telegram -> webhookId=wh_...
brt integrations register wh_... --dev
Обновление версии без второй installation
brt integrations upgrade botruntime/telegram@1.2.0 --alias telegram
brt deploy --adk

Трейсы

brt traces

brt traces [tokens..]
           [--conversation-id <id>] [--dev]
           [--status unset|ok|error] [--error | --no-error]
           [--source <source>] [--name <spanName>]
           [--workflow <name>] [--action <tool>]
           [--trace-id <32-hex>] [--since <RFC3339|duration>]
           [--until <RFC3339|duration>] [--limit <n>]
           [--next-token <cursor>] [--include-llm] [--json] [--verbose]

Показывает сохранённые трейсы выбранного бота. Основной режим задаётся через --conversation-id <id> или token conversation=<id>. Для workflow и action без conversation обязательна нижняя граница since; точный non-zero traceId можно читать без неё. Запрос без conversation и без одного из workflow / action / traceId завершается до сетевого обращения. Полного unscoped listing Cloud API не предоставляет.

Botpress-compatible tokens можно смешивать с независимыми named flags, но один и тот же фильтр нельзя задавать обоими способами:

TokenЭквивалент и семантика
error--error; только строки с эффективной ошибкой.
conversation=<id>--conversation-id <id>; основная граница выборки.
workflow=<name>--workflow <name>; фильтрует совпадающие строки workflow.
action=<name>--action <name>; фильтрует совпадающие строки action/tool.
trace=<id>--trace-id <id>; выбирает дерево по 32-символьному hex trace ID.
since=<time>--since <time>; нижняя временная граница.
until=<time>--until <time>; верхняя временная граница.
limit=<n>--limit <n>; общий предел строк, а не размер одной server page.

since и until принимают RFC3339 или duration вроде 30s, 5m, 1h и 1d. Relative duration вычисляется один раз и отправляется серверу как абсолютная RFC3339-граница. Дополнительные typed filters доступны только как флаги: --status, --source и span --name; --no-error выбирает строки без эффективной ошибки.

ФлагНазначение
--conversation-idConversation ID; альтернатива conversation=. Без него нужен точный trace ID либо workflow/action вместе с since.
--devИспользовать проверенный dev target вместо production.
--statusФильтр typed status: unset, ok или error.
--error / --no-errorФильтр наличия эффективной typed ошибки.
--sourceФильтр источника трейса.
--nameФильтр typed имени span.
--workflowФильтр имени workflow на строке.
--actionФильтр action/tool на строке.
--trace-idФильтр по non-zero 32-символьному hex trace ID.
--since, --untilRFC3339 или duration; since не может быть позже until.
--limitОбщий предел результата: 1–10000, по умолчанию 20.
--next-tokenPositive-decimal cursor, ранее возвращённый этой командой.
--include-llmДобавить в CLI-вывод сохранённые LLM instructions, messages, tools и response. На запись трейсов не влияет.
--jsonСтабильный structured output со schema version, error diagnostics и cursor продолжения.
--verboseВывести runtime stack trace и attributes/payload выбранного режима.

Production target берётся из canonical agent.json (или bot.json для classic-проекта): положительные decimal workspaceId и botId вместе с PAT выбранного профиля адресуют GET /v1/admin/workspaces/{workspaceId}/bots/{botId}/traces. Сервер повторно проверяет membership workspace и принадлежность target bot; координаты link не создают authority сами по себе.

С --dev команда использует PAT профиля и attested opaque runtime bot ID, полученный для dev target через brt dev, и вызывает bot-scoped GET /v1/traces. Opaque ID не заменяется production bot ID и не выбирается из произвольного query/header.

Строки упорядочены детерминированно, а pagination ограничена по размеру страницы, общему --limit и числу страниц. Единственный server cursor — meta.nextToken ответа API: CLI не вычисляет cursor из ID строк и не принимает другие поля. Для продолжения передайте выведенный nextToken через --next-token; повтор или malformed cursor завершает команду ошибкой вместо зацикливания или молчаливого рестарта.

Диагностика conversation
brt traces conversation=conv_123 error since=1h
brt traces --conversation-id conv_123 --status ok --source otlp --name autonomous.tool
brt traces workflow=builtin_eval_runner since=10m --dev --json
brt traces trace=0123456789abcdef0123456789abcdef --verbose
brt traces trace=0123456789abcdef0123456789abcdef --include-llm --json
brt traces --conversation-id conv_123 --limit 100 --next-token 456 --json

Cloud API возвращает полное сохранённое содержимое span: correlation IDs, attributes, platform payload, tool input/output и LLM request/response. CLI всегда показывает tool input/output, но по умолчанию убирает из представления тяжёлые LLM-поля. --include-llm добавляет их в human- и JSON-вывод; --verbose показывает stack и attributes/payload выбранного режима. Платформа не удаляет LLM-контент при записи. Доступ ограничен выбранным workspace/bot; удалить все трейсы бота можно через DELETE /v1/admin/workspaces/{workspaceId}/bots/{botId}/traces. Режимы unscoped listing, follow и trigger не поддерживаются.

Диалоги

brt conversations list

brt conversations list [tokens..]
                       [--dev]
                       [--since <RFC3339|duration>] [--limit <n>]
                       [--next-token <cursor>] [--json]

Показывает последние conversations выбранного target без message content и conversation tags. Human output содержит timestamp, ID, integration/channel и messageCount. Стабильный JSON envelope имеет schemaVersion, canonical target, массив conversations и server-issued nextToken; каждая запись ограничена полями id, createdAt, updatedAt, channel, integration и messageCount.

Совместимые tokens повторяют актуальный Botpress ADK CLI:

TokenЭквивалент и семантика
limit=<n>--limit <n>; общий предел 1–10000, по умолчанию 20.
since=<time>--since <time>; RFC3339 или duration 30s, 5m, 1h, 2d, фильтр по updatedAt.

Один фильтр нельзя одновременно задавать token и named flag. Клиент валидирует limit, calendar-correct RFC3339 и positive-decimal cursor до network. Backend page не превышает 1000 строк; CLI ограничивает общее число страниц, обнаруживает cursor loop и использует только meta.nextToken, не вычисляя продолжение из ID.

ФлагНазначение
--devИспользовать attested opaque dev target вместо production.
--sinceОставить conversations, обновлённые не раньше RFC3339/duration.
--limitОбщий предел результата: 1–10000, по умолчанию 20.
--next-tokenPositive-decimal cursor из предыдущего ответа.
--jsonStable metadata-only JSON envelope.
Список conversations
brt conversations list
brt conversations list limit=5 since=1h
brt conversations list --dev --limit 100 --json
brt conversations list --limit 100 --next-token 456 --json

brt conversations show

brt conversations show <conversationId> [--dev] [--json]

Строит metadata-only timeline conversation из bounded trace API. Строки группируются по typed traceId; результат содержит timestamp, duration, effective status, bounded trigger/tool metadata и errorKind. Полная ошибка конкретного span читается через brt traces trace=<traceId> --verbose. Conversation ID валидируется до network. Если для ID нет trace rows, команда возвращает пустой timeline, а не подмешивает другой conversation.

ФлагНазначение
--devЧитать timeline attested dev target через /v1/traces.
--jsonStable envelope с conversationId, turnCount и turns.

Production использует canonical positive-decimal workspace/bot route и PAT выбранного профиля; dev использует тот же PAT, существующий opaque x-bot-id resolver и target, ранее доказанный brt dev. Prompt, model response, tool input/output, document content, message payload и conversation tags не печатаются. Runtime exception доступен в brt traces по trace ID.

Timeline conversation
brt conversations show conv_123
brt conversations show conv_123 --dev
brt conversations show conv_123 --json

Подробный LLM-контент читается через brt traces --include-llm. Команда brt conversations show намеренно остаётся компактным timeline и не принимает этот флаг.

Hosted evals

brt eval / brt eval run

brt eval [name]
brt eval run [name]
             [--tag <tag>] [--type capability|regression]
             [--judge-model <model>] [--timeout <ms>]
             [--repeat <1-100>] [--max-concurrency <1-10>]
             [--min-pass-rate <0-1>]
             [--dev] [--json]

Обе формы запускают builtin_eval_runner на выбранном hosted target и ждут terminal result. Bare brt eval повторяет default-action актуального Botpress ADK CLI; run — явная форма для скриптов и discoverable command tree. Перед запуском CLI загружает определения из evals/*.eval.ts, синхронизирует metadata-only manifest и приватные fixture-файлы, а также проверяет или автоматически устанавливает точную совместимую версию first-party chat. Runner сохраняет каждую завершённую проверку как отдельный workflow checkpoint: длинный suite продолжается в новых runtime invocation без повторной отправки уже выполненных chat-turn-ов и без дублирования результатов.

ФлагНазначение
--tagЗапустить evals с указанным tag.
--typeОграничить suite типом capability или regression.
--judge-modelModel reference для llm_judge.
--timeoutМаксимальное ожидание hosted workflow: 1000–3600000 ms.
--repeatЧисло повторов suite: 1–100, по умолчанию 1.
--max-concurrencyОдновременные повторы: 1–10, по умолчанию 1.
--min-pass-rateМинимальная доля успешных повторов: 0–1, по умолчанию 1.
--devИспользовать attested opaque dev runtime target и PAT.
--jsonStable typed result envelope; failed suite всё равно завершает процесс ненулевым кодом.

Production использует canonical positive-decimal workspace/bot link и per-bot key из ~/.brt/bots.json; существующий бот перепривязывается через brt link --key-stdin. Dev использует PAT выбранного профиля, narrowed только существующим opaque x-bot-id resolver. Path/query ID не задаёт tenant scope.

При brt dev CLI передаёт server-owned связь development-runtime с production из agent.json или bot.json. Сервер требует эту связь при первом создании и не позволяет перепривязать существующий runtime к другому проекту. Повторный запуск использует target из agent.local.json, поэтому его hosted eval history остаётся доступна в Development-переключателе консоли. Production и Development по-прежнему имеют разные данные и результаты.

Hosted eval suite
brt eval
brt eval greeting
brt eval run greeting --tag smoke --type regression
brt eval run --judge-model openai:gpt-4o --json
brt eval run regression --repeat 10 --max-concurrency 2 --min-pass-rate 0.9
brt eval run --dev

При repeat > 1 каждый повтор получает отдельные workflow/run/conversation и state. Итог содержит pass rate, stable | flaky, p50/p95 duration и histogram только по assertion kind. Сообщения, prompts и tool payload в aggregate не попадают.

Fixtures, actors и test-only controls

Attachment объявляется локальным fixture. CLI проверяет, что путь остаётся внутри проекта, считает sha256, ограничивает один файл 20 MiB и весь suite 100 MiB, загружает файл с private integrations access и удаляет локальный путь из hosted manifest. Runner получает свежий короткоживущий URL непосредственно перед ходом и отправляет обычный file/image message payload.

evals/catalog.eval.ts
export default new Eval({
  name: 'catalog-upload',
  fixtures: {
    catalog: { path: 'fixtures/catalog.pdf', contentType: 'application/pdf', name: 'catalog.pdf' },
  },
  conversation: [
    { actor: 'client', message: 'Изучи каталог', attachments: [{ fixture: 'catalog' }] },
  ],
})

Durable table fixtures объявляются в setup.tables. Перед первым ходом runner создаёт строки обычным Tables API, заменяет {{eval.id}} одним execution-scoped значением во всём setup и табличных assertions, а после grading удаляет только созданные им row ID. Частичное создание или удаление завершает eval стабильной ошибкой: runner не очищает таблицу целиком и не скрывает утечку fixture. Это manifest schema v2: старый runtime отклонит её явно, а не проигнорирует durable setup. После обновления runtime повторно запустите brt eval, чтобы синхронизировать manifest.

Табличные assertions доступны как на отдельном ходе, так и в outcome. Поддерживаются совместимые с Botpress формы row_exists и row_count с необязательным where; в результат попадают только счётчики, без содержимого строк.

evals/order.eval.ts
export default new Eval({
  name: 'order-is-durable',
  setup: {
    tables: [
      {
        table: 'OrderTable',
        rows: [{ externalId: 'eval-{{eval.id}}', status: 'pending' }],
      },
    ],
  },
  conversation: [
    {
      message: 'Проверь тестовый заказ',
      assert: {
        tables: [
          { table: 'OrderTable', row_exists: { externalId: { equals: 'eval-{{eval.id}}' } } },
        ],
      },
    },
  ],
  outcome: {
    tables: [
      {
        table: 'OrderTable',
        row_count: { equals: 1 },
        where: { externalId: { equals: 'eval-{{eval.id}}' } },
      },
    ],
  },
})

Для multi-actor сценария setup.relations резолвит связанный conversation по integration/channel/tags. Ход с target.relation создаётся как synthetic incoming message именно в этом conversation. Assertions deliveredTo, notDeliveredTo и conversationMode проверяют новые исходящие после baseline, а не совпадение текста в общем transcript.

evals/operator-handoff.eval.ts
setup: {
  relations: {
    operator: { integration: 'telegram', channel: 'channel', tags: { upstream: '$conversationId' } },
  },
},
conversation: [
  { actor: 'operator', target: { relation: 'operator' }, message: '/take' },
  { actor: 'client', message: 'Нужна помощь с заказом', expectSilence: true },
  {
    actor: 'operator', target: { relation: 'operator' },
    message: 'Заявка принята.', assert: { deliveredTo: 'client' },
  },
]

parallel и control доступны только isolated dev target. Production suite с ними отклоняется capability-preflight до создания run. advanceClock двигает монотонные часы конкретного dev-бота и делает due workflow jobs доступными воркеру; fault plan атомарно расходует failAfter/times на закрытых точках, поддерживает 429/503 и lost_ack только после успешного handler.

evals/retry.eval.ts
conversation: [
  { control: { faults: [{ point: 'workflow.after_dispatch', failAfter: 1, times: 1, mode: 'lost_ack' }] } },
  { parallel: [{ message: 'Повтор A' }, { message: 'Повтор B' }] },
  { control: { advanceClock: { milliseconds: 72 * 60 * 60 * 1000, runDueWorkflows: true } } },
]

brt eval runs

brt eval runs [runId]
              [--latest] [--status pending|running|completed|failed]
              [--limit <1-100>] [--next-token <cursor>]
              [--verbose] [--dev] [--json]

Без selector команда возвращает одну server page hosted run summaries. --latest сначала выбирает последний run и затем получает detail; positional runId — строгий positive-decimal ID. --status и --next-token относятся только к listing и не смешиваются с detail selector. Продолжение берётся только из server-issued opaque base64url nextToken.

Detail содержит run/entry IDs, status, trigger type, timestamps, typed errorKind, eval name/type/tags, verdict, duration и allowlisted assertion metadata. Для каждого хода доступны opaque conversationId и traceId, а для ошибки исполнения — стабильные errorCode, phase и turn index. --verbose добавляет human-readable assertion rows и печатает готовую команду brt traces --conversation-id <id>. JSON сохраняет те же безопасные поля в versioned metadata-only форме.

Hosted eval history
brt eval runs --limit 10 --status completed
brt eval runs --limit 10 --next-token MTAw --json
brt eval runs --latest --json
brt eval runs 101 --verbose

Prompts, user/bot messages, model responses, evidence, tool input/output, documents, raw evaluator errors и произвольный workflow failure reason исключаются из stdout/stderr даже при --verbose, malformed response или network failure. Известный код workflow delivery unavailable переводится в фиксированную подсказку проверить запущенный brt dev и tunnel, без отражения серверного текста. Auth/target/HTTP/cursor/timeout ошибки и failed suite возвращают ненулевой exit code с remediation.

Переход от eval к trace
brt eval runs 101 --verbose
# diagnostic code=CHAT_PAYLOAD_INVALID  phase=observation  turn=0
# inspect: brt traces --conversation-id conv_eval_1  traceId=0123456789abcdef0123456789abcdef

brt traces --conversation-id conv_eval_1

Логи

brt logs [--bot-id <id>] [--since <RFC3339>] [--until <RFC3339>]
         [--level <level>] [--grep <text>] [--conversation-id <id>]
         [--follow] [--limit <n>]

Команда реализует фильтры, пагинацию nextToken и polling --follow. Запрос идёт на workspace-scoped маршрут /v1/admin/workspaces/{workspaceId}/bots/{botId}/logs с PAT выбранного профиля; per-bot key не используется. Для обязательной production-проверки дополните логи реальным каналом и web inspector. Вывод logs текстовый; глобальный --json здесь не является контрактом.

Локальная разработка

brt serve (classic project)

brt serve [--port <n>] [--secrets <k=v>...] [--work-dir <path>]

Запускает уже собранный classic bundle без Cloud side effects. Root agent-проект на agent.config.ts команда не принимает; для него используйте brt dev.

brt chat

brt chat [<botId>] [--dev] [--chat-api-url <url>] [--protocol polling]

Создаёт новый интерактивный Chat conversation для target проекта. По умолчанию это production target из canonical link с per-bot key. --dev выбирает attested dev runtime из agent.local.json/project cache, использует PAT профиля и направляет Chat в связанный dev bot. Обычно для dev достаточно brt chat --dev; positional ID нужен только как явный override.

CLI проверяет точную совместимую версию first-party Chat integration и при необходимости устанавливает её в выбранное окружение. --local допустим только вместе с --dev.

--chat-api-url — advanced override Chat endpoint для прокси и разработки платформы. Обычный запуск использует endpoint активного профиля.

brt chat помечен EXPERIMENTAL. Production остаётся target по умолчанию; отдельного --prod, --single и continuation по существующему conversation ID нет. Команда не используется как обязательный readiness или production smoke gate.

brt dev

brt dev [--watch | --no-watch] [--port <n>] [--tunnel-url <url>]
brt dev --check [--json]

Для agent-проекта автоматически генерирует classic bot, минтит отдельного dev-бота и гонит Cloud traffic в локальный worker через reverse-tunnel. Для classic-проекта запускает тот же tunnel loop напрямую. По изменению файлов пересобирает и обновляет только dev target.

Каждый brt dev сверяет точное состояние Cloud-зависимостей до generation и не переиспользует устаревший snapshot без новой сверки.

После разрыва уже работающего tunnel CLI объединяет одновременные error/close сигналы в один reconnect loop и повторяет соединение с exponential backoff от 250 ms до 5 s в пределах 120 s. Если окно исчерпано, brt dev завершается ошибкой; бесконечного скрытого retry нет.

dev --check — read-only gate: один физический GET без retries, PUT и локальных записей. Он сверяет cached target, .adk/dependencies/dev.json, полный inventory bp_modules и authoritative Cloud identity/config revision/lifecycle. Любой unknown, partial или drift даёт ненулевой exit code.

Проверка намеренно не является bootstrap-командой. На fresh agent-проекте сначала один раз успешно запустите обычный brt dev: он докажет target, прочитает authoritative-состояние в Cloud и создаст snapshot. После этого используйте dev --check локально или в CI. Не создавайте .adk/dependencies/* вручную.

ФлагТипНазначение
--watchbooleanСледить за файлами и пересобирать изменения. --no-watch отключает rebuild watcher, но tunnel/dev-процесс продолжает работать до остановки.
--portnumberПорт локального сервера.
--tunnel-urlstringАдрес reverse-tunnel.
--checkbooleanПроверить cached dev bot readiness без запуска dev-сервера.
--jsonbooleanВывести machine-readable readiness report.
--noSecretCaching (--nsc)booleanНе сохранять classic dev secrets локально.

brt dev --adk — hidden compatibility flag, который всегда fail-loud до build и network. Явный Cloud watch — brt deploy --adk --watch. Dev-бот остаётся самостоятельным target и не подменяет staging/product acceptance. Полные prerequisites и remediation — в dev workflow.

Дальше

On this page