Перейти к основному содержимому

🧱 Блоки

Сценарий собирается из блоков: каждый блок выполняет одно действие и передаёт управление дальше по связи, идущей из его выхода.

Всего в каталоге 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-блоки · Версии и запуски