How to get AMAZON.QUERY input in multi turn

Viewed 44

I am trying to create a Intent where skill can get Input from user until user says "finish".

1 Answers

You can use addElicitSlotDirective for every turn keeping withShouldEndSession(false) and when user says "finish" set withShouldEndSession(true).

This should work for you. Here's the sample how I've implement this in my skill.

  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()
    );
  },
};
Related