Выбор города
На этом шаге мы создадим конфигурационный файл бота, а также напишем основной сценарий бота. В нем бот будет предлагать клиенту выбрать город доставки с помощью двух кнопок Санкт-Петербург и Москва.
Конфигурационный файл
Создайте конфигурационный файл бота chatbot.yaml
:
# Название проекта
name: pizza-bot
# Точка входа
entryPoint:
- main.sc
# Параметры NLU:
botEngine: v2 # Версия диалогового движка
language: ru # Язык бота
nlp:
intentNoMatchThresholds:
phrases: 0.2
patterns: 0.2
Создание сценария
Создайте файл main.sc
в папке src
. В нем будет основной сценарий работы бота:
theme: /
state: Start
q!: $regex</start>
script:
$context.session = {};
$context.client = {};
$context.temp = {};
$context.response = {};
a: Привет! Я электронный помощник. Помогу вам заказать пиццу.
go!: /ChooseCity
state: ChooseCity || modal = true
a: Выберите свой город.
buttons:
"Санкт-Петербург" -> ./RememberCity
"Москва" -> ./RememberCity
state: RememberCity
script:
$client.city = $request.query;
$session.cart = [];
go!: /ChoosePizza
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
state: CatchAll || noContext=true
event!: noMatch
a: Я вас не понимаю.
Основной сценарий бота состоит из следующих стейтов:
Start
— начало работы. Бот приветствует пользователя и предлагает выбрать город для доставки.ChooseCity
— выбор города из двух предложенных вариантов.RememberCity
— «запоминание» выбранного города.ClickButtons
— подсказывает пользователю, что бот воспринимает только нажатие кнопок.CatchAll
— реагирует на любой непредусмотренный сценарием ответ пользователя.
Структура сценария
Start
В стейте Start
запускается сценарий. Бот посылает приветственное сообщение и предлагает помочь заказать пиццу.
state: Start
q!: $regex</start>
script:
$context.session = {};
$context.client = {};
$context.temp = {};
$context.response = {};
a: Привет! Я электронный помощник. Помогу вам заказать пиццу.
go!: /ChooseCity
Обнуляем переменные в скрипте для начала нового диалога, так как бот должен «забыть» ответы клиента из предыдущего диалога. Предыдущие ответы хранятся в переменных объекта $context
.
С помощью тега go!
осуществляется переход в стейт ChooseCity
.
ChooseCity
state: ChooseCity || modal = true
a: Выберите свой город.
buttons:
"Санкт-Петербург" -> ./RememberCity
"Москва" -> ./RememberCity
Клиент должен выбрать один из городов с помощью кнопок Санкт-Петербург и Москва. Они задаются с помощью тега buttons
.
Вложенные данные тега buttons
должны соответствовать шаблону: <json-node> -> <string>
. В левой части — строка или объект, определяющие текст или тело кнопки. В правой части — строка, определяющая путь перехода при нажатии кнопки. В нашем сценарии переход по нажатию осуществляется в стейт RememberCity
.
Флаг modal = true
используется для того, чтобы бот не мог перейти в следующее состояние, пока пользователь не выберет город.
RememberCity
state: RememberCity
script:
$client.city = $request.query;
$session.cart = [];
go!: /ChoosePizza
Выбор клиента будет обработан с помощью $request.query
и записан в переменную $client.city
. Бот будет предлагать последующие варианты ответов в зависимости от выбранного города.
С помощью тега go!
осуществляется переход в стейт ChoosePizza
, работа которого будет описана в следующих шагах.
ClickButtons
state: ClickButtons
q: *
a: Нажмите, пожалуйста, кнопку.
go!: ..
Стейт ClickButtons
реагирует на любой текстовый ввод клиента и выводит ответ Нажмите, пожалуйста, кнопку
. Оно необходимо, так как modal=true
не дает текстовому вводу попасть в глобальный CatchAll
. Затем осуществляем переход в состояние на уровень выше go!: ..
, так как нам важно, чтобы клиент выбрал город.
CatchAll
state: CatchAll || noContext=true
event!: noMatch
a: Я вас не понимаю.
Стоит помнить, что люди могут ошибаться, набирая команды, и присылать боту текст, отличающийся от всех учтенных вариантов. Для этого используется стейт CatchAll
, который обрабатывает сценарий в случае, когда сообщение клиента не подходит ни под один описанный стейт.
Воспользуемся флагом noContext = true
, чтобы контекст не изменился при попадании в стейт CatchAll
.