From 6156064f56c19bd0e27c278a60a9099a82afe571 Mon Sep 17 00:00:00 2001 From: shihao <3127647737@qq.com> Date: Thu, 11 Dec 2025 18:44:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=BB=9F=E4=B8=80=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=96=87=E6=9C=AC=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/AIChat/data/persistent_memory.db | Bin 0 -> 16384 bytes plugins/AIChat/main.py | 1146 +++++++--------------- plugins/AIChat_Gemini.zip | Bin 0 -> 117802 bytes plugins/NanoImage/main.py | 79 +- 4 files changed, 450 insertions(+), 775 deletions(-) create mode 100644 plugins/AIChat/data/persistent_memory.db create mode 100644 plugins/AIChat_Gemini.zip diff --git a/plugins/AIChat/data/persistent_memory.db b/plugins/AIChat/data/persistent_memory.db new file mode 100644 index 0000000000000000000000000000000000000000..8a31622dd66b567a2d411139edffc4f2c7d607ac GIT binary patch literal 16384 zcmeI%&uhXk6bJBD#etyg=1F+4i=vFd{(*Ixjk3178bME`v)NW=>(shAb`y5kzq!9; zQQ9%PAMUb?d;=k*d3hn9_VQ@=((ofe*W+p6Ms%#~E2^rT5Gjh1kv%7S($aG^S@>nl zD2ETPMH!GSzA2?;=|~P}5P$##AOHafKmY;|fB*y_@Gk;JHeWuds5gG-iG}YioZ+n- zIldQ&U_AB3EZ4M|#u@2Wi}mSK0JSYjf~xVRS|^h)*X!yaa<4{WHW|s{(V2vGNPP>Y>uJ%dxTXWR1T&d16IL2Xr=%c36*0uX=z z1Rwwb2tWV=5P$##AOL|K7C`;K!!H+Cg8&2|009U<00Izz00bZa0SLqbh1H1v|M(st Y009U<00Izz00bZa0SG_<0y{164)%(m7XSbN literal 0 HcmV?d00001 diff --git a/plugins/AIChat/main.py b/plugins/AIChat/main.py index 4acb797..5986cdd 100644 --- a/plugins/AIChat/main.py +++ b/plugins/AIChat/main.py @@ -488,7 +488,7 @@ class AIChat(PluginBase): async def _generate_image_description(self, image_base64: str, prompt: str, config: dict) -> str: """ - 使用 Gemini API 生成图片描述 + 使用 AI 生成图片描述 Args: image_base64: 图片的 base64 数据 @@ -498,39 +498,26 @@ class AIChat(PluginBase): Returns: 图片描述文本,失败返回空字符串 """ - import json try: api_config = self.config["api"] description_model = config.get("model", api_config["model"]) - api_url = api_config.get("gemini_url", "https://api.functen.cn/v1beta/models") - # 处理 base64 数据 - image_data = image_base64 - mime_type = "image/jpeg" - if image_data.startswith("data:"): - mime_type = image_data.split(";")[0].split(":")[1] - image_data = image_data.split(",", 1)[1] - - # 构建 Gemini 格式请求 - full_url = f"{api_url}/{description_model}:streamGenerateContent?alt=sse" + # 构建消息 + messages = [ + { + "role": "user", + "content": [ + {"type": "text", "text": prompt}, + {"type": "image_url", "image_url": {"url": image_base64}} + ] + } + ] payload = { - "contents": [ - { - "parts": [ - {"text": prompt}, - { - "inline_data": { - "mime_type": mime_type, - "data": image_data - } - } - ] - } - ], - "generationConfig": { - "maxOutputTokens": config.get("max_tokens", 1000) - } + "model": description_model, + "messages": messages, + "max_tokens": config.get("max_tokens", 1000), + "stream": True } headers = { @@ -538,12 +525,12 @@ class AIChat(PluginBase): "Authorization": f"Bearer {api_config['api_key']}" } - timeout = aiohttp.ClientTimeout(total=api_config.get("timeout", 120)) + timeout = aiohttp.ClientTimeout(total=api_config["timeout"]) # 配置代理 connector = None proxy_config = self.config.get("proxy", {}) - if proxy_config.get("enabled", False) and PROXY_SUPPORT: + if proxy_config.get("enabled", False): proxy_type = proxy_config.get("type", "socks5").upper() proxy_host = proxy_config.get("host", "127.0.0.1") proxy_port = proxy_config.get("port", 7890) @@ -555,37 +542,43 @@ class AIChat(PluginBase): else: proxy_url = f"{proxy_type}://{proxy_host}:{proxy_port}" - try: - connector = ProxyConnector.from_url(proxy_url) - except Exception as e: - logger.warning(f"代理配置失败,将直连: {e}") + if PROXY_SUPPORT: + try: + connector = ProxyConnector.from_url(proxy_url) + except Exception as e: + logger.warning(f"代理配置失败,将直连: {e}") + connector = None async with aiohttp.ClientSession(timeout=timeout, connector=connector) as session: - async with session.post(full_url, json=payload, headers=headers) as resp: + async with session.post( + api_config["url"], + json=payload, + headers=headers + ) as resp: if resp.status != 200: error_text = await resp.text() logger.error(f"图片描述 API 返回错误: {resp.status}, {error_text[:200]}") return "" - # 流式接收 Gemini 响应 + # 流式接收响应 + import json description = "" async for line in resp.content: line = line.decode('utf-8').strip() - if not line or not line.startswith("data: "): + if not line or line == "data: [DONE]": continue - try: - data = json.loads(line[6:]) - candidates = data.get("candidates", []) - if candidates: - parts = candidates[0].get("content", {}).get("parts", []) - for part in parts: - if "text" in part: - description += part["text"] - except: - pass + if line.startswith("data: "): + try: + data = json.loads(line[6:]) + delta = data.get("choices", [{}])[0].get("delta", {}) + content = delta.get("content", "") + if content: + description += content + except: + pass - logger.debug(f"图片描述生成成功: {description[:100]}...") + logger.debug(f"图片描述生成成功: {description}") return description.strip() except Exception as e: @@ -627,617 +620,6 @@ class AIChat(PluginBase): return tools - # ==================== Gemini API 格式转换方法 ==================== - - def _convert_tools_to_gemini(self, openai_tools: list) -> list: - """ - 将 OpenAI 格式的工具定义转换为 Gemini 格式 - - OpenAI: [{"type": "function", "function": {"name": ..., "parameters": ...}}] - Gemini: [{"function_declarations": [{"name": ..., "parameters": ...}]}] - """ - if not openai_tools: - return [] - - function_declarations = [] - for tool in openai_tools: - if tool.get("type") == "function": - func = tool.get("function", {}) - function_declarations.append({ - "name": func.get("name", ""), - "description": func.get("description", ""), - "parameters": func.get("parameters", {}) - }) - - if function_declarations: - return [{"function_declarations": function_declarations}] - return [] - - def _build_gemini_contents(self, system_content: str, history_messages: list, - current_message: dict, is_group: bool = False) -> list: - """ - 构建 Gemini API 的 contents 格式 - - Args: - system_content: 系统提示词(包含人设、时间、持久记忆等) - history_messages: 历史消息列表 - current_message: 当前用户消息 {"text": str, "media": optional} - is_group: 是否群聊 - - Returns: - Gemini contents 格式的列表 - """ - contents = [] - - # Gemini 没有 system role,将系统提示放在第一条 user 消息中 - # 然后用一条简短的 model 回复来"确认" - system_parts = [{"text": f"[系统指令]\n{system_content}\n\n请按照以上指令进行对话。"}] - contents.append({"role": "user", "parts": system_parts}) - contents.append({"role": "model", "parts": [{"text": "好的,我会按照指令进行对话。"}]}) - - # 添加历史消息 - for msg in history_messages: - gemini_msg = self._convert_message_to_gemini(msg, is_group) - if gemini_msg: - contents.append(gemini_msg) - - # 添加当前用户消息 - current_parts = [] - if current_message.get("text"): - current_parts.append({"text": current_message["text"]}) - - # 添加媒体内容(图片/视频) - if current_message.get("image_base64"): - image_data = current_message["image_base64"] - # 去除 data:image/xxx;base64, 前缀 - if image_data.startswith("data:"): - mime_type = image_data.split(";")[0].split(":")[1] - image_data = image_data.split(",", 1)[1] - else: - mime_type = "image/jpeg" - current_parts.append({ - "inline_data": { - "mime_type": mime_type, - "data": image_data - } - }) - - if current_message.get("video_base64"): - video_data = current_message["video_base64"] - # 去除 data:video/xxx;base64, 前缀 - if video_data.startswith("data:"): - video_data = video_data.split(",", 1)[1] - current_parts.append({ - "inline_data": { - "mime_type": "video/mp4", - "data": video_data - } - }) - - if current_parts: - contents.append({"role": "user", "parts": current_parts}) - - return contents - - def _convert_message_to_gemini(self, msg: dict, is_group: bool = False) -> dict: - """ - 将单条历史消息转换为 Gemini 格式 - - 支持的输入格式: - 1. 群聊历史: {"nickname": str, "content": str|list} - 2. 私聊记忆: {"role": "user"|"assistant", "content": str|list} - """ - parts = [] - - # 群聊历史格式 - if "nickname" in msg: - nickname = msg.get("nickname", "") - content = msg.get("content", "") - - if isinstance(content, list): - # 多模态内容 - for item in content: - if item.get("type") == "text": - text = item.get("text", "") - parts.append({"text": f"[{nickname}] {text}" if nickname else text}) - elif item.get("type") == "image_url": - image_url = item.get("image_url", {}).get("url", "") - if image_url.startswith("data:"): - mime_type = image_url.split(";")[0].split(":")[1] - image_data = image_url.split(",", 1)[1] - parts.append({ - "inline_data": { - "mime_type": mime_type, - "data": image_data - } - }) - else: - # 纯文本 - parts.append({"text": f"[{nickname}] {content}" if nickname else content}) - - # 群聊历史都作为 user 消息(因为是多人对话记录) - return {"role": "user", "parts": parts} if parts else None - - # 私聊记忆格式 - elif "role" in msg: - role = msg.get("role", "user") - content = msg.get("content", "") - - # 转换角色名 - gemini_role = "model" if role == "assistant" else "user" - - if isinstance(content, list): - for item in content: - if item.get("type") == "text": - parts.append({"text": item.get("text", "")}) - elif item.get("type") == "image_url": - image_url = item.get("image_url", {}).get("url", "") - if image_url.startswith("data:"): - mime_type = image_url.split(";")[0].split(":")[1] - image_data = image_url.split(",", 1)[1] - parts.append({ - "inline_data": { - "mime_type": mime_type, - "data": image_data - } - }) - else: - parts.append({"text": content}) - - return {"role": gemini_role, "parts": parts} if parts else None - - return None - - def _parse_gemini_tool_calls(self, response_parts: list) -> list: - """ - 从 Gemini 响应中解析工具调用 - - Gemini 格式: {"functionCall": {"name": "...", "args": {...}}} - 转换为内部格式: {"id": "...", "function": {"name": "...", "arguments": "..."}} - """ - import json - tool_calls = [] - for i, part in enumerate(response_parts): - if "functionCall" in part: - func_call = part["functionCall"] - tool_calls.append({ - "id": f"call_{uuid.uuid4().hex[:8]}", - "type": "function", - "function": { - "name": func_call.get("name", ""), - "arguments": json.dumps(func_call.get("args", {}), ensure_ascii=False) - } - }) - return tool_calls - - def _build_tool_response_contents(self, contents: list, tool_calls: list, - tool_results: list) -> list: - """ - 构建包含工具调用结果的 contents,用于继续对话 - - Args: - contents: 原始 contents - tool_calls: 工具调用列表 - tool_results: 工具执行结果列表 - """ - import json - new_contents = contents.copy() - - # 添加 model 的工具调用响应 - function_call_parts = [] - for tc in tool_calls: - function_call_parts.append({ - "functionCall": { - "name": tc["function"]["name"], - "args": json.loads(tc["function"]["arguments"]) - } - }) - if function_call_parts: - new_contents.append({"role": "model", "parts": function_call_parts}) - - # 添加工具执行结果 - function_response_parts = [] - for i, result in enumerate(tool_results): - tool_name = tool_calls[i]["function"]["name"] if i < len(tool_calls) else "unknown" - function_response_parts.append({ - "functionResponse": { - "name": tool_name, - "response": {"result": result.get("message", str(result))} - } - }) - if function_response_parts: - new_contents.append({"role": "user", "parts": function_response_parts}) - - return new_contents - - # ==================== 统一的 Gemini API 调用 ==================== - - async def _call_gemini_api(self, contents: list, tools: list = None, - bot=None, from_wxid: str = None, - chat_id: str = None, nickname: str = "", - user_wxid: str = None, is_group: bool = False) -> tuple: - """ - 统一的 Gemini API 调用方法 - - Args: - contents: Gemini 格式的对话内容 - tools: Gemini 格式的工具定义(可选) - bot: WechatHookClient 实例 - from_wxid: 消息来源 - chat_id: 会话ID - nickname: 用户昵称 - user_wxid: 用户wxid - is_group: 是否群聊 - - Returns: - (response_text, tool_calls) - 响应文本和工具调用列表 - """ - import json - - api_config = self.config["api"] - model = api_config["model"] - api_url = api_config.get("gemini_url", api_config.get("url", "").replace("/v1/chat/completions", "/v1beta/models")) - api_key = api_config["api_key"] - - # 构建完整 URL - full_url = f"{api_url}/{model}:streamGenerateContent?alt=sse" - - # 构建请求体 - payload = { - "contents": contents, - "generationConfig": { - "maxOutputTokens": api_config.get("max_tokens", 8192) - } - } - - if tools: - payload["tools"] = tools - - headers = { - "Content-Type": "application/json", - "Authorization": f"Bearer {api_key}" - } - - timeout = aiohttp.ClientTimeout(total=api_config.get("timeout", 120)) - - # 配置代理 - connector = None - proxy_config = self.config.get("proxy", {}) - if proxy_config.get("enabled", False) and PROXY_SUPPORT: - proxy_type = proxy_config.get("type", "socks5").upper() - proxy_host = proxy_config.get("host", "127.0.0.1") - proxy_port = proxy_config.get("port", 7890) - proxy_username = proxy_config.get("username") - proxy_password = proxy_config.get("password") - - if proxy_username and proxy_password: - proxy_url = f"{proxy_type}://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}" - else: - proxy_url = f"{proxy_type}://{proxy_host}:{proxy_port}" - - try: - connector = ProxyConnector.from_url(proxy_url) - logger.debug(f"[Gemini] 使用代理: {proxy_type}://{proxy_host}:{proxy_port}") - except Exception as e: - logger.warning(f"[Gemini] 代理配置失败: {e}") - - # 保存用户信息供工具调用使用 - self._current_user_wxid = user_wxid - self._current_is_group = is_group - - try: - async with aiohttp.ClientSession(timeout=timeout, connector=connector) as session: - logger.debug(f"[Gemini] 发送流式请求: {full_url}") - async with session.post(full_url, json=payload, headers=headers) as resp: - if resp.status != 200: - error_text = await resp.text() - logger.error(f"[Gemini] API 错误: {resp.status}, {error_text[:500]}") - raise Exception(f"Gemini API 错误 {resp.status}: {error_text[:200]}") - - # 流式接收响应 - full_text = "" - all_parts = [] - tool_call_hint_sent = False - - async for line in resp.content: - line = line.decode('utf-8').strip() - if not line or not line.startswith("data: "): - continue - - try: - data = json.loads(line[6:]) - candidates = data.get("candidates", []) - if not candidates: - continue - - content = candidates[0].get("content", ) - parts = content.get("parts", []) - - for part in parts: - all_parts.append(part) - - # 收集文本 - if "text" in part: - full_text += part["text"] - - # 检测到工具调用时,先发送已有文本 - if "functionCall" in part: - if not tool_call_hint_sent and bot and from_wxid: - tool_call_hint_sent = True - if full_text.strip(): - logger.info(f"[Gemini] 检测到工具调用,先发送文本: {full_text[:30]}...") - await bot.send_text(from_wxid, full_text.strip()) - - except json.JSONDecodeError: - continue - - # 解析工具调用 - tool_calls = self._parse_gemini_tool_calls(all_parts) - - logger.info(f"[Gemini] 响应完成, 文本长度: {len(full_text)}, 工具调用: {len(tool_calls)}") - - return full_text.strip(), tool_calls - - except aiohttp.ClientError as e: - logger.error(f"[Gemini] 网络请求失败: {e}") - raise - except asyncio.TimeoutError: - logger.error(f"[Gemini] 请求超时") - raise - - async def _handle_gemini_response(self, response_text: str, tool_calls: list, - contents: list, tools: list, - bot, from_wxid: str, chat_id: str, - nickname: str, user_wxid: str, is_group: bool): - """ - 处理 Gemini API 响应,包括工具调用 - - Args: - response_text: AI 响应文本 - tool_calls: 工具调用列表 - contents: 原始 contents(用于工具调用后继续对话) - tools: 工具定义 - bot, from_wxid, chat_id, nickname, user_wxid, is_group: 上下文信息 - """ - if tool_calls: - # 有工具调用,异步执行 - logger.info(f"[Gemini] 启动异步工具执行,共 {len(tool_calls)} 个工具") - asyncio.create_task( - self._execute_gemini_tools_async( - tool_calls, contents, tools, - bot, from_wxid, chat_id, nickname, user_wxid, is_group - ) - ) - return None # 工具调用异步处理 - - return response_text - - async def _execute_gemini_tools_async(self, tool_calls: list, contents: list, tools: list, - bot, from_wxid: str, chat_id: str, - nickname: str, user_wxid: str, is_group: bool): - """ - 异步执行 Gemini 工具调用 - """ - import json - - try: - logger.info(f"[Gemini] 开始执行 {len(tool_calls)} 个工具") - - # 收集需要 AI 回复的工具结果 - need_ai_reply_results = [] - tool_results = [] - - for tool_call in tool_calls: - function_name = tool_call["function"]["name"] - try: - arguments = json.loads(tool_call["function"]["arguments"]) - except: - arguments = {} - - logger.info(f"[Gemini] 执行工具: {function_name}, 参数: {arguments}") - - result = await self._execute_tool_and_get_result(function_name, arguments, bot, from_wxid) - tool_results.append(result) - - if result and result.get("success"): - logger.success(f"[Gemini] 工具 {function_name} 执行成功") - - # 检查是否需要 AI 继续回复 - if result.get("need_ai_reply"): - need_ai_reply_results.append({ - "tool_call": tool_call, - "result": result - }) - elif not result.get("already_sent") and result.get("message"): - if result.get("send_result_text"): - await bot.send_text(from_wxid, result["message"]) - else: - logger.warning(f"[Gemini] 工具 {function_name} 执行失败: {result}") - if result and result.get("message"): - await bot.send_text(from_wxid, f"❌ {result['message']}") - - # 如果有需要 AI 回复的工具结果,继续对话 - if need_ai_reply_results: - await self._continue_gemini_with_tool_results( - contents, tools, tool_calls, tool_results, - bot, from_wxid, chat_id, nickname, user_wxid, is_group - ) - - logger.info("[Gemini] 所有工具执行完成") - - except Exception as e: - logger.error(f"[Gemini] 工具执行异常: {e}") - import traceback - logger.error(traceback.format_exc()) - try: - await bot.send_text(from_wxid, "❌ 工具执行出错") - except: - pass - - async def _continue_gemini_with_tool_results(self, contents: list, tools: list, - tool_calls: list, tool_results: list, - bot, from_wxid: str, chat_id: str, - nickname: str, user_wxid: str, is_group: bool): - """ - 基于工具结果继续 Gemini 对话 - """ - try: - # 构建包含工具结果的新 contents - new_contents = self._build_tool_response_contents(contents, tool_calls, tool_results) - - # 继续调用 API(不带工具,避免循环调用) - response_text, new_tool_calls = await self._call_gemini_api( - new_contents, tools=None, - bot=bot, from_wxid=from_wxid, chat_id=chat_id, - nickname=nickname, user_wxid=user_wxid, is_group=is_group - ) - - if response_text: - await bot.send_text(from_wxid, response_text) - logger.success(f"[Gemini] 工具回传后 AI 回复: {response_text[:50]}...") - - # 保存到记忆 - if chat_id: - self._add_to_memory(chat_id, "assistant", response_text) - if is_group: - import tomllib - with open("main_config.toml", "rb") as f: - main_config = tomllib.load(f) - bot_nickname = main_config.get("Bot", {}).get("nickname", "机器人") - await self._add_to_history(from_wxid, bot_nickname, response_text) - - except Exception as e: - logger.error(f"[Gemini] 工具回传后继续对话失败: {e}") - import traceback - logger.error(traceback.format_exc()) - - async def _process_with_gemini(self, text: str = "", image_base64: str = None, - video_base64: str = None, bot=None, - from_wxid: str = None, chat_id: str = None, - nickname: str = "", user_wxid: str = None, - is_group: bool = False) -> str: - """ - 统一的 Gemini 消息处理入口 - - 支持:纯文本、图片+文本、视频+文本 - - Args: - text: 用户消息文本 - image_base64: 图片 base64(可选) - video_base64: 视频 base64(可选) - bot, from_wxid, chat_id, nickname, user_wxid, is_group: 上下文信息 - - Returns: - AI 响应文本,如果是工具调用则返回 None - """ - import json - - # 1. 构建系统提示词 - system_content = self._build_system_content(nickname, from_wxid, user_wxid, is_group) - - # 2. 加载历史消息 - history_messages = [] - if is_group and from_wxid: - history = await self._load_history(from_wxid) - max_context = self.config.get("history", {}).get("max_context", 50) - history_messages = history[-max_context:] if len(history) > max_context else history - elif chat_id: - memory_messages = self._get_memory_messages(chat_id) - if memory_messages and len(memory_messages) > 1: - history_messages = memory_messages[:-1] # 排除刚添加的当前消息 - - # 3. 构建当前消息 - current_message = {"text": f"[{nickname}] {text}" if is_group and nickname else text} - if image_base64: - current_message["image_base64"] = image_base64 - if video_base64: - current_message["video_base64"] = video_base64 - - # 4. 构建 Gemini contents - contents = self._build_gemini_contents(system_content, history_messages, current_message, is_group) - - # 5. 收集并转换工具 - openai_tools = self._collect_tools() - gemini_tools = self._convert_tools_to_gemini(openai_tools) - - if gemini_tools: - logger.info(f"[Gemini] 已加载 {len(openai_tools)} 个工具") - - # 6. 调用 Gemini API(带重试) - max_retries = self.config.get("api", {}).get("max_retries", 2) - last_error = None - - for attempt in range(max_retries + 1): - try: - response_text, tool_calls = await self._call_gemini_api( - contents=contents, - tools=gemini_tools if gemini_tools else None, - bot=bot, - from_wxid=from_wxid, - chat_id=chat_id, - nickname=nickname, - user_wxid=user_wxid, - is_group=is_group - ) - - # 处理工具调用 - if tool_calls: - result = await self._handle_gemini_response( - response_text, tool_calls, contents, gemini_tools, - bot, from_wxid, chat_id, nickname, user_wxid, is_group - ) - return result # None 表示工具调用已异步处理 - - # 检查空响应 - if not response_text and attempt < max_retries: - logger.warning(f"[Gemini] 返回空内容,重试 {attempt + 1}/{max_retries}") - await asyncio.sleep(1) - continue - - return response_text - - except Exception as e: - last_error = e - if attempt < max_retries: - logger.warning(f"[Gemini] API 调用失败,重试 {attempt + 1}/{max_retries}: {e}") - await asyncio.sleep(1) - else: - raise - - return "" - - def _build_system_content(self, nickname: str, from_wxid: str, - user_wxid: str, is_group: bool) -> str: - """构建系统提示词(包含人设、时间、持久记忆等)""" - system_content = self.system_prompt - - # 添加当前时间 - current_time = datetime.now() - weekday_map = { - 0: "星期一", 1: "星期二", 2: "星期三", 3: "星期四", - 4: "星期五", 5: "星期六", 6: "星期日" - } - weekday = weekday_map[current_time.weekday()] - time_str = current_time.strftime(f"%Y年%m月%d日 %H:%M:%S {weekday}") - system_content += f"\n\n当前时间:{time_str}" - - if nickname: - system_content += f"\n当前对话用户的昵称是:{nickname}" - - # 加载持久记忆 - memory_chat_id = from_wxid if is_group else user_wxid - if memory_chat_id: - persistent_memories = self._get_persistent_memories(memory_chat_id) - if persistent_memories: - system_content += "\n\n【持久记忆】以下是用户要求你记住的重要信息:\n" - for m in persistent_memories: - mem_time = m['time'][:10] if m['time'] else "" - system_content += f"- [{mem_time}] {m['nickname']}: {m['content']}\n" - - return system_content - - # ==================== 结束 Gemini API 方法 ==================== - async def _handle_list_prompts(self, bot, from_wxid: str): """处理人设列表指令""" try: @@ -1600,19 +982,41 @@ class AIChat(PluginBase): chat_id = self._get_chat_id(from_wxid, user_wxid, is_group) self._add_to_memory(chat_id, "user", actual_content) - # 使用统一的 Gemini API 处理消息 - response = await self._process_with_gemini( - text=actual_content, - bot=bot, - from_wxid=from_wxid, - chat_id=chat_id, - nickname=nickname, - user_wxid=user_wxid, - is_group=is_group - ) + # 调用 AI API(带重试机制) + max_retries = self.config.get("api", {}).get("max_retries", 2) + response = None + last_error = None + + for attempt in range(max_retries + 1): + try: + response = await self._call_ai_api(actual_content, bot, from_wxid, chat_id, nickname, user_wxid, is_group) + + # 检查返回值: + # - None: 工具调用已异步处理,不需要重试 + # - "": 真正的空响应,需要重试 + # - 有内容: 正常响应 + if response is None: + # 工具调用,不重试 + logger.info("AI 触发工具调用,已异步处理") + break + + if response == "" and attempt < max_retries: + logger.warning(f"AI 返回空内容,重试 {attempt + 1}/{max_retries}") + await asyncio.sleep(1) # 等待1秒后重试 + continue + + break # 成功或已达到最大重试次数 + + except Exception as e: + last_error = e + if attempt < max_retries: + logger.warning(f"AI API 调用失败,重试 {attempt + 1}/{max_retries}: {e}") + await asyncio.sleep(1) + else: + raise # 发送回复并添加到记忆 - # 注意:如果返回 None 或空字符串,说明已经以其他形式处理了(如工具调用) + # 注意:如果返回 None 或空字符串,说明已经以其他形式处理了,不需要再发送文本 if response: await bot.send_text(from_wxid, response) self._add_to_memory(chat_id, "assistant", response) @@ -1624,7 +1028,7 @@ class AIChat(PluginBase): await self._add_to_history(from_wxid, bot_nickname, response) logger.success(f"AI 回复成功: {response[:50]}...") else: - logger.info("AI 回复为空或已通过其他方式发送(如工具调用)") + logger.info("AI 回复为空或已通过其他方式发送(如聊天记录)") except Exception as e: import traceback @@ -2523,8 +1927,19 @@ class AIChat(PluginBase): user_wxid = sender_wxid if is_group else from_wxid try: + # 群聊引用消息可能带有 "wxid:\n" 前缀,需要去除 + xml_content = content + if is_group and ":\n" in content: + # 查找 XML 声明或 标签的位置 + xml_start = content.find(" 0: + xml_content = content[xml_start:] + logger.debug(f"去除引用消息前缀,原长度: {len(content)}, 新长度: {len(xml_content)}") + # 解析XML获取标题和引用消息 - root = ET.fromstring(content) + root = ET.fromstring(xml_content) title = root.find(".//title") if title is None or not title.text: logger.debug("引用消息没有标题,跳过") @@ -2590,18 +2005,51 @@ class AIChat(PluginBase): logger.debug("引用消息中没有 content") return True + # 检查被引用消息的类型 + # type=1: 纯文本,type=3: 图片,type=43: 视频,type=49: 应用消息(含聊天记录) + refer_type_elem = refermsg.find("type") + refer_type = int(refer_type_elem.text) if refer_type_elem is not None and refer_type_elem.text else 0 + logger.debug(f"被引用消息类型: {refer_type}") + + # 纯文本消息不需要处理(type=1) + if refer_type == 1: + logger.debug("引用的是纯文本消息,跳过") + return True + + # 只处理图片(3)、视频(43)、应用消息(49,含聊天记录) + if refer_type not in [3, 43, 49]: + logger.debug(f"引用的消息类型 {refer_type} 不支持处理") + return True + # 解码HTML实体 import html refer_xml = html.unescape(refer_content.text) - refer_root = ET.fromstring(refer_xml) + # 被引用消息的内容也可能带有 "wxid:\n" 前缀,需要去除 + if ":\n" in refer_xml: + xml_start = refer_xml.find(" 0: + refer_xml = refer_xml[xml_start:] + logger.debug(f"去除被引用消息前缀") + + # 尝试解析 XML + try: + refer_root = ET.fromstring(refer_xml) + except ET.ParseError as e: + logger.debug(f"被引用消息内容不是有效的 XML: {e}") + return True + + # 尝试提取聊天记录信息(type=19) + recorditem = refer_root.find(".//recorditem") # 尝试提取图片信息 img = refer_root.find(".//img") # 尝试提取视频信息 video = refer_root.find(".//videomsg") - if img is None and video is None: - logger.debug("引用的消息不是图片或视频") + if img is None and video is None and recorditem is None: + logger.debug("引用的消息不是图片、视频或聊天记录") return True # 检查是否应该回复(提前检查,避免下载后才发现不需要回复) @@ -2623,6 +2071,13 @@ class AIChat(PluginBase): nickname = await self._get_user_nickname(bot, from_wxid, user_wxid, is_group) chat_id = self._get_chat_id(from_wxid, user_wxid, is_group) + # 处理聊天记录消息(type=19) + if recorditem is not None: + return await self._handle_quote_chat_record( + bot, recorditem, title_text, from_wxid, user_wxid, + is_group, nickname, chat_id + ) + # 处理视频消息 if video is not None: return await self._handle_quote_video( @@ -2631,18 +2086,20 @@ class AIChat(PluginBase): ) # 处理图片消息 - cdnbigimgurl = img.get("cdnbigimgurl", "") - aeskey = img.get("aeskey", "") + # 按优先级尝试获取图片 URL:大图 > 中图 > 缩略图 + cdnurl = img.get("cdnbigimgurl", "") or img.get("cdnmidimgurl", "") or img.get("cdnthumburl", "") + # aeskey 也有多种可能的属性名 + aeskey = img.get("aeskey", "") or img.get("cdnthumbaeskey", "") - if not cdnbigimgurl or not aeskey: - logger.warning(f"图片信息不完整: cdnurl={bool(cdnbigimgurl)}, aeskey={bool(aeskey)}") + if not cdnurl or not aeskey: + logger.warning(f"图片信息不完整: cdnurl={bool(cdnurl)}, aeskey={bool(aeskey)}") return True logger.info(f"AI处理引用图片消息: {title_text[:50]}...") # 下载并编码图片 - logger.info(f"开始下载图片: {cdnbigimgurl[:50]}...") - image_base64 = await self._download_and_encode_image(bot, cdnbigimgurl, aeskey) + logger.info(f"开始下载图片: {cdnurl[:50]}...") + image_base64 = await self._download_and_encode_image(bot, cdnurl, aeskey) if not image_base64: logger.error("图片下载失败") await bot.send_text(from_wxid, "❌ 无法处理图片") @@ -2656,17 +2113,8 @@ class AIChat(PluginBase): if is_group: await self._add_to_history(from_wxid, nickname, title_text, image_base64=image_base64) - # 使用统一的 Gemini API 处理图片消息 - response = await self._process_with_gemini( - text=title_text, - image_base64=image_base64, - bot=bot, - from_wxid=from_wxid, - chat_id=chat_id, - nickname=nickname, - user_wxid=user_wxid, - is_group=is_group - ) + # 调用AI API(带图片) + response = await self._call_ai_api_with_image(title_text, image_base64, bot, from_wxid, chat_id, nickname, user_wxid, is_group) if response: await bot.send_text(from_wxid, response) @@ -2679,66 +2127,112 @@ class AIChat(PluginBase): bot_nickname = main_config.get("Bot", {}).get("nickname", "机器人") await self._add_to_history(from_wxid, bot_nickname, response) logger.success(f"AI回复成功: {response[:50]}...") - + return False except Exception as e: logger.error(f"处理引用消息失败: {e}") return True - async def _handle_quote_video(self, bot, video_elem, title_text: str, from_wxid: str, - user_wxid: str, is_group: bool, nickname: str, chat_id: str): - """处理引用的视频消息 - 统一 Gemini API(直接处理视频)""" + async def _handle_quote_chat_record(self, bot, recorditem_elem, title_text: str, from_wxid: str, + user_wxid: str, is_group: bool, nickname: str, chat_id: str): + """处理引用的聊天记录消息(type=19)""" try: - # 提取视频 CDN 信息 - cdnvideourl = video_elem.get("cdnvideourl", "") - aeskey = video_elem.get("aeskey", "") + logger.info(f"[聊天记录] 处理引用的聊天记录: {title_text[:50]}...") - # 如果主要的CDN信息为空,尝试获取原始视频信息 - if not cdnvideourl or not aeskey: - cdnvideourl = video_elem.get("cdnrawvideourl", "") - aeskey = video_elem.get("cdnrawvideoaeskey", "") - - if not cdnvideourl or not aeskey: - logger.warning(f"[视频] 视频信息不完整: cdnurl={bool(cdnvideourl)}, aeskey={bool(aeskey)}") - await bot.send_text(from_wxid, "❌ 无法获取视频信息") + # recorditem 的内容是 CDATA,需要提取并解析 + record_text = recorditem_elem.text + if not record_text: + logger.warning("[聊天记录] recorditem 内容为空") + await bot.send_text(from_wxid, "❌ 无法读取聊天记录内容") return False - logger.info(f"[视频] 处理引用视频: {title_text[:50]}...") - - # 提示用户正在处理 - await bot.send_text(from_wxid, "🎬 正在分析视频,请稍候...") - - # 下载并编码视频 - video_base64 = await self._download_and_encode_video(bot, cdnvideourl, aeskey) - if not video_base64: - logger.error("[视频] 视频下载失败") - await bot.send_text(from_wxid, "❌ 视频下载失败") + # 解析 recordinfo XML + try: + record_root = ET.fromstring(record_text) + except ET.ParseError as e: + logger.error(f"[聊天记录] 解析 recordinfo 失败: {e}") + await bot.send_text(from_wxid, "❌ 聊天记录格式解析失败") return False - logger.info("[视频] 视频下载和编码成功") + # 提取聊天记录内容 + datalist = record_root.find(".//datalist") + chat_records = [] - # 用户问题 - user_question = title_text.strip() if title_text.strip() else "这个视频讲了什么?" + # 尝试从 datalist 解析完整消息 + if datalist is not None: + for dataitem in datalist.findall("dataitem"): + source_name = dataitem.find("sourcename") + source_time = dataitem.find("sourcetime") + data_desc = dataitem.find("datadesc") + + sender = source_name.text if source_name is not None and source_name.text else "未知" + time_str = source_time.text if source_time is not None and source_time.text else "" + content = data_desc.text if data_desc is not None and data_desc.text else "" + + if content: + chat_records.append({ + "sender": sender, + "time": time_str, + "content": content + }) + + # 如果 datalist 为空(引用消息的简化版本),尝试从 desc 获取摘要 + if not chat_records: + desc_elem = record_root.find(".//desc") + if desc_elem is not None and desc_elem.text: + # desc 格式通常是 "发送者: 内容\n发送者: 内容" + desc_text = desc_elem.text.strip() + logger.info(f"[聊天记录] 从 desc 获取摘要内容: {desc_text[:100]}...") + chat_records.append({ + "sender": "聊天记录摘要", + "time": "", + "content": desc_text + }) + + if not chat_records: + logger.warning("[聊天记录] 没有解析到任何消息") + await bot.send_text(from_wxid, "❌ 聊天记录中没有消息内容") + return False + + logger.info(f"[聊天记录] 解析到 {len(chat_records)} 条消息") + + # 构建聊天记录文本 + record_title = record_root.find(".//title") + title = record_title.text if record_title is not None and record_title.text else "聊天记录" + + chat_text = f"【{title}】\n\n" + for i, record in enumerate(chat_records, 1): + time_part = f" ({record['time']})" if record['time'] else "" + if record['sender'] == "聊天记录摘要": + # 摘要模式,直接显示内容 + chat_text += f"{record['content']}\n\n" + else: + chat_text += f"[{record['sender']}{time_part}]:\n{record['content']}\n\n" + + # 构造发送给 AI 的消息 + user_question = title_text.strip() if title_text.strip() else "请分析这段聊天记录" + # 去除 @ 部分 + if user_question.startswith("@"): + parts = user_question.split(maxsplit=1) + if len(parts) > 1: + user_question = parts[1].strip() + else: + user_question = "请分析这段聊天记录" + + combined_message = f"[用户发送了一段聊天记录,请阅读并回答问题]\n\n{chat_text}\n[用户的问题]: {user_question}" + + logger.info(f"[聊天记录] 发送给 AI,消息长度: {len(combined_message)}") # 添加到记忆 - self._add_to_memory(chat_id, "user", f"[发送了一个视频] {user_question}") + self._add_to_memory(chat_id, "user", combined_message) # 如果是群聊,添加到历史记录 if is_group: - await self._add_to_history(from_wxid, nickname, f"[发送了一个视频] {user_question}") + await self._add_to_history(from_wxid, nickname, f"[发送了聊天记录] {user_question}") - # 使用统一的 Gemini API 直接处理视频(不再需要两步架构) - response = await self._process_with_gemini( - text=user_question, - video_base64=video_base64, - bot=bot, - from_wxid=from_wxid, - chat_id=chat_id, - nickname=nickname, - user_wxid=user_wxid, - is_group=is_group - ) + # 调用 AI API + response = await self._call_ai_api(combined_message, bot, from_wxid, chat_id, nickname, user_wxid, is_group) if response: await bot.send_text(from_wxid, response) @@ -2750,7 +2244,93 @@ class AIChat(PluginBase): main_config = tomllib.load(f) bot_nickname = main_config.get("Bot", {}).get("nickname", "机器人") await self._add_to_history(from_wxid, bot_nickname, response) - logger.success(f"[视频] AI回复成功: {response[:50]}...") + logger.success(f"[聊天记录] AI 回复成功: {response[:50]}...") + else: + await bot.send_text(from_wxid, "❌ AI 回复生成失败") + + return False + + except Exception as e: + logger.error(f"[聊天记录] 处理失败: {e}") + import traceback + logger.error(traceback.format_exc()) + await bot.send_text(from_wxid, "❌ 聊天记录处理出错") + return False + + async def _handle_quote_video(self, bot, video_elem, title_text: str, from_wxid: str, + user_wxid: str, is_group: bool, nickname: str, chat_id: str): + """处理引用的视频消息 - 双AI架构""" + try: + # 检查视频识别功能是否启用 + video_config = self.config.get("video_recognition", {}) + if not video_config.get("enabled", True): + logger.info("[视频识别] 功能未启用") + await bot.send_text(from_wxid, "❌ 视频识别功能未启用") + return False + + # 提取视频 CDN 信息 + cdnvideourl = video_elem.get("cdnvideourl", "") + aeskey = video_elem.get("aeskey", "") + + # 如果主要的CDN信息为空,尝试获取原始视频信息 + if not cdnvideourl or not aeskey: + cdnvideourl = video_elem.get("cdnrawvideourl", "") + aeskey = video_elem.get("cdnrawvideoaeskey", "") + + if not cdnvideourl or not aeskey: + logger.warning(f"[视频识别] 视频信息不完整: cdnurl={bool(cdnvideourl)}, aeskey={bool(aeskey)}") + await bot.send_text(from_wxid, "❌ 无法获取视频信息") + return False + + logger.info(f"[视频识别] 处理引用视频: {title_text[:50]}...") + + # 提示用户正在处理 + await bot.send_text(from_wxid, "🎬 正在分析视频,请稍候...") + + # 下载并编码视频 + video_base64 = await self._download_and_encode_video(bot, cdnvideourl, aeskey) + if not video_base64: + logger.error("[视频识别] 视频下载失败") + await bot.send_text(from_wxid, "❌ 视频下载失败") + return False + + logger.info("[视频识别] 视频下载和编码成功") + + # ========== 第一步:视频AI 分析视频内容 ========== + video_description = await self._analyze_video_content(video_base64, video_config) + if not video_description: + logger.error("[视频识别] 视频AI分析失败") + await bot.send_text(from_wxid, "❌ 视频分析失败") + return False + + logger.info(f"[视频识别] 视频AI分析完成: {video_description[:100]}...") + + # ========== 第二步:主AI 基于视频描述生成回复 ========== + # 构造包含视频描述的用户消息 + user_question = title_text.strip() if title_text.strip() else "这个视频讲了什么?" + combined_message = f"[用户发送了一个视频,以下是视频内容描述]\n{video_description}\n\n[用户的问题]\n{user_question}" + + # 添加到记忆(让主AI知道用户发了视频) + self._add_to_memory(chat_id, "user", combined_message) + + # 如果是群聊,添加到历史记录 + if is_group: + await self._add_to_history(from_wxid, nickname, f"[发送了一个视频] {user_question}") + + # 调用主AI生成回复(使用现有的 _call_ai_api 方法,继承完整上下文) + response = await self._call_ai_api(combined_message, chat_id, from_wxid, is_group, nickname) + + if response: + await bot.send_text(from_wxid, response) + self._add_to_memory(chat_id, "assistant", response) + # 保存机器人回复到历史记录 + if is_group: + import tomllib + with open("main_config.toml", "rb") as f: + main_config = tomllib.load(f) + bot_nickname = main_config.get("Bot", {}).get("nickname", "机器人") + await self._add_to_history(from_wxid, bot_nickname, response) + logger.success(f"[视频识别] 主AI回复成功: {response[:50]}...") else: await bot.send_text(from_wxid, "❌ AI 回复生成失败") @@ -2813,51 +2393,79 @@ class AIChat(PluginBase): timeout = aiohttp.ClientTimeout(total=video_config.get("timeout", 360)) - logger.info(f"[视频AI] 开始分析视频...") + # 重试机制:对于 502/503/504 等临时性错误自动重试 + max_retries = 2 + retry_delay = 5 # 重试间隔(秒) - async with aiohttp.ClientSession(timeout=timeout) as session: - async with session.post(full_url, json=payload, headers=headers) as resp: - if resp.status != 200: - error_text = await resp.text() - logger.error(f"[视频AI] API 错误: {resp.status}, {error_text[:300]}") - return "" + for attempt in range(max_retries + 1): + try: + logger.info(f"[视频AI] 开始分析视频...{f' (重试 {attempt}/{max_retries})' if attempt > 0 else ''}") - result = await resp.json() - logger.info(f"[视频AI] API 响应 keys: {list(result.keys())}") + async with aiohttp.ClientSession(timeout=timeout) as session: + async with session.post(full_url, json=payload, headers=headers) as resp: + if resp.status in [502, 503, 504]: + error_text = await resp.text() + logger.warning(f"[视频AI] API 临时错误: {resp.status}, 将重试...") + if attempt < max_retries: + await asyncio.sleep(retry_delay) + continue + else: + logger.error(f"[视频AI] API 错误: {resp.status}, 已达最大重试次数") + return "" - # 检查安全过滤 - if "promptFeedback" in result: - feedback = result["promptFeedback"] - if feedback.get("blockReason"): - logger.warning(f"[视频AI] 内容被过滤: {feedback.get('blockReason')}") - return "" - - # 提取文本 - if "candidates" in result and result["candidates"]: - for candidate in result["candidates"]: - # 检查是否被安全过滤 - if candidate.get("finishReason") == "SAFETY": - logger.warning("[视频AI] 响应被安全过滤") + if resp.status != 200: + error_text = await resp.text() + logger.error(f"[视频AI] API 错误: {resp.status}, {error_text[:300]}") return "" - content = candidate.get("content", {}) - for part in content.get("parts", []): - if "text" in part: - text = part["text"] - logger.info(f"[视频AI] 分析完成,长度: {len(text)}") - return text + result = await resp.json() + logger.info(f"[视频AI] API 响应 keys: {list(result.keys())}") - # 记录失败原因 - if "usageMetadata" in result: - usage = result["usageMetadata"] - logger.warning(f"[视频AI] 无响应,Token: prompt={usage.get('promptTokenCount', 0)}") + # 检查安全过滤 + if "promptFeedback" in result: + feedback = result["promptFeedback"] + if feedback.get("blockReason"): + logger.warning(f"[视频AI] 内容被过滤: {feedback.get('blockReason')}") + return "" - logger.error(f"[视频AI] 没有有效响应: {str(result)[:300]}") + # 提取文本 + if "candidates" in result and result["candidates"]: + for candidate in result["candidates"]: + # 检查是否被安全过滤 + if candidate.get("finishReason") == "SAFETY": + logger.warning("[视频AI] 响应被安全过滤") + return "" + + content = candidate.get("content", {}) + for part in content.get("parts", []): + if "text" in part: + text = part["text"] + logger.info(f"[视频AI] 分析完成,长度: {len(text)}") + return text + + # 记录失败原因 + if "usageMetadata" in result: + usage = result["usageMetadata"] + logger.warning(f"[视频AI] 无响应,Token: prompt={usage.get('promptTokenCount', 0)}") + + logger.error(f"[视频AI] 没有有效响应: {str(result)[:300]}") + return "" + + except asyncio.TimeoutError: + logger.warning(f"[视频AI] 请求超时{f', 将重试...' if attempt < max_retries else ''}") + if attempt < max_retries: + await asyncio.sleep(retry_delay) + continue + return "" + except Exception as e: + logger.error(f"[视频AI] 分析失败: {e}") + import traceback + logger.error(traceback.format_exc()) return "" - except asyncio.TimeoutError: - logger.error(f"[视频AI] 请求超时") + # 循环结束仍未成功 return "" + except Exception as e: logger.error(f"[视频AI] 分析失败: {e}") import traceback diff --git a/plugins/AIChat_Gemini.zip b/plugins/AIChat_Gemini.zip new file mode 100644 index 0000000000000000000000000000000000000000..5ddb8921cdff5ef2dd4b1bca51a78e42c4346bff GIT binary patch literal 117802 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

HL!jl&Am_NO=dTiQk9K4LF<2GET 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 0: + img_data = images[0].get("image_url", {}).get("url", "") + if img_data: + if img_data.startswith("data:image"): + # base64 格式 + image_base64 = img_data + logger.info(f"从 delta.images 提取到 base64 图片") + elif img_data.startswith("http"): + image_url = img_data + logger.info(f"从 delta.images 提取到图片URL: {image_url}") + + # 方式2: 从 content 中提取(旧格式) content = delta.get("content", "") if content: full_content += content if "http" in content: - # 提取图片URL import re urls = re.findall(r'https?://[^\s\)\]"\']+', content) if urls: image_url = urls[0].rstrip("'\"") - logger.info(f"提取到图片URL: {image_url}") + logger.info(f"从 content 提取到图片URL: {image_url}") except Exception as e: logger.warning(f"解析响应数据失败: {e}") continue # 如果没有从流中提取到URL,尝试从完整内容中提取 - if not image_url and full_content: + if not image_url and not image_base64 and full_content: import re urls = re.findall(r'https?://[^\s\)\]"\']+', full_content) if urls: image_url = urls[0].rstrip("'\"") logger.info(f"从完整内容提取到图片URL: {image_url}") - if not image_url: - logger.error(f"未能提取到图片URL,完整响应: {full_content[:500]}") + if not image_url and not image_base64: + logger.error(f"未能提取到图片,完整响应: {full_content[:500]}") + # 处理 base64 图片 + if image_base64: + image_path = await self._save_base64_image(image_base64) + if image_path: + logger.success("成功生成图像 (base64)") + return [image_path] + else: + logger.warning(f"base64图片保存失败,将重试 ({attempt + 1}/{max_retry})") + continue + + # 处理 URL 图片 if image_url: - # 下载图片 image_path = await self._download_image(image_url) if image_path: logger.success("成功生成图像") @@ -184,6 +209,48 @@ class NanoImage(PluginBase): logger.warning(f"读取代理配置失败: {e}") return None + async def _save_base64_image(self, base64_data: str) -> Optional[str]: + """保存 base64 图片到本地""" + try: + # 去除 data:image/xxx;base64, 前缀 + if base64_data.startswith("data:image"): + # 提取格式和数据 + header, data = base64_data.split(",", 1) + # 从 header 中提取格式,如 data:image/jpeg;base64 + if "jpeg" in header or "jpg" in header: + ext = "jpg" + elif "png" in header: + ext = "png" + elif "gif" in header: + ext = "gif" + elif "webp" in header: + ext = "webp" + else: + ext = "jpg" + else: + data = base64_data + ext = "jpg" + + # 解码 base64 + image_bytes = base64.b64decode(data) + + # 生成文件名 + ts = datetime.now().strftime("%Y%m%d_%H%M%S") + uid = uuid.uuid4().hex[:8] + file_path = self.images_dir / f"nano_{ts}_{uid}.{ext}" + + # 保存文件 + with open(file_path, "wb") as f: + f.write(image_bytes) + + logger.info(f"base64图片保存成功: {file_path}") + return str(file_path) + except Exception as e: + logger.error(f"保存base64图片失败: {e}") + import traceback + logger.error(traceback.format_exc()) + return None + async def _download_image(self, url: str) -> Optional[str]: """下载图片到本地""" try: