Переход по стейтам
Сценарий чат-бота описывается в виде текстового файла с древовидной структурой, где одни элементы сценария вложены в другие. Эти элементы называются стейтами — состояниями бота, в которые он может перейти в ходе диалога. Более общие стейты включают в себя стейты с более конкретной тематикой.
Случаи перехода в стейт
Переход в стейт происходит в следующих случаях:
-
Пользователь отправил запрос, который был обработан глобальным тегом
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: Зарядка пробуждает тело и мозг, поработай над собой!
Сценарий демонстрирует, как обрабатываются ответы пользователя да или нет в зависимости от текущего стейта. Рассмотрим процесс выполнения этого сценария:
- Запускается сценарий, тег реакции
go!
переводит диалог в стейтMorningExercise
. - В стейте
MorningExercise
бот задает вопрос Ты делаешь зарядку по утрам?. - Бот остается в текущем стейте, в котором активны паттерны
* $Yes *
и* $No *
. - Пользователь отвечает да, и бот переходит в стейт
MorningExercise/EveryDay
. Далее бот спрашивает Каждый день? , активируется следующий набор паттернов. - Следующий ответ пользователя интерпретируется в контексте стейта
MorningExercise/EveryDay
. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.