rasa2.x之自定义channel连接器

缘起

当我们需要从前端传递额外参数到rasa后端时,需要我们自定义连接器来实现。

官方教程

https://rasa.com/docs/rasa/connectors/custom-connectors

详细步骤

1.编写连接器类

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 import (
    InputChannel,
    CollectingOutputChannel,
    UserMessage,
)


class MyIO(InputChannel):
    def name(cls) -> Text:
        return "myio"

    def __init__(self) -> None:
        self.custom_metadata = {}

    def blueprint(
            self, on_new_message: Callable[[UserMessage], Awaitable[Any]]
    ) -> Blueprint:
        custom_webhok = Blueprint(
            "custom_webhook_{}".format(type(self).__name__),
            inspect.getmodule(self).__name__,
        )

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

        @custom_webhok.route("/webhook", methods=["POST"])
        async def receive(request: Request) -> HTTPResponse:
            sender_id = request.json.get("sender")
            text = request.json.get("text")
            input_channel = self.name()
            metadata = self.get_metadata(request)
            collector = CollectingOutputChannel()

            await on_new_message(
                UserMessage(
                    text,
                    collector,
                    sender_id,
                    input_channel=input_channel,
                    metadata=metadata,
                )
            )
            # 响应
            return response.json(collector.messages)

        return custom_webhok

    def get_metadata(self, request: Request) -> Optional[Dict[Text, Any]]:
        return request.json.get("metadata", None)

2.修改credentials.yml文件

在这里插入图片描述

添加一行:


addons.custom_channel.MyIO:

addons是rasa项目下的文件夹名,custom_channel是连接器脚本文件名,MyIO是连接器类名

3.重写action_seesion_start

只有在action_seesion_start可以获取元数据,rasa默认的action_seesion_start是忽略元数据的,所以需要重写该Action。
根据槽值名称session_started_metadata来获取前端传递过来的元数据

class ActionSessionStart(Action):
    def name(self) -> Text:
        return "action_session_start"

    async def run(
            self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
    ) -> List[Dict[Text, Any]]:
        # 获取字典类型的元数据
        metadata = tracker.get_slot("session_started_metadata")
        print(metadata)
        return [SessionStarted(),ActionExecuted("action_listen")]```

4.修改domain文件

由于我们重写了rasa的默认Action,所以需要在domain文件中申明
添加:

actions:
- action_session_start

5.强制训练

由于我们重写了rasa的默认Action,所以需要添加参数**–force**强制训练使其生效。
cmd命令行:

rasa train --force

6.通过自定义连接器请求rasa

前置条件:

  • 开启rasa服务器
  • 开启action服务器。

请求地址为(myio为连接器名,与连接器脚本中相对应):

http://127.0.0.1:5005/webhooks/myio/webhook

请求参数为:

{
	"sender": "user",
    "text": "你好",
    "metadata":{"location":"116.08243,22.44579","address":"福建省厦门市"}
}

metadata为字典类型,可以在metadata中添加你想要传递给后端的参数

7.最终效果

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值