本节摘要:前三节分别讲了「有哪些层」「每层干什么」「层间规矩」,这一节把它们串成一条河——用一次具体的请求(「帮我把这个函数重命名」),追踪数据如何从应用层一路向下穿越六层、再带着结果返回。这是第 2 章的收尾,也是对前三节知识的综合检验:读完它,抽象的分层就会变成可见的数据流,后续每一章你都能在这趟旅程里找到自己关注的那一段。
假设你在终端里输入了一条消息:「帮我把 utils 里的 oldName 函数重命名为 newName」。我们追踪这条消息从输入到回显的完整旅程。为了看清分层,这趟旅程会经过六层里的每一层。
先看全貌,再分步拆:
你输入消息 │ ▼ [应用层] 解析输入、选定 Agent │ ▼ [领域核心层] 组装本次回合 ├─ 取会话历史 ├─ 组装 System Context(第 8 章) ├─ 物化可用工具集(第 5 章) └─ 求解工具权限(第 4 章) │ ▼ [LLM 抽象层] 构造 provider 中立请求 ├─ 套上 Route / Protocol(第 6 章) └─ 发起流式调用 │ ▼ [模型 API] 真正的推理(远端) │ ▼ 流式返回 [LLM 抽象层] 翻译成统一事件流 │ ▼ 工具调用事件 [领域核心层] 执行工具(读/改文件) ├─ 权限询问(若需要) ├─ 工具执行 + 输出边界控制 └─ 工具结果回流 │ ▼ 续跑判断 [领域核心层] 决定是否再调一次模型 │ ▼ 最终响应 [应用层] 渲染到终端 │ ◄─ 你看到结果
你在终端敲下消息,应用层(这里是 TUI 形态)接住它。应用层做的事很薄:解析输入、确定用哪个 Agent(默认是 build)、把消息交给领域核心层。它不操心「模型怎么调」「工具怎么执行」,那些都是下面层的事。
💡 记住:应用层永远很薄。它的职责是「把用户的东西翻译成内核能懂的调用」,不是亲自干活。
这是旅程里最厚的一段。领域核心层拿到消息后,要为「调一次模型」准备好一切:
这一步的产物是一个「准备好的回合」——历史有了、上下文有了、工具有了、权限清楚了。
领域核心层把「准备好的回合」交给 LLM 抽象层。LLM 抽象层把它翻译成 provider 中立的请求(system / messages / tools / 生成参数),然后套上 Route(用哪家厂商、哪个端点)、Protocol(用哪种协议,如 anthropic-messages 或 openai-chat)、Framing(怎么分帧),发起流式调用。
⚠️ 关键不变量:领域核心层给 LLM 抽象层的是「中立请求」,它不关心是哪家厂商。厂商差异全在 LLM 抽象层内部被吸收。这就是第 6 章要讲的「Schema-first」的威力。
请求到达远端模型 API,真正的推理在这里发生。模型决定:是直接回复文本,还是请求调用工具。在我们的场景里,它大概率会请求调用「读文件」工具(先看看 oldName 函数长啥样),然后请求调用「改文件」工具。
模型流式返回 token,LLM 抽象层把它们翻译成统一事件流:文本增量、工具调用请求、(后续的)工具结果等。注意——不管模型是哪家,事件流长得都一样。这是上层简洁的关键。
事件流里出现「工具调用」时,领域核心层接管:
工具执行完后,领域核心层判断:模型是不是还需要再看一眼结果、继续干活?如果是(「needs continuation」),就带着工具结果再走一遍第 3~6 步——这就是「会话循环」(第 7 章详讲)。一个回合里,模型可能被调多次、工具可能被调多次,直到模型认为任务完成。
模型最终给出「完成了」的文本响应,应用层把它渲染到终端。你看到结果。
把这趟旅程和前几节对照,你会发现几个关键认知被验证了:
| 认知 | 在旅程里的体现 |
|---|---|
| OpenCode 不是模型 | 真正推理在第 4 步(远端),其余 7 步都是 OpenCode 在忙 |
| 分层让职责清晰 | 应用层薄、核心层厚、LLM 层吸收厂商差异 |
| 依赖单向 | 数据从上往下到模型,再从下往上返回,从不反向 |
| 权限贯穿 | 第 2 步物化工具时求权限,第 6 步执行工具时再确认 |
| 会话是循环 | 第 7 步「续跑」让一次用户输入可能触发多次模型调用 |
这趟旅程是全书的「导航线」。后续每一章,你都能在旅程里找到它对应的那一段:
💡 建议:把这张旅程图打印或截图,读到后面章节时回头看一眼,你会一直清楚「我现在在旅程的哪一段」。
读完第 2 章,你已经建好了全书的地图和坐标系:知道 OpenCode 是什么(定位)、怎么分层(六层)、层间规矩(依赖铁律)、一次请求怎么流转(跨层旅程)。从第 3 章开始,我们要钻进每一层细看——先从最顶层应用层的「多形态」开始:这套内核怎么支撑八种入口形态。
第 2 章结束。下一章从应用层切入,讲这套内核如何用八种形态把自己暴露给世界。