OpenCode · 第 7 章 Session 核心:执行引擎的演进 章节摘要:前面六章铺垫的所有抽象——分层、Agent、工具、LLM——都在这一章汇成一条河:一次对话在内核里到底怎么跑的。OpenCode 的会话(Session)核心正处在一个有意思的时期:它有一套正在运行的 V1(一个单体循环,把组装系统提示、调 AI SDK、流式处理工具调用、权限询问、压缩、续跑全塞在一个大函数里),同时有一套正在建设的 V2(用事件溯源把「持久化录入」和「模型执行」彻底分离,引入 durable 收件箱、回合协调器、Location 作用域)。这种双轨并存不是技术债,而是一次刻意的架构演进。
章节摘要:前面六章铺垫的所有抽象——分层、Agent、工具、LLM——都在这一章汇成一条河:一次对话在内核里到底怎么跑的。OpenCode 的会话(Session)核心正处在一个有意思的时期:它有一套正在运行的 V1(一个单体循环,把组装系统提示、调 AI SDK、流式处理工具调用、权限询问、压缩、续跑全塞在一个大函数里),同时有一套正在建设的 V2(用事件溯源把「持久化录入」和「模型执行」彻底分离,引入 durable 收件箱、回合协调器、Location 作用域)。这种双轨并存不是技术债,而是一次刻意的架构演进。本章要讲清两件事:V1 单体循环是怎么编排出一次完整对话的(它是当前可运行的真相),以及 V2 为什么要做这次演进——把录入与执行分离换来了什么(durable、可恢复、可并发),Location 作用域又为未来的多节点留下了什么缝。这是全书最硬核的章节之一,读懂它,你就读懂了 OpenCode 的心脏。
阅读完本章,你应当能够:
一句话总结:V1 把一切塞进一个循环换来了简单直接,V2 把录入与执行分离换来了 durable 与并发——这不是推翻,而是把「能跑」升级成「能恢复、能并发、能演进」,Location 作用域则为未来的分布式埋下了缝。
讲 V1 的完整编排。一个超大函数如何:组装系统提示(含 Agent 指令、工具描述、权限提示)、调用底层 AI SDK、流式处理文本增量与工具调用、在工具执行前做权限询问、判断是否需要压缩、决定是否续跑。这一节是当前可运行真相的拆解。
讲 V2 最关键的架构决策:把「用户提示如何进入系统」(录入到 durable 收件箱,产生事件)与「模型如何执行这一回合」(runner)彻底分开。重点讲这种分离换来了什么——durable(录入不会丢)、可恢复、可并发、可重放。
讲 V2 的进程级协调器:它如何合并同一会话的多次唤醒(coalesce)、如何处理提示词的两种提升语义——「插队(steer,在下一个安全边界插队)」与「排队(queue,直到会话即将空闲才提升)」。还要讲清「drain 是进程内协调,不是 durable 实体」这个关键不变量。
讲 Location(目录 + 工作区 + VCS + 项目)为何是模型/工具/权限/文件系统服务的缓存键,而执行协调是进程级、按会话 ID 路由的。重点解释「移动会话」为何会清空上下文纪元——以及这个设计为未来多节点 clustering 留下了什么缝。
本章遵循「看清现状 → 理解演进 → 掌握协调 → 认识作用域」的深入路径:
V1 单体循环 (01) ──当前可运行的真相 │ ▼ V2 核心分离 (02) ──为何要演进,换来了什么 │ ▼ 回合协调器 (03) ──V2 如何协调并发与续跑 │ ▼ Location 作用域 (04) ──服务缓存键与未来分布式的缝 │ ▼ 第 8 章:会话里的「上下文」如何被管理
V1 是基础(它现在还在跑),V2 是演进方向,协调器与 Location 是 V2 的两个关键机制。理解这四节,你才完整掌握 OpenCode 的心脏——以及它正在长成什么样。
前置知识:
本章为后续章节奠定的基础: