From aec1319d2b9fbd46ec4f95d619e4e24a5f75c247 Mon Sep 17 00:00:00 2001 From: Bakadax Date: Sun, 4 May 2025 20:21:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=A7=E8=81=AA=E6=98=8E?= =?UTF-8?q?=E5=88=A4=E6=96=AD=EF=BC=8C=E9=81=BF=E5=85=8D=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=AE=BE=E7=BD=AEprompt=E6=B3=A8=E5=85=A5=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E4=B8=BA0=E7=9A=84=E6=83=85=E5=86=B5=20=E5=B0=86=E4=B8=8A?= =?UTF-8?q?=E4=B8=8B=E6=96=87=E6=95=B0=E9=87=8F=E6=8F=90=E5=87=BA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E4=B8=AD=E4=BB=A5=E8=AE=A9=E7=94=A8=E6=88=B7=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E9=85=8D=E7=BD=AE=20=E7=BB=9F=E4=B8=80=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E5=B0=8F=E5=86=99=E5=AD=97=E6=AF=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/config/config.py | 36 ++++++++++--------- .../group_nickname/nickname_manager.py | 12 ++++--- src/plugins/group_nickname/nickname_utils.py | 4 +-- template/bot_config_template.toml | 1 + 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/config/config.py b/src/config/config.py index 312f3e95..2f091cba 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -275,11 +275,12 @@ class BotConfig: enable_pfc_chatting: bool = False # 是否启用PFC聊天 # Group Nickname - ENABLE_NICKNAME_MAPPING: bool = False # 绰号映射功能总开关 - MAX_NICKNAMES_IN_PROMPT: int = 10 # Prompt 中最多注入的绰号数量 - NICKNAME_PROBABILITY_SMOOTHING: int = 1 # 绰号加权随机选择的平滑因子 - NICKNAME_QUEUE_MAX_SIZE: int = 100 # 绰号处理队列最大容量 - NICKNAME_PROCESS_SLEEP_INTERVAL: float = 60 # 绰号处理进程休眠间隔(秒) + enable_nickname_mapping: bool = False # 绰号映射功能总开关 + max_nicknames_in_prompt: int = 10 # Prompt 中最多注入的绰号数量 + nickname_probability_smoothing: int = 1 # 绰号加权随机选择的平滑因子 + nickname_queue_max_size: int = 100 # 绰号处理队列最大容量 + nickname_process_sleep_interval: float = 60 # 绰号处理进程休眠间隔(秒) + nickname_analysis_history_limit: int = 30 # 绰号处理可见最大上下文 # 模型配置 llm_reasoning: dict[str, str] = field(default_factory=lambda: {}) @@ -412,21 +413,24 @@ class BotConfig: def group_nickname(parent: dict): if config.INNER_VERSION in SpecifierSet(">=1.6.2"): - gn_config = parent.get("group_nickname", {}) - config.ENABLE_NICKNAME_MAPPING = gn_config.get( - "enable_nickname_mapping", config.ENABLE_NICKNAME_MAPPING + group_nickname_config = parent.get("group_nickname", {}) + config.enable_nickname_mapping = group_nickname_config.get( + "enable_nickname_mapping", config.enable_nickname_mapping ) - config.MAX_NICKNAMES_IN_PROMPT = gn_config.get( - "max_nicknames_in_prompt", config.MAX_NICKNAMES_IN_PROMPT + config.max_nicknames_in_prompt = group_nickname_config.get( + "max_nicknames_in_prompt", config.max_nicknames_in_prompt ) - config.NICKNAME_PROBABILITY_SMOOTHING = gn_config.get( - "nickname_probability_smoothing", config.NICKNAME_PROBABILITY_SMOOTHING + config.nickname_probability_smoothing = group_nickname_config.get( + "nickname_probability_smoothing", config.nickname_probability_smoothing ) - config.NICKNAME_QUEUE_MAX_SIZE = gn_config.get( - "nickname_queue_max_size", config.NICKNAME_QUEUE_MAX_SIZE + config.nickname_queue_max_size = group_nickname_config.get( + "nickname_queue_max_size", config.nickname_queue_max_size ) - config.NICKNAME_PROCESS_SLEEP_INTERVAL = gn_config.get( - "nickname_process_sleep_interval", config.NICKNAME_PROCESS_SLEEP_INTERVAL + config.nickname_process_sleep_interval = group_nickname_config.get( + "nickname_process_sleep_interval", config.nickname_process_sleep_interval + ) + config.nickname_analysis_history_limit = group_nickname_config.get( + "nickname_analysis_history_limit", config.nickname_analysis_history_limit ) def bot(parent: dict): diff --git a/src/plugins/group_nickname/nickname_manager.py b/src/plugins/group_nickname/nickname_manager.py index ac158a66..609884be 100644 --- a/src/plugins/group_nickname/nickname_manager.py +++ b/src/plugins/group_nickname/nickname_manager.py @@ -103,7 +103,7 @@ class NicknameManager: logger.info("正在初始化 NicknameManager 组件...") self.config = global_config - self.is_enabled = self.config.ENABLE_NICKNAME_MAPPING + self.is_enabled = self.config.enable_nickname_mapping # 数据库处理器 person_info_collection = getattr(db, "person_info", None) @@ -138,12 +138,12 @@ class NicknameManager: self.is_enabled = False # 队列和线程 - self.queue_max_size = getattr(self.config, "NICKNAME_QUEUE_MAX_SIZE", 100) + self.queue_max_size = getattr(self.config, "nickname_queue_max_size", 100) # 使用 asyncio.Queue self.nickname_queue: asyncio.Queue = asyncio.Queue(maxsize=self.queue_max_size) self._stop_event = threading.Event() # stop_event 仍然使用 threading.Event,因为它是由另一个线程设置的 self._nickname_thread: Optional[threading.Thread] = None - self.sleep_interval = getattr(self.config, "NICKNAME_PROCESS_SLEEP_INTERVAL", 0.5) # 超时时间 + self.sleep_interval = getattr(self.config, "nickname_process_sleep_interval", 60) # 超时时间 self._initialized = True logger.info("NicknameManager 初始化完成。") @@ -153,6 +153,10 @@ class NicknameManager: if not self.is_enabled: logger.info("绰号处理功能已禁用,处理器未启动。") return + if global_config.max_nicknames_in_prompt == 0: # 考虑有神秘的用户输入为0的可能性 + logger.error("[错误] 绰号注入数量不合适,绰号处理功能已禁用!") + return + if self._nickname_thread is None or not self._nickname_thread.is_alive(): logger.info("正在启动绰号处理器线程...") self._stop_event.clear() @@ -205,7 +209,7 @@ class NicknameManager: log_prefix = f"[{current_chat_stream.stream_id}]" try: # 1. 获取历史记录 - history_limit = getattr(self.config, "NICKNAME_ANALYSIS_HISTORY_LIMIT", 30) + history_limit = getattr(self.config, "nickname_analysis_history_limit", 30) history_messages = get_raw_msg_before_timestamp_with_chat( chat_id=current_chat_stream.stream_id, timestamp=time.time(), diff --git a/src/plugins/group_nickname/nickname_utils.py b/src/plugins/group_nickname/nickname_utils.py index 4fdca08d..c5896b02 100644 --- a/src/plugins/group_nickname/nickname_utils.py +++ b/src/plugins/group_nickname/nickname_utils.py @@ -25,7 +25,7 @@ def select_nicknames_for_prompt(all_nicknames_info: Dict[str, List[Dict[str, int return [] candidates = [] # 存储 (用户名, 绰号, 次数, 权重) - smoothing_factor = getattr(global_config, "NICKNAME_PROBABILITY_SMOOTHING", 1.0) # 平滑因子,避免权重为0 + smoothing_factor = getattr(global_config, "nickname_probability_smoothing", 1.0) # 平滑因子,避免权重为0 for user_name, nicknames in all_nicknames_info.items(): if nicknames and isinstance(nicknames, list): @@ -48,7 +48,7 @@ def select_nicknames_for_prompt(all_nicknames_info: Dict[str, List[Dict[str, int return [] # 确定需要选择的数量 - max_nicknames = getattr(global_config, "MAX_NICKNAMES_IN_PROMPT", 5) + max_nicknames = getattr(global_config, "max_nicknames_in_prompt", 5) num_to_select = min(max_nicknames, len(candidates)) try: diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 6723f2de..9de4c562 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -129,6 +129,7 @@ max_nicknames_in_prompt = 10 # Prompt 中最多注入的绰号数量(防止to nickname_probability_smoothing = 1 # 绰号加权随机选择的平滑因子 nickname_queue_max_size = 100 # 绰号处理队列最大容量 nickname_process_sleep_interval = 60 # 绰号处理进程休眠间隔(秒) +nickname_analysis_history_limit = 30 # 绰号处理可见最大上下文 [memory] build_memory_interval = 2000 # 记忆构建间隔 单位秒 间隔越低,麦麦学习越多,但是冗余信息也会增多