web-dev-qa-db-ja.com

Dialog.DelegateディレクティブをAlexaスキルモデルに戻す方法は?

Alexaスキルモデルを使用して簡単なマルチターンダイアログを作成したいと思います。私のインテントは3つのスロットで構成されており、各スロットはインテントを実行するために必要です。すべてのスロットにプロンプ​​トを表示し、必要なすべての発話を定義しました。

ここで、Lambda関数を使用してリクエストを処理したいと思います。これは、この特定のインテントに対する私の機能です。

function getData(intentRequest, session, callback) {
    if (intentRequest.dialogState != "COMPLETED"){
        // return a Dialog.Delegate directive with no updatedIntent property.
    } else {
        // do my thing
    }
}

では、Alexaのドキュメントに記載されているように、Dialog.Delegateディレクティブを使用して応答を作成するにはどうすればよいですか?

https://developer.Amazon.com/docs/custom-skills/dialog-interface-reference.html#scenario-delegate

前もって感謝します。

5
Ipsider

_Dialog.Delegate_ディレクティブを使用すると、コードからoutputSpeechまたはrepromptを送信できません。代わりに、相互作用モデルで定義されたものが使用されます。

Dialog.DirectiveにoutputSpeechまたはrepromptを含めないでください。 Alexaは、ダイアログモデルで定義されたプロンプトを使用して、ユーザーにスロット値と確認を求めます。

つまり、delegateで独自の応答を提供することはできませんが、代わりに他のDialogディレクティブを使用してoutputSpeechrepromptを提供できます。

例:_Dialog.ElicitSlot_、_Dialog.ConfirmSlot_および_Dialog.ConfirmIntent_。

Alexaに委任し続けるのではなく、いつでもダイアログを引き継ぐことができます。

_...
    const updatedIntent = handlerInput.requestEnvelope.request.intent;
    if (intentRequest.dialogState != "COMPLETED"){
       return handlerInput.responseBuilder
              .addDelegateDirective(updatedIntent)
              .getResponse();
    } else {
        // Once dialoState is completed, do your thing.
        return handlerInput.responseBuilder
              .speak(speechOutput)
              .reprompt(reprompt)
              .getResponse();
    }
...
_

addDelegateDirective()updatedIntentパラメーターはオプションです。これは、スキルに送信されるインテントを表すインテントオブジェクトです。このプロパティセットを使用するか、必要に応じてスロット値と確認ステータスを変更できます。

ダイアログディレクティブの詳細 ここ

11
Cicil Thomas

Nodejsでは次を使用できます

if (this.event.request.dialogState != 'COMPLETED'){
    //your logic
    this.emit(':delegate');
} else {
     this.response.speak(message);
     this.emit(':responseReady');
}
5
Charan

NodeJSでは、dialogStateを確認し、それに応じて動作できます。

if (this.event.request.dialogState === 'STARTED') {
      let updatedIntent = this.event.request.intent;
      this.emit(':delegate', updatedIntent);
} else if (this.event.request.dialogState != 'COMPLETED'){
     if(//logic to elicit slot if any){
          this.emit(':elicitSlot', slotToElicit, speechOutput, repromptSpeech);
     } else {
          this.emit(':delegate');
     }
} else {
     if(this.event.request.intent.confirmationStatus == 'CONFIRMED'){
           //logic for message
           this.response.speak(message);
           this.emit(':responseReady');
     }else{
           this.response.speak("Sure, I will not create any new service request");
           this.emit(':responseReady');
     }
}
4
Suneet Patil