Warning: This document is for an old version of Rasa Core. The latest version is 0.8.2.

# Domain, Slots, and Actions¶

## Domain¶

The Domain defines the universe in which your bot operates. It specifies exactly:

• which intents you are expecting to respond to
• which slots you wish to track
• which actions your bot can take

For example, the DefaultDomain has the following yaml definition (no slots here - but we will get there):

intents:
- greet
- default
- goodbye

entities:
- name

templates:
utter_greet:
- "hey there!"
utter_goodbye:
- "goodbye :("
utter_default:
- "default message"

actions:
- utter_default
- utter_greet
- utter_goodbye


What does this mean?

An intent is a string like "greet" or "restaurant_search". It describes what your user probably meant to say. For example, “show me Mexican restaurants”, and “I want to have lunch” could both be described as a restaurant_search intent.

slots are the things you want to keep track of during a conversation. For example, in the messages above you would want to store “Mexican” as a cuisine type. The tracker has an attribute like tracker.get_slot("cuisine") which will return "Mexican"

actions are the things your bot can actually do. They are invoked by calling the action.run() method. For example, an action can:

• respond to a user
• make an external API call
• query a database

### Defining Custom Actions¶

The easiest are UtterActions, which just send a message to the user. You define them by adding an entry to the action list that is named after the utterance. E.g. if there should be an action that utters the template called utter_greet you need to add greet to the list of defined actions. In the above example yaml you can see that all three of the defined actions are just named after utter templates and hence just respond with a message to the user.

What about more complicated actions? To continue with the restaurant example, if the user says “show me a Mexican restaurant”, your bot would execute the action ActionCheckRestaurants, which might look like this:

from rasa_core.actions import Action
from rasa_core.events import SetSlot

class ActionCheckRestaurants(Action):
def name(self):
return "check_restaurants"

def run(self, dispatcher, tracker, domain):
cuisine = tracker.get_slot('cuisine')
q = "select * from restaurants where cuisine='{0}' limit 1".format(cuisine)
result = db.query(q)

return [SetSlot("matches", result if result is not None else [])]


Note that actions do not mutate the tracker directly. Instead, an action can return events which are logged by the tracker and used to modify its own state.

### Putting it all together¶

Let’s add just this one new action to a custom domain (assuming we stored the action in a module called restaurant.actions):

intents:
- greet
- default
- goodbye

entities:
- name

templates:
utter_greet:
- "hey there!"
utter_goodbye:
- "goodbye :("
utter_default:
- "default message"

actions:
- default
- greet
- goodbye
- restaurant.actions.ActionCheckRestaurants


The point of this is just to show how the pieces fit together. As you can see, in the actions section of your domain, you can list utter actions (which respond an utter template to the user) as well as custom actions using their module path.

For an example you can run, check the A Bot From Scratch.

## Slot Types¶

Slots influence the prediction of the next action the bot should run. For the prediction, the slots value is not used directly, but rather it is featurized. E.g. for a slot of type text, the value is irrelevant, for the featurization the only thing that matters is if a text is set or not.

The choice of slot should be done with care. If a slots value should influence the dialogue flow (e.g. the users age influences which question follows next) you should choose a slot where the value influences the dialogue model.

These are all of the predefined slot classes and what they’re useful for.

### type: boolean¶

Use For: True or False Checks if slot is set and if True

### type: categorical¶

Use For: Slots which can take one of N values values Creates a one-hot encoding describing which of the values matched.

### type: data¶

Use For: Base class for creating own slots User has to subclass this and define the as_feature method containing any custom logic.

### type: float¶

Use For: Continuous values max_value, min_value Checks if float is within the range of min and max values.

### type: list¶

Use For: Lists of values The feature of this slot is set to 1 if a value with a list is set, where the list is not empty. If no value is set, or the empty list is the set value, the feature will be 0.

### type: text¶

Use For: User preferences where you only care whether or not they’ve been specified. Results in the feature of the slot being set to 1 if any value is set. Otherwise the feature will be set to 0 (no value is set).

### type: unfeaturized¶

Use For: Data you want to store which shouldn’t influence the dialogue flow There will not be any featurization of this slot, hence its value does not influence the dialogue flow and is ignored when predicting the next action the bot should run.