Как вернуться в предыдущий стейт после попадания в глобальный интент?
Логика в Aimylogic
Один из вопросов, который периодически задают пользователи Aimylogic: как вернуть бота в логику сценария после того, как он отреагировал на интент, доступный из любой точки сценария?
Действительно при попадании в глобальный интент в Aimylogic нет очевидной возможности сделать “шаг назад” в ходе сценария. Данная особенность не является ограничением, ниже мы привели другие способы перемещения по логике сценария.
1. Использовать функцию FAQ — базы знаний бота — вместо глобальных интентов
База знаний — база ответов на часто задаваемые вопросы — поможет, если вы хотите, чтобы бот отвечал на определённые вопросы из любого места сценария, оставаясь при этом в контексте беседы. Рассмотрим пример ниже:
Здесь бот проводит с пользователем викторину. Он задаёт ему вопрос и ожидает ответа. В это время пользователь задаёт свой вопрос (который внесён в базу знаний FAQ), и робот отвечает на него. После этого клиент отвечает на предыдущий вопрос бота. Бот помнит контекст, он не сбивается и валидирует правильность ответа.
2. Использовать блок “Код”
Если всё же необходимо возвращаться в сценарий из глобального интента, то необходимо будет добавить на каждый экран блок “Код”, в котором присваивать какой-то переменной номер экрана. После перехода в глобальный экран проверять блоком “Условия” значение переменной и в зависимости от значения отправлять на нужный экран. Ниже представлен пример реализации такого решения, а также пример диалога с ботом.
3. Использовать кнопки для упрощённой навигации по разделам
Если функция базы знаний FAQ вам по какой-то причине не подходит, вы можете вернуться в определённый раздел сценария по кнопкам:
В данном примере пользователь прерывает логику бота и попадает в глобальный интент. Далее по кнопкам пользователь может вернуться в интересующий его раздел
Логика в JAICP
Под тэгом init
, который задаётся перед тем, как задана theme
, используйте обработчик postProcess
:
init:
bind("postProcess", function($context) {
$context.session.lastState = $context.currentState;
});
Как видно, здесь используется встроенная переменная $context
, с помощью которой мы сохраняем путь к последнему сработавшему стейту. Подробнее об этой переменной в статье.
Проверочный стейт может выглядеть следующим образом:
state: teststate
q: тест
a: работает
go!: {{$context.session.lastState}}