Я работаю над навыком Alexa, который будет иметь 6 основных намерений. Во время каждого намерения пользователь должен будет выбрать элемент из динамического списка. Я подскажу им что-то вроде:
скажем, выберите 1 для красного, 2 для синего или 3 для зеленого
Мой план прямо сейчас заключается в том, чтобы иметь намерение, которое отвечает Select Item {ItemIndex}
. Однако, как только у меня есть выбранный индекс, мне нужно вернуться к первоначальному намерению. Диалог будет выглядеть примерно так:
спросите My Car Shopper, какие Форды есть в наличии поблизости (обрабатывается LookForCarIntentHandler
)
Конечно. Какой цвет вы ищете? Скажите 1 для Красного Капура, 2 для Зеленого Балтийского моря или 3 для Серебряной ели
Выберите пункт 2 (обрабатывается SelectItemIntentHandler
)
Отлично. Я нашел 3 брода в Серебряной ели в 3 милях от вас. Хотите, чтобы я рассказал вам о первом? (ответ от LookForCarIntentHandler
)
В этом надуманном примере цвета довольно необычные и управляются API, поэтому я не могу предварительно заполнить значения слотов. Динамические значения слотов также сложно из-за ограничений, когда я могу их установить. В любом случае, в какой-то момент мне нужно иметь возможность выбирать по индексу как запасной вариант.
Я рассмотрел 3 варианта:
Опция 1 : добавьте слот {SelectedIndex}
(и высказывания) к каждому намерению и просто используйте их для сбора индекса слота. Мне не нравится это из-за количества шаблонов, которыми я должен управлять, но по крайней мере это будет работать.
Вариант 2 : подтвердить выбор индекса (даже если я не очень хочу) в оригинале и обновить намерение в этом ответе. То есть иметь ответ SelectItemIntentHandler
с директивой elicitSlot
, которая указывает обработчику обратно на исходное намерение с подсказкой «Я слышал, вы говорите, пункт 1 ... это правильно?» Тогда У 6 намерений верхнего уровня должен быть тип слота Yes/No
и слот для сбора значения подтверждения. Мне не очень нравится эта опция.
Опция 3 : пусть SelectItemIntentHandler идентифицирует предыдущее намерение и вызывает обработчик этого намерения, возвращая свой результат. Это не кажется удивительным, но это сработало бы в крайнем случае.
Опция 4 : полностью исключить логику из обработчиков намерений. По сути, создайте свой собственный конечный автомат, который обрабатывает логику вне обработчиков намерений. Тогда обработчики намерений несут ответственность только за то, чтобы выслушать материал и передать его в машину состояний Например, у меня есть CoffeeBuilder
, CarSearchBuilder
и BurritoBuilder
. Каждый обработчик узнает, какой компоновщик активен, передаст в него текущее состояние. Построитель обновляет состояние и возвращает ответ.
Тогда никогда не имеет значения, что намерение делает, потому что намерения в любом случае глупы. Так, в зависимости от состояния и активного Builder
, SelectItemIntentHandler
может сказать: «Отлично, хотите ли вы картошку с этим?» или «Этот автомобиль поставляется с 2 или 4 двери. Сколько дверей вы хотите? "
Мне нравится звук этого подхода; Однако это сложно. Очевидно, что я действительно хотел бы сказать: «Хорошо, похоже, выбран правильный индекс элемента, поэтому OrderCoffeeIntentHandler
, продолжайте и завершите диалог. K Thx Bye». Я просто не вижу способа сделать это.