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
6 changes: 6 additions & 0 deletions astrbot/api/event/filter/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Expand Down Expand Up @@ -53,4 +57,6 @@
"permission_type",
"platform_adapter_type",
"regex",
"on_using_llm_tool",
"on_llm_tool_respond",
]
20 changes: 20 additions & 0 deletions astrbot/core/astr_agent_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand All @@ -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]):
Expand Down
4 changes: 4 additions & 0 deletions astrbot/core/star/register/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -36,4 +38,6 @@
"register_platform_adapter_type",
"register_regex",
"register_star",
"register_on_using_llm_tool",
"register_on_llm_tool_respond",
]
51 changes: 51 additions & 0 deletions astrbot/core/star/register/star_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)添加工具。

Expand Down
1 change: 1 addition & 0 deletions astrbot/core/star/star_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,7 @@ class EventType(enum.Enum):
OnLLMResponseEvent = enum.auto() # LLM 响应后
OnDecoratingResultEvent = enum.auto() # 发送消息前
OnCallingFuncToolEvent = enum.auto() # 调用函数工具
OnAfterCallingFuncToolEvent = enum.auto() # 调用函数工具后
OnAfterMessageSentEvent = enum.auto() # 发送消息后


Expand Down
Loading