如何多轮获取AMAZON.QUERY输入

问题描述

我正在尝试创建一个意图,使技能可以从用户那里获得输入,直到用户说“完成”为止。

解决方法

您可以在每次转弯时都使用addElicitSlotDirective保持ShouldEndSession(false),并在用户说“完成”时设置withShouldEndSession(true)。

这应该为您工作。这是我如何使用技巧实现此示例。

  const JournalIntentHandler = {
  canHandle(handlerInput) {
    console.log(JSON.stringify(handlerInput));
    const request = handlerInput.requestEnvelope.request;
    return (
      request.type === "IntentRequest" && request.intent.name === "Journal" && handlerInput.requestEnvelope.request.dialogState !== 'COMPLETED'
    );
  },async handle(handlerInput) {
    const currentIntent = handlerInput.requestEnvelope.request.intent;
    const sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
    let speechText = { text: "" };
    let subtitle = "Journal";
    endSession.value = false;
    speechText.text = "Continue.";

    if (!sessionAttributes.savedSpeech) {
      sessionAttributes["savedSpeech"] = "";
    }
    let oldSpeech = sessionAttributes.savedSpeech;
    let newSpeech = handlerInput.requestEnvelope.request.intent.slots.speech
      .value
      ? handlerInput.requestEnvelope.request.intent.slots.speech.value
      : "";
    sessionAttributes.savedSpeech = oldSpeech + " " + newSpeech;
    const request = handlerInput.requestEnvelope.request;

    if(newSpeech == 'exit' || newSpeech == 'finish'){
        endSession.value = true;
        speechText.text = `Saved data is <break time='0.2s'/> ${oldSpeech}`
    }

    return (
      handlerInput.responseBuilder
        .addElicitSlotDirective('speech')
        .speak(speechText.text)
        .reprompt("Continue")
        .withStandardCard( subtitle,oldSpeech + " " + newSpeech)
        .withShouldEndSession(endSession.value)
        .getResponse()
    );
  },};