Общее описание
Сценарии позволяют описывать диалоги системы autoFAQ с пользователями. Диалог может включать в себя переписку с пользователем, обращение к данным во внешних системах и обогащение ответов.
Система позволяет создавать сценарии произвольной сложности и прикреплять их напрямую к документам в базах знаний или событиям в работе над диалогами. В случае когда база знаний по запросу пользователя определяет документ, содержащий вместо ответа сценарий, бот начнет вести с пользователем описанный в сценарии диалог.
Описание сценариев в системе ведется при помощи языка DSL autoFAQ. Тело сценария состоит из последовательных операций. Каждая операция располагается в отдельной строке, для связи со следующей операцией в конце строки требуется указание символа "+". Некоторые операции могут содержать 1 или несколько опциональных модификаторов.
Примеры готовых сценариев доступны в разделе Примеры сценариев
Переменные
Встроенные переменные
Для работы с данными в сценариях доступны следующие встроенные переменные:
{platformInMessageQuery} - текст первоначального запроса пользователя, по которому был создан диалог с AutoFAQ Данные пользователя {userFullName} - имя пользователя {userLogin} - логин пользователя {userEmail} - электронная почта пользователя {userPayload.*} - хранилище дополнительных данных о пользователе Данные пользовательского канала, через который пришел текущий запрос {channelId} - идентификатор канала {channelType} - тип канала (Telegram, Whatsapp, Widget) Встроенные переменные для работы с API вызовами {http_code} - код статуса последнего API запроса
Встроенные переменные можно не объявлять, их значение доступно в любом сценарии. Данные пользователя могут отсутствовать, если в сервисе не настроена Идентификация или иной метод получения данных о пользователях.
Пользовательские переменные
В сценариях возможно создавать и использовать для хранения данных пользовательские переменные трех типов:
переменные сценария
переменные диалога
переменные пользователя
Любая переменная можент быть создана или изменена ботом в любом сценарии. Значение переменной сценария будет потеряно после завершения того сценария, в котором она была создана. Значение переменной диалога будет доступно в любом сценарии в рамках текущего диалога. В новом диалоге эту переменную надо определять заново и ее значение может быть другим. Значение переменной пользователя сохраняется от диалога к диалогу. Если значение переменной пользователя поменяется, то это отразится на всех диалогах.
Ко всем переменным можно обратиться через указание названия переменной в обрамлении фигурными скобками {userSaid}
:
сообщениеПользователю.сШаблоном("Текст сообщения: {userSaid}") +
Детальнее об определении переменных смотрите в разделе Установка переменных
Переменные могут хранить не одно, а сразу несколько значений. Переменная, объявленная как attachments[]
хранит не одно значение, а список значений, при записи новых значений в данную переменная они будут дописаны в конец списка.
запроситьФайл("Приложите файл").сохранитьРезультат("files[]") +
Порядок выполнения шагов сценария
Все шаги сценария выполняются последовательно с первой до последней строки. Если вы хотите временно исключить одну из строк из процесса выполнения сценария - установите в начале данной строки символ //
сообщениеПользователю.сШаблоном("Привет")+ - шаг будет выполнен //сообщениеПользователю.сШаблоном("Привет, {userFullName}")+ - шаг не будет выполнен
В конце сценария обязательно размещение одного из шагов завершения сценария:
завершить - завершение сценария завершитьСШаблоном("Пока!") - завершение сценария с выводом сообщения пользователю завершитьСНовымЗапросом("Новый запрос") - завершение сценария и одновременный запуск в работу нового сообщения завершитьИПеревестиНаОператора - звершение сценария и перевод диалога в очередь оператору завершитьИЗакрытьДиалог() - завершение сценария и закрытие диалога, следующая реплика пользователя начнет новый диалог
Если в условии сценария применен один из шагов завершения, то сценарий может завершить работу досрочно:
если("{http_code} != 200").то( комментарий("Данные пользователя не обновлены")+ завершитьИПеревестиНаОператора )+ комментарий("Обовлены данные пользователя. Новые данные отправлены в CRM")+ завершить
Примеры готовых сценариев
Примеры готовых сценариев приведены в разделе Примеры сценариев
Справочник шагов сценария
Справочник возможных шагов сценария доступен в разделе Справочник шагов сценария
Старое описание привидено ниже для сохранения доступности ссылок:
Шаги установки переменных
установитьПеременную(*переменная, *значение) -
установитьПеременнуюВДиалог(*args) -
установитьПеременнуюПользователю(*переменная, *значение)
Шаги переписки с пользователями
сообщениеПользователю.сШаблоном(*сообщение)
задатьПользователюВопрос(*сообщение).сохранитьРезультат(*переменная)
запроситьФайл(*сообщение).сохранитьРезультат(*переменная)
Шаги работы с внешними сервисами
вызвать.внешнийСервис(*адрес, *тип).сохранитьРезультат(*args)
Сервисные шаги
если(*условие).то(*операции)
установитьМетку(*название)
перейтиНаМетку(*метка)
комментарий(*сообщение)
выполнитьJs(*скрипт)
Шаги управления диалогом
запросВБазыЗнаний(*args)
назначитьТематику(*идентификатор)
назначитьОператора(*логин)
Шаги генерации формы для оператора
добавитьПолеВФормуОператора(*args)
показатьФормуОператору(имя = "форма")
Шаги работы с группами
определитьИдентификаторГруппы(*переменная)
перевестиНаГруппу(*идентификатор).иЗавершить
перевестиНаГруппу(*идентификатор).иЗавершитьСНовымЗапросом(*запрос)
перевестиНаГруппу(*идентификатор).иЗавершитьИПеревестиНаОператора
Шаги завершения сценария
завершить
завершитьСНовымЗапросом("вопрос")
завершитьИПеревестиНаОператора
завершитьИЗакрытьДиалог()
Примеры сценариев
Сценарий с вызовом внешнего сервиса, разбором ответа в JS. | установитьПеременную("host_cities", "https://api.autofaq.ai/v1/query") + установитьПеременную("service_id", "121000") + установитьПеременную("service_token", "939b8") + установитьПеременную("other_score", "0.5") + задатьПользователюВопрос("Уточните ваш город, пожалуйста?").сохранитьРезультат("city")+ вызвать.внешнийСервис("{host_cities}", "POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8")).сТеломСообщения("{\"service_token\": \"{service_token}\",\"service_id\":{service_id},\"query\":\"{city}\"}").сохранитьРезультатКакСтроку("results")+ выполнитьJs(""" var result = JSON.parse(results); var score = 0.0; var answer = ''; if (result.results.length > 0) { answer = result.results[0]['answer']; score = result.results[0]['score']; answer = answer.replace(/\n/g,'<br>'); } var exit = {'answer':answer, 'score':score}; exit; """) + если("{http_code} > 210").то(завершитьСШаблоном("Что-то сломалось. Зайдите попозже."))+ если("{score} < {other_score}").то(завершитьСШаблоном("Вот в этом городе у нас ничего нет"))+ сообщениеПользователю.сШаблоном("В указанном городе можно приобрести по адресам: <br>{answer}")+ задатьПользователюВопрос("Все ок?").сВариантамиОтвета("Да", "А мне не выдают").сохранитьРезультат("what")+ если("{what} == Да").или("{what} == да").то(завершитьСШаблоном("ну и отлично. Всего хорошего!"))+ завершитьСНовымЗапросом("Перевести на оператора") |
Сценарий для интеграции на событие "Нажатие кнопки оператором" | комментарий("Запуск интеграции по кнопке.")+ установитьПеременнуюВДиалог("Поле 2", значение = "Field 2", название = "Поле 2", показыватьОператору = true, обязательное = true, редактируемое = false)+ установитьПеременную("priority", "{\"v1\": \"Blocker\", \"v2\": \"Critical\", \"v3\": \"Major\", \"v4\": \"Minor\"}") + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t1", название = "Что вам нужно сделать: ", тип = "Нередактируемый текст", значение = "Заполните форму" ) + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t2", название = "Название заявки", тип = "Однострочный редактируемый текст", описание = "Введите название заводимой заявки", значение = "Введите", обязательное = true ) + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t3", название = "Критичность", тип = "Выпадающий список", описание = "Выберите из списка критичность заявки", обязательное = true, значение = "v3", варианты = "{priority}" ) + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t4", название = "Описание", тип = "Многострочный редактируемый текст", описание = "Опишите вашу проблему", обязательное = true ) + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t5", название = "Уведомить руководителя?", тип = "Переключатель", обязательное = false ) + установитьПеременную("tags", "{\"v1\": \"Teacher\", \"v2\": \"Student\", \"v3\": \"Sales\", \"v4\": \"Tech\"}") + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t6", название = "Теги", тип = "Множественный выбор", описание = "Выберите теги, которыми пометить обращение", варианты = "{tags}", обязательное = true ) + добавитьПолеВФормуОператора( форма = "Заведение заявки в Jira", переменная = "t7", тип = "Целое число", название = "Частота возникновения проблемы", описание = "% пользователей, у которых возникает проблема" ) + показатьФормуОператору(имя = "Заведение заявки в Jira") + комментарий("Вот что у нас получилось: {t2}, {t3}, {t4}")+ комментарий("Конец сценария интеграции!") |