Как вернуться в предыдущий стейт после попадания в глобальный интент?


Рассказывает руководитель 1 линии техподдержки Маша Орлова

  1. Логика в Aimylogic
  2. Логика в JAICP

Логика в Aimylogic

Один из вопросов, который периодически задают пользователи Aimylogic: как вернуть бота в логику сценария после того, как он отреагировал на интент, доступный из любой точки сценария?

Действительно при попадании в глобальный интент в Aimylogic нет очевидной возможности сделать “шаг назад” в ходе сценария. Данная особенность не является ограничением, ниже мы привели другие способы перемещения по логике сценария.

1. Использовать функцию FAQ — базы знаний бота — вместо глобальных интентов

База знаний — база ответов на часто задаваемые вопросы — поможет, если вы хотите, чтобы бот отвечал на определённые вопросы из любого места сценария, оставаясь при этом в контексте беседы. Рассмотрим пример ниже:

5

Здесь бот проводит с пользователем викторину. Он задаёт ему вопрос и ожидает ответа. В это время пользователь задаёт свой вопрос (который внесён в базу знаний FAQ), и робот отвечает на него. После этого клиент отвечает на предыдущий вопрос бота. Бот помнит контекст, он не сбивается и валидирует правильность ответа.

2. Использовать блок “Код”

Если всё же необходимо возвращаться в сценарий из глобального интента, то необходимо будет добавить на каждый экран блок “Код”, в котором присваивать какой-то переменной номер экрана. После перехода в глобальный экран проверять блоком “Условия” значение переменной и в зависимости от значения отправлять на нужный экран. Ниже представлен пример реализации такого решения, а также пример диалога с ботом.

111

222

3. Использовать кнопки для упрощённой навигации по разделам

Если функция базы знаний FAQ вам по какой-то причине не подходит, вы можете вернуться в определённый раздел сценария по кнопкам:

8

В данном примере пользователь прерывает логику бота и попадает в глобальный интент. Далее по кнопкам пользователь может вернуться в интересующий его раздел

Логика в JAICP

Под тэгом init, который задаётся перед тем, как задана theme, используйте обработчик postProcess:

init:
   bind("postProcess", function($context) {
       $context.session.lastState = $context.currentState;
   });

Как видно, здесь используется встроенная переменная $context, с помощью которой мы сохраняем путь к последнему сработавшему стейту. Подробнее об этой переменной в статье.

Проверочный стейт может выглядеть следующим образом:

   state: teststate
       q: тест
       a: работает
       go!: {{$context.session.lastState}}