olivebot/test/rasa/actions/actions.py
xszyou d90d699b58 Fay数字人助理版提交
+ 打出Fay数字人助理版作为主分支(带货版移到分支[`fay-sales-edition`]);
+ 添加Fay助理的文字沟通窗口(文字与语音同步);
+ 添加沟通记录本地保存功能;
+ 升级ChatGLM-6B的应用逻辑,长文本与语音回复分享;
2023-05-12 18:56:36 +08:00

149 lines
5.0 KiB
Python

from rasa_sdk import Action,Tracker
from rasa_sdk.executor import CollectingDispatcher
from datetime import datetime
from dateutil.parser import parse
from dateutil.relativedelta import relativedelta
import json
import requests
from rasa_sdk.forms import FormValidationAction
class ValidateScheduleReminderForm(FormValidationAction):
def name(self) :
return "validate_schedule_reminder_form"
async def validate_date(self, value, dispatcher: CollectingDispatcher, tracker: Tracker, domain) :
# 在这里添加您的日期验证逻辑
return {"date": value}
async def validate_time(self, value, dispatcher: CollectingDispatcher, tracker: Tracker, domain):
# 在这里添加您的时间验证逻辑
return {"time": value}
async def validate_event(self, value, dispatcher: CollectingDispatcher, tracker: Tracker, domain):
# 在这里添加您的事件验证逻辑
return {"event": value}
class ActionGPTResponse(Action):
def name(self) -> str:
return "action_gpt_response"
async def run(self, dispatcher: CollectingDispatcher, tracker, domain):
history = []
user_messages = []
bot_messages = []
# Separate user messages and bot messages
for event in tracker.events:
if event.get("event") == "user":
user_messages.append(event.get("text"))
elif event.get("event") == "bot":
bot_messages.append(event.get("text"))
# Combine user and bot messages
for user, bot in zip(user_messages, bot_messages):
history.append([user, bot])
print("*******************************")
print(history)
print("*******************************")
url = "http://127.0.0.1:8000"
req = json.dumps({
"prompt": "请用20字内回复我。" + tracker.latest_message.get("text"),
"history": history})
headers = {'content-type': 'application/json'}
r = requests.post(url, headers=headers, data=req)
a = json.loads(r.text).get('response')
history = json.loads(r.text).get('history')
dispatcher.utter_message(a)
return []
class ActionAskDate(Action):
def name(self):
return "action_ask_date"
async def run(self, dispatcher, tracker, domain):
# 获取当前日期
today = datetime.now().date()
# 获取星期几的信息
week_day = today.strftime("%A")
# 将星期几的英文名称转换为中文
week_day_zh = {
"Monday": "星期一",
"Tuesday": "星期二",
"Wednesday": "星期三",
"Thursday": "星期四",
"Friday": "星期五",
"Saturday": "星期六",
"Sunday": "星期日",
}.get(week_day, "未知")
# 将日期格式化为字符串
date_str = today.strftime("%Y年%m月%d")
# 将日期和星期信息发送给用户
dispatcher.utter_message(text=f"今天是 {date_str} {week_day_zh}")
class ActionAskTime(Action):
def name(self):
return "action_ask_time"
async def run(self, dispatcher, tracker, domain):
# 获取当前时间
now = datetime.now()
# 将时间格式化为字符串
time_str = now.strftime("%H:%M")
# 将时间信息发送给用户
dispatcher.utter_message(text=f"现在是 {time_str}")
def parse_datetime(datetime_str):
try:
datetime_obj = parse(datetime_str, fuzzy=True)
if "" in datetime_str: # 处理相对日期,如 "周五"
today = datetime.now().date()
weekday_diff = (datetime_obj.weekday() - today.weekday()) % 7
datetime_obj = today + relativedelta(days=weekday_diff)
return datetime_obj
except ValueError:
print("无法解析日期和时间")
class ActionAskProblem(Action):
def name(self) -> str:
return "action_ask_problem"
async def run(self, dispatcher: CollectingDispatcher, tracker, domain):
history = []
user_messages = []
bot_messages = []
# Separate user messages and bot messages
for event in tracker.events:
if event.get("event") == "user":
user_messages.append(event.get("text"))
elif event.get("event") == "bot":
bot_messages.append(event.get("text"))
# Combine user and bot messages
for user, bot in zip(user_messages, bot_messages):
history.append([user, bot])
print("*******************************")
print(history)
print("*******************************")
url = "http://127.0.0.1:8000"
req = json.dumps({
"prompt": tracker.latest_message.get("text"),
"history": history})
headers = {'content-type': 'application/json'}
r = requests.post(url, headers=headers, data=req)
a = json.loads(r.text).get('response')
history = json.loads(r.text).get('history')
dispatcher.utter_message(a)
return []