Skip to main content
消息(Message)与事件(Event)是 AgentScope 中两种基础数据结构。
  • 消息 — 智能体间通信与上下文持久化的基本单元。
  • 事件 — 前后端交互与流式传输的基本单元,支持人工介入(Human-in-the-loop)场景。

消息

AgentScope 中Msg类的一个实例容纳一次完整的对话信息——一次用户输入或一次完整的智能体回复,信息以不同类型的内容块(Block)进行组织。
  1. 智能体运行一次reply产生一个完整的Msg实例,包含多轮的思考,工具调用,运行结果等所有信息。
  2. 前端渲染时,一个Msg实例即对应渲染成一个完整的消息气泡。

结构

Msg 类的核心字段如下:

内容块

消息内容由类型化的块组成,每种块代表一类独立信息:
角色约束在构造时强制执行:
  • msg.role=="user"的消息只能包含TextBlockDataBlock
  • msg.role=="system"的消息只能包含TextBlock
  • msg.role=="assistant"的消息可包含所有块类型。
这些数据块承载不同的数据信息,其详细字段说明如下:
此内容块允许透传模型厂商自定义的元数据(如 Anthropic 模型的 signature 等)
数据源配置说明:
  • Base64Source:
    • type: 固定为 "base64"
    • data: 经 Base64 编码的二进制数据。
    • media_type: 媒体类型(如 "image/png", "audio/mpeg""video/mp4" 等)。
  • URLSource:
    • type: 固定为 "url"
    • url: 满足 RFC 3986 标准的有效 URI/URL 字符串。
    • media_type: 媒体类型(如 "image/png""audio/wav" 等)。
在最终传递给 LLM API 时,HintBlock也会被转换为标准的用户消息(User message)。为避免和用户输入混淆,推荐在提示中使用 XML 标签标记提示内容(如<system-reminder>...</system-reminder>)。
ToolResultBlockid与发起该次调用的ToolCallBlock.id必须一致。支持多模态数据。

创建消息

AgentScope 提供三个快捷方法来构建Msg对象,以避免重复的设置role参数,并支持从字符串构建TextBlock content参数为字符串时,会自动包装为TextBlock

访问内容

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

事件

事件是消息的流式传输单元,即一个序列的事件可以组成一个完整的消息。 智能体类Agent在运行reply_stream的过程中,会产生一系列AgentEvent对象,表示增量的思考、文本回复、工具调用和工具调用结果。前端可通过订阅事件流来实现消息的实时渲染。

事件生命周期

事件的reply_id标识它所属的消息,block_idtool_call_id标识它所属的内容块。 事件的产生遵循 start → delta → end 模式: 同一次reply_stream的调用中所有事件共享相同的 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 — 通用可扩展事件,由服务层中间件用来通知订阅者状态变更(任务进度、团队成员、权限更新…),无需污染核心智能体事件枚举。

从事件流重建消息

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

TypeScript 支持

AgentScope 提供 TypeScript 版本的消息和事件元语,前端可以使用相同的 appendEvent API 从事件流重建消息。 安装 TS 版本的 AgentScope:
前端接收消息并重建消息的示例:
从事件流重建消息

示例:流式界面

以终端打印为例,展示如何在前端接收事件流并实时渲染:

延伸阅读

智能体

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

上下文

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