← Документация EN

JSON-формат конфигурации

Референс flow.json — файла, который генерирует визуальный редактор

flow.json описывает весь сценарий бота: узлы, связи между ними и настройки проекта. Редактор валидирует файл по JSON Schema (schemaVersion: "1.0"), поэтому любой экспортированный конфиг гарантированно читается обратно. Ручные правки тоже безопасны: загрузите файл через «Импорт JSON», и редактор проверит его той же схемой.

Совет: полная спецификация с примерами сгенерированного кода — в репозитории на GitHub.

Структура документа

{
    "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 Завершение — закрывает диалог

Command — команда

{
    "type": "command",
    "id": "node_123",
    "name": "greeting",
    "slots": ["привет", "здравствуй"],
    "isPattern": false,
    "saveTo": "lastGreeting",
    "response": { "text": "Привет, {{userName}}!", "buttons": [] }
}
Поле Описание
slots Слова-триггеры, регистр не важен
isPattern Если true — слоты трактуются как регулярные выражения
saveTo Сохранить ввод пользователя в переменную
response Текст ответа, TTS, кнопки, карточка, завершение диалога

Step — шаг

{
    "type": "step",
    "id": "node_456",
    "name": "ask_name",
    "prompt": { "text": "Приятно познакомиться, {{userName}}!" },
    "saveTo": "userName",
    "saveAs": "original"
}

Шаг срабатывает на ответ пользователя: вопрос задаёт блок перед шагом, а prompt.text (необязательный) отправляется уже после ответа.

saveAs: "original" сохраняет ввод как есть, "lowercase" — в нижнем регистре. Куда идти дальше, определяется связью next.

Condition — условие

{
    "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

Action — действие

Три типа действий: set_variable (вычислить выражение и записать в переменную), random_number (случайное число от min до max) и http_request (GET/POST-запрос с заголовками, телом и сохранением ответа в переменную). В URL, теле и выражениях работает подстановка {{переменная}}.

Связи (edges)

{ "from": "node_123", "to": "node_456", "type": "next" }
Тип Описание
next Последовательный переход к следующему блоку
branch_true Ветка «да» от условия
branch_false Ветка «нет» от условия
slot_match Переход при совпадении слота

Подстановка переменных

В любом тексте используйте {{имя}} — значение подставится автоматически:

"Привет, {{userName}}!"  →  setText(ctrl, `Привет, ${ctrl.userData.userName}!`)

Валидация и имена

Имена блоков с пробелами и спецсимволами автоматически превращаются в корректные идентификаторы (кириллица сохраняется). Редактор ловит типовые ошибки до экспорта: пустые ответы, недостижимые блоки, дубли имён после санитизации, потерянные связи. Условия внутри одного блока изолируются — два условия с одинаковой переменной в одном блоке не конфликтуют.

Дополнительно