- 消息 — 智能体间通信与上下文持久化的基本单元。
- 事件 — 前后端交互与流式传输的基本单元,支持人工介入(Human-in-the-loop)场景。
消息
AgentScope 中Msg类的一个实例容纳一次完整的对话信息——一次用户输入或一次完整的智能体回复,信息以不同类型的内容块(Block)进行组织。
结构
Msg 类的核心字段如下:
内容块
消息内容由类型化的块组成,每种块代表一类独立信息:角色约束在构造时强制执行:
msg.role=="user"的消息只能包含TextBlock和DataBlock;msg.role=="system"的消息只能包含TextBlock;msg.role=="assistant"的消息可包含所有块类型。
TextBlock
文本数据
TextBlock
文本数据
ThinkingBlock
模型的思考过程
ThinkingBlock
模型的思考过程
此内容块允许透传模型厂商自定义的元数据(如 Anthropic 模型的
signature 等)DataBlock
多模态数据(如图片、音频、视频等)
DataBlock
多模态数据(如图片、音频、视频等)
数据源配置说明:
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"等)。
HintBlock
用于引导 LLM 的提示信息
HintBlock
用于引导 LLM 的提示信息
在最终传递给 LLM API 时,
HintBlock也会被转换为标准的用户消息(User message)。为避免和用户输入混淆,推荐在提示中使用 XML 标签标记提示内容(如<system-reminder>...</system-reminder>)。ToolCallBlock
工具调用的数据和状态
ToolCallBlock
工具调用的数据和状态
ToolResultBlock
工具执行结果的数据和状态
ToolResultBlock
工具执行结果的数据和状态
ToolResultBlock的id与发起该次调用的ToolCallBlock.id必须一致。支持多模态数据。创建消息
AgentScope 提供三个快捷方法来构建Msg对象,以避免重复的设置role参数,并支持从字符串构建TextBlock:
当
content参数为字符串时,会自动包装为TextBlock。
访问内容
Msg 提供了一组辅助方法用于提取特定块类型:
事件
事件是消息的流式传输单元,即一个序列的事件可以组成一个完整的消息。 智能体类Agent在运行reply_stream的过程中,会产生一系列AgentEvent对象,表示增量的思考、文本回复、工具调用和工具调用结果。前端可通过订阅事件流来实现消息的实时渲染。
事件生命周期
事件的reply_id标识它所属的消息,block_id或tool_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 方法处理所有事件类型:
TypeScript 支持
AgentScope 提供 TypeScript 版本的消息和事件元语,前端可以使用相同的appendEvent API 从事件流重建消息。
安装 TS 版本的 AgentScope:
从事件流重建消息
示例:流式界面
以终端打印为例,展示如何在前端接收事件流并实时渲染:延伸阅读
智能体
智能体如何在 ReAct 循环中产出事件和消息
上下文
消息如何存储、压缩和卸载