This is unreleased documentation for Rasa Action Server Documentation Master/Unreleased version.
For the latest released documentation, see the latest version (2.0.0).

Version: Master/Unreleased


The Action class is the base class for any custom action. To define a custom action, create a subclass of the Action class and overwrite the two required methods, name and run. The action server will call an action according to the return value of its name method when it receives a request to run an action.

A skeleton custom action looks like this:

class MyCustomAction(Action):
def name(self) -> Text:
return "action_name"
async def run(
self, dispatcher, tracker: Tracker, domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
return []


Defines the action's name. The name returned by this method is the one used in your bot's domain.

  • Returns:

    Name of action

  • Return type:


async, tracker, domain)

The run method executes the side effects of the action.


  • dispatcher – the dispatcher which is used to send messages back to the user. Use dispatcher.utter_message() or any other rasa_sdk.executor.CollectingDispatcher method. See the documentation for the dispatcher

  • tracker – the state tracker for the current user. You can access slot values using tracker.get_slot(slot_name), the most recent user message is tracker.latest_message.text and any other rasa_sdk.Tracker property. See the documentation for the tracker.

  • domain – the bot's domain


A list of instances. See the documentation for events.

Return type

List[Dict[str, Any]]


In a restaurant bot, if the user says “show me a Mexican restaurant”, your bot could execute the action ActionCheckRestaurants, which might look like this:

from rasa_sdk import Action
from import SlotSet
class ActionCheckRestaurants(Action):
def name(self) -> Text:
return "action_check_restaurants"
def run(self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
cuisine = tracker.get_slot('cuisine')
q = "select * from restaurants where cuisine='{0}' limit 1".format(cuisine)
result = db.query(q)
return [SlotSet("matches", result if result is not None else [])]

This action queries a database to find restaurants matching the requested cuisine, and uses the list of restaurants found to set the value of the matches slot.