优化dify插件代码
This commit is contained in:
@@ -128,149 +128,92 @@ class DifyPlugin(MessagePluginInterface):
|
||||
sender = message.get("sender")
|
||||
roomid = message.get("roomid", "")
|
||||
gbm: GroupBotManager = message.get("gbm")
|
||||
|
||||
bot: WechatAPIClient = message.get("bot")
|
||||
revoke: MessageAutoRevoke = message.get("revoke")
|
||||
|
||||
# 处理被@的消息
|
||||
if message.get("is_at", False) and roomid:
|
||||
# 检查权限
|
||||
if gbm.get_group_permission(roomid, Feature.AI_CAPABILITY) == PermissionStatus.DISABLED:
|
||||
return False, "没有权限"
|
||||
|
||||
# 去除@的人和空格等字符
|
||||
query = re.sub(r"@.*?[\u2005|\s]", "", content).strip()
|
||||
|
||||
if not query:
|
||||
await bot.send_at_message(roomid, "请在@我的同时提供问题内容", [sender])
|
||||
return False, "没有提供问题内容"
|
||||
|
||||
try:
|
||||
# 调用Dify API获取回复
|
||||
success, response = await self._chat_with_dify((roomid if roomid else sender), sender, query)
|
||||
if not success:
|
||||
return False, response
|
||||
# 去除广告内容
|
||||
response = remove_trailing_content(response)
|
||||
|
||||
# 发送回复
|
||||
if response:
|
||||
# 判断是否为本地文件路径
|
||||
if os.path.isfile(response):
|
||||
# 如果是文件路径,使用发送文件方法
|
||||
file_type = self.check_file_type(response)
|
||||
if file_type == 1:
|
||||
await bot.send_image_message((roomid if roomid else sender), Path(response))
|
||||
elif file_type == 2:
|
||||
first_farme = self._get_first_frame(response, f"dify_frame_{int(time.time())}.jpg")
|
||||
await bot.send_video_message((roomid if roomid else sender), Path(response),
|
||||
Path(first_farme))
|
||||
else:
|
||||
return False, "获取媒资失败"
|
||||
else:
|
||||
# 如果是普通文本,则在长度大于100字时,转为图片发送
|
||||
if len(response) > 800:
|
||||
# 转图片
|
||||
output_image = f"dify_output_{int(time.time())}.png"
|
||||
respath = await convert_md_str_to_image(response, output_image)
|
||||
await bot.send_image_message((roomid if roomid else sender), Path(respath))
|
||||
else:
|
||||
# 如果是普通文本,使用发送文本方法
|
||||
await bot.send_at_message((roomid if roomid else sender), response, [sender])
|
||||
return True, "发送成功"
|
||||
else:
|
||||
await bot.send_text_message((roomid if roomid else sender), "❌未能获取到回复,请稍后再试", sender)
|
||||
return False, "未获取到回复"
|
||||
|
||||
except Exception as e:
|
||||
self.LOG.exception(f"处理Dify聊天请求出错: {e}")
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender),
|
||||
"❌未能获取到回复,请稍后再试",
|
||||
sender)
|
||||
revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||
|
||||
return False, f"处理出错: {e}"
|
||||
|
||||
# 原有的命令处理逻辑
|
||||
parts = content.split(" ", 1)
|
||||
command = parts[0]
|
||||
|
||||
# 检查命令格式
|
||||
if len(parts) < 2 or not parts[1].strip():
|
||||
await bot.send_text_message((roomid if roomid else sender), f"{self.command_format}", sender)
|
||||
return False, "命令格式错误"
|
||||
# 获取目标接收者(群聊为群ID,私聊为个人wxid)
|
||||
target = roomid if roomid else sender
|
||||
|
||||
# 检查权限
|
||||
if roomid and gbm.get_group_permission((roomid if roomid else sender),
|
||||
Feature.AI_CAPABILITY) == PermissionStatus.DISABLED:
|
||||
if roomid and gbm.get_group_permission(target, Feature.AI_CAPABILITY) == PermissionStatus.DISABLED:
|
||||
return False, "没有权限"
|
||||
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender),
|
||||
"⏳AI 正在加油,请稍候… 😊",
|
||||
sender if roomid else "")
|
||||
|
||||
revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 3)
|
||||
# 获取查询内容
|
||||
query = parts[1].strip()
|
||||
|
||||
# 获取会话ID(群聊使用群ID,私聊使用个人wxid)
|
||||
session_id = roomid if roomid else sender
|
||||
|
||||
# 获取用户ID
|
||||
user_id = sender
|
||||
# 处理被@的消息
|
||||
if message.get("is_at", False) and roomid:
|
||||
# 去除@的人和空格等字符
|
||||
query = re.sub(r"@.*?[\u2005|\s]", "", content).strip()
|
||||
if not query:
|
||||
await bot.send_at_message(target, "请在@我的同时提供问题内容", [sender])
|
||||
return False, "没有提供问题内容"
|
||||
else:
|
||||
# 处理命令消息
|
||||
parts = content.split(" ", 1)
|
||||
if len(parts) < 2 or not parts[1].strip():
|
||||
await bot.send_text_message(target, f"{self.command_format}", sender)
|
||||
return False, "命令格式错误"
|
||||
query = parts[1].strip()
|
||||
|
||||
try:
|
||||
# 发送等待消息
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(
|
||||
target, "⏳AI 正在加油,请稍候… 😊", sender if roomid else "")
|
||||
revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 3)
|
||||
|
||||
# 调用Dify API获取回复
|
||||
success, response = await self._chat_with_dify(session_id, user_id, query)
|
||||
success, response = await self._chat_with_dify(target, sender, query)
|
||||
if not success:
|
||||
return False, response
|
||||
|
||||
# 去除广告内容
|
||||
self.LOG.debug(f"_chat_with_dify response:{response}")
|
||||
response = remove_trailing_content(response)
|
||||
self.LOG.debug(f"remove_trailing_content response:{response}")
|
||||
self.LOG.debug(f"处理后的响应: {response}")
|
||||
|
||||
# 发送回复
|
||||
if response:
|
||||
# 判断是否为本地文件路径
|
||||
if os.path.isfile(response):
|
||||
# 如果是文件路径,使用发送文件方法
|
||||
# 判断是视频还是图片:
|
||||
file_type = self.check_file_type(response)
|
||||
if file_type == 1:
|
||||
await bot.send_image_message((roomid if roomid else sender), Path(response))
|
||||
elif file_type == 2:
|
||||
# 提取首帧
|
||||
first_farme = self._get_first_frame(response, f"dify_frame_{int(time.time())}.jpg")
|
||||
await bot.send_video_message((roomid if roomid else sender), Path(response), Path(first_farme))
|
||||
else:
|
||||
return False, "获取媒资失败"
|
||||
else:
|
||||
# 如果是普通文本,则在长度大于100字时,转为图片发送
|
||||
if len(response) > 800:
|
||||
# 转图片
|
||||
output_image = f"dify_output_{int(time.time())}.png"
|
||||
respath = await convert_md_str_to_image(response, output_image)
|
||||
await bot.send_image_message((roomid if roomid else sender), Path(respath))
|
||||
else:
|
||||
# 如果是普通文本,使用发送文本方法
|
||||
await bot.send_at_message((roomid if roomid else sender), response, [sender])
|
||||
return True, "发送成功"
|
||||
return await self._send_response(bot, target, sender, response, roomid)
|
||||
else:
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender),
|
||||
"❌未能获取到回复,请稍后再试",
|
||||
sender if roomid else "")
|
||||
|
||||
revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(
|
||||
target, "❌未能获取到回复,请稍后再试", sender if roomid else "")
|
||||
revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 5)
|
||||
return False, "未获取到回复"
|
||||
|
||||
except Exception as e:
|
||||
self.LOG.exception(f"处理Dify聊天请求出错: {e}")
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender),
|
||||
f"❌请求出错:{str(e)}",
|
||||
sender if roomid else "")
|
||||
|
||||
revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
||||
client_msg_id, create_time, new_msg_id = await bot.send_text_message(
|
||||
target, f"❌请求出错:{str(e)}", sender if roomid else "")
|
||||
revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 5)
|
||||
return False, f"处理出错: {e}"
|
||||
|
||||
async def _send_response(self, bot: WechatAPIClient, target: str, sender: str,
|
||||
response: str, roomid: str) -> Tuple[bool, str]:
|
||||
"""发送响应消息的辅助方法"""
|
||||
try:
|
||||
# 判断是否为本地文件路径
|
||||
if os.path.isfile(response):
|
||||
# 如果是文件路径,使用发送文件方法
|
||||
file_type = self.check_file_type(response)
|
||||
if file_type == 1:
|
||||
await bot.send_image_message(target, Path(response))
|
||||
elif file_type == 2:
|
||||
first_frame = self._get_first_frame(response, f"dify_frame_{int(time.time())}.jpg")
|
||||
await bot.send_video_message(target, Path(response), Path(first_frame))
|
||||
else:
|
||||
return False, "获取媒资失败"
|
||||
else:
|
||||
# 如果是普通文本,则在长度大于800字时,转为图片发送
|
||||
if len(response) > 800:
|
||||
# 转图片
|
||||
output_image = f"dify_output_{int(time.time())}.png"
|
||||
respath = await convert_md_str_to_image(response, output_image)
|
||||
await bot.send_image_message(target, Path(respath))
|
||||
else:
|
||||
# 如果是普通文本,使用发送文本方法
|
||||
await bot.send_at_message(target, response, [sender])
|
||||
return True, "发送成功"
|
||||
except Exception as e:
|
||||
self.LOG.error(f"发送响应消息时出错: {e}")
|
||||
return False, f"发送响应失败: {e}"
|
||||
|
||||
async def _chat_with_dify(self, session_id: str, user_id: str, query: str) -> Tuple[bool, Optional[str]]:
|
||||
"""
|
||||
与Dify API交互获取回复
|
||||
|
||||
Reference in New Issue
Block a user