diff --git a/astrbot/api/event/filter/__init__.py b/astrbot/api/event/filter/__init__.py index 53e224ca9..287c60b73 100644 --- a/astrbot/api/event/filter/__init__.py +++ b/astrbot/api/event/filter/__init__.py @@ -20,7 +20,11 @@ ) from astrbot.core.star.register import register_on_llm_request as on_llm_request from astrbot.core.star.register import register_on_llm_response as on_llm_response +from astrbot.core.star.register import ( + 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_using_llm_tool as on_using_llm_tool from astrbot.core.star.register import ( register_on_waiting_llm_request as on_waiting_llm_request, ) @@ -53,4 +57,6 @@ "permission_type", "platform_adapter_type", "regex", + "on_using_llm_tool", + "on_llm_tool_respond", ] diff --git a/astrbot/core/astr_agent_hooks.py b/astrbot/core/astr_agent_hooks.py index 9d85de0cc..94c55a304 100644 --- a/astrbot/core/astr_agent_hooks.py +++ b/astrbot/core/astr_agent_hooks.py @@ -25,6 +25,19 @@ async def on_agent_done(self, run_context, llm_response): llm_response, ) + async def on_tool_start( + self, + run_context: ContextWrapper[AstrAgentContext], + tool: FunctionTool[Any], + tool_args: dict | None, + ): + await call_event_hook( + run_context.context.event, + EventType.OnCallingFuncToolEvent, + tool, + tool_args, + ) + async def on_tool_end( self, run_context: ContextWrapper[AstrAgentContext], @@ -33,6 +46,13 @@ async def on_tool_end( tool_result: CallToolResult | None, ): run_context.context.event.clear_result() + await call_event_hook( + run_context.context.event, + EventType.OnAfterCallingFuncToolEvent, + tool, + tool_args, + tool_result, + ) class EmptyAgentHooks(BaseAgentRunHooks[AstrAgentContext]): diff --git a/astrbot/core/star/register/__init__.py b/astrbot/core/star/register/__init__.py index 701a138f2..4856ffe50 100644 --- a/astrbot/core/star/register/__init__.py +++ b/astrbot/core/star/register/__init__.py @@ -11,7 +11,9 @@ register_on_decorating_result, register_on_llm_request, register_on_llm_response, + register_on_llm_tool_respond, register_on_platform_loaded, + register_on_using_llm_tool, register_on_waiting_llm_request, register_permission_type, register_platform_adapter_type, @@ -36,4 +38,6 @@ "register_platform_adapter_type", "register_regex", "register_star", + "register_on_using_llm_tool", + "register_on_llm_tool_respond", ] diff --git a/astrbot/core/star/register/star_handler.py b/astrbot/core/star/register/star_handler.py index 085414cd4..a2644feef 100644 --- a/astrbot/core/star/register/star_handler.py +++ b/astrbot/core/star/register/star_handler.py @@ -409,6 +409,57 @@ def decorator(awaitable): return decorator +def register_on_using_llm_tool(**kwargs): + """当调用函数工具前的事件。 + 会传入 tool 和 tool_args 参数。 + + Examples: + ```py + from astrbot.core.agent.tool import FunctionTool + + @on_using_llm_tool() + async def test(self, event: AstrMessageEvent, tool: FunctionTool, tool_args: dict | None) -> None: + ... + ``` + + 请务必接收三个参数:event, tool, tool_args + + """ + + def decorator(awaitable): + _ = get_handler_or_create(awaitable, EventType.OnCallingFuncToolEvent, **kwargs) + return awaitable + + return decorator + + +def register_on_llm_tool_respond(**kwargs): + """当调用函数工具后的事件。 + 会传入 tool、tool_args 和 tool 的调用结果 tool_result 参数。 + + Examples: + ```py + from astrbot.core.agent.tool import FunctionTool + from mcp.types import CallToolResult + + @on_llm_tool_respond() + async def test(self, event: AstrMessageEvent, tool: FunctionTool, tool_args: dict | None, tool_result: CallToolResult | None) -> None: + ... + ``` + + 请务必接收四个参数:event, tool, tool_args, tool_result + + """ + + def decorator(awaitable): + _ = get_handler_or_create( + awaitable, EventType.OnAfterCallingFuncToolEvent, **kwargs + ) + return awaitable + + return decorator + + def register_llm_tool(name: str | None = None, **kwargs): """为函数调用(function-calling / tools-use)添加工具。 diff --git a/astrbot/core/star/star_handler.py b/astrbot/core/star/star_handler.py index f36acedff..7b2e9f4bf 100644 --- a/astrbot/core/star/star_handler.py +++ b/astrbot/core/star/star_handler.py @@ -189,6 +189,7 @@ class EventType(enum.Enum): OnLLMResponseEvent = enum.auto() # LLM 响应后 OnDecoratingResultEvent = enum.auto() # 发送消息前 OnCallingFuncToolEvent = enum.auto() # 调用函数工具 + OnAfterCallingFuncToolEvent = enum.auto() # 调用函数工具后 OnAfterMessageSentEvent = enum.auto() # 发送消息后