From fed71bccade1d22b7425c34708a12a1a274abaee Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Tue, 13 May 2025 18:37:55 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E8=B0=83=E6=95=B4=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E7=BB=93=E6=9E=84=EF=BC=8C=E4=BC=98=E5=8C=96hfc=20pro?= =?UTF-8?q?mpt=EF=BC=8C=E7=A7=BB=E9=99=A4=E6=97=A5=E7=A8=8B=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=8A=A8=E6=80=81=E5=92=8Cllm=E5=88=A4?= =?UTF-8?q?=E6=96=ADwilling=E6=A8=A1=E5=BC=8F=EF=BC=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/import_openie.py | 12 +- scripts/info_extraction.py | 10 +- scripts/raw_data_preprocessor.py | 2 +- src/api/config_api.py | 9 - src/chat/__init__.py | 17 + .../emoji_system/emoji_manager.py | 2 +- .../focus_chat}/cycle_analyzer.py | 2 +- .../focus_chat}/cycle_viewer.py | 2 +- .../expressors/default_expressor.py | 40 ++- .../expressors/exprssion_learner.py | 139 +++++--- .../focus_chat}/heartFC_Cycleinfo.py | 0 .../focus_chat}/heartFC_chat.py | 34 +- .../focus_chat}/heartFC_chatting_logic.md | 0 .../focus_chat}/heartFC_readme.md | 18 +- .../focus_chat}/heartFC_sender.py | 15 +- .../focus_chat}/heartflow_processor.py | 14 +- .../focus_chat}/heartflow_prompt_builder.py | 156 ++++----- .../focus_chat}/hfc_utils.py | 6 +- .../focus_chat}/info/chat_info.py | 0 .../focus_chat}/info/cycle_info.py | 0 .../focus_chat}/info/info_base.py | 0 .../focus_chat}/info/mind_info.py | 0 .../focus_chat}/info/obs_info.py | 0 .../focus_chat}/info/structured_info.py | 0 .../info_processors/base_processor.py | 2 +- .../info_processors/chattinginfo_processor.py | 8 +- .../info_processors/mind_processor.py | 16 +- .../info_processors/processor_utils.py | 0 .../info_processors/tool_processor.py | 10 +- .../focus_chat}/memory_activator.py | 6 +- src/{plugins => chat}/knowledge/LICENSE | 0 src/{plugins => chat}/knowledge/__init__.py | 0 .../knowledge/knowledge_lib.py | 0 .../knowledge/src/__init__.py | 0 .../knowledge/src/embedding_store.py | 0 .../knowledge/src/global_logger.py | 0 .../knowledge/src/ie_process.py | 0 .../knowledge/src/kg_manager.py | 0 .../knowledge/src/llm_client.py | 0 .../knowledge/src/lpmmconfig.py | 0 .../knowledge/src/mem_active_manager.py | 0 .../knowledge/src/open_ie.py | 0 .../knowledge/src/prompt_template.py | 0 .../knowledge/src/qa_manager.py | 0 .../knowledge/src/raw_processing.py | 0 .../knowledge/src/utils/__init__.py | 0 .../knowledge/src/utils/dyn_topk.py | 0 .../knowledge/src/utils/hash.py | 0 .../knowledge/src/utils/json_fix.py | 0 .../knowledge/src/utils/visualize_graph.py | 0 .../memory_system/Hippocampus.py | 6 +- .../memory_system/debug_memory.py | 2 +- .../memory_system/manually_alter_memory.py | 0 .../memory_system/memory_config.py | 0 .../memory_system/offline_llm.py | 0 .../memory_system/sample_distribution.py | 0 .../chat => chat/message_receive}/__init__.py | 2 +- .../chat => chat/message_receive}/bot.py | 14 +- .../message_receive}/chat_stream.py | 0 .../chat => chat/message_receive}/message.py | 2 +- .../message_receive}/message_buffer.py | 0 .../message_receive}/message_sender.py | 6 +- .../message_receive}/storage.py | 4 +- src/{plugins => chat}/models/utils_model.py | 2 +- .../normal_chat}/normal_chat.py | 20 +- .../normal_chat}/normal_chat_generator.py | 10 +- .../normal_chat}/willing/mode_classical.py | 0 .../normal_chat}/willing/mode_custom.py | 0 .../normal_chat}/willing/mode_mxp.py | 0 .../normal_chat}/willing/willing_manager.py | 8 +- .../person_info/person_info.py | 2 +- .../person_info/relationship_manager.py | 2 +- .../utils/chat_message_builder.py | 17 +- .../utils}/info_catcher.py | 2 +- src/{plugins => chat}/utils/json_utils.py | 0 src/{plugins => chat}/utils/logger_config.py | 0 src/{plugins => chat}/utils/prompt_builder.py | 0 src/{plugins => chat}/utils/statistic.py | 0 .../utils/timer_calculator.py | 0 src/{plugins => chat}/utils/typo_generator.py | 0 src/{plugins/chat => chat/utils}/utils.py | 4 +- .../chat => chat/utils}/utils_image.py | 0 .../zhishi/knowledge_library.py | 0 src/common/logger.py | 5 +- src/common/logger_manager.py | 2 - src/{plugins => common}/message/__init__.py | 0 src/{plugins => common}/message/api.py | 0 src/{plugins/remote => common}/remote.py | 0 src/config/config.py | 27 -- .../PFC/action_planner.py | 14 +- .../PFC/chat_observer.py | 10 +- .../PFC/chat_states.py | 0 .../PFC/conversation.py | 10 +- .../PFC/conversation_info.py | 0 .../PFC/message_sender.py | 12 +- .../PFC/message_storage.py | 0 .../PFC/observation_info.py | 6 +- src/{plugins => experimental}/PFC/pfc.py | 14 +- .../PFC/pfc_KnowledgeFetcher.py | 12 +- .../PFC/pfc_manager.py | 0 .../PFC/pfc_types.py | 0 .../PFC/pfc_utils.py | 0 .../PFC/reply_checker.py | 6 +- .../PFC/reply_generator.py | 10 +- src/{plugins => experimental}/PFC/waiter.py | 2 +- .../only_message_process.py | 4 +- src/heart_flow/heartflow.py | 16 +- src/heart_flow/interest_chatting.py | 2 +- src/heart_flow/interest_logger.py | 2 +- .../observation/chatting_observation.py | 10 +- .../observation/hfcloop_observation.py | 2 +- .../observation/memory_observation.py | 2 +- src/heart_flow/sub_heartflow.py | 10 +- src/heart_flow/subheartflow_manager.py | 4 +- src/heart_flow/utils_chat.py | 4 +- src/main.py | 36 +- src/plugins/__init__.py | 19 -- src/plugins/chat/mapper.py | 190 ----------- src/plugins/schedule/schedule_generator.py | 307 ------------------ .../topic_identify/topic_identifier.py | 52 --- src/plugins/willing/mode_dynamic.py | 233 ------------- src/plugins/willing/mode_llmcheck.py | 155 --------- src/tools/not_used/get_current_task.py | 60 ---- src/tools/not_used/get_memory.py | 2 +- src/tools/tool_can_use/get_knowledge.py | 2 +- src/tools/tool_can_use/lpmm_get_knowledge.py | 4 +- src/tools/tool_can_use/rename_person_tool.py | 2 +- src/tools/tool_use.py | 8 +- template/bot_config_meta.toml | 30 -- template/bot_config_template.toml | 10 +- template/template.env | 3 - 131 files changed, 422 insertions(+), 1500 deletions(-) create mode 100644 src/chat/__init__.py rename src/{plugins => chat}/emoji_system/emoji_manager.py (99%) rename src/{plugins/heartFC_chat => chat/focus_chat}/cycle_analyzer.py (99%) rename src/{plugins/heartFC_chat => chat/focus_chat}/cycle_viewer.py (98%) rename src/{plugins/heartFC_chat => chat/focus_chat}/expressors/default_expressor.py (90%) rename src/{plugins/heartFC_chat => chat/focus_chat}/expressors/exprssion_learner.py (64%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartFC_Cycleinfo.py (100%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartFC_chat.py (97%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartFC_chatting_logic.md (100%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartFC_readme.md (89%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartFC_sender.py (94%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartflow_processor.py (94%) rename src/{plugins/heartFC_chat => chat/focus_chat}/heartflow_prompt_builder.py (87%) rename src/{plugins/heartFC_chat => chat/focus_chat}/hfc_utils.py (91%) rename src/{heart_flow => chat/focus_chat}/info/chat_info.py (100%) rename src/{heart_flow => chat/focus_chat}/info/cycle_info.py (100%) rename src/{heart_flow => chat/focus_chat}/info/info_base.py (100%) rename src/{heart_flow => chat/focus_chat}/info/mind_info.py (100%) rename src/{heart_flow => chat/focus_chat}/info/obs_info.py (100%) rename src/{heart_flow => chat/focus_chat}/info/structured_info.py (100%) rename src/{plugins/heartFC_chat => chat/focus_chat}/info_processors/base_processor.py (96%) rename src/{plugins/heartFC_chat => chat/focus_chat}/info_processors/chattinginfo_processor.py (95%) rename src/{plugins/heartFC_chat => chat/focus_chat}/info_processors/mind_processor.py (97%) rename src/{plugins/heartFC_chat => chat/focus_chat}/info_processors/processor_utils.py (100%) rename src/{plugins/heartFC_chat => chat/focus_chat}/info_processors/tool_processor.py (95%) rename src/{plugins/heartFC_chat => chat/focus_chat}/memory_activator.py (95%) rename src/{plugins => chat}/knowledge/LICENSE (100%) rename src/{plugins => chat}/knowledge/__init__.py (100%) rename src/{plugins => chat}/knowledge/knowledge_lib.py (100%) rename src/{plugins => chat}/knowledge/src/__init__.py (100%) rename src/{plugins => chat}/knowledge/src/embedding_store.py (100%) rename src/{plugins => chat}/knowledge/src/global_logger.py (100%) rename src/{plugins => chat}/knowledge/src/ie_process.py (100%) rename src/{plugins => chat}/knowledge/src/kg_manager.py (100%) rename src/{plugins => chat}/knowledge/src/llm_client.py (100%) rename src/{plugins => chat}/knowledge/src/lpmmconfig.py (100%) rename src/{plugins => chat}/knowledge/src/mem_active_manager.py (100%) rename src/{plugins => chat}/knowledge/src/open_ie.py (100%) rename src/{plugins => chat}/knowledge/src/prompt_template.py (100%) rename src/{plugins => chat}/knowledge/src/qa_manager.py (100%) rename src/{plugins => chat}/knowledge/src/raw_processing.py (100%) rename src/{plugins => chat}/knowledge/src/utils/__init__.py (100%) rename src/{plugins => chat}/knowledge/src/utils/dyn_topk.py (100%) rename src/{plugins => chat}/knowledge/src/utils/hash.py (100%) rename src/{plugins => chat}/knowledge/src/utils/json_fix.py (100%) rename src/{plugins => chat}/knowledge/src/utils/visualize_graph.py (100%) rename src/{plugins => chat}/memory_system/Hippocampus.py (99%) rename src/{plugins => chat}/memory_system/debug_memory.py (96%) rename src/{plugins => chat}/memory_system/manually_alter_memory.py (100%) rename src/{plugins => chat}/memory_system/memory_config.py (100%) rename src/{plugins => chat}/memory_system/offline_llm.py (100%) rename src/{plugins => chat}/memory_system/sample_distribution.py (100%) rename src/{plugins/chat => chat/message_receive}/__init__.py (88%) rename src/{plugins/chat => chat/message_receive}/bot.py (93%) rename src/{plugins/chat => chat/message_receive}/chat_stream.py (100%) rename src/{plugins/chat => chat/message_receive}/message.py (99%) rename src/{plugins/chat => chat/message_receive}/message_buffer.py (100%) rename src/{plugins/chat => chat/message_receive}/message_sender.py (98%) rename src/{plugins/storage => chat/message_receive}/storage.py (96%) rename src/{plugins => chat}/models/utils_model.py (99%) rename src/{plugins/heartFC_chat => chat/normal_chat}/normal_chat.py (97%) rename src/{plugins/heartFC_chat => chat/normal_chat}/normal_chat_generator.py (95%) rename src/{plugins => chat/normal_chat}/willing/mode_classical.py (100%) rename src/{plugins => chat/normal_chat}/willing/mode_custom.py (100%) rename src/{plugins => chat/normal_chat}/willing/mode_mxp.py (100%) rename src/{plugins => chat/normal_chat}/willing/willing_manager.py (96%) rename src/{plugins => chat}/person_info/person_info.py (99%) rename src/{plugins => chat}/person_info/relationship_manager.py (99%) rename src/{plugins => chat}/utils/chat_message_builder.py (97%) rename src/{plugins/respon_info_catcher => chat/utils}/info_catcher.py (99%) rename src/{plugins => chat}/utils/json_utils.py (100%) rename src/{plugins => chat}/utils/logger_config.py (100%) rename src/{plugins => chat}/utils/prompt_builder.py (100%) rename src/{plugins => chat}/utils/statistic.py (100%) rename src/{plugins => chat}/utils/timer_calculator.py (100%) rename src/{plugins => chat}/utils/typo_generator.py (100%) rename src/{plugins/chat => chat/utils}/utils.py (99%) rename src/{plugins/chat => chat/utils}/utils_image.py (100%) rename src/{plugins => chat}/zhishi/knowledge_library.py (100%) rename src/{plugins => common}/message/__init__.py (100%) rename src/{plugins => common}/message/api.py (100%) rename src/{plugins/remote => common}/remote.py (100%) rename src/{plugins => experimental}/PFC/action_planner.py (98%) rename src/{plugins => experimental}/PFC/chat_observer.py (98%) rename src/{plugins => experimental}/PFC/chat_states.py (100%) rename src/{plugins => experimental}/PFC/conversation.py (99%) rename src/{plugins => experimental}/PFC/conversation_info.py (100%) rename src/{plugins => experimental}/PFC/message_sender.py (87%) rename src/{plugins => experimental}/PFC/message_storage.py (100%) rename src/{plugins => experimental}/PFC/observation_info.py (98%) rename src/{plugins => experimental}/PFC/pfc.py (96%) rename src/{plugins => experimental}/PFC/pfc_KnowledgeFetcher.py (88%) rename src/{plugins => experimental}/PFC/pfc_manager.py (100%) rename src/{plugins => experimental}/PFC/pfc_types.py (100%) rename src/{plugins => experimental}/PFC/pfc_utils.py (100%) rename src/{plugins => experimental}/PFC/reply_checker.py (98%) rename src/{plugins => experimental}/PFC/reply_generator.py (97%) rename src/{plugins => experimental}/PFC/waiter.py (98%) rename src/{plugins/chat => experimental}/only_message_process.py (95%) delete mode 100644 src/plugins/__init__.py delete mode 100644 src/plugins/chat/mapper.py delete mode 100644 src/plugins/schedule/schedule_generator.py delete mode 100644 src/plugins/topic_identify/topic_identifier.py delete mode 100644 src/plugins/willing/mode_dynamic.py delete mode 100644 src/plugins/willing/mode_llmcheck.py delete mode 100644 src/tools/not_used/get_current_task.py diff --git a/scripts/import_openie.py b/scripts/import_openie.py index 472667c14..2dfebccf2 100644 --- a/scripts/import_openie.py +++ b/scripts/import_openie.py @@ -10,13 +10,13 @@ from time import sleep sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) -from src.plugins.knowledge.src.lpmmconfig import PG_NAMESPACE, global_config -from src.plugins.knowledge.src.embedding_store import EmbeddingManager -from src.plugins.knowledge.src.llm_client import LLMClient -from src.plugins.knowledge.src.open_ie import OpenIE -from src.plugins.knowledge.src.kg_manager import KGManager +from src.chat.knowledge.src.lpmmconfig import PG_NAMESPACE, global_config +from src.chat.knowledge.src.embedding_store import EmbeddingManager +from src.chat.knowledge.src.llm_client import LLMClient +from src.chat.knowledge.src.open_ie import OpenIE +from src.chat.knowledge.src.kg_manager import KGManager from src.common.logger import get_module_logger -from src.plugins.knowledge.src.utils.hash import get_sha256 +from src.chat.knowledge.src.utils.hash import get_sha256 # 添加项目根目录到 sys.path diff --git a/scripts/info_extraction.py b/scripts/info_extraction.py index 2191d1a95..1b224c405 100644 --- a/scripts/info_extraction.py +++ b/scripts/info_extraction.py @@ -13,11 +13,11 @@ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from rich.progress import Progress # 替换为 rich 进度条 from src.common.logger import get_module_logger -from src.plugins.knowledge.src.lpmmconfig import global_config -from src.plugins.knowledge.src.ie_process import info_extract_from_str -from src.plugins.knowledge.src.llm_client import LLMClient -from src.plugins.knowledge.src.open_ie import OpenIE -from src.plugins.knowledge.src.raw_processing import load_raw_data +from src.chat.knowledge.src.lpmmconfig import global_config +from src.chat.knowledge.src.ie_process import info_extract_from_str +from src.chat.knowledge.src.llm_client import LLMClient +from src.chat.knowledge.src.open_ie import OpenIE +from src.chat.knowledge.src.raw_processing import load_raw_data from rich.progress import ( BarColumn, TimeElapsedColumn, diff --git a/scripts/raw_data_preprocessor.py b/scripts/raw_data_preprocessor.py index 33fdede9e..5ac3dd67c 100644 --- a/scripts/raw_data_preprocessor.py +++ b/scripts/raw_data_preprocessor.py @@ -6,7 +6,7 @@ import datetime # 新增导入 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) from src.common.logger_manager import get_logger -from src.plugins.knowledge.src.lpmmconfig import global_config +from src.chat.knowledge.src.lpmmconfig import global_config logger = get_logger("lpmm") ROOT_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) diff --git a/src/api/config_api.py b/src/api/config_api.py index 275938045..0b23fb993 100644 --- a/src/api/config_api.py +++ b/src/api/config_api.py @@ -34,14 +34,6 @@ class APIBotConfig: gender: str # 性别 appearance: str # 外貌特征描述 - # schedule - enable_schedule_gen: bool # 是否启用日程表 - enable_schedule_interaction: bool # 日程表是否影响回复模式 - prompt_schedule_gen: str # 日程生成提示词 - schedule_doing_update_interval: int # 日程表更新间隔(秒) - schedule_temperature: float # 日程表温度 - time_zone: str # 时区 - # platforms platforms: Dict[str, str] # 平台信息 @@ -164,7 +156,6 @@ class APIBotConfig: "groups", "personality", "identity", - "schedule", "platforms", "chat", "normal_chat", diff --git a/src/chat/__init__.py b/src/chat/__init__.py new file mode 100644 index 000000000..931c30ff3 --- /dev/null +++ b/src/chat/__init__.py @@ -0,0 +1,17 @@ +""" +MaiMBot插件系统 +包含聊天、情绪、记忆、日程等功能模块 +""" + +from src.chat.message_receive.chat_stream import chat_manager +from src.chat.emoji_system.emoji_manager import emoji_manager +from src.chat.person_info.relationship_manager import relationship_manager +from src.chat.normal_chat.willing.willing_manager import willing_manager + +# 导出主要组件供外部使用 +__all__ = [ + "chat_manager", + "emoji_manager", + "relationship_manager", + "willing_manager", +] diff --git a/src/plugins/emoji_system/emoji_manager.py b/src/chat/emoji_system/emoji_manager.py similarity index 99% rename from src/plugins/emoji_system/emoji_manager.py rename to src/chat/emoji_system/emoji_manager.py index d105e0b8b..5d800866f 100644 --- a/src/plugins/emoji_system/emoji_manager.py +++ b/src/chat/emoji_system/emoji_manager.py @@ -12,7 +12,7 @@ import re from ...common.database import db from ...config.config import global_config -from ..chat.utils_image import image_path_to_base64, image_manager +from ..utils.utils_image import image_path_to_base64, image_manager from ..models.utils_model import LLMRequest from src.common.logger_manager import get_logger from rich.traceback import install diff --git a/src/plugins/heartFC_chat/cycle_analyzer.py b/src/chat/focus_chat/cycle_analyzer.py similarity index 99% rename from src/plugins/heartFC_chat/cycle_analyzer.py rename to src/chat/focus_chat/cycle_analyzer.py index 26c59f0e6..23374ced9 100644 --- a/src/plugins/heartFC_chat/cycle_analyzer.py +++ b/src/chat/focus_chat/cycle_analyzer.py @@ -1,7 +1,7 @@ import os import time from typing import List, Dict, Any, Tuple -from src.plugins.heartFC_chat.heartFC_Cycleinfo import CycleInfo +from src.chat.focus_chat.heartFC_Cycleinfo import CycleInfo from src.common.logger_manager import get_logger logger = get_logger("cycle_analyzer") diff --git a/src/plugins/heartFC_chat/cycle_viewer.py b/src/chat/focus_chat/cycle_viewer.py similarity index 98% rename from src/plugins/heartFC_chat/cycle_viewer.py rename to src/chat/focus_chat/cycle_viewer.py index 4b18b67e1..811edba4d 100644 --- a/src/plugins/heartFC_chat/cycle_viewer.py +++ b/src/chat/focus_chat/cycle_viewer.py @@ -1,6 +1,6 @@ import os import argparse -from src.plugins.heartFC_chat.cycle_analyzer import CycleAnalyzer +from src.chat.focus_chat.cycle_analyzer import CycleAnalyzer def print_section(title: str, width: int = 80): diff --git a/src/plugins/heartFC_chat/expressors/default_expressor.py b/src/chat/focus_chat/expressors/default_expressor.py similarity index 90% rename from src/plugins/heartFC_chat/expressors/default_expressor.py rename to src/chat/focus_chat/expressors/default_expressor.py index fa0aabe7e..dad20546b 100644 --- a/src/plugins/heartFC_chat/expressors/default_expressor.py +++ b/src/chat/focus_chat/expressors/default_expressor.py @@ -1,23 +1,23 @@ import time import traceback from typing import List, Optional, Dict, Any -from src.plugins.chat.message import MessageRecv, MessageThinking, MessageSending -from src.plugins.chat.message import Seg # Local import needed after move -from src.plugins.chat.message import UserInfo -from src.plugins.chat.chat_stream import chat_manager +from src.chat.message_receive.message import MessageRecv, MessageThinking, MessageSending +from src.chat.message_receive.message import Seg # Local import needed after move +from src.chat.message_receive.message import UserInfo +from src.chat.message_receive.chat_stream import chat_manager from src.common.logger_manager import get_logger -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config -from src.plugins.chat.utils_image import image_path_to_base64 # Local import needed after move -from src.plugins.utils.timer_calculator import Timer # <--- Import Timer -from src.plugins.emoji_system.emoji_manager import emoji_manager -from src.plugins.heartFC_chat.heartflow_prompt_builder import prompt_builder -from src.plugins.heartFC_chat.heartFC_sender import HeartFCSender -from src.plugins.chat.utils import process_llm_response -from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager +from src.chat.utils.utils_image import image_path_to_base64 # Local import needed after move +from src.chat.utils.timer_calculator import Timer # <--- Import Timer +from src.chat.emoji_system.emoji_manager import emoji_manager +from src.chat.focus_chat.heartflow_prompt_builder import prompt_builder +from src.chat.focus_chat.heartFC_sender import HeartFCSender +from src.chat.utils.utils import process_llm_response +from src.chat.utils.info_catcher import info_catcher_manager from src.manager.mood_manager import mood_manager from src.heart_flow.utils_chat import get_chat_type_and_target_info -from src.plugins.chat.chat_stream import ChatStream +from src.chat.message_receive.chat_stream import ChatStream logger = get_logger("expressor") @@ -99,6 +99,7 @@ class DefaultExpressor: anchor_message=anchor_message, thinking_id=thinking_id, reason=reasoning, + action_data=action_data, ) if reply: @@ -135,6 +136,7 @@ class DefaultExpressor: reason: str, anchor_message: MessageRecv, thinking_id: str, + action_data: Dict[str, Any], ) -> Optional[List[str]]: """ 回复器 (Replier): 核心逻辑,负责生成回复文本。 @@ -160,6 +162,8 @@ class DefaultExpressor: ) # --- End determining sender_name --- + target_message = action_data.get("target", "") + # 3. 构建 Prompt with Timer("构建Prompt", {}): # 内部计时器,可选保留 prompt = await prompt_builder.build_prompt( @@ -170,6 +174,7 @@ class DefaultExpressor: current_mind_info="", structured_info="", sender_name=sender_name_for_prompt, # Pass determined name + target_message=target_message, ) # 4. 调用 LLM 生成回复 @@ -182,9 +187,14 @@ class DefaultExpressor: try: with Timer("LLM生成", {}): # 内部计时器,可选保留 + # logger.info(f"{self.log_prefix}[Replier-{thinking_id}]\nPrompt:\n{prompt}\n") content, reasoning_content, model_name = await self.express_model.generate_response(prompt) - # logger.info(f"{self.log_prefix}[Replier-{thinking_id}]\nPrompt:\n{prompt}\n生成回复: {content}\n") - # 捕捉 LLM 输出信息 + + logger.info(f"{self.log_prefix}\nPrompt:\n{prompt}\n---------------------------\n") + + logger.info(f"想要表达:{in_mind_reply}") + logger.info(f"理由:{reason}") + logger.info(f"生成回复: {content}\n") info_catcher.catch_after_llm_generated( prompt=prompt, response=content, reasoning_content=reasoning_content, model_name=model_name ) diff --git a/src/plugins/heartFC_chat/expressors/exprssion_learner.py b/src/chat/focus_chat/expressors/exprssion_learner.py similarity index 64% rename from src/plugins/heartFC_chat/expressors/exprssion_learner.py rename to src/chat/focus_chat/expressors/exprssion_learner.py index 502a8ae93..2d688b71b 100644 --- a/src/plugins/heartFC_chat/expressors/exprssion_learner.py +++ b/src/chat/focus_chat/expressors/exprssion_learner.py @@ -2,10 +2,10 @@ import time import random from typing import List, Dict, Optional, Any, Tuple from src.common.logger_manager import get_logger -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config -from src.plugins.utils.chat_message_builder import get_raw_msg_by_timestamp_random, build_readable_messages -from src.plugins.heartFC_chat.heartflow_prompt_builder import Prompt, global_prompt_manager +from src.chat.utils.chat_message_builder import get_raw_msg_by_timestamp_random, build_readable_messages +from src.chat.focus_chat.heartflow_prompt_builder import Prompt, global_prompt_manager import os import json @@ -16,12 +16,12 @@ logger = get_logger("expressor") def init_prompt() -> None: - learn_expression_prompt = """ + learn_style_prompt = """ {chat_str} 请从上面这段群聊中概括除了人名为"麦麦"之外的人的语言风格,只考虑文字,不要考虑表情包和图片 不要涉及具体的人名,只考虑语言风格 -思考回复语法,长度和情感 +语言风格包含特殊内容和情感 思考有没有特殊的梗,一并总结成语言风格 总结成如下格式的规律,总结的内容要详细,但具有概括性: 当"xxx"时,可以"xxx", xxx不超过10个字 @@ -29,20 +29,18 @@ def init_prompt() -> None: 例如: 当"表示十分惊叹"时,使用"我嘞个xxxx" 当"表示讽刺的赞同,不想讲道理"时,使用"对对对" -当"想表达某个观点,但不想明说",使用"反讽的句式" 当"想说明某个观点,但懒得明说",使用"懂的都懂" -当"想搞笑的表现高深的感觉",使用"文言文句式" 注意不要总结你自己的发言 现在请你概括 """ - Prompt(learn_expression_prompt, "learn_expression_prompt") + Prompt(learn_style_prompt, "learn_style_prompt") personality_expression_prompt = """ {personality} 请从以上人设中总结出这个角色可能的语言风格 -思考回复语法,长度和情感 +思考回复的特殊内容和情感 思考有没有特殊的梗,一并总结成语言风格 总结成如下格式的规律,总结的内容要详细,但具有概括性: 当"xxx"时,可以"xxx", xxx不超过10个字 @@ -50,20 +48,38 @@ def init_prompt() -> None: 例如: 当"表示十分惊叹"时,使用"我嘞个xxxx" 当"表示讽刺的赞同,不想讲道理"时,使用"对对对" -当"想表达某个观点,但不想明说",使用"反讽的句式" 当"想说明某个观点,但懒得明说",使用"懂的都懂" -当"想搞笑的表现高深的感觉",使用"文言文句式" 现在请你概括 """ Prompt(personality_expression_prompt, "personality_expression_prompt") + learn_grammar_prompt = """ +{chat_str} + +请从上面这段群聊中概括除了人名为"麦麦"之外的人的语法和句法特点,只考虑纯文字,不要考虑表情包和图片 +不要总结【图片】,【动画表情】,[图片],[动画表情],不总结 表情符号 +不要涉及具体的人名,只考虑语法和句法特点, +语法和句法特点要包括,句子长短(具体字数),如何分局,有何种语病,如何拆分句子。 +总结成如下格式的规律,总结的内容要简洁,不浮夸: +当"xxx"时,可以"xxx" + +例如: +当"表达观点较复杂"时,使用"省略主语"的句法 +当"不用详细说明的一般表达"时,使用"非常简洁的句子"的句法 +当"需要单纯简单的确认"时,使用"单字或几个字的肯定"的句法 + +注意不要总结你自己的发言 +现在请你概括 +""" + Prompt(learn_grammar_prompt, "learn_grammar_prompt") + class ExpressionLearner: def __init__(self) -> None: self.express_learn_model: LLMRequest = LLMRequest( model=global_config.llm_normal, - temperature=global_config.llm_normal["temp"], + temperature=0.1, max_tokens=256, request_type="response_heartflow", ) @@ -73,17 +89,22 @@ class ExpressionLearner: 读取/data/expression/learnt/{chat_id}/expressions.json和/data/expression/personality/expressions.json 返回(learnt_expressions, personality_expressions) """ - learnt_file = os.path.join("data", "expression", "learnt", str(chat_id), "expressions.json") + learnt_style_file = os.path.join("data", "expression", "learnt_style", str(chat_id), "expressions.json") + learnt_grammar_file = os.path.join("data", "expression", "learnt_grammar", str(chat_id), "expressions.json") personality_file = os.path.join("data", "expression", "personality", "expressions.json") - learnt_expressions = [] + learnt_style_expressions = [] + learnt_grammar_expressions = [] personality_expressions = [] - if os.path.exists(learnt_file): - with open(learnt_file, "r", encoding="utf-8") as f: - learnt_expressions = json.load(f) + if os.path.exists(learnt_style_file): + with open(learnt_style_file, "r", encoding="utf-8") as f: + learnt_style_expressions = json.load(f) + if os.path.exists(learnt_grammar_file): + with open(learnt_grammar_file, "r", encoding="utf-8") as f: + learnt_grammar_expressions = json.load(f) if os.path.exists(personality_file): with open(personality_file, "r", encoding="utf-8") as f: personality_expressions = json.load(f) - return learnt_expressions, personality_expressions + return learnt_style_expressions, learnt_grammar_expressions, personality_expressions def is_similar(self, s1: str, s2: str) -> bool: """ @@ -98,23 +119,48 @@ class ExpressionLearner: return same / min_len > 0.8 async def learn_and_store_expression(self) -> List[Tuple[str, str, str]]: - """选择从当前到最近1小时内的随机10条消息,然后学习这些消息的表达方式""" - logger.info("开始学习表达方式...") - expressions: Optional[List[Tuple[str, str, str]]] = await self.learn_expression() - logger.info(f"学习到{len(expressions) if expressions else 0}条表达方式") - # expressions: List[(chat_id, situation, style)] - if not expressions: - logger.info("没有学习到表达方式") + """ + 学习并存储表达方式,分别学习语言风格和句法特点 + """ + learnt_style: Optional[List[Tuple[str, str, str]]] = await self.learn_and_store(type="style", num=3) + if not learnt_style: return [] + + learnt_grammar: Optional[List[Tuple[str, str, str]]] = await self.learn_and_store(type="grammar", num=2) + if not learnt_grammar: + return [] + + return learnt_style, learnt_grammar + + async def learn_and_store(self, type: str, num: int = 10) -> List[Tuple[str, str, str]]: + """ + 选择从当前到最近1小时内的随机num条消息,然后学习这些消息的表达方式 + type: "style" or "grammar" + """ + if type == "style": + type_str = "语言风格" + elif type == "grammar": + type_str = "句法特点" + else: + raise ValueError(f"Invalid type: {type}") + logger.info(f"开始学习{type_str}...") + learnt_expressions: Optional[List[Tuple[str, str, str]]] = await self.learn_expression(type, num) + logger.info(f"学习到{len(learnt_expressions) if learnt_expressions else 0}条{type_str}") + # learnt_expressions: List[(chat_id, situation, style)] + + if not learnt_expressions: + logger.info(f"没有学习到{type_str}") + return [] + # 按chat_id分组 chat_dict: Dict[str, List[Dict[str, str]]] = {} - for chat_id, situation, style in expressions: + for chat_id, situation, style in learnt_expressions: if chat_id not in chat_dict: chat_dict[chat_id] = [] chat_dict[chat_id].append({"situation": situation, "style": style}) # 存储到/data/expression/对应chat_id/expressions.json for chat_id, expr_list in chat_dict.items(): - dir_path = os.path.join("data", "expression", "learnt", str(chat_id)) + dir_path = os.path.join("data", "expression", f"learnt_{type}", str(chat_id)) os.makedirs(dir_path, exist_ok=True) file_path = os.path.join(dir_path, "expressions.json") # 若已存在,先读出合并 @@ -154,17 +200,26 @@ class ExpressionLearner: old_data.append(new_expr) with open(file_path, "w", encoding="utf-8") as f: json.dump(old_data, f, ensure_ascii=False, indent=2) - return expressions + return learnt_expressions - async def learn_expression(self) -> Optional[List[Tuple[str, str, str]]]: - """选择从当前到最近1小时内的随机10条消息,然后学习这些消息的表达方式 + async def learn_expression(self, type: str, num: int = 10) -> Optional[List[Tuple[str, str, str]]]: + """选择从当前到最近1小时内的随机num条消息,然后学习这些消息的表达方式 Args: - chat_stream (ChatStream): _description_ + type: "style" or "grammar" """ + if type == "style": + type_str = "语言风格" + prompt = "learn_style_prompt" + elif type == "grammar": + type_str = "句法特点" + prompt = "learn_grammar_prompt" + else: + raise ValueError(f"Invalid type: {type}") + current_time = time.time() random_msg: Optional[List[Dict[str, Any]]] = get_raw_msg_by_timestamp_random( - current_time - 3600 * 24, current_time, limit=10 + current_time - 3600 * 24, current_time, limit=num ) if not random_msg: return None @@ -173,15 +228,19 @@ class ExpressionLearner: random_msg_str: str = await build_readable_messages(random_msg, timestamp_mode="normal") prompt: str = await global_prompt_manager.format_prompt( - "learn_expression_prompt", + prompt, chat_str=random_msg_str, ) - logger.debug(f"学习表达方式的prompt: {prompt}") + logger.debug(f"学习{type_str}的prompt: {prompt}") - response, _ = await self.express_learn_model.generate_response_async(prompt) + try: + response, _ = await self.express_learn_model.generate_response_async(prompt) + except Exception as e: + logger.error(f"学习{type_str}失败: {e}") + return None - logger.debug(f"学习表达方式的response: {response}") + logger.debug(f"学习{type_str}的response: {response}") expressions: List[Tuple[str, str, str]] = self.parse_expression_response(response, chat_id) @@ -232,7 +291,13 @@ class ExpressionLearner: personality=global_config.expression_style, ) logger.info(f"个性表达方式提取prompt: {prompt}") - response, _ = await self.express_learn_model.generate_response_async(prompt) + + try: + response, _ = await self.express_learn_model.generate_response_async(prompt) + except Exception as e: + logger.error(f"个性表达方式提取失败: {e}") + return + logger.info(f"个性表达方式提取response: {response}") # chat_id用personality expressions = self.parse_expression_response(response, "personality") diff --git a/src/plugins/heartFC_chat/heartFC_Cycleinfo.py b/src/chat/focus_chat/heartFC_Cycleinfo.py similarity index 100% rename from src/plugins/heartFC_chat/heartFC_Cycleinfo.py rename to src/chat/focus_chat/heartFC_Cycleinfo.py diff --git a/src/plugins/heartFC_chat/heartFC_chat.py b/src/chat/focus_chat/heartFC_chat.py similarity index 97% rename from src/plugins/heartFC_chat/heartFC_chat.py rename to src/chat/focus_chat/heartFC_chat.py index ce75539f6..5bc0cddad 100644 --- a/src/plugins/heartFC_chat/heartFC_chat.py +++ b/src/chat/focus_chat/heartFC_chat.py @@ -6,32 +6,32 @@ import time import traceback from collections import deque from typing import List, Optional, Dict, Any, Deque, Callable, Coroutine -from src.plugins.chat.chat_stream import ChatStream -from src.plugins.chat.chat_stream import chat_manager +from src.chat.message_receive.chat_stream import ChatStream +from src.chat.message_receive.chat_stream import chat_manager from rich.traceback import install from src.common.logger_manager import get_logger -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config -from src.plugins.utils.timer_calculator import Timer +from src.chat.utils.timer_calculator import Timer from src.heart_flow.observation.observation import Observation -from src.plugins.heartFC_chat.heartflow_prompt_builder import prompt_builder -from src.plugins.heartFC_chat.heartFC_Cycleinfo import CycleDetail +from src.chat.focus_chat.heartflow_prompt_builder import prompt_builder +from src.chat.focus_chat.heartFC_Cycleinfo import CycleDetail from src.heart_flow.observation.chatting_observation import ChattingObservation from src.heart_flow.utils_chat import get_chat_type_and_target_info -from src.heart_flow.info.info_base import InfoBase -from src.heart_flow.info.obs_info import ObsInfo -from src.heart_flow.info.cycle_info import CycleInfo -from src.heart_flow.info.mind_info import MindInfo -from src.heart_flow.info.structured_info import StructuredInfo -from src.plugins.heartFC_chat.info_processors.chattinginfo_processor import ChattingInfoProcessor -from src.plugins.heartFC_chat.info_processors.mind_processor import MindProcessor +from src.chat.focus_chat.info.info_base import InfoBase +from src.chat.focus_chat.info.obs_info import ObsInfo +from src.chat.focus_chat.info.cycle_info import CycleInfo +from src.chat.focus_chat.info.mind_info import MindInfo +from src.chat.focus_chat.info.structured_info import StructuredInfo +from src.chat.focus_chat.info_processors.chattinginfo_processor import ChattingInfoProcessor +from src.chat.focus_chat.info_processors.mind_processor import MindProcessor from src.heart_flow.observation.memory_observation import MemoryObservation from src.heart_flow.observation.hfcloop_observation import HFCloopObservation from src.heart_flow.observation.working_observation import WorkingObservation -from src.plugins.heartFC_chat.info_processors.tool_processor import ToolProcessor -from src.plugins.heartFC_chat.expressors.default_expressor import DefaultExpressor -from src.plugins.heartFC_chat.hfc_utils import _create_empty_anchor_message -from src.plugins.heartFC_chat.memory_activator import MemoryActivator +from src.chat.focus_chat.info_processors.tool_processor import ToolProcessor +from src.chat.focus_chat.expressors.default_expressor import DefaultExpressor +from src.chat.focus_chat.hfc_utils import _create_empty_anchor_message +from src.chat.focus_chat.memory_activator import MemoryActivator install(extra_lines=3) diff --git a/src/plugins/heartFC_chat/heartFC_chatting_logic.md b/src/chat/focus_chat/heartFC_chatting_logic.md similarity index 100% rename from src/plugins/heartFC_chat/heartFC_chatting_logic.md rename to src/chat/focus_chat/heartFC_chatting_logic.md diff --git a/src/plugins/heartFC_chat/heartFC_readme.md b/src/chat/focus_chat/heartFC_readme.md similarity index 89% rename from src/plugins/heartFC_chat/heartFC_readme.md rename to src/chat/focus_chat/heartFC_readme.md index 07bc4c63c..10b1aa1fd 100644 --- a/src/plugins/heartFC_chat/heartFC_readme.md +++ b/src/chat/focus_chat/heartFC_readme.md @@ -5,7 +5,7 @@ HeartFC_chat 是一个基于心流理论的聊天系统,通过模拟人类的 ## 核心工作流程 ### 1. 消息处理与存储 (HeartFCProcessor) -[代码位置: src/plugins/heartFC_chat/heartflow_processor.py] +[代码位置: src/plugins/focus_chat/heartflow_processor.py] 消息处理器负责接收和预处理消息,主要完成以下工作: ```mermaid @@ -23,7 +23,7 @@ graph TD - 消息存储:`storage.store_message()` [行号: 108] ### 2. 对话管理循环 (HeartFChatting) -[代码位置: src/plugins/heartFC_chat/heartFC_chat.py] +[代码位置: src/plugins/focus_chat/focus_chat.py] HeartFChatting是系统的核心组件,实现了完整的对话管理循环: @@ -55,7 +55,7 @@ graph TD * 处理表情:`_handle_emoji()` [行号: 527-567] ### 3. 回复生成机制 (HeartFCGenerator) -[代码位置: src/plugins/heartFC_chat/heartFC_generator.py] +[代码位置: src/plugins/focus_chat/heartFC_generator.py] 回复生成器负责产生高质量的回复内容: @@ -74,7 +74,7 @@ graph TD * 响应处理:`_process_response()` [行号: 97-106] ### 4. 提示词构建系统 (HeartFlowPromptBuilder) -[代码位置: src/plugins/heartFC_chat/heartflow_prompt_builder.py] +[代码位置: src/plugins/focus_chat/heartflow_prompt_builder.py] 提示词构建器支持两种工作模式,HeartFC_chat专门使用Focus模式,而Normal模式是为normal_chat设计的: @@ -106,8 +106,8 @@ graph TD ## 智能特性 ### 1. 对话决策机制 -- LLM决策工具定义:`PLANNER_TOOL_DEFINITION` [heartFC_chat.py 行号: 13-42] -- 决策执行:`_planner()` [heartFC_chat.py 行号: 282-386] +- LLM决策工具定义:`PLANNER_TOOL_DEFINITION` [focus_chat.py 行号: 13-42] +- 决策执行:`_planner()` [focus_chat.py 行号: 282-386] - 考虑因素: * 上下文相关性 * 情感状态 @@ -115,7 +115,7 @@ graph TD * 对话时机 ### 2. 状态管理 -[代码位置: src/plugins/heartFC_chat/heartFC_chat.py] +[代码位置: src/plugins/focus_chat/focus_chat.py] - 状态机实现:`HeartFChatting`类 [行号: 44-567] - 核心功能: * 初始化:`_initialize()` [行号: 89-112] @@ -123,7 +123,7 @@ graph TD * 状态转换:`_handle_loop_completion()` [行号: 166-190] ### 3. 回复生成策略 -[代码位置: src/plugins/heartFC_chat/heartFC_generator.py] +[代码位置: src/plugins/focus_chat/heartFC_generator.py] - 温度调节:`current_model.temperature = global_config.llm_normal["temp"] * arousal_multiplier` [行号: 48] - 生成控制:`_generate_response_with_model()` [行号: 69-95] - 响应处理:`_process_response()` [行号: 97-106] @@ -133,7 +133,7 @@ graph TD ### 关键参数 - LLM配置:`model_normal` [heartFC_generator.py 行号: 32-37] - 过滤规则:`_check_ban_words()`, `_check_ban_regex()` [heartflow_processor.py 行号: 196-215] -- 状态控制:`INITIAL_DURATION = 60.0` [heartFC_chat.py 行号: 11] +- 状态控制:`INITIAL_DURATION = 60.0` [focus_chat.py 行号: 11] ### 优化建议 1. 调整LLM参数:`temperature`和`max_tokens` diff --git a/src/plugins/heartFC_chat/heartFC_sender.py b/src/chat/focus_chat/heartFC_sender.py similarity index 94% rename from src/plugins/heartFC_chat/heartFC_sender.py rename to src/chat/focus_chat/heartFC_sender.py index ca8fd1c03..3443e096c 100644 --- a/src/plugins/heartFC_chat/heartFC_sender.py +++ b/src/chat/focus_chat/heartFC_sender.py @@ -1,14 +1,11 @@ -# src/plugins/heartFC_chat/heartFC_sender.py -import asyncio # 重新导入 asyncio +import asyncio from typing import Dict, Optional # 重新导入类型 -from ..chat.message import MessageSending, MessageThinking # 只保留 MessageSending 和 MessageThinking - -# from ..message import global_api -from src.plugins.message.api import global_api -from ..storage.storage import MessageStorage -from ..chat.utils import truncate_message +from src.chat.message_receive.message import MessageSending, MessageThinking +from src.common.message.api import global_api +from src.chat.message_receive.storage import MessageStorage +from src.chat.utils.utils import truncate_message from src.common.logger_manager import get_logger -from src.plugins.chat.utils import calculate_typing_time +from src.chat.utils.utils import calculate_typing_time from rich.traceback import install install(extra_lines=3) diff --git a/src/plugins/heartFC_chat/heartflow_processor.py b/src/chat/focus_chat/heartflow_processor.py similarity index 94% rename from src/plugins/heartFC_chat/heartflow_processor.py rename to src/chat/focus_chat/heartflow_processor.py index 5bd63b14a..ed377edb1 100644 --- a/src/plugins/heartFC_chat/heartflow_processor.py +++ b/src/chat/focus_chat/heartflow_processor.py @@ -2,16 +2,16 @@ import time import traceback from ..memory_system.Hippocampus import HippocampusManager from ...config.config import global_config -from ..chat.message import MessageRecv -from ..storage.storage import MessageStorage -from ..chat.utils import is_mentioned_bot_in_message +from ..message_receive.message import MessageRecv +from ..message_receive.storage import MessageStorage +from ..utils.utils import is_mentioned_bot_in_message from maim_message import Seg from src.heart_flow.heartflow import heartflow from src.common.logger_manager import get_logger -from ..chat.chat_stream import chat_manager -from ..chat.message_buffer import message_buffer +from ..message_receive.chat_stream import chat_manager +from ..message_receive.message_buffer import message_buffer from ..utils.timer_calculator import Timer -from src.plugins.person_info.relationship_manager import relationship_manager +from src.chat.person_info.relationship_manager import relationship_manager from typing import Optional, Tuple, Dict, Any logger = get_logger("chat") @@ -215,7 +215,7 @@ class HeartFCProcessor: f"[{current_time}][{mes_name}]" f"{userinfo.user_nickname}:" f"{message.processed_plain_text}" - f"[兴趣度: {interested_rate:.2f}]" + f"[激活: {interested_rate:.1f}]" ) # 8. 关系处理 diff --git a/src/plugins/heartFC_chat/heartflow_prompt_builder.py b/src/chat/focus_chat/heartflow_prompt_builder.py similarity index 87% rename from src/plugins/heartFC_chat/heartflow_prompt_builder.py rename to src/chat/focus_chat/heartflow_prompt_builder.py index 16aa25c72..2b2cdb67b 100644 --- a/src/plugins/heartFC_chat/heartflow_prompt_builder.py +++ b/src/chat/focus_chat/heartflow_prompt_builder.py @@ -1,21 +1,20 @@ -import random -from ...config.config import global_config +from src.config.config import global_config from src.common.logger_manager import get_logger -from ...individuality.individuality import Individuality -from src.plugins.utils.prompt_builder import Prompt, global_prompt_manager -from src.plugins.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat -from src.plugins.person_info.relationship_manager import relationship_manager -from src.plugins.chat.utils import get_embedding +from src.individuality.individuality import Individuality +from src.chat.utils.prompt_builder import Prompt, global_prompt_manager +from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat +from src.chat.person_info.relationship_manager import relationship_manager +from src.chat.utils.utils import get_embedding import time from typing import Union, Optional, Dict, Any -from ...common.database import db -from ..chat.utils import get_recent_group_speaker +from src.common.database import db +from src.chat.utils.utils import get_recent_group_speaker from src.manager.mood_manager import mood_manager -from ..memory_system.Hippocampus import HippocampusManager -from ..schedule.schedule_generator import bot_schedule -from ..knowledge.knowledge_lib import qa_manager -from .expressors.exprssion_learner import expression_learner +from src.chat.memory_system.Hippocampus import HippocampusManager +from src.chat.knowledge.knowledge_lib import qa_manager +from src.chat.focus_chat.expressors.exprssion_learner import expression_learner import traceback +import random logger = get_logger("prompt") @@ -24,21 +23,22 @@ logger = get_logger("prompt") def init_prompt(): Prompt( """ -你可以参考以下的语言习惯,如果情景合适就使用,不要盲目使用: -{language_habits} +你可以参考以下的语言习惯,如果情景合适就使用,不要盲目使用,不要生硬使用,而是结合到表达中: +{style_habbits} -不要生硬使用,而是结合到表达中 - +你现在正在群里聊天,以下是群里正在进行的聊天内容: {chat_info} -你只需要了解聊天记录中的内容就好 - -{chat_target} -你的名字是{bot_name},{prompt_personality},你想表达:{in_mind_reply},原因是:{reason} +以上是聊天内容,你需要了解聊天记录中的内容 -请注意,请根据你想表达的内容和原因,参考聊天内容,组织一条日常且口语化的回复 -要求回复尽量简短一些。{reply_style2}。{prompt_ger}。可以参考贴吧,知乎或者微博的回复风格,你可以完全重组回复,保留最基本的表达含义就好,但注意简短,保持一个话题。 -{reply_style1},说中文,不要刻意突出自身学科背景。不要浮夸,不要用夸张修辞,平淡一些。不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 ),只输出一条回复就好。 +{chat_target} +你的名字是{bot_name},{prompt_personality},在这聊天中,"{target_message}"引起了你的注意,你想表达:{in_mind_reply},原因是:{reason}。你现在要思考怎么回复 +你需要使用合适的语法和句法,参考聊天内容,组织一条日常且口语化的回复。 +请你根据情景使用以下句法: +{grammar_habbits} +回复尽量简短一些。可以参考贴吧,知乎和微博的回复风格,你可以完全重组回复,保留最基本的表达含义就好,但注意回复要简短。 +回复不要浮夸,不要用夸张修辞,平淡一些。不要输出多余内容(包括前后缀,冒号和引号,括号,表情包,at或 @等 ),只输出一条回复就好。 +现在,你说: """, "heart_flow_prompt", ) @@ -119,7 +119,6 @@ def init_prompt(): {memory_prompt} {relation_prompt} {prompt_info} -{schedule_prompt} {chat_target} {chat_talking_prompt} 现在"{sender_name}"说的:{message_txt}。引起了你的注意,你想要在群里发言或者回复这条消息。\n @@ -137,7 +136,7 @@ def init_prompt(): "你回忆起:{related_memory_info}。\n以上是你的回忆,不一定是目前聊天里的人说的,也不一定是现在发生的事情,请记住。\n", "memory_prompt", ) - Prompt("你现在正在做的事情是:{schedule_info}", "schedule_prompt") + Prompt("\n你有以下这些**知识**:\n{prompt_info}\n请你**记住上面的知识**,之后可能会用到。\n", "knowledge_prompt") # --- Template for HeartFChatting (FOCUSED mode) --- @@ -168,7 +167,6 @@ def init_prompt(): {memory_prompt} {relation_prompt} {prompt_info} -{schedule_prompt} 你正在和 {sender_name} 私聊。 聊天记录如下: {chat_talking_prompt} @@ -186,7 +184,7 @@ def init_prompt(): async def _build_prompt_focus( - reason, current_mind_info, structured_info, chat_stream, sender_name, in_mind_reply + reason, current_mind_info, structured_info, chat_stream, sender_name, in_mind_reply, target_message ) -> str: individuality = Individuality.get_instance() prompt_personality = individuality.get_prompt(x_person=0, level=2) @@ -206,38 +204,12 @@ async def _build_prompt_focus( chat_talking_prompt = await build_readable_messages( message_list_before_now, replace_bot_name=True, - merge_messages=False, - timestamp_mode="normal", + merge_messages=True, + timestamp_mode="relative", read_mark=0.0, truncate=True, ) - prompt_ger = "" - if random.random() < 0.04: - prompt_ger += "你喜欢用倒装句" - if random.random() < 0.02: - prompt_ger += "你喜欢用反问句" - - reply_styles1 = [ - ("给出日常且口语化的回复,平淡一些", 0.4), - ("给出非常简短的回复", 0.4), - ("给出缺失主语的回复,简短", 0.15), - ("给出带有语病的回复,朴实平淡", 0.05), - ] - reply_style1_chosen = random.choices( - [style[0] for style in reply_styles1], weights=[style[1] for style in reply_styles1], k=1 - )[0] - - reply_styles2 = [ - ("不要回复的太有条理,可以有个性", 0.7), - ("不要回复的太有条理,可以复读,但是不要复读自己说的话", 0.1), - ("回复的认真一些", 0.1), - ("可以回复单个表情符号", 0.05), - ] - reply_style2_chosen = random.choices( - [style[0] for style in reply_styles2], weights=[style[1] for style in reply_styles2], k=1 - )[0] - if structured_info: structured_info_prompt = await global_prompt_manager.format_prompt( "info_from_tools", structured_info=structured_info @@ -246,33 +218,36 @@ async def _build_prompt_focus( structured_info_prompt = "" # 从/data/expression/对应chat_id/expressions.json中读取表达方式 - learnt_expressions, personality_expressions = await expression_learner.get_expression_by_chat_id( - chat_stream.stream_id - ) - language_habits = [] - # 1. learnt_expressions加权随机选5条 - if learnt_expressions: - weights = [expr["count"] for expr in learnt_expressions] - selected_learnt = weighted_sample_no_replacement(learnt_expressions, weights, 5) + ( + learnt_style_expressions, + learnt_grammar_expressions, + personality_expressions, + ) = await expression_learner.get_expression_by_chat_id(chat_stream.stream_id) + + style_habbits = [] + grammar_habbits = [] + # 1. learnt_expressions加权随机选3条 + if learnt_style_expressions: + weights = [expr["count"] for expr in learnt_style_expressions] + selected_learnt = weighted_sample_no_replacement(learnt_style_expressions, weights, 3) for expr in selected_learnt: if isinstance(expr, dict) and "situation" in expr and "style" in expr: - language_habits.append(f"当{expr['situation']}时,使用 {expr['style']}") - # 2. personality_expressions随机选1条 + style_habbits.append(f"当{expr['situation']}时,使用 {expr['style']}") + # 2. learnt_grammar_expressions加权随机选3条 + if learnt_grammar_expressions: + weights = [expr["count"] for expr in learnt_grammar_expressions] + selected_learnt = weighted_sample_no_replacement(learnt_grammar_expressions, weights, 3) + for expr in selected_learnt: + if isinstance(expr, dict) and "situation" in expr and "style" in expr: + grammar_habbits.append(f"当{expr['situation']}时,使用 {expr['style']}") + # 3. personality_expressions随机选1条 if personality_expressions: expr = random.choice(personality_expressions) if isinstance(expr, dict) and "situation" in expr and "style" in expr: - language_habits.append(f"当{expr['situation']}时,使用 {expr['style']}") - # 3. 如果都没有,给默认 - if not language_habits: - language_habits = [ - "当表示惊讶无语是,使用 不是?", - "当表示无语时,使用 阿这", - "当用调侃的方式称呼某人,使用 哈基X", - "当表示讽刺的赞同时,使用 对对对", - "当你想说明某个观点,但懒得明说,使用 懂的都懂", - ] - language_habits = random.sample(language_habits, 6) - language_habits_str = "\n".join(language_habits) + style_habbits.append(f"当{expr['situation']}时,使用 {expr['style']}") + + style_habbits_str = "\n".join(style_habbits) + grammar_habbits_str = "\n".join(grammar_habbits) logger.debug("开始构建 focus prompt") @@ -286,20 +261,17 @@ async def _build_prompt_focus( prompt = await global_prompt_manager.format_prompt( template_name, # info_from_tools=structured_info_prompt, - language_habits=language_habits_str, + style_habbits=style_habbits_str, + grammar_habbits=grammar_habbits_str, chat_target=chat_target_1, # Used in group template # chat_talking_prompt=chat_talking_prompt, chat_info=chat_talking_prompt, bot_name=global_config.BOT_NICKNAME, # prompt_personality=prompt_personality, prompt_personality="", - # chat_target_2=chat_target_2, # Used in group template - # current_mind_info=current_mind_info, - reply_style2=reply_style2_chosen, - reply_style1=reply_style1_chosen, reason=reason, in_mind_reply=in_mind_reply, - prompt_ger=prompt_ger, + target_message=target_message, # moderation_prompt=await global_prompt_manager.get_prompt_async("moderation_prompt"), # sender_name is not used in the group template ) @@ -314,10 +286,7 @@ async def _build_prompt_focus( prompt_personality=prompt_personality, # chat_target and chat_target_2 are not used in private template current_mind_info=current_mind_info, - reply_style2=reply_style2_chosen, - reply_style1=reply_style1_chosen, reason=reason, - prompt_ger=prompt_ger, moderation_prompt=await global_prompt_manager.get_prompt_async("moderation_prompt"), ) # --- End choosing template --- @@ -464,13 +433,6 @@ class PromptBuilder: end_time = time.time() logger.debug(f"知识检索耗时: {(end_time - start_time):.3f}秒") - if global_config.ENABLE_SCHEDULE_GEN: - schedule_prompt = await global_prompt_manager.format_prompt( - "schedule_prompt", schedule_info=bot_schedule.get_current_num_task(num=1, time_info=False) - ) - else: - schedule_prompt = "" - logger.debug("开始构建 normal prompt") # --- Choose template and format based on chat type --- @@ -486,7 +448,6 @@ class PromptBuilder: sender_name=effective_sender_name, memory_prompt=memory_prompt, prompt_info=prompt_info, - schedule_prompt=schedule_prompt, chat_target=chat_target_1, chat_target_2=chat_target_2, chat_talking_prompt=chat_talking_prompt, @@ -511,7 +472,6 @@ class PromptBuilder: sender_name=effective_sender_name, memory_prompt=memory_prompt, prompt_info=prompt_info, - schedule_prompt=schedule_prompt, chat_talking_prompt=chat_talking_prompt, message_txt=message_txt, bot_name=global_config.BOT_NICKNAME, @@ -861,7 +821,7 @@ class PromptBuilder: return "[构建 Planner Prompt 时出错]" -def weighted_sample_no_replacement(items, weights, k): +def weighted_sample_no_replacement(items, weights, k) -> list: """ 加权且不放回地随机抽取k个元素。 @@ -872,6 +832,8 @@ def weighted_sample_no_replacement(items, weights, k): 返回: selected: 按权重加权且不重复抽取的k个元素组成的列表 + 如果 items 中的元素不足 k 个,就只会返回所有可用的元素 + 实现思路: 每次从当前池中按权重加权随机选出一个元素,选中后将其从池中移除,重复k次。 这样保证了: diff --git a/src/plugins/heartFC_chat/hfc_utils.py b/src/chat/focus_chat/hfc_utils.py similarity index 91% rename from src/plugins/heartFC_chat/hfc_utils.py rename to src/chat/focus_chat/hfc_utils.py index e5145cd78..5b29a803e 100644 --- a/src/plugins/heartFC_chat/hfc_utils.py +++ b/src/chat/focus_chat/hfc_utils.py @@ -1,9 +1,9 @@ import time import traceback from typing import Optional -from src.plugins.chat.message import MessageRecv, BaseMessageInfo -from src.plugins.chat.chat_stream import ChatStream -from src.plugins.chat.message import UserInfo +from src.chat.message_receive.message import MessageRecv, BaseMessageInfo +from src.chat.message_receive.chat_stream import ChatStream +from src.chat.message_receive.message import UserInfo from src.common.logger_manager import get_logger import json diff --git a/src/heart_flow/info/chat_info.py b/src/chat/focus_chat/info/chat_info.py similarity index 100% rename from src/heart_flow/info/chat_info.py rename to src/chat/focus_chat/info/chat_info.py diff --git a/src/heart_flow/info/cycle_info.py b/src/chat/focus_chat/info/cycle_info.py similarity index 100% rename from src/heart_flow/info/cycle_info.py rename to src/chat/focus_chat/info/cycle_info.py diff --git a/src/heart_flow/info/info_base.py b/src/chat/focus_chat/info/info_base.py similarity index 100% rename from src/heart_flow/info/info_base.py rename to src/chat/focus_chat/info/info_base.py diff --git a/src/heart_flow/info/mind_info.py b/src/chat/focus_chat/info/mind_info.py similarity index 100% rename from src/heart_flow/info/mind_info.py rename to src/chat/focus_chat/info/mind_info.py diff --git a/src/heart_flow/info/obs_info.py b/src/chat/focus_chat/info/obs_info.py similarity index 100% rename from src/heart_flow/info/obs_info.py rename to src/chat/focus_chat/info/obs_info.py diff --git a/src/heart_flow/info/structured_info.py b/src/chat/focus_chat/info/structured_info.py similarity index 100% rename from src/heart_flow/info/structured_info.py rename to src/chat/focus_chat/info/structured_info.py diff --git a/src/plugins/heartFC_chat/info_processors/base_processor.py b/src/chat/focus_chat/info_processors/base_processor.py similarity index 96% rename from src/plugins/heartFC_chat/info_processors/base_processor.py rename to src/chat/focus_chat/info_processors/base_processor.py index dcbd812ee..e8f285a3a 100644 --- a/src/plugins/heartFC_chat/info_processors/base_processor.py +++ b/src/chat/focus_chat/info_processors/base_processor.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from typing import List, Any, Optional, Dict -from src.heart_flow.info.info_base import InfoBase +from src.chat.focus_chat.info.info_base import InfoBase from src.heart_flow.observation.observation import Observation from src.common.logger_manager import get_logger diff --git a/src/plugins/heartFC_chat/info_processors/chattinginfo_processor.py b/src/chat/focus_chat/info_processors/chattinginfo_processor.py similarity index 95% rename from src/plugins/heartFC_chat/info_processors/chattinginfo_processor.py rename to src/chat/focus_chat/info_processors/chattinginfo_processor.py index 6fe5ec3e0..4f38cb641 100644 --- a/src/plugins/heartFC_chat/info_processors/chattinginfo_processor.py +++ b/src/chat/focus_chat/info_processors/chattinginfo_processor.py @@ -1,15 +1,15 @@ from typing import List, Optional, Any -from src.heart_flow.info.obs_info import ObsInfo +from src.chat.focus_chat.info.obs_info import ObsInfo from src.heart_flow.observation.observation import Observation -from src.heart_flow.info.info_base import InfoBase +from src.chat.focus_chat.info.info_base import InfoBase from .base_processor import BaseProcessor from src.common.logger_manager import get_logger from src.heart_flow.observation.chatting_observation import ChattingObservation from src.heart_flow.observation.hfcloop_observation import HFCloopObservation -from src.heart_flow.info.cycle_info import CycleInfo +from src.chat.focus_chat.info.cycle_info import CycleInfo from datetime import datetime from typing import Dict -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config logger = get_logger("observation") diff --git a/src/plugins/heartFC_chat/info_processors/mind_processor.py b/src/chat/focus_chat/info_processors/mind_processor.py similarity index 97% rename from src/plugins/heartFC_chat/info_processors/mind_processor.py rename to src/chat/focus_chat/info_processors/mind_processor.py index 7dff992f9..8162760d5 100644 --- a/src/plugins/heartFC_chat/info_processors/mind_processor.py +++ b/src/chat/focus_chat/info_processors/mind_processor.py @@ -1,28 +1,28 @@ from src.heart_flow.observation.chatting_observation import ChattingObservation from src.heart_flow.observation.observation import Observation -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config import time import traceback from src.common.logger_manager import get_logger from src.individuality.individuality import Individuality import random -from src.plugins.utils.prompt_builder import Prompt, global_prompt_manager -from src.plugins.utils.json_utils import safe_json_dumps -from src.plugins.chat.chat_stream import chat_manager +from src.chat.utils.prompt_builder import Prompt, global_prompt_manager +from src.chat.utils.json_utils import safe_json_dumps +from src.chat.message_receive.chat_stream import chat_manager import difflib -from src.plugins.person_info.relationship_manager import relationship_manager +from src.chat.person_info.relationship_manager import relationship_manager from .base_processor import BaseProcessor -from src.heart_flow.info.mind_info import MindInfo +from src.chat.focus_chat.info.mind_info import MindInfo from typing import List, Optional from src.heart_flow.observation.hfcloop_observation import HFCloopObservation -from src.plugins.heartFC_chat.info_processors.processor_utils import ( +from src.chat.focus_chat.info_processors.processor_utils import ( calculate_similarity, calculate_replacement_probability, get_spark, ) from typing import Dict -from src.heart_flow.info.info_base import InfoBase +from src.chat.focus_chat.info.info_base import InfoBase logger = get_logger("sub_heartflow") diff --git a/src/plugins/heartFC_chat/info_processors/processor_utils.py b/src/chat/focus_chat/info_processors/processor_utils.py similarity index 100% rename from src/plugins/heartFC_chat/info_processors/processor_utils.py rename to src/chat/focus_chat/info_processors/processor_utils.py diff --git a/src/plugins/heartFC_chat/info_processors/tool_processor.py b/src/chat/focus_chat/info_processors/tool_processor.py similarity index 95% rename from src/plugins/heartFC_chat/info_processors/tool_processor.py rename to src/chat/focus_chat/info_processors/tool_processor.py index 69892f30a..5c0c58207 100644 --- a/src/plugins/heartFC_chat/info_processors/tool_processor.py +++ b/src/chat/focus_chat/info_processors/tool_processor.py @@ -1,18 +1,18 @@ from src.heart_flow.observation.chatting_observation import ChattingObservation -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config import time from src.common.logger_manager import get_logger from src.individuality.individuality import Individuality -from src.plugins.utils.prompt_builder import Prompt, global_prompt_manager +from src.chat.utils.prompt_builder import Prompt, global_prompt_manager from src.tools.tool_use import ToolUser -from src.plugins.utils.json_utils import process_llm_tool_calls -from src.plugins.person_info.relationship_manager import relationship_manager +from src.chat.utils.json_utils import process_llm_tool_calls +from src.chat.person_info.relationship_manager import relationship_manager from .base_processor import BaseProcessor from typing import List, Optional, Dict from src.heart_flow.observation.observation import Observation from src.heart_flow.observation.working_observation import WorkingObservation -from src.heart_flow.info.structured_info import StructuredInfo +from src.chat.focus_chat.info.structured_info import StructuredInfo logger = get_logger("tool_use") diff --git a/src/plugins/heartFC_chat/memory_activator.py b/src/chat/focus_chat/memory_activator.py similarity index 95% rename from src/plugins/heartFC_chat/memory_activator.py rename to src/chat/focus_chat/memory_activator.py index dea532145..80a062499 100644 --- a/src/plugins/heartFC_chat/memory_activator.py +++ b/src/chat/focus_chat/memory_activator.py @@ -1,12 +1,12 @@ from src.heart_flow.observation.chatting_observation import ChattingObservation from src.heart_flow.observation.working_observation import WorkingObservation from src.heart_flow.observation.hfcloop_observation import HFCloopObservation -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config from src.common.logger_manager import get_logger -from src.plugins.utils.prompt_builder import Prompt +from src.chat.utils.prompt_builder import Prompt from datetime import datetime -from src.plugins.memory_system.Hippocampus import HippocampusManager +from src.chat.memory_system.Hippocampus import HippocampusManager from typing import List, Dict diff --git a/src/plugins/knowledge/LICENSE b/src/chat/knowledge/LICENSE similarity index 100% rename from src/plugins/knowledge/LICENSE rename to src/chat/knowledge/LICENSE diff --git a/src/plugins/knowledge/__init__.py b/src/chat/knowledge/__init__.py similarity index 100% rename from src/plugins/knowledge/__init__.py rename to src/chat/knowledge/__init__.py diff --git a/src/plugins/knowledge/knowledge_lib.py b/src/chat/knowledge/knowledge_lib.py similarity index 100% rename from src/plugins/knowledge/knowledge_lib.py rename to src/chat/knowledge/knowledge_lib.py diff --git a/src/plugins/knowledge/src/__init__.py b/src/chat/knowledge/src/__init__.py similarity index 100% rename from src/plugins/knowledge/src/__init__.py rename to src/chat/knowledge/src/__init__.py diff --git a/src/plugins/knowledge/src/embedding_store.py b/src/chat/knowledge/src/embedding_store.py similarity index 100% rename from src/plugins/knowledge/src/embedding_store.py rename to src/chat/knowledge/src/embedding_store.py diff --git a/src/plugins/knowledge/src/global_logger.py b/src/chat/knowledge/src/global_logger.py similarity index 100% rename from src/plugins/knowledge/src/global_logger.py rename to src/chat/knowledge/src/global_logger.py diff --git a/src/plugins/knowledge/src/ie_process.py b/src/chat/knowledge/src/ie_process.py similarity index 100% rename from src/plugins/knowledge/src/ie_process.py rename to src/chat/knowledge/src/ie_process.py diff --git a/src/plugins/knowledge/src/kg_manager.py b/src/chat/knowledge/src/kg_manager.py similarity index 100% rename from src/plugins/knowledge/src/kg_manager.py rename to src/chat/knowledge/src/kg_manager.py diff --git a/src/plugins/knowledge/src/llm_client.py b/src/chat/knowledge/src/llm_client.py similarity index 100% rename from src/plugins/knowledge/src/llm_client.py rename to src/chat/knowledge/src/llm_client.py diff --git a/src/plugins/knowledge/src/lpmmconfig.py b/src/chat/knowledge/src/lpmmconfig.py similarity index 100% rename from src/plugins/knowledge/src/lpmmconfig.py rename to src/chat/knowledge/src/lpmmconfig.py diff --git a/src/plugins/knowledge/src/mem_active_manager.py b/src/chat/knowledge/src/mem_active_manager.py similarity index 100% rename from src/plugins/knowledge/src/mem_active_manager.py rename to src/chat/knowledge/src/mem_active_manager.py diff --git a/src/plugins/knowledge/src/open_ie.py b/src/chat/knowledge/src/open_ie.py similarity index 100% rename from src/plugins/knowledge/src/open_ie.py rename to src/chat/knowledge/src/open_ie.py diff --git a/src/plugins/knowledge/src/prompt_template.py b/src/chat/knowledge/src/prompt_template.py similarity index 100% rename from src/plugins/knowledge/src/prompt_template.py rename to src/chat/knowledge/src/prompt_template.py diff --git a/src/plugins/knowledge/src/qa_manager.py b/src/chat/knowledge/src/qa_manager.py similarity index 100% rename from src/plugins/knowledge/src/qa_manager.py rename to src/chat/knowledge/src/qa_manager.py diff --git a/src/plugins/knowledge/src/raw_processing.py b/src/chat/knowledge/src/raw_processing.py similarity index 100% rename from src/plugins/knowledge/src/raw_processing.py rename to src/chat/knowledge/src/raw_processing.py diff --git a/src/plugins/knowledge/src/utils/__init__.py b/src/chat/knowledge/src/utils/__init__.py similarity index 100% rename from src/plugins/knowledge/src/utils/__init__.py rename to src/chat/knowledge/src/utils/__init__.py diff --git a/src/plugins/knowledge/src/utils/dyn_topk.py b/src/chat/knowledge/src/utils/dyn_topk.py similarity index 100% rename from src/plugins/knowledge/src/utils/dyn_topk.py rename to src/chat/knowledge/src/utils/dyn_topk.py diff --git a/src/plugins/knowledge/src/utils/hash.py b/src/chat/knowledge/src/utils/hash.py similarity index 100% rename from src/plugins/knowledge/src/utils/hash.py rename to src/chat/knowledge/src/utils/hash.py diff --git a/src/plugins/knowledge/src/utils/json_fix.py b/src/chat/knowledge/src/utils/json_fix.py similarity index 100% rename from src/plugins/knowledge/src/utils/json_fix.py rename to src/chat/knowledge/src/utils/json_fix.py diff --git a/src/plugins/knowledge/src/utils/visualize_graph.py b/src/chat/knowledge/src/utils/visualize_graph.py similarity index 100% rename from src/plugins/knowledge/src/utils/visualize_graph.py rename to src/chat/knowledge/src/utils/visualize_graph.py diff --git a/src/plugins/memory_system/Hippocampus.py b/src/chat/memory_system/Hippocampus.py similarity index 99% rename from src/plugins/memory_system/Hippocampus.py rename to src/chat/memory_system/Hippocampus.py index 6d64e607a..70eb679c9 100644 --- a/src/plugins/memory_system/Hippocampus.py +++ b/src/chat/memory_system/Hippocampus.py @@ -11,14 +11,14 @@ import networkx as nx import numpy as np from collections import Counter from ...common.database import db -from ...plugins.models.utils_model import LLMRequest +from ...chat.models.utils_model import LLMRequest from src.common.logger_manager import get_logger -from src.plugins.memory_system.sample_distribution import MemoryBuildScheduler # 分布生成器 +from src.chat.memory_system.sample_distribution import MemoryBuildScheduler # 分布生成器 from ..utils.chat_message_builder import ( get_raw_msg_by_timestamp, build_readable_messages, ) # 导入 build_readable_messages -from ..chat.utils import translate_timestamp_to_human_readable +from ..utils.utils import translate_timestamp_to_human_readable from .memory_config import MemoryConfig from rich.traceback import install diff --git a/src/plugins/memory_system/debug_memory.py b/src/chat/memory_system/debug_memory.py similarity index 96% rename from src/plugins/memory_system/debug_memory.py rename to src/chat/memory_system/debug_memory.py index 8f79c6a8e..baf745409 100644 --- a/src/plugins/memory_system/debug_memory.py +++ b/src/chat/memory_system/debug_memory.py @@ -6,7 +6,7 @@ import os # 添加项目根目录到系统路径 sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))) -from src.plugins.memory_system.Hippocampus import HippocampusManager +from src.chat.memory_system.Hippocampus import HippocampusManager from src.config.config import global_config from rich.traceback import install diff --git a/src/plugins/memory_system/manually_alter_memory.py b/src/chat/memory_system/manually_alter_memory.py similarity index 100% rename from src/plugins/memory_system/manually_alter_memory.py rename to src/chat/memory_system/manually_alter_memory.py diff --git a/src/plugins/memory_system/memory_config.py b/src/chat/memory_system/memory_config.py similarity index 100% rename from src/plugins/memory_system/memory_config.py rename to src/chat/memory_system/memory_config.py diff --git a/src/plugins/memory_system/offline_llm.py b/src/chat/memory_system/offline_llm.py similarity index 100% rename from src/plugins/memory_system/offline_llm.py rename to src/chat/memory_system/offline_llm.py diff --git a/src/plugins/memory_system/sample_distribution.py b/src/chat/memory_system/sample_distribution.py similarity index 100% rename from src/plugins/memory_system/sample_distribution.py rename to src/chat/memory_system/sample_distribution.py diff --git a/src/plugins/chat/__init__.py b/src/chat/message_receive/__init__.py similarity index 88% rename from src/plugins/chat/__init__.py rename to src/chat/message_receive/__init__.py index e5b0b942b..39a1f2637 100644 --- a/src/plugins/chat/__init__.py +++ b/src/chat/message_receive/__init__.py @@ -2,7 +2,7 @@ from ..emoji_system.emoji_manager import emoji_manager from ..person_info.relationship_manager import relationship_manager from .chat_stream import chat_manager from .message_sender import message_manager -from ..storage.storage import MessageStorage +from .storage import MessageStorage __all__ = [ diff --git a/src/plugins/chat/bot.py b/src/chat/message_receive/bot.py similarity index 93% rename from src/plugins/chat/bot.py rename to src/chat/message_receive/bot.py index 79e97c4f3..3c9e4420c 100644 --- a/src/plugins/chat/bot.py +++ b/src/chat/message_receive/bot.py @@ -3,13 +3,13 @@ from typing import Dict, Any from src.common.logger_manager import get_logger from src.manager.mood_manager import mood_manager # 导入情绪管理器 -from .chat_stream import chat_manager -from .message import MessageRecv -from .only_message_process import MessageProcessor -from ..PFC.pfc_manager import PFCManager -from ..heartFC_chat.heartflow_processor import HeartFCProcessor -from ..utils.prompt_builder import Prompt, global_prompt_manager -from ...config.config import global_config +from src.chat.message_receive.chat_stream import chat_manager +from src.chat.message_receive.message import MessageRecv +from src.experimental.only_message_process import MessageProcessor +from src.experimental.PFC.pfc_manager import PFCManager +from src.chat.focus_chat.heartflow_processor import HeartFCProcessor +from src.chat.utils.prompt_builder import Prompt, global_prompt_manager +from src.config.config import global_config # 定义日志配置 diff --git a/src/plugins/chat/chat_stream.py b/src/chat/message_receive/chat_stream.py similarity index 100% rename from src/plugins/chat/chat_stream.py rename to src/chat/message_receive/chat_stream.py diff --git a/src/plugins/chat/message.py b/src/chat/message_receive/message.py similarity index 99% rename from src/plugins/chat/message.py rename to src/chat/message_receive/message.py index 578b8edc3..a42a11a82 100644 --- a/src/plugins/chat/message.py +++ b/src/chat/message_receive/message.py @@ -7,7 +7,7 @@ import urllib3 from src.common.logger_manager import get_logger from .chat_stream import ChatStream -from .utils_image import image_manager +from ..utils.utils_image import image_manager from maim_message import Seg, UserInfo, BaseMessageInfo, MessageBase from rich.traceback import install diff --git a/src/plugins/chat/message_buffer.py b/src/chat/message_receive/message_buffer.py similarity index 100% rename from src/plugins/chat/message_buffer.py rename to src/chat/message_receive/message_buffer.py diff --git a/src/plugins/chat/message_sender.py b/src/chat/message_receive/message_sender.py similarity index 98% rename from src/plugins/chat/message_sender.py rename to src/chat/message_receive/message_sender.py index 408c59a00..5db34fdea 100644 --- a/src/plugins/chat/message_sender.py +++ b/src/chat/message_receive/message_sender.py @@ -3,14 +3,14 @@ import asyncio import time from asyncio import Task from typing import Union -from src.plugins.message.api import global_api +from src.common.message.api import global_api # from ...common.database import db # 数据库依赖似乎不需要了,注释掉 from .message import MessageSending, MessageThinking, MessageSet -from ..storage.storage import MessageStorage +from .storage import MessageStorage from ...config.config import global_config -from .utils import truncate_message, calculate_typing_time, count_messages_between +from ..utils.utils import truncate_message, calculate_typing_time, count_messages_between from src.common.logger_manager import get_logger from rich.traceback import install diff --git a/src/plugins/storage/storage.py b/src/chat/message_receive/storage.py similarity index 96% rename from src/plugins/storage/storage.py rename to src/chat/message_receive/storage.py index 34864d2cf..cae029a11 100644 --- a/src/plugins/storage/storage.py +++ b/src/chat/message_receive/storage.py @@ -2,8 +2,8 @@ import re from typing import Union from ...common.database import db -from ..chat.message import MessageSending, MessageRecv -from ..chat.chat_stream import ChatStream +from .message import MessageSending, MessageRecv +from .chat_stream import ChatStream from src.common.logger import get_module_logger logger = get_module_logger("message_storage") diff --git a/src/plugins/models/utils_model.py b/src/chat/models/utils_model.py similarity index 99% rename from src/plugins/models/utils_model.py rename to src/chat/models/utils_model.py index 8ee219562..18c9c7374 100644 --- a/src/plugins/models/utils_model.py +++ b/src/chat/models/utils_model.py @@ -157,7 +157,7 @@ class LLMRequest: completion_tokens: 输出token数 total_tokens: 总token数 user_id: 用户ID,默认为system - request_type: 请求类型(chat/embedding/image/topic/schedule) + request_type: 请求类型 endpoint: API端点 """ # 如果 request_type 为 None,则使用实例变量中的值 diff --git a/src/plugins/heartFC_chat/normal_chat.py b/src/chat/normal_chat/normal_chat.py similarity index 97% rename from src/plugins/heartFC_chat/normal_chat.py rename to src/chat/normal_chat/normal_chat.py index 149097fc7..906c515a6 100644 --- a/src/plugins/heartFC_chat/normal_chat.py +++ b/src/chat/normal_chat/normal_chat.py @@ -10,17 +10,17 @@ from maim_message import UserInfo, Seg from src.common.logger_manager import get_logger from src.heart_flow.utils_chat import get_chat_type_and_target_info from src.manager.mood_manager import mood_manager -from src.plugins.chat.chat_stream import ChatStream, chat_manager -from src.plugins.person_info.relationship_manager import relationship_manager -from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager -from src.plugins.utils.timer_calculator import Timer +from src.chat.message_receive.chat_stream import ChatStream, chat_manager +from src.chat.person_info.relationship_manager import relationship_manager +from src.chat.utils.info_catcher import info_catcher_manager +from src.chat.utils.timer_calculator import Timer from .normal_chat_generator import NormalChatGenerator -from ..chat.message import MessageSending, MessageRecv, MessageThinking, MessageSet -from ..chat.message_sender import message_manager -from ..chat.utils_image import image_path_to_base64 -from ..emoji_system.emoji_manager import emoji_manager -from ..willing.willing_manager import willing_manager -from ...config.config import global_config +from ..message_receive.message import MessageSending, MessageRecv, MessageThinking, MessageSet +from src.chat.message_receive.message_sender import message_manager +from src.chat.utils.utils_image import image_path_to_base64 +from src.chat.emoji_system.emoji_manager import emoji_manager +from src.chat.normal_chat.willing.willing_manager import willing_manager +from src.config.config import global_config logger = get_logger("chat") diff --git a/src/plugins/heartFC_chat/normal_chat_generator.py b/src/chat/normal_chat/normal_chat_generator.py similarity index 95% rename from src/plugins/heartFC_chat/normal_chat_generator.py rename to src/chat/normal_chat/normal_chat_generator.py index ea698bf2c..aec65ed1d 100644 --- a/src/plugins/heartFC_chat/normal_chat_generator.py +++ b/src/chat/normal_chat/normal_chat_generator.py @@ -2,12 +2,12 @@ from typing import List, Optional, Tuple, Union import random from ..models.utils_model import LLMRequest from ...config.config import global_config -from ..chat.message import MessageThinking -from .heartflow_prompt_builder import prompt_builder -from ..chat.utils import process_llm_response -from ..utils.timer_calculator import Timer +from ..message_receive.message import MessageThinking +from src.chat.focus_chat.heartflow_prompt_builder import prompt_builder +from src.chat.utils.utils import process_llm_response +from src.chat.utils.timer_calculator import Timer from src.common.logger_manager import get_logger -from src.plugins.respon_info_catcher.info_catcher import info_catcher_manager +from src.chat.utils.info_catcher import info_catcher_manager logger = get_logger("llm") diff --git a/src/plugins/willing/mode_classical.py b/src/chat/normal_chat/willing/mode_classical.py similarity index 100% rename from src/plugins/willing/mode_classical.py rename to src/chat/normal_chat/willing/mode_classical.py diff --git a/src/plugins/willing/mode_custom.py b/src/chat/normal_chat/willing/mode_custom.py similarity index 100% rename from src/plugins/willing/mode_custom.py rename to src/chat/normal_chat/willing/mode_custom.py diff --git a/src/plugins/willing/mode_mxp.py b/src/chat/normal_chat/willing/mode_mxp.py similarity index 100% rename from src/plugins/willing/mode_mxp.py rename to src/chat/normal_chat/willing/mode_mxp.py diff --git a/src/plugins/willing/willing_manager.py b/src/chat/normal_chat/willing/willing_manager.py similarity index 96% rename from src/plugins/willing/willing_manager.py rename to src/chat/normal_chat/willing/willing_manager.py index ba1e3e097..37e623d11 100644 --- a/src/plugins/willing/willing_manager.py +++ b/src/chat/normal_chat/willing/willing_manager.py @@ -1,9 +1,9 @@ from src.common.logger import LogConfig, WILLING_STYLE_CONFIG, LoguruLogger, get_module_logger from dataclasses import dataclass -from ...config.config import global_config, BotConfig -from ..chat.chat_stream import ChatStream, GroupInfo -from ..chat.message import MessageRecv -from ..person_info.person_info import person_info_manager, PersonInfoManager +from src.config.config import global_config, BotConfig +from src.chat.message_receive.chat_stream import ChatStream, GroupInfo +from src.chat.message_receive.message import MessageRecv +from src.chat.person_info.person_info import person_info_manager, PersonInfoManager from abc import ABC, abstractmethod import importlib from typing import Dict, Optional diff --git a/src/plugins/person_info/person_info.py b/src/chat/person_info/person_info.py similarity index 99% rename from src/plugins/person_info/person_info.py rename to src/chat/person_info/person_info.py index fe4069024..605b86b23 100644 --- a/src/plugins/person_info/person_info.py +++ b/src/chat/person_info/person_info.py @@ -6,7 +6,7 @@ from typing import Any, Callable, Dict import datetime import asyncio import numpy as np -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config from src.individuality.individuality import Individuality diff --git a/src/plugins/person_info/relationship_manager.py b/src/chat/person_info/relationship_manager.py similarity index 99% rename from src/plugins/person_info/relationship_manager.py rename to src/chat/person_info/relationship_manager.py index e9dad4b74..61743b160 100644 --- a/src/plugins/person_info/relationship_manager.py +++ b/src/chat/person_info/relationship_manager.py @@ -1,5 +1,5 @@ from src.common.logger_manager import get_logger -from ..chat.chat_stream import ChatStream +from ..message_receive.chat_stream import ChatStream import math from bson.decimal128 import Decimal128 from .person_info import person_info_manager diff --git a/src/plugins/utils/chat_message_builder.py b/src/chat/utils/chat_message_builder.py similarity index 97% rename from src/plugins/utils/chat_message_builder.py rename to src/chat/utils/chat_message_builder.py index 1deec4a4f..dcd98e19d 100644 --- a/src/plugins/utils/chat_message_builder.py +++ b/src/chat/utils/chat_message_builder.py @@ -1,24 +1,11 @@ from src.config.config import global_config - -# 不再直接使用 db -# from src.common.database import db -# 移除 logger 和 traceback,因为错误处理移至 repository -# from src.common.logger import get_module_logger -# import traceback from typing import List, Dict, Any, Tuple # 确保类型提示被导入 import time # 导入 time 模块以获取当前时间 import random import re - -# 导入新的 repository 函数 from src.common.message_repository import find_messages, count_messages - -# 导入 PersonInfoManager 和时间转换工具 -from src.plugins.person_info.person_info import person_info_manager -from src.plugins.chat.utils import translate_timestamp_to_human_readable - -# 不再需要文件级别的 logger -# logger = get_module_logger(__name__) +from src.chat.person_info.person_info import person_info_manager +from src.chat.utils.utils import translate_timestamp_to_human_readable def get_raw_msg_by_timestamp( diff --git a/src/plugins/respon_info_catcher/info_catcher.py b/src/chat/utils/info_catcher.py similarity index 99% rename from src/plugins/respon_info_catcher/info_catcher.py rename to src/chat/utils/info_catcher.py index 32add8427..174bb5b49 100644 --- a/src/plugins/respon_info_catcher/info_catcher.py +++ b/src/chat/utils/info_catcher.py @@ -1,5 +1,5 @@ from src.config.config import global_config -from src.plugins.chat.message import MessageRecv, MessageSending, Message +from src.chat.message_receive.message import MessageRecv, MessageSending, Message from src.common.database import db import time import traceback diff --git a/src/plugins/utils/json_utils.py b/src/chat/utils/json_utils.py similarity index 100% rename from src/plugins/utils/json_utils.py rename to src/chat/utils/json_utils.py diff --git a/src/plugins/utils/logger_config.py b/src/chat/utils/logger_config.py similarity index 100% rename from src/plugins/utils/logger_config.py rename to src/chat/utils/logger_config.py diff --git a/src/plugins/utils/prompt_builder.py b/src/chat/utils/prompt_builder.py similarity index 100% rename from src/plugins/utils/prompt_builder.py rename to src/chat/utils/prompt_builder.py diff --git a/src/plugins/utils/statistic.py b/src/chat/utils/statistic.py similarity index 100% rename from src/plugins/utils/statistic.py rename to src/chat/utils/statistic.py diff --git a/src/plugins/utils/timer_calculator.py b/src/chat/utils/timer_calculator.py similarity index 100% rename from src/plugins/utils/timer_calculator.py rename to src/chat/utils/timer_calculator.py diff --git a/src/plugins/utils/typo_generator.py b/src/chat/utils/typo_generator.py similarity index 100% rename from src/plugins/utils/typo_generator.py rename to src/chat/utils/typo_generator.py diff --git a/src/plugins/chat/utils.py b/src/chat/utils/utils.py similarity index 99% rename from src/plugins/chat/utils.py rename to src/chat/utils/utils.py index c229f0a59..8fe8334b8 100644 --- a/src/plugins/chat/utils.py +++ b/src/chat/utils/utils.py @@ -10,9 +10,9 @@ from pymongo.errors import PyMongoError from src.common.logger import get_module_logger from src.manager.mood_manager import mood_manager -from .message import MessageRecv +from ..message_receive.message import MessageRecv from ..models.utils_model import LLMRequest -from ..utils.typo_generator import ChineseTypoGenerator +from .typo_generator import ChineseTypoGenerator from ...common.database import db from ...config.config import global_config diff --git a/src/plugins/chat/utils_image.py b/src/chat/utils/utils_image.py similarity index 100% rename from src/plugins/chat/utils_image.py rename to src/chat/utils/utils_image.py diff --git a/src/plugins/zhishi/knowledge_library.py b/src/chat/zhishi/knowledge_library.py similarity index 100% rename from src/plugins/zhishi/knowledge_library.py rename to src/chat/zhishi/knowledge_library.py diff --git a/src/common/logger.py b/src/common/logger.py index f7d6fb28e..490bf7c53 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -8,7 +8,7 @@ from dotenv import load_dotenv # 加载 .env 文件 -env_path = Path(__file__).resolve().parent.parent.parent / ".env" +env_path = Path(os.getcwd()) / ".env" load_dotenv(dotenv_path=env_path) # 保存原生处理器ID @@ -29,8 +29,7 @@ _handler_registry: dict[str, List[int]] = {} _custom_style_handlers: dict[Tuple[str, str], List[int]] = {} # 记录自定义样式处理器ID # 获取日志存储根地址 -current_file_path = Path(__file__).resolve() -ROOT_PATH = os.path.abspath(os.path.join(current_file_path, "..", "..")) +ROOT_PATH = os.getcwd() LOG_ROOT = str(ROOT_PATH) + "/" + "logs" SIMPLE_OUTPUT = os.getenv("SIMPLE_OUTPUT", "false").strip().lower() diff --git a/src/common/logger_manager.py b/src/common/logger_manager.py index 8aae71e10..e1cbcbacc 100644 --- a/src/common/logger_manager.py +++ b/src/common/logger_manager.py @@ -9,7 +9,6 @@ from src.common.logger import ( RELATION_STYLE_CONFIG, CONFIG_STYLE_CONFIG, HEARTFLOW_STYLE_CONFIG, - SCHEDULE_STYLE_CONFIG, LLM_STYLE_CONFIG, CHAT_STYLE_CONFIG, EMOJI_STYLE_CONFIG, @@ -56,7 +55,6 @@ MODULE_LOGGER_CONFIGS = { "relation": RELATION_STYLE_CONFIG, # 关系 "config": CONFIG_STYLE_CONFIG, # 配置 "heartflow": HEARTFLOW_STYLE_CONFIG, # 麦麦大脑袋 - "schedule": SCHEDULE_STYLE_CONFIG, # 在干嘛 "llm": LLM_STYLE_CONFIG, # 麦麦组织语言 "chat": CHAT_STYLE_CONFIG, # 见闻 "emoji": EMOJI_STYLE_CONFIG, # 表情包 diff --git a/src/plugins/message/__init__.py b/src/common/message/__init__.py similarity index 100% rename from src/plugins/message/__init__.py rename to src/common/message/__init__.py diff --git a/src/plugins/message/api.py b/src/common/message/api.py similarity index 100% rename from src/plugins/message/api.py rename to src/common/message/api.py diff --git a/src/plugins/remote/remote.py b/src/common/remote.py similarity index 100% rename from src/plugins/remote/remote.py rename to src/common/remote.py diff --git a/src/config/config.py b/src/config/config.py index e99bb7d87..bbd3b9236 100644 --- a/src/config/config.py +++ b/src/config/config.py @@ -2,7 +2,6 @@ import os import re from dataclasses import dataclass, field from typing import Dict, List, Optional -from dateutil import tz import tomli import tomlkit @@ -167,13 +166,6 @@ class BotConfig: gender: str = "男" # 性别 appearance: str = "用几句话描述外貌特征" # 外貌特征 - # schedule - ENABLE_SCHEDULE_GEN: bool = False # 是否启用日程生成 - PROMPT_SCHEDULE_GEN = "无日程" - SCHEDULE_DOING_UPDATE_INTERVAL: int = 300 # 日程表更新间隔 单位秒 - SCHEDULE_TEMPERATURE: float = 0.5 # 日程表温度,建议0.5-1.0 - TIME_ZONE: str = "Asia/Shanghai" # 时区 - # chat allow_focus_mode: bool = True # 是否允许专注聊天状态 @@ -374,24 +366,6 @@ class BotConfig: config.gender = identity_config.get("gender", config.gender) config.appearance = identity_config.get("appearance", config.appearance) - def schedule(parent: dict): - schedule_config = parent["schedule"] - config.ENABLE_SCHEDULE_GEN = schedule_config.get("enable_schedule_gen", config.ENABLE_SCHEDULE_GEN) - config.PROMPT_SCHEDULE_GEN = schedule_config.get("prompt_schedule_gen", config.PROMPT_SCHEDULE_GEN) - config.SCHEDULE_DOING_UPDATE_INTERVAL = schedule_config.get( - "schedule_doing_update_interval", config.SCHEDULE_DOING_UPDATE_INTERVAL - ) - logger.info( - f"载入自定义日程prompt:{schedule_config.get('prompt_schedule_gen', config.PROMPT_SCHEDULE_GEN)}" - ) - if config.INNER_VERSION in SpecifierSet(">=1.0.2"): - config.SCHEDULE_TEMPERATURE = schedule_config.get("schedule_temperature", config.SCHEDULE_TEMPERATURE) - time_zone = schedule_config.get("time_zone", config.TIME_ZONE) - if tz.gettz(time_zone) is None: - logger.error(f"无效的时区: {time_zone},使用默认值: {config.TIME_ZONE}") - else: - config.TIME_ZONE = time_zone - def emoji(parent: dict): emoji_config = parent["emoji"] config.EMOJI_CHECK_INTERVAL = emoji_config.get("check_interval", config.EMOJI_CHECK_INTERVAL) @@ -681,7 +655,6 @@ class BotConfig: "groups": {"func": groups, "support": ">=0.0.0"}, "personality": {"func": personality, "support": ">=0.0.0"}, "identity": {"func": identity, "support": ">=1.2.4"}, - "schedule": {"func": schedule, "support": ">=0.0.11", "necessary": False}, "emoji": {"func": emoji, "support": ">=0.0.0"}, "model": {"func": model, "support": ">=0.0.0"}, "memory": {"func": memory, "support": ">=0.0.0", "necessary": False}, diff --git a/src/plugins/PFC/action_planner.py b/src/experimental/PFC/action_planner.py similarity index 98% rename from src/plugins/PFC/action_planner.py rename to src/experimental/PFC/action_planner.py index 4770c6ce5..b4182c9aa 100644 --- a/src/plugins/PFC/action_planner.py +++ b/src/experimental/PFC/action_planner.py @@ -1,14 +1,14 @@ import time from typing import Tuple, Optional # 增加了 Optional from src.common.logger_manager import get_logger -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from .chat_observer import ChatObserver -from .pfc_utils import get_items_from_json +from src.chat.models.utils_model import LLMRequest +from src.config.config import global_config +from src.experimental.PFC.chat_observer import ChatObserver +from src.experimental.PFC.pfc_utils import get_items_from_json from src.individuality.individuality import Individuality -from .observation_info import ObservationInfo -from .conversation_info import ConversationInfo -from src.plugins.utils.chat_message_builder import build_readable_messages +from src.experimental.PFC.observation_info import ObservationInfo +from src.experimental.PFC.conversation_info import ConversationInfo +from src.chat.utils.chat_message_builder import build_readable_messages logger = get_logger("pfc_action_planner") diff --git a/src/plugins/PFC/chat_observer.py b/src/experimental/PFC/chat_observer.py similarity index 98% rename from src/plugins/PFC/chat_observer.py rename to src/experimental/PFC/chat_observer.py index 22cbf27d3..704eeb330 100644 --- a/src/plugins/PFC/chat_observer.py +++ b/src/experimental/PFC/chat_observer.py @@ -4,9 +4,13 @@ import traceback from typing import Optional, Dict, Any, List from src.common.logger import get_module_logger from maim_message import UserInfo -from ...config.config import global_config -from .chat_states import NotificationManager, create_new_message_notification, create_cold_chat_notification -from .message_storage import MongoDBMessageStorage +from src.config.config import global_config +from src.experimental.PFC.chat_states import ( + NotificationManager, + create_new_message_notification, + create_cold_chat_notification, +) +from src.experimental.PFC.message_storage import MongoDBMessageStorage from rich.traceback import install install(extra_lines=3) diff --git a/src/plugins/PFC/chat_states.py b/src/experimental/PFC/chat_states.py similarity index 100% rename from src/plugins/PFC/chat_states.py rename to src/experimental/PFC/chat_states.py diff --git a/src/plugins/PFC/conversation.py b/src/experimental/PFC/conversation.py similarity index 99% rename from src/plugins/PFC/conversation.py rename to src/experimental/PFC/conversation.py index 0bc4cae8d..0216e8e9e 100644 --- a/src/plugins/PFC/conversation.py +++ b/src/experimental/PFC/conversation.py @@ -3,11 +3,11 @@ import asyncio import datetime # from .message_storage import MongoDBMessageStorage -from src.plugins.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat +from src.chat.utils.chat_message_builder import build_readable_messages, get_raw_msg_before_timestamp_with_chat # from ...config.config import global_config from typing import Dict, Any, Optional -from ..chat.message import Message +from src.chat.message_receive.message import Message from .pfc_types import ConversationState from .pfc import ChatObserver, GoalAnalyzer from .message_sender import DirectMessageSender @@ -16,9 +16,9 @@ from .action_planner import ActionPlanner from .observation_info import ObservationInfo from .conversation_info import ConversationInfo # 确保导入 ConversationInfo from .reply_generator import ReplyGenerator -from ..chat.chat_stream import ChatStream -from maim_message import UserInfo -from src.plugins.chat.chat_stream import chat_manager +from src.chat.message_receive.chat_stream import ChatStream +from src.chat.message_receive.message import UserInfo +from src.chat.message_receive.chat_stream import chat_manager from .pfc_KnowledgeFetcher import KnowledgeFetcher from .waiter import Waiter diff --git a/src/plugins/PFC/conversation_info.py b/src/experimental/PFC/conversation_info.py similarity index 100% rename from src/plugins/PFC/conversation_info.py rename to src/experimental/PFC/conversation_info.py diff --git a/src/plugins/PFC/message_sender.py b/src/experimental/PFC/message_sender.py similarity index 87% rename from src/plugins/PFC/message_sender.py rename to src/experimental/PFC/message_sender.py index 12c2143ea..181bf171b 100644 --- a/src/plugins/PFC/message_sender.py +++ b/src/experimental/PFC/message_sender.py @@ -1,13 +1,13 @@ import time from typing import Optional from src.common.logger import get_module_logger -from ..chat.chat_stream import ChatStream -from ..chat.message import Message +from src.chat.message_receive.chat_stream import ChatStream +from src.chat.message_receive.message import Message from maim_message import UserInfo, Seg -from src.plugins.chat.message import MessageSending, MessageSet -from src.plugins.chat.message_sender import message_manager -from ..storage.storage import MessageStorage -from ...config.config import global_config +from src.chat.message_receive.message import MessageSending, MessageSet +from src.chat.message_receive.message_sender import message_manager +from src.chat.message_receive.storage import MessageStorage +from src.config.config import global_config from rich.traceback import install install(extra_lines=3) diff --git a/src/plugins/PFC/message_storage.py b/src/experimental/PFC/message_storage.py similarity index 100% rename from src/plugins/PFC/message_storage.py rename to src/experimental/PFC/message_storage.py diff --git a/src/plugins/PFC/observation_info.py b/src/experimental/PFC/observation_info.py similarity index 98% rename from src/plugins/PFC/observation_info.py rename to src/experimental/PFC/observation_info.py index c75729553..5e14bf1d6 100644 --- a/src/plugins/PFC/observation_info.py +++ b/src/experimental/PFC/observation_info.py @@ -2,9 +2,9 @@ from typing import List, Optional, Dict, Any, Set from maim_message import UserInfo import time from src.common.logger import get_module_logger -from .chat_observer import ChatObserver -from .chat_states import NotificationHandler, NotificationType, Notification -from src.plugins.utils.chat_message_builder import build_readable_messages +from src.experimental.PFC.chat_observer import ChatObserver +from src.experimental.PFC.chat_states import NotificationHandler, NotificationType, Notification +from src.chat.utils.chat_message_builder import build_readable_messages import traceback # 导入 traceback 用于调试 logger = get_module_logger("observation_info") diff --git a/src/plugins/PFC/pfc.py b/src/experimental/PFC/pfc.py similarity index 96% rename from src/plugins/PFC/pfc.py rename to src/experimental/PFC/pfc.py index b17ee21d9..84fb9f8dc 100644 --- a/src/plugins/PFC/pfc.py +++ b/src/experimental/PFC/pfc.py @@ -1,13 +1,13 @@ from typing import List, Tuple, TYPE_CHECKING from src.common.logger import get_module_logger -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from .chat_observer import ChatObserver -from .pfc_utils import get_items_from_json +from src.chat.models.utils_model import LLMRequest +from src.config.config import global_config +from src.experimental.PFC.chat_observer import ChatObserver +from src.experimental.PFC.pfc_utils import get_items_from_json from src.individuality.individuality import Individuality -from .conversation_info import ConversationInfo -from .observation_info import ObservationInfo -from src.plugins.utils.chat_message_builder import build_readable_messages +from src.experimental.PFC.conversation_info import ConversationInfo +from src.experimental.PFC.observation_info import ObservationInfo +from src.chat.utils.chat_message_builder import build_readable_messages from rich.traceback import install install(extra_lines=3) diff --git a/src/plugins/PFC/pfc_KnowledgeFetcher.py b/src/experimental/PFC/pfc_KnowledgeFetcher.py similarity index 88% rename from src/plugins/PFC/pfc_KnowledgeFetcher.py rename to src/experimental/PFC/pfc_KnowledgeFetcher.py index 0989339df..8ebc307e2 100644 --- a/src/plugins/PFC/pfc_KnowledgeFetcher.py +++ b/src/experimental/PFC/pfc_KnowledgeFetcher.py @@ -1,11 +1,11 @@ from typing import List, Tuple from src.common.logger import get_module_logger -from src.plugins.memory_system.Hippocampus import HippocampusManager -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from ..chat.message import Message -from ..knowledge.knowledge_lib import qa_manager -from ..utils.chat_message_builder import build_readable_messages +from src.chat.memory_system.Hippocampus import HippocampusManager +from src.chat.models.utils_model import LLMRequest +from src.config.config import global_config +from src.chat.message_receive.message import Message +from src.chat.knowledge.knowledge_lib import qa_manager +from src.chat.utils.chat_message_builder import build_readable_messages logger = get_module_logger("knowledge_fetcher") diff --git a/src/plugins/PFC/pfc_manager.py b/src/experimental/PFC/pfc_manager.py similarity index 100% rename from src/plugins/PFC/pfc_manager.py rename to src/experimental/PFC/pfc_manager.py diff --git a/src/plugins/PFC/pfc_types.py b/src/experimental/PFC/pfc_types.py similarity index 100% rename from src/plugins/PFC/pfc_types.py rename to src/experimental/PFC/pfc_types.py diff --git a/src/plugins/PFC/pfc_utils.py b/src/experimental/PFC/pfc_utils.py similarity index 100% rename from src/plugins/PFC/pfc_utils.py rename to src/experimental/PFC/pfc_utils.py diff --git a/src/plugins/PFC/reply_checker.py b/src/experimental/PFC/reply_checker.py similarity index 98% rename from src/plugins/PFC/reply_checker.py rename to src/experimental/PFC/reply_checker.py index 35e9af500..a76e8a0da 100644 --- a/src/plugins/PFC/reply_checker.py +++ b/src/experimental/PFC/reply_checker.py @@ -1,9 +1,9 @@ import json from typing import Tuple, List, Dict, Any from src.common.logger import get_module_logger -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from .chat_observer import ChatObserver +from src.chat.models.utils_model import LLMRequest +from src.config.config import global_config +from src.experimental.PFC.chat_observer import ChatObserver from maim_message import UserInfo logger = get_module_logger("reply_checker") diff --git a/src/plugins/PFC/reply_generator.py b/src/experimental/PFC/reply_generator.py similarity index 97% rename from src/plugins/PFC/reply_generator.py rename to src/experimental/PFC/reply_generator.py index 890f807c7..6dcda69af 100644 --- a/src/plugins/PFC/reply_generator.py +++ b/src/experimental/PFC/reply_generator.py @@ -1,13 +1,13 @@ from typing import Tuple, List, Dict, Any from src.common.logger import get_module_logger -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from .chat_observer import ChatObserver -from .reply_checker import ReplyChecker +from src.chat.models.utils_model import LLMRequest +from src.config.config import global_config +from src.experimental.PFC.chat_observer import ChatObserver +from src.experimental.PFC.reply_checker import ReplyChecker from src.individuality.individuality import Individuality from .observation_info import ObservationInfo from .conversation_info import ConversationInfo -from src.plugins.utils.chat_message_builder import build_readable_messages +from src.chat.utils.chat_message_builder import build_readable_messages logger = get_module_logger("reply_generator") diff --git a/src/plugins/PFC/waiter.py b/src/experimental/PFC/waiter.py similarity index 98% rename from src/plugins/PFC/waiter.py rename to src/experimental/PFC/waiter.py index 0f5881fc0..af5cf7ad0 100644 --- a/src/plugins/PFC/waiter.py +++ b/src/experimental/PFC/waiter.py @@ -3,7 +3,7 @@ from .chat_observer import ChatObserver from .conversation_info import ConversationInfo # from src.individuality.individuality import Individuality # 不再需要 -from ...config.config import global_config +from src.config.config import global_config import time import asyncio diff --git a/src/plugins/chat/only_message_process.py b/src/experimental/only_message_process.py similarity index 95% rename from src/plugins/chat/only_message_process.py rename to src/experimental/only_message_process.py index b1bb0cea5..3d1432703 100644 --- a/src/plugins/chat/only_message_process.py +++ b/src/experimental/only_message_process.py @@ -1,6 +1,6 @@ from src.common.logger_manager import get_logger -from src.plugins.chat.message import MessageRecv -from src.plugins.storage.storage import MessageStorage +from src.chat.message_receive.message import MessageRecv +from src.chat.message_receive.storage import MessageStorage from src.config.config import global_config from datetime import datetime diff --git a/src/heart_flow/heartflow.py b/src/heart_flow/heartflow.py index b9c3b3c42..d9cc6196b 100644 --- a/src/heart_flow/heartflow.py +++ b/src/heart_flow/heartflow.py @@ -1,11 +1,10 @@ from src.heart_flow.sub_heartflow import SubHeartflow, ChatState -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config -from src.plugins.schedule.schedule_generator import bot_schedule from src.common.logger_manager import get_logger from typing import Any, Optional from src.tools.tool_use import ToolUser -from src.plugins.person_info.relationship_manager import relationship_manager # Module instance +from src.chat.person_info.relationship_manager import relationship_manager # Module instance from src.heart_flow.mai_state_manager import MaiStateInfo, MaiStateManager from src.heart_flow.subheartflow_manager import SubHeartflowManager from src.heart_flow.interest_logger import InterestLogger # Import InterestLogger @@ -94,16 +93,5 @@ class Heartflow: await self.subheartflow_manager.deactivate_all_subflows() logger.info("[Heartflow] 所有任务和子心流已停止") - async def do_a_thinking(self): - """执行一次主心流思考过程""" - schedule_info = bot_schedule.get_current_num_task(num=4, time_info=True) - new_mind = await self.mind.do_a_thinking( - current_main_mind=self.current_mind, mai_state_info=self.current_state, schedule_info=schedule_info - ) - self.past_mind.append(self.current_mind) - self.current_mind = new_mind - logger.info(f"麦麦的总体脑内状态更新为:{self.current_mind[:100]}...") - self.mind.update_subflows_with_main_mind(new_mind) - heartflow = Heartflow() diff --git a/src/heart_flow/interest_chatting.py b/src/heart_flow/interest_chatting.py index 4525d09d2..45f7fe952 100644 --- a/src/heart_flow/interest_chatting.py +++ b/src/heart_flow/interest_chatting.py @@ -3,7 +3,7 @@ from src.config.config import global_config from typing import Optional, Dict import traceback from src.common.logger_manager import get_logger -from src.plugins.chat.message import MessageRecv +from src.chat.message_receive.message import MessageRecv import math diff --git a/src/heart_flow/interest_logger.py b/src/heart_flow/interest_logger.py index fb33a6f63..7428b8a7b 100644 --- a/src/heart_flow/interest_logger.py +++ b/src/heart_flow/interest_logger.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Dict, List from src.common.logger_manager import get_logger # Need chat_manager to get stream names -from src.plugins.chat.chat_stream import chat_manager +from src.chat.message_receive.chat_stream import chat_manager if TYPE_CHECKING: from src.heart_flow.subheartflow_manager import SubHeartflowManager diff --git a/src/heart_flow/observation/chatting_observation.py b/src/heart_flow/observation/chatting_observation.py index a8d6a807d..f4fd4dd17 100644 --- a/src/heart_flow/observation/chatting_observation.py +++ b/src/heart_flow/observation/chatting_observation.py @@ -1,22 +1,22 @@ from datetime import datetime -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config import traceback -from src.plugins.utils.chat_message_builder import ( +from src.chat.utils.chat_message_builder import ( get_raw_msg_before_timestamp_with_chat, build_readable_messages, get_raw_msg_by_timestamp_with_chat, num_new_messages_since, get_person_id_list, ) -from src.plugins.utils.prompt_builder import global_prompt_manager +from src.chat.utils.prompt_builder import global_prompt_manager from typing import Optional import difflib -from src.plugins.chat.message import MessageRecv # 添加 MessageRecv 导入 +from src.chat.message_receive.message import MessageRecv # 添加 MessageRecv 导入 from src.heart_flow.observation.observation import Observation from src.common.logger_manager import get_logger from src.heart_flow.utils_chat import get_chat_type_and_target_info -from src.plugins.utils.prompt_builder import Prompt +from src.chat.utils.prompt_builder import Prompt logger = get_logger(__name__) diff --git a/src/heart_flow/observation/hfcloop_observation.py b/src/heart_flow/observation/hfcloop_observation.py index a9dd93202..f2f336710 100644 --- a/src/heart_flow/observation/hfcloop_observation.py +++ b/src/heart_flow/observation/hfcloop_observation.py @@ -2,7 +2,7 @@ # 外部世界可以是某个聊天 不同平台的聊天 也可以是任意媒体 from datetime import datetime from src.common.logger_manager import get_logger -from src.plugins.heartFC_chat.heartFC_Cycleinfo import CycleDetail +from src.chat.focus_chat.heartFC_Cycleinfo import CycleDetail from typing import List # Import the new utility function diff --git a/src/heart_flow/observation/memory_observation.py b/src/heart_flow/observation/memory_observation.py index 52c8aeaff..213de89cd 100644 --- a/src/heart_flow/observation/memory_observation.py +++ b/src/heart_flow/observation/memory_observation.py @@ -4,7 +4,7 @@ from src.common.logger_manager import get_logger import traceback # Import the new utility function -from src.plugins.memory_system.Hippocampus import HippocampusManager +from src.chat.memory_system.Hippocampus import HippocampusManager import jieba from typing import List diff --git a/src/heart_flow/sub_heartflow.py b/src/heart_flow/sub_heartflow.py index a9c79df18..9dd1067ae 100644 --- a/src/heart_flow/sub_heartflow.py +++ b/src/heart_flow/sub_heartflow.py @@ -5,10 +5,10 @@ import time from typing import Optional, List, Dict, Tuple, Callable, Coroutine import traceback from src.common.logger_manager import get_logger -from src.plugins.chat.message import MessageRecv -from src.plugins.chat.chat_stream import chat_manager -from src.plugins.heartFC_chat.heartFC_chat import HeartFChatting -from src.plugins.heartFC_chat.normal_chat import NormalChat +from src.chat.message_receive.message import MessageRecv +from src.chat.message_receive.chat_stream import chat_manager +from src.chat.focus_chat.heartFC_chat import HeartFChatting +from src.chat.normal_chat.normal_chat import NormalChat from src.heart_flow.mai_state_manager import MaiStateInfo from src.heart_flow.chat_state_info import ChatState, ChatStateInfo from .utils_chat import get_chat_type_and_target_info @@ -58,7 +58,7 @@ class SubHeartflow: self.should_stop = False # 停止标志 self.task: Optional[asyncio.Task] = None # 后台任务 - # 随便水群 normal_chat 和 认真水群 heartFC_chat 实例 + # 随便水群 normal_chat 和 认真水群 focus_chat 实例 # CHAT模式激活 随便水群 FOCUS模式激活 认真水群 self.heart_fc_instance: Optional[HeartFChatting] = None # 该sub_heartflow的HeartFChatting实例 self.normal_chat_instance: Optional[NormalChat] = None # 该sub_heartflow的NormalChat实例 diff --git a/src/heart_flow/subheartflow_manager.py b/src/heart_flow/subheartflow_manager.py index 60ab002e5..0aa21c19d 100644 --- a/src/heart_flow/subheartflow_manager.py +++ b/src/heart_flow/subheartflow_manager.py @@ -9,7 +9,7 @@ import functools # <-- 新增导入 from src.common.logger_manager import get_logger # 导入聊天流管理模块 -from src.plugins.chat.chat_stream import chat_manager +from src.chat.message_receive.chat_stream import chat_manager # 导入心流相关类 from src.heart_flow.sub_heartflow import SubHeartflow, ChatState @@ -17,7 +17,7 @@ from src.heart_flow.mai_state_manager import MaiStateInfo from src.heart_flow.observation.chatting_observation import ChattingObservation # 导入LLM请求工具 -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config from src.individuality.individuality import Individuality import traceback diff --git a/src/heart_flow/utils_chat.py b/src/heart_flow/utils_chat.py index c3f81a14a..68d5cb1bc 100644 --- a/src/heart_flow/utils_chat.py +++ b/src/heart_flow/utils_chat.py @@ -1,8 +1,8 @@ import asyncio from typing import Optional, Tuple, Dict from src.common.logger_manager import get_logger -from src.plugins.chat.chat_stream import chat_manager -from src.plugins.person_info.person_info import person_info_manager +from src.chat.message_receive.chat_stream import chat_manager +from src.chat.person_info.person_info import person_info_manager logger = get_logger("heartflow_utils") diff --git a/src/main.py b/src/main.py index 99f098920..903d5cdd8 100644 --- a/src/main.py +++ b/src/main.py @@ -1,28 +1,25 @@ import asyncio import time - from maim_message import MessageServer - -from .plugins.remote.remote import TelemetryHeartBeatTask +from .common.remote import TelemetryHeartBeatTask from .manager.async_task_manager import async_task_manager -from .plugins.utils.statistic import OnlineTimeRecordTask, StatisticOutputTask +from .chat.utils.statistic import OnlineTimeRecordTask, StatisticOutputTask from .manager.mood_manager import MoodPrintTask, MoodUpdateTask -from .plugins.schedule.schedule_generator import bot_schedule -from .plugins.emoji_system.emoji_manager import emoji_manager -from .plugins.person_info.person_info import person_info_manager -from .plugins.willing.willing_manager import willing_manager -from .plugins.chat.chat_stream import chat_manager +from .chat.emoji_system.emoji_manager import emoji_manager +from .chat.person_info.person_info import person_info_manager +from .chat.normal_chat.willing.willing_manager import willing_manager +from .chat.message_receive.chat_stream import chat_manager from .heart_flow.heartflow import heartflow -from .plugins.memory_system.Hippocampus import HippocampusManager -from .plugins.chat.message_sender import message_manager -from .plugins.storage.storage import MessageStorage +from .chat.memory_system.Hippocampus import HippocampusManager +from .chat.message_receive.message_sender import message_manager +from .chat.message_receive.storage import MessageStorage from .config.config import global_config -from .plugins.chat.bot import chat_bot +from .chat.message_receive.bot import chat_bot from .common.logger_manager import get_logger from .individuality.individuality import Individuality from .common.server import global_server, Server from rich.traceback import install -from .plugins.heartFC_chat.expressors.exprssion_learner import expression_learner +from .chat.focus_chat.expressors.exprssion_learner import expression_learner from .api.main import start_api_server install(extra_lines=3) @@ -36,7 +33,7 @@ class MainSystem: self.individuality: Individuality = Individuality.get_instance() # 使用消息API替代直接的FastAPI实例 - from .plugins.message import global_api + from src.common.message import global_api self.app: MessageServer = global_api self.server: Server = global_server @@ -90,15 +87,6 @@ class MainSystem: self.hippocampus_manager.initialize(global_config=global_config) # await asyncio.sleep(0.5) #防止logger输出飞了 - # 初始化日程 - bot_schedule.initialize( - name=global_config.BOT_NICKNAME, - personality=global_config.personality_core, - behavior=global_config.PROMPT_SCHEDULE_GEN, - interval=global_config.SCHEDULE_DOING_UPDATE_INTERVAL, - ) - asyncio.create_task(bot_schedule.mai_schedule_start()) - # 将bot.py中的chat_bot.message_process消息处理函数注册到api.py的消息处理基类中 self.app.register_message_handler(chat_bot.message_process) diff --git a/src/plugins/__init__.py b/src/plugins/__init__.py deleted file mode 100644 index 631d9bbb7..000000000 --- a/src/plugins/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -MaiMBot插件系统 -包含聊天、情绪、记忆、日程等功能模块 -""" - -from .chat.chat_stream import chat_manager -from .emoji_system.emoji_manager import emoji_manager -from .person_info.relationship_manager import relationship_manager -from .willing.willing_manager import willing_manager -from .schedule.schedule_generator import bot_schedule - -# 导出主要组件供外部使用 -__all__ = [ - "chat_manager", - "emoji_manager", - "relationship_manager", - "willing_manager", - "bot_schedule", -] diff --git a/src/plugins/chat/mapper.py b/src/plugins/chat/mapper.py deleted file mode 100644 index 2832d9914..000000000 --- a/src/plugins/chat/mapper.py +++ /dev/null @@ -1,190 +0,0 @@ -emojimapper = { - 5: "流泪", - 311: "打 call", - 312: "变形", - 314: "仔细分析", - 317: "菜汪", - 318: "崇拜", - 319: "比心", - 320: "庆祝", - 324: "吃糖", - 325: "惊吓", - 337: "花朵脸", - 338: "我想开了", - 339: "舔屏", - 341: "打招呼", - 342: "酸Q", - 343: "我方了", - 344: "大怨种", - 345: "红包多多", - 346: "你真棒棒", - 181: "戳一戳", - 74: "太阳", - 75: "月亮", - 351: "敲敲", - 349: "坚强", - 350: "贴贴", - 395: "略略略", - 114: "篮球", - 326: "生气", - 53: "蛋糕", - 137: "鞭炮", - 333: "烟花", - 424: "续标识", - 415: "划龙舟", - 392: "龙年快乐", - 425: "求放过", - 427: "偷感", - 426: "玩火", - 419: "火车", - 429: "蛇年快乐", - 14: "微笑", - 1: "撇嘴", - 2: "色", - 3: "发呆", - 4: "得意", - 6: "害羞", - 7: "闭嘴", - 8: "睡", - 9: "大哭", - 10: "尴尬", - 11: "发怒", - 12: "调皮", - 13: "呲牙", - 0: "惊讶", - 15: "难过", - 16: "酷", - 96: "冷汗", - 18: "抓狂", - 19: "吐", - 20: "偷笑", - 21: "可爱", - 22: "白眼", - 23: "傲慢", - 24: "饥饿", - 25: "困", - 26: "惊恐", - 27: "流汗", - 28: "憨笑", - 29: "悠闲", - 30: "奋斗", - 31: "咒骂", - 32: "疑问", - 33: "嘘", - 34: "晕", - 35: "折磨", - 36: "衰", - 37: "骷髅", - 38: "敲打", - 39: "再见", - 97: "擦汗", - 98: "抠鼻", - 99: "鼓掌", - 100: "糗大了", - 101: "坏笑", - 102: "左哼哼", - 103: "右哼哼", - 104: "哈欠", - 105: "鄙视", - 106: "委屈", - 107: "快哭了", - 108: "阴险", - 305: "右亲亲", - 109: "左亲亲", - 110: "吓", - 111: "可怜", - 172: "眨眼睛", - 182: "笑哭", - 179: "doge", - 173: "泪奔", - 174: "无奈", - 212: "托腮", - 175: "卖萌", - 178: "斜眼笑", - 177: "喷血", - 176: "小纠结", - 183: "我最美", - 262: "脑阔疼", - 263: "沧桑", - 264: "捂脸", - 265: "辣眼睛", - 266: "哦哟", - 267: "头秃", - 268: "问号脸", - 269: "暗中观察", - 270: "emm", - 271: "吃瓜", - 272: "呵呵哒", - 277: "汪汪", - 307: "喵喵", - 306: "牛气冲天", - 281: "无眼笑", - 282: "敬礼", - 283: "狂笑", - 284: "面无表情", - 285: "摸鱼", - 293: "摸锦鲤", - 286: "魔鬼笑", - 287: "哦", - 289: "睁眼", - 294: "期待", - 297: "拜谢", - 298: "元宝", - 299: "牛啊", - 300: "胖三斤", - 323: "嫌弃", - 332: "举牌牌", - 336: "豹富", - 353: "拜托", - 355: "耶", - 356: "666", - 354: "尊嘟假嘟", - 352: "咦", - 357: "裂开", - 334: "虎虎生威", - 347: "大展宏兔", - 303: "右拜年", - 302: "左拜年", - 295: "拿到红包", - 49: "拥抱", - 66: "爱心", - 63: "玫瑰", - 64: "凋谢", - 187: "幽灵", - 146: "爆筋", - 116: "示爱", - 67: "心碎", - 60: "咖啡", - 185: "羊驼", - 76: "赞", - 124: "OK", - 118: "抱拳", - 78: "握手", - 119: "勾引", - 79: "胜利", - 120: "拳头", - 121: "差劲", - 77: "踩", - 123: "NO", - 201: "点赞", - 273: "我酸了", - 46: "猪头", - 112: "菜刀", - 56: "刀", - 169: "手枪", - 171: "茶", - 59: "便便", - 144: "喝彩", - 147: "棒棒糖", - 89: "西瓜", - 41: "发抖", - 125: "转圈", - 42: "爱情", - 43: "跳跳", - 86: "怄火", - 129: "挥手", - 85: "飞吻", - 428: "收到", - 423: "复兴号", - 432: "灵蛇献瑞", -} diff --git a/src/plugins/schedule/schedule_generator.py b/src/plugins/schedule/schedule_generator.py deleted file mode 100644 index 6bd2e587a..000000000 --- a/src/plugins/schedule/schedule_generator.py +++ /dev/null @@ -1,307 +0,0 @@ -import datetime -import os -import sys -import asyncio -from dateutil import tz - -# 添加项目根目录到 Python 路径 -root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) -sys.path.append(root_path) - -from src.common.database import db # noqa: E402 -from src.common.logger import get_module_logger, SCHEDULE_STYLE_CONFIG, LogConfig # noqa: E402 -from src.plugins.models.utils_model import LLMRequest # noqa: E402 -from src.config.config import global_config # noqa: E402 - -TIME_ZONE = tz.gettz(global_config.TIME_ZONE) # 设置时区 - - -schedule_config = LogConfig( - # 使用海马体专用样式 - console_format=SCHEDULE_STYLE_CONFIG["console_format"], - file_format=SCHEDULE_STYLE_CONFIG["file_format"], -) -logger = get_module_logger("scheduler", config=schedule_config) - - -class ScheduleGenerator: - # enable_output: bool = True - - def __init__(self): - # 使用离线LLM模型 - self.enable_output = None - self.llm_scheduler_all = LLMRequest( - model=global_config.llm_reasoning, - temperature=global_config.SCHEDULE_TEMPERATURE + 0.3, - max_tokens=7000, - request_type="schedule", - ) - self.llm_scheduler_doing = LLMRequest( - model=global_config.llm_normal, - temperature=global_config.SCHEDULE_TEMPERATURE, - max_tokens=2048, - request_type="schedule", - ) - - self.today_schedule_text = "" - self.today_done_list = [] - - self.yesterday_schedule_text = "" - self.yesterday_done_list = [] - - self.name = "" - self.personality = "" - self.behavior = "" - - self.start_time = datetime.datetime.now(TIME_ZONE) - - self.schedule_doing_update_interval = 300 # 最好大于60 - - def initialize( - self, - name: str = "bot_name", - personality: str = "你是一个爱国爱党的新时代青年", - behavior: str = "你非常外向,喜欢尝试新事物和人交流", - interval: int = 60, - ): - """初始化日程系统""" - self.name = name - self.behavior = behavior - self.schedule_doing_update_interval = interval - self.personality = personality - - async def mai_schedule_start(self): - """启动日程系统,每5分钟执行一次move_doing,并在日期变化时重新检查日程""" - try: - if global_config.ENABLE_SCHEDULE_GEN: - logger.info(f"日程系统启动/刷新时间: {self.start_time.strftime('%Y-%m-%d %H:%M:%S')}") - # 初始化日程 - await self.check_and_create_today_schedule() - # self.print_schedule() - - while True: - # print(self.get_current_num_task(1, True)) - - current_time = datetime.datetime.now(TIME_ZONE) - - # 检查是否需要重新生成日程(日期变化) - if current_time.date() != self.start_time.date(): - logger.info("检测到日期变化,重新生成日程") - self.start_time = current_time - await self.check_and_create_today_schedule() - # self.print_schedule() - - # 执行当前活动 - # mind_thinking = heartflow.current_state.current_mind - - await self.move_doing() - - await asyncio.sleep(self.schedule_doing_update_interval) - else: - logger.info("日程系统未启用") - - except Exception as e: - logger.error(f"日程系统运行时出错: {str(e)}") - logger.exception("详细错误信息:") - - async def check_and_create_today_schedule(self): - """检查昨天的日程,并确保今天有日程安排 - - Returns: - tuple: (today_schedule_text, today_schedule) 今天的日程文本和解析后的日程字典 - """ - today = datetime.datetime.now(TIME_ZONE) - yesterday = today - datetime.timedelta(days=1) - - # 先检查昨天的日程 - self.yesterday_schedule_text, self.yesterday_done_list = self.load_schedule_from_db(yesterday) - if self.yesterday_schedule_text: - logger.debug(f"已加载{yesterday.strftime('%Y-%m-%d')}的日程") - - # 检查今天的日程 - self.today_schedule_text, self.today_done_list = self.load_schedule_from_db(today) - if not self.today_done_list: - self.today_done_list = [] - if not self.today_schedule_text: - logger.info(f"{today.strftime('%Y-%m-%d')}的日程不存在,准备生成新的日程") - try: - self.today_schedule_text = await self.generate_daily_schedule(target_date=today) - except Exception as e: - logger.error(f"生成日程时发生错误: {str(e)}") - self.today_schedule_text = "" - - self.save_today_schedule_to_db() - - def construct_daytime_prompt(self, target_date: datetime.datetime): - date_str = target_date.strftime("%Y-%m-%d") - weekday = target_date.strftime("%A") - - prompt = f"你是{self.name},{self.personality},{self.behavior}" - prompt += f"你昨天的日程是:{self.yesterday_schedule_text}\n" - prompt += f"请为你生成{date_str}({weekday}),也就是今天的日程安排,结合你的个人特点和行为习惯以及昨天的安排\n" - prompt += "推测你的日程安排,包括你一天都在做什么,从起床到睡眠,有什么发现和思考,具体一些,详细一些,需要1500字以上,精确到每半个小时,记得写明时间\n" # noqa: E501 - prompt += "直接返回你的日程,现实一点,不要浮夸,从起床到睡觉,不要输出其他内容:" - return prompt - - def construct_doing_prompt(self, time: datetime.datetime, mind_thinking: str = ""): - now_time = time.strftime("%H:%M") - previous_doings = self.get_current_num_task(5, True) - - prompt = f"你是{self.name},{self.personality},{self.behavior}" - prompt += f"你今天的日程是:{self.today_schedule_text}\n" - if previous_doings: - prompt += f"你之前做了的事情是:{previous_doings},从之前到现在已经过去了{self.schedule_doing_update_interval / 60}分钟了\n" # noqa: E501 - if mind_thinking: - prompt += f"你脑子里在想:{mind_thinking}\n" - prompt += f"现在是{now_time},结合你的个人特点和行为习惯,注意关注你今天的日程安排和想法安排你接下来做什么,现实一点,不要浮夸" - prompt += "安排你接下来做什么,具体一些,详细一些\n" - prompt += "直接返回你在做的事情,注意是当前时间,不要输出其他内容:" - return prompt - - async def generate_daily_schedule( - self, - target_date: datetime.datetime = None, - ) -> dict[str, str]: - daytime_prompt = self.construct_daytime_prompt(target_date) - daytime_response, _ = await self.llm_scheduler_all.generate_response_async(daytime_prompt) - return daytime_response - - def print_schedule(self): - """打印完整的日程安排""" - if not self.today_schedule_text: - logger.warning("今日日程有误,将在下次运行时重新生成") - db.schedule.delete_one({"date": datetime.datetime.now(TIME_ZONE).strftime("%Y-%m-%d")}) - else: - logger.info("=== 今日日程安排 ===") - logger.info(self.today_schedule_text) - logger.info("==================") - self.enable_output = False - - async def update_today_done_list(self): - # 更新数据库中的 today_done_list - today_str = datetime.datetime.now(TIME_ZONE).strftime("%Y-%m-%d") - existing_schedule = db.schedule.find_one({"date": today_str}) - - if existing_schedule: - # 更新数据库中的 today_done_list - db.schedule.update_one({"date": today_str}, {"$set": {"today_done_list": self.today_done_list}}) - logger.debug(f"已更新{today_str}的已完成活动列表") - else: - logger.warning(f"未找到{today_str}的日程记录") - - async def move_doing(self, mind_thinking: str = ""): - try: - current_time = datetime.datetime.now(TIME_ZONE) - if mind_thinking: - doing_prompt = self.construct_doing_prompt(current_time, mind_thinking) - else: - doing_prompt = self.construct_doing_prompt(current_time) - - doing_response, _ = await self.llm_scheduler_doing.generate_response_async(doing_prompt) - self.today_done_list.append((current_time, doing_response)) - - await self.update_today_done_list() - - logger.info(f"当前活动: {doing_response}") - - return doing_response - except GeneratorExit: - logger.warning("日程生成被中断") - return "日程生成被中断" - except Exception as e: - logger.error(f"生成日程时发生错误: {str(e)}") - return "生成日程时发生错误" - - async def get_task_from_time_to_time(self, start_time: str, end_time: str): - """获取指定时间范围内的任务列表 - - Args: - start_time (str): 开始时间,格式为"HH:MM" - end_time (str): 结束时间,格式为"HH:MM" - - Returns: - list: 时间范围内的任务列表 - """ - result = [] - for task in self.today_done_list: - task_time = task[0] # 获取任务的时间戳 - task_time_str = task_time.strftime("%H:%M") - - # 检查任务时间是否在指定范围内 - if self._time_diff(start_time, task_time_str) >= 0 and self._time_diff(task_time_str, end_time) >= 0: - result.append(task) - - return result - - def get_current_num_task(self, num=1, time_info=False): - """获取最新加入的指定数量的日程 - - Args: - num (int): 需要获取的日程数量,默认为1 - time_info (bool): 是否包含时间信息,默认为False - - Returns: - list: 最新加入的日程列表 - """ - if not self.today_done_list: - return [] - - # 确保num不超过列表长度 - num = min(num, len(self.today_done_list)) - pre_doings = "" - for doing in self.today_done_list[-num:]: - if time_info: - time_str = doing[0].strftime("%H:%M") - pre_doings += time_str + "时," + doing[1] + "\n" - else: - pre_doings += doing[1] + "\n" - - # 返回最新的num条日程 - return pre_doings - - def save_today_schedule_to_db(self): - """保存日程到数据库,同时初始化 today_done_list""" - date_str = datetime.datetime.now(TIME_ZONE).strftime("%Y-%m-%d") - schedule_data = { - "date": date_str, - "schedule": self.today_schedule_text, - "today_done_list": self.today_done_list if hasattr(self, "today_done_list") else [], - } - # 使用 upsert 操作,如果存在则更新,不存在则插入 - db.schedule.update_one({"date": date_str}, {"$set": schedule_data}, upsert=True) - logger.debug(f"已保存{date_str}的日程到数据库") - - @staticmethod - def load_schedule_from_db(date: datetime.datetime): - """从数据库加载日程,同时加载 today_done_list""" - date_str = date.strftime("%Y-%m-%d") - existing_schedule = db.schedule.find_one({"date": date_str}) - - if existing_schedule: - schedule_text = existing_schedule["schedule"] - return schedule_text, existing_schedule.get("today_done_list", []) - else: - logger.debug(f"{date_str}的日程不存在") - return None, None - - -async def main(): - # 使用示例 - scheduler = ScheduleGenerator() - scheduler.initialize( - name="麦麦", - personality="你叫麦麦,你19岁,是一个大二的女大学生,你有一头黑色短发,你会刷贴吧,你现在在学习心理学", - behavior="你比较内向,一般熬夜比较晚,然后第二天早上10点起床吃早午饭", - interval=60, - ) - await scheduler.mai_schedule_start() - - -# 当作为组件导入时使用的实例 -bot_schedule = ScheduleGenerator() - -if __name__ == "__main__": - import asyncio - - # 当直接运行此文件时执行 - asyncio.run(main()) diff --git a/src/plugins/topic_identify/topic_identifier.py b/src/plugins/topic_identify/topic_identifier.py deleted file mode 100644 index 25c290a3a..000000000 --- a/src/plugins/topic_identify/topic_identifier.py +++ /dev/null @@ -1,52 +0,0 @@ -from typing import List, Optional - - -from ..models.utils_model import LLMRequest -from ...config.config import global_config -from src.common.logger import get_module_logger, LogConfig, TOPIC_STYLE_CONFIG - -# 定义日志配置 -topic_config = LogConfig( - # 使用海马体专用样式 - console_format=TOPIC_STYLE_CONFIG["console_format"], - file_format=TOPIC_STYLE_CONFIG["file_format"], -) - -logger = get_module_logger("topic_identifier", config=topic_config) - - -class TopicIdentifier: - def __init__(self): - self.llm_topic_judge = LLMRequest(model=global_config.llm_topic_judge, request_type="topic") - - async def identify_topic_llm(self, text: str) -> Optional[List[str]]: - """识别消息主题,返回主题列表""" - - prompt = f"""判断这条消息的主题,如果没有明显主题请回复"无主题",要求: -1. 主题通常2-4个字,必须简短,要求精准概括,不要太具体。 -2. 建议给出多个主题,之间用英文逗号分割。只输出主题本身就好,不要有前后缀。 - -消息内容:{text}""" - - # 使用 LLMRequest 类进行请求 - try: - topic, _, _ = await self.llm_topic_judge.generate_response(prompt) - except Exception as e: - logger.error(f"LLM 请求topic失败: {e}") - return None - if not topic: - logger.error("LLM 得到的topic为空") - return None - - # 直接在这里处理主题解析 - if not topic or topic == "无主题": - return None - - # 解析主题字符串为列表 - topic_list = [t.strip() for t in topic.split(",") if t.strip()] - - logger.info(f"主题: {topic_list}") - return topic_list if topic_list else None - - -topic_identifier = TopicIdentifier() diff --git a/src/plugins/willing/mode_dynamic.py b/src/plugins/willing/mode_dynamic.py deleted file mode 100644 index 029da4e0f..000000000 --- a/src/plugins/willing/mode_dynamic.py +++ /dev/null @@ -1,233 +0,0 @@ -import asyncio -import random -import time -from typing import Dict -from .willing_manager import BaseWillingManager - - -class DynamicWillingManager(BaseWillingManager): - def __init__(self): - super().__init__() - self.chat_reply_willing: Dict[str, float] = {} # 存储每个聊天流的回复意愿 - self.chat_high_willing_mode: Dict[str, bool] = {} # 存储每个聊天流是否处于高回复意愿期 - self.chat_msg_count: Dict[str, int] = {} # 存储每个聊天流接收到的消息数量 - self.chat_last_mode_change: Dict[str, float] = {} # 存储每个聊天流上次模式切换的时间 - self.chat_high_willing_duration: Dict[str, int] = {} # 高意愿期持续时间(秒) - self.chat_low_willing_duration: Dict[str, int] = {} # 低意愿期持续时间(秒) - self.chat_last_reply_time: Dict[str, float] = {} # 存储每个聊天流上次回复的时间 - self.chat_last_sender_id: Dict[str, str] = {} # 存储每个聊天流上次回复的用户ID - self.chat_conversation_context: Dict[str, bool] = {} # 标记是否处于对话上下文中 - self._decay_task = None - self._mode_switch_task = None - - async def async_task_starter(self): - if self._decay_task is None: - self._decay_task = asyncio.create_task(self._decay_reply_willing()) - if self._mode_switch_task is None: - self._mode_switch_task = asyncio.create_task(self._mode_switch_check()) - - async def _decay_reply_willing(self): - """定期衰减回复意愿""" - while True: - await asyncio.sleep(5) - for chat_id in self.chat_reply_willing: - is_high_mode = self.chat_high_willing_mode.get(chat_id, False) - if is_high_mode: - # 高回复意愿期内轻微衰减 - self.chat_reply_willing[chat_id] = max(0.5, self.chat_reply_willing[chat_id] * 0.95) - else: - # 低回复意愿期内正常衰减 - self.chat_reply_willing[chat_id] = max(0, self.chat_reply_willing[chat_id] * 0.8) - - async def _mode_switch_check(self): - """定期检查是否需要切换回复意愿模式""" - while True: - current_time = time.time() - await asyncio.sleep(10) # 每10秒检查一次 - - for chat_id in self.chat_high_willing_mode: - last_change_time = self.chat_last_mode_change.get(chat_id, 0) - is_high_mode = self.chat_high_willing_mode.get(chat_id, False) - - # 获取当前模式的持续时间 - if is_high_mode: - duration = self.chat_high_willing_duration.get(chat_id, 180) # 默认3分钟 - else: - duration = self.chat_low_willing_duration.get(chat_id, random.randint(300, 1200)) # 默认5-20分钟 - - # 检查是否需要切换模式 - if current_time - last_change_time > duration: - self._switch_willing_mode(chat_id) - elif not is_high_mode and random.random() < 0.1: - # 低回复意愿期有10%概率随机切换到高回复期 - self._switch_willing_mode(chat_id) - - # 检查对话上下文状态是否需要重置 - last_reply_time = self.chat_last_reply_time.get(chat_id, 0) - if current_time - last_reply_time > 300: # 5分钟无交互,重置对话上下文 - self.chat_conversation_context[chat_id] = False - - def _switch_willing_mode(self, chat_id: str): - """切换聊天流的回复意愿模式""" - is_high_mode = self.chat_high_willing_mode.get(chat_id, False) - - if is_high_mode: - # 从高回复期切换到低回复期 - self.chat_high_willing_mode[chat_id] = False - self.chat_reply_willing[chat_id] = 0.1 # 设置为最低回复意愿 - self.chat_low_willing_duration[chat_id] = random.randint(600, 1200) # 10-20分钟 - self.logger.debug(f"聊天流 {chat_id} 切换到低回复意愿期,持续 {self.chat_low_willing_duration[chat_id]} 秒") - else: - # 从低回复期切换到高回复期 - self.chat_high_willing_mode[chat_id] = True - self.chat_reply_willing[chat_id] = 1.0 # 设置为较高回复意愿 - self.chat_high_willing_duration[chat_id] = random.randint(180, 240) # 3-4分钟 - self.logger.debug( - f"聊天流 {chat_id} 切换到高回复意愿期,持续 {self.chat_high_willing_duration[chat_id]} 秒" - ) - - self.chat_last_mode_change[chat_id] = time.time() - self.chat_msg_count[chat_id] = 0 # 重置消息计数 - - def _ensure_chat_initialized(self, chat_id: str): - """确保聊天流的所有数据已初始化""" - if chat_id not in self.chat_reply_willing: - self.chat_reply_willing[chat_id] = 0.1 - - if chat_id not in self.chat_high_willing_mode: - self.chat_high_willing_mode[chat_id] = False - self.chat_last_mode_change[chat_id] = time.time() - self.chat_low_willing_duration[chat_id] = random.randint(300, 1200) # 5-20分钟 - - if chat_id not in self.chat_msg_count: - self.chat_msg_count[chat_id] = 0 - - if chat_id not in self.chat_conversation_context: - self.chat_conversation_context[chat_id] = False - - async def get_reply_probability(self, message_id): - """改变指定聊天流的回复意愿并返回回复概率""" - # 获取或创建聊天流 - willing_info = self.ongoing_messages[message_id] - stream = willing_info.chat - chat_id = stream.stream_id - sender_id = str(willing_info.message.message_info.user_info.user_id) - current_time = time.time() - - self._ensure_chat_initialized(chat_id) - - # 增加消息计数 - self.chat_msg_count[chat_id] = self.chat_msg_count.get(chat_id, 0) + 1 - - current_willing = self.chat_reply_willing.get(chat_id, 0) - is_high_mode = self.chat_high_willing_mode.get(chat_id, False) - msg_count = self.chat_msg_count.get(chat_id, 0) - in_conversation_context = self.chat_conversation_context.get(chat_id, False) - - # 检查是否是对话上下文中的追问 - last_reply_time = self.chat_last_reply_time.get(chat_id, 0) - last_sender = self.chat_last_sender_id.get(chat_id, "") - - # 如果是同一个人在短时间内(2分钟内)发送消息,且消息数量较少(<=5条),视为追问 - if sender_id and sender_id == last_sender and current_time - last_reply_time < 120 and msg_count <= 5: - in_conversation_context = True - self.chat_conversation_context[chat_id] = True - self.logger.debug("检测到追问 (同一用户), 提高回复意愿") - current_willing += 0.3 - - # 特殊情况处理 - if willing_info.is_mentioned_bot: - current_willing += 0.5 - in_conversation_context = True - self.chat_conversation_context[chat_id] = True - self.logger.debug(f"被提及, 当前意愿: {current_willing}") - - if willing_info.is_emoji: - current_willing = self.global_config.emoji_response_penalty * 0.1 - self.logger.debug(f"表情包, 当前意愿: {current_willing}") - - # 根据话题兴趣度适当调整 - if willing_info.interested_rate > 0.5: - current_willing += ( - (willing_info.interested_rate - 0.5) * 0.5 * self.global_config.response_interested_rate_amplifier - ) - - # 根据当前模式计算回复概率 - if in_conversation_context: - # 在对话上下文中,降低基础回复概率 - base_probability = 0.5 if is_high_mode else 0.25 - self.logger.debug(f"处于对话上下文中,基础回复概率: {base_probability}") - elif is_high_mode: - # 高回复周期:4-8句话有50%的概率会回复一次 - base_probability = 0.50 if 4 <= msg_count <= 8 else 0.2 - else: - # 低回复周期:需要最少15句才有30%的概率会回一句 - base_probability = 0.30 if msg_count >= 15 else 0.03 * min(msg_count, 10) - - # 考虑回复意愿的影响 - reply_probability = base_probability * current_willing * self.global_config.response_willing_amplifier - - # 检查群组权限(如果是群聊) - if willing_info.group_info: - if willing_info.group_info.group_id in self.global_config.talk_frequency_down_groups: - reply_probability = reply_probability / self.global_config.down_frequency_rate - - # 限制最大回复概率 - reply_probability = min(reply_probability, 0.75) # 设置最大回复概率为75% - if reply_probability < 0: - reply_probability = 0 - - # 记录当前发送者ID以便后续追踪 - if sender_id: - self.chat_last_sender_id[chat_id] = sender_id - - self.chat_reply_willing[chat_id] = min(current_willing, 3.0) - - return reply_probability - - async def before_generate_reply_handle(self, message_id): - """开始思考后降低聊天流的回复意愿""" - stream = self.ongoing_messages[message_id].chat - if stream: - chat_id = stream.stream_id - self._ensure_chat_initialized(chat_id) - current_willing = self.chat_reply_willing.get(chat_id, 0) - - # 回复后减少回复意愿 - self.chat_reply_willing[chat_id] = max(0.0, current_willing - 0.3) - - # 标记为对话上下文中 - self.chat_conversation_context[chat_id] = True - - # 记录最后回复时间 - self.chat_last_reply_time[chat_id] = time.time() - - # 重置消息计数 - self.chat_msg_count[chat_id] = 0 - - async def not_reply_handle(self, message_id): - """决定不回复后提高聊天流的回复意愿""" - stream = self.ongoing_messages[message_id].chat - if stream: - chat_id = stream.stream_id - self._ensure_chat_initialized(chat_id) - is_high_mode = self.chat_high_willing_mode.get(chat_id, False) - current_willing = self.chat_reply_willing.get(chat_id, 0) - in_conversation_context = self.chat_conversation_context.get(chat_id, False) - - # 根据当前模式调整不回复后的意愿增加 - if is_high_mode: - willing_increase = 0.1 - elif in_conversation_context: - # 在对话上下文中但决定不回复,小幅增加回复意愿 - willing_increase = 0.15 - else: - willing_increase = random.uniform(0.05, 0.1) - - self.chat_reply_willing[chat_id] = min(2.0, current_willing + willing_increase) - - async def bombing_buffer_message_handle(self, message_id): - return await super().bombing_buffer_message_handle(message_id) - - async def after_generate_reply_handle(self, message_id): - return await super().after_generate_reply_handle(message_id) diff --git a/src/plugins/willing/mode_llmcheck.py b/src/plugins/willing/mode_llmcheck.py deleted file mode 100644 index 697621b11..000000000 --- a/src/plugins/willing/mode_llmcheck.py +++ /dev/null @@ -1,155 +0,0 @@ -""" -llmcheck 模式: -此模式的一些参数不会在配置文件中显示,要修改请在可变参数下修改 -此模式的特点: -1.在群聊内的连续对话场景下,使用大语言模型来判断回复概率 -2.非连续对话场景,使用mxp模式的意愿管理器(可另外配置) -3.默认配置的是model_v3,当前参数适用于deepseek-v3-0324 - -继承自其他模式,实质上仅重写get_reply_probability方法,未来可能重构成一个插件,可方便地组装到其他意愿模式上。 -目前的使用方式是拓展到其他意愿管理模式 - -""" - -import time -from loguru import logger -from ..models.utils_model import LLMRequest -from ...config.config import global_config - -# from ..chat.chat_stream import ChatStream -from ..chat.utils import get_recent_group_detailed_plain_text - -# from .willing_manager import BaseWillingManager -from .mode_mxp import MxpWillingManager -import re -from functools import wraps - - -def is_continuous_chat(self, message_id: str): - # 判断是否是连续对话,出于成本考虑,默认限制5条 - willing_info = self.ongoing_messages[message_id] - chat_id = willing_info.chat_id - group_info = willing_info.group_info - config = self.global_config - length = 5 - if chat_id: - chat_talking_text = get_recent_group_detailed_plain_text(chat_id, limit=length, combine=True) - if group_info: - if str(config.BOT_QQ) in chat_talking_text: - return True - else: - return False - return False - - -def llmcheck_decorator(trigger_condition_func): - def decorator(func): - @wraps(func) - def wrapper(self, message_id: str): - if trigger_condition_func(self, message_id): - # 满足条件,走llm流程 - return self.get_llmreply_probability(message_id) - else: - # 不满足条件,走默认流程 - return func(self, message_id) - - return wrapper - - return decorator - - -class LlmcheckWillingManager(MxpWillingManager): - def __init__(self): - super().__init__() - self.model_v3 = LLMRequest(model=global_config.llm_normal, temperature=0.3) - - async def get_llmreply_probability(self, message_id: str): - message_info = self.ongoing_messages[message_id] - chat_id = message_info.chat_id - config = self.global_config - # 获取信息的长度 - length = 5 - if message_info.group_info and config: - if message_info.group_info.group_id not in config.talk_allowed_groups: - reply_probability = 0 - return reply_probability - - current_date = time.strftime("%Y-%m-%d", time.localtime()) - current_time = time.strftime("%H:%M:%S", time.localtime()) - chat_talking_prompt = get_recent_group_detailed_plain_text(chat_id, limit=length, combine=True) - if not chat_id: - return 0 - - # if is_mentioned_bot: - # return 1.0 - prompt = f""" - 假设你正在查看一个群聊,你在这个群聊里的网名叫{global_config.BOT_NICKNAME},你还有很多别名: {"/".join(global_config.BOT_ALIAS_NAMES)}, - 现在群里聊天的内容是{chat_talking_prompt}, - 今天是{current_date},现在是{current_time}。 - 综合群内的氛围和你自己之前的发言,给出你认为**最新的消息**需要你回复的概率,数值在0到1之间。请注意,群聊内容杂乱,很多时候对话连续,但很可能不是在和你说话。 - 如果最新的消息和你之前的发言在内容上连续,或者提到了你的名字或者称谓,将其视作明确指向你的互动,给出高于0.8的概率。如果现在是睡眠时间,直接概率为0。如果话题内容与你之前不是紧密相关,请不要给出高于0.1的概率。 - 请注意是判断概率,而不是编写回复内容, - 仅输出在0到1区间内的概率值,不要给出你的判断依据。 - """ - - content_check, reasoning_check, _ = await self.model_v3.generate_response(prompt) - # logger.info(f"{prompt}") - logger.info(f"{content_check} {reasoning_check}") - probability = self.extract_marked_probability(content_check) - # 兴趣系数修正 无关激活效率太高,暂时停用,待新记忆系统上线后调整 - probability += message_info.interested_rate * 0.25 - probability = min(1.0, probability) - if probability <= 0.1: - probability = min(0.03, probability) - if probability >= 0.8: - probability = max(probability, 0.90) - - # 当前表情包理解能力较差,少说就少错 - if message_info.is_emoji: - probability *= global_config.emoji_response_penalty - - return probability - - @staticmethod - def extract_marked_probability(text): - """提取带标记的概率值 该方法主要用于测试微调prompt阶段""" - text = text.strip() - pattern = r"##PROBABILITY_START##(.*?)##PROBABILITY_END##" - match = re.search(pattern, text, re.DOTALL) - if match: - prob_str = match.group(1).strip() - # 处理百分比(65% → 0.65) - if "%" in prob_str: - return float(prob_str.replace("%", "")) / 100 - # 处理分数(2/3 → 0.666...) - elif "/" in prob_str: - numerator, denominator = map(float, prob_str.split("/")) - return numerator / denominator - # 直接处理小数 - else: - return float(prob_str) - - percent_match = re.search(r"(\d{1,3})%", text) # 65% - decimal_match = re.search(r"(0\.\d+|1\.0+)", text) # 0.65 - fraction_match = re.search(r"(\d+)/(\d+)", text) # 2/3 - try: - if percent_match: - prob = float(percent_match.group(1)) / 100 - elif decimal_match: - prob = float(decimal_match.group(0)) - elif fraction_match: - numerator, denominator = map(float, fraction_match.groups()) - prob = numerator / denominator - else: - return 0 # 无匹配格式 - - # 验证范围是否合法 - if 0 <= prob <= 1: - return prob - return 0 - except (ValueError, ZeroDivisionError): - return 0 - - @llmcheck_decorator(is_continuous_chat) - def get_reply_probability(self, message_id): - return super().get_reply_probability(message_id) diff --git a/src/tools/not_used/get_current_task.py b/src/tools/not_used/get_current_task.py deleted file mode 100644 index 1196d6083..000000000 --- a/src/tools/not_used/get_current_task.py +++ /dev/null @@ -1,60 +0,0 @@ -from src.tools.tool_can_use.base_tool import BaseTool -from src.plugins.schedule.schedule_generator import bot_schedule -from src.common.logger import get_module_logger -from typing import Any -from datetime import datetime - -logger = get_module_logger("get_current_task_tool") - - -class GetCurrentTaskTool(BaseTool): - """获取当前正在做的事情/最近的任务工具""" - - name = "get_schedule" - description = "获取当前正在做的事情,或者某个时间点/时间段的日程信息" - parameters = { - "type": "object", - "properties": { - "start_time": {"type": "string", "description": "开始时间,格式为'HH:MM',填写current则获取当前任务"}, - "end_time": {"type": "string", "description": "结束时间,格式为'HH:MM',填写current则获取当前任务"}, - }, - "required": ["start_time", "end_time"], - } - - async def execute(self, function_args: dict[str, Any], message_txt: str = "") -> dict[str, Any]: - """执行获取当前任务或指定时间段的日程信息 - - Args: - function_args: 工具参数 - message_txt: 原始消息文本,此工具不使用 - - Returns: - dict: 工具执行结果 - """ - start_time = function_args.get("start_time") - end_time = function_args.get("end_time") - - # 如果 start_time 或 end_time 为 "current",则获取当前任务 - if start_time == "current" or end_time == "current": - current_task = bot_schedule.get_current_num_task(num=1, time_info=True) - current_time = datetime.now().strftime("%H:%M:%S") - current_date = datetime.now().strftime("%Y-%m-%d") - if current_task: - task_info = f"{current_date} {current_time},你在{current_task}" - else: - task_info = f"{current_time} {current_date},没在做任何事情" - # 如果提供了时间范围,则获取该时间段的日程信息 - elif start_time and end_time: - tasks = await bot_schedule.get_task_from_time_to_time(start_time, end_time) - if tasks: - task_list = [] - for task in tasks: - task_time = task[0].strftime("%H:%M") - task_content = task[1] - task_list.append(f"{task_time}时,{task_content}") - task_info = "\n".join(task_list) - else: - task_info = f"在 {start_time} 到 {end_time} 之间没有找到日程信息" - else: - task_info = "请提供有效的开始时间和结束时间" - return {"name": "get_current_task", "content": f"日程信息: {task_info}"} diff --git a/src/tools/not_used/get_memory.py b/src/tools/not_used/get_memory.py index 0ae7e50cd..2f40d3813 100644 --- a/src/tools/not_used/get_memory.py +++ b/src/tools/not_used/get_memory.py @@ -1,5 +1,5 @@ from src.tools.tool_can_use.base_tool import BaseTool -from src.plugins.memory_system.Hippocampus import HippocampusManager +from src.chat.memory_system.Hippocampus import HippocampusManager from src.common.logger import get_module_logger from typing import Dict, Any diff --git a/src/tools/tool_can_use/get_knowledge.py b/src/tools/tool_can_use/get_knowledge.py index b17169c5b..65acd55c0 100644 --- a/src/tools/tool_can_use/get_knowledge.py +++ b/src/tools/tool_can_use/get_knowledge.py @@ -1,5 +1,5 @@ from src.tools.tool_can_use.base_tool import BaseTool -from src.plugins.chat.utils import get_embedding +from src.chat.utils.utils import get_embedding from src.common.database import db from src.common.logger_manager import get_logger from typing import Any, Union diff --git a/src/tools/tool_can_use/lpmm_get_knowledge.py b/src/tools/tool_can_use/lpmm_get_knowledge.py index d1a5e1e65..f7c0bd753 100644 --- a/src/tools/tool_can_use/lpmm_get_knowledge.py +++ b/src/tools/tool_can_use/lpmm_get_knowledge.py @@ -1,10 +1,10 @@ from src.tools.tool_can_use.base_tool import BaseTool -from src.plugins.chat.utils import get_embedding +from src.chat.utils.utils import get_embedding # from src.common.database import db from src.common.logger_manager import get_logger from typing import Dict, Any -from src.plugins.knowledge.knowledge_lib import qa_manager +from src.chat.knowledge.knowledge_lib import qa_manager logger = get_logger("lpmm_get_knowledge_tool") diff --git a/src/tools/tool_can_use/rename_person_tool.py b/src/tools/tool_can_use/rename_person_tool.py index f0a1a7fdf..c9914a4e4 100644 --- a/src/tools/tool_can_use/rename_person_tool.py +++ b/src/tools/tool_can_use/rename_person_tool.py @@ -1,5 +1,5 @@ from src.tools.tool_can_use.base_tool import BaseTool, register_tool -from src.plugins.person_info.person_info import person_info_manager +from src.chat.person_info.person_info import person_info_manager from src.common.logger_manager import get_logger import time diff --git a/src/tools/tool_use.py b/src/tools/tool_use.py index 6cd6a5ba6..8d3c991d2 100644 --- a/src/tools/tool_use.py +++ b/src/tools/tool_use.py @@ -1,12 +1,12 @@ -from src.plugins.models.utils_model import LLMRequest +from src.chat.models.utils_model import LLMRequest from src.config.config import global_config import json from src.common.logger_manager import get_logger from src.tools.tool_can_use import get_all_tool_definitions, get_tool_instance import traceback -from src.plugins.person_info.relationship_manager import relationship_manager -from src.plugins.chat.utils import parse_text_timestamps -from src.plugins.chat.chat_stream import ChatStream +from src.chat.person_info.relationship_manager import relationship_manager +from src.chat.utils.utils import parse_text_timestamps +from src.chat.message_receive.chat_stream import ChatStream from src.heart_flow.observation.chatting_observation import ChattingObservation logger = get_logger("tool_use") diff --git a/template/bot_config_meta.toml b/template/bot_config_meta.toml index 459b70268..c3541baad 100644 --- a/template/bot_config_meta.toml +++ b/template/bot_config_meta.toml @@ -63,36 +63,6 @@ describe = "外貌特征描述,该选项还在调试中,暂时未生效" important = false can_edit = true -[schedule.enable_schedule_gen] -describe = "是否启用日程表" -important = false -can_edit = true - -[schedule.enable_schedule_interaction] -describe = "日程表是否影响回复模式" -important = false -can_edit = true - -[schedule.prompt_schedule_gen] -describe = "用几句话描述描述性格特点或行动规律,这个特征会用来生成日程表" -important = false -can_edit = true - -[schedule.schedule_doing_update_interval] -describe = "日程表更新间隔,单位秒" -important = false -can_edit = true - -[schedule.schedule_temperature] -describe = "日程表温度,建议0.1-0.5" -important = false -can_edit = true - -[schedule.time_zone] -describe = "时区设置,可以解决运行电脑时区和国内时区不同的情况,或者模拟国外留学生日程" -important = false -can_edit = true - [platforms.nonebot-qq] describe = "nonebot-qq适配器提供的链接" important = true diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 00758d356..81bafe9c6 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -58,14 +58,6 @@ age = 20 # 年龄 单位岁 gender = "男" # 性别 appearance = "用几句话描述外貌特征" # 外貌特征 该选项还在调试中,暂时未生效 -[schedule] -enable_schedule_gen = true # 是否启用日程表 -enable_schedule_interaction = true # 日程表是否影响回复模式 -prompt_schedule_gen = "用几句话描述描述性格特点或行动规律,这个特征会用来生成日程表" -schedule_doing_update_interval = 900 # 日程表更新间隔 单位秒 -schedule_temperature = 0.1 # 日程表温度,建议0.1-0.5 -time_zone = "Asia/Shanghai" # 给你的机器人设置时区,可以解决运行电脑时区和国内时区不同的情况,或者模拟国外留学生日程 - [platforms] # 必填项目,填写每个平台适配器提供的链接 nonebot-qq="http://127.0.0.1:18002/api/message" @@ -99,7 +91,7 @@ model_normal_probability = 0.3 # 麦麦回答时选择一般模型 模型的概 emoji_chance = 0.2 # 麦麦一般回复时使用表情包的概率,设置为1让麦麦自己决定发不发 thinking_timeout = 100 # 麦麦最长思考时间,超过这个时间的思考会放弃(往往是api反应太慢) -willing_mode = "classical" # 回复意愿模式 —— 经典模式:classical,动态模式:dynamic,mxp模式:mxp,自定义模式:custom(需要你自己实现) +willing_mode = "classical" # 回复意愿模式 —— 经典模式:classical,mxp模式:mxp,自定义模式:custom(需要你自己实现) response_willing_amplifier = 1 # 麦麦回复意愿放大系数,一般为1 response_interested_rate_amplifier = 1 # 麦麦回复兴趣度放大系数,听到记忆里的内容时放大系数 down_frequency_rate = 3 # 降低回复频率的群组回复意愿降低系数 除法 diff --git a/template/template.env b/template/template.env index c1a6dd0dc..6165a0df9 100644 --- a/template/template.env +++ b/template/template.env @@ -1,9 +1,6 @@ HOST=127.0.0.1 PORT=8000 -# 插件配置 -PLUGINS=["src2.plugins.chat"] - # 默认配置 # 如果工作在Docker下,请改成 MONGODB_HOST=mongodb MONGODB_HOST=127.0.0.1