Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call another intent without prompting to user in Lex?

Is it possible to trigger intent-B from the lambda function of intent-A without prompting to user?
Suppose user typed something and an intent-A is fired, after some processing I want to trigger some other intent i.e intent-B.
User can also directly trigger intent-B through specific utterances. Any help is appreciated.

like image 529
sid8491 Avatar asked Dec 01 '17 06:12

sid8491


People also ask

How to add fallback intent?

You add a fallback intent by adding the built-in AMAZON. FallbackIntent intent type to your bot. You can specify the intent using the PutBot operation or by choosing the intent from the list of built-in intents in the console.

How do I get welcome messages on AWS Lex?

You can follow these steps:Create a Slot type with only one value i.e: HelloMe . Create an Utterances HelloMessage . Create a Slot as follow: Required, name: answer , Slot Type: HelloMe , Prompt: 'AutoWelcomePrompt'. Pick Amazon Lambda for your Fulfillment that will send a response to your user.

How do I add intent to Amazon Lex?

To create an intent In the Amazon Lex console, choose the plus sign (+) next to Intents, and then choose Create new intent. In the Create intent dialog box, type the name of the intent ( OrderPizza ), and then choose Add.


Video Answer


2 Answers

I ended up doing below to call intent-B from intent-A without prompting anything to user:

  • give access to invoke lambda functions to your calling lambda function i.e lambda function of intent-A
  • get the name of backend lambda function of intent-B
  • call that lambda function with all the inputs using boto3
  • response will be in 'Payload' key of response object
  • get the response using read() method
  • get actual output in ['dialogAction']['message']['content']
  • return using default close() method

import boto3

client = boto3.client('lambda')
data = {'messageVersion': '1.0', 'invocationSource': 'FulfillmentCodeHook', 'userId': '###', 
        'sessionAttributes': {}, 'requestAttributes': None, 
        'bot': {'name': '###', 'alias': '$LATEST', 'version': '$LATEST'}, 
        'outputDialogMode': 'Text', 
        'currentIntent': {'name': '###', 'slots': {'###': '###'}, 
        'slotDetails': {'###': {'resolutions': [], 'originalValue': '###'}}, 
        'confirmationStatus': 'None'}, 
        'inputTranscript': '###'}
response = client.invoke(
    FunctionName='{intent-B lambda function}',
    InvocationType='RequestResponse',
    Payload=json.dumps(data)
)
output = json.loads(response['Payload'].read())['dialogAction']['message']['content']
like image 180
sid8491 Avatar answered Oct 09 '22 06:10

sid8491


Yes it is possible .From the lambda of Intent-A , you can write the below code :

        intentRequest.currentIntent.name='Intent-B';
        var param1={
                slot-B:null
            };
            intentRequest.currentIntent.slots=param1;
          callback(elicitSlot(outputSessionAttributes, 'Intent-B', intentRequest.currentIntent.slots, 'slot-B'));

Below is the function for elicitSlot

function elicitSlot(sessionAttributes, intentName, slots, slotToElicit, message) {    
return {
    sessionAttributes,
    dialogAction: {
        type: 'ElicitSlot',
        intentName,
        slots,
        slotToElicit,
        message,
    },
};

}

like image 3
Joydip Kumar Avatar answered Oct 09 '22 04:10

Joydip Kumar