Scopes

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

За счёт переключения скоупов можно управлять речевым контекстом диалога.

Типы скоупов

В API есть 4 типа скоупов, которые покрывают все необходимые методы взаимодействия с пользователем в речевом диалоге.

Корневой скоуп

Этот скоуп строится ассистентом при старте или при установке нового приложения, использующего API, и включает в себя все основные модули активных агентов (т.е. модули, указанные в мета-данном mobi.voiceassistant.MODULE манифеста).

Далее каждый агент может дополнить или, наоборот, ограничить этот скоуп, управляя контекстом диалога.

Автоматические

Этот тип используется для автоматического дополнения корневого скоупа. Он описывается как вложенные команды у команд верхнего уровня в модуле.

<command android:id="@+id/weather">
    <pattern value="* погода"/>

    <command android:id="@id/weather">
        <pattern value="на неделю"/>
    </command>
</command>

Таким образом после запроса "Какая погода" пользователю станет доступна команда "На неделю". Это что-то типа контекстного вопроса, который не имеет смыла без предыдущего вопроса. Автоматическим он называется потому что не требует явного указания скоупа из кода.

Автоматический скоуп дополняет корневой. При этом команды автоматического скоупа выполняются с приоритетом, т.е. не сравниваются по score с другими командами корневого скоупа. А значит, если команда из автоматического скоупа сработала с любым score, то ассистент передаст управление агенту, работающему в данный момент с этим модулем.

После срабатывания команды из автоматического скоупа он продолжит своё действие.

Мануальные

Это аналог автоматических скоупов, но которые задаются непосредственно из кода с помощью методов enterScope и enterQuestionScope класса Response.

Методы принимают идентификатор модуля, а не команды. Это значит, что для такого управления контекстом понадобится создать отдельные xml-описания модулей.

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

Модальные

Этот тип скоупов нужен, когда требуется ограничить текущий скоуп только конкретными командами. Он как и мануальный скоуп задаётся программно с помощью методов enterModalScope и enterModalQuestionScope класса Response.

Модальный скоуп означает, что пользователю доступны только те команды, которые присутствуют в указанном модуле. При этом пользователь всегда может вернуться к корневому скоупу с помощью команд отмены (например, "Отмена" или "Отменить").

Если пользователь скомандует отмену, то будет вызван метод onModalCancel, что даст возможность сгенерировать ответ на отмену.

Если пользователь даст команду, которая не подходит ни к одному из паттернов модального скоупа, то ассистент вызовет метод агента onModalFail.

В случае срабатывания одного из паттернов будет вызван стандартный метод onCommand.

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