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, система обработает запрос строго в контексте этого стейта, то есть запрос может попасть только в один из его вложенных стейтов.

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

Если среди вложенных стейтов не предусмотрены стейты для обработки запроса и события noMatch, то система попытается найти глобальный обработчик события noMatch. При его отсутствии в сценарии возникнет ошибка о том, что в сценарии не найден стейт для перехода.

Стейты с флагом 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.

Во избежание ошибок не забудьте предусмотреть в сценарии обработку события noMatch.

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.