From ad729d74c81fb0bc8825314e75a9e7fe0e46cedb Mon Sep 17 00:00:00 2001 From: Windpicker-owo <3431391539@qq.com> Date: Sun, 21 Sep 2025 18:01:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(affinity-flow):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=8F=90=E5=8F=8A=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91=E5=92=8C?= =?UTF-8?q?=E9=98=88=E5=80=BC=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 简化提及检测逻辑,移除冗余的私聊检查变量 - 使用配置项 mention_bot_adjustment_threshold 替换硬编码的50%阈值 - 在消息处理中清除开头可能存在的空行 - 增加首次认识用户的信息存储方法,避免未知用户处理逻辑 - 调整消息管理器检查间隔从2秒到5秒,减少系统负载 - 修复计划执行器中用户ID比较逻辑,防止自我回复死循环 --- src/chat/affinity_flow/interest_scoring.py | 11 +++------- src/chat/message_manager/message_manager.py | 2 +- src/chat/planner_actions/plan_executor.py | 2 +- src/chat/replyer/default_generator.py | 10 +++++---- src/chat/utils/utils.py | 2 ++ src/person_info/person_info.py | 23 ++++++++++++++++++++- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/chat/affinity_flow/interest_scoring.py b/src/chat/affinity_flow/interest_scoring.py index cf5200bbc..380037880 100644 --- a/src/chat/affinity_flow/interest_scoring.py +++ b/src/chat/affinity_flow/interest_scoring.py @@ -270,14 +270,9 @@ class InterestScoringSystem: # 检查是否被提及 is_mentioned = msg.is_mentioned or (bot_nickname and bot_nickname in msg.processed_plain_text) - # 检查是否为私聊(group_info为None表示私聊) - is_private_chat = msg.group_info is None - # 如果被提及或是私聊,都视为提及了bot - if is_mentioned or is_private_chat: - logger.debug(f"🔍 提及检测 - 被提及: {is_mentioned}, 私聊: {is_private_chat}") - if is_private_chat and not is_mentioned: - logger.debug("💬 私聊消息自动视为提及bot") + + if is_mentioned or not hasattr(msg, "chat_info_group_id"): return global_config.affinity_flow.mention_bot_interest_score return 0.0 @@ -297,7 +292,7 @@ class InterestScoringSystem: # 如果被提及,降低阈值 if ( - score.mentioned_score >= global_config.affinity_flow.mention_bot_interest_score * 0.5 + score.mentioned_score >= global_config.affinity_flow.mention_bot_adjustment_threshold ): # 使用提及bot兴趣分的一半作为判断阈值 base_threshold = self.mention_threshold logger.debug(f"📣 消息提及了机器人,使用降低阈值: {base_threshold:.3f}") diff --git a/src/chat/message_manager/message_manager.py b/src/chat/message_manager/message_manager.py index b660beba6..050ad5b0a 100644 --- a/src/chat/message_manager/message_manager.py +++ b/src/chat/message_manager/message_manager.py @@ -22,7 +22,7 @@ logger = get_logger("message_manager") class MessageManager: """消息管理器""" - def __init__(self, check_interval: float = 2.0): + def __init__(self, check_interval: float = 5.0): self.stream_contexts: Dict[str, StreamContext] = {} self.check_interval = check_interval # 检查间隔(秒) self.is_running = False diff --git a/src/chat/planner_actions/plan_executor.py b/src/chat/planner_actions/plan_executor.py index 009250ccd..b325c882d 100644 --- a/src/chat/planner_actions/plan_executor.py +++ b/src/chat/planner_actions/plan_executor.py @@ -126,7 +126,7 @@ class PlanExecutor: try: logger.info(f"执行回复动作: {action_info.action_type}, 原因: {action_info.reasoning}") - if action_info.action_message.user_info.user_id == str(global_config.bot.qq_account): + if action_info.action_message.get("user_id", "") == str(global_config.bot.qq_account): logger.warning("尝试回复自己,跳过此动作以防止死循环。") return { "action_type": action_info.action_type, diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index b4238e85d..26a5d082d 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -1051,10 +1051,12 @@ class DefaultReplyer: # 如果person_name为None,使用fallback值 if person_name is None: # 尝试从reply_message获取用户名 - fallback_name = reply_message.get("user_nickname") or reply_message.get("user_id", "未知用户") - logger.warning(f"未知用户,将存储用户信息:{fallback_name}") - person_name = str(fallback_name) - person_info_manager.set_value(person_id, "person_name", fallback_name) + await person_info_manager.first_knowing_some_one( + platform, # type: ignore + reply_message.get("user_id"), # type: ignore + reply_message.get("user_nickname"), + reply_message.get("user_cardname") + ) # 检查是否是bot自己的名字,如果是则替换为"(你)" bot_user_id = str(global_config.bot.qq_account) diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index dab72abad..e29377a8b 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -352,6 +352,8 @@ def process_llm_response(text: str, enable_splitter: bool = True, enable_chinese sentences = [] for sentence in split_sentences: + # 清除开头可能存在的空行 + sentence = sentence.lstrip("\n").rstrip() if global_config.chinese_typo.enable and enable_chinese_typo: typoed_text, typo_corrections = typo_generator.create_typo_sentence(sentence) sentences.append(typoed_text) diff --git a/src/person_info/person_info.py b/src/person_info/person_info.py index 2805c62d9..efd39db92 100644 --- a/src/person_info/person_info.py +++ b/src/person_info/person_info.py @@ -498,7 +498,28 @@ class PersonInfoManager: except Exception as e: logger.error(f"根据用户名 {person_name} 获取用户ID时出错 (SQLAlchemy): {e}") return "" - + + @staticmethod + async def first_knowing_some_one(platform: str, user_id: str, user_nickname: str, user_cardname: str): + """判断是否认识某人""" + person_id = PersonInfoManager.get_person_id(platform, user_id) + # 生成唯一的 person_name + person_info_manager = get_person_info_manager() + unique_nickname = await person_info_manager._generate_unique_person_name(user_nickname) + data = { + "platform": platform, + "user_id": user_id, + "nickname": user_nickname, + "konw_time": int(time.time()), + "person_name": unique_nickname, # 使用唯一的 person_name + } + # 先创建用户基本信息,使用安全创建方法避免竞态条件 + await person_info_manager._safe_create_person_info(person_id=person_id, data=data) + # 更新昵称 + await person_info_manager.update_one_field( + person_id=person_id, field_name="nickname", value=user_nickname, data=data + ) + @staticmethod async def create_person_info(person_id: str, data: Optional[dict] = None): """创建一个项"""