Custom Actions

Note

This tutorial will show you the pieces required to deploy an action server to Rasa Platform.

Goal

We will deploy an example action server to your running instance of the Platform. The recommended way of doing this is using Docker, but it’s not required. The only requirement is that your action server provides a webhook for executing actions, and supplying that url to Rasa Core. For the rest of this tutorial we will assume you are using Docker.

The easiest way to follow along is if you carry out these steps while in an ssh session on the server where you deployed the Platform. In the final section we discuss how to build and deploy to a remote server.

Clone and the Rasa platform-demo repository by running

git clone https://github.com/RasaHQ/platform-demo.git

Creating an action server and a Docker container

For custom actions written in python, creating a server is as simple as passing an actions.py file to the Rasa Core SDK:

python -m rasa_core_sdk.endpoint --actions actions -p 5001

This script runs a server that handles custom actions your bot should take. To run this as a docker container, you will need to build an image.

Building Your Docker Image

The platform-demo directory contains a Dockerfile that can be used to build an executable server. To build a docker image from your demo app, go to the root directory of the platform-demo repo and run:

docker build --build-arg CORE_SDK_VERSION=0.11.2 -t $IMAGE_TAG .

Note

You will need to supply a --build-arg specifying the version of Rasa Core SDK that should be used. We recommend you use version 0.13.1 of Rasa Core SDK with this version of Rasa Platform.

This will use the Dockerfile in your current directory. For now, you can use something like IMAGE_TAG=demobot:v1. If you are deploying to a remote server, you will want to push the image to a registry first. An image tag like IMAGE_TAG=username/demobot:v1 will allow you to push this tag to a docker registry like GCR or docker Hub. You can read more about docker tags here.

Start the action server

Once your docker image is built, you can start the container using the command below.

sudo docker pull $IMAGE_TAG
sudo docker stop app 2> /dev/null
sudo docker rm app 2> /dev/null
sudo docker run -d -p 5001:5001 --name app $IMAGE_TAG

Deploying that container as part of the Platform

To start your container as part of the Platform, you need to add it to the docker-compose specification. This will tell the docker runner to start your container as part of the Platform.

Instead of changing /etc/rasaplatform/docker-compose.yml we strongly recommend to create a file /etc/rasaplatform/docker-compose.override.yml with your changes. Any changes made to /etc/rasaplatform/docker-compose.yml might be overwritten by an update.

Here is an example docker-compose.override.yml that includes the changes necessary to start the above docker:

version: '3.4'
services:
  app:
    build:
      context: app
      dockerfile: Dockerfile
    container_name: "app"
    environment:
      # any env vars you need go here
    expose:
    - "5001"
    depends_on:
    - core

This assumes that your custom action server code is stored on the machine in /etc/rasaplatform/app and your docker file is located there as well /etc/rasaplatform/app/Dockerfile.

After creating this docker-compose.override.yml, you can use the following commands to restart the Platform with your action server:

cd /etc/rasaplatform
sudo docker-compose up --build -d

This setup will build the docker container directly on the server.

Alternatively, you can also build the docker container externally (e.g. on a continuous integration server like travis) and use that image in the docker compose:

version: '3'
services:
  app:
    image: my-private-docker-registry.com/platform-app:latest
    container_name: "app"
    environment:
      RASA_API_ENDPOINT_URL: "${RASA_PLATFORM_HOST:-http://api:5002}"
    expose:
    - "5001"
    depends_on:
    - core

In this case, you need to make sure to pull the image before starting up the server:

cd /etc/rasaplatform
sudo docker login -u USER -p PASSWORD https://my-private-docker-registry.com
sudo docker pull my-private-docker-registry.com/platform-app:latest

After the image is successfully pulled, make sure to login with the Rasa Platform credentials again and restart the Platform:

sudo docker login -u _json_key -p "$(cat /etc/rasaplatform/gcr-auth.json)" https://gcr.io
sudo docker-compose pull
sudo docker-compose up -d

Note

sudo docker-compose pull will also attempt to pull the latest image of your action server. This will fail because you’re logged in with the Rasa credentials, rather than your own. To update the Platform successfully, run sudo docker-compose pull --ignore-pull-failures

You can use the Dockerfile from the Platform demo as a basis for the custom action server of your own bot. The important part is that the Dockerfile starts the action server, and the easiest way to do this is with the following command (assuming your actions are in the actions.py file):

python -m rasa_core_sdk.endpoint --actions actions -p 5001