diff --git a/src/chat/heart_flow/heartFC_chat.py b/src/chat/heart_flow/heartFC_chat.py index 7ad757de..2b1c61be 100644 --- a/src/chat/heart_flow/heartFC_chat.py +++ b/src/chat/heart_flow/heartFC_chat.py @@ -29,6 +29,7 @@ from src.chat.utils.chat_message_builder import ( build_readable_messages_with_id, get_raw_msg_before_timestamp_with_chat, ) +from src.chat.utils.utils import get_chat_type_and_target_info, record_replyer_action_temp from src.hippo_memorizer.chat_history_summarizer import ChatHistorySummarizer if TYPE_CHECKING: @@ -651,6 +652,13 @@ class HeartFChatting: think_level = action_planner_info.action_data.get("think_level", 1) # 使用 action_reasoning(planner 的整体思考理由)作为 reply_reason planner_reasoning = action_planner_info.action_reasoning or reason + + record_replyer_action_temp( + chat_id=self.stream_id, + reason=reason, + think_level=think_level, + ) + await database_api.store_action_info( chat_stream=self.chat_stream, action_build_into_prompt=False, diff --git a/src/chat/replyer/group_generator.py b/src/chat/replyer/group_generator.py index 57a8687e..f4956ab2 100644 --- a/src/chat/replyer/group_generator.py +++ b/src/chat/replyer/group_generator.py @@ -136,10 +136,9 @@ class DefaultReplyer: content, reasoning_content, model_name, tool_call = await self.llm_generate_content(prompt) # logger.debug(f"replyer生成内容: {content}") - logger.info(f"replyer生成内容: {content}") - if global_config.debug.show_replyer_reasoning: - logger.info(f"replyer生成推理:\n{reasoning_content}") - logger.info(f"replyer生成模型: {model_name}") + logger.info(f"模型: [{model_name}][思考等级:{think_level}]生成内容: {content}") + if global_config.debug.show_replyer_reasoning and reasoning_content: + logger.info(f"模型: [{model_name}][思考等级:{think_level}]生成推理:\n{reasoning_content}") llm_response.content = content llm_response.reasoning = reasoning_content @@ -1065,7 +1064,7 @@ class DefaultReplyer: # 移除 content 前后的换行符和空格 content = content.strip() - logger.info(f"使用 {model_name} 生成回复内容: {content}") + # logger.info(f"使用 {model_name} 生成回复内容: {content}") return content, reasoning_content, model_name, tool_calls async def get_prompt_info(self, message: str, sender: str, target: str): diff --git a/src/chat/replyer/private_generator.py b/src/chat/replyer/private_generator.py index 1169fe6b..ef069b81 100644 --- a/src/chat/replyer/private_generator.py +++ b/src/chat/replyer/private_generator.py @@ -33,13 +33,13 @@ from src.plugin_system.base.component_types import ActionInfo, EventType from src.plugin_system.apis import llm_api from src.chat.replyer.prompt.lpmm_prompt import init_lpmm_prompt -from src.chat.replyer.prompt.replyer_prompt import init_replyer_prompt +from src.chat.replyer.prompt.replyer_private_prompt import init_replyer_private_prompt from src.chat.replyer.prompt.rewrite_prompt import init_rewrite_prompt from src.memory_system.memory_retrieval import init_memory_retrieval_prompt, build_memory_retrieval_prompt from src.bw_learner.jargon_explainer import explain_jargon_in_context init_lpmm_prompt() -init_replyer_prompt() +init_replyer_private_prompt() init_rewrite_prompt() init_memory_retrieval_prompt() diff --git a/src/chat/replyer/prompt/replyer_private_prompt.py b/src/chat/replyer/prompt/replyer_private_prompt.py new file mode 100644 index 00000000..c251d1a1 --- /dev/null +++ b/src/chat/replyer/prompt/replyer_private_prompt.py @@ -0,0 +1,40 @@ +from src.chat.utils.prompt_builder import Prompt + +def init_replyer_private_prompt(): + Prompt( + """{knowledge_prompt}{tool_info_block}{extra_info_block} + {expression_habits_block}{memory_retrieval}{jargon_explanation} + + 你正在和{sender_name}聊天,这是你们之前聊的内容: + {time_block} + {dialogue_prompt} + + {reply_target_block}。 + {planner_reasoning} + {identity} + {chat_prompt}你正在和{sender_name}聊天,现在请你读读之前的聊天记录,然后给出日常且口语化的回复,平淡一些, + 尽量简短一些。{keywords_reaction_prompt}请注意把握聊天内容,不要回复的太有条理。 + {reply_style} + 请注意不要输出多余内容(包括前后缀,冒号和引号,括号,表情等),只输出回复内容。 + {moderation_prompt}不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 )。""", + "private_replyer_prompt", + ) + + Prompt( + """{knowledge_prompt}{tool_info_block}{extra_info_block} +{expression_habits_block}{memory_retrieval}{jargon_explanation} + +你正在和{sender_name}聊天,这是你们之前聊的内容: +{time_block} +{dialogue_prompt} + +你现在想补充说明你刚刚自己的发言内容:{target},原因是{reason} +请你根据聊天内容,组织一条新回复。注意,{target} 是刚刚你自己的发言,你要在这基础上进一步发言,请按照你自己的角度来继续进行回复。注意保持上下文的连贯性。 +{identity} +{chat_prompt}尽量简短一些。{keywords_reaction_prompt}请注意把握聊天内容,不要回复的太有条理,可以有个性。 +{reply_style} +请注意不要输出多余内容(包括前后缀,冒号和引号,括号,表情等),只输出回复内容。 +{moderation_prompt}不要输出多余内容(包括冒号和引号,括号,表情包,at或 @等 )。 +""", + "private_replyer_self_prompt", + ) \ No newline at end of file diff --git a/src/chat/replyer/prompt/replyer_prompt.py b/src/chat/replyer/prompt/replyer_prompt.py index 3fd0d65a..ddd0e2bb 100644 --- a/src/chat/replyer/prompt/replyer_prompt.py +++ b/src/chat/replyer/prompt/replyer_prompt.py @@ -63,21 +63,3 @@ def init_replyer_prompt(): "replyer_prompt_2", ) - Prompt( - """{knowledge_prompt}{tool_info_block}{extra_info_block} -{expression_habits_block}{memory_retrieval}{jargon_explanation} - -你正在和{sender_name}聊天,这是你们之前聊的内容: -{time_block} -{dialogue_prompt} - -{reply_target_block}。 -{planner_reasoning} -{identity} -{chat_prompt}你正在和{sender_name}聊天,现在请你读读之前的聊天记录,然后给出日常且口语化的回复,平淡一些, -尽量简短一些。{keywords_reaction_prompt}请注意把握聊天内容,不要回复的太有条理。 -{reply_style} -请注意不要输出多余内容(包括前后缀,冒号和引号,括号,表情等),只输出回复内容。 -{moderation_prompt}不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 )。""", - "private_replyer_prompt", - ) \ No newline at end of file diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index 0464b734..67089fe6 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -4,6 +4,8 @@ import time import jieba import json import ast +import os +from datetime import datetime from typing import Optional, Tuple, List, TYPE_CHECKING @@ -641,6 +643,42 @@ def get_chat_type_and_target_info(chat_id: str) -> Tuple[bool, Optional["TargetP return is_group_chat, chat_target_info +def record_replyer_action_temp(chat_id: str, reason: str, think_level: int) -> None: + """ + 临时记录replyer动作被选择的信息(仅群聊) + + Args: + chat_id: 聊天ID + reason: 选择理由 + think_level: 思考深度等级 + """ + try: + # 确保data/temp目录存在 + temp_dir = "data/temp" + os.makedirs(temp_dir, exist_ok=True) + + # 创建记录数据 + record_data = { + "chat_id": chat_id, + "reason": reason, + "think_level": think_level, + "timestamp": datetime.now().isoformat(), + } + + # 生成文件名(使用时间戳避免冲突) + timestamp_str = datetime.now().strftime("%Y%m%d_%H%M%S_%f") + filename = f"replyer_action_{timestamp_str}.json" + filepath = os.path.join(temp_dir, filename) + + # 写入文件 + with open(filepath, "w", encoding="utf-8") as f: + json.dump(record_data, f, ensure_ascii=False, indent=2) + + logger.debug(f"已记录replyer动作选择: chat_id={chat_id}, think_level={think_level}") + except Exception as e: + logger.warning(f"记录replyer动作选择失败: {e}") + + def assign_message_ids(messages: List[DatabaseMessages]) -> List[Tuple[str, DatabaseMessages]]: """ 为消息列表中的每个消息分配唯一的简短随机ID