如何 return Dialog.Delegate 指令到 Alexa Skill 模型?

How to return Dialog.Delegate directive to Alexa Skill model?

我想用 Alexa Skill 模型创建一个简单的多轮对话。我的意图由 3 个槽组成,每个槽都是实现意图所必需的。我提示每个插槽并定义所有需要的语句。

现在我想用 Lambda 函数处理请求。这是我针对此特定 Intent 的功能:

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

那么我将如何继续使用 Dialog.Delegate 指令构建我的响应,如 Alexa 文档中所述?

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

提前致谢。

使用 Dialog.Delegate 指令,您无法从代码中发送 outputSpeechreprompt。相反,将使用交互模型中定义的那些。

Do not include outputSpeech or reprompt with the Dialog.Directive. Alexa uses the prompts defined in the dialog model to ask the user for the slot values and confirmations.

这意味着您不能 delegate 并提供您自己的回复,但您可以使用任何其他 Dialog 指令来提供您的 outputSpeechreprompt .

例如:Dialog.ElicitSlotDialog.ConfirmSlotDialog.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参数是可选的。 它是一个意图对象,代表发送到您的技能的意图。如有必要,您可以使用此 属性 设置或更改槽值和确认状态。

有关对话框指令的更多信息here

在 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');
     }
}