Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get AMAZON.QUERY input in multi turn

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

like image 247
Gautam Mishra Avatar asked Aug 24 '20 12:08

Gautam Mishra


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()
    );
  },
};
like image 84
Suraj Prakash Sahu Avatar answered Nov 09 '22 01:11

Suraj Prakash Sahu