Skip to content

4. 事件与钩子

本章目标

不碰框架代码就能拦截管线。学完你能:

  • 用装饰器钩住完成与预完成
  • 按类型字符串匹配任意事件——包括 step 生命周期事件
  • 修改事件并用 StepAbortError 控制流程

概念速览(用到才讲)

  • 事件:描述某事发生的对象(一次完成、一个 Step 边界、一次工具调用)。
  • Matcher:按事件类型字符串注册的处理器。Matcher 可以修改事件; 框架读回修改后的值。

管线是事件驱动的:基于 Matcher 的钩子让你拦截各阶段、修改消息、注入上下文。

1. 用 @on_completion 响应完成

python
from amrita_core import on_completion
from amrita_core.hook.event import CompletionEvent


@on_completion
async def log_response(event: CompletionEvent):
    print(f"[completion] {event.model_response[:80]}...")

CompletionEvent 携带最终响应;你可以在提交前改写 event.model_response

2. 用 @on_precompletion 预完成钩子

python
from amrita_core import on_precompletion
from amrita_core.hook.event import PreCompletionEvent


@on_precompletion
async def inject_context(event: PreCompletionEvent):
    # `event.original_context` 是 SendMessageWrap——可追加任何内容。
    event.original_context.append(
        Message(role="user", content="[system note] Today is 2026-08-06.")
    )

3. 用 @on_event 自定义事件

按字符串匹配任意事件类型:

python
from amrita_core import on_event


@on_event("agent.step_intro")
async def on_step_intro(event):
    print(f"[step intro] {event.phase}")

Step 生命周期事件(内置 ReAct)

事件类型可变字段触发时机
agent.step_introoverride_phaseStep 开始
agent.step_leaveoverride_verboverride_objectStep 结束(覆盖摘要)
agent.step_iterationend_step每轮工具调用后
agent.tool_callargumentscancel常规工具执行前
agent.tool_returnresultskip_append常规工具返回后

handler 可以修改事件,生命周期钩子读回修改后的值;也可以抛 StepAbortError 中止当前操作(取消工具调用、提前结束 Step、跳过追加结果)。

python
from amrita_core import on_event
from amrita_core.builtins.agent.events import StepAbortError


@on_event("agent.tool_call")
async def guard_tool(event):
    if event.tool_name == "dangerous_delete":
        event.cancel = True  # 或: raise StepAbortError("blocked")

4. 刚才发生了什么

  • @on_completion / @on_precompletion——管线边界
  • @on_event("<type>")——任意事件,包括 step 生命周期
  • 事件可变;StepAbortError 是控制流逃生舱

下一步

5. 记忆与会话——跨轮次持久化历史。

Apache 2.0 许可证(一些内容可能没有完全翻译成中文,请以英文文档为准。)