乐于分享
好东西不私藏

00 导读:打开 AI 编程工具的黑盒

00 导读:打开 AI 编程工具的黑盒
00 导读:打开 AI 编程工具的黑盒

如果你用过 OpenCode、Claude Code 这类 AI 编程工具,多半有过这种体验:你说一句"帮我加个登录功能",它就开始自己翻代码、建文件、改逻辑、跑测试,像一个不用手把手教的同事坐在旁边。

这近乎魔法的体验背后,藏着一个值得拆开看的问题:大模型本质上只会"说话",它是怎么学会读写文件、执行命令、修改代码的?

答案藏在这些工具的源代码里。这个系列打开 OpenCode 的源代码,把"你按下回车,到模型开始作答"的全过程一步步拆给你看。

为什么值得了解原理

读懂这些原理,至少有三层价值。

把工具用得更好。 当你明白模型看到的提示词是怎么拼出来的、工具是怎么被调用的、对话太长时它怎么悄悄"丢掉"前面的内容,你就知道怎么给它更有效的指令,也知道它会在什么地方、因为什么而犯错。

看懂 AI Agent 的设计骨架。 先解释一个词:Agent(智能体)指的是"能自己调用工具、分多步完成任务的 AI 系统"。OpenCode 自己不实现任何大模型,它做的是把大模型包装成一个能动手干活的 Agent。这套包装方式——工具调用循环、上下文压缩、权限确认、流式响应——是当下 AI Agent 产品的共同骨架。OpenCode 是一个高完成度的开源实现,读懂它,等于读懂了这一类产品的底层逻辑。

纯粹的好奇心。 一个能自己改代码的系统,内部到底怎么运转?这种"打开黑盒"的快乐,本身就值得。

所有分析基于 OpenCode 1.18.16 的源代码(仓库 dev 分支),只反映这个版本的真实实现,不做新旧版本对比。

一个心智模型:OpenCode 是一个调度员

读这个系列之前,先建立一个认识:OpenCode 自己不会写代码,真正写代码的是背后的大模型。OpenCode 做的事,是当一个极其称职的调度员——把你的一句话,翻译成大模型能理解的一系列指令,再把大模型的回答转化成实际的文件读写和命令执行。

这个调度过程可以概括成一个循环,它是整个系统的心脏:

这个循环有个名字,叫 agent loop(智能体循环)。循环之外的所有东西——提示词怎么拼、工具怎么定义、用哪个 Agent 配置、权限怎么确认、对话太长怎么压缩——都是为这个循环服务的。记住这张图,读后面的内容就不会迷路。

读这个系列,你能回答这些问题
模型看到的提示词,到底由哪几部分拼成,每一部分在哪段代码里注入。
模型说"我要调用 bash 工具"时,代码怎么识别、怎么执行、结果怎么回到模型。
一次对话可以连续调用多少次工具,循环在什么条件下才会停。
对话越来越长、快超出模型上下文窗口时,OpenCode 怎么压缩历史保住关键信息。
哪些操作会弹窗要你确认,这个确认机制在代码里怎么实现。
大模型的回复一个字一个字蹦出来,这个流式过程在代码里怎么处理和存储。
一个必须提前知道的事

1.18.16 正处在一个内部重构的过渡期,代码里同时存在两套会话(session)实现:

当前真正在运行的,代码在 packages/opencode/src/session/,叫 V1 栈
一套正在开发、还没接入主流程的新实现,代码在 packages/core/src/session/runner/,叫 V2 栈

这个系列以 V1 栈为主线,因为它才是你运行 OpenCode 时实际执行的代码。原因很简单:文档要对应真实运行的行为,不能把一个还没上线的实现描述成现状。

阅读路线

这个系列一共 13 篇(不含导读),按"先建立全局、再拆解零件、最后回到整体、再讲专项"的顺序编排。建议按顺序读,因为后面会引用前面建立的认知。

篇号
标题
解决的问题
01
一次对话的完整旅程
代码怎么分层?一次对话从回车到回复经过哪些环节?
02
系统提示词与用户提示词
系统提示词怎么拼?用户输入怎么被加工成消息?
03
工具系统:模型怎么动手
工具怎么定义、执行、截断?模型调用后发生什么
04
Agent 系统与子任务:不同的工作模式
内置 Agent 有哪些?主 Agent 怎么委托子 Agent
05
调用大模型与流式响应
怎么调模型?流式回复怎么处理和存储
06
工具循环(Agent Loop):把一切串起来
主循环怎么转、何时停
07
扩展组件的运行时机制
4 种扩展组件怎么被发现、加载、触发
08
Skills 与 Commands:怎么写自己的扩展
指令包和斜杠命令怎么写
09
MCP:接入外部工具服务器
外部工具服务器怎么接入
10
Plugins:用 Hook 改写系统行为
Hook 机制怎么用,插件怎么写
11
上下文压缩:对话太长怎么办
怎么压缩、怎么清理旧工具输出
12
权限确认机制:哪些操作要你点头
哪些操作要确认?"总是允许"存哪
13
LSP 集成:OpenCode 怎么理解你的代码
改完代码怎么把错误回贴

第一阶段(01) 先建立全局地图。第二阶段(02—05) 逐个拆开循环依赖的核心组件。第三阶段(06) 把零件重新组装成主循环,这是整个系列的高潮。第四阶段(07—10) 讲怎么扩展系统:先讲 4 种组件的运行时机制,再分别讲 Skills/Commands、MCP、Plugins 怎么编写。第五阶段(11—13) 讲三个专项:长对话压缩、操作权限确认、代码理解,可按兴趣选读。

阅读约定

代码引用:涉及源代码的地方都标注 文件路径:行号,路径相对于 OpenCode 仓库根目录。比如 packages/opencode/src/session/prompt.ts:1081 表示 prompt.ts 的第 1081 行。可以对照源码一起读。

术语:每个术语第一次出现时会解释,不假设你已经知道。

事实与解释:代码里能直接看到的行为作为事实陈述;涉及"为什么这么设计"的推断会明确标注,不把推断包装成定论。

例子:讲抽象机制时,会用一个具体的、能追踪的例子走一遍。


下一篇,我们从全局开始:先画出一次对话的完整旅程,再拆开代码的分层。