(1) A Luis app was already created for you.
[a] Go to eu.luis.ai and you should be able to find the luis app. Take note of
the app id and the api key/authoring key.
[b] Locate the appsettings file and fill out the Luis app details.
For the hostname you should use "westeurope.api.cognitive.microsoft.com".
(2) We will be creating a dialog that allows you to order pizza as well.
[a] Create "PizzaDialog.cs" in the Dialogs folder. Modify "MainDialog.cs" to
start the pizza dialog if a users says "I want pizza". You can use
"TacoDialog.cs" as a reference.
Next, we will prompt the user to
- select a type of pizza (to be choosen from available pizza's)
- input the size (diagonal in cm)
- if they want pineapple on their pizza or not
[b] Add a waterfallDialog, and in the waterfall dialog add a step that ends
the dialog. Also create a private variable of type PizzaDetails in the
dialog. We will prompt the user for each of the properties in the following
steps. Let the dialog return the string:
$"pizza {_pizzaDetails.Type} ({_pizzaDetails.Size} cm) {(_pizzaDetails.Pineapple ? "with" : "without")} pineapple"
[c] Add a step to prompt the user to input the size of the pizza. We expect
them to return the pizza diameter in cm as an integer. Hence, use a
NumberPrompt<int>. Save the result in a private PizzaDetails variable.
HINT:
Example here
[d] Add a step to the waterfall that asks the user if they want pineapple on
their pizza. Use a SuggestedAction for this. Again, save the result in
PizzaDetails.
HINT:
Example here
[e] Add a waterfallstep to ask for the type of pizza, i.e. Salami, Tonno, etc.
The easy way
- Use a text prompt to store whatever the user types here.
[Stretch :: Custom validation] In exercise [c] we saw that number prompts have automatic validation, i.e. if the user inputs something that cannot be casted to a number, the bot asks again. Textprompts accept any kind of input, so we need to write our own.
- Validate the users input against list of pizza types. Change the pizza
type in PizzaDetails.cs to Enums.PizzaType. To validate user input, add a
PromptValidator to your text prompt. Make sure to add a
RetryPromptto the prompt.
HINT:
Example here
The not so easy way
-
Use an adaptive card with images you can click on to select your pizza of choice.
You can use the card in Cards > PizzaOrderCard.json. Feel free to edit it, or design your own if you're feeling creative. You can find samples here. Click the "Try it Yourself"-button to use the online editor. Refer to theCreateAdaptiveCardAttachment()function inDialogAndWelcomeBot.csfor how to import the json card. -
Change the pizza type in PizzaDetails.cs to Enums.PizzaType and parse the input into the PizzaDetails object.
HINT:
How to generate a prompt with an adaptive card:
You can use prompts, but instead of using MessageFactory.Text to add an
activity to the prompt, use MessageFactory.Card. You will need to explicitly
cast it to an activity however.
var card = CreateAdaptiveCardAttachment();
// Cast the IMessageActivity to an Activity before adding it to the prompt.
var prompt = (Activity)MessageFactory.Attachment(card);
var promptOptions = new PromptOptions { Prompt = prompt };
HINT:
How to add the prompt to the dialog:
Unfortunatly, there is no out-of-the-box support for prompting with adaptive
cards yet. We will be using a TextPrompt since there is no validation hidden
in the framework.
private const string cardPromptId = "adaptiveCardPrompt";
...
AddDialog(new TextPrompt(cardPromptId));
...
return await stepContext.PromptAsync(cardPromptId, promptOptions, cancellationToken);
The hard way
-
Use an adaptive card with a dropdown selection or bullet choices for the pizza type. The card should have images and a submit button. Upon submitting, the data filled out in this form is available in the
stepContext.Context.Activity.Valueas a JObject.
You can use the ugly but functional card in Cards > PizzaOrderForm.json. Feel free to edit it, or design your own if you're feeling creative. You can find samples here. Click the "Try it Yourself"- button to use the online editor. Refer to theCreateAdaptiveCardAttachment()function inDialogAndWelcomeBot.csfor how to import the json card. -
Change the pizza type in PizzaDetails.cs to Enums.PizzaType and parse the input into the PizzaDetails object.
HINT:
How to generate a prompt with an adaptive card:
You can use prompts, but instead of using MessageFactory.Text to add an
activity to the prompt, use MessageFactory.Card. You will need to explicitly
cast it to an activity however.
var card = CreateAdaptiveCardAttachment();
// Cast the IMessageActivity to an Activity before adding it to the prompt.
var prompt = (Activity)MessageFactory.Attachment(card);
var promptOptions = new PromptOptions { Prompt = prompt };
HINT:
How to add the prompt to the dialog:
Unfortunatly, there is no out-of-the-box support for prompting with adaptive
cards yet. We will be using a TextPrompt since there is no validation hidden
in the framework.
private const string cardPromptId = "adaptiveCardPrompt";
...
AddDialog(new TextPrompt(cardPromptId));
...
return await stepContext.PromptAsync(cardPromptId, promptOptions, cancellationToken);
HINT:
How to process the input form:
var result = stepContext.Context.Activity.Value as JObject;
var pizzaType = Enum.Parse<PizzaType>(result["pizzaType"].ToString());