🧱 Блоки
Сценарий собирается из блоков: каждый блок выполняет одно действие и передаёт управление дальше по связи, идущей из его выхода.
Всего в каталоге 74 типа блоков; в палитре редактора им соответствует 76 позиций — вместе с блоком «Старт», который уже стоит на холсте у любого сценария.
Как устроена палитра
Блоки в палитре разложены по шести пакам:
| Пак | Что внутри |
|---|---|
| Базовое | Логика, переменные, списки, объекты, строки, дата и время |
| Чат-бот | Сообщения клиенту и ожидание ответа |
| ИИ | AI-блоки и блок «AI-агент» |
| Интеграции | HTTP-запросы, преобразование данных, уведомления |
| Поддержка | Действия над текущим обращением и создание тикета |
| Тикеты | Действия над тикетом и работа со списком тикетов |
Родственные блоки собраны в мердж-группы — на палитре это одна карточка («Действие», «ИИ-блок», «Сообщение», «Данные», «Переменная», «Список», «Объект», «Строка»). После того как карточка перетащена на холст, конкретная операция выбирается в панели свойств в верхнем селекте: у группы «Действие» он называется «Что делать», у «Сообщения» — «Что сделать», у «ИИ-блока» — «Режим», у остальных — «Операция». Смена варианта сохраняет блок на месте и меняет набор полей.
Часть блоков лежит в палитре отдельными карточками, без группы: «Условие», «Задержка», «Переключатель», «Цикл по списку», «Параллельно», «Вопрос», «Индикатор набора», «HTTP запрос», «Уведомление», «Преобразование», «AI-агент» и блоки работы со списком тикетов.
Палитра зависит от типа сценария: паки «Поддержка» и «Тикеты» видны только в сценариях соответствующего типа, а «AI-агент» — только в сценариях «Поддержка».
Выходы блоков
Подписи выходов одинаковы во всём редакторе:
| Выход | Значение |
|---|---|
| Далее | обычное продолжение |
| Ошибка | блок не смог выполниться |
| Да / Нет | ветки блока «Условие» |
| Получен ответ / Таймаут | ветки блока «Вопрос» |
| Тело цикла / Далее | ветки блока «Цикл по списку» |
| После веток | общий выход блока «Параллельно» |
| По умолчанию, Не совпало | ветки блока «Переключатель» |
| Не найдено, Не уверена | ветки AI-блоков |
Динамические выходы
У трёх блоков выходы не заданы заранее, а рождаются из содержимого полей. Каждый такой выход нужно развести на холсте отдельно.
| Блок | Откуда берутся выходы | Как называется выход |
|---|---|---|
| Вопрос | каждая кнопка клавиатуры, кроме кнопки-ссылки | btn: и payload кнопки |
| Переключатель | каждая запись в поле «Кейсы» плюс всегда существующий «По умолчанию» | case: и значение кейса, а также default |
| AI-агент | каждый объявленный исход агента | out: и ключ исхода |
Кнопки-ссылки (URL) выходов не создают — это просто переход по адресу, поэтому в блоке «Сообщение» доступны только они.
Публикация сверяет имя динамического выхода с текущим содержимым поля. Если переименовать payload кнопки, значение кейса или ключ исхода, связь остаётся висеть на старом имени и сценарий не опубликуется — редактор покажет «Обязательный выход не разведён — публикация не пройдёт». Про агента предупреждение отдельное: «Исход не разведён: прогон уйдёт по несуществующему переходу и завершится молча». При удалении исхода редактор предлагает перенести связи на другой.
Блоки-заглушки
Двенадцать блоков есть в палитре и настраиваются, но реального действия за ними нет или пометка о заглушке осталась с прошлых версий. Флаг заглушки отдаётся вместе с каталогом блоков: агенту в описание навыка добавляется предупреждение «Навык ещё не подключён к реальной системе», а в карточке подтверждения оператор видит «Заглушка: действие не выполнится по-настоящему».
| Блок | Что происходит на самом деле |
|---|---|
| Индикатор набора | индикатор в канал не уходит, клиент ничего не видит |
| Цикл по списку | тело цикла не выполняется ни разу |
| Параллельно | ветки не выполняются |
| Уведомление | уведомление никуда не отправляется |
| Назначить агента | исполнитель тикета не меняется |
| Завершить тикет | тикет не закрывается; поле «Шаблон сообщения» принимается, но никуда не отправляется |
| История тикета | в переменную всегда записывается пустой список |
| Типы тикетов | в переменную всегда записывается пустой список |
| Сменить тип тикета | помечен заглушкой, но тип тикета меняет |
| Удалить тикет | помечен заглушкой, но тикет удаляет |
| Поиск тикетов | помечен заглушкой, но поиск выполняет |
| Фильтр тикетов | помечен заглушкой, но фильтрацию выполняет; на холст этот блок не выносится |
Блок «Цикл по списку» никогда не выполняет тело цикла: он сразу уходит по выходу «Далее». Пройти по списку и что-то в нём накопить этим блоком нельзя — для подсчётов используйте операции «Агрегация» и «Фильтр списка» (фильтр умеет только сравнение на равенство). Блок «Параллельно» ветки тоже не выполняет: у него срабатывает только общий выход.
Раньше блок «Создать тикет» ничего не создавал. Сейчас он работает: тикет действительно появляется в проекте. Работают и смена статуса тикета, смена типа, удаление и поиск. Из действий над тикетом не работают только «Назначить агента» и «Завершить тикет».
Пак «Базовое»
Условие
Ветвление по сравнению двух значений. Поля: «Левая часть» (что сравниваем, обычно переменная), «Оператор», «Правая часть» (с чем сравниваем). Выходы — «Да» и «Нет».
Операторов ровно восемь:
| Оператор | Как работает |
|---|---|
| равно | строковое сравнение значений |
| не равно | обратное «равно» |
| содержит | левая часть содержит правую как подстроку |
| входит в | значение есть в списке справа |
| не входит в | значения нет в списке справа |
| существует | значение не пустое |
| больше | числовое сравнение |
| меньше | числовое сравнение |
Правила, о которых легко забыть:
- для «входит в» и «не входит в» справа нужен JSON-массив строк, например
["vip","gold"]; - отсутствующая переменная приводится к пустой строке: «равно» с пустой правой частью даст «Да», а «существует» вернёт «Нет» и для отсутствующего значения, и для пустой строки;
- «больше» и «меньше» работают только с числами — на нечисловом значении блок падает с ошибкой.
Задержка
Пауза перед следующим блоком. Поле «Длительность» — четыре числовых поля: дни, часы, минуты, секунды. Выход — «Далее», он срабатывает после того, как время вышло.
Переключатель
Маршрут по значению. Поля: «Что сравниваем» и «Кейсы». Каждый кейс — отдельный выход блока: «Каждый кейс создаёт отдельный выход блока. Если значение совпало — сценарий идёт по этой ветке. Если ничего не совпало — по „По умолчанию“». Значения кейсов не должны повторяться, имена выходов — тоже.
Цикл по списку
Задуман как перебор элементов списка. Поля: «Переменная-список», «Переменная элемента», «Переменная индекса» (необязательно). Выход «Тело цикла» нужно провести через блоки тела и вернуть обратно в блок, выход «Далее» — продолжение после последней итерации.
Тело цикла не выполняется ни разу: блок сразу уходит по выходу «Далее». Обойти список и что-то в нём накопить сейчас нельзя.
Параллельно
Задуман как запуск нескольких веток одновременно с ожиданием всех. Поле «Кол-во веток» — от 2 до 50 (по умолчанию 2). Общий выход — «После веток».
Ветки не выполняются — срабатывает только общий выход.
Группа «Переменная»
Работа со значениями. Вариант выбирается в поле «Операция».
| Операция | Поля |
|---|---|
| Переменная | «Имя переменной», «Значение», «Область» (Сценарий / Пользователь / Тенант) |
| Очистить переменную | «Имя переменной», «Область» |
| Изменить число | «Переменная», «Шаг» (отрицательный — уменьшить), «Область» |
| Переключить флаг | «Переменная», «Область» |
| В JSON-строку | «Входная переменная», «Форматирование» (В одну строку / С переносами), «Сохранить строку в» |
| Формула | «Выражение» (арифметика: +, -, *, /, %, возведение в степень, скобки, функции вроде sqrt, переменные), «Сохранить результат в» |
Что означают области видимости — см. Переменные.
Группа «Список»
| Операция | Поля |
|---|---|
| Создать список | «Имя списка», «Начальные элементы» (JSON-массив, необязательно) |
| Добавить в список | «Переменная-список», «Элемент» |
| Длина списка | «Переменная-список», «Сохранить длину в» |
| Элемент списка | «Переменная-список», «Индекс» (с 0), «Сохранить элемент в» |
| Установить элемент | «Переменная-список», «Индекс», «Значение» |
| Удалить из списка | «Переменная-список», «По чему удалять» (По индексу / По значению), «Что удаляем» |
| Список содержит? | «Переменная-список», «Значение», «Поле» (необязательно) |
| Объединить список | «Переменная-список», «Разделитель», «Поле», «Сохранить строку в» |
| Агрегация | «Переменная-список», «Операция» (Количество / Сумма / Среднее / Минимум / Максимум), «Поле», «Сохранить результат в» |
| Фильтр списка | «Переменная-список», «Поле», «Значение», «Сохранить результат в» |
| Сортировка списка | «Переменная-список», «Поле», «Направление» (По возрастанию / По убыванию), «Сохранить результат в» |
Пока «Цикл по списку» не работает, посчитать что-то по списку можно только «Агрегацией», а отобрать элементы — «Фильтром списка». Фильтр сравнивает поле со значением на равенство, других условий у него нет.
Группа «Объект»
| Операция | Поля |
|---|---|
| Создать объект | «Имя объекта», «Начальные поля» (JSON-объект, необязательно) |
| Поле объекта | «Переменная-объект», «Путь» (например address.city), «Сохранить значение в» |
| Записать в объект | «Переменная-объект», «Путь», «Значение» |
| Удалить ключ | «Переменная-объект», «Путь» |
| Ключи объекта | «Переменная-объект», «Сохранить список ключей в» |
Группа «Строка»
| Операция | Поля |
|---|---|
| Склеить строки | «Части», «Разделитель», «Сохранить строку в» |
| Разделить строку | «Строка», «Разделитель», «Сохранить список в» |
| Заменить в строке | «Строка», «Что заменяем», «На что заменяем», «Режим» (Точное совпадение / Регулярное выражение), «Сохранить результат в» |
| Шаблон-строка | «Шаблон» с переменными, «Сохранить строку в» |
| Извлечение регуляркой | «Входная строка», «Шаблон», «Сохранить совпадение в» |
| Парсинг JSON | «JSON-строка», «Сохранить объект в» |
| Парсинг даты | «Дата», «Формат», «Часовой пояс», «Сохранить дату в» |
| Формат даты | «Дата», «Формат» (например dd.MM.yyyy), «Часовой пояс», «Сохранить строку в» |
Пак «Чат-бот»
Группа «Сообщение»
Вариант выбирается в поле «Что сделать».
Сообщение — отправить текст клиенту в текущий канал.
| Поле | Описание |
|---|---|
| Текст | Поддерживает шаблоны {{flow.var}} и Markdown |
| Картинки | До 10 картинок, отправятся вместе с текстом |
| Кнопки-ссылки | Inline-кнопки только со ссылками (URL). Не влияют на маршрут |
| Сохранить ID сообщения в | Имя переменной |
Кнопки в этом блоке не создают ветвление — они только ведут по ссылке. Чтобы кнопка вела по своей ветке сценария, используйте блок «Вопрос».
Изменить сообщение — поля «ID сообщения» и «Новый текст». Удалить сообщение — поле «ID сообщения».
Вопрос
Отправляет вопрос и ждёт ответа клиента.
| Поле | Описание |
|---|---|
| Сообщение пользователю | Вопрос, который зададим пользователю |
| Имя переменной | Куда сохранить ответ |
| Таймаут ожидания | Сколько ждать ответ, прежде чем уйти по выходу «Таймаут» (по умолчанию 1 час) |
| Картинки | До 10 картинок, отправятся вместе с вопросом |
| Кнопки | Клавиатура под вопросом |
Выходы блока — «Получен ответ» и «Таймаут», плюс отдельный выход на каждую кнопку.
Ответ — это объект. В шаблонах указывайте поле через точку:
| Обращение | Что вернёт |
|---|---|
{{flow.<имя>.text}} | текст ответа |
{{flow.<имя>.id}} | UUID сообщения |
{{flow.<имя>.button}} | payload нажатой кнопки |
{{flow.<имя>.attachments}} | список файлов |
Голое {{flow.<имя>}} вернёт объект целиком, и редактор подскажет: «это объект — укажите конкретное поле через точку».
Кнопки. Клавиатура собирается по строкам («Строка N», «Кнопка N»), у каждой кнопки есть тип:
| Тип | Что делает |
|---|---|
| Обычная | обычная кнопка с payload |
| Ссылка | открывает URL |
| Web App | открывает мини-приложение |
| Запрос контакта | просит клиента поделиться контактом |
| Запрос геолокации | просит клиента поделиться геопозицией |
Каждая кнопка, кроме «Ссылки», создаёт отдельный выход блока — его нужно соединить со своей веткой: «Каждая кнопка-CALLBACK создаёт отдельный выход блока — соедините его со следующим шагом». Payload кнопок не должен повторяться («Этот payload уже используется другой кнопкой»). При удалении кнопки редактор предупредит: «Связь удалена вместе с кнопкой».
Индикатор набора
Показывает «печатает…» в чате. Поле «Длительность (мс)» — от 100 до 30000, по умолчанию 1500.
Блок не отправляет индикатор набора в канал — клиент ничего не увидит, сценарий просто идёт дальше.
Пак «ИИ»
Двенадцать AI-блоков собраны в одну карточку «ИИ-блок»; конкретный блок выбирается в поле «Режим». Тринадцатый блок пака — «AI-агент» — лежит в палитре отдельной карточкой.
| Блок | Где доступен |
|---|---|
| ИИ — генерация | везде |
| ИИ — JSON по схеме | везде |
| ИИ — классификация | везде |
| ИИ — извлечение данных | везде |
| ИИ — выбор варианта | везде |
| ИИ — перевод | везде |
| ИИ — тональность | везде |
| ИИ — модерация | везде |
| ИИ — язык текста | везде |
| ИИ — ответ по базе | только «Поддержка» |
| ИИ — сводка чата | только «Поддержка» |
| ИИ — классификация чата | только «Поддержка» |
| AI-агент | только «Поддержка» |
У блоков «ИИ — классификация», «ИИ — тональность», «ИИ — ответ по базе» и «ИИ — классификация чата» есть поле «Порог уверенности» (0–1, по умолчанию 0.6) и отдельная ветка «Не уверена»: «Если уверенность модели ниже порога — ветка „Не уверена“».
Поля и примеры — в разделе AI-блоки.
AI-агент
Отдельный блок, который отдаёт разговор с клиентом модели: она сама пишет ответы, сама задаёт вопросы и ждёт, сама вызывает выданные ей навыки и сама выбирает исход, которым закончить. Остальные AI-блоки делают ровно один вызов модели и уходят по фиксированному выходу — агент работает циклом и переживает несколько сообщений клиента.
Панель блока разложена на три вкладки: «Инструкция», «Навыки (N)», «Исходы (N)». Каждый объявленный исход даёт свой выход на холсте.
Подробно: Агентский режим, Навыки агента, Подтверждения оператора.
Пак «Интеграции»
HTTP запрос
Вызов внешнего API.
| Поле | Описание |
|---|---|
| Метод | GET / POST / PUT / PATCH / DELETE |
| URL | Поддерживает переменные, до 2048 символов |
| Тело | JSON для POST/PUT/PATCH |
| Заголовки | JSON заголовков |
| Авторизация | Без авторизации / Bearer-токен / Basic |
| Значение | Токен или логин:пароль (появляется, если выбрана авторизация) |
| Сохранить ответ в | Имя переменной |
У блока два выхода:
- «Далее» — ответ 2xx. Тело складывается в указанную переменную, код ответа — в
{{flow.__http_status__}}. - «Ошибка» — не-2xx или сбой связи. Диагностика — в
{{flow.error_message}}и{{flow.error_type}}.
Ограничения: ответ не больше 1 МиБ, таймаут соединения — 5 секунд, таймаут ответа — 30 секунд, не больше 100 HTTP-вызовов на один запуск. Запросы к приватным адресам и служебным хостам (localhost, metadata.google.internal, metadata.azure.com, *.svc.cluster.local, *.internal) блокируются.
Преобразование
Преобразует значение по выражению. Поля: «Входная переменная», «Выражение» (поддерживает шаблоны), «Сохранить результат в».
Уведомление
Уведомление для сотрудников (не для клиента — клиенту пишет блок «Сообщение»). Поля: «Канал» (Email / Slack / Telegram-бот / SMS / Push), «Адресат», «Сообщение».
Уведомление никуда не отправляется: ни один из каналов доставки не подключён, сценарий просто идёт дальше по выходу «Далее».
Пак «Поддержка»
Блоки этого пака работают с текущим обращением и доступны только в сценариях «Поддержка». Большинство из них собрано в мердж-карточку «Действие», вариант выбирается в поле «Что делать».
| Действие | Поля |
|---|---|
| Изменить статус | «Статус» (Новый / В работе / Уточнение / Решён / Отменён), «Комментарий» (необязательно) |
| Установить приоритет | «Приоритет» (Низкий / Средний / Высокий / Критический) |
| Добавить тег | «Тег» — выбор из тегов проекта |
| Назначить на группу | «Группа» — ID группы или переменная с ID |
| Снять группу | без полей |
| Отметить прочитанным | «ID сообщения» — сообщение, до которого помечаем прочитанным |
| Завершить диалог | «Статус закрытия» (Решён / Отменён) |
| Создать тикет | «Название», «Описание», «Приоритет», «Срочность», «Сохранить ID тикета в» |
| Получить шаблон | «ID шаблона», «Сохранить шаблон в» — загружает сохранённый шаблон ответа по его идентификатору |
Пояснения:
- «Добавить тег» вешает тег на текущее обращение. Тег выбирается из списка тегов проекта; произвольный текст блок не примет.
- «Назначить на группу» снимает с обращения линию поддержки: группа и линия взаимоисключающи.
- У «Завершить диалог» нет поля прощального сообщения: чтобы попрощаться с клиентом, поставьте перед ним блок «Сообщение».
- «Создать тикет» действительно создаёт тикет: он появляется в проекте, автором записывается сам сценарий, а идентификатор попадает в указанную переменную. Приоритет по умолчанию — «Средний». У блока есть выход «Ошибка» на случай, если создать тикет не удалось.
- В паке есть ещё один блок —
OPEN_TICKET_REPLY_SESSION. Он заворачивает следующий ответ бота в текущий тикет, чтобы сообщение ушло не в чат, а в переписку тикета. Русской подписи для него в интерфейсе зафиксировать не удалось.
Пак «Тикеты»
Блоки доступны в сценариях «Тикеты» (действия «Изменить статус» и «Установить приоритет» — ещё и в «Поддержке»).
| Блок | Поля | Работает |
|---|---|---|
| Сменить тип тикета | ID тикета, ID типа | да |
| Удалить тикет | ID тикета | да |
| Поиск тикетов | поисковый запрос, переменная для результата | да |
| Фильтр тикетов | критерии в JSON, переменная для результата | да, но на холст блок не выносится |
| Назначить агента | «ID агента» — ID или переменная с ID | нет |
| Завершить тикет | «Статус закрытия», «Комментарий», «Шаблон сообщения» | нет |
| История тикета | ID тикета, количество записей, переменная | нет, всегда пустой список |
| Типы тикетов | переменная для результата | нет, всегда пустой список |
«Назначить агента» и «Завершить тикет» настраиваются, но исполнитель не меняется и тикет не закрывается — сценарий просто идёт дальше по выходу «Далее». «История тикета» и «Типы тикетов» всегда возвращают пустой список.
Доступность по типу сценария
| Тип сценария | Что доступно дополнительно |
|---|---|
| Поддержка | «Добавить тег», «Назначить на группу», «Снять группу», «Отметить прочитанным», «Завершить диалог», «Создать тикет», «Получить шаблон», «ИИ — ответ по базе», «ИИ — сводка чата», «ИИ — классификация чата», «AI-агент» |
| Тикеты | «Назначить агента», «Завершить тикет», «Сменить тип тикета», «Удалить тикет», «Фильтр тикетов», «Поиск тикетов», «История тикета», «Типы тикетов» |
| Поддержка и Тикеты | «Изменить статус», «Установить приоритет» |
| Все типы | Логика, переменные, списки, объекты, строки, сообщения, «Вопрос», ИИ-блоки общего назначения, интеграции |
→ Триггеры · Переменные · AI-блоки · Версии и запуски