Prompt for user input in the v3 JavaScript SDK
APPLIES TO: SDK v3
The Bot Framework SDK for Node.js provides a set of built-in prompts to simplify collecting inputs from a user.
A prompt is used whenever a bot needs input from the user. You can use prompts to ask a user for a series of inputs by chaining the prompts in a waterfall. You can use prompts in conjunction with waterfall to help you manage conversation flow in your bot.
This article will help you understand how prompts work and how you can use them to collect information from users.
Prompts and responses
Whenever you need input from a user, you can send a prompt, wait for the user to respond with input, and then process the input and send a response to the user.
The following code sample prompts the user for their name and responds with a greeting message.
bot.dialog('greetings', [
// Step 1
function (session) {
builder.Prompts.text(session, 'Hi! What is your name?');
},
// Step 2
function (session, results) {
session.endDialog(`Hello ${results.response}!`);
}
]);
Using this basic construct, you can model your conversation flow by adding as many prompts and responses as your bot requires.
Prompt results
Built-in prompts are implemented as dialogs that return the user's response in the results.response
field. For JSON objects, responses are returned in the results.response.entity
field. Any type of dialog handler can receive the result of a prompt. Once the bot receives a response, it can consume it or pass it back to the calling dialog by calling the session.endDialogWithResult
method.
The following code sample shows how to return a prompt result to the calling dialog by using the session.endDialogWithResult
method. In this example, the greetings
dialog uses the prompt result that the askName
dialog returns to greet the user by name.
// Ask the user for their name and greet them by name.
bot.dialog('greetings', [
function (session) {
session.beginDialog('askName');
},
function (session, results) {
session.endDialog(`Hello ${results.response}!`);
}
]);
bot.dialog('askName', [
function (session) {
builder.Prompts.text(session, 'Hi! What is your name?');
},
function (session, results) {
session.endDialogWithResult(results);
}
]);
Prompt types
The Bot Framework SDK for Node.js includes several different types of built-in prompts.
Prompt type | Description |
---|---|
Prompts.text | Asks the user to enter a string of text. |
Prompts.confirm | Asks the user to confirm an action. |
Prompts.number | Asks the user to enter a number. |
Prompts.time | Asks the user for a time or date/time. |
Prompts.choice | Asks the user to choose from a list of options. |
Prompts.attachment | Asks the user to upload a picture or video. |
The following sections provide additional details about each type of prompt.
Prompts.text
Use the Prompts.text() method to ask the user for a string of text. The prompt returns the user's response as an IPromptTextResult.
builder.Prompts.text(session, "What is your name?");
Prompts.confirm
Use the Prompts.confirm() method to ask the user to confirm an action with a yes/no response. The prompt returns the user's response as an IPromptConfirmResult.
builder.Prompts.confirm(session, "Are you sure you wish to cancel your order?");
Prompts.number
Use the Prompts.number() method to ask the user for a number. The prompt returns the user's response as an IPromptNumberResult.
builder.Prompts.number(session, "How many would you like to order?");
Prompts.time
Use the Prompts.time() method to ask the user for a time or date/time. The prompt returns the user's response as an IPromptTimeResult. The framework uses the Chrono library to parse the user's response and supports both relative responses (e.g., "in 5 minutes") and non-relative responses (e.g., "June 6th at 2pm").
The results.response field, which represents the user's response, contains an entity object that specifies the date and time. To resolve the date and time into a JavaScript Date
object, use the EntityRecognizer.resolveTime() method.
Tip
The time that the user enters is converted to UTC time based upon the time zone of the server that hosts the bot. Since the server may be located in a different time zone than the user, be sure to take time zones into consideration. To convert date and time to the user's local time, consider asking the user what time zone they are in.
bot.dialog('createAlarm', [
function (session) {
session.dialogData.alarm = {};
builder.Prompts.text(session, "What would you like to name this alarm?");
},
function (session, results, next) {
if (results.response) {
session.dialogData.name = results.response;
builder.Prompts.time(session, "What time would you like to set an alarm for?");
} else {
next();
}
},
function (session, results) {
if (results.response) {
session.dialogData.time = builder.EntityRecognizer.resolveTime([results.response]);
}
// Return alarm to caller
if (session.dialogData.name && session.dialogData.time) {
session.endDialogWithResult({
response: { name: session.dialogData.name, time: session.dialogData.time }
});
} else {
session.endDialogWithResult({
resumed: builder.ResumeReason.notCompleted
});
}
}
]);
Prompts.choice
Use the Prompts.choice() method to ask the user to choose from a list of options. The user can convey their selection either by entering the number associated with the option that they choose or by entering the name of the option that they choose. Both full and partial matches of the option's name are supported. The prompt returns the user's response as an IPromptChoiceResult.
To specify the style of the list that is presented to the user, set the IPromptOptions.listStyle property. The following table shows the ListStyle
enumeration values for this property.
The ListStyle
enum values are as follows:
Index | Name | Description |
---|---|---|
0 | none | No list is rendered. This is used when the list is included as part of the prompt. |
1 | inline | Choices are rendered as an inline list of the form "1. red, 2. green, or 3. blue". |
2 | list | Choices are rendered as a numbered list. |
3 | button | Choices are rendered as buttons for channels that support buttons. For other channels they will be rendered as text. |
4 | auto | The style is selected automatically based on the channel and number of options. |
You can access this enum from the builder
object or you can provide an index to choose a ListStyle
. For example, both statements in the following code snippet accomplish the same thing.
// ListStyle passed in as Enum
builder.Prompts.choice(session, "Which color?", "red|green|blue", { listStyle: builder.ListStyle.button });
// ListStyle passed in as index
builder.Prompts.choice(session, "Which color?", "red|green|blue", { listStyle: 3 });
To specify the list of options, you can use a pipe-delimited (|
) string, an array of strings, or an object map.
A pipe-delimited string:
builder.Prompts.choice(session, "Which color?", "red|green|blue");
An array of strings:
builder.Prompts.choice(session, "Which color?", ["red","green","blue"]);
An object map:
var salesData = {
"west": {
units: 200,
total: "$6,000"
},
"central": {
units: 100,
total: "$3,000"
},
"east": {
units: 300,
total: "$9,000"
}
};
bot.dialog('getSalesData', [
function (session) {
builder.Prompts.choice(session, "Which region would you like sales for?", salesData);
},
function (session, results) {
if (results.response) {
var region = salesData[results.response.entity];
session.send(`We sold ${region.units} units for a total of ${region.total}.`);
} else {
session.send("OK");
}
}
]);
Prompts.attachment
Use the Prompts.attachment() method to ask the user to upload a file such an image or video. The prompt returns the user's response as an IPromptAttachmentResult.
builder.Prompts.attachment(session, "Upload a picture for me to transform.");
Next steps
Now that you know how to step users through a waterfall and prompt them for information, lets take a look at ways to help you better manage the conversation flow.