Skip to content

事件系统

AmritaCore 的管线是事件驱动的。工作流节点与策略分发事件;注册的 matcher 拦截它们、可以修改它们,并通过异常控制流程。

Matcher——钩子原语

用 AmritaSense 的术语:事件是 BaseEvent,通过 MatcherFactory.trigger_event(event, exception_ignored=...) 分发。Matcher 按事件类型字符串匹配:

python
from amrita_sense.hook.matcher import Matcher

matcher = Matcher("agent.step_intro", priority=1)


@matcher.handle()
async def on_step_intro(event): ...

使用字面量字符串,不要用 SomeEvent.event_type——那是 property 对象 而非字符串。

事件基类

AmritaSense 提供两个事件基类:

基类抽象契约适用场景
BaseEventget_event_type()事件不需要 constructor()
ConstructableEventBaseEvent 加上抽象 constructor()——每个子类必须实现事件经由 constructor() 构建

constructor()继承树约束(抽象方法),不是鸭子类型的 protocol:继承 ConstructableEvent 却漏掉它的子类会在类型检查阶段报错。内置 Step 事件全部 继承 ConstructableEvent 并实现 constructor()——通常通过 StepIntroEvent.constructor(rs) 手动构建、trigger_event(实例) 分发,但也能 被工作流 TRIGGER_EVENT 节点使用(该节点从类构建实例)。

事件类别

管线事件

事件类型字符串触发时机
PreCompletionEventLLM 调用前(在此修改上下文)
CompletionEvent响应后(改写 model_response

便捷装饰器:@on_precompletion@on_completion@on_event("<type>")

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

类型字符串可变字段触发时机
agent.step_introoverride_phaseStep 开始
agent.step_leaveoverride_verboverride_objectStep 结束
agent.step_iterationend_step每轮工具调用后
agent.tool_callargumentscancel常规工具执行前
agent.tool_returnresultskip_append常规工具返回后

所有 step 事件通过各自的 constructor() 类方法从 AgentRunState 构建。

修改与控制流

两个强大特性:

  1. 事件可变——钩子在分发后读回字段:

    python
    @on_event("agent.step_leave")
    async def fix_summary(event):
        event.override_verb = "Reviewed"  # 替换自动摘要
  2. exception_ignored——列出的异常从 trigger_event 传播回钩子。 StepAbortError(一个 BaseException)是框架的控制流信号:

    python
    from amrita_core.builtins.agent.events import StepAbortError
    
    
    @on_event("agent.tool_call")
    async def block_tool(event):
        raise StepAbortError("blocked")  # 工具永不执行

事件如何到达节点

工作流节点与生命周期钩子调用 _trigger_step_event(...);同进程注册的 matcher 看到每次分发。这是护栏、遥测与人机协同的扩展点。

下一步

工具系统——工具如何定义与执行。

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