Domains
Domains
The Domain defines the universe in which your assistant operates. It specifies the intents, entities, slots, and actions your bot should know about. Optionally, it can also include responses for the things your bot can say.
An example of a Domain
As an example, the domain created by rasa init has the following yaml definition:
intents:
- greet
- goodbye
- affirm
- deny
- mood_great
- mood_unhappy
- bot_challenge
responses:
utter_greet:
- text: "Hey! How are you?"
utter_cheer_up:
- text: "Here is something to cheer you up:"
image: "https://i.imgur.com/nGF1K8f.jpg"
utter_did_that_help:
- text: "Did that help you?"
utter_happy:
- text: "Great, carry on!"
utter_goodbye:
- text: "Bye"
utter_iamabot:
- text: "I am a bot, powered by Rasa."
session_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
What does this mean?
Your NLU model will define the intents and entities that you need to include in the domain. The entities section lists all entities extracted by any entity extractor in your NLU pipeline.
Example:
entities:
- PERSON # entity extracted by SpacyEntityExtractor
- time # entity extracted by DucklingHTTPExtractor
- membership_type # custom entity extracted by CRFEntityExtractor
- priority # custom entity extracted by CRFEntityExtractor
Slots hold information you want to keep track of during a conversation. A categorical slot called risk_level would be defined like this:
slots:
risk_level:
type: categorical
values:
- low
- medium
- high
Actions
Actions are the things your bot can actually do. For example, an action could:
- respond to a user,
- make an external API call,
- query a database, or
- just about anything!
Custom Actions and Slots
To reference slots in your domain, you need to reference them by their module path. To reference custom actions, use their name. For example:
actions:
- my_custom_action
slots:
- my_slots.MyAwesomeSlot
Responses
Responses are messages the bot will send back to the user. There are two ways to use these responses:
- If the name of the response starts with
utter_, the response can directly be used as an action.responses: utter_greet: - text: "Hey! How are you?" - You can generate response messages from your custom actions using the dispatcher:
from rasa_sdk.actions import Action
class ActionGreet(Action): def name(self): return 'action_greet'
def run(self, dispatcher, tracker, domain): dispatcher.utter_message(template="utter_greet") return []
### Images and Buttons
Responses defined in a domain’s yaml file can contain images and buttons as well:
```yaml
responses:
utter_greet:
- text: "Hey! How are you?"
buttons:
- title: "great"
payload: "great"
- title: "super sad"
payload: "super sad"
utter_cheer_up:
- text: "Here is something to cheer you up:"
image: "https://i.imgur.com/nGF1K8f.jpg"
Custom Output Payloads
You can also send any arbitrary output to the output channel using the custom: key. For example:
responses:
utter_take_bet:
- custom:
blocks:
- type: section
text:
text: "Make a bet on when the world will end:"
type: mrkdwn
accessory:
type: datepicker
initial_date: '2019-05-21'
placeholder:
type: plain_text
text: Select a date
Channel-Specific Responses
For each response, you can have multiple response templates that are sent only to specific channels:
responses:
utter_ask_game:
- text: "Which game would you like to play?"
channel: "slack"
custom:
- # payload for Slack dropdown menu to choose a game
- text: "Which game would you like to play?"
buttons:
- title: "Chess"
payload: '/inform{"game": "chess"}'
- title: "Checkers"
payload: '/inform{"game": "checkers"}'
- title: "Fortnite"
payload: '/inform{"game": "fortnite"}'
Variables
You can also use variables in your responses to insert information collected during the dialogue:
responses:
utter_greet:
- text: "Hey, {name}. How are you?"
Variations
If you want to randomly vary the response sent to the user, you can list multiple response templates:
responses:
utter_greeting:
- text: "Hey, {name}. How are you?"
- text: "Hey, {name}. How is your day going?"
Ignoring entities for certain intents
If you want all entities to be ignored for certain intents:
intents:
- greet:
use_entities: []
Session configuration
A conversation session represents the dialogue between the assistant and the user. You can define the period of inactivity after which a new conversation session is triggered in the domain under the session_config key:
session_config:
session_expiration_time: 60 # value in minutes
carry_over_slots_to_new_session: true # set to false to forget slots between sessions