Table of Contents |
---|
...
|
Общее описание
Сценарии позволяют описывать диалоги системы autoFAQ с пользователями. Диалог может включать в себя переписку с пользователем, обращение к данным во внешних системах и обогащение ответов.
Система позволяет создавать сценарии
...
произвольной сложности и прикреплять их напрямую к документам в базах знаний или событиям в работе над диалогами. В случае когда база знаний по запросу пользователя определяет документ, содержащий вместо ответа сценарий, бот начнет вести с пользователем описанный в сценарии диалог.
Описание сценариев в системе ведется при помощи языка DSL autoFAQ. Тело сценария состоит из последовательных операций. Каждая операция располагается в отдельной строке, для связи со следующей операцией в конце строки требуется указание символа "+". Некоторые операции могут содержать 1 или несколько опциональных модификаторов.
...
Полный справочник шагов описан в разделе Справочник шагов сценария
Примеры готовых сценариев доступны в разделе Примеры сценариев
...
Переменные
Встроенные переменные
Для работы с
...
данными в сценариях доступны следующие
...
встроенные переменные:
Code Block | ||
---|---|---|
| ||
{platformInMessageQuery} - текст первоначального запроса пользователя, по которому был создан диалог с AutoFAQ {serviceId} - id сервиса Данные пользователя {userFullName} - имя пользователя |
...
{userLogin} - логин пользователя |
...
{userEmail} - электронная почта пользователя {userPhone} - номер телефона пользователя { |
...
userId} - ID пользователя {userPayload.*} - хранилище дополнительных данных о пользователе Данные пользовательского канала, через который пришел текущий запрос {channelId} - идентификатор канала {channelType} - тип канала (Telegram, WhatsApp, Widget) Данные текущего диалога с пользователем {conversation} - объект диалог с данными о пользователе, |
...
списокм событий |
...
и |
...
реплик пользователя |
...
, бота и операторов {conversationId} - идентификатор текущего диалога {externalFiles} - список файлов переданных пользователю или полученных от него в рамках текущего диалога Встроенные переменные для работы с API вызовами {http_code} - |
...
код статуса последнего |
...
API запроса |
Встроенные переменные можно не объявлять, их значение доступно в любом сценарии. Данные пользователя могут отсутствовать, если в сервисе не настроена Идентификация или иной метод получения данных о пользователях.
Пользовательские переменные
В сценариях возможно создавать и использовать для хранения данных
...
пользовательские переменные трех типов:
переменные сценария
переменные диалога
переменные пользователя
Любая переменная можент быть создана или изменена ботом в любом сценарии. Значение переменной сценария будет потеряно после завершения того сценария
...
Code Block |
---|
{userSaidYes} - пример пользовательской переменной |
Списки
...
, в котором она была создана. Значение переменной диалога будет доступно в любом сценарии в рамках текущего диалога. В новом диалоге эту переменную надо определять заново и ее значение может быть другим. Значение переменной пользователя сохраняется от диалога к диалогу. Если значение переменной пользователя поменяется, то это отразится на всех диалогах.
Ко всем переменным можно обратиться через указание названия переменной в обрамлении фигурными скобками {userSaid}
:
Code Block | ||
---|---|---|
| ||
сообщениеПользователю.сШаблоном("Текст сообщения: {userSaid}") + |
Детальнее об определении переменных смотрите в разделе Установка переменных
Переменные могут хранить не одно, а сразу несколько значений. Переменная, объявленная как attachments[]
хранит не одно значение, а список значений, при записи новых значений в данную переменная они будут дописаны в конец списка.
Code Block |
---|
...
| ||
запроситьФайл("Приложите файл").сохранитьРезультат("files[]") |
...
+ |
Справочник шагов сценария
Справочник возможных шагов сценария доступен в разделе Справочник шагов сценария
Порядок выполнения шагов сценария
...
Все шаги сценария выполняются последовательно с первой до последней строки. Если вы хотите временно исключить одну из строк из процесса выполнения сценария - установите в начале данной строки символ //
Code Block | ||
---|---|---|
| ||
сообщениеПользователю.сШаблоном("Привет")+ - шаг будет выполнен
//сообщениеПользователю.сШаблоном("Привет, {userFullName}")+ - шаг не будет выполнен |
В конце сценария обязательно размещение одного из шагов завершения сценария:
Code Block | ||||
---|---|---|---|---|
| ||||
завершить - завершение сценария
завершитьСШаблоном("Пока!") - завершение сценария с выводом сообщения пользователю
завершитьСНовымЗапросом("Новый запрос") - завершение сценария и одновременный запуск в работу нового сообщения
завершитьИПеревестиНаОператора - звершение сценария и перевод диалога в очередь оператору
завершитьИЗакрытьДиалог() - завершение сценария и закрытие диалога, следующая реплика пользователя начнет новый диалог |
Если в условии сценария применен один из шагов завершения, то сценарий может завершить работу досрочно:
Code Block | ||
---|---|---|
| ||
если("{http_code} != 200").то(
комментарий("Данные пользователя не обновлены")+
завершитьИПеревестиНаОператора
)+
комментарий("Обовлены данные пользователя. Новые данные отправлены в CRM")+
|
...
Список команд языка DSL
сообщениеПользователю.сШаблоном("сообщение")
Вывод простого текстового сообщения пользователю без ожидания ответной реакции.
Сообщение может содержать HTML форматирование, а также использовать вставку значений переменных. Сообщение будет передано в текущий открытый диалог, в тот же канал. Система самостоятельно проверит форматирование сообщения на соответствие требованиям канала.
Code Block | ||
---|---|---|
| ||
сообщениеПользователю.сШаблоном("Текст сообщения")+ вывод простого текстового сообщения
сообщениеПользователю.сШаблоном("Сообщение от {userFullName}")+ вывод текстового сообщения с использованием данных из переменной
сообщениеПользователю.сШаблоном("Пройдите по <a href='https://yandex.ru'>ссылке</a>")+ вывод HTML форматированного сообщения |
сообщениеПользователю.сФайлами(111).сШаблоном("сообщение")
Расширением предыдущей команды служит часть ".сФайлами", которая позволяет отправить пользователю файлы из текущего документа.
Code Block | ||
---|---|---|
| ||
сообщениеПользователю.сФайлами(523).сШаблоном("Высылаю файл") - отправка файла с идентификатором 523 пользователю вместе с сопровождающим текстом
сообщениеПользователю.сФайлами(523, 524, 525).сШаблоном("Высылаю файл") - отправка нескольких файлов пользователю
сообщениеПользователю.сФайлами(523).сШаблоном("") - отправка файла пользователю без сопровождающего текста |
Идентификатор файла копируется из формы прикладывания файла к документу.
...
Info |
---|
Передача файлов пользователю поддерживается только для сценариев в документах баз знаний и не поддерживается для сценариев приветствия и интеграций. |
задатьПользователюВопрос("сообщение")
Вывод текстовой информации и ожидание ввода пользователя. Поддерживает вывод форматированного сообщения с использованием переменных, получение и проверку данных на соответствие шаблону. Время ожидания ответа от пользователя устанавливается таймером сценариев в разделе Настройки - Запросы - Сценарии.
Code Block | ||
---|---|---|
| ||
задатьПользователюВопрос("На какую дату нужен пропуск ?").сохранитьРезультат("day)+ |
Система будет ожидать ответ пользователя все время жизни сценария. Время жизни сценария устанавливается в разделе Настройки - Запросы - Сценарии.
Функции операции:
.сВариантамиОтвета(варианты) - функция предоставляет пользователю варианты выбора из списка. В случае если канал позволяет отображать кнопки - варианты будет представлены кнопками, в противном случае варианты будут представлены автоматически сгенерированным списком. При этом пользователь сохраняет возможность написать ответ вручную минуя варианты выбора.
Code Block | ||
---|---|---|
| ||
задатьПользователюВопрос("На какую дату нужен пропуск ?").сВариантамиОтвета("Сегодня", "Завтра").сохранитьРезультат("day")+ |
.проверитьФормат(формат, сообщение) - функция проверяет полученные от пользователя данные на соответствие шаблону. Шаблон задается регулярным выражением. В случае соответствия ответной реплики пользователя шаблону шаг передает данные далее, в обратном случае - выводит текст сообщения и ожидает получения корректной информации без ограничений по количеству попыток ввода.
Code Block | ||
---|---|---|
| ||
// выражение для проверки, что введенная строка соотвествует формату даты вида 02.12.2021
задатьПользователюВопрос("Укажите дату").проверитьФормат("(0[1-9]|[12][0-9]|3[01])[- \/.](0[1-9]|1[012])[- \/.](19|20)\\d\\d", "Не понял вас, повторите пожалуйста.").сохранитьРезультат("day")+
// выражение для проверки, что введенная строка содержит адрес электронной почты
задатьПользователюВопрос("Напишите email").проверитьФормат("^\\S+@\\S+\\.[a-z]{2,}$", "Пожалуйста, введите корректный email").сохранитьРезультат("_email")+ |
.сохранитьРезультат(переменная) - функция сохраняет полученные данные в переменную для дальнейшего использования в сценарии.
Code Block | ||
---|---|---|
| ||
задатьПользователюВопрос("Как дела?").сохранитьРезультат("what")+
если("{what} != Хорошо").то(
комментарий("А дела то не хорошо")+
завершитьИПеревестиНаОператора
)+
комментарий("Все отлично")+
завершить |
вызвать
Вызывает внешние команды и системы. В настоящее время поддерживается только к HTTP(REST и SOAP) сервисам, планируется подключение к почтовым , FTP и прочим сервисам
Функции операции:
.внешнийСервис(адрес, тип) - обязательная функция, которая формирует вызов API сервисов. В параметрах указывается адрес сервиса и тип запроса. Поддерживаются основные HTTP запросы - GET, POST, PUT.
Code Block | ||
---|---|---|
| ||
вызвать.внешнийСервис("https://api.autofaq.ai/v1/ping","GET").сохранитьРезультат("result")+ |
.сПараметрами() - необязательная функция, передает в запрос список параметров адресной строки, параметры будут собраны в соответствующий запросу формат
Code Block | ||
---|---|---|
| ||
вызвать.внешнийСервис("https://server.com/api","GET").сПараметрами(("foo","bar"),("user_token","1234567")).сохранитьРезультат("result")+ |
.сЗаголовками() - необязательная функция, передает в запрос список заголовков в формате пар ключ:значение
Code Block | ||
---|---|---|
| ||
вызвать.внешнийСервис("https://server.com/api", "POST").сЗаголовками(("Content-Type", "application/json"),("charset", "utf-8"),("Authorization","Bearer {user_token}")).сохранитьРезультат("result")+ |
.сТеломСообщения() - необязательная функция, передает тело запроса. Поддерживаются форматы x-www-form-urlencoded и json
Code Block | ||
---|---|---|
| ||
// передача JSON в виде строки
вызвать.внешнийСервис("https://server.com/api", "POST").сЗаголовками(("Content-Type", "application/json")).сТеломСообщения("{\"name\":\"new document\", \"question\":\"new question\"}")+
// передача x-www-form-urlencoded
вызвать.внешнийСервис("https://server.com/api", "POST").сЗаголовками(("Content-Type", "application/x-www-form-urlencoded")).сТеломСообщения("name=new document, question=new question")+ |
.сСоставнымТеломСообщения() - необязательная функция, передает multipart тело запроса для передачи файлов. При передаче файла можно указать либо полное название файла либо идентификатор файла в файловом хранилище диалога
Code Block | ||
---|---|---|
| ||
// передача файла через указание пути
вызвать.внешнийСервис("https://server.com/api", "POST").сСоставнымТеломСообщения(("content" -> "C:/docker.yml")).сохранитьРезультат("callRes")+
// передача файла через идентификатор в хранилище
вызвать.внешнийСервис("{post_url}", "POST").сЗаголовками(("apikey","{apikey_var}")).сСоставнымТеломСообщения(("content" -> "{fileId}"),("type" -> "addAttach")).сохранитьРезультатКакСтроку("callRes")+ |
.сохранитьРезультат() - функция обрабатывает полученный ответ в формате JSON, сохраняет значения указанных полей в переменные сценария. Функция обрабатывает каждое значение ключа ответа и сохраняет его в отдельной переменной. В качестве параметров команды указываются пары ключ ответа - переменная
Code Block | ||
---|---|---|
| ||
вызвать.внешнийСервис("{post_url}", "POST").сТеломСообщения("{query}").сохранитьРезультат(("message", "response_message"),("code", "response_code"))+ |
.сохранитьРезультатКакСтроку() - функция обрабатывает полученный ответ в формате JSON и сохраняет сериализованный в текст ответ целиком в переменную. Содержание переменной может быть разобрано далее по ходу сценария.
Code Block | ||
---|---|---|
| ||
// запрос и сохранение результата в строку
вызвать.внешнийСервис("{post_url}", "POST").сТеломСообщения("{query}").сохранитьРезультатКакСтроку("answer")+
// разбор ответа в JS коде (рассмотрено ниже)
выполнитьJs("""
try {
var answerParsed = JSON.parse(answer);
} catch(err) {
var answerParsed = {'results':[]};
}
var resultsLength = answerParsed.results.length;
var exit = {'resultsLength ':resultsLength};
exit;
""") + |
установитьПеременную(переменная, значение)
Операция установки значений переменной, старое значение будет затерто. При указании значения допускается использование переменных. Переменная будет доступна только в рамках выполняемого сценария.
Code Block | ||
---|---|---|
| ||
установитьПеременную("date", "Сегодня {new_date}")+ |
установитьПеременнуюВДиалог(*аргументы)
Операция установки переменной для всего диалога. При указании значения допускается использование переменных. Переменная диалога сохраняет свое значение на протяжении всего диалога, может быть создана и прочтена в рамках любого сценария. В новом диалоге будет отсуствовать.
Может быть использована для хранения информации связанной с контекстом диалога, для хранения контекста пользователя в рамках всех диалогов необходимо воспользоваться созданием переменной пользователя.
Code Block | ||
---|---|---|
| ||
установитьПеременнуюВДиалог(
ключ = "priority", - системное название задаваемой переменной, любой текст
значение = "[\"v1\", \"v2\"]", - значение, может быть пустым
название = "Выберите критичность", - название, которое будет отображаться в интерфейсе, строка
редактируемое = true, - является ли поле редактируемым или нет, true/false
показыватьОператору = true, - показывать ли оператору в боковой панели, true/false
обязательное = true, - является ли обязательным для заполнения при закрытии диалога, true/false
множественныйВыбор = true, - можно ли выбрать несколько вариантов, применимо только для выпадающего списка, true/false
тип = "Выпадающий список", - тип задаваемой переменной, возможные значения в таблице ниже
варианты = "{\"v1\": \"High\", \"v2\": \"Medium\"}" - список возможных значений, применимо только для выпадающего списка, можно задать как с помощью другой переменной, так и напрямую
)+ |
Список возможных типов с примерами использования:
...
Тип
...
Пример использования
...
Текст
...
Code Block |
---|
установитьПеременнуюВДиалог(
ключ = "NonEditabletext",
значение = "Нередактируемый текст",
название = "Примечание",
показыватьОператору = true,
редактируемое = false,
обязательное = false,
тип = "Текст"
) |
Code Block |
---|
установитьПеременнуюВДиалог(
ключ = "textField",
значение = "г.Москва Ул.Тверская",
название = "Адрес",
показыватьОператору = true,
редактируемое = true,
обязательное = true,
тип = "Текст"
) |
...
Число
...
Code Block |
---|
установитьПеременнуюВДиалог(
ключ = "number",
значение = "",
название = "Возраст",
показыватьОператору = true,
редактируемое = true,
обязательное = true,
тип = "Число"
) |
...
Выпадающий список
...
Code Block |
---|
установитьПеременную("priority", "{\"v1\": \"Blocker\", \"v2\": \"Critical\", \"v3\": \"Major\", \"v4\": \"Minor\"}")+
установитьПеременнуюВДиалог(
ключ = "priority",
значение = "[\"v1\", \"v2\"]",
название = "Выберите критичность",
редактируемое = true,
показыватьОператору = true,
обязательное = true,
множественныйВыбор = true,
тип = "Выпадающий список",
варианты = "{priority}"
) |
Code Block |
---|
установитьПеременнуюВДиалог(
ключ = "severity",
значение = "",
название = "Выберите важность",
редактируемое = true,
показыватьОператору = true,
обязательное = true,
тип = "Выпадающий список",
варианты = "{\"v1\": \"High\", \"v2\": \"Medium\", \"v3\": \"Low\"}"
) |
...
Переключатель
...
Code Block |
---|
установитьПеременнуюВДиалог(
ключ = "switcher",
значение = "true",
название = "Активный?",
показыватьОператору = true,
редактируемое = true,
обязательное = true,
тип = "Переключатель"
) |
установитьПеременнуюПользователю(переменная, значение)
Операция установки переменной дляпользователя. При указании значения допускается использование переменных. Переменная пользователя сохраняет свое значение до тех пор пока не будет очищена. Может быть создана и наполнена в любом сценарии. После создания переменная будет доступна в любом сенарии любого диалога.
Можно установить значение одной из фиксированных переменных пользователя или произвольной переменной в составе payload. Сохранение данных пользователя позволит передавать данные между разными диалогами.
Code Block |
---|
// установка фиксированной переменной
установитьПеременнуюПользователю("userEmail", "vasya@mail.ru")+
// установка переменной из payload
установитьПеременнуюПользователю("userPayload.lastLoginTS", "{nowTimeStamp}")+ |
если(условие)
Операция сравнения переменных. Доступны операции сравнения: равенство (==), больше (>), меньше (<), неравенство (!=).
Функции операции:
.то(список операций) - обязательный блок операций, которые будут выполнены в случае истинности проверки
Code Block | ||
---|---|---|
| ||
если("{error} == 1").то(сообщениеПользователю.сШаблоном("Система не работает"))+ |
Блок операций может состоять из нескольких операций, различные операции в блоке соединены знаком “+”, последняя операция в блоке не должна содержать “+“
Code Block | ||
---|---|---|
| ||
если("{when_error} == 1").то(
задатьПользователюВопрос("Не разобрал дату. Введи пожалуйста еще раз").сохранитьРезультат("when")+
вызвать.внешнийСервис("http://yandex.ru", "GET").сПараметрами(("text","{when}")).сЗаголовками().сохранитьРезультат(("name", "when"))
)+ |
.и(условие) - функция объединения условий
Code Block | ||
---|---|---|
| ||
если("{error} == 0").и("{connection_mistakes} == 0").то(сообщениеПользователю.сШаблоном("Система работает"))+ |
.или(условие) - функция выполняет дизъюнкцию условий
Code Block | ||
---|---|---|
| ||
если("{error} == 1").или("{connection_mistakes} == 1").то(сообщениеПользователю.сШаблоном("Система не отвечает"))+ |
запроситьФайл("сообщение")
Процедура получения файла и записи его в переменную. Пользователю будет выведен текст сообщения. Файл будет сохранен в хранилище файлов диалога.
Code Block | ||
---|---|---|
| ||
запроситьФайл("Приложите файл")+ |
Функции операции:
.можноПропустить(сообщение) - функция позволяет пользователю пропустить отправку файла
Code Block | ||
---|---|---|
| ||
запроситьФайл("Приложите файл").можноПропустить("Пропустить")+ |
.сохранитьРезультат(переменная) - функция сохраняет идентификатор полученного файла в переменную
Code Block | ||
---|---|---|
| ||
запроситьФайл("Приложи файл").сохранитьРезультат("file")+ |
установитьМетку()
Установка определенной метки в коде, чтобы потом в нее можно было перейти из любого места сценария.
Code Block | ||
---|---|---|
| ||
установитьМетку("раз")+ |
перейтиНаМетку()
Осуществить переход на установленную метку в сценарии.
Code Block | ||
---|---|---|
| ||
// перети на метку не более 3 раз, на 4 раз шаг перехода не сработает
перейтиНаМетку("раз").неБольше(3)+
// переход на метку без указания лимита переходов, используется значение по-умолчанию 1-
перейтиНаМетку("раз")+ |
запросВБазыЗнаний(вопрос, переменная)
Проверка наличия у системы автоматического ответа на указанный запрос. Если в базах знаний есть ответ, который удовлетворяет требованиям по точности, переменной будет присвоено значение true, если ответа нет - false.
Code Block | ||
---|---|---|
| ||
запросВБазыЗнаний("Как купить слона", "botKnows")+
если("{botKnows} == true").то(
сообщениеПользователю.сШаблоном("Ответ есть")
)+ |
комментарий("сообщение")
Команда позволяет добавлять комментарий в диалог. Комментарий виден администраторам и операторам системы, пользователь не видит комментарии.
Code Block | ||
---|---|---|
| ||
комментарий("текст комментария")+ |
выполнитьJs(скрипт)
Выполнить произвольный скрипт на JavaScript. Шаг позволяет реализовать произвольную логику вычислений или разбор сложных объектов.
Info |
---|
Javascript VM сответствует ECMAScript 5.1 Используйте обычный синтаксис callback function поскольку не поддерживается синтаксис lambda функций ES6 |
JS скрипт имеет доступ ко всем переменным сценария. Результаты скрипта следует записать в JSON объект и передать его на выход, в DSL сценарии можно будет получить к ним доступ по названиям полей.
Code Block | ||
---|---|---|
| ||
выполнитьJs("""
var uids = JSON.parse(results);
var ln = uids.length;
if (ln == 0) {var uuid = '';} else {var uuid = uids[0]["UUID"];}
var exit = {'uuid':uuid, 'numberOfUids':ln};
exit;
""") +
завершитьСШаблоном("Заявка создана, всего создано полей {numberOfUids}, первый id - {uuid}.") |
Внутри JavaScript есть возможность получить данные об операторе для случая, когда запущен сценарий на интеграцию по кнопке. Название объекта - initByOperator
.
Пример использования:
Code Block | ||
---|---|---|
| ||
выполнитьJs("""
var initByOperator = JSON.parse(initByOperator);
var initByOperatorLogin = initByOperator.login;
var exit = {'operatorLogin ': initByOperatorLogin, 'operatorFIO': initByOperator.fullName, 'operatorEmail': initByOperator.email};
exit;
""")+
комментарий("ФИО оператора: {operatorFIO}") +
комментарий("Логин оператора: {operatorLogin}") +
комментарий("Email оператора: {operatorEmail}") + |
Весь список параметров, к которым можно получить доступ:
id: String, login: String, fullName: Option[String], isActive: Boolean, isNotify: Boolean, serviceId: String, actions: Seq[UserRoleType], email: Option[String], settings: UserSettings = UserSettings()
knowledgeBases: Seq[Long] = Seq.empty, autoAssignEnabled: Boolean = false
добавитьПолеВФормуОператора(*args)
Для конструирования формы, которая будет показана оператору в момент работы сценария интеграции, добавлена команда добавитьПолеВФормуОператора со следующими параметрами:
Code Block | ||
---|---|---|
| ||
форма: String, - имя формы - обязательный параметр
переменная: String, - имя переменнной, которая пойдет в сценарий и имя в html form - обязательный параметр
название: String - имя на форме,
тип: String - Тип HTML ввода - обязательный параметр, если не задано или неверное -> нередактируемый текст
описание: String - описание на форме,
значение: String - предопределенное значение,
обязательное: Boolean - обязательность - по-умолчанию - false,
варианты: String - варианы для выпадающих списков - пример - {\"v1\": \"l1\", \"v2\": \"l2\"} |
Пример:
Code Block | ||
---|---|---|
| ||
добавитьПолеВФормуОператора(
форма = "Заведение заявки в Jira",
переменная = "t6",
название = "Теги",
тип = "Множественный выбор",
описание = "Выберите теги, которыми пометить обращение",
варианты = "{tags}",
обязательное = true
) |
Список возможных значений параметра "тип":
"Нередактируемый текст"
"Однострочный редактируемый текст"
"Многострочный редактируемый текст"
"Переключатель"
"Целое число"
"Выпадающий список"
"Множественный выбор"
показатьФормуОператору(имя = "форма")
После того, как все поля формы заданы, нужно использовать команду для показа формы. Сценарий отобразит форму и продолжит свою работу только после того как оператор нажмет кнопку Продолжить на форме или не закончится таймер сценария.
Code Block |
---|
показатьФормуОператору(имя = "Заведение заявки в Jira") |
завершитьСШаблоном("сообщение")
Операция завершения сценария. Если сообщение указано - перед остановкой сценария пользователю будет выведен текст сообщения.
Code Block | ||
---|---|---|
| ||
завершитьСШаблоном("Всего хорошего, {userFullName}")+ |
Code Block | ||
---|---|---|
| ||
вызвать.внешнийСервис("{url}", "POST").сПараметрами(("accessKey", "{accessKey}")).сТеломСообщения("{"email":"{myEmail}"}").сохранитьРезультатКакСтроку("res")+
если("{http_code} > 210").то(
завершитьСШаблоном("Не смог выполнить запрос. Ошибка:<br>{res}")
)+ |
завершитьСНовымЗапросом("вопрос")
Операция завершения текущего сценария и вызова другого документа по запросу в бота. После завершения этого сценария, но в рамках текущей сессии боту будет передан приведенный запрос. Запрос будет обработан по стандартной процедуре, так как если бы этот запрос написал пользователь. Если результатом поиска по данному запросу будет документ с ответом в виде сценария, то по завершении текущего сценария будет сразу запущен следующий сценарий.
Code Block | ||
---|---|---|
| ||
задатьПользователюВопрос("Что еще вы хотели узнать ?").сохранитьРезультат("what")+
завершитьСНовымЗапросом("{what}") |
завершитьИПеревестиНаОператора
Операция завершения текущего сценария и перевода диалога в очередь оператору. Запрос будет обработан по стандартной процедуре, так как если бы этот запрос написал пользователь и он сразу попал в очередь оператору.
Code Block |
---|
сообщениеПользователю.сШаблоном("Переключаю диалог на оператора")+
завершитьИПеревестиНаОператора |
завершитьИЗакрытьДиалог()
Операция завершения текущего сценария и закрытия всего диалога. Следующая реплика пользователя создаст новый диалог.
Code Block |
---|
// проверка валидности пароля
если("{checkPassword} == 0").то(
комментарий("Пользователь ввел неверный пароль")+
сообщениеПользователю.сШаблоном("Вам сюда нельзя. Пока.")+
завершитьИЗакрытьДиалог()
)+
сообщениеПользователю.сШаблоном("Все хорошо, продолжаем")+
завершить |
...
Сценарий с вызовом внешнего сервиса, разбором ответа в JS.
...
Code Block |
---|
установитьПеременную("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} == да").то(завершитьСШаблоном("ну и отлично. Всего хорошего!"))+
завершитьСНовымЗапросом("Перевести на оператора") |
...
Сценарий для интеграции на событие "Нажатие кнопки оператором"
...
завершитьПроверка синтаксиса сценария |
Проверка синтаксиса сценария
На странице документа базы знаний есть кнопка “Проверить сценарий”, которая запускает синтаксическую проверку указанного сценария.
Если в сценарии найдены ошибки, тогда открывается модальное окно с перечислением найденных ошибок. Синтаксический анализатор имеет ряд ограничений при описании найденных ошибок - не всегда имеется возможность указать номер строки, не все типы ошибок снабжены русским описанием.
Примеры готовых сценариев
Примеры готовых сценариев приведены в разделе Примеры сценариев