From 9431efc6d14cc9286730dbccd357edd68c1835a4 Mon Sep 17 00:00:00 2001 From: anka <1350989414@qq.com> Date: Tue, 9 Sep 2025 08:44:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20on=5Fplatform=5Flo?= =?UTF-8?q?aded=20=E9=92=A9=E5=AD=90=E4=BB=A5=E5=9C=A8=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E9=80=82=E9=85=8D=E5=99=A8=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E5=8C=96=E5=AE=8C=E6=88=90=E5=90=8E=E8=A7=A6=E5=8F=91=20(#2651?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat⚒️: 增加平台加载时的钩子 * fix: 补充api * fix: 只捕获Exception --- astrbot/api/event/filter/__init__.py | 2 ++ astrbot/core/platform/manager.py | 28 ++++++++++++++++++---- astrbot/core/star/register/__init__.py | 2 ++ astrbot/core/star/register/star_handler.py | 22 +++++++++++++---- astrbot/core/star/star_handler.py | 10 +++++++- 5 files changed, 55 insertions(+), 9 deletions(-) diff --git a/astrbot/api/event/filter/__init__.py b/astrbot/api/event/filter/__init__.py index dd737e3ff..d63850e4e 100644 --- a/astrbot/api/event/filter/__init__.py +++ b/astrbot/api/event/filter/__init__.py @@ -7,6 +7,7 @@ from astrbot.core.star.register import ( register_permission_type as permission_type, register_custom_filter as custom_filter, register_on_astrbot_loaded as on_astrbot_loaded, + register_on_platform_loaded as on_platform_loaded, register_on_llm_request as on_llm_request, register_on_llm_response as on_llm_response, register_llm_tool as llm_tool, @@ -41,6 +42,7 @@ __all__ = [ "custom_filter", "PermissionType", "on_astrbot_loaded", + "on_platform_loaded", "on_llm_request", "llm_tool", "on_decorating_result", diff --git a/astrbot/core/platform/manager.py b/astrbot/core/platform/manager.py index 6ac990e0e..e1368cf0b 100644 --- a/astrbot/core/platform/manager.py +++ b/astrbot/core/platform/manager.py @@ -6,6 +6,7 @@ from typing import List from asyncio import Queue from .register import platform_cls_map from astrbot.core import logger +from astrbot.core.star.star_handler import star_handlers_registry, star_map, EventType from .sources.webchat.webchat_adapter import WebChatAdapter @@ -66,15 +67,21 @@ class PlatformManager: WeChatPadProAdapter, # noqa: F401 ) case "lark": - from .sources.lark.lark_adapter import LarkPlatformAdapter # noqa: F401 + from .sources.lark.lark_adapter import ( + LarkPlatformAdapter, + ) # noqa: F401 case "dingtalk": from .sources.dingtalk.dingtalk_adapter import ( DingtalkPlatformAdapter, # noqa: F401 ) case "telegram": - from .sources.telegram.tg_adapter import TelegramPlatformAdapter # noqa: F401 + from .sources.telegram.tg_adapter import ( + TelegramPlatformAdapter, + ) # noqa: F401 case "wecom": - from .sources.wecom.wecom_adapter import WecomPlatformAdapter # noqa: F401 + from .sources.wecom.wecom_adapter import ( + WecomPlatformAdapter, + ) # noqa: F401 case "weixin_official_account": from .sources.weixin_official_account.weixin_offacc_adapter import ( WeixinOfficialAccountPlatformAdapter, # noqa @@ -86,7 +93,9 @@ class PlatformManager: case "slack": from .sources.slack.slack_adapter import SlackAdapter # noqa: F401 case "satori": - from .sources.satori.satori_adapter import SatoriPlatformAdapter # noqa: F401 + from .sources.satori.satori_adapter import ( + SatoriPlatformAdapter, + ) # noqa: F401 except (ImportError, ModuleNotFoundError) as e: logger.error( f"加载平台适配器 {platform_config['type']} 失败,原因:{e}。请检查依赖库是否安装。提示:可以在 管理面板->控制台->安装Pip库 中安装依赖库。" @@ -115,6 +124,17 @@ class PlatformManager: ) ) ) + handlers = star_handlers_registry.get_handlers_by_event_type( + EventType.OnPlatformLoadedEvent + ) + for handler in handlers: + try: + logger.info( + f"hook(on_platform_loaded) -> {star_map[handler.handler_module_path].name} - {handler.handler_name}" + ) + await handler.handler() + except Exception: + logger.error(traceback.format_exc()) async def _task_wrapper(self, task: asyncio.Task): try: diff --git a/astrbot/core/star/register/__init__.py b/astrbot/core/star/register/__init__.py index 55a4393da..0519e8ca1 100644 --- a/astrbot/core/star/register/__init__.py +++ b/astrbot/core/star/register/__init__.py @@ -8,6 +8,7 @@ from .star_handler import ( register_permission_type, register_custom_filter, register_on_astrbot_loaded, + register_on_platform_loaded, register_on_llm_request, register_on_llm_response, register_llm_tool, @@ -26,6 +27,7 @@ __all__ = [ "register_permission_type", "register_custom_filter", "register_on_astrbot_loaded", + "register_on_platform_loaded", "register_on_llm_request", "register_on_llm_response", "register_llm_tool", diff --git a/astrbot/core/star/register/star_handler.py b/astrbot/core/star/register/star_handler.py index 101f3a95f..b5ebd3f50 100644 --- a/astrbot/core/star/register/star_handler.py +++ b/astrbot/core/star/register/star_handler.py @@ -267,6 +267,18 @@ def register_on_astrbot_loaded(**kwargs): return decorator +def register_on_platform_loaded(**kwargs): + """ + 当平台加载完成时 + """ + + def decorator(awaitable): + _ = get_handler_or_create(awaitable, EventType.OnPlatformLoadedEvent, **kwargs) + return awaitable + + return decorator + + def register_on_llm_request(**kwargs): """当有 LLM 请求时的事件 @@ -376,9 +388,11 @@ def register_llm_tool(name: str = None, **kwargs): # print(f"Registering tool {llm_tool_name} for agent", registering_agent._agent.name) if registering_agent._agent.tools is None: registering_agent._agent.tools = [] - registering_agent._agent.tools.append(llm_tools.spec_to_func( - llm_tool_name, args, docstring.description.strip(), awaitable - )) + registering_agent._agent.tools.append( + llm_tools.spec_to_func( + llm_tool_name, args, docstring.description.strip(), awaitable + ) + ) return awaitable @@ -421,7 +435,7 @@ def register_agent( run_hooks=run_hooks or BaseAgentRunHooks[AstrAgentContext](), ) handoff_tool = HandoffTool(agent=agent) - handoff_tool.handler=awaitable + handoff_tool.handler = awaitable llm_tools.func_list.append(handoff_tool) return RegisteringAgent(agent) diff --git a/astrbot/core/star/star_handler.py b/astrbot/core/star/star_handler.py index 43a74396a..e0a97e50a 100644 --- a/astrbot/core/star/star_handler.py +++ b/astrbot/core/star/star_handler.py @@ -34,19 +34,26 @@ class StarHandlerRegistry(Generic[T]): ) -> List[StarHandlerMetadata]: handlers = [] for handler in self._handlers: + # 过滤事件类型 if handler.event_type != event_type: continue + # 过滤启用状态 if only_activated: plugin = star_map.get(handler.handler_module_path) if not (plugin and plugin.activated): continue + # 过滤插件白名单 if plugins_name is not None and plugins_name != ["*"]: plugin = star_map.get(handler.handler_module_path) if not plugin: continue if ( plugin.name not in plugins_name - and event_type != EventType.OnAstrBotLoadedEvent + and event_type + not in ( + EventType.OnAstrBotLoadedEvent, + EventType.OnPlatformLoadedEvent, + ) and not plugin.reserved ): continue @@ -90,6 +97,7 @@ class EventType(enum.Enum): """ OnAstrBotLoadedEvent = enum.auto() # AstrBot 加载完成 + OnPlatformLoadedEvent = enum.auto() # 平台加载完成 AdapterMessageEvent = enum.auto() # 收到适配器发来的消息 OnLLMRequestEvent = enum.auto() # 收到 LLM 请求(可以是用户也可以是插件)