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
前もって感謝します。
_Dialog.Delegate
_ディレクティブを使用すると、コードからoutputSpeech
またはreprompt
を送信できません。代わりに、相互作用モデルで定義されたものが使用されます。
Dialog.DirectiveにoutputSpeechまたはrepromptを含めないでください。 Alexaは、ダイアログモデルで定義されたプロンプトを使用して、ユーザーにスロット値と確認を求めます。
つまり、delegate
で独自の応答を提供することはできませんが、代わりに他のDialog
ディレクティブを使用してoutputSpeech
とreprompt
を提供できます。
例:_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
パラメーターはオプションです。これは、スキルに送信されるインテントを表すインテントオブジェクトです。このプロパティセットを使用するか、必要に応じてスロット値と確認ステータスを変更できます。
ダイアログディレクティブの詳細 ここ
Nodejsでは次を使用できます
if (this.event.request.dialogState != 'COMPLETED'){
//your logic
this.emit(':delegate');
} else {
this.response.speak(message);
this.emit(':responseReady');
}
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');
}
}