diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index e4cb04c7a..bfea8d8df 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -18,7 +18,7 @@ from src.chat.message_receive.uni_message_sender import HeartFCSender from src.chat.utils.chat_message_builder import ( build_readable_messages, get_raw_msg_before_timestamp_with_chat, - replace_user_references_sync, + replace_user_references_async, ) from src.chat.utils.memory_mappings import get_memory_type_chinese_label @@ -1025,9 +1025,9 @@ class DefaultReplyer: sender_name = "未知用户" # 处理消息内容中的用户引用,确保bot回复在消息内容中也正确显示 - from src.chat.utils.chat_message_builder import replace_user_references_sync + from src.chat.utils.chat_message_builder import replace_user_references_async if msg_content: - msg_content = replace_user_references_sync( + msg_content = await replace_user_references_async( msg_content, platform, replace_bot_name=True @@ -1126,8 +1126,8 @@ class DefaultReplyer: sender_name = "未知用户" # 处理消息内容中的用户引用,确保bot回复在消息内容中也正确显示 - from src.chat.utils.chat_message_builder import replace_user_references_sync - msg_content = replace_user_references_sync( + from src.chat.utils.chat_message_builder import replace_user_references_async + msg_content = await replace_user_references_async( msg_content, platform, replace_bot_name=True @@ -1264,7 +1264,7 @@ class DefaultReplyer: person_id = await person_info_manager.get_person_id_by_person_name(sender) platform = chat_stream.platform - target = replace_user_references_sync(target, chat_stream.platform, replace_bot_name=True) + target = await replace_user_references_async(target, chat_stream.platform, replace_bot_name=True) # 构建action描述 (如果启用planner) action_descriptions = "" @@ -1909,9 +1909,6 @@ class DefaultReplyer: return "" async def build_relation_info(self, sender: str, target: str): - if not global_config.affinity_flow.enable_relationship_tracking: - return "" - # 获取用户ID person_info_manager = get_person_info_manager() person_id = await person_info_manager.get_person_id_by_person_name(sender) diff --git a/src/chat/utils/chat_message_builder.py b/src/chat/utils/chat_message_builder.py index fb95e4fd1..e8b12b99b 100644 --- a/src/chat/utils/chat_message_builder.py +++ b/src/chat/utils/chat_message_builder.py @@ -43,14 +43,13 @@ def replace_user_references_sync( return "" if name_resolver is None: - person_info_manager = get_person_info_manager() - def default_resolver(platform: str, user_id: str) -> str: # 检查是否是机器人自己 if replace_bot_name and user_id == global_config.bot.qq_account: return f"{global_config.bot.nickname}(你)" - person_id = PersonInfoManager.get_person_id(platform, user_id) - return person_info_manager.get_value(person_id, "person_name") or user_id # type: ignore + # 同步函数中无法使用异步的 get_value,直接返回 user_id + # 建议调用方使用 replace_user_references_async 以获取完整的用户名 + return user_id name_resolver = default_resolver diff --git a/src/chat/utils/prompt.py b/src/chat/utils/prompt.py index 00690d301..b08887e9e 100644 --- a/src/chat/utils/prompt.py +++ b/src/chat/utils/prompt.py @@ -1086,9 +1086,6 @@ class Prompt: Returns: str: 格式化后的关系信息字符串,或在失败时返回空字符串。 """ - if not global_config.affinity_flow.enable_relationship_tracking: - return "" - from src.person_info.relationship_fetcher import relationship_fetcher_manager relationship_fetcher = relationship_fetcher_manager.get_fetcher(chat_id) diff --git a/src/plugins/built_in/affinity_flow_chatter/planner/planner.py b/src/plugins/built_in/affinity_flow_chatter/planner/planner.py index 0975c8d12..585759c15 100644 --- a/src/plugins/built_in/affinity_flow_chatter/planner/planner.py +++ b/src/plugins/built_in/affinity_flow_chatter/planner/planner.py @@ -159,6 +159,10 @@ class ChatterActionPlanner: action_data={}, action_message=None, ) + + # 更新连续不回复计数 + await self._update_interest_calculator_state(replied=False) + initial_plan = await self.generator.generate(chat_mode) filtered_plan = initial_plan filtered_plan.decided_actions = [no_action] @@ -218,24 +222,27 @@ class ChatterActionPlanner: # 6. 根据执行结果更新统计信息 self._update_stats_from_execution_result(execution_result) - # 7. Focus模式下如果执行了reply动作,根据focus_energy概率切换到Normal模式 + # 7. 更新兴趣计算器状态 + if filtered_plan.decided_actions: + has_reply = any( + action.action_type in ["reply", "proactive_reply"] + for action in filtered_plan.decided_actions + ) + else: + has_reply = False + await self._update_interest_calculator_state(replied=has_reply) + + # 8. Focus模式下如果执行了reply动作,根据focus_energy概率切换到Normal模式 if chat_mode == ChatMode.FOCUS and context: - if filtered_plan.decided_actions: - has_reply = any( - action.action_type in ["reply", "proactive_reply"] - for action in filtered_plan.decided_actions - ) - else: - has_reply = False if has_reply and global_config.affinity_flow.enable_normal_mode: await self._check_enter_normal_mode(context) - # 8. 清理处理标记 + # 9. 清理处理标记 if context: context.processing_message_id = None logger.debug("已清理处理标记,完成规划流程") - # 9. 返回结果 + # 10. 返回结果 return self._build_return_result(filtered_plan) except Exception as e: @@ -340,6 +347,9 @@ class ChatterActionPlanner: self._update_stats_from_execution_result(execution_result) logger.info("Normal模式: 执行reply动作完成") + + # 更新兴趣计算器状态(回复成功,重置不回复计数) + await self._update_interest_calculator_state(replied=True) # 清理处理标记 if context: @@ -361,6 +371,9 @@ class ChatterActionPlanner: action_message=None, ) + # 更新连续不回复计数 + await self._update_interest_calculator_state(replied=False) + # 无论是否回复,都进行退出normal模式的判定 await self._check_exit_normal_mode(context) @@ -450,6 +463,30 @@ class ChatterActionPlanner: except Exception as e: logger.warning(f"检查退出Normal模式失败: {e}") + async def _update_interest_calculator_state(self, replied: bool) -> None: + """更新兴趣计算器状态(连续不回复计数和回复后降低机制) + + Args: + replied: 是否回复了消息 + """ + try: + from src.chat.interest_system.interest_manager import get_interest_manager + from src.plugins.built_in.affinity_flow_chatter.core.affinity_interest_calculator import ( + AffinityInterestCalculator, + ) + + interest_manager = get_interest_manager() + calculator = interest_manager.get_current_calculator() + + if calculator and isinstance(calculator, AffinityInterestCalculator): + calculator.on_message_processed(replied) + logger.debug(f"已更新兴趣计算器状态: replied={replied}") + else: + logger.debug("未找到 AffinityInterestCalculator,跳过状态更新") + + except Exception as e: + logger.warning(f"更新兴趣计算器状态失败: {e}") + async def _sync_chat_mode_to_stream(self, context: "StreamContext") -> None: """同步chat_mode到ChatStream""" try: