Многооборотный диалог в навыке Алекса - PullRequest
0 голосов
/ 06 июня 2018

Мы развиваем навык, для этого требуется многооборотный диалог.Однако, когда alexa подтверждает первый слот, он выдает сообщение «. Возникла проблема с ответом запрошенного навыка

Лямбда-код, который вызывает alexa, выглядит следующим образом.

 'DialogIntent': function(){
       if (this.event.request.dialogState === "STARTED") {
        console.log("in STARTED");

        var updatedIntent = this.event.request.intent;
        this.emit(":delegate", updatedIntent);
    } else if (this.event.request.dialogState !== "COMPLETED") {
        console.log("in not completed");
        this.emit(":delegate", updatedIntent);
    } else {
        console.log("in completed");
        return this.event.request.intent.slots;
    }
    return null;
}

we are doing everything suggested in https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html

Can you let us know if we are missing something?

1 Ответ

0 голосов
/ 06 июня 2018

Мой ответ

Вы не определяете переменную updatedIntent во время ответов, когда состояние диалога находится в любом состоянии, отличном от начального.Чтобы это исправить, попробуйте переместить объявление updatedIntent непосредственно перед оператором if / else.

'DialogIntent': function(){
    var updatedIntent = this.event.request.intent;

    if (this.event.request.dialogState === "STARTED") {
        this.emit(":delegate", updatedIntent);
    } else if (this.event.request.dialogState !== "COMPLETED") {
        this.emit(":delegate", updatedIntent);
    } else {
        return this.event.request.intent.slots;
    }
    return null;
}

Причина, по которой это необходимо, заключается в том, что каждый запрос устанавливает диалог в одно из трех состояний 1) STARTED, чтоотправляется только по первому запросу диалога, 2) IN_PROGRESS, который устанавливается в каждом последующем запросе, пока диалоговое окно не будет завершено, и ЗАПОЛНИТЬ, для которого он установлен, после того как все необходимые слоты заполнены и любое необходимое подтверждение выполнено.

В вашем примере вы устанавливаете updatedIntent только для запросов с состоянием диалога, установленным на STARTED, то есть только для первого запроса диалога.Каждый последующий запрос пропускает начальный шаг в операторе if, тем самым никогда не определяя обновленную переменную намерения, которую вы пытаетесь передать обратно в Alexa в операторе «else if».


Refactor # 1

Если вам не нужно выполнять какие-либо дополнительные настройки, когда состояние диалога только что «НАЧИНАЕТСЯ», вы можете исключить этот раздел из оператора if else все вместе, так как выделать то же самое в обоих === "НАЧАЛО и! ==" ЗАВЕРШЕНО ":

'DialogIntent': function(){
     var updatedIntent = this.event.request.intent;

     if (this.event.request.dialogState !== "COMPLETED") {
         this.emit(":delegate", updatedIntent);
     } else {
         return this.event.request.intent.slots;
     }
     return null;
}

Refactor # 2

Вы, вероятно, неМне не нужно использовать updatedIntent. Несмотря на то, что я не совсем уверен, как работает комплект Alexa Skills Kit в Node.js (я полагаю, это то, что вы используете), вам не нужно передавать updatedIntent обратно в Alexa.Обновленная переменная намерения необходима только в том случае, если по какой-то причине вам необходимо обновить намерение вручную в коде. Если нет, Alexa может обработать весь диалог без него:

'DialogIntent': function(){
     if (this.event.request.dialogState !== "COMPLETED") {
         this.emit(":delegate");
     } else {
         return this.event.request.intent.slots;
     }
     return null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...