首页/新闻资讯/正文详情

Agent 消息与事件工程笔记

发布时间:2026/9/24 17:47:58 来源:云帆数科 栏目:资讯中心
Agent 消息与事件工程笔记
摘要:LLM 无状态,状态要在端点攒起来、过程要流出去——攒起来的是 Message,流出去的是 Event,这是 agent loop 上两个最基本的数据面。本文把它们拆开讲:各是什么、一轮 loop 里怎么流动、四家框架怎么实现、跨边界怎么靠 MCP / A2A / AG-UI 统一,最后落到工程上怎么用、三条边界怎么划。《Agent 工程笔记》系列Agent Loop 工程笔记Agent 状态管理工程笔记Agent 消息与事件工程笔记(本篇)Agent 中间件工程笔记Agent 工具调用工程笔记Agent MCP 工程笔记Agent Skill 工程笔记LLM 每次调用都是无状态的,状态要靠 harness 在端点自己攒起来,过程要靠 harness 流出去。攒起来的是 Message,流出去的是 Event——这是 agent loop 上两个最基本的数据面。实际项目里这俩常被当成一回事,通信层从第一天就埋了坑。下面把两件事拆开讲:先说清它们分别是什么,再看一轮 loop 里怎么流动、各家怎么实现、跨边界怎么靠协议统一,最后落到工程上怎么用。图1:Message 和 Event 都在数据层,中间件在机制层,MCP / A2A / AG-UI 在边界层做翻译。一、Message 与 Event 是两件事1.1 Message:通信 / 状态单元承载内容的单元,进入 state,是以后可以重放的真相。从事件溯源的角度看,message log 才是真相,当前 state 只是它的一个投影——《Agent 状态管理工程笔记》§2.2 已经铺过:历史消息序列叫 transcript / message history,它不是 state 本身,而是 state 里的一个字段。同一个"消息",其实跨三层作用域,讨论时得先说清说的是哪层:LLM 对话消息(transcript,进 state):OpenAI 的messages[]、Anthropic 的messages(system 单独放顶层)、Gemini 的contents、LangGraph 的BaseMessage、AgentScope 的UserMsg / AgentMsg。跨 agent 消息(A2A 的Message,带Parts:TextPart / FilePart / DataPart)。传输消息(JSON-RPC / SSE 帧,线路上的格式)。LLM 对话消息和 A2A 消息形状完全不同,拿一层去套另一层是最常见的谬误。Message 长什么样一个 Message 对象大致长这样(以 OpenAImessages[]为基准,各家字段名不同但骨架一致):字段作用role说话方:system / user / assistant / toolcontent内容体:纯文本,或 block 数组(Anthropic 的 text / tool_use / thinking),或 parts(A2A 的 TextPart / FilePart / DataPart)id消息 id,稳定唯一,用于关联与重放tool_calls模型发起的工具调用(assistant 侧)tool_call_id工具结果回写时绑定到哪个调用(tool 侧)metadata时间戳、来源 agent 等附加信息几个要点:有稳定 id、进 state、是 transcript 的一员、可重放——这是它和 Event 最根本的区别。{"id":"msg_01","role":"assistant","content":"我先查一下天气","tool_calls":[{"id":"call_abc","type":"function","function":{"name":"get_weather","arguments":"{\"city\":\"北京\"}"}}]}Anthropic 的content是 block 数组、A2A 的Message用Parts装多模态——形状各异,但 role / content / id 这套骨架每个框架都有。1.2 Event:通知 / 流单元描述状态变化或生命周期进展的瞬态信号,出边界,用来驱动 UI 和可观测性。它通常可以丢、需要幂等、也最好能重放。各家分法不同,但大致归三桶:流式增量(delta,文本或工具参数逐块到达)、生命周期(run / task 开始、步开始/结束、完成/失败)、中断与错误(human-in-the-loop interrupt、error、cancel)。Event 长什么样一个 Event 对象通常包含这些字段:字段作用type/event事件类型名,如TEXT_MESSAGE_CONTENT、response.output_text.delta、TaskStatusUpdateEvent,常带点号命名空间id事件自身 id,可选——MCP 的 Notification 就没有 id(单向、接收方不回);有 id 才能做幂等去重run_id/thread_id/parent_run_id/task_id关联到哪次运行 / 会话,用来拼 append-only 轨迹、支持分支与时间旅行source/origin谁发的,多 agent 时区分来源data/payload/delta事件体:delta 事件里是这一小块内容,lifecycle 事件里是状态,state 事件里是快照或 patchtimestamp/sequence时序,用于重放排序内容裹在data/delta里,不像 Message 的content直接挂顶层。{"type":"TEXT_MESSAGE_CONTENT","messageId":"msg_123","runId":"run_abc","threadId":"thread_xyz","delta":"你好"}event: response.output_text.delta data: {"type":"response.output_text.delta","response_id":"resp_...", "item_id":"...","content_index":0,"delta":"你好"}两者都是type标明是什么、delta是这一块内容、再带血缘字段把事件绑到某次 run / 某条 message 上。图2:Message 进 state 成为可重放的真相,Event 出边界驱动 UI 和可观测性,方向相反。1.3 为什么要把它们分开Message 进 state,Event 出边界。混为一谈会带来两类典型 bug:反模式 A:把 tool result 当 event 流式推掉,没写回 message / state,结果崩溃后没法从 checkpoint 续跑(见《Agent 状态管理工程笔记》§5.5 审计与重放)。反模式 B:只流式推 message delta(本质是 event),不保留 message 全量,UI 看着爽,但 state 里没有真相,无法重放与审计。AG-UI 把两者都标准化了还分得清:TEXT_MESSAGE_CONTENT是 message delta,可以重放拼回 message;RUN_STARTED是 event,不进 state。这是"分开"的工业级范例,也是后面各家对照时的标杆。1.4 和前面两篇的关系Message 是 state 的肉身:transcript 住在 state 里(《Agent 状态管理工程笔记》§2.1 / §2.2)。Event 是 checkpoint 和可观测性的血脉:state 每步快照加上事件流,就是一条完整的可重放轨迹(同篇 §5.5 审计)。二、它们在 loop 里怎么走2.1 从 harness 哑路由看两个数据面《Agent Loop 工程笔记》里给 harness 的定位是个哑路由:每轮就四件事,组装 messages、调 LLM、执行 tool、把结果写回 messages;控制流在模型输出里,不在 harness 里。但还有第五件事常被忽略:把"过程"流出去给调用方和 UI。这件事正好暴露出两个基本数据面:进 state 的 Message(说了什么):对话内容、工具调用、工具结果,最终落进 session / state,是可重放的真相。出边界的 Event(发生了什么):文本在流式吐、某步开始了、工具调完了、出错了,这些瞬态信号要实时推给前端和可观测系统。消息和事件不是附加功能,是 loop 的两个基本 I/O 面。这篇接《Agent Loop 工程笔记》的"哑路由"和《Agent 状态管理工程笔记》的"Session 第二含义 = 通讯连接"——通讯连接落下来,就是 Message / Event 的传输层。2.2 一轮 loop 里的两条路径拆开看一轮 loop,Message 和 Event 走的是两条方向相反的路径:入(Message 沉淀):上一轮的 message 历史从 state 读出,组装成这次 LLM 的输入messages[];LLM 产出的 tool_call 也作为 Message 进入同一序列。出(Even

相关推荐

内耗分类的术语大全的庖丁解牛
内耗分类的术语大全的庖丁解牛

总纲:内耗分类,是对精神自我消耗的归类体系。内耗本质是心理资源被无产出的思虑、冲突、反复拉扯持续占用,没有对外行动产出,心力却不断损耗。分类的意义,是识别内耗的源头,区分是思维、情绪、关系还是信念… · 2026/9/24 17:47:58

自卑分类的术语大全的庖丁解牛
自卑分类的术语大全的庖丁解牛

总纲:自卑,是自我价值感偏低的心理状态,核心是内在对自己持续低估,觉得自身不足、不配、不如他人。自卑不是单一情绪,是一套复合感受体系。分类的目的,区分自卑的来源、触发场景与表现形式,分清… · 2026/9/24 17:47:58

回调机制详解:从概念到 Spring 实践
回调机制详解:从概念到 Spring 实践

回调机制详解:从概念到 Spring 实践 一、什么是回调? 回调(Callback)是一种编程模式:把一段代码(函数或对象)作为参数传给另一个方法,由那个方法在合适的时机反过来调用这段代码。 通… · 2026/9/24 17:47:58

电子合同建筑装修场景测评:分包到班组,哪类合同最该先签
电子合同建筑装修场景测评:分包到班组,哪类合同最该先签

一个装修公司在工地现场跟班组签劳务协议,用的是打印好的纸,签完塞进文件夹带回项目部。三个月后文件夹找不到了,班组来要结算,双方对当初约定的单价各执一词。 建筑装修行业的合同管理有个天然劣势:签合同的地方在工地… · 2026/9/24 18:15:48

PyMuPDF PDF 文件压缩实战:深入解析 save() 压缩参数与最佳实践
PyMuPDF PDF 文件压缩实战:深入解析 save() 压缩参数与最佳实践

图像处理 【免费下载链接】PyMuPDF PyMuPDF is a high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents. 项目地址: https://gitcode.com/gh_mirrors/py/PyMuPDF 点击查看 免费下载 PyMuP… · 2026/9/24 18:15:48

Xcode 自定义指令:教会 Copilot 你的编码习惯
Xcode 自定义指令:教会 Copilot 你的编码习惯

Xcode 自定义指令:教会 Copilot 你的编码习惯 【免费下载链接】CopilotForXcode AI coding assistant for Xcode 项目地址: https://gitcode.com/GitHub_Trending/cop/CopilotForXcode 你一定有过这种体验:刚让 Copilot 写了个网络请求函数&#… · 2026/9/24 18:15:42

Logistics | 第三方物流的药品追溯实施
Logistics | 第三方物流的药品追溯实施

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 18:15:42

C#图像切换动画引擎:PPT级特效的GDI+实现
C#图像切换动画引擎:PPT级特效的GDI+实现

简介:这是一份面向C#图像动画开发者的PPT风格幻灯片切换特效算法实现工程,适用于UI动效设计、多媒体课件开发及WinForm界面美化等场景。资源完整实现了30种图像切换动画算法,涵盖压缩反转、中心闭幕、随机分块、螺线内旋、三色淡入、对角滑动… · 2026/9/24 18:15:35

DQN交通信号控制实战:解决相位饥饿与绿波失效
DQN交通信号控制实战:解决相位饥饿与绿波失效

简介:本资源是一个基于Python与SUMO仿真的交通信号灯智能调控高分毕设项目,面向计算机、人工智能、自动化及交通工程等专业的本科生与研究生,解决城市交叉口信号配时优化这一典型控制问题。项目采用深度Q网络(DQN)强化… · 2026/9/24 18:15:35

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码