diff --git a/README.md b/README.md index 656f536ad..26cd30f61 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@

- Logo + Logo
@@ -34,7 +34,6 @@ · 提出新特性

-

## 新版0.6.x部署前先阅读:https://docs.mai-mai.org/manual/usage/mmc_q_a @@ -53,7 +52,7 @@
- 麦麦演示视频 + 麦麦演示视频
👆 点击观看麦麦演示视频 👆
@@ -186,7 +185,7 @@ MaiCore是一个开源项目,我们非常欢迎你的参与。你的贡献, 感谢各位大佬! - + contributors **也感谢每一位给麦麦发展提出宝贵意见与建议的用户,感谢陪伴麦麦走到现在的你们** diff --git a/src/individuality/individuality.py b/src/individuality/individuality.py index e7616ec27..2a489338a 100644 --- a/src/individuality/individuality.py +++ b/src/individuality/individuality.py @@ -105,3 +105,4 @@ class Individuality: return self.personality.agreeableness elif factor == "neuroticism": return self.personality.neuroticism + return None diff --git a/src/main.py b/src/main.py index aad08b906..929cff7dd 100644 --- a/src/main.py +++ b/src/main.py @@ -18,7 +18,7 @@ from .plugins.remote import heartbeat_thread # noqa: F401 from .individuality.individuality import Individuality from .common.server import global_server from .plugins.chat_module.heartFC_chat.interest import InterestManager -from .plugins.chat_module.heartFC_chat.heartFC_controler import HeartFC_Controller +from .plugins.chat_module.heartFC_chat.heartFC_controler import HeartFCController logger = get_module_logger("main") @@ -118,8 +118,8 @@ class MainSystem: logger.success("兴趣管理器后台任务启动成功") # 初始化并独立启动 HeartFC_Chat - HeartFC_Controller() - heartfc_chat_instance = HeartFC_Controller.get_instance() + HeartFCController() + heartfc_chat_instance = HeartFCController.get_instance() if heartfc_chat_instance: await heartfc_chat_instance.start() logger.success("HeartFC_Chat 模块独立启动成功") diff --git a/src/plugins/PFC/conversation.py b/src/plugins/PFC/conversation.py index 598468e89..9502b755c 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/plugins/PFC/conversation.py @@ -180,6 +180,7 @@ class Conversation: "time": datetime.datetime.now().strftime("%H:%M:%S"), } ) + return None elif action == "fetch_knowledge": self.waiter.wait_accumulated_time = 0 @@ -193,28 +194,35 @@ class Conversation: if knowledge: if topic not in self.conversation_info.knowledge_list: self.conversation_info.knowledge_list.append({"topic": topic, "knowledge": knowledge}) + return None else: self.conversation_info.knowledge_list[topic] += knowledge + return None + return None elif action == "rethink_goal": self.waiter.wait_accumulated_time = 0 self.state = ConversationState.RETHINKING await self.goal_analyzer.analyze_goal(conversation_info, observation_info) + return None elif action == "listening": self.state = ConversationState.LISTENING logger.info("倾听对方发言...") await self.waiter.wait_listening(conversation_info) + return None elif action == "end_conversation": self.should_continue = False logger.info("决定结束对话...") + return None else: # wait self.state = ConversationState.WAITING logger.info("等待更多信息...") await self.waiter.wait(self.conversation_info) + return None async def _send_timeout_message(self): """发送超时结束消息""" diff --git a/src/plugins/chat/bot.py b/src/plugins/chat/bot.py index 314d20ff0..cfe4238ea 100644 --- a/src/plugins/chat/bot.py +++ b/src/plugins/chat/bot.py @@ -7,7 +7,7 @@ from ..chat_module.only_process.only_message_process import MessageProcessor from src.common.logger import get_module_logger, CHAT_STYLE_CONFIG, LogConfig from ..chat_module.reasoning_chat.reasoning_chat import ReasoningChat -from ..chat_module.heartFC_chat.heartFC_processor import HeartFC_Processor +from ..chat_module.heartFC_chat.heartFC_processor import HeartFCProcessor from ..utils.prompt_builder import Prompt, global_prompt_manager import traceback @@ -29,7 +29,7 @@ class ChatBot: self.mood_manager = MoodManager.get_instance() # 获取情绪管理器单例 self.mood_manager.start_mood_update() # 启动情绪更新 self.reasoning_chat = ReasoningChat() - self.heartFC_processor = HeartFC_Processor() # 新增 + self.heartFC_processor = HeartFCProcessor() # 新增 # 创建初始化PFC管理器的任务,会在_ensure_started时执行 self.only_process_chat = MessageProcessor() diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py index cbea1fd92..87380e7c0 100644 --- a/src/plugins/chat/message.py +++ b/src/plugins/chat/message.py @@ -1,14 +1,13 @@ import time from dataclasses import dataclass -from typing import Dict, List, Optional +from typing import Dict, List, Optional, Union import urllib3 -from .utils_image import image_manager - -from ..message.message_base import Seg, UserInfo, BaseMessageInfo, MessageBase -from .chat_stream import ChatStream from src.common.logger import get_module_logger +from .chat_stream import ChatStream +from .utils_image import image_manager +from ..message.message_base import Seg, UserInfo, BaseMessageInfo, MessageBase logger = get_module_logger("chat_message") @@ -207,7 +206,7 @@ class MessageProcessBase(Message): # 处理单个消息段 return await self._process_single_segment(segment) - async def _process_single_segment(self, seg: Seg) -> str: + async def _process_single_segment(self, seg: Seg) -> Union[str, None]: """处理单个消息段 Args: @@ -233,6 +232,7 @@ class MessageProcessBase(Message): elif seg.type == "reply": if self.reply and hasattr(self.reply, "processed_plain_text"): return f"[回复:{self.reply.processed_plain_text}]" + return None else: return f"[{seg.type}:{str(seg.data)}]" except Exception as e: diff --git a/src/plugins/chat/utils.py b/src/plugins/chat/utils.py index 9c98a16a5..3e4cfa52d 100644 --- a/src/plugins/chat/utils.py +++ b/src/plugins/chat/utils.py @@ -2,7 +2,7 @@ import random import time import re from collections import Counter -from typing import Dict, List +from typing import Dict, List, Optional import jieba import numpy as np @@ -688,7 +688,7 @@ def count_messages_between(start_time: float, end_time: float, stream_id: str) - return 0, 0 -def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal") -> str: +def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal") -> Optional[str]: """将时间戳转换为人类可读的时间格式 Args: @@ -716,6 +716,7 @@ def translate_timestamp_to_human_readable(timestamp: float, mode: str = "normal" return f"{int(diff / 86400)}天前:\n" else: return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp)) + ":\n" + return None def parse_text_timestamps(text: str, mode: str = "normal") -> str: diff --git a/src/plugins/chat_module/heartFC_chat/heartFC_controler.py b/src/plugins/chat_module/heartFC_chat/heartFC_controler.py index 389e030a4..a217f9785 100644 --- a/src/plugins/chat_module/heartFC_chat/heartFC_controler.py +++ b/src/plugins/chat_module/heartFC_chat/heartFC_controler.py @@ -20,18 +20,18 @@ chat_config = LogConfig( file_format=CHAT_STYLE_CONFIG["file_format"], ) -logger = get_module_logger("HeartFC_Controller", config=chat_config) +logger = get_module_logger("HeartFCController", config=chat_config) # 检测群聊兴趣的间隔时间 INTEREST_MONITOR_INTERVAL_SECONDS = 1 -class HeartFC_Controller: +class HeartFCController: _instance = None # For potential singleton access if needed by MessageManager def __init__(self): # --- Updated Init --- - if HeartFC_Controller._instance is not None: + if HeartFCController._instance is not None: # Prevent re-initialization if used as a singleton return self.gpt = ResponseGenerator() @@ -44,7 +44,7 @@ class HeartFC_Controller: self.pf_chatting_instances: Dict[str, PFChatting] = {} self._pf_chatting_lock = Lock() # --- End New PFChatting Management --- - HeartFC_Controller._instance = self # Register instance + HeartFCController._instance = self # Register instance # --- End Updated Init --- # --- Make dependencies accessible for PFChatting --- # These are accessed via the passed instance in PFChatting @@ -58,7 +58,7 @@ class HeartFC_Controller: def get_instance(cls): if cls._instance is None: # This might indicate an issue if called before initialization - logger.warning("HeartFC_Controller get_instance called before initialization.") + logger.warning("HeartFCController get_instance called before initialization.") # Optionally, initialize here if a strict singleton pattern is desired # cls._instance = cls() return cls._instance @@ -67,9 +67,9 @@ class HeartFC_Controller: async def start(self): """启动异步任务,如回复启动器""" - logger.debug("HeartFC_Controller 正在启动异步任务...") + logger.debug("HeartFCController 正在启动异步任务...") self._initialize_monitor_task() - logger.info("HeartFC_Controller 异步任务启动完成") + logger.info("HeartFCController 异步任务启动完成") def _initialize_monitor_task(self): """启动后台兴趣监控任务,可以检查兴趣是否足以开启心流对话""" @@ -89,7 +89,7 @@ class HeartFC_Controller: async with self._pf_chatting_lock: if stream_id not in self.pf_chatting_instances: logger.info(f"为流 {stream_id} 创建新的PFChatting实例") - # 传递 self (HeartFC_Controller 实例) 进行依赖注入 + # 传递 self (HeartFCController 实例) 进行依赖注入 instance = PFChatting(stream_id, self) # 执行异步初始化 if not await instance._initialize(): diff --git a/src/plugins/chat_module/heartFC_chat/heartFC_processor.py b/src/plugins/chat_module/heartFC_chat/heartFC_processor.py index 37708a94f..44849f821 100644 --- a/src/plugins/chat_module/heartFC_chat/heartFC_processor.py +++ b/src/plugins/chat_module/heartFC_chat/heartFC_processor.py @@ -25,7 +25,7 @@ logger = get_module_logger("heartFC_processor", config=processor_config) # INTEREST_INCREASE_THRESHOLD = 0.5 -class HeartFC_Processor: +class HeartFCProcessor: def __init__(self): self.storage = MessageStorage() self.interest_manager = InterestManager() @@ -97,21 +97,21 @@ class HeartFC_Processor: # 处理缓冲器结果 (Bombing logic) if not buffer_result: - F_type = "seglist" + f_type = "seglist" if message.message_segment.type != "seglist": - F_type = message.message_segment.type + f_type = message.message_segment.type else: if ( isinstance(message.message_segment.data, list) and all(isinstance(x, Seg) for x in message.message_segment.data) and len(message.message_segment.data) == 1 ): - F_type = message.message_segment.data[0].type - if F_type == "text": + f_type = message.message_segment.data[0].type + if f_type == "text": logger.debug(f"触发缓冲,消息:{message.processed_plain_text}") - elif F_type == "image": + elif f_type == "image": logger.debug("触发缓冲,表情包/图片等待中") - elif F_type == "seglist": + elif f_type == "seglist": logger.debug("触发缓冲,消息列表等待中") return # 被缓冲器拦截,不生成回复 diff --git a/src/plugins/chat_module/heartFC_chat/pf_chatting.py b/src/plugins/chat_module/heartFC_chat/pf_chatting.py index 59472fd14..2bb89987a 100644 --- a/src/plugins/chat_module/heartFC_chat/pf_chatting.py +++ b/src/plugins/chat_module/heartFC_chat/pf_chatting.py @@ -25,7 +25,7 @@ logger = get_module_logger("PFCLoop", config=interest_log_config) # Logger Name # Forward declaration for type hinting if TYPE_CHECKING: - from .heartFC_controler import HeartFC_Controller + from .heartFC_controler import HeartFCController PLANNER_TOOL_DEFINITION = [ { @@ -61,7 +61,7 @@ class PFChatting: 只要计时器>0,循环就会继续。 """ - def __init__(self, chat_id: str, heartfc_controller_instance: "HeartFC_Controller"): + def __init__(self, chat_id: str, heartfc_controller_instance: "HeartFCController"): """ 初始化PFChatting实例。 @@ -374,6 +374,22 @@ class PFChatting: ) action_taken_this_cycle = False + # --- Print Timer Results --- # + if cycle_timers: # 先检查cycle_timers是否非空 + timer_strings = [] + for name, elapsed in cycle_timers.items(): + # 直接格式化存储在字典中的浮点数 elapsed + formatted_time = f"{elapsed * 1000:.2f}毫秒" if elapsed < 1 else f"{elapsed:.2f}秒" + timer_strings.append(f"{name}: {formatted_time}") + + if timer_strings: # 如果有有效计时器数据才打印 + logger.debug( + f"{log_prefix} test testtesttesttesttesttesttesttesttesttest Cycle Timers: {'; '.join(timer_strings)}" + ) + + # --- Timer Decrement --- # + cycle_duration = time.monotonic() - loop_cycle_start_time + except Exception as e_cycle: logger.error(f"{log_prefix} 循环周期执行时发生错误: {e_cycle}") logger.error(traceback.format_exc()) @@ -387,21 +403,6 @@ class PFChatting: self._processing_lock.release() logger.trace(f"{log_prefix} 循环释放了处理锁.") - # --- Print Timer Results --- # - if cycle_timers: # 先检查cycle_timers是否非空 - timer_strings = [] - for name, elapsed in cycle_timers.items(): - # 直接格式化存储在字典中的浮点数 elapsed - formatted_time = f"{elapsed * 1000:.2f}毫秒" if elapsed < 1 else f"{elapsed:.2f}秒" - timer_strings.append(f"{name}: {formatted_time}") - - if timer_strings: # 如果有有效计时器数据才打印 - logger.debug( - f"{log_prefix} test testtesttesttesttesttesttesttesttesttest Cycle Timers: {'; '.join(timer_strings)}" - ) - - # --- Timer Decrement --- # - cycle_duration = time.monotonic() - loop_cycle_start_time async with self._timer_lock: self._loop_timer -= cycle_duration # Log timer decrement less aggressively @@ -771,7 +772,7 @@ class PFChatting: logger.error(traceback.format_exc()) return None - # --- Methods moved from HeartFC_Controller start --- + # --- Methods moved from HeartFCController start --- async def _create_thinking_message(self, anchor_message: Optional[MessageRecv]) -> Optional[str]: """创建思考消息 (尝试锚定到 anchor_message)""" if not anchor_message or not anchor_message.chat_stream: diff --git a/src/plugins/chat_module/reasoning_chat/reasoning_chat.py b/src/plugins/chat_module/reasoning_chat/reasoning_chat.py index d149f68b0..2eb56c83b 100644 --- a/src/plugins/chat_module/reasoning_chat/reasoning_chat.py +++ b/src/plugins/chat_module/reasoning_chat/reasoning_chat.py @@ -1,25 +1,26 @@ import time -from random import random import traceback -from typing import List -from ...memory_system.Hippocampus import HippocampusManager -from ...moods.moods import MoodManager -from ....config.config import global_config -from ...chat.emoji_manager import emoji_manager +from random import random +from typing import List, Optional + +from src.common.logger import get_module_logger, CHAT_STYLE_CONFIG, LogConfig +from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager from .reasoning_generator import ResponseGenerator +from ...chat.chat_stream import chat_manager +from ...chat.emoji_manager import emoji_manager from ...chat.message import MessageSending, MessageRecv, MessageThinking, MessageSet +from ...chat.message_buffer import message_buffer from ...chat.messagesender import message_manager -from ...storage.storage import MessageStorage from ...chat.utils import is_mentioned_bot_in_message from ...chat.utils_image import image_path_to_base64 -from ...willing.willing_manager import willing_manager +from ...memory_system.Hippocampus import HippocampusManager from ...message import UserInfo, Seg -from src.common.logger import get_module_logger, CHAT_STYLE_CONFIG, LogConfig -from ...chat.chat_stream import chat_manager +from ...moods.moods import MoodManager from ...person_info.relationship_manager import relationship_manager -from ...chat.message_buffer import message_buffer -from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager +from ...storage.storage import MessageStorage from ...utils.timer_calculater import Timer +from ...willing.willing_manager import willing_manager +from ....config.config import global_config # 定义日志配置 chat_config = LogConfig( @@ -61,7 +62,7 @@ class ReasoningChat: return thinking_id @staticmethod - async def _send_response_messages(message, chat, response_set: List[str], thinking_id) -> MessageSending: + async def _send_response_messages(message, chat, response_set: List[str], thinking_id) -> Optional[MessageSending]: """发送回复消息""" container = message_manager.get_container(chat.stream_id) thinking_message = None @@ -74,7 +75,7 @@ class ReasoningChat: if not thinking_message: logger.warning("未找到对应的思考消息,可能已超时被移除") - return + return None thinking_start_time = thinking_message.thinking_start_time message_set = MessageSet(chat, thinking_id) diff --git a/src/plugins/message/message_base.py b/src/plugins/message/message_base.py index 2f1776702..b853d469a 100644 --- a/src/plugins/message/message_base.py +++ b/src/plugins/message/message_base.py @@ -12,7 +12,6 @@ class Seg: - 对于 text 类型,data 是字符串 - 对于 image 类型,data 是 base64 字符串 - 对于 seglist 类型,data 是 Seg 列表 - translated_data: 经过翻译处理的数据(可选) """ type: str diff --git a/src/plugins/person_info/person_info.py b/src/plugins/person_info/person_info.py index 8105b330f..b4404988e 100644 --- a/src/plugins/person_info/person_info.py +++ b/src/plugins/person_info/person_info.py @@ -169,7 +169,7 @@ class PersonInfoManager: """给某个用户取名""" if not person_id: logger.debug("取名失败:person_id不能为空") - return + return None old_name = await self.get_value(person_id, "person_name") old_reason = await self.get_value(person_id, "name_reason") diff --git a/src/plugins/remote/remote.py b/src/plugins/remote/remote.py index 0d119a3ec..5bc4dab14 100644 --- a/src/plugins/remote/remote.py +++ b/src/plugins/remote/remote.py @@ -134,3 +134,4 @@ def main(): heartbeat_thread.start() return heartbeat_thread # 返回线程对象,便于外部控制 + return None diff --git a/template/template.env b/template/template.env index 06e9b07ec..c1a6dd0dc 100644 --- a/template/template.env +++ b/template/template.env @@ -29,8 +29,18 @@ CHAT_ANY_WHERE_KEY= SILICONFLOW_KEY= # 定义日志相关配置 -SIMPLE_OUTPUT=true # 精简控制台输出格式 -CONSOLE_LOG_LEVEL=INFO # 自定义日志的默认控制台输出日志级别 -FILE_LOG_LEVEL=DEBUG # 自定义日志的默认文件输出日志级别 -DEFAULT_CONSOLE_LOG_LEVEL=SUCCESS # 原生日志的控制台输出日志级别(nonebot就是这一类) -DEFAULT_FILE_LOG_LEVEL=DEBUG # 原生日志的默认文件输出日志级别(nonebot就是这一类) \ No newline at end of file + +# 精简控制台输出格式 +SIMPLE_OUTPUT=true + +# 自定义日志的默认控制台输出日志级别 +CONSOLE_LOG_LEVEL=INFO + +# 自定义日志的默认文件输出日志级别 +FILE_LOG_LEVEL=DEBUG + +# 原生日志的控制台输出日志级别(nonebot就是这一类) +DEFAULT_CONSOLE_LOG_LEVEL=SUCCESS + +# 原生日志的默认文件输出日志级别(nonebot就是这一类) +DEFAULT_FILE_LOG_LEVEL=DEBUG