Переход по стейтам
Сценарий чат-бота описывается в виде текстового файла с древовидной структурой, где одни элементы сценария вложены в другие. Эти элементы называются стейтами — состояниями бота, в которые он может перейти в ходе диалога. Более общие стейты включают в себя стейты с более конкретной тематикой.
Случаи перехода в стейт
Переход в стейт происходит в следующих случаях:
-
Пользователь отправил запрос, который был обработан глобальным тегом
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. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.