From a0977607bd683113b67336a9521b5408ef5818c5 Mon Sep 17 00:00:00 2001 From: shihao <3127647737@qq.com> Date: Tue, 30 Dec 2025 17:01:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=A1=A5=20tool=5Fmessage=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=9B=BE=E7=89=87=E5=9C=BA=E6=99=AF=20need=5Fai=5Frep?= =?UTF-8?q?ly=20=E5=9B=9E=E4=BC=A0=EF=BC=8C=E4=BF=AE=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E5=86=99=20history=20=E7=9A=84=20chat=5Fid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/AIChat/main.py | 44 +++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/plugins/AIChat/main.py b/plugins/AIChat/main.py index b9381fe..af7664f 100644 --- a/plugins/AIChat/main.py +++ b/plugins/AIChat/main.py @@ -2803,8 +2803,6 @@ class AIChat(PluginBase): # 并行执行所有工具 if tasks: results = await asyncio.gather(*tasks, return_exceptions=True) - - # 收集需要 AI 回复的工具结果 need_ai_reply_results = [] # 处理每个工具的结果 @@ -2812,6 +2810,7 @@ class AIChat(PluginBase): tool_info = tool_info_list[i] function_name = tool_info["function_name"] tool_call_id = tool_info["tool_call_id"] + tool_call_id = tool_info["tool_call_id"] if isinstance(result, Exception): logger.error(f"[异步] 工具 {function_name} 执行异常: {result}") @@ -2853,7 +2852,7 @@ class AIChat(PluginBase): logger.warning(f"[异步] 工具 {function_name} 输出清洗后为空,已跳过发送") # 工具失败默认回一条错误提示 - if not tool_result.success and tool_result.message and not tool_result.no_reply: + if not tool_result.success and tool_message and not tool_result.no_reply: try: if tool_message: await bot.send_text(from_wxid, f"❌ {tool_message}") @@ -3080,10 +3079,12 @@ class AIChat(PluginBase): # 并行执行所有工具 if tasks: results = await asyncio.gather(*tasks, return_exceptions=True) + need_ai_reply_results = [] for i, result in enumerate(results): tool_info = tool_info_list[i] function_name = tool_info["function_name"] + tool_call_id = tool_info["tool_call_id"] if isinstance(result, Exception): logger.error(f"[异步-图片] 工具 {function_name} 执行异常: {result}") @@ -3097,19 +3098,29 @@ class AIChat(PluginBase): if not tool_result: continue + tool_message = self._sanitize_llm_output(tool_result.message or "") + if tool_result.success: logger.success(f"[异步-图片] 工具 {function_name} 执行成功") else: logger.warning(f"[异步-图片] 工具 {function_name} 执行失败") - if tool_result.success and not tool_result.already_sent and tool_result.message and not tool_result.no_reply: + if tool_result.need_ai_reply: + need_ai_reply_results.append({ + "tool_call_id": tool_call_id, + "function_name": function_name, + "result": tool_message + }) + continue + + if tool_result.success and not tool_result.already_sent and tool_message and not tool_result.no_reply: if tool_result.send_result_text: if tool_message: await bot.send_text(from_wxid, tool_message) else: logger.warning(f"[异步-图片] 工具 {function_name} 输出清洗后为空,已跳过发送") - if not tool_result.success and tool_result.message and not tool_result.no_reply: + if not tool_result.success and tool_message and not tool_result.no_reply: try: if tool_message: await bot.send_text(from_wxid, f"❌ {tool_message}") @@ -3122,6 +3133,12 @@ class AIChat(PluginBase): if tool_message: self._add_to_memory(chat_id, "assistant", f"[工具 {function_name} 结果]: {tool_message}") + if need_ai_reply_results: + await self._continue_with_tool_results( + need_ai_reply_results, bot, from_wxid, chat_id, + nickname, is_group, messages, tool_calls_data + ) + logger.info(f"[异步-图片] 所有工具执行完成") except Exception as e: @@ -4635,16 +4652,17 @@ class AIChat(PluginBase): # 获取用户昵称 - 使用缓存优化 nickname = await self._get_user_display_label(bot, from_wxid, user_wxid, is_group) + history_chat_id = self._get_group_history_chat_id(from_wxid, user_wxid) # 立即插入占位符到 history placeholder_id = str(uuid.uuid4()) - await self._add_to_history_with_id(from_wxid, nickname, "[图片: 处理中...]", placeholder_id) + await self._add_to_history_with_id(history_chat_id, nickname, "[图片: 处理中...]", placeholder_id) logger.info(f"已插入图片占位符: {placeholder_id}") # 将任务加入队列(不阻塞) task = { "bot": bot, - "from_wxid": from_wxid, + "history_chat_id": history_chat_id, "nickname": nickname, "cdnbigimgurl": cdnbigimgurl, "aeskey": aeskey, @@ -4672,7 +4690,7 @@ class AIChat(PluginBase): try: await self._generate_and_update_image_description( - task["bot"], task["from_wxid"], task["nickname"], + task["bot"], task["history_chat_id"], task["nickname"], task["cdnbigimgurl"], task["aeskey"], task["is_emoji"], task["placeholder_id"], task["config"] ) @@ -4686,7 +4704,7 @@ class AIChat(PluginBase): except ValueError: pass - async def _generate_and_update_image_description(self, bot, from_wxid: str, nickname: str, + async def _generate_and_update_image_description(self, bot, history_chat_id: str, nickname: str, cdnbigimgurl: str, aeskey: str, is_emoji: bool, placeholder_id: str, image_desc_config: dict): """异步生成图片描述并更新 history""" @@ -4699,7 +4717,7 @@ class AIChat(PluginBase): if not image_base64: logger.warning(f"{'表情包' if is_emoji else '图片'}下载失败") - await self._update_history_by_id(from_wxid, placeholder_id, "[图片]") + await self._update_history_by_id(history_chat_id, placeholder_id, "[图片]") return # 调用 AI 生成图片描述 @@ -4708,17 +4726,17 @@ class AIChat(PluginBase): if description: cleaned_description = self._sanitize_llm_output(description) - await self._update_history_by_id(from_wxid, placeholder_id, f"[图片: {cleaned_description}]") + await self._update_history_by_id(history_chat_id, placeholder_id, f"[图片: {cleaned_description}]") logger.success(f"已更新图片描述: {nickname} - {cleaned_description[:30]}...") else: - await self._update_history_by_id(from_wxid, placeholder_id, "[图片]") + await self._update_history_by_id(history_chat_id, placeholder_id, "[图片]") logger.warning(f"图片描述生成失败") except asyncio.CancelledError: raise except Exception as e: logger.error(f"异步生成图片描述失败: {e}") - await self._update_history_by_id(from_wxid, placeholder_id, "[图片]") + await self._update_history_by_id(history_chat_id, placeholder_id, "[图片]") @on_image_message(priority=15) async def handle_image_message(self, bot, message: dict):