OpenRath:让Agent系统像PyTorch一样——用Session替代群聊,用运行时状态替代日志拼接
> 论文:OpenRath: Session-Centered Runtime State for Agent Systems (arXiv:2606.19409) > 核心洞察:Agent集群不是群聊,而是建立在持久Session状态之上的运行时控制平面 > 一句话:Session不是聊天记录,它是运行时唯一的一等公民
—
多Agent系统的”碎片化噩梦”
想象一个复杂Agent工作流:一个Agent做计划,另一个Agent fork出去测试方案A,第三个Agent调用工具修改文件,第四个Agent从记忆库recall历史经验,第五个Agent压缩上下文后返回最终答案。
结束后你想审计:哪个分支产出了最终结果?哪个工具改了哪个文件?哪些记忆被召回、哪些被写入?压缩过程中丢弃了哪些证据?
答案往往是:不知道。
现代Agent系统的运行时状态散落在六个互不相通的”渠道”里:
1. 对话记录(transcript)——只保留了模型的输入输出,没有分支、没有工具证据 2. 工具日志——藏在某个controller里,和对话上下文脱节 3. 内存事件——recall/commit变成了”隐藏的prompt text”,看不到痕迹 4. 沙箱放置(workspace placement)——文件被改了,但改了哪里的记录可能不在Session里 5. 分支谱系(branch provenance)——fork和merge的决策过程被埋在controller代码中 6. 重放证据——被压缩器直接丢弃了
OpenRath的团队(Fukang Wen, Zhijie Wang, Ruilin Xu)把这个问题称为 hidden-runtime-state problem——隐藏运行时状态问题。这不是一个具体框架的bug,而是整个多Agent生态的结构性缺陷。
—
PyTorch教给Agent系统的三件事
OpenRath最聪明的一步,不是发明了一个新概念,而是把深度学习开发者最熟悉的那套抽象,整套搬到了Agent系统上。
PyTorch为什么好用?三个设计原则:
| PyTorch | OpenRath | 为什么重要 |
|---|---|---|
| Tensor → 流动的数据 | Session → 流动的运行时状态 | 所有信息附着在同一个值上,可传递、可分支、可重放 |
| Module/Layer → 可组合的变换 | Agent/Workflow → 可组合的变换 | 统一的 forward(session) -> session 接口,任意堆叠嵌套 |
| Device → 明确放置 | Sandbox/Backend → 明确放置 | 同一份代码,换后端不换逻辑 |
核心映射:
Tensor → Session Module/Linear → Workflow/Agent device → Sandbox / Backend Parameter → Memory Function → Tool 控制流 → Selector
这里有一个关键区别:OpenRath不是在蹭PyTorch的名字。它借的是架构接口,不是张量数学。论文明确说:”The analogy is architectural rather than literal.” 这不是说Agent系统就是神经网络,而是说Agent运行时需要一个稳定的流动值、可复用的变换、明确的放置和可检查的证据。
—
Session:什么是一等公民运行时状态?
在传统Agent框架中,对话记录(message list)是”一等公民”,其他一切都是围绕它的旁路(side channel)。OpenRath把这个关系颠倒了:
> Session 是运行时唯一的一等公民,对话记录只是Session的一部分。
一个Session承载的内容:
– 对话片段(conversation chunks)——不是完整的message list,而是有上下文的证据块 – 沙箱放置元数据(sandbox placement)——文件改了哪里、在哪个后端执行的 – 谱系记录(lineage metadata)——谁fork了谁、谁merge了谁、决策路径是什么 – token用量(token usage)——每次调用的开销,可审计 – 待办工作(pending work)——还没完成的子任务 – 工具证据(tool evidence)——工具调用的参数、结果、副作用 – 内存边界记录(memory boundary records)——recall和commit作为可见的运行时事件
关键特性: – 可分支(branchable) — fork操作复制Session同时保留父子关系 – 可检查(inspectable) — 所有运行时决策都附着在同一个值上 – 可重放(replayable) — Session包含足够的证据来重新执行 – 后端感知(backend-aware) — 知道自己在哪个sandbox/backend上运行 – 可组合(composable) — 可以merge、可以detach、可以持久化
—
四象限:你处于哪个阶段?
OpenRath提出了一个非常有用的框架,按 Agent数量 × Session数量 将系统分为四个象限:
| 单Agent | 多Agent | |
|---|---|---|
| 单Session | ChatGPT式聊天 | 子代理协作(如AutoGen) |
| 多Session | OpenClaw式分支扇出 | MAMS(Multi-Agent Multi-Session) ← OpenRath |
MAMS 是OpenRath面向的方向。它的判断很干脆:真正需要被fork、merge、复用、追踪的,是整条Session数据流——而非某个Agent内部各自维护的消息列表。
> “大多数框架攒的是一屋子聪明的工人,OpenRath先把工位、工单和流水线建好。”
Agent是工人,Session才是工作本身。
—
Agent不是助手,是变换层
这是OpenRath对Agent定义最颠覆性的地方。
传统框架把Agent当作”有角色、有记忆、有工具的全能助手”。OpenRath说:Agent只是Session上的一层变换。
OpenRath的Agent核心接口
class Agent: def forward(self, session: Session) -> Session: … # 进来一个Session,出去一个Session
这意味着同一个 forward(session) -> session 接口可以装下完全不同的东西:
– 工具调用Agent — 调工具、改文件、把执行结果写回Session – 压缩器 — 把跑了几十轮的长会话压缩成一条精简消息 – 记忆管理Agent — 跑之前recall,跑之后commit,相当于给会话做索引归档 – 验证器 — 只做校验、只做摘要、只做改写
关键:它们都不持有状态。 就像PyTorch的 nn.Linear 不持有Tensor,OpenRath的Agent不持有Session。状态是Session,Agent只是变换它。
这带来一个巨大的好处:同一个Agent既可以在单Agent场景里简单运行,又可以原封不动地被塞进更大的Workflow,不用改一行代码。
—
Workflow:像搭神经网络一样搭Agent集群
Workflow在OpenRath中对应PyTorch的 nn.Module:
class MyWorkflow(Workflow): def forward(self, session: Session) -> Session: # 可以串联多个Agent session = agent1(session) # 可以fork Session做并行探索 branch_a = session.fork() branch_b = session.fork() # 可以merge分支 session = Session.merge(branch_a, branch_b) # 可以压缩上下文 session = compressor(session) return session
因为每一层进出都是Session,Workflow能像 nn.Module 一样层层嵌套。每层不必重新发明一套状态格式。
Selector 负责动态路由控制流。不是硬编码下一步该跑哪个Agent,而是读取当前Session的状态,运行时决定下一步路由到哪。这让分支和循环成为可检查的运行时决策(decision记录进Session),而不是消失在controller代码中。
—
Sandbox与Memory:可插拔后端
PyTorch把”算在哪”(device)从”算什么”(model)里剥了出来。OpenRath做了同样的事:
– Sandbox/Backend — 决定代码在哪执行。同一份Agent代码,.to("local") 就本地跑,.to("opensandbox") 就远程沙箱跑。计算逻辑一行不用动。
– Memory — 不是隐藏的prompt text,而是Agent级别的持久化状态平面。recall和commit是可见的运行时事件,记录在Session里。
– Tool — 双层抽象:FlowToolCall 是给模型看的(name/description/JSON schema),BackendTool* 是沙箱后端真正执行的。MCP工具可以直接适配进同一个循环。
—
与其他框架的对比
| 框架 | 核心对象 | 与OpenRath的区别 |
|---|---|---|
| AutoGen | 多Agent对话 | Agent持有自己的对话状态,没有统一的Session边界 |
| LangGraph | 图状态检查点 | 检查点用于调度器恢复,不是程序本身传递的值 |
| OpenAI Agents SDK | Trace/Span | 追踪是事后观察用的,不是运行时流动的值 |
| MCP | 工具协议 | 只标准化工具调用,不解决运行时状态碎片化 |
OpenRath的定位是连接层(connective layer):它不取代图调度器、追踪系统、MCP服务器或沙箱,而是问——这些层产生的效应,如何变成一个可分支、可检查、可重放的运行时对象?
> “A graph runtime can schedule work, a tracing system can observe spans, MCP can expose tools, and a sandbox can run commands; OpenRath asks how those effects become one branchable, inspectable, replayable state object.”
—
审计优先的发布协议
OpenRath的发布策略非常克制。论文没有声称在SWE-bench或GAIA上击败了谁,而是提出了一个audit-first release protocol:
1. 谱系导出(lineage export)— 完整的fork/merge/branch历史 2. 本地沙箱执行 — 可复现的工具调用环境 3. 工作流转录 — 完整的Session轨迹 4. 聚焦测试 — 对核心属性的单元测试 5. 视觉QA — 交互式验证 6. 声明账本(claim ledger)— 每个声明对应哪些证据 7. 内存源审计 — memory recall/commit的可见性
> “Broad benchmark superiority, human preference results, and cross-system leaderboard claims are reserved for follow-on quantitative evaluation.”
这种克制本身就是一种学术诚信。先把运行时状态的边界和可审计性定义清楚,再去比性能。
—
局限与未解问题
1. 没有量化对比 — 论文明确说不对标AutoGen、LangGraph等框架的benchmark性能,这是后续工作。
2. 内存质量未评估 — “What this report does not claim is retrieval quality.” 召回和commit策略的有效性取决于具体实现,不是框架本身保证的。
3. 后端可用性 — OpenSandbox是可选的,MCP工具后端也是可选的。论文只定义了接口,没有承诺所有后端都已实现。
4. 分布式扩展 — 当前主要是本地后端验证,分布式跨节点Session传递是后续方向。
5. 生产部署经验 — 作为研究原型,尚未经过大规模生产环境验证。
—
一句话总结
> OpenRath的洞察是:多Agent系统的核心问题不是”怎么让Agent更聪明”,而是”怎么让运行时状态不碎片化”。它把PyTorch的架构智慧——一个流动值、统一接口、可组合变换——搬到了Agent世界,让Session成为运行时唯一的一等公民。Agent不是助手,是变换层。Session不是聊天记录,是工作本身。
当Agent从demo走向长流程、多分支、可审计的生产环境时,”状态管理”比”提示工程”更重要。OpenRath在这个方向上迈出了关键一步。
—
参考
– 论文:OpenRath: Session-Centered Runtime State for Agent Systems (arXiv:2606.19409) – 作者:Fukang Wen, Zhijie Wang, Ruilin Xu†(清华团队) – 核心概念:Session(一等运行时值)、MAMS(Multi-Agent Multi-Session)、PyTorch-like编程模型 – 关键词:多智能体系统、运行时状态、可审计性、Agent框架、状态管理
#多智能体 #Agent框架 #运行时状态 #Session管理 #PyTorch #可审计性 #清华 #OpenRath
