Референс flow.json — файла, который генерирует визуальный редактор
flow.json описывает весь сценарий бота: узлы, связи между ними и настройки проекта.
Редактор валидирует файл по JSON Schema (schemaVersion: "1.0"), поэтому
любой экспортированный конфиг гарантированно читается обратно. Ручные правки тоже
безопасны: загрузите файл через «Импорт JSON», и редактор проверит его той же схемой.
{
"schemaVersion": "1.0",
"name": "my-bot",
"version": "1.0.0",
"platforms": ["telegram", "alisa"],
"database": { "type": "file", "config": {} },
"nodes": [],
"edges": [],
"fallback": { "text": "Извините, я вас не понял." },
"welcome": { "text": "Привет!" }
}
| Поле | Описание |
|---|---|
| schemaVersion | Версия формата, сейчас всегда "1.0" |
| name | Имя проекта — используется в package.json и имени папки |
| version | Версия проекта (semver) |
| platforms |
Список платформ: telegram, alisa,
marusia, vk, max_app,
viber, smart_app
|
| database | Хранилище данных: file, mongo или none |
| nodes | Все блоки сценария (см. типы ниже) |
| edges | Связи между блоками |
| welcome | Приветственное сообщение при старте диалога |
| fallback | Ответ на нераспознанный ввод |
| variables | Комментарии к переменным: имя → описание |
| Тип | Назначение |
|---|---|
| command | Команда — реагирует на слова-триггеры |
| step | Шаг — ждёт ответ пользователя и сохраняет его в переменную |
| condition | Условие — ветвление по переменной |
| action | Действие — HTTP-запросы, переменные, случайные числа |
| response | Ответ — показывает текст и кнопки без запроса ввода |
| end | Завершение — закрывает диалог |
{
"type": "command",
"id": "node_123",
"name": "greeting",
"slots": ["привет", "здравствуй"],
"isPattern": false,
"saveTo": "lastGreeting",
"response": { "text": "Привет, {{userName}}!", "buttons": [] }
}
| Поле | Описание |
|---|---|
| slots | Слова-триггеры, регистр не важен |
| isPattern | Если true — слоты трактуются как регулярные выражения |
| saveTo | Сохранить ввод пользователя в переменную |
| response | Текст ответа, TTS, кнопки, карточка, завершение диалога |
{
"type": "step",
"id": "node_456",
"name": "ask_name",
"prompt": { "text": "Приятно познакомиться, {{userName}}!" },
"saveTo": "userName",
"saveAs": "original"
}
Шаг срабатывает на ответ пользователя: вопрос задаёт блок перед шагом, а
prompt.text (необязательный) отправляется уже после ответа.
saveAs: "original" сохраняет ввод как есть, "lowercase" —
в нижнем регистре. Куда идти дальше, определяется связью next.
{
"type": "condition",
"id": "node_789",
"name": "check_age",
"variable": "age",
"operator": "gte",
"value": 18
}
Ветки «да»/«нет» задаются связями branch_true и
branch_false. value может быть числом, строкой или именем переменной.
| Код | Проверка |
|---|---|
| eq / neq | Равно / не равно |
| gt / gte / lt / lte | Больше / больше-или-равно / меньше / меньше-или-равно |
| contains | Строка содержит подстроку |
| isEmpty / isNotEmpty | Переменная пуста / не пуста |
| isSayTrue / isSayFalse | Пользователь ответил «да» / «нет» (естественный язык) |
| isUrl | Значение — корректный URL |
Три типа действий: set_variable (вычислить выражение и записать в
переменную), random_number (случайное число от min до max) и
http_request (GET/POST-запрос с заголовками, телом и сохранением ответа
в переменную). В URL, теле и выражениях работает подстановка
{{переменная}}.
{ "from": "node_123", "to": "node_456", "type": "next" }
| Тип | Описание |
|---|---|
| next | Последовательный переход к следующему блоку |
| branch_true | Ветка «да» от условия |
| branch_false | Ветка «нет» от условия |
| slot_match | Переход при совпадении слота |
В любом тексте используйте {{имя}} — значение подставится
автоматически:
"Привет, {{userName}}!" → setText(ctrl, `Привет, ${ctrl.userData.userName}!`)
Имена блоков с пробелами и спецсимволами автоматически превращаются в корректные идентификаторы (кириллица сохраняется). Редактор ловит типовые ошибки до экспорта: пустые ответы, недостижимые блоки, дубли имён после санитизации, потерянные связи. Условия внутри одного блока изолируются — два условия с одинаковой переменной в одном блоке не конфликтуют.