三类事件#

Zett Agent 把“事件”这个词用在三种不同的东西上。选对哪一种,决定了你的 UI 是能实时更新,还是悄无声息地什么都不做。

类型

发送方式

接收方

典型用途

AgentEvent

await context.emit(...)

Agent.stream 和你的分发器

任何用户应该看到的内容

ExtensionEvent

await context.publish(...)

其他扩展的 on_event

扩展之间的协调

ExternalEvent

agent.emit_external_event(...)

某个扩展的 accept

你的 UI 回传给等待中请求的应答

UI 输出#

只要是人应该看到的内容,就发出一个 AgentEvent。自定义事件会带上你自己定义的 name 和 payload,分发器会调用 on_custom_event;这个名称是数据,不是 Python 方法。

流式输出的到达顺序是可预期的,因此 UI 可以据此开启和结束加载状态:

MODEL_STARTED
  REASONING_STARTED → REASONING_DELTA … → REASONING_COMPLETED
  CONTENT_STARTED   → TEXT_DELTA …      → CONTENT_COMPLETED
MODEL_COMPLETED
MODEL_STOPPED          (only when the model did not finish normally)

空的增量不会开启一个片段;失败或取消会让已开启的片段没有结束事件——请在 finally 块里关闭你的指示器。

扩展之间的协调#

context.publish 通知的是扩展,不是 UI。它适合用来表示“历史记录已被压缩”(CompactionEvent)或“追加了一条消息”这类事情。传入 target="Name" 可以只通知某一个扩展,省略它则广播。内部通知绝不会自动展示给用户。

来自 UI 的输入#

当模型提出问题或请求审批时,请求会暂停,由你的应用用 emit_external_event 回复。这个应答必须与请求的会话 ID、预期的事件名称和负载相匹配。如果没有扩展接受它,什么都不会发生,请求会继续等待。

要自己实现这三类事件,参见发出事件并接收用户输入;想跑一遍完整的审批流程,参见审批往返。