feat: add event hooks for tool usage and response handling (#4516)
* feat: add event hooks for tool usage and response handling * fix: update decorator for LLM tool response handling
This commit is contained in:
@@ -20,7 +20,11 @@ from astrbot.core.star.register import (
|
||||
)
|
||||
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 @@ __all__ = [
|
||||
"permission_type",
|
||||
"platform_adapter_type",
|
||||
"regex",
|
||||
"on_using_llm_tool",
|
||||
"on_llm_tool_respond",
|
||||
]
|
||||
|
||||
@@ -26,6 +26,19 @@ class MainAgentHooks(BaseAgentRunHooks[AstrAgentContext]):
|
||||
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],
|
||||
@@ -34,6 +47,13 @@ class MainAgentHooks(BaseAgentRunHooks[AstrAgentContext]):
|
||||
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,
|
||||
)
|
||||
|
||||
# special handle web_search_tavily
|
||||
if (
|
||||
|
||||
@@ -11,7 +11,9 @@ from .star_handler import (
|
||||
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 @@ __all__ = [
|
||||
"register_platform_adapter_type",
|
||||
"register_regex",
|
||||
"register_star",
|
||||
"register_on_using_llm_tool",
|
||||
"register_on_llm_tool_respond",
|
||||
]
|
||||
|
||||
@@ -409,6 +409,57 @@ def register_on_llm_response(**kwargs):
|
||||
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)添加工具。
|
||||
|
||||
|
||||
@@ -189,6 +189,7 @@ class EventType(enum.Enum):
|
||||
OnLLMResponseEvent = enum.auto() # LLM 响应后
|
||||
OnDecoratingResultEvent = enum.auto() # 发送消息前
|
||||
OnCallingFuncToolEvent = enum.auto() # 调用函数工具
|
||||
OnAfterCallingFuncToolEvent = enum.auto() # 调用函数工具后
|
||||
OnAfterMessageSentEvent = enum.auto() # 发送消息后
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user