Defining Responses
Responses go under theresponses key in your domain file or in a separate “responses.yml” file. Each response name should start with utter_.
For example, you could add responses for greeting and saying goodbye under the response names utter_greet and utter_bye:
domain.yml
Notice the special format of response names for retrieval intents. Each name starts with
utter_,
followed by the retrieval intent’s name (here chitchat) and finally a suffix specifying
the different response keys (here ask_name and ask_weather). See the documentation for NLU
training examples to learn more.Using Variables in Responses
You can use variables to insert information into responses. Within a response, a variable is enclosed in curly brackets. For example, see the variablename below:
domain.yml
utter_greet response is used, Rasa automatically fills in the variable with the
value found in the slot called name. If such a slot doesn’t exist or is empty, the variable gets
filled with None.
Another way to fill in a variable is within a custom action.
In your custom action code, you can supply values to a response to fill in specific variables.
If you’re using the Rasa SDK for your action server,
you can pass a value for the variable as a keyword argument to dispatcher.utter_message:
Response Variations
You can make your assistant’s replies more interesting if you provide multiple response variations to choose from for a given response name:domain.yml
utter_greet gets predicted as the next action, Rasa will randomly pick one
of the two response variations to use.
IDs for Responses
New in Rasa 3.6You can now set an ID for any response.
This is useful when you want to use the NLG server to generate the response.Type for ID is string.
domain.yml
Channel-Specific Response Variations
To specify different response variations depending on which channel the user is connected to, use channel-specific response variations. In the following example, thechannel key makes the first response variation channel-specific for
the slack channel while the second variation is not channel-specific:
domain.yml
Make sure the value of the
channel key matches the value returned by the name() method of your
input channel. If you are using a built-in channel, this value will also match the channel name used
in your credentials.yml file.channel specified and can be used by
your assistant for all channels other than slack.
Conditional Response Variations
Specific response variations can also be selected based on one or more slot values using a conditional response variation. A conditional response variation is defined in the domain or responses YAML files similarly to a standard response variation but with an additionalcondition key.
Predicate Conditions
New in 3.13You can now use predicate expressions to define conditions using the
slots namespace for
conditional response variations.This feature was originally released as a beta feature in Rasa Pro 3.12.0 and is now generally available (GA).condition key can now specify a predicate statement, similar to the usage of conditions in flows.
These predicates enable you to use a variety of logical operators, comparison operators and other constructs.
They are evaluated with the pypred library.
For example:
domain.yml
"Hey, {name}. Nice to see you again! How are you?")
will be used whenever the utter_greet action is executed and the prior_visits slot is greater than 1.
The second variation, which has a condition that the prior_visits slot is not set, will be used when the slot is not set.
Name and Value Equality Constraints
Deprecation WarningWriting the condition as a list of dictionaries consisting of
name and value constraints is deprecated.
This format will be removed in the next major release of Rasa.condition key specifies a list of slot name and value constraints.
When a response is triggered during a dialogue, the constraints of each conditional response variation
are checked against the current dialogue state. If all constraint slot values are equal to the corresponding
slot values of the current dialogue state, the response variation is eligible to be used by your conversational
assistant.
The comparison of dialogue state slot values and constraint slot values is performed by the
equality ”==” operator which requires the type of slot values to match too.
For example, if the constraint is specified as
value: true, then the slot needs to be filled
with a boolean true, not the string "true".logged_in slot is set to true:
domain.yml
flows.yml
"Hey, {name}. Nice to see you again! How are you?")
will be used whenever the utter_greet action is executed and the logged_in slot is set to true.
The second variation, which has no condition, will be treated as the default and used whenever
logged_in is not equal to true.
Variation Selection
During a dialogue, Rasa will choose from all conditional response variations whose constraints are satisfied. If there are multiple eligible conditional response variations, Rasa will pick one at random. For example, consider the following response:domain.yml
logged_in and eligible_for_upgrade are both set to true then both the first and second response
variations are eligible to be used, and will be chosen by the conversational assistant with equal probability.
You can continue using channel-specific response variations alongside conditional response variations
as shown in the example below.
domain.yml
- conditional response variations with matching channel
- default responses with matching channel
- conditional response variations with no matching channel
- default responses with no matching channel
Rich Responses
You can make responses rich by adding visual and interactive elements. There are several types of elements that are supported across many channels:Buttons
You can add buttons to a response to allow the user to select from a list of options. The buttons are displayed as clickable elements in the chat window. Each button in the list ofbuttons should have two keys:
title: The text displayed on the buttons that the user sees.payload: The message sent from the user to the assistant when the button is clicked.
- trigger intents and pass entities to the assistant.
- issue commands to set slots
- pass a predefined free-form string message to the assistant. Note that this option should be used if none of the above options are feasible.
Triggering Intents or Passing Entities
Here is an example of a response that uses buttons to trigger an intent:domain.yml
domain.yml
overwrite nlu with buttonsYou can use buttons to overwrite the NLU prediction and trigger a specific intent and entities.Messages starting with
/ are sent handled by the
RegexInterpreter, which expects NLU input in a shortened /intent{entities} format.
In the example above, if the user clicks a button, the user input
will be classified as either the mood_great or mood_sad intent.You can include entities with the intent to be passed to the RegexInterpreter using the following format:/inform{"ORG":"Rasa", "GPE":"Germany"}The RegexInterpreter will classify the message above with the intent inform and extract the entities
Rasa and Germany which are of type ORG and GPE respectively.escaping curly braces in domain.ymlYou need to write the
/intent{entities} shorthand response with double curly braces in domain.yml so that the assistant does not
treat it as a variable in a response and interpolate the content within the curly braces.Issuing Set Slot Commands
New in 3.9.0Starting from Rasa Pro 3.9.0, you can use buttons to issue commands to set slots.
Payload Syntax
To issueset slot commands, you can use the following format
in the payload: /SetSlots(slot_name=slot_value). You can define multiple slot key-value pairs in the same command.
The slot names that you define in the payload should be slots that are requested via the active flow or flows that the
command generator predicts a StartFlow command for in the same turn.
Note that there is a limit of 10 slot key-value pairs per command to prevent Regular expression Denial of Service (ReDoS) attacks.
Here is an example:
domain.yml
SetSlots command is case-sensitive and should be written exactly as shown above.
The regular expression used for extracting slot names and values from the payload does not allow the following characters:
=,,,(,)in the slot name,,(,)in the slot value
Dynamic Buttons
You can also create a dynamic list of buttons in a reply via a custom action. Maybe the list of responses come from an API or the list of buttons is determined based on the value of another slot or the state of the conversation. This can be done via a collect step and a custom action calledaction_ask_{slot_name}.
For example, let’s say your bot needs to ask the user which of their credit cards they want help with.
We would create a response without the buttons and then use a custom action to get the list of cards
associated with the user.
There is also a cards slot with a list of all the users cards. This was loaded when the user
first connected to the bot via action_session_start. There are also slots with the current card
name and number.
domain.yml
select_card flow does a collect: current_card_name to request the current card from the
user.
flow.yml
action_ask_current_card_name which the flow collect will call.
actions.py
action_ask_{slot_name} here
Images
You can add images to a response by providing a URL to the image under theimage key:
domain.yml
Custom Output Payloads
You can send any arbitrary output to the output channel using thecustom key. The output channel receives the object stored under the custom key
as a JSON payload.
Here’s an example of how to send a
date picker to the
Slack Output Channel:
domain.yml
Voice-Specific Response Properties
For voice assistants, you can control specific behaviors of individual responses using voice-specific properties.Controlling Interruptions
Beta FeatureInterruption handling is currently in beta and available for selected Voice Stream Channels only.
allow_interruptions property:
domain.yml
allow_interruptions is true for all responses. Setting it to false ensures that users must hear the complete message before the assistant will respond to their input.
When to use allow_interruptions: false:
- Critical information that users must hear completely (account balances, terms and conditions, emergency information)
- Legal disclaimers or compliance-related content
- Important instructions that shouldn’t be missed
Using Responses in Conversations
Calling Responses as Actions
If the name of the response starts withutter_, the response can
directly be used as an action, without being listed in the actions section of your domain. You would add the response
to the domain:
domain.yml
flows.yml
utter_greet action runs, it will send the message from
the response back to the user.
Changing responsesIf you want to change the text, or any other part of the response,
you need to retrain the assistant before these changes will be picked up.
Calling Responses from Custom Actions
You can use the responses to generate response messages from your custom actions. If you’re using Rasa SDK as your action server, you can use the dispatcher to generate the response message, for example:actions.py
utter_greet response: