state
Декларативный тег state
объявляет стейт — состояние, в котором может находиться контекст диалога.
theme
.Значение
После тега записывается название стейта. Название может содержать любые символы Unicode.
Вложенные данные
На уровне вложенности, следующем после объявления стейта, могут записываться теги активации, теги реакций и теги действий. Они определяют то, как контекст диалога может попасть в стейт и какие реакции выполнит бот.
Кроме того, в теги state
могут быть рекурсивно вложены другие теги state
.
Таким образом задается древовидная структура сценария, где одни стейты вложены в другие.
Примеры использования
require: name/name.sc
module = sys.zb-common
theme: /
state: Start
q!: $regex</start>
a: Здравствуйте! Как вас зовут?
state: GetName
q: * $Name *
a: Очень приятно, {{capitalize($parseTree._Name.name)}}!
state: NoMatch
event: noMatch
a: Извините, я вас не понял.
Start
является родительским для стейта GetName
. Стейты, вложенные в родительские, называются дочерними.Параметры
Параметры — пары «ключ — значение», которые отделяются от названия или значения тега (если оно есть) двумя вертикальными чертами. Если параметров несколько, они отделяются друг от друга запятыми. Параметры позволяют модифицировать поведение тега.
Для тега state
могут быть заданы параметры:
Параметр | Тип | Описание | Значение по умолчанию |
---|---|---|---|
noContext | Логический | Если true , то после перехода в стейт контекст того, в каком стейте находится бот, не меняется. | false |
modal | Логическ ий | Если true , то стейт накладывает ограничения на то, в каких стейтах может быть обработан следующий запрос. | false |
sessionResult | Строка | Результат, который присваивается диалогу при попадании в стейт. | — |
sessionResultColor | Строка | Цвет метки с результатом в графическом редакторе J-Graph. | — |
noContext
Если у стейта есть параметр noContext
со значением true
, то при переходе в такой стейт контекст того, в каком стейте находится бот, не меняется.
Следующий запрос пользователя обрабатывается в контексте стейта, в котором бот находился до перехода.
Рассмотрим сценарий:
theme: /
state: Greeting
q!: * (прив*/добр* (~день/~утро/~вечер)) *
a: Привет! Как дела?
state: DoinGood
q: * (хорош*/норм*/замечательн*) *
a: Рад, что все в порядке! Как я могу помочь?
state: DoinBad
q: * (плох*/не [очень] хорош*) *
a: Жаль это слышать. Может, я могу чем-то помочь?
state: NoMatch || noContext = true
event!: noMatch
a: Извините, я вас не понял. Попробуйте переформулировать.
Предположим, что в ответ на вопрос Как дела? пользователь ответил Я в порядке.
Паттерны во вложенных стейтах не предусматривают такого ответа, поэтому сценарий перешел в стейт NoMatch
— бот попросил переформулировать ответ.
Пользователь ответил У меня все хорошо.
Если бы у стейта NoMatch
не было параметра noContext
,
то несмотря на то, что ответ пользователя соответствует паттерну в стейте DoinGood
, он бы не распознался:
контекст диалога ранее перешел в стейт NoMatch
, из которого по тегу активации q
стейт DoinGood
недоступен.
С параметром noContext
при попадании в NoMatch
контекст диалога не меняется и остается в стейте Greeting
.
Ответ обрабатывается в нужном контексте и попадает во вложенный стейт DoinGood
.
noContext
используется для стейтов, которые не должны продвигать диалог вперед:
обычно это стейты для обработки нераспознанных запросов, переспросов в телефонном канале и т. д.modal
Если у стейта есть параметр modal
со значением true
,
то такой стейт накладывает ограничения на то, в каких стейтах может быть обработан следующий запрос пользователя.
Когда контекст диалога находится в модальном стейте, переход возмо жен только:
- В стейты на первом уровне вложенности по отношению к модальному стейту.
- В стейты, в которые можно перейти из модального стейта по тегу с параметром
fromState
илиtoState
.
-
Ограничения модальных стейтов не распространяются на события. Если при нахождении в модальном стейте возникнет событие, для которого в любом стейте сценария предусмотрен стейт-обработчик, событие будет успешно обработано.
-
Если среди достижимых стейтов нет стейтов для обработки запроса или события
noMatch
, то бот попытается перейти в глобальный стейт-обработчик событияnoMatch
. Если такого стейта в сценарии нет, возникнет ошибка о том, что не найден стейт для перехода.
Рассмот рим сценарий:
theme: /
state: OrderStatus || modal = true
q!: * (где/статус) * [мой] ~заказ *
a: Какой номер у вашего заказа?
state: GetNumber
q: * @duckling.number *
a: Ваш заказ уже в пути!
go!: /WhatElse
state: LocalCatchAll
event: noMatch
a: Это не похоже на номер заказа. Попробуйте еще раз.
state: WhatElse
intent: /DontKnow || fromState = "/OrderStatus"
a: Чем еще я могу помочь?
В этом сценарии пользователь может уточнить статус своего заказа, назвав его номер.
У стейта OrderStatus
есть параметр modal
, поэтому диалог сможет выйти из него, только когда пользователь:
- Назовет номер заказа. Контекст перейдет в стейт
WhatElse
поgo!
. - Скажет, что не знает номер. Контекст перейдет в стейт
WhatElse
поq
сfromState
.
modal
используется для стейтов, в которых от пользователя запрашивается важная информация,
без получения которой диалог не может продолжаться.