Domains

These docs are for version 1.x of Rasa Open Source.

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.

For 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 are the things your bot can actually do. For example, an action could:

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, if you have a module called my_actions containing a class MyAwesomeAction, and module my_slots containing MyAwesomeSlot, you would add these lines to the domain file:

actions:
  - my_custom_action
  ...

slots:
  - my_slots.MyAwesomeSlot

The name function of MyAwesomeAction needs to return my_custom_action in this example (for more details, see Custom Actions).

Responses

Responses are messages the bot will send back to the user. There are two ways to use these responses:

  1. If the name of the response starts with utter_, the response can directly be used as an action. You would add the response to the domain:
responses:
     utter_greet:
  - text: "Hey! How are you?"

Afterwards, you can use the response as an action in the stories:

## greet the user
* intent_greet
  - utter_greet

When utter_greet is run as an action, it will send the message from the response back to the user.

  1. You can use the responses to generate response messages from your custom actions using the dispatcher: dispatcher.utter_message(template="utter_greet"). This allows you to separate the logic of generating the messages from the actual copy.

Images and Buttons

Responses defined in a domain’s yaml file can contain images and buttons as well:

responses:
  utter_greet:
  - text: "Hey! How are you?"
    buttons:
    - title: "great"
      payload: "great"
    - title: "super sad"
      payload: "super sad"

Note: Please keep in mind that it is up to the implementation of the output channel on how to display the defined buttons.

Custom Output Payloads

You can also send any arbitrary output to the output channel using the custom: key. Note that since the domain is in yaml format, the json payload should first be converted to yaml format.

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. If you have certain response templates that you would like sent only to specific channels, you can specify this with the channel: key.

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. For example:

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 and Rasa will randomly pick one of them, e.g.:

responses:
  utter_greeting:
  - text: "Hey, {name}. How are you?"
  - text: "Hey, {name}. How is your day going?"

Ignoring entities for certain intents

You can add the use_entities: [] parameter to the intent in your domain file like this:

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 session_config. The default session configuration looks as follows:

session_config:
  session_expiration_time: 60
  carry_over_slots_to_new_session: true

👋 I can help you get started with Rasa and answer your technical questions.