Управление контекстом
noContext
Флаг noContext проставляется тегу state и принимает булево значение, по умолчанию false.
Если noContext=true, то система не изменяет контекст при переходе в стейт с этим флагом. В таком случае следующий запрос будет обработан в контексте предыдущего стейта.
Рассмотрим сценарий:
theme: /
state: Greeting
q!: * (прив*/добр* (~день/~утро/~вечер)) *
a: Привет! Как дела?
state: DoinGood
q: * (хорош*/норм*/замечательн*) *
a: Хорошо, что у вас все в порядке! Как я могу вам помочь?
state: DoinBad
q: * (плох*|не [очень] хорош*) *
a: Жаль это слышать. Может, я могу чем-то помочь?
state: CatchAll
event!: noMatch
a: Извините, я вас не понял. Попробуйте переформулировать.Поприветствуем чатбота, а затем на вопрос Как дела? ответим Я в порядке. Паттерн не предусматривает такого ответа, сценарий перейдет в стейт CatchAll, чатбот попросит переформулировать запрос. Ответим хорошо всё у меня. Несмотря на соответствие паттерну, запрос не будет распознан, потому что контекст диалога изменился, и вложенные стейты недоступны.
Проставим флаг noContext стейту CatchAll:
theme: /
state: Greeting
q!: * (прив*/добр* (~день/~утро/~вечер)) *
a: Привет! Как дела?
state: DoinGood
q: * (хорош*/норм*/замечательн*) *
a: Хорошо, что у вас все в порядке! Как я могу вам помочь?
state: DoinBad
q: * (плох*|не [очень] хорош*) *
a: Жаль это слышать. Может, я могу чем-то помочь?
state: CatchAll || noContext=true
event!: noMatch
a: Извините, я вас не понял. Попробуйте переформулировать.Теперь при попадании в стейт CatchAll контекст не изменится, следующий запрос будет обработан в рамках стейта Greeting. Таким образом, ответ хорошо всё у меня будет обработан в контексте вопроса Как дела? и попадет во вложенный стейт DoinGood.
Флаг noContext используется для того, чтобы не продвигать вперед контекст диалога. Обычно он используется в стейтах CatchAll, повторов реплик.
modal
Флаг modal проставляется тегу state и принимает булево значение, по умолчанию false.
Если modal=true, система обработает запрос в контексте этого стейта, то есть запрос может попасть только в один из его вложенных стейтов. Если среди вложенных стейтов не предусмотрен ответ и отсутствует локальный CatchAll, то система выдаст ошибку. Лог ошибки сообщит, что в сценарии не найден стейт для перехода.
Стейты с флагом modal=true используются, когда от клиента нужно получить важную информацию, без которой диалог не может продолжаться.
Рассмотрим сценарий:
theme: /
state: OrderStatus|| modal = true
q!: * (где|статус*) * ~заказ *
a: Здравствуйте! Назовите номер вашего заказа.
state: GetNumber
q: * $Number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу помочь?В этом сценарии пользователь хочет уточнить статус своего заказа, для этого от него требуется номер заказа. Флаг modal = true предотвращает выход диалога из контекста вопроса о номере заказа до получения необходимой информации.
Для выхода из модального стейта используйте тег go или флаг fromState.
Для избежания ошибок в диалоге включайте в сценарии LocalCatchAll.
fromState
Флаг fromState проставляется тегу q и определяет стейт, из которого возможен переход по данному паттерну.
Флаг fromState помогает адресовать вопрос из определенного контекста в нужный стейт без использования глобальных паттернов, а также покинуть модальный контекст по определенному запросу.
Пример использования:
theme: /
state: OrderStatus || modal = true
q!: * (где|статус*) * ~заказ *
a: Здравствуйте! Назовите номер вашего заказа.
state: GetNumber
q: * $Number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу вам помочь?
state: Question
q!: * [ответь мне на] (один/пару) вопрос* *
q: * [ответь мне на] (один/пару) вопрос* * || fromState = /OrderStatus
a: Конечно, я вас слушаю!Здесь клиент выходит из модального стейта, если у него возник вопрос к боту.
onlyThisState
Флаг onlyThisState проставляется тегу q и используется совместно с флагом fromState.
Если проставлен флаг onlyThisState=true, то переход по паттерну с этим флагом возможен только из стейта, указанного во флаге fromState, но не из вложенных стейтов.
Если флаг onlyThisState не указан, то переход может быть также осуществлен из вложенных по отношению к указанному во fromState стейтах.
Пример сценария:
theme: /
state: OrderStatus || modal = true
q!: * (где|статус*) * ~заказ *
a: Здравствуйте! Назовите номер вашего заказа.
state: GetNumber
q: * $Number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
a: Чем еще я могу вам помочь?
state: Question
q!: * [ответь мне на] (один/пару) вопрос* *
q: * [ответь мне на] (один/пару) вопрос* * || fromState = /OrderStatus, onlyThisState = true
a: Конечно, я вас слушаю!Если в примере для fromState в стейт /Question можно было перейти из /OrderStatus и /OrderStatus/LocalCatchAll, то теперь только из /OrderStatus.