优化dify插件代码
This commit is contained in:
@@ -128,149 +128,92 @@ class DifyPlugin(MessagePluginInterface):
|
|||||||
sender = message.get("sender")
|
sender = message.get("sender")
|
||||||
roomid = message.get("roomid", "")
|
roomid = message.get("roomid", "")
|
||||||
gbm: GroupBotManager = message.get("gbm")
|
gbm: GroupBotManager = message.get("gbm")
|
||||||
|
|
||||||
bot: WechatAPIClient = message.get("bot")
|
bot: WechatAPIClient = message.get("bot")
|
||||||
revoke: MessageAutoRevoke = message.get("revoke")
|
revoke: MessageAutoRevoke = message.get("revoke")
|
||||||
|
|
||||||
|
# 获取目标接收者(群聊为群ID,私聊为个人wxid)
|
||||||
|
target = roomid if roomid else sender
|
||||||
|
|
||||||
|
# 检查权限
|
||||||
|
if roomid and gbm.get_group_permission(target, Feature.AI_CAPABILITY) == PermissionStatus.DISABLED:
|
||||||
|
return False, "没有权限"
|
||||||
|
|
||||||
# 处理被@的消息
|
# 处理被@的消息
|
||||||
if message.get("is_at", False) and roomid:
|
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()
|
query = re.sub(r"@.*?[\u2005|\s]", "", content).strip()
|
||||||
|
|
||||||
if not query:
|
if not query:
|
||||||
await bot.send_at_message(roomid, "请在@我的同时提供问题内容", [sender])
|
await bot.send_at_message(target, "请在@我的同时提供问题内容", [sender])
|
||||||
return False, "没有提供问题内容"
|
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:
|
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)
|
parts = content.split(" ", 1)
|
||||||
command = parts[0]
|
|
||||||
|
|
||||||
# 检查命令格式
|
|
||||||
if len(parts) < 2 or not parts[1].strip():
|
if len(parts) < 2 or not parts[1].strip():
|
||||||
await bot.send_text_message((roomid if roomid else sender), f"{self.command_format}", sender)
|
await bot.send_text_message(target, f"{self.command_format}", sender)
|
||||||
return False, "命令格式错误"
|
return False, "命令格式错误"
|
||||||
|
|
||||||
# 检查权限
|
|
||||||
if roomid and gbm.get_group_permission((roomid if roomid else sender),
|
|
||||||
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()
|
query = parts[1].strip()
|
||||||
|
|
||||||
# 获取会话ID(群聊使用群ID,私聊使用个人wxid)
|
|
||||||
session_id = roomid if roomid else sender
|
|
||||||
|
|
||||||
# 获取用户ID
|
|
||||||
user_id = sender
|
|
||||||
|
|
||||||
try:
|
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获取回复
|
# 调用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:
|
if not success:
|
||||||
return False, response
|
return False, response
|
||||||
|
|
||||||
# 去除广告内容
|
# 去除广告内容
|
||||||
self.LOG.debug(f"_chat_with_dify response:{response}")
|
|
||||||
response = remove_trailing_content(response)
|
response = remove_trailing_content(response)
|
||||||
self.LOG.debug(f"remove_trailing_content response:{response}")
|
self.LOG.debug(f"处理后的响应: {response}")
|
||||||
|
|
||||||
# 发送回复
|
# 发送回复
|
||||||
if response:
|
if response:
|
||||||
# 判断是否为本地文件路径
|
return await self._send_response(bot, target, sender, response, roomid)
|
||||||
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:
|
else:
|
||||||
return False, "获取媒资失败"
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(
|
||||||
else:
|
target, "❌未能获取到回复,请稍后再试", sender if roomid else "")
|
||||||
# 如果是普通文本,则在长度大于100字时,转为图片发送
|
revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 5)
|
||||||
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:
|
|
||||||
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)
|
|
||||||
return False, "未获取到回复"
|
return False, "未获取到回复"
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.LOG.exception(f"处理Dify聊天请求出错: {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),
|
client_msg_id, create_time, new_msg_id = await bot.send_text_message(
|
||||||
f"❌请求出错:{str(e)}",
|
target, f"❌请求出错:{str(e)}", sender if roomid else "")
|
||||||
sender if roomid else "")
|
revoke.add_message_to_revoke(target, client_msg_id, create_time, new_msg_id, 5)
|
||||||
|
|
||||||
revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
|
|
||||||
return False, f"处理出错: {e}"
|
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]]:
|
async def _chat_with_dify(self, session_id: str, user_id: str, query: str) -> Tuple[bool, Optional[str]]:
|
||||||
"""
|
"""
|
||||||
与Dify API交互获取回复
|
与Dify API交互获取回复
|
||||||
|
|||||||
Reference in New Issue
Block a user