diff --git a/src/plugins/chat/config.py b/src/plugins/chat/config.py index c027753c..6255e3be 100644 --- a/src/plugins/chat/config.py +++ b/src/plugins/chat/config.py @@ -20,6 +20,7 @@ class BotConfig: MIN_TEXT_LENGTH: int = 2 # 最小处理文本长度 MAX_CONTEXT_SIZE: int = 15 # 上下文最大消息数 emoji_chance: float = 0.2 # 发送表情包的基础概率 + MIN_RESPONSE_RATE: float = 0.0 # 最小回复概率 ENABLE_PIC_TRANSLATE: bool = True # 是否启用图片翻译 @@ -266,6 +267,7 @@ class BotConfig: config.MAX_CONTEXT_SIZE = msg_config.get("max_context_size", config.MAX_CONTEXT_SIZE) config.emoji_chance = msg_config.get("emoji_chance", config.emoji_chance) config.ban_words=msg_config.get("ban_words",config.ban_words) + config.MIN_RESPONSE_RATE = msg_config.get("min_response_rate", config.MIN_RESPONSE_RATE) if config.INNER_VERSION in SpecifierSet(">=0.0.2"): config.thinking_timeout = msg_config.get("thinking_timeout", config.thinking_timeout) diff --git a/src/plugins/chat/willing_manager.py b/src/plugins/chat/willing_manager.py index 001b6620..1cd02145 100644 --- a/src/plugins/chat/willing_manager.py +++ b/src/plugins/chat/willing_manager.py @@ -7,26 +7,37 @@ class WillingManager: self.group_reply_willing = {} # 存储每个群的回复意愿 self._decay_task = None self._started = False - + async def _decay_reply_willing(self): """定期衰减回复意愿""" while True: await asyncio.sleep(5) for group_id in self.group_reply_willing: - self.group_reply_willing[group_id] = max(0, self.group_reply_willing[group_id] * 0.6) - + self.group_reply_willing[group_id] = max( + 0, self.group_reply_willing[group_id] * 0.6 + ) + def get_willing(self, group_id: int) -> float: """获取指定群组的回复意愿""" return self.group_reply_willing.get(group_id, 0) - + def set_willing(self, group_id: int, willing: float): """设置指定群组的回复意愿""" self.group_reply_willing[group_id] = willing - - def change_reply_willing_received(self, group_id: int, topic: str, is_mentioned_bot: bool, config, user_id: int = None, is_emoji: bool = False, interested_rate: float = 0) -> float: + + def change_reply_willing_received( + self, + group_id: int, + topic: str, + is_mentioned_bot: bool, + config, + user_id: int = None, + is_emoji: bool = False, + interested_rate: float = 0, + ) -> float: """改变指定群组的回复意愿并返回回复概率""" current_willing = self.group_reply_willing.get(group_id, 0) - + # print(f"初始意愿: {current_willing}") if is_mentioned_bot and current_willing < 1.0: current_willing += 0.9 @@ -34,47 +45,51 @@ class WillingManager: elif is_mentioned_bot: current_willing += 0.05 print(f"被重复提及, 当前意愿: {current_willing}") - + if is_emoji: current_willing *= 0.1 print(f"表情包, 当前意愿: {current_willing}") - - print(f"放大系数_interested_rate: {global_config.response_interested_rate_amplifier}") - interested_rate *= global_config.response_interested_rate_amplifier #放大回复兴趣度 + + print( + f"放大系数_interested_rate: {global_config.response_interested_rate_amplifier}" + ) + interested_rate *= ( + global_config.response_interested_rate_amplifier + ) # 放大回复兴趣度 if interested_rate > 0.4: # print(f"兴趣度: {interested_rate}, 当前意愿: {current_willing}") - current_willing += interested_rate-0.4 - - current_willing *= global_config.response_willing_amplifier #放大回复意愿 + current_willing += interested_rate - 0.4 + + current_willing *= global_config.response_willing_amplifier # 放大回复意愿 # print(f"放大系数_willing: {global_config.response_willing_amplifier}, 当前意愿: {current_willing}") - + reply_probability = max((current_willing - 0.45) * 2, 0) if group_id not in config.talk_allowed_groups: current_willing = 0 reply_probability = 0 - + if group_id in config.talk_frequency_down_groups: reply_probability = reply_probability / global_config.down_frequency_rate + reply_probability += global_config.MIN_RESPONSE_RATE reply_probability = min(reply_probability, 1) if reply_probability < 0: reply_probability = 0 - - + self.group_reply_willing[group_id] = min(current_willing, 3.0) return reply_probability - + def change_reply_willing_sent(self, group_id: int): """开始思考后降低群组的回复意愿""" current_willing = self.group_reply_willing.get(group_id, 0) self.group_reply_willing[group_id] = max(0, current_willing - 2) - + def change_reply_willing_after_sent(self, group_id: int): """发送消息后提高群组的回复意愿""" current_willing = self.group_reply_willing.get(group_id, 0) if current_willing < 1: self.group_reply_willing[group_id] = min(1, current_willing + 0.2) - + async def ensure_started(self): """确保衰减任务已启动""" if not self._started: @@ -82,5 +97,6 @@ class WillingManager: self._decay_task = asyncio.create_task(self._decay_reply_willing()) self._started = True + # 创建全局实例 -willing_manager = WillingManager() +willing_manager = WillingManager() diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index e84b0f53..3f2839b1 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -21,6 +21,7 @@ min_text_length = 2 # 与麦麦聊天时麦麦只会回答文本大于等于此 max_context_size = 15 # 麦麦获得的上文数量 emoji_chance = 0.2 # 麦麦使用表情包的概率 thinking_timeout = 120 # 麦麦思考时间 +min_response_rate = 0.1 # 最低回复概率 response_willing_amplifier = 1 # 麦麦回复意愿放大系数,一般为1 response_interested_rate_amplifier = 1 # 麦麦回复兴趣度放大系数,听到记忆里的内容时放大系数