From 7f74fc473ea33ade831f849b49ac89dffea07522 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sun, 23 Nov 2025 14:26:44 +0800 Subject: [PATCH 1/2] =?UTF-8?q?style(log):=20=E7=A7=BB=E9=99=A4=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E8=BE=93=E5=87=BA=E4=B8=AD=E7=9A=84=20emoji=20?= =?UTF-8?q?=E7=AC=A6=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为了在不同终端和环境中保持日志输出的整洁与一致性,统一移除了日志信息中的 emoji 符号。 此举旨在避免潜在的渲染问题,并使日志更易于程序化解析和人工阅读。同时,对部分代码进行了微小的类型标注优化。 --- src/plugin_system/core/mcp_client_manager.py | 4 ++-- src/plugin_system/core/mcp_tool_adapter.py | 6 +++--- src/plugin_system/core/plugin_manager.py | 14 +++++++------- src/plugin_system/core/stream_tool_history.py | 2 +- src/plugin_system/utils/dependency_manager.py | 10 +++++----- .../web_search_tool/utils/api_key_manager.py | 3 ++- src/utils/json_parser.py | 8 ++++---- 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/plugin_system/core/mcp_client_manager.py b/src/plugin_system/core/mcp_client_manager.py index ffcec9e1c..4ab10971a 100644 --- a/src/plugin_system/core/mcp_client_manager.py +++ b/src/plugin_system/core/mcp_client_manager.py @@ -146,9 +146,9 @@ class MCPClientManager: try: client = await self._create_client(server_config) self.clients[server_name] = client - logger.info(f"✅ MCP 服务器 '{server_name}' 连接成功") + logger.info(f" MCP 服务器 '{server_name}' 连接成功") except Exception as e: - logger.error(f"❌ 连接 MCP 服务器 '{server_name}' 失败: {e}") + logger.error(f" 连接 MCP 服务器 '{server_name}' 失败: {e}") continue self._initialized = True diff --git a/src/plugin_system/core/mcp_tool_adapter.py b/src/plugin_system/core/mcp_tool_adapter.py index ec5faf441..47e1547b7 100644 --- a/src/plugin_system/core/mcp_tool_adapter.py +++ b/src/plugin_system/core/mcp_tool_adapter.py @@ -47,7 +47,7 @@ class MCPToolAdapter(BaseTool): self.available_for_llm = True # MCP 工具默认可供 LLM 使用 # 转换参数定义 - self.parameters = self._convert_parameters(mcp_tool.inputSchema) + self.parameters: list[tuple[str, ToolParamType, str, bool, list[str] | None]] = self._convert_parameters(mcp_tool.inputSchema) logger.debug(f"创建 MCP 工具适配器: {self.name}") @@ -238,9 +238,9 @@ async def load_mcp_tools_as_adapters() -> list[MCPToolAdapter]: try: adapter = MCPToolAdapter.from_mcp_tool(server_name, mcp_tool) adapters.append(adapter) - logger.debug(f" ✓ 加载工具: {adapter.name}") + logger.debug(f" 加载工具: {adapter.name}") except Exception as e: - logger.error(f" ✗ 创建工具适配器失败: {mcp_tool.name} | 错误: {e}") + logger.error(f" 创建工具适配器失败: {mcp_tool.name} | 错误: {e}") continue logger.info(f"MCP 工具加载完成: 成功 {len(adapters)}/{total_tools} 个") diff --git a/src/plugin_system/core/plugin_manager.py b/src/plugin_system/core/plugin_manager.py index 7b3900279..a409279d1 100644 --- a/src/plugin_system/core/plugin_manager.py +++ b/src/plugin_system/core/plugin_manager.py @@ -109,7 +109,7 @@ class PluginManager: if not module or not hasattr(module, "__plugin_meta__"): self.failed_plugins[plugin_name] = "插件模块中缺少 __plugin_meta__" - logger.error(f"❌ 插件加载失败: {plugin_name} - 缺少 __plugin_meta__") + logger.error(f" 插件加载失败: {plugin_name} - 缺少 __plugin_meta__") return False, 1 metadata: PluginMetadata = getattr(module, "__plugin_meta__") @@ -154,14 +154,14 @@ class PluginManager: return True, 1 else: self.failed_plugins[plugin_name] = "插件注册失败" - logger.error(f"❌ 插件注册失败: {plugin_name}") + logger.error(f" 插件注册失败: {plugin_name}") return False, 1 except Exception as e: # 其他错误 error_msg = f"未知错误: {e!s}" self.failed_plugins[plugin_name] = error_msg - logger.error(f"❌ 插件加载失败: {plugin_name} - {error_msg}") + logger.error(f" 插件加载失败: {plugin_name} - {error_msg}") logger.debug("详细错误信息: ", exc_info=True) return False, 1 @@ -340,14 +340,14 @@ class PluginManager: if not success: error_msg = f"Python依赖检查失败: {', '.join(errors)}" self.failed_plugins[plugin_name] = error_msg - logger.error(f"❌ 插件加载失败: {plugin_name} - {error_msg}") + logger.error(f" 插件加载失败: {plugin_name} - {error_msg}") return None # 依赖检查失败,不加载该模块 # 2. 检查插件依赖 if not self._check_plugin_dependencies(metadata): error_msg = f"插件依赖检查失败: 请确保依赖 {metadata.dependencies} 已正确安装并加载。" self.failed_plugins[plugin_name] = error_msg - logger.error(f"❌ 插件加载失败: {plugin_name} - {error_msg}") + logger.error(f" 插件加载失败: {plugin_name} - {error_msg}") return None # 插件依赖检查失败 # --- 依赖检查逻辑结束 --- @@ -408,7 +408,7 @@ class PluginManager: # 📋 显示插件加载总览 if total_registered > 0: - logger.info("🎉 插件系统加载完成!") + logger.info(" 插件系统加载完成!") logger.info( f"📊 总览: {total_registered}个插件, {total_components}个组件 (Action: {action_count}, Command: {command_count}, Tool: {tool_count}, PlusCommand: {plus_command_count}, EventHandler: {event_handler_count}, Chatter: {chatter_count}, Prompt: {prompt_count}, Router: {router_count})" ) @@ -616,7 +616,7 @@ class PluginManager: return True except Exception as e: - logger.error(f"❌ 插件卸载失败: {plugin_name} - {e!s}", exc_info=True) + logger.error(f" 插件卸载失败: {plugin_name} - {e!s}", exc_info=True) return False diff --git a/src/plugin_system/core/stream_tool_history.py b/src/plugin_system/core/stream_tool_history.py index fd440a04a..6a2cfc997 100644 --- a/src/plugin_system/core/stream_tool_history.py +++ b/src/plugin_system/core/stream_tool_history.py @@ -245,7 +245,7 @@ class StreamToolHistoryManager: lines = ["## 🔧 最近工具调用记录"] for i, record in enumerate(recent_records, 1): - status_icon = "✅" if record.status == "success" else "❌" if record.status == "error" else "⏳" + status_icon = "success" if record.status == "success" else "error" if record.status == "error" else "pending" # 格式化参数 args_preview = self._format_args_preview(record.args) diff --git a/src/plugin_system/utils/dependency_manager.py b/src/plugin_system/utils/dependency_manager.py index 4d5e48a9d..2939d8bb6 100644 --- a/src/plugin_system/utils/dependency_manager.py +++ b/src/plugin_system/utils/dependency_manager.py @@ -110,19 +110,19 @@ class DependencyManager: for package in packages: try: if self._install_single_package(package, plugin_name): - logger.info(f"{log_prefix}✅ 成功安装: {package}") + logger.info(f"{log_prefix} 成功安装: {package}") else: failed_packages.append(package) - logger.error(f"{log_prefix}❌ 安装失败: {package}") + logger.error(f"{log_prefix} 安装失败: {package}") except Exception as e: failed_packages.append(package) - logger.error(f"{log_prefix}❌ 安装 {package} 时发生异常: {e!s}") + logger.error(f"{log_prefix} 安装 {package} 时发生异常: {e!s}") success = len(failed_packages) == 0 if success: - logger.info(f"{log_prefix}🎉 所有依赖安装完成") + logger.info(f"{log_prefix} 所有依赖安装完成") else: - logger.error(f"{log_prefix}⚠️ 部分依赖安装失败: {failed_packages}") + logger.error(f"{log_prefix} 部分依赖安装失败: {failed_packages}") return success, failed_packages diff --git a/src/plugins/built_in/web_search_tool/utils/api_key_manager.py b/src/plugins/built_in/web_search_tool/utils/api_key_manager.py index bff72b97e..68dd6af2c 100644 --- a/src/plugins/built_in/web_search_tool/utils/api_key_manager.py +++ b/src/plugins/built_in/web_search_tool/utils/api_key_manager.py @@ -42,7 +42,7 @@ class APIKeyManager(Generic[T]): try: self.clients = [client_factory(key) for key in valid_keys] self.client_cycle = itertools.cycle(self.clients) - logger.info(f"🔑 {service_name} 成功加载 {len(valid_keys)} 个 API 密钥") + logger.info(f" {service_name} 成功加载 {len(valid_keys)} 个 API 密钥") except Exception as e: logger.error(f"❌ 初始化 {service_name} 客户端失败: {e}") self.clients = [] @@ -61,6 +61,7 @@ class APIKeyManager(Generic[T]): if not self.is_available(): return None + assert self.client_cycle is not None return next(self.client_cycle) def get_client_count(self) -> int: diff --git a/src/utils/json_parser.py b/src/utils/json_parser.py index 33a971cfa..4d1bf0ce9 100644 --- a/src/utils/json_parser.py +++ b/src/utils/json_parser.py @@ -58,7 +58,7 @@ def extract_and_parse_json(response: str, *, strict: bool = False) -> dict[str, # 步骤 2: 尝试直接解析 try: result = orjson.loads(cleaned) - logger.debug(f"✅ JSON 直接解析成功,类型: {type(result).__name__}") + logger.debug(f" JSON 直接解析成功,类型: {type(result).__name__}") return result except Exception as direct_error: logger.debug(f"直接解析失败: {type(direct_error).__name__}: {direct_error}") @@ -70,10 +70,10 @@ def extract_and_parse_json(response: str, *, strict: bool = False) -> dict[str, # repair_json 可能返回字符串或已解析的对象 if isinstance(repaired, str): result = orjson.loads(repaired) - logger.debug(f"✅ JSON 修复后解析成功(字符串模式),类型: {type(result).__name__}") + logger.debug(f" JSON 修复后解析成功(字符串模式),类型: {type(result).__name__}") else: result = repaired - logger.debug(f"✅ JSON 修复后解析成功(对象模式),类型: {type(result).__name__}") + logger.debug(f" JSON 修复后解析成功(对象模式),类型: {type(result).__name__}") return result @@ -93,7 +93,7 @@ def extract_and_parse_json(response: str, *, strict: bool = False) -> dict[str, return {} except Exception as e: - logger.error(f"❌ JSON 解析过程出现异常: {type(e).__name__}: {e}") + logger.error(f" JSON 解析过程出现异常: {type(e).__name__}: {e}") if strict: return None return {} if not response.strip().startswith("[") else [] From 33c6ddc6dd4fdda5f10673861c2fca9683bac520 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sun, 23 Nov 2025 14:40:34 +0800 Subject: [PATCH 2/2] =?UTF-8?q?style(log):=20=E7=BB=9F=E4=B8=80=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A0=BC=E5=BC=8F=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E6=A0=87=E7=AD=BE=E6=9B=BF=E4=BB=A3emoji=E5=89=8D?= =?UTF-8?q?=E7=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将日志消息中的 emoji 前缀(如 ✅, ❌, ⚠️)替换为更清晰、更易于解析的文本标签(如 [成功], [错误], [警告])。 这一改动有以下好处: - 提高了在不同终端和环境下的日志可读性与一致性。 - 避免了 emoji 字符可能导致的渲染问题。 - 使日志更易于被自动化工具进行筛选和分析。 --- .../core/affinity_interest_calculator.py | 2 +- .../proactive/proactive_thinking_event.py | 8 ++++---- .../proactive/proactive_thinking_executor.py | 12 ++++++------ .../proactive/proactive_thinking_scheduler.py | 12 ++++++------ ui_log_adapter.py | 4 ++-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py b/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py index 66ba4cee5..60731ca9c 100644 --- a/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py +++ b/src/plugins/built_in/affinity_flow_chatter/core/affinity_interest_calculator.py @@ -223,7 +223,7 @@ class AffinityInterestCalculator(BaseInterestCalculator): return 0.0 except asyncio.TimeoutError: - logger.warning("⏱️ 兴趣匹配计算超时(>1.5秒),返回默认分值0.5以保留其他分数") + logger.warning("[超时] 兴趣匹配计算超时(>1.5秒),返回默认分值0.5以保留其他分数") return 0.5 # 超时时返回默认分值,避免丢失提及分和关系分 except Exception as e: logger.warning(f"智能兴趣匹配失败: {e}") diff --git a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py index 0d3f39aa8..21af4537d 100644 --- a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py +++ b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_event.py @@ -85,14 +85,14 @@ class ProactiveThinkingReplyHandler(BaseEventHandler): if success: if was_paused: - logger.info(f"✅ 聊天流 {stream_id} 主动思考已恢复并重置") + logger.info(f"[成功] 聊天流 {stream_id} 主动思考已恢复并重置") else: - logger.debug(f"✅ 聊天流 {stream_id} 主动思考任务已重置") + logger.debug(f"[成功] 聊天流 {stream_id} 主动思考任务已重置") else: - logger.warning(f"❌ 重置聊天流 {stream_id} 主动思考任务失败") + logger.warning(f"[错误] 重置聊天流 {stream_id} 主动思考任务失败") except Exception as e: - logger.error(f"❌ 处理reply事件时出错: {e}", exc_info=True) + logger.error(f"[错误] 处理reply事件时出错: {e}", exc_info=True) # 总是继续处理其他handler return HandlerResult(success=True, continue_process=True, message=None) diff --git a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py index e5b37e58b..fd4296d2a 100644 --- a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py +++ b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_executor.py @@ -694,11 +694,11 @@ async def execute_proactive_thinking(stream_id: str): # 尝试获取锁,如果已被占用则跳过本次执行(防止重复) if lock.locked(): - logger.warning(f"⚠️ 主动思考跳过:聊天流 {stream_id} 已有正在执行的主动思考任务") + logger.warning(f"[警告] 主动思考跳过:聊天流 {stream_id} 已有正在执行的主动思考任务") return async with lock: - logger.debug(f"🤔 开始主动思考 {stream_id}") + logger.debug(f"[思考] 开始主动思考 {stream_id}") try: # 0. 前置检查 @@ -709,10 +709,10 @@ async def execute_proactive_thinking(stream_id: str): chat_stream = await chat_manager.get_stream(stream_id) if chat_stream and chat_stream.context_manager.context.is_chatter_processing: - logger.warning(f"⚠️ 主动思考等待:聊天流 {stream_id} 的 chatter 正在处理消息,等待3秒后重试...") + logger.warning(f"[警告] 主动思考等待:聊天流 {stream_id} 的 chatter 正在处理消息,等待3秒后重试...") await asyncio.sleep(3) if chat_stream.context_manager.context.is_chatter_processing: - logger.warning(f"⚠️ 主动思考跳过:聊天流 {stream_id} 的 chatter 仍在处理消息") + logger.warning(f"[警告] 主动思考跳过:聊天流 {stream_id} 的 chatter 仍在处理消息") return except Exception as e: logger.warning(f"检查 chatter 处理状态时出错: {e},继续执行") @@ -781,7 +781,7 @@ async def execute_proactive_thinking(stream_id: str): return elif action == "simple_bubble": - logger.info(f"💬 决策:冒个泡。理由:{reasoning}") + logger.info(f"[决策] 决策:冒个泡。理由:{reasoning}") proactive_thinking_scheduler.record_decision(stream_id, action, reasoning, None) @@ -793,7 +793,7 @@ async def execute_proactive_thinking(stream_id: str): stream_id=stream_id, text=reply, ) - logger.info("✅ 已发送冒泡消息") + logger.info("[成功] 已发送冒泡消息") # 增加每日计数 proactive_thinking_scheduler._increment_daily_count(stream_id) diff --git a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py index 61c0e4146..c38a2c680 100644 --- a/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py +++ b/src/plugins/built_in/affinity_flow_chatter/proactive/proactive_thinking_scheduler.py @@ -216,7 +216,7 @@ class ProactiveThinkingScheduler: return 0.5 except Exception as e: - logger.error(f"[调度器] ❌ 获取聊天流 {stream_id} 的 focus_energy 失败: {e}", exc_info=True) + logger.error(f"[调度器] [错误] 获取聊天流 {stream_id} 的 focus_energy 失败: {e}", exc_info=True) return 0.5 async def schedule_proactive_thinking(self, stream_id: str) -> bool: @@ -280,7 +280,7 @@ class ProactiveThinkingScheduler: return True except Exception as e: - logger.error(f"❌ 创建主动思考任务失败 {stream_id}: {e}", exc_info=True) + logger.error(f"[错误] 创建主动思考任务失败 {stream_id}: {e}", exc_info=True) return False async def pause_proactive_thinking(self, stream_id: str, reason: str = "抛出话题") -> bool: @@ -340,7 +340,7 @@ class ProactiveThinkingScheduler: return success except Exception as e: - logger.error(f"❌ 恢复主动思考失败 {stream_id}: {e}", exc_info=True) + logger.error(f"[错误] 恢复主动思考失败 {stream_id}: {e}", exc_info=True) return False async def cancel_proactive_thinking(self, stream_id: str) -> bool: @@ -361,12 +361,12 @@ class ProactiveThinkingScheduler: self._paused_streams.discard(stream_id) success = await unified_scheduler.remove_schedule(schedule_id) - logger.debug(f"⏹️ 取消主动思考 {stream_id}") + logger.debug(f"[取消] 取消主动思考 {stream_id}") return success except Exception as e: - logger.error(f"❌ 取消主动思考失败 {stream_id}: {e}", exc_info=True) + logger.error(f"[错误] 取消主动思考失败 {stream_id}: {e}", exc_info=True) return False async def is_paused(self, stream_id: str) -> bool: @@ -482,7 +482,7 @@ class ProactiveThinkingScheduler: minutes = (remaining_seconds % 3600) // 60 time_str = f"{hours}小时{minutes}分钟后" - status = "⏸️ 暂停中" if is_paused else "✅ 活跃" + status = "[暂停] 暂停中" if is_paused else "[活跃] 活跃" logger.info( f"[{i:2d}] {status} | {stream_name}\n" diff --git a/ui_log_adapter.py b/ui_log_adapter.py index d72c94352..bc52d4826 100644 --- a/ui_log_adapter.py +++ b/ui_log_adapter.py @@ -99,8 +99,8 @@ class UILogHandler(logging.Handler): if record.levelname == "DEBUG": return - emoji_map = {"info": "📝", "warning": "⚠️", "error": "❌", "debug": "🔍"} - formatted_msg = f"{emoji_map.get(ui_level, '📝')} {msg}" + emoji_map = {"info": "", "warning": "", "error": "", "debug": ""} + formatted_msg = msg self._send_log_with_retry(formatted_msg, ui_level) # 可选:记录发送状态