Как использовать Intent Chaining с Intent Confirmation в Alexa? - PullRequest
2 голосов
/ 30 июня 2019

Я пытаюсь смешать управление диалогами и цепочку намерений. Я отключил автоматическое делегирование.

Но я застрял в Когда пользователь заполняет все значения слотов, а затем я использую подтверждение намерения и запрашиваю его, если данные верны.

Если пользователь говорит «Нет». Я хочу перезапустить диалоговое управление для того же намерения.

Но ошибка, которую я получаю, «Директива« Dialog.Delegate »может использоваться только тогда, когда диалог активен и еще не завершен».

Я попытался заменить строку 15 каким-либо другим намерением, оно работает, но не тогда, когда я отправляю директиву с тем же намерением. Кто-нибудь знает, что мне не хватает?

const DeniedPostMessageIntentHandler = {
    canHandle(handlerInput) {
      return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
        handlerInput.requestEnvelope.request.intent.name === 'PostMessageIntent' &&
        handlerInput.requestEnvelope.request.dialogState === 'COMPLETED' &&
        handlerInput.requestEnvelope.request.intent.confirmationStatus === 'DENIED';
    },
    handle(handlerInput) {
        let speechText = ri('POST_MESSAGE.DENIED');
        return handlerInput.jrb
          .speak(speechText)
          .addDelegateDirective({
            name: 'PostMessageIntent',
            confirmationStatus: 'NONE',
            slots: {}
          })
          .getResponse();
    },
};

1 Ответ

1 голос
/ 30 июня 2019

Примечание. Я использую диалоговое управление с отключенным автоматическим делегированием.

Алекса отправляет запрос с dialogState = IN_PROGRESS и confirmationStatus = DENIED даже перед отправкой того же запроса с dialogState = COMPLETED и confirmationStatus = DENIED.

Ошибка

«Директива« Dialog.Delegate »может использоваться только при активном диалоге и не было завершено "

намекает на это, но следует отметить, что мы можем начать делегирование диалога для отдельного намерения, находясь в dialogState = COMPLETED, но не можем сделать это для того же намерения.

Так что, если вы хотите перезапустить диалоговое окно для того же намерения, когда подтверждение намерения отклоняется, вы должны сделать это, пока dialogState все еще IN_PROGRESS . Если вы хотите обработать подтверждение намерения, отклоненное каким-либо другим способом, вы также можете сделать это, когда dialogState имеет значение COMPLETED .

Решением моей вышеупомянутой проблемы является просто изменение dialogState в функции canHandle на IN_PROGRESS вместо COMPLETED .

canHandle(handlerInput) {
  return handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
    handlerInput.requestEnvelope.request.intent.name === 'PostMessageIntent' &&
    handlerInput.requestEnvelope.request.dialogState === 'IN_PROGRESS' &&
    handlerInput.requestEnvelope.request.intent.confirmationStatus === 'DENIED';
}

Нашли это в глубине души - https://forums.developer.amazon.com/comments/206243/view.html

Amazon должен принять к сведению и добавить это в документацию.

...