0.2.0 • Published 4 years ago

rasa-node-action-server v0.2.0

Weekly downloads
-
License
MIT
Repository
github
Last release
4 years ago

Rasa Node Action Server

npm version node dependencies

NodeJS alternative to Rasa SDK Action Server

Why

  • Allow people to write their own action server in JavaScript with NodeJS
  • Does not require the use of Rasa-SDK
  • Simple and not verbose action definition

Install

$ npm install rasa-node-action-server

Quickstart

To start a simple Action Server you can use the following quick start example.

// index.js
const { RasaNodeActionServer } = require("./rasa-node-action-server");

const rnas = new RasaNodeActionServer();

rnas.define("action_hello_world", (action, res) => {
  res.addEvent("bot")("Hello world, from your action server");
  res.send();
});

rnas.start();

and run

node index.js

The RasaNodeActionServer by default will start an express server on localhost:5055.

Rasa Custom Connectors

If you want to pass additional parameters to your rasa action inside your request, you should use the metadata field as suggested in the rasa documentation.

Custom Connector Example

For a quick start, you can use the following custom connector which allows the metadata parameter to be forwarded to the server.

# custom_connector.py
import asyncio
import inspect
from sanic import Sanic, Blueprint, response
from sanic.request import Request
from sanic.response import HTTPResponse
from typing import Text, Dict, Any, Optional, Callable, Awaitable, NoReturn

import rasa.utils.endpoints
from rasa.core.channels.channel import (
    InputChannel,
    CollectingOutputChannel,
    UserMessage,
)
import logging

logger = logging.getLogger(__name__)


class RasaNodeChannel(InputChannel):
    """A simple web bot that listens on a url and responds."""

    @classmethod
    def name(self) -> Text:
        return "rnc"

    def blueprint(
        self, on_new_message: Callable[[UserMessage], Awaitable[None]]
    ) -> Blueprint:

        custom_webhook = Blueprint(
            "custom_webhook_{}".format(type(self).__name__),
            inspect.getmodule(self).__name__,
        )

        @custom_webhook.route("/", methods=["GET"])
        async def health(request: Request) -> HTTPResponse:
            return response.json({"status": "ok"})

        @custom_webhook.route("/webhook", methods=["POST"])
        async def receive(request: Request) -> HTTPResponse:
            sender_id = request.json.get("sender") # method to get sender_id
            text = request.json.get("message") # method to fetch text
            input_channel = self.name() # method to fetch input channel
            metadata = self.get_metadata(request) # method to get metadata

            collector = CollectingOutputChannel()

            # include exception handling

            await on_new_message(
                UserMessage(
                    text,
                    collector,
                    sender_id,
                    input_channel=input_channel,
                    metadata=metadata,
                )
            )

            return response.json(collector.messages)

        return custom_webhook

    def get_metadata(self, req) -> Text:
        return req.json.get("metadata") or self.name()

and define it inside the credentials.yml file like this:

rest:

custom_channel.RasaNodeChannel:

rasa:
  url: "http://localhost:5002/api"

You can then test your server by running:

curl -XPOST http://localhost:5005/webhooks/rnc/webhook \
  -H "Content-type: application/json" \
  -d '{"sender": "lykos94",  "message": "Hello bot", "metadata":{}}'

response:

[{"recipient_id":"lykos94","text":"Hello world, from your action server"}]

Methods Reference

RasaNodeActionServer

Constructor

ParameterTypeDescriptionDefault
portnumberOptional.The port on which the Action Server will start5055
portstringOptional. The host on which the Action Server will start"localhost"

define(action_name, action_function)

ParameterTypeDescriptionDefault
action_namestringRequired. The name of the action to triggernone
action_functionfunctionRequired. The function to trigger. This function received 2 parameters: action and responsenone

start()

Function that registers all the action handlers and run the action server

RasaAction

getSender()

Function to retrieve the sender of the action request

getMetadata()

Function to retrieve the metadata of the action request

getDomain()

Function to retrieve the domain of the action request

RasaActionResponse

addEvent(event)

ParameterTypeDescriptionDefault
eventRasaActionEventRequired. A RasaActionEvent with the event type called as functionnone
// example
res.addEvent(RasaActionEvent.bot("Hello from bot"))

addResponse(response)

ParameterTypeDescriptionDefault
responseobjectRequired. The object to add to a responsenone
// example
res.addResponse({ test:"Text of the response" })

getDomain()

Function to send the response back to the Rasa server

Maintainers

0.2.0

4 years ago

0.1.2

4 years ago

0.1.1-1

4 years ago

0.1.1-0

4 years ago