🚀 原文地址:https://rasa.com/docs/action-server/sdk-actions

Action类是任何自定义操作的基类,要定义自定义操作,请创建Action类的子类,并需要重写两个必须的方法namerun。Action Server 在收到运行操作的请求时,会根据name方法返回值调用操作。

基础班的自定义操作如下所示:

  1. class MyCustomAction(Action):
  2. def name(self) -> Text:
  3. return "action_name"
  4. async def run(
  5. self,
  6. dispatcher,
  7. tracker: Tracker,
  8. domain: Dict[Text, Any],
  9. ) -> List[Dict[Text, Any]]:
  10. return []

1. 方法

1.1 name

name方法定义操作的名称,此方法返回的名称是机器人在域文件中使用的名称。

1.2 run

run方法执行操作的副作用,返回的是rasa_sdk.events.Event实例列表,以下是参数的解释:

  • dispatcher:用于将消息发送回用户的调度程序,请使用dispatcher.utter_messages或任何其他rasa_sdk.executor.CollectingDispatcher方法
  • tracker:当前用户的状态跟踪器,我们可以使用tracker.get_slot(slot_name)访问插槽的值,使用tracker.latest_messages.text获取最新的用户消息,和任何其他rasa_sdk.Tracker属性
  • domain:机器人的领域

    2. 示例

    在餐厅机器人中,如果用户说“给我看看墨西哥餐厅”,机器人可以执行ActionCheckRestaurants操作,它可能如下所示: ```python 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”

  1. def run(self,
  2. dispatcher: CollectingDispatcher,
  3. tracker: Tracker,
  4. domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
  5. cuisine = tracker.get_slot('cuisine')
  6. q = "select * from restaurants where cuisine='{0}' limit 1".format(cuisine)
  7. result = db.query(q)
  8. return [SlotSet("matches", result if result is not None else [])]

``` 此操作查询数据库以查找与请求的美食匹配的餐厅,并使用找到的餐厅列表来设置匹配插槽的值。