diff --git a/src/chat/heart_flow/heartflow_message_processor.py b/src/chat/heart_flow/heartflow_message_processor.py index bea9f900..137e8f8d 100644 --- a/src/chat/heart_flow/heartflow_message_processor.py +++ b/src/chat/heart_flow/heartflow_message_processor.py @@ -140,10 +140,8 @@ class HeartFCMessageReceiver: replace_bot_name=True ) - if keywords: - logger.info(f"[{mes_name}]{userinfo.user_nickname}:{processed_plain_text}[兴趣度:{interested_rate:.2f}][关键词:{keywords}]") # type: ignore - else: - logger.info(f"[{mes_name}]{userinfo.user_nickname}:{processed_plain_text}[兴趣度:{interested_rate:.2f}]") # type: ignore + + logger.info(f"[{mes_name}]{userinfo.user_nickname}:{processed_plain_text}[{interested_rate:.2f}]") # type: ignore _ = Person.register_person(platform=message.message_info.platform, user_id=message.message_info.user_info.user_id,nickname=userinfo.user_nickname) # type: ignore diff --git a/src/chat/message_receive/uni_message_sender.py b/src/chat/message_receive/uni_message_sender.py index a881549f..dc858dd6 100644 --- a/src/chat/message_receive/uni_message_sender.py +++ b/src/chat/message_receive/uni_message_sender.py @@ -17,7 +17,7 @@ logger = get_logger("sender") async def send_message(message: MessageSending, show_log=True) -> bool: """合并后的消息发送函数,包含WS发送和日志记录""" - message_preview = truncate_message(message.processed_plain_text, max_length=120) + message_preview = truncate_message(message.processed_plain_text, max_length=200) try: # 直接调用API发送消息 diff --git a/src/chat/planner_actions/action_modifier.py b/src/chat/planner_actions/action_modifier.py index 875428d9..024d7011 100644 --- a/src/chat/planner_actions/action_modifier.py +++ b/src/chat/planner_actions/action_modifier.py @@ -131,7 +131,7 @@ class ActionModifier: available_actions = list(self.action_manager.get_using_actions().keys()) available_actions_text = "、".join(available_actions) if available_actions else "无" - logger.info( + logger.debug( f"{self.log_prefix} 当前可用动作: {available_actions_text}||移除: {removals_summary}" ) diff --git a/src/chat/planner_actions/planner.py b/src/chat/planner_actions/planner.py index 8ef47874..481dd2bf 100644 --- a/src/chat/planner_actions/planner.py +++ b/src/chat/planner_actions/planner.py @@ -512,7 +512,6 @@ class ActionPlanner: self.last_obs_time_mark = time.time() try: - logger.info(f"{self.log_prefix}开始构建副Planner") sub_planner_actions: Dict[str, ActionInfo] = {} for action_name, action_info in available_actions.items(): @@ -537,7 +536,7 @@ class ActionPlanner: sub_planner_size = int(global_config.chat.planner_size) + 1 sub_planner_num = math.ceil(sub_planner_actions_num / sub_planner_size) - logger.info(f"{self.log_prefix}副规划器数量: {sub_planner_num}, 副规划器大小: {sub_planner_size}") + logger.info(f"{self.log_prefix}使用{sub_planner_num}个小脑进行思考(尺寸:{sub_planner_size})") # 将sub_planner_actions随机分配到sub_planner_num个List中 sub_planner_lists: List[List[Tuple[str, ActionInfo]]] = [] diff --git a/src/chat/utils/statistic.py b/src/chat/utils/statistic.py index 5cec59f6..f1b1f429 100644 --- a/src/chat/utils/statistic.py +++ b/src/chat/utils/statistic.py @@ -612,7 +612,7 @@ class StatisticOutputTask(AsyncTask): f"总在线时间: {_format_online_time(stats[ONLINE_TIME])}", f"总消息数: {stats[TOTAL_MSG_CNT]}", f"总请求数: {stats[TOTAL_REQ_CNT]}", - f"总花费: {stats[TOTAL_COST]:.4f}¥", + f"总花费: {stats[TOTAL_COST]:.2f}¥", "", ] @@ -625,7 +625,7 @@ class StatisticOutputTask(AsyncTask): """ if stats[TOTAL_REQ_CNT] <= 0: return "" - data_fmt = "{:<32} {:>10} {:>12} {:>12} {:>12} {:>9.4f}¥ {:>10} {:>10}" + data_fmt = "{:<32} {:>10} {:>12} {:>12} {:>12} {:>9.2f}¥ {:>10.1f} {:>10.1f}" output = [ "按模型分类统计:", @@ -723,9 +723,9 @@ class StatisticOutputTask(AsyncTask): f"{stat_data[IN_TOK_BY_MODEL][model_name]}" f"{stat_data[OUT_TOK_BY_MODEL][model_name]}" f"{stat_data[TOTAL_TOK_BY_MODEL][model_name]}" - f"{stat_data[COST_BY_MODEL][model_name]:.4f} ¥" - f"{stat_data[AVG_TIME_COST_BY_MODEL][model_name]:.3f} 秒" - f"{stat_data[STD_TIME_COST_BY_MODEL][model_name]:.3f} 秒" + f"{stat_data[COST_BY_MODEL][model_name]:.2f} ¥" + f"{stat_data[AVG_TIME_COST_BY_MODEL][model_name]:.1f} 秒" + f"{stat_data[STD_TIME_COST_BY_MODEL][model_name]:.1f} 秒" f"" for model_name, count in sorted(stat_data[REQ_CNT_BY_MODEL].items()) ] @@ -739,9 +739,9 @@ class StatisticOutputTask(AsyncTask): f"{stat_data[IN_TOK_BY_TYPE][req_type]}" f"{stat_data[OUT_TOK_BY_TYPE][req_type]}" f"{stat_data[TOTAL_TOK_BY_TYPE][req_type]}" - f"{stat_data[COST_BY_TYPE][req_type]:.4f} ¥" - f"{stat_data[AVG_TIME_COST_BY_TYPE][req_type]:.3f} 秒" - f"{stat_data[STD_TIME_COST_BY_TYPE][req_type]:.3f} 秒" + f"{stat_data[COST_BY_TYPE][req_type]:.2f} ¥" + f"{stat_data[AVG_TIME_COST_BY_TYPE][req_type]:.1f} 秒" + f"{stat_data[STD_TIME_COST_BY_TYPE][req_type]:.1f} 秒" f"" for req_type, count in sorted(stat_data[REQ_CNT_BY_TYPE].items()) ] @@ -755,9 +755,9 @@ class StatisticOutputTask(AsyncTask): f"{stat_data[IN_TOK_BY_MODULE][module_name]}" f"{stat_data[OUT_TOK_BY_MODULE][module_name]}" f"{stat_data[TOTAL_TOK_BY_MODULE][module_name]}" - f"{stat_data[COST_BY_MODULE][module_name]:.4f} ¥" - f"{stat_data[AVG_TIME_COST_BY_MODULE][module_name]:.3f} 秒" - f"{stat_data[STD_TIME_COST_BY_MODULE][module_name]:.3f} 秒" + f"{stat_data[COST_BY_MODULE][module_name]:.2f} ¥" + f"{stat_data[AVG_TIME_COST_BY_MODULE][module_name]:.1f} 秒" + f"{stat_data[STD_TIME_COST_BY_MODULE][module_name]:.1f} 秒" f"" for module_name, count in sorted(stat_data[REQ_CNT_BY_MODULE].items()) ] @@ -780,79 +780,47 @@ class StatisticOutputTask(AsyncTask):

总在线时间: {_format_online_time(stat_data[ONLINE_TIME])}

总消息数: {stat_data[TOTAL_MSG_CNT]}

总请求数: {stat_data[TOTAL_REQ_CNT]}

-

总花费: {stat_data[TOTAL_COST]:.4f} ¥

+

总花费: {stat_data[TOTAL_COST]:.2f} ¥

-
-
-

按模型分类统计

- - - - {model_rows} - -
模型名称调用次数输入Token输出TokenToken总量累计花费平均耗时(秒)标准差(秒)
-
-
-

模型调用次数分布

- -
-
+

按模型分类统计

+ + + + {model_rows} + +
模型名称调用次数输入Token输出TokenToken总量累计花费平均耗时(秒)标准差(秒)
-
-
-

按模块分类统计

- - - - - - {module_rows} - -
模块名称调用次数输入Token输出TokenToken总量累计花费平均耗时(秒)标准差(秒)
-
-
-

模块调用次数分布

- -
-
+

按模块分类统计

+ + + + + + {module_rows} + +
模块名称调用次数输入Token输出TokenToken总量累计花费平均耗时(秒)标准差(秒)
-
-
-

按请求类型分类统计

- - - - - - {type_rows} - -
请求类型调用次数输入Token输出TokenToken总量累计花费平均耗时(秒)标准差(秒)
-
-
-

请求类型分布

- -
-
+

按请求类型分类统计

+ + + + + + {type_rows} + +
请求类型调用次数输入Token输出TokenToken总量累计花费平均耗时(秒)标准差(秒)
-
-
-

聊天消息统计

- - - - - - {chat_rows} - -
联系人/群组名称消息数量
-
-
-

消息分布

- -
-
+

聊天消息统计

+ + + + + + {chat_rows} + +
联系人/群组名称消息数量
- + """ diff --git a/src/common/logger.py b/src/common/logger.py index f6432a24..6b851454 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -330,11 +330,31 @@ def reconfigure_existing_loggers(): # 定义模块颜色映射 MODULE_COLORS = { + # 发送 + # "\033[38;5;67m" 这个颜色代码的含义如下: + # \033 :转义序列的起始,表示后面是控制字符(ESC) + # [38;5;67m : + # 38 :设置前景色(字体颜色),如果是背景色则用 48 + # 5 :表示使用8位(256色)模式 + # 67 :具体的颜色编号(0-255),这里是较暗的蓝色 + "sender": "\033[38;5;24m", # 67号色,较暗的蓝色,适合不显眼的日志 + "send_api": "\033[38;5;24m", # 208号色,橙色,适合突出显示 + + # 生成 + "replyer": "\033[38;5;208m", # 橙色 + "llm_api": "\033[38;5;208m", # 橙色 + + # 消息处理 + "chat": "\033[38;5;82m", # 亮蓝色 + + #emoji + "emoji": "\033[38;5;214m", # 橙黄色,偏向橙色 + "emoji_api": "\033[38;5;214m", # 橙黄色,偏向橙色 + # 核心模块 "main": "\033[1;97m", # 亮白色+粗体 (主程序) - "api": "\033[92m", # 亮绿色 - "emoji": "\033[38;5;214m", # 橙黄色,偏向橙色但与replyer和action_manager不同 - "chat": "\033[92m", # 亮蓝色 + + "config": "\033[93m", # 亮黄色 "common": "\033[95m", # 亮紫色 "tools": "\033[96m", # 亮青色 @@ -358,18 +378,17 @@ MODULE_COLORS = { "background_tasks": "\033[38;5;240m", # 灰色 "chat_message": "\033[38;5;45m", # 青色 "chat_stream": "\033[38;5;51m", # 亮青色 - "sender": "\033[38;5;67m", # 稍微暗一些的蓝色,不显眼 + "message_storage": "\033[38;5;33m", # 深蓝色 "expressor": "\033[38;5;166m", # 橙色 # 专注聊天模块 - "replyer": "\033[38;5;166m", # 橙色 + "memory_activator": "\033[38;5;117m", # 天蓝色 # 插件系统 "plugins": "\033[31m", # 红色 "plugin_api": "\033[33m", # 黄色 "plugin_manager": "\033[38;5;208m", # 红色 "base_plugin": "\033[38;5;202m", # 橙红色 - "send_api": "\033[38;5;208m", # 橙色 "base_command": "\033[38;5;208m", # 橙色 "component_registry": "\033[38;5;214m", # 橙黄色 "stream_api": "\033[38;5;220m", # 黄色 @@ -377,7 +396,6 @@ MODULE_COLORS = { "heartflow_api": "\033[38;5;154m", # 黄绿色 "action_apis": "\033[38;5;118m", # 绿色 "independent_apis": "\033[38;5;82m", # 绿色 - "llm_api": "\033[38;5;46m", # 亮绿色 "database_api": "\033[38;5;10m", # 绿色 "utils_api": "\033[38;5;14m", # 青色 "message_api": "\033[38;5;6m", # 青色 @@ -422,9 +440,15 @@ MODULE_COLORS = { # 定义模块别名映射 - 将真实的logger名称映射到显示的别名 MODULE_ALIASES = { # 示例映射 + "sender": "消息发送", + "send_api": "消息发送API", + "replyer": "言语", + "llm_api": "生成API", "emoji": "表情包", - "no_action_action": "摸鱼", - "reply_action": "回复", + "emoji_api": "表情包API", + + "chat": "所见", + "action_manager": "动作", "memory_activator": "记忆", "tool_use": "工具", @@ -434,14 +458,13 @@ MODULE_ALIASES = { "memory": "记忆", "tool_executor": "工具", "hfc": "聊天节奏", - "chat": "所见", + "plugin_manager": "插件", "relationship_builder": "关系", "llm_models": "模型", "person_info": "人物", "chat_stream": "聊天流", "planner": "规划器", - "replyer": "言语", "config": "配置", "main": "主程序", } diff --git a/src/plugin_system/apis/emoji_api.py b/src/plugin_system/apis/emoji_api.py index 479f3aec..f8faebfe 100644 --- a/src/plugin_system/apis/emoji_api.py +++ b/src/plugin_system/apis/emoji_api.py @@ -87,8 +87,6 @@ async def get_random(count: Optional[int] = 1) -> List[Tuple[str, str, str]]: return [] try: - logger.info(f"[EmojiAPI] 随机获取 {count} 个表情包") - emoji_manager = get_emoji_manager() all_emojis = emoji_manager.emoji_objects @@ -129,7 +127,7 @@ async def get_random(count: Optional[int] = 1) -> List[Tuple[str, str, str]]: logger.warning("[EmojiAPI] 随机获取表情包失败,没有一个可以成功处理") return [] - logger.info(f"[EmojiAPI] 成功获取 {len(results)} 个随机表情包") + logger.debug(f"[EmojiAPI] 成功获取 {len(results)} 个随机表情包") return results except Exception as e: diff --git a/src/plugins/built_in/emoji_plugin/emoji.py b/src/plugins/built_in/emoji_plugin/emoji.py index 9817ad05..e86b2c23 100644 --- a/src/plugins/built_in/emoji_plugin/emoji.py +++ b/src/plugins/built_in/emoji_plugin/emoji.py @@ -54,12 +54,9 @@ class EmojiAction(BaseAction): async def execute(self) -> Tuple[bool, str]: # sourcery skip: assign-if-exp, introduce-default-else, swap-if-else-branches, use-named-expression """执行表情动作""" - logger.info(f"{self.log_prefix} 决定发送表情") - try: # 1. 获取发送表情的原因 reason = self.action_data.get("reason", "表达当前情绪") - logger.info(f"{self.log_prefix} 发送表情原因: {reason}") # 2. 随机获取20个表情包 sampled_emojis = await emoji_api.get_random(30) @@ -129,7 +126,7 @@ class EmojiAction(BaseAction): # 6. 根据选择的情感匹配表情包 if chosen_emotion in emotion_map: emoji_base64, emoji_description = random.choice(emotion_map[chosen_emotion]) - logger.info(f"{self.log_prefix} 找到匹配情感 '{chosen_emotion}' 的表情包: {emoji_description}") + logger.info(f"{self.log_prefix} 发送表情包[{chosen_emotion}],原因: {reason}") else: logger.warning( f"{self.log_prefix} LLM选择的情感 '{chosen_emotion}' 不在可用列表中, 将随机选择一个表情包" @@ -140,7 +137,6 @@ class EmojiAction(BaseAction): success = await self.send_emoji(emoji_base64) if success: - logger.info(f"{self.log_prefix} 成功发送表情包") # 存储动作信息 await self.store_action_info( action_build_into_prompt=True, diff --git a/src/plugins/built_in/relation/relation.py b/src/plugins/built_in/relation/relation.py index c58d699a..bab9090d 100644 --- a/src/plugins/built_in/relation/relation.py +++ b/src/plugins/built_in/relation/relation.py @@ -104,9 +104,7 @@ class BuildRelationAction(BaseAction): associated_types = ["text"] async def execute(self) -> Tuple[bool, str]: - # sourcery skip: assign-if-exp, introduce-default-else, swap-if-else-branches, use-named-expression """执行关系动作""" - logger.info(f"{self.log_prefix} 决定添加记忆") try: # 1. 获取构建关系的原因