Version: Main/Unreleased

Actions

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 []

Methods

Action.name

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:

    str

Action.run

async Action.run(dispatcher, tracker, domain)

The run method executes the side effects of the action.

Parameters

  • 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

Returns

A list of rasa_sdk.events.Event instances. See the documentation for events.

Return type

List[Dict[str, Any]]

Example

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 typing import Text, Dict, Any, List
from rasa_sdk import Action
from rasa_sdk.events 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.