diff --git a/astrbot/core/core_lifecycle.py b/astrbot/core/core_lifecycle.py index 8ba307c77..246fb0fea 100644 --- a/astrbot/core/core_lifecycle.py +++ b/astrbot/core/core_lifecycle.py @@ -65,7 +65,11 @@ class AstrBotCoreLifecycle: platform_tasks = self.load_platform() event_bus_task = asyncio.create_task(self.event_bus.dispatch(), name="event_bus") - self.curr_tasks = [event_bus_task, *platform_tasks] + extra_tasks = [] + for task in self.star_context._register_tasks: + extra_tasks.append(asyncio.create_task(task, name=task.__name__)) + + self.curr_tasks = [event_bus_task, *platform_tasks, *extra_tasks] self.start_time = int(time.time()) async def start(self): diff --git a/astrbot/core/pipeline/process_stage/method/star_request.py b/astrbot/core/pipeline/process_stage/method/star_request.py index 70d9285d9..b10ad8334 100644 --- a/astrbot/core/pipeline/process_stage/method/star_request.py +++ b/astrbot/core/pipeline/process_stage/method/star_request.py @@ -29,6 +29,7 @@ class StarRequestSubStage(Stage): continue star_cls_obj = star_map.get(handler.handler_module_str).star_cls + logger.debug(f"执行 Star Handler {handler.handler_full_name}") # 判断 handler 是否是类方法(通过装饰器注册的没有 __self__ 属性) ready_to_call = None if hasattr(handler.handler, '__self__'): @@ -39,9 +40,7 @@ class StarRequestSubStage(Stage): # 向下兼容 ready_to_call = handler.handler(event, self.ctx.plugin_manager.context, **params) else: - logger.debug("calling star handler: %s" % handler.handler_full_name) ready_to_call = handler.handler(star_cls_obj, event, **params) - logger.debug("star handler %s called" % handler.handler_full_name) if isinstance(ready_to_call, AsyncGenerator): async for mer in ready_to_call: @@ -59,13 +58,13 @@ class StarRequestSubStage(Stage): if ret: # 如果有返回值 assert isinstance(ret, (MessageEventResult, CommandResult)), "如果有返回值,必须是 MessageEventResult 或 CommandResult 类型。" - event.stop_event() event.set_result(ret) # 执行后续步骤来发送消息 if event.is_stopped() and event.get_result(): # 插件主动停止事件传播,并且有结果 event.continue_event() yield + event.clear_result() event.stop_event() yield elif not event.is_stopped and not event.get_result(): @@ -79,4 +78,5 @@ class StarRequestSubStage(Stage): ret = f":(\n\n在调用插件 {star_map.get(handler.handler_module_str).name} 的处理函数 {handler.handler_name} 时出现异常:{e}" event.set_result(MessageEventResult().message(ret)) yield + event.clear_result() event.stop_event() \ No newline at end of file diff --git a/astrbot/core/pipeline/scheduler.py b/astrbot/core/pipeline/scheduler.py index 49d4fcc3f..8842057b1 100644 --- a/astrbot/core/pipeline/scheduler.py +++ b/astrbot/core/pipeline/scheduler.py @@ -40,4 +40,5 @@ class PipelineScheduler(): async def execute(self, event: AstrMessageEvent): '''执行 pipeline''' - await self._process_stages(event) \ No newline at end of file + await self._process_stages(event) + logger.debug("pipeline 执行完毕。") \ No newline at end of file diff --git a/astrbot/core/platform/astr_message_event.py b/astrbot/core/platform/astr_message_event.py index 87b8071ba..aa619246c 100644 --- a/astrbot/core/platform/astr_message_event.py +++ b/astrbot/core/platform/astr_message_event.py @@ -47,6 +47,10 @@ class AstrMessageEvent(abc.ABC): self._has_send_oper = False '''是否有过至少一次发送操作''' + + + # back_compability + self.platform = platform_meta def get_platform_name(self): return self.platform_meta.name diff --git a/astrbot/core/provider/sources/llmtuner_source.py b/astrbot/core/provider/sources/llmtuner_source.py index 2f1f278c8..e3dce2af9 100644 --- a/astrbot/core/provider/sources/llmtuner_source.py +++ b/astrbot/core/provider/sources/llmtuner_source.py @@ -2,7 +2,7 @@ import json import os from llmtuner.chat import ChatModel from typing import List -from .. import ProviderMetaData, Provider +from .. import Provider from astrbot.core.db import BaseDatabase from astrbot import logger diff --git a/astrbot/core/star/context.py b/astrbot/core/star/context.py index 8f59df8eb..0305bd041 100644 --- a/astrbot/core/star/context.py +++ b/astrbot/core/star/context.py @@ -35,6 +35,9 @@ class Context: provider_manager: ProviderManager = None platform_manager: PlatformManager = None + + # back compatibility + _register_tasks: List[Awaitable] = [] def __init__(self, event_queue: Queue, config: AstrBotConfig, db: BaseDatabase): self._event_queue = event_queue @@ -198,3 +201,9 @@ class Context: await platform.send_by_session(session, message_chain) return True return False + + def register_task(self, task: Awaitable, desc: str): + ''' + 注册一个异步任务。 + ''' + self._register_tasks.append(task) \ No newline at end of file diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index d257691f1..07804acaf 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -163,6 +163,7 @@ class PluginManager: self._check_plugin_dept_update(target_plugin=root_dir_name) module = __import__(path, fromlist=[module_str]) except Exception as e: + logger.error(traceback.format_exc()) logger.error(f"插件 {root_dir_name} 导入失败。原因:{str(e)}") continue