优化dify插件代码

This commit is contained in:
liuwei
2025-06-04 09:45:50 +08:00
parent 7bf512ce2b
commit 41defc6ec3

View File

@@ -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交互获取回复