Action类是任何自定义操作的基类,要定义自定义操作,请创建Action类的子类,并需要重写两个必须的方法name和run。Action Server 在收到运行操作的请求时,会根据name方法返回值调用操作。
基础班的自定义操作如下所示:
class MyCustomAction(Action):def name(self) -> Text:return "action_name"async def run(self,dispatcher,tracker: Tracker,domain: Dict[Text, Any],) -> List[Dict[Text, Any]]: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”
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 [])]
``` 此操作查询数据库以查找与请求的美食匹配的餐厅,并使用找到的餐厅列表来设置匹配插槽的值。
