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

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

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

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

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

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

    к сведению

    Глобальные теги работают так, как будто стейт находится в корне сценария — /.

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

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

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

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

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

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

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

  1. дочерние стейты;
  2. соседние стейты;
  3. родительские стейты.

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

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. Ответы активируют паттерны вложенных стейтов, так как они имеют больший приоритет.