# Rasa SDK

Rasa SDK provides the tools you need to write custom actions in python.

## [Installation](https://legacy-docs-v1.rasa.com/1.10.8/api/rasa-sdk/#installation)
Use `pip` to install `rasa-sdk` on your action server.

```
pip install rasa-sdk
```

Note

You do not need to install `rasa` for your action server.
E.g. if you are running Rasa in a docker container, it is recommended to
create a separate container for your action server. In this
separate container, you only need to install `rasa-sdk`.

## [Running the Action Server](https://legacy-docs-v1.rasa.com/1.10.8/api/rasa-sdk/#running-the-action-server)
If you have `rasa` installed, run this command to start your action server:

```
rasa run actions
```

Otherwise, if you do not have `rasa` installed, run this command:

```
python -m rasa_sdk --actions actions
```

You can verify that the action server is up and running with the command:

```
curl http://localhost:5055/health
```

You can get the list of registered custom actions with the command:

```
curl http://localhost:5055/actions
```

The file that contains your custom actions should be called `actions.py`.
Alternatively, you can use a package directory called `actions` or else
manually specify an actions module or package with the `--actions` flag.

---

## [Actions](https://legacy-docs-v1.rasa.com/1.10.8/api/rasa-sdk/#actions)
The `Action` class is the base class for any custom action. It has two methods
that both need to be overwritten, `name()` and `run()`.

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:

```python
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 [])]
```

You should add the action name `action_check_restaurants` to
the actions in your domain file. The action’s `run()` method receives
three arguments. You can access the values of slots and the latest message
sent by the user using the `tracker` object, and you can send messages
back to the user with the `dispatcher` object, by calling
`dispatcher.utter_message`.

### Details of the `run()` method:

`_async_`Action.``run`( _dispatcher_, _tracker_, _domain_) [¶](https://legacy-docs-v1.rasa.com/1.10.8/api/rasa-sdk/#rasa_sdk.Action.run "Permalink to this definition")

Execute the side effects of this action.

Parameters

- **dispatcher** – the dispatcher which is used to
send messages back to the user. Use
`dipatcher.utter_message()` or any other
`rasa_sdk.executor.CollectingDispatcher`
method.

- **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.

- **domain** – the bot’s domain

Returns

A dictionary of `rasa_sdk.events.Event` instances that is
returned through the endpoint

Return type
`List`
[`Dict`
[`str`, `Any`
]
]

### Note

You need to explicitly add `action_session_start` to your domain to override this custom action.

## [Tracker](https://legacy-docs-v1.rasa.com/1.10.8/api/rasa-sdk/#id7)
The `rasa_sdk.Tracker` lets you access the bot’s memory in your custom actions. You can get information about past events and the current state of the conversation through `Tracker` attributes and methods.

The following are available as attributes of a `Tracker` object:

- `sender_id` 
- `slots` 
- `latest_message` 
- `events` 
- `active_form` 
- `latest_action_name`

---
