diff --git a/src/chat/memory_system/Hippocampus.py b/src/chat/memory_system/Hippocampus.py index 8894fb8c4..c14acd116 100644 --- a/src/chat/memory_system/Hippocampus.py +++ b/src/chat/memory_system/Hippocampus.py @@ -1750,6 +1750,7 @@ class HippocampusManager: except Exception as e: logger.error(f"文本产生激活值失败: {e}") response = 0.0 + keywords = [] # 在异常情况下初始化 keywords 为空列表 return response, keywords def get_memory_from_keyword(self, keyword: str, max_depth: int = 2) -> list: diff --git a/src/chat/planner_actions/action_modifier.py b/src/chat/planner_actions/action_modifier.py index dfa4c79c1..d2c325651 100644 --- a/src/chat/planner_actions/action_modifier.py +++ b/src/chat/planner_actions/action_modifier.py @@ -127,8 +127,10 @@ class ActionModifier: if all_removals: removals_summary = " | ".join([f"{name}({reason})" for name, reason in all_removals]) + available_actions = list(self.action_manager.get_using_actions().keys()) + available_actions_text = "、".join(available_actions) if available_actions else "无" logger.info( - f"{self.log_prefix} 动作修改流程结束,最终可用动作: {list(self.action_manager.get_using_actions().keys())}||移除记录: {removals_summary}" + f"{self.log_prefix} 当前可用动作: {available_actions_text}||移除: {removals_summary}" ) def _check_action_associated_types(self, all_actions: Dict[str, ActionInfo], chat_context: ChatMessageContext): diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 8f64349f7..c1a61fb08 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -75,20 +75,14 @@ def init_prompt(): {relation_info_block} {extra_info_block} - {identity} {action_descriptions} -你现在的主要任务是和 {sender_name} 聊天。同时,也有其他用户会参与聊天,你可以参考他们的回复内容,但是你主要还是关注你和{sender_name}的聊天内容。 {time_block} -这是所有聊天内容: +你现在的主要任务是和 {sender_name} 聊天。同时,也有其他用户会参与聊天,你可以参考他们的回复内容,但是你现在想回复{sender_name}的发言。 + {background_dialogue_prompt} --------------------------------- - -{time_block} -这是你和{sender_name}的对话,你们正在交流中: - {core_dialogue_prompt} {reply_target_block} @@ -555,7 +549,7 @@ class DefaultReplyer: return name, result, duration def build_s4u_chat_history_prompts( - self, message_list_before_now: List[Dict[str, Any]], target_user_id: str + self, message_list_before_now: List[Dict[str, Any]], target_user_id: str, sender: str ) -> Tuple[str, str]: """ 构建 s4u 风格的分离对话 prompt @@ -568,7 +562,6 @@ class DefaultReplyer: Tuple[str, str]: (核心对话prompt, 背景对话prompt) """ core_dialogue_list = [] - background_dialogue_list = [] bot_id = str(global_config.bot.qq_account) # 过滤消息:分离bot和目标用户的对话 vs 其他用户的对话 @@ -580,41 +573,53 @@ class DefaultReplyer: if (msg_user_id == bot_id and reply_to_user_id == target_user_id) or msg_user_id == target_user_id: # bot 和目标用户的对话 core_dialogue_list.append(msg_dict) - else: - # 其他用户的对话 - background_dialogue_list.append(msg_dict) except Exception as e: logger.error(f"处理消息记录时出错: {msg_dict}, 错误: {e}") # 构建背景对话 prompt - background_dialogue_prompt = "" + all_dialogue_prompt = "" if message_list_before_now: - latest_25_msgs = message_list_before_now[-int(global_config.chat.max_context_size * 0.5) :] - background_dialogue_prompt_str = build_readable_messages( + latest_25_msgs = message_list_before_now[-int(global_config.chat.max_context_size) :] + all_dialogue_prompt_str = build_readable_messages( latest_25_msgs, replace_bot_name=True, timestamp_mode="normal_no_YMD", truncate=True, ) - background_dialogue_prompt = f"这是其他用户的发言:\n{background_dialogue_prompt_str}" + all_dialogue_prompt = f"所有用户的发言:\n{all_dialogue_prompt_str}" # 构建核心对话 prompt core_dialogue_prompt = "" if core_dialogue_list: - core_dialogue_list = core_dialogue_list[-int(global_config.chat.max_context_size * 2) :] # 限制消息数量 + # 检查最新五条消息中是否包含bot自己说的消息 + latest_5_messages = core_dialogue_list[-5:] if len(core_dialogue_list) >= 5 else core_dialogue_list + has_bot_message = any(str(msg.get("user_id")) == bot_id for msg in latest_5_messages) + + # logger.info(f"最新五条消息:{latest_5_messages}") + # logger.info(f"最新五条消息中是否包含bot自己说的消息:{has_bot_message}") + + # 如果最新五条消息中不包含bot的消息,则返回空字符串 + if not has_bot_message: + core_dialogue_prompt = "" + else: + core_dialogue_list = core_dialogue_list[-int(global_config.chat.max_context_size * 2) :] # 限制消息数量 + + core_dialogue_prompt_str = build_readable_messages( + core_dialogue_list, + replace_bot_name=True, + merge_messages=False, + timestamp_mode="normal_no_YMD", + read_mark=0.0, + truncate=True, + show_actions=True, + ) + core_dialogue_prompt = f"""-------------------------------- +这是你和{sender}的对话,你们正在交流中: +{core_dialogue_prompt_str} +-------------------------------- +""" - core_dialogue_prompt_str = build_readable_messages( - core_dialogue_list, - replace_bot_name=True, - merge_messages=False, - timestamp_mode="normal_no_YMD", - read_mark=0.0, - truncate=True, - show_actions=True, - ) - core_dialogue_prompt = core_dialogue_prompt_str - - return core_dialogue_prompt, background_dialogue_prompt + return core_dialogue_prompt, all_dialogue_prompt def build_mai_think_context( self, @@ -842,7 +847,7 @@ class DefaultReplyer: # 构建分离的对话 prompt core_dialogue_prompt, background_dialogue_prompt = self.build_s4u_chat_history_prompts( - message_list_before_now_long, target_user_id + message_list_before_now_long, target_user_id, sender ) self.build_mai_think_context( diff --git a/src/chat/utils/chat_message_builder.py b/src/chat/utils/chat_message_builder.py index a4edf33d3..5a161f76f 100644 --- a/src/chat/utils/chat_message_builder.py +++ b/src/chat/utils/chat_message_builder.py @@ -1098,6 +1098,10 @@ async def get_person_id_list(messages: List[Dict[str, Any]]) -> List[str]: if not all([platform, user_id]) or user_id == global_config.bot.qq_account: continue + # 添加空值检查,防止 platform 为 None 时出错 + if platform is None: + platform = "unknown" + if person_id := PersonInfoManager.get_person_id(platform, user_id): person_ids_set.add(person_id) diff --git a/src/common/database/database_model.py b/src/common/database/database_model.py index a6f2a0e9e..75dd87b6b 100644 --- a/src/common/database/database_model.py +++ b/src/common/database/database_model.py @@ -301,31 +301,6 @@ class Expression(BaseModel): class Meta: table_name = "expression" - -class ThinkingLog(BaseModel): - chat_id = TextField(index=True) - trigger_text = TextField(null=True) - response_text = TextField(null=True) - - # Store complex dicts/lists as JSON strings - trigger_info_json = TextField(null=True) - response_info_json = TextField(null=True) - timing_results_json = TextField(null=True) - chat_history_json = TextField(null=True) - chat_history_in_thinking_json = TextField(null=True) - chat_history_after_response_json = TextField(null=True) - heartflow_data_json = TextField(null=True) - reasoning_data_json = TextField(null=True) - - # Add a timestamp for the log entry itself - # Ensure you have: from peewee import DateTimeField - # And: import datetime - created_at = DateTimeField(default=datetime.datetime.now) - - class Meta: - table_name = "thinking_logs" - - class GraphNodes(BaseModel): """ 用于存储记忆图节点的模型 @@ -373,7 +348,6 @@ def create_tables(): OnlineTime, PersonInfo, Expression, - ThinkingLog, GraphNodes, # 添加图节点表 GraphEdges, # 添加图边表 Memory, @@ -403,7 +377,6 @@ def initialize_database(sync_constraints=False): PersonInfo, Expression, Memory, - ThinkingLog, GraphNodes, GraphEdges, ActionRecords, # 添加 ActionRecords 到初始化列表 @@ -502,7 +475,6 @@ def sync_field_constraints(): PersonInfo, Expression, Memory, - ThinkingLog, GraphNodes, GraphEdges, ActionRecords, @@ -682,7 +654,6 @@ def check_field_constraints(): PersonInfo, Expression, Memory, - ThinkingLog, GraphNodes, GraphEdges, ActionRecords, diff --git a/src/person_info/person_info.py b/src/person_info/person_info.py index 4d5fe709c..936e7f5a5 100644 --- a/src/person_info/person_info.py +++ b/src/person_info/person_info.py @@ -81,7 +81,10 @@ class PersonInfoManager: @staticmethod def get_person_id(platform: str, user_id: Union[int, str]) -> str: """获取唯一id""" - if "-" in platform: + # 添加空值检查,防止 platform 为 None 时出错 + if platform is None: + platform = "unknown" + elif "-" in platform: platform = platform.split("-")[1] components = [platform, str(user_id)] diff --git a/src/plugins/built_in/emoji_plugin/plugin.py b/src/plugins/built_in/emoji_plugin/plugin.py index 51f09e690..70468161e 100644 --- a/src/plugins/built_in/emoji_plugin/plugin.py +++ b/src/plugins/built_in/emoji_plugin/plugin.py @@ -14,9 +14,7 @@ from src.plugin_system.base.config_types import ConfigField # 导入依赖的系统组件 from src.common.logger import get_logger -# 导入API模块 - 标准Python包方式 -# NoReplyAction已集成到heartFC_chat.py中,不再需要导入 -from src.plugins.built_in.core_actions.emoji import EmojiAction +from src.plugins.built_in.emoji_plugin.emoji import EmojiAction logger = get_logger("core_actions")