Skip to main content
消息(Message)与事件(Event)是 AgentScope 中两种基础数据结构。
  • 消息 — 智能体间通信与持久化的基本单元。每个 Msg 代表一个完整的对话轮次,存储在上下文中并在智能体之间传递。
  • 事件 — 前端交互与流式传输的基本单元。事件携带增量进度更新(文本 token、工具调用片段、权限请求等),驱动实时界面和人工介入工作流。
单次 reply 调用产生的事件序列最终汇聚成恰好一条 assistant Msg,这保证了完整的消息状态始终可以从事件流中还原。

消息

Msg 代表对话中的一个轮次——用户输入、智能体回复或系统指令,内容以有序的类型化块(block)列表表示。
一条 assistant 消息对应智能体一次完整的 reply 周期(反复推理和执行,直到产出最终回复)。

结构

Msg 类的核心字段如下:

内容块

消息内容由类型化的块组成,每种块代表一类独立信息:
角色约束在构造时强制执行:user 消息只能包含 TextBlockDataBlocksystem 消息只能包含 TextBlockassistant 消息可包含所有块类型。

创建消息

AgentScope 提供三个快捷工厂函数,无需手动指定 role 或手动包装内容块: content 为普通字符串时,会自动包装为 TextBlock

访问内容

Msg 提供了一组辅助方法用于提取特定块类型:

事件

事件是消息的流式对应物。智能体执行过程中会持续产出一系列 AgentEvent 对象,表示增量进度——文本 token 到达、工具调用逐步构建、结果流式返回。每个事件都是轻量且自包含的。

事件生命周期

每个事件都携带 reply_id,将其关联到正在构建的消息。在一次回复中,block_idtool_call_id 标识事件所属的内容块。事件遵循 start → delta → end 模式: 同一次回复中的所有事件共享相同的 reply_id。在回复内部,用 block_id 关联文本/思考/数据块事件,用 tool_call_id 关联工具调用和工具结果事件。

事件类型

所有事件继承自 EventBase,提供以下公共字段: 事件按类别分组如下。除特别说明外,每个事件还携带 reply_id 字段,关联到正在构建的消息。
ReplyStartEvent — 智能体开始新的回复。ReplyEndEvent — 智能体完成回复。ExceedMaxItersEvent — 智能体达到最大推理-执行迭代次数。
TextBlockStartEvent — 新的文本块开始。TextBlockDeltaEvent — 增量文本内容到达。TextBlockEndEvent — 文本块完成。
ThinkingBlockStartEvent — 新的思考块开始。ThinkingBlockDeltaEvent — 增量思考内容到达。ThinkingBlockEndEvent — 思考块完成。
DataBlockStartEvent — 新的数据块开始(图片、音频等)。DataBlockDeltaEvent — 增量二进制数据到达。DataBlockEndEvent — 数据块完成。
ToolCallStartEvent — 智能体开始一次工具调用。ToolCallDeltaEvent — 增量工具调用参数到达。ToolCallEndEvent — 工具调用参数完成。
ToolResultStartEvent — 工具开始执行。ToolResultTextDeltaEvent — 工具的增量文本输出到达。ToolResultDataDeltaEvent — 工具的二进制数据输出到达。ToolResultEndEvent — 工具执行完成。
ModelCallStartEvent — 模型 API 调用开始。ModelCallEndEvent — 模型 API 调用完成。
RequireUserConfirmEvent — 智能体暂停等待用户确认。RequireExternalExecutionEvent — 智能体暂停等待外部执行。UserConfirmResultEvent — 用户提供确认结果(输入事件)。ExternalExecutionResultEvent — 外部系统提供执行结果(输入事件)。
与文本 / 思考 / 数据 / 工具块不同,这些事件不遵循 start → delta → end 模式。完整载荷在单个事件中到达,因为它在事前就已知,无需流式传输。HintBlockEvent — 一个 HintBlock 被注入到智能体上下文中(例如调度任务触发、团队消息、卸载后台工具返回的结果)。CustomEvent — 通用可扩展事件,由服务层 middleware 用来通知订阅者状态变更(任务进度、团队成员、权限更新……),无需污染核心 agent 事件枚举。

从事件流重建消息

事件与消息并非相互独立,而是同一数据的两种视图。reply_stream 产出的每个事件都可以通过 append_event() 应用到 Msg 上,从而增量地重建完整消息。这保证了最终消息状态可以仅凭事件流完整还原。
append_event 方法处理所有事件类型:
这种设计让部署更加灵活:后端可以通过 WebSocket 将事件流推送到前端,前端在客户端侧重建消息。即使连接中断,从任意检查点重放事件序列也能精确恢复消息状态。

TypeScript 支持

npm 上提供了消息和事件原语的 TypeScript 版本,前端可以使用相同的 appendEvent API 从事件流重建消息:

示例:流式界面

构建流式界面的典型模式:

延伸阅读

智能体

智能体如何在 ReAct 循环中产出事件和消息

上下文

消息如何存储、压缩和卸载