Справочник команд 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, -v | boolean | Подробный лог. |
--confirm, -y | boolean | Подтвердить все интерактивные запросы (для скриптов и агентов). |
--json | boolean | Запросить structured output у команд, которые его явно поддерживают. |
--profile, -p | string | Использовать именованный профиль CLI вместо активного. |
--botpress-home | string | Каталог состояния 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.
| Флаг | Тип | По умолчанию | Назначение |
|---|---|---|---|
--token | string | — | Готовый PAT (для CI/скриптов; минует интерактивный промпт). |
--workspace-id | string | — | Воркспейс, в который деплоить по умолчанию. |
--api-url | string | https://botruntime.ru | Advanced override для прокси, staging и разработки платформы. |
--device / --no-device | boolean | true | Browser 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) | Тип | Назначение |
|---|---|---|
--name | string | Фильтр по имени. |
--version-number | string | Фильтр по версии (не --version — его yargs занимает под свою версию CLI). |
--owned | boolean | Только ваши записи. |
--public | boolean | Только публичные. |
--limit | number | Ограничить число результатов. |
--dev | boolean | Только 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 passedbrt 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-map | boolean | false | Сгенерировать sourcemaps. |
--minify | boolean | true | Минифицировать бандл. --no-minify — читаемый вывод для отладки. |
--work-dir | string | текущий каталог | Каталог проекта. |
brt build
# .botpress/dist/index.cjsbrt 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
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-id | string (обяз.) | ID бота, к которому привязываемся. |
--key-stdin | boolean | Читать per-bot ключ из stdin (предпочтительно). |
--key | string | Ключ в аргументе — может утечь в историю оболочки; берите --key-stdin. |
--workspace-id | string | Явная проверка workspace: значение должно совпасть с активным профилем. |
--api-url | string | Advanced override; endpoint должен совпасть с активным профилем. |
printf '%s' "$BOT_KEY" | brt link --bot-id 42 --key-stdinbrt 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. Для обычной
выкатки эти файлы не нужно читать или редактировать.
| Флаг | Тип | По умолчанию | Назначение |
|---|---|---|---|
--adk | boolean | false | Включает деплой агент-проекта (обязателен для агент-проектов). |
--name | string | ID бота | Имя бота — используется при провижининге. |
--bot-id | string | из файла ссылки | Задать/переопределить целевого бота. |
--noBuild | boolean | false | Повторно использовать аттестованный бандл того же target; без провижининга. |
--watch | boolean | false | Явный постоянный rebuild + production redeploy-loop. |
--allow-destructive-table-changes | boolean | false | Разрешить 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 <имя>.
# 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 нет.
| Флаг | Тип | Назначение |
|---|---|---|
--alias | string | Псевдоним установки (по умолчанию — имя пакета). |
--use-dev | boolean | Взять dev-версию, если она есть. |
--install-path | string | Путь установки. |
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_... --devbrt 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-id | Conversation 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, --until | RFC3339 или duration; since не может быть позже until. |
--limit | Общий предел результата: 1–10000, по умолчанию 20. |
--next-token | Positive-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 завершает команду ошибкой вместо
зацикливания или молчаливого рестарта.
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 --jsonCloud 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-token | Positive-decimal cursor из предыдущего ответа. |
--json | Stable metadata-only JSON envelope. |
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 --jsonbrt 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. |
--json | Stable 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.
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-model | Model 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. |
--json | Stable 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
по-прежнему имеют разные данные и результаты.
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.
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; в результат попадают только счётчики, без содержимого
строк.
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.
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.
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 форме.
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 --verbosePrompts, 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.
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/* вручную.
| Флаг | Тип | Назначение |
|---|---|---|
--watch | boolean | Следить за файлами и пересобирать изменения. --no-watch отключает rebuild watcher, но tunnel/dev-процесс продолжает работать до остановки. |
--port | number | Порт локального сервера. |
--tunnel-url | string | Адрес reverse-tunnel. |
--check | boolean | Проверить cached dev bot readiness без запуска dev-сервера. |
--json | boolean | Вывести 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.
Дальше
Обзор brt
Установка CLI, устройство агент-проекта и типовой цикл «код → бот».
Dev, production и диагностика
Основной цикл, выкатка, изоляция targets и короткое восстановление.
Dependency state
Snapshots, target attestation, legacy import и dev --check изнутри.
Быстрый старт
Минимальный набор файлов и первый деплой в облако.
Admin API
Эндпоинты за deploy, config, secret и logs.