This site is no longer updated.Go to new Conversational Cloud docs

Управление контекстом


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.