AgentEvent 类型系统详解

932 字
5 分钟
AgentEvent 类型系统详解

AgentEvent 类型系统详解#

先看高层:AgentEvent(7 种业务事件) 再看底层:AssistantMessageEvent(13 种技术事件) 最后看关联:message_update 如何连接两者

高层:AgentEvent(7 种业务事件)#

AgentEvent 是应用层订阅的联合类型,包含 7 种事件。 按语义边界分为四类:

事件分类总览#

类别事件核心字段触发时机
生命周期agent_startAgent 初始化完成
agent_endmessages[]Agent 运行结束
Turnturn_start新一轮对话开始
turn_endmessage, toolResults[]本轮对话结束
Messagemessage_startmessageLLM 开始响应
message_updatemessage, assistantMessageEvent流式更新(高频)
message_endmessage(含usage、stopReason)LLM 响应完成
Tooltool_execution_starttoolCallId, toolName, args工具开始执行
tool_execution_updatepartialResult工具执行中(可选)
tool_execution_endresult, isError工具执行完成

message_update 详解(最核心)#

message_update 是最复杂、最高频的事件:

{
type: "message_update";
message: AgentMessage; // 当前累积状态
assistantMessageEvent: AssistantMessageEvent; // 底层事件(13种)
}

应用层通过这个事件:

  • 访问累积的消息状态(message
  • 深入底层的流细节(assistantMessageEvent
  • 实现实时文本显示(text_delta
  • 处理 API 错误(error

底层:AssistantMessageEvent(13 种技术事件)#

pi-ai 层的流式响应事件,描述 LLM 返回内容的逐步生成过程。

事件分类总览#

类别事件核心字段含义
生命周期startpartial流开始
donereason, message成功完成
errorreason, error出错终止
文本text_startcontentIndex开始文本块
text_deltadelta文本增量(最常用)
text_endcontent文本完成
思考thinking_startcontentIndex开始思考块
thinking_deltadelta思考增量
thinking_endcontent思考完成
工具调用toolcall_startcontentIndex开始工具调用
toolcall_deltadelta(JSON片段)参数增量
toolcall_endtoolCall参数完整

所有事件都携带 partial: AssistantMessage(当前累积状态)。

三种关键事件详解#

text_delta:实时文本增量(最常用)

{
type: "text_delta";
contentIndex: number; // 内容块索引
delta: string; // 增量文本(如"根据")
partial: AssistantMessage;
}

用于实时显示 AI 回复的文本流。

toolcall_end:工具调用参数完整

{
type: "toolcall_end";
contentIndex: number;
toolCall: { // 完整的工具调用对象
id: string;
name: string;
arguments: Record<string, any>;
};
partial: AssistantMessage;
}

用于判断工具调用参数已生成完毕,即将执行。

error:API 错误

{
type: "error";
reason: "aborted" | "error";
error: AssistantMessage; // 错误状态的消息
}

用于处理 API 调用失败或用户中止。

事件时序示例#

场景一:纯文本回复#

用户问:“你好”,AI 直接回复,无工具调用。

时间轴 →
agent_start
turn_start
message_start ← AgentEvent:LLM 开始响应
│ message_update (携带底层事件)
│ ├── assistantMessageEvent: text_delta "你"
│ ├── assistantMessageEvent: text_delta "好"
│ └── assistantMessageEvent: text_delta "!"
│ ↑ AssistantMessageEvent(高频触发)
message_end ← stopReason = "stop"
turn_end ← toolResults = []
agent_end ← messages: [用户消息, AI回复]

场景二:工具调用流程#

用户问:“北京天气”,AI 调用 search 工具查询,用结果继续回复。

时间轴 →
agent_start
turn_start(第1轮)
message_start
│ message_update
│ ├── text_delta "我来查询"
│ ├── toolcall_start (contentIndex=1)
│ ├── toolcall_delta '{"query"'
│ ├── toolcall_delta ': "北京天气"'
│ ├── toolcall_end → toolCall完整
│ │ └── toolCall: { id: "tc1", name: "search", arguments: { query: "北京天气" } }
│ └── done → stopReason = "toolUse"
message_end ← stopReason = "toolUse"
│ ─────── LLM 完成,Agent 开始执行工具 ───────
tool_execution_start ← toolCallId: "tc1", toolName: "search"
tool_execution_end ← result: "北京晴天,25°C"
turn_end ← toolResults: [search的结果]
│ ─────── Agent 用工具结果继续生成 ───────
turn_start(第2轮)
message_start
│ message_update
│ ├── text_delta "根据查询结果"
│ ├── text_delta "北京今天晴天,25°C"
│ └── done → stopReason = "stop"
message_end ← stopReason = "stop"
turn_end ← toolResults = []
agent_end ← messages: [用户, AI工具调用, 工具结果, AI回复]

时序关键点

  • message_end 的 stopReason 决定是否执行工具
  • turn_end 后如果有工具结果,可能触发新一轮
  • agent_end 是最终汇总点,包含所有消息历史

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
AgentEvent 类型系统详解
https://firefly.cuteleaf.cn/posts/learn-pi/event&message/02-类型系统详解/
作者
AltumSisy
发布于
2026-05-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
AltumSisy
Hello, I'm AltumSisy.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
32
分类
3
标签
25
总字数
68,347
运行时长
0
最后活动
0 天前

文章目录