OpenCode 源码解析 · 第 18 讲
OpenCode 源码解析 第 18 讲:Session 处理器——Prompt 编排、Compaction 与工具执行循环 基于 dev 分支源码 · 2026-07-26 一、Session 模块:OpenCode 的 AI 大脑 前十七讲覆盖了 OpenCode 从 CLI 到事件总线的核心能力。这一讲深入 Session 会话模块 ——OpenCode 的 AI 大脑,负责 Prompt 编排、LLM 流式调用、工具执行循环和上下文压缩。Session 模块横跨 21 个文件、约 7,129 行代码 ,是整个系统最复杂的业务逻辑层。 📦 本讲核心文件 session/prompt.ts (1630 行)— Prompt 编排与会话入口 session/processor.ts (716 行)— LLM 流式事件处理器 session/compaction.ts (562 行)— 上下文压缩引擎 session/session.ts (1018 行)— 会话 CRUD 与 Token 计费 二、SessionProcessor:12 种流式事件的管道 processor.ts (716 行)是 Session 的核心事件处理器。LLM 的流式响应被拆解为 12 种事件类型 ,每个事件触发对应的状态更新。 1. ProcessorContext:处理器上下文 📄 session/processor.ts (第 67-75 行) interface ProcessorContext extends Input { toolcalls: Record<string, ToolCall> // 活跃工具调用表 shouldBreak: boolean // 是否中断循环 snapshot: string | undefined // 文件系统快照 blocked: boolean // 是否被权限阻塞 needsCompaction: boolean // 是否需要压缩 currentText: SessionV1.TextPart | undefined reasoningMap: Record<string, SessionV1.ReasoningPart> // 推理过程映射 } // 工具调用句柄 type ToolCall = { partID: SessionV1.ToolPart["id"] messageID: SessionV1.ToolPart["messageID"] sessionID: SessionV1.ToolPart["sessionID"] done: Deferred.Deferred<void> // 完成信号 } 上下文设计: ProcessorContext 维护了整个 LLM 处理过程的状态。toolcalls 是一个活跃工具调用表,每个工具调用都有一个 Deferred 完成信号。reasoningMap 跟踪推理过程的增量更新。snapshot 记录文件系统状态,用于 step-finish 时生成 diff。 2. handleEvent:事件分发器 📄 session/processor.ts (第 276-509 行) const handleEvent = Effect.fnUntraced(function* (value: StreamEvent) { switch (value.type) { // --- 推理事件 --- case "reasoning-start": // 创建推理 Part,记录开始时间 ctx.reasoningMap[value.id] = { id: PartID.ascending(), type: "reasoning", text: "", time: { start: Date.now() }, } yield* session.updatePart(ctx.reasoningMap[value.id]) return case "reasoning-delta": // 增量更新推理文本(不重建整个 Part) ctx.reasoningMap[value.id].text += value.text yield* session.up…
阅读全文:OpenCode 源码解析 第 18 讲