Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions astrbot/api/event/filter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
register_on_llm_tool_respond as on_llm_tool_respond,
)
from astrbot.core.star.register import register_on_platform_loaded as on_platform_loaded
from astrbot.core.star.register import register_on_plugin_error as on_plugin_error
from astrbot.core.star.register import register_on_using_llm_tool as on_using_llm_tool
from astrbot.core.star.register import (
register_on_waiting_llm_request as on_waiting_llm_request,
Expand Down Expand Up @@ -52,6 +53,7 @@
"on_decorating_result",
"on_llm_request",
"on_llm_response",
"on_plugin_error",
"on_platform_loaded",
"on_waiting_llm_request",
"permission_type",
Expand Down
18 changes: 14 additions & 4 deletions astrbot/core/pipeline/process_stage/method/star_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
from astrbot.core.message.message_event_result import MessageEventResult
from astrbot.core.platform.astr_message_event import AstrMessageEvent
from astrbot.core.star.star import star_map
from astrbot.core.star.star_handler import StarHandlerMetadata
from astrbot.core.star.star_handler import EventType, StarHandlerMetadata

from ...context import PipelineContext, call_handler
from ...context import PipelineContext, call_event_hook, call_handler
from ..stage import Stage


Expand Down Expand Up @@ -48,10 +48,20 @@ async def process(
yield ret
event.clear_result() # 清除上一个 handler 的结果
except Exception as e:
logger.error(traceback.format_exc())
traceback_text = traceback.format_exc()
logger.error(traceback_text)
logger.error(f"Star {handler.handler_full_name} handle error: {e}")

if event.is_at_or_wake_command:
await call_event_hook(
event,
EventType.OnPluginErrorEvent,
md.name,
handler.handler_name,
e,
traceback_text,
)

if not event.is_stopped() and event.is_at_or_wake_command:
ret = f":(\n\n在调用插件 {md.name} 的处理函数 {handler.handler_name} 时出现异常:{e}"
event.set_result(MessageEventResult().message(ret))
yield
Expand Down
2 changes: 2 additions & 0 deletions astrbot/core/star/register/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
register_on_llm_response,
register_on_llm_tool_respond,
register_on_platform_loaded,
register_on_plugin_error,
register_on_using_llm_tool,
register_on_waiting_llm_request,
register_permission_type,
Expand All @@ -32,6 +33,7 @@
"register_on_decorating_result",
"register_on_llm_request",
"register_on_llm_response",
"register_on_plugin_error",
"register_on_platform_loaded",
"register_on_waiting_llm_request",
"register_permission_type",
Expand Down
18 changes: 18 additions & 0 deletions astrbot/core/star/register/star_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,24 @@ def decorator(awaitable):
return decorator


def register_on_plugin_error(**kwargs):
"""当插件处理消息异常时触发。

Hook 参数:
event, plugin_name, handler_name, error, traceback_text

说明:
在 hook 中调用 `event.stop_event()` 可屏蔽默认报错回显,
并由插件自行决定是否转发到其他会话。
"""

def decorator(awaitable):
_ = get_handler_or_create(awaitable, EventType.OnPluginErrorEvent, **kwargs)
return awaitable

return decorator


def register_on_waiting_llm_request(**kwargs):
"""当等待调用 LLM 时的通知事件(在获取锁之前)

Expand Down
9 changes: 9 additions & 0 deletions astrbot/core/star/star_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,14 @@ def get_handlers_by_event_type(
plugins_name: list[str] | None = None,
) -> list[StarHandlerMetadata[Callable[..., Awaitable[Any]]]]: ...

@overload
def get_handlers_by_event_type(
self,
event_type: Literal[EventType.OnPluginErrorEvent],
only_activated=True,
plugins_name: list[str] | None = None,
) -> list[StarHandlerMetadata[Callable[..., Awaitable[Any]]]]: ...

@overload
def get_handlers_by_event_type(
self,
Expand Down Expand Up @@ -192,6 +200,7 @@ class EventType(enum.Enum):
OnUsingLLMToolEvent = enum.auto() # 使用 LLM 工具
OnLLMToolRespondEvent = enum.auto() # 调用函数工具后
OnAfterMessageSentEvent = enum.auto() # 发送消息后
OnPluginErrorEvent = enum.auto() # 插件处理消息异常时


H = TypeVar("H", bound=Callable[..., Any])
Expand Down
1 change: 1 addition & 0 deletions astrbot/dashboard/routes/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ def __init__(
EventType.OnDecoratingResultEvent: "回复消息前",
EventType.OnCallingFuncToolEvent: "函数工具",
EventType.OnAfterMessageSentEvent: "发送消息后",
EventType.OnPluginErrorEvent: "插件报错时",
}

self._logo_cache = {}
Expand Down