From 47e504e7156084d7a490a2e57e8abd2e3fca4ee4 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 12 Sep 2025 20:39:20 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(plugin):=20=E5=85=81=E8=AE=B8=E5=9C=A8?= =?UTF-8?q?Action=E5=86=85=E9=83=A8=E8=B0=83=E7=94=A8=E5=85=B6=E4=BB=96Act?= =?UTF-8?q?ion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在`BaseAction`中新增`call_action`方法,使得一个Action可以方便地调用并执行另一个已注册的Action。 该方法会: - 从组件注册中心查找并获取目标Action类。 - 复用当前Action的上下文信息(如`chat_stream`, `cycle_timers`等)来实例化目标Action。 - 执行目标Action并返回其执行结果。 这为创建更复杂、可组合的插件逻辑提供了基础,提高了代码的复用性和模块化程度。 --- .../chat_loop/proactive/proactive_thinker.py | 3 - src/plugin_system/base/base_action.py | 55 +++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/chat/chat_loop/proactive/proactive_thinker.py b/src/chat/chat_loop/proactive/proactive_thinker.py index 432d96844..3a6af40fe 100644 --- a/src/chat/chat_loop/proactive/proactive_thinker.py +++ b/src/chat/chat_loop/proactive/proactive_thinker.py @@ -1,7 +1,5 @@ import time import traceback -import orjson -import re from typing import TYPE_CHECKING, Dict, Any from src.common.logger import get_logger @@ -12,7 +10,6 @@ from src.plugin_system.apis import generator_api from src.plugin_system.apis.generator_api import process_human_text from src.schedule.schedule_manager import schedule_manager from src.plugin_system import tool_api -from src.plugin_system.base.component_types import ComponentType from src.config.config import global_config from src.chat.utils.chat_message_builder import get_raw_msg_before_timestamp_with_chat, build_readable_messages_with_id from src.mood.mood_manager import mood_manager diff --git a/src/plugin_system/base/base_action.py b/src/plugin_system/base/base_action.py index 5962d69fe..e1663afc6 100644 --- a/src/plugin_system/base/base_action.py +++ b/src/plugin_system/base/base_action.py @@ -8,6 +8,7 @@ from src.common.logger import get_logger from src.chat.message_receive.chat_stream import ChatStream from src.plugin_system.base.component_types import ActionActivationType, ChatMode, ActionInfo, ComponentType, ChatType from src.plugin_system.apis import send_api, database_api, message_api +from src.plugin_system.core.component_registry import component_registry logger = get_logger("base_action") @@ -381,6 +382,60 @@ class BaseAction(ABC): logger.error(f"{self.log_prefix} 发送命令时出错: {e}") return False + async def call_action(self, action_name: str, action_data: Optional[dict] = None) -> Tuple[bool, str]: + """ + 在当前Action中调用另一个Action。 + + Args: + action_name (str): 要调用的Action的名称。 + action_data (Optional[dict], optional): 传递给被调用Action的动作数据。如果为None,则使用当前Action的action_data。 + + Returns: + Tuple[bool, str]: 被调用Action的执行结果 (is_success, message)。 + """ + log_prefix = f"{self.log_prefix} [call_action -> {action_name}]" + logger.info(f"{log_prefix} 尝试调用Action: {action_name}") + + try: + # 1. 从注册中心获取Action类 + action_class = component_registry.get_component_class(action_name, ComponentType.ACTION) + if not action_class: + logger.error(f"{log_prefix} 未找到Action: {action_name}") + return False, f"未找到Action: {action_name}" + + # 2. 准备实例化参数 + # 复用当前Action的大部分上下文信息 + called_action_data = action_data if action_data is not None else self.action_data + + component_info = component_registry.get_component_info(action_name, ComponentType.ACTION) + if not component_info: + logger.warning(f"{log_prefix} 未找到Action组件信息: {action_name}") + return False, f"未找到Action组件信息: {action_name}" + + plugin_config = component_registry.get_plugin_config(component_info.plugin_name) + + # 3. 实例化被调用的Action + action_instance = action_class( + action_data=called_action_data, + reasoning=f"Called by {self.action_name}", + cycle_timers=self.cycle_timers, + thinking_id=self.thinking_id, + chat_stream=self.chat_stream, + log_prefix=log_prefix, + plugin_config=plugin_config, + action_message=self.action_message, + ) + + # 4. 执行Action + logger.debug(f"{log_prefix} 开始执行...") + result = await action_instance.execute() + logger.info(f"{log_prefix} 执行完成,结果: {result}") + return result + + except Exception as e: + logger.error(f"{log_prefix} 调用时发生错误: {e}", exc_info=True) + return False, f"调用Action '{action_name}' 时发生错误: {e}" + @classmethod def get_action_info(cls) -> "ActionInfo": """从类属性生成ActionInfo From 18220e41107e85ad3b88bd8027af5b1fae3e0485 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 12 Sep 2025 20:42:02 +0800 Subject: [PATCH 2/4] rrrrrrrrrrrrruuuuuuuuuuuuuuuffffffffffffffffffffffffffff x3 --- src/chat/chat_loop/proactive/event_scheduler.py | 3 +-- src/chat/chat_loop/response_handler.py | 1 - src/chat/chat_loop/sleep_manager/notification_sender.py | 1 - src/chat/chat_loop/sleep_manager/sleep_manager.py | 2 +- src/chat/frequency_analyzer/trigger.py | 2 +- src/chat/heart_flow/heartflow_message_processor.py | 1 - src/chat/planner_actions/planner.py | 4 ---- src/common/message/api.py | 1 - src/plugins/built_in/at_user_plugin/plugin.py | 1 - src/plugins/built_in/napcat_adapter_plugin/event_handlers.py | 1 - 10 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/chat/chat_loop/proactive/event_scheduler.py b/src/chat/chat_loop/proactive/event_scheduler.py index 5e6ca0c51..8c005cb3d 100644 --- a/src/chat/chat_loop/proactive/event_scheduler.py +++ b/src/chat/chat_loop/proactive/event_scheduler.py @@ -4,9 +4,8 @@ """ import asyncio -import time import traceback -from datetime import datetime, timedelta +from datetime import datetime from typing import Dict, Callable, Any, Optional from dataclasses import dataclass from src.common.logger import get_logger diff --git a/src/chat/chat_loop/response_handler.py b/src/chat/chat_loop/response_handler.py index 889371009..9859c76c3 100644 --- a/src/chat/chat_loop/response_handler.py +++ b/src/chat/chat_loop/response_handler.py @@ -1,5 +1,4 @@ import time -import orjson import random from typing import Dict, Any, Tuple diff --git a/src/chat/chat_loop/sleep_manager/notification_sender.py b/src/chat/chat_loop/sleep_manager/notification_sender.py index 55b32ec85..95ee304e9 100644 --- a/src/chat/chat_loop/sleep_manager/notification_sender.py +++ b/src/chat/chat_loop/sleep_manager/notification_sender.py @@ -1,4 +1,3 @@ -import asyncio from src.common.logger import get_logger from ..hfc_context import HfcContext diff --git a/src/chat/chat_loop/sleep_manager/sleep_manager.py b/src/chat/chat_loop/sleep_manager/sleep_manager.py index 3bf099be7..677555aef 100644 --- a/src/chat/chat_loop/sleep_manager/sleep_manager.py +++ b/src/chat/chat_loop/sleep_manager/sleep_manager.py @@ -1,7 +1,7 @@ import asyncio import random from datetime import datetime, timedelta, date -from typing import Optional, TYPE_CHECKING, List, Dict, Any +from typing import Optional, TYPE_CHECKING from src.common.logger import get_logger from src.config.config import global_config diff --git a/src/chat/frequency_analyzer/trigger.py b/src/chat/frequency_analyzer/trigger.py index a6b4d8a3b..d62547306 100644 --- a/src/chat/frequency_analyzer/trigger.py +++ b/src/chat/frequency_analyzer/trigger.py @@ -91,7 +91,7 @@ class FrequencyBasedTrigger: # 6. 直接调用 proactive_thinker event = ProactiveTriggerEvent( source="frequency_analyzer", - reason=f"User is in a high-frequency chat period." + reason="User is in a high-frequency chat period." ) await sub_heartflow.heart_fc_instance.proactive_thinker.think(event) diff --git a/src/chat/heart_flow/heartflow_message_processor.py b/src/chat/heart_flow/heartflow_message_processor.py index 734f6a301..a401e797b 100644 --- a/src/chat/heart_flow/heartflow_message_processor.py +++ b/src/chat/heart_flow/heartflow_message_processor.py @@ -17,7 +17,6 @@ from src.chat.utils.chat_message_builder import replace_user_references_sync from src.common.logger import get_logger from src.person_info.relationship_manager import get_relationship_manager from src.mood.mood_manager import mood_manager -from src.chat.message_receive.chat_stream import get_chat_manager if TYPE_CHECKING: from src.chat.heart_flow.sub_heartflow import SubHeartflow diff --git a/src/chat/planner_actions/planner.py b/src/chat/planner_actions/planner.py index 3163697d4..cdab8b3d6 100644 --- a/src/chat/planner_actions/planner.py +++ b/src/chat/planner_actions/planner.py @@ -1,10 +1,7 @@ import orjson import time import traceback -import asyncio -import math import random -import json from typing import Dict, Any, Optional, Tuple, List, TYPE_CHECKING from rich.traceback import install from datetime import datetime @@ -27,7 +24,6 @@ from src.plugin_system.base.component_types import ( ActionInfo, ChatMode, ComponentType, - ActionActivationType, ) from src.plugin_system.core.component_registry import component_registry from src.schedule.schedule_manager import schedule_manager diff --git a/src/common/message/api.py b/src/common/message/api.py index a85677f47..75e5c84e9 100644 --- a/src/common/message/api.py +++ b/src/common/message/api.py @@ -1,5 +1,4 @@ from src.common.server import get_global_server -import os import importlib.metadata from maim_message import MessageServer from src.common.logger import get_logger diff --git a/src/plugins/built_in/at_user_plugin/plugin.py b/src/plugins/built_in/at_user_plugin/plugin.py index 1cac44fcc..bfb923963 100644 --- a/src/plugins/built_in/at_user_plugin/plugin.py +++ b/src/plugins/built_in/at_user_plugin/plugin.py @@ -8,7 +8,6 @@ from src.plugin_system import ( ActionInfo, ActionActivationType, ) -from src.person_info.person_info import get_person_info_manager from src.common.logger import get_logger from src.plugin_system.base.component_types import ChatType diff --git a/src/plugins/built_in/napcat_adapter_plugin/event_handlers.py b/src/plugins/built_in/napcat_adapter_plugin/event_handlers.py index 78d94363e..c4f889712 100644 --- a/src/plugins/built_in/napcat_adapter_plugin/event_handlers.py +++ b/src/plugins/built_in/napcat_adapter_plugin/event_handlers.py @@ -1,4 +1,3 @@ -import orjson from src.plugin_system import BaseEventHandler from src.plugin_system.base.base_event import HandlerResult From 51643eb53a12b637643a3d0deb99db09040e8f11 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 12 Sep 2025 20:43:51 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat(config):=20=E6=9B=B4=E6=94=B9=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=9C=8D=E5=8A=A1=E5=99=A8=E7=AB=AF=E5=8F=A3=E4=B8=BA?= =?UTF-8?q?8000?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将默认的服务器端口从8080更改为8000,以避免与其他常用应用程序的潜在端口冲突。 --- template/bot_config_template.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 4df8d0a71..ebc2f0f38 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -495,7 +495,7 @@ insomnia_trigger_delay_minutes = [15, 45] [server] host = "127.0.0.1" -port = 8080 +port = 8000 [cross_context] # 跨群聊/私聊上下文共享配置 # 这是总开关,用于一键启用或禁用此功能 From cd19e89528c49d8b2b02addbd0d2b52ef4ba4dd8 Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Fri, 12 Sep 2025 20:47:52 +0800 Subject: [PATCH 4/4] =?UTF-8?q?refactor(config):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E7=9D=A1=E5=89=8D=E6=B6=88=E6=81=AF=E7=BE=A4=E7=BB=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除了 `pre_sleep_notification_groups` 配置项,因为该功能已通过新的插件事件和动作机制实现,不再需要硬编码的群组列表。现在可以通过插件来灵活地处理睡前通知的发送逻辑。 --- src/config/official_configs.py | 3 --- template/bot_config_template.toml | 2 -- 2 files changed, 5 deletions(-) diff --git a/src/config/official_configs.py b/src/config/official_configs.py index 9253c92cb..f6fc4b3c6 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -662,9 +662,6 @@ class SleepSystemConfig(ValidatedConfigBase): ) max_sleep_delay_minutes: int = Field(default=60, description="单日最大延迟入睡分钟数") enable_pre_sleep_notification: bool = Field(default=True, description="是否启用睡前消息") - pre_sleep_notification_groups: List[str] = Field( - default_factory=list, description='接收睡前消息的群号列表, 格式: ["platform:group_id1", "platform:group_id2"]' - ) pre_sleep_prompt: str = Field( default="我准备睡觉了,请生成一句简短自然的晚安问候。", description="用于生成睡前消息的提示" ) diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index ebc2f0f38..5472dfd73 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -484,8 +484,6 @@ max_sleep_delay_minutes = 60 # 是否在进入“准备入睡”状态时发送一条消息通知。 enable_pre_sleep_notification = false -# 接收睡前消息的群组列表。格式为: ["platform:group_id1", "platform:group_id2"],例如 ["qq:12345678"] -pre_sleep_notification_groups = [] # 用于生成睡前消息的提示。AI会根据这个提示生成一句晚安问候。 pre_sleep_prompt = "我准备睡觉了,请生成一句简短自然的晚安问候。" insomnia_duration_minutes = [30, 60] # 单次失眠状态的持续时间范围(分钟)