Перейти к основному содержимому

Переход по стейтам

Сценарий чат-бота описывается в виде текстового файла с древовидной структурой, где одни элементы сценария вложены в другие. Эти элементы называются стейтами — состояниями бота, в которые он может перейти в ходе диалога. Более общие стейты включают в себя стейты с более конкретной тематикой.

Случаи перехода в стейт

Переход в стейт происходит в следующих случаях:

  • Пользователь отправил запрос, который был обработан глобальным тегом q! или intent!, либо произошло событие, на которое сработал тег event!. Переход по глобальному тегу возможен из любого другого стейта, за исключением модальных.

  • Пользователь отправил запрос, который был обработан локальным тегом q или intent, либо произошло событие, на которое сработал тег event. Переход по локальному тегу возможен только из ближайшего родительского, из соседних или дочерних стейтов.

  • Запрос или событие были обработаны локальным тегом q, intent или event с параметром fromState или toState. Этот параметр позволяет явно указать стейт, из которого или в который возможен переход по тегу.

  • В стейте сработал тег перехода в другой стейт go или go! либо вызван метод $reactions.transition.

подсказка
При использовании в одном сценарии паттернов и интентов теги q/q! срабатывают с большим приоритетом, чем intent/intent!. Подробнее о порядке срабатывания паттернов и интентов.

Приоритет правил активации

Когда бот находится в каком-либо стейте, он может перейти из него по любому тегу активации, который может сработать из этого стейта. Теги срабатывают в определенном порядке в зависимости от расстояния от текущего до целевого стейта: наибольший приоритет имеют дочерние стейты, затем соседние, затем родительские.

Таким образом, в разных стейтах могут быть объявлены теги активации с одинаковыми значениями, но срабатывать будут разные теги в зависимости от стейта, в котором находится бот. Рассмотрим сценарий:

patterns:
$Yes = (да/конечно)
$No = (нет/не/да ну)

theme: /

state: Start
q!: $regexp</start>
go!: ../MorningExercise

state: MorningExercise
a: Ты делаешь зарядку по утрам?

state: EveryDay
q: * $Yes *
a: Каждый день?

state: Yes
q: * $Yes *
a: Молодец!

state: No
q: * $No *
a: Зарядка должна стать привычкой!

state: No
q: * $No *
a: Зарядка пробуждает тело и мозг, поработай над собой!

Сценарий демонстрирует, как обрабатываются ответы пользователя да или нет в зависимости от текущего стейта. Рассмотрим процесс выполнения этого сценария:

  1. Запускается сценарий, тег реакции go! переводит диалог в стейт MorningExercise.
  2. В стейте MorningExercise бот задает вопрос Ты делаешь зарядку по утрам?.
  3. Бот остается в текущем стейте, в котором активны паттерны * $Yes * и * $No *.
  4. Пользователь отвечает да, и бот переходит в стейт MorningExercise/EveryDay. Далее бот спрашивает Каждый день? , активируется следующий набор паттернов.
  5. Следующий ответ пользователя интерпретируется в контексте стейта MorningExercise/EveryDay. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.