juliano.net
juliano.net

Reputation: 8177

Remember previous answers to guide conversation

I'm creating a chatbot using LUIS template and I have an intent called StartTest with utterances like these:

Begin [TestNameEntity] on [GearEntity] and [RPMEntity]
Begin [TestNameEntity] on [GearEntity]
Begin [TestNameEntity]

If the user input matches the first utterance, I have all entities I need. However, if its input matches the second utterance, I have to ask him the RPM. And for the third utterance I have to ask the gear and the RPM.

But for the second and third utterances I need to know what the user has said for the [TestNameEntity], like this:

User: Begin test 1 on second gear
Bot: What RPM?
User: 2500

How can I achieve this?

Upvotes: 0

Views: 52

Answers (1)

Ein2012
Ein2012

Reputation: 1103

once your Intent method is called you can use this logic

result.Entities[0].Type to get entity name

so you can iterate result.Entities to get all the entities user has entered. If any of the three entities is missing you can ask for a prompt. This is a sample code of how to achieve it.

//global variables
public string CurrentGear { get; set; }
public string CurrentRpm { get; set; }



[LuisIntent("StartTest")]
public async Task StartTestIntent(IDialogContext context, LuisResult result)
{
     if (result.Entities != null && result.Entities.Count >0)
    {
        //sample you will get selected entity type 
         //var ent1=result.Entities[0].Type;

        var userValues=GetUserEntities(result);
        if(userValues["GearEntity"]==null)
            showGearPrompt(context);
        if(userValues["RPMEntity"]==null)
            showRpmPrompt(context);
    }
}

private string[] GetUserEntities(LuisResult result)
{
    //your logic here
    //return list of entities;
}

private async Task showGearPrompt(IDialogContext context)
{
     PromptDialog.Text(  
        context: context,  
        resume: OnGearOptionReceivedAsync,  
        prompt: "please enter Gear Value",  
        retry: "Sorry, I didn't understand that. Please try again."  
    );  

}

 public virtual async Task OnGearOptionReceivedAsync(IDialogContext context, IAwaitable<string> gear)
{
    string response = await gear;  
    CurrentGear = response; 
}

private async Task showRpmPrompt(IDialogContext context)
{
    PromptDialog.Text(  
        context: context,  
        resume: OnRpmOptionReceivedAsync,  
        prompt: "please enter RPM Value",  
        retry: "Sorry, I didn't understand that. Please try again."  
    );  
}

 public virtual async Task OnRpmOptionReceivedAsync(IDialogContext context, IAwaitable<string> rpm)
{
    string response = await rpm;  
    CurrentRpm  = response; 
}

Link to how to use prompts

Upvotes: 1

Related Questions