OpenCode 学习笔记 00:项目搭建
从零开始构建一个迷你 AI coding agent
January 19, 2026·5 min read·Yimin
#AI#Agent#OpenCode#TypeScript#学习笔记
学习一个复杂项目最好的方式,不是看文档,而是自己动手实现一个简化版。
系列目录
本系列共 16 篇,分为 5 个阶段,每篇都有可运行的代码产出:
Phase 1: 基础架构 (00-01) ✅
| # | 主题 | 核心问题 | 代码产出 |
|---|---|---|---|
| 00 | 项目搭建 | 如何组织一个 Agent 项目? | 项目初始化 |
| 01 | 核心架构 | Config + Tool + Provider + Agent Loop 如何工作? | 完整 Agent 核心 |
Phase 2: 核心工具 - "AI 如何操作代码" ✅
| # | 主题 | 核心问题 | 学习 OpenCode |
|---|---|---|---|
| 02 | 核心工具 | write/edit/bash/grep/glob 如何工作?模糊匹配原理? | edit.ts 9种Replacer |
Phase 3: 会话与记忆 - "AI 如何记住" ✅
| # | 主题 | 核心问题 | 学习 OpenCode |
|---|---|---|---|
| 03 | 会话系统 | 多轮对话 + 规则加载 + 持久化 | session/ |
Phase 4: 高级功能 ✅
| # | 主题 | 核心问题 | 学习 OpenCode |
|---|---|---|---|
| 04 | 高级功能 | 多 Agent + 权限系统 + 重试 + Snapshot + 子任务 | agent/, permission/, snapshot/, task.ts |
Phase 5: 扩展与生产 ✅
| # | 主题 | 核心问题 | 学习 OpenCode |
|---|---|---|---|
| 05 | 扩展与生产 | MCP + 流式输出 + CLI + 架构总结 | mcp/, cli/, 完整架构 |
Phase 6: 深入探索 📖
| # | 主题 | 核心问题 | 学习 OpenCode |
|---|---|---|---|
| 06 | 深入探索 | Bus + Question + Format + Codesearch + Share + ACP | bus/, question/, format/, share/, acp/ |
专题索引
快速找到你感兴趣的功能:
AI 如何操作代码?
| 我想了解... | 看这篇 |
|---|---|
| AI 如何读/写/编辑代码?模糊匹配原理? | Phase 2: 核心工具 |
| AI 执行 shell 命令安全吗?grep/glob 怎么搜索? | Phase 2: 核心工具 |
| AI 如何语义搜索代码? | Phase 6: Codesearch |
| AI 如何获取网页信息? | Phase 6: Websearch/Webfetch |
AI 如何记住?
| 我想了解... | 看这篇 |
|---|---|
| 对话太长怎么办?上下文压缩是什么? | Phase 3: 会话系统 |
| 如何让 AI 了解项目规范?(.cursorrules) | Phase 3: 项目规则 |
| Skills 是什么?如何给 AI 加知识? | Phase 3: Skills 系统 |
| 会话如何保存和恢复? | Phase 3: 持久化 |
Agent 核心机制
| 我想了解... | 看这篇 |
|---|---|
| 什么是 Agent Loop?ReAct 是什么? | Phase 1: 核心架构 |
| build/plan/explore 模式有什么区别? | Phase 4: 多 Agent |
| 如何给 Agent 加权限控制? | Phase 4: 权限系统 |
| AI 调用失败怎么办?如何重试? | Phase 4: 重试机制 |
| 如何撤销 AI 的修改? | Phase 4: Snapshot |
| MCP 是什么?怎么扩展能力? | Phase 5: MCP |
| ACP 是什么?如何与 IDE 集成? | Phase 6: ACP |
系统高级功能
| 我想了解... | 看这篇 |
|---|---|
| 组件之间如何通信?事件总线? | Phase 6: Bus |
| AI 如何主动向用户提问? | Phase 6: Question |
| 代码如何自动格式化? | Phase 6: Format |
| 如何分享会话? | Phase 6: Share |
| AI 如何管理任务列表? | Phase 6: Todo |
学习目标
本篇完成:
- 了解 OpenCode 的整体架构
- 创建 tiny-agent 项目结构
- 配置 TypeScript + Bun 环境
- 运行第一个 "Hello World"
一、OpenCode 是什么?
OpenCode 是一个开源的 AI coding agent,类似 Claude Code,核心特点:
- 100% 开源:完全开放的代码库
- 多 Provider 支持:Claude、OpenAI、Gemini、本地模型...
- 客户端-服务器架构:TUI 只是前端之一,可以有 Web、移动端等
- LSP 集成:内置语言服务器协议支持
- MCP 支持:Model Context Protocol 扩展能力
二、OpenCode 项目结构
opencode/
├── packages/
│ ├── opencode/ # 🎯 核心包(我们主要学习对象)
│ │ └── src/
│ │ ├── agent/ # Agent 定义(build, plan, explore)
│ │ ├── tool/ # 工具实现(read, write, bash, grep...)
│ │ ├── session/ # 会话管理、消息历史
│ │ ├── provider/ # LLM Provider 抽象
│ │ ├── server/ # HTTP API 服务
│ │ ├── cli/ # TUI 界面
│ │ └── ...
│ ├── console/ # Web 控制台
│ ├── desktop/ # 桌面应用(Tauri)
│ ├── sdk/ # SDK 包
│ └── ui/ # 共享 UI 组件
└── ...
核心模块说明
| 模块 | 职责 | 对应概念 |
|---|---|---|
agent/ | 定义不同类型的 Agent | build(开发)、plan(规划)、explore(探索) |
tool/ | 工具实现 | read、write、bash、grep、glob... |
session/ | 会话管理 | 消息历史、LLM 调用、状态持久化 |
provider/ | Provider 抽象 | 多模型支持、认证、转换 |
server/ | HTTP API | 客户端-服务器通信 |
三、tiny-agent 设计
我们不需要实现完整的 OpenCode,而是提取核心概念,构建一个可运行的最小版本:
tiny-agent/
├── src/
│ ├── index.ts # 入口
│ ├── tool/ # 工具系统(学习重点 1)
│ ├── agent/ # Agent 定义(学习重点 2)
│ ├── session/ # 会话管理(学习重点 3)
│ ├── provider/ # LLM 调用(学习重点 4)
│ └── tui/ # 简单界面(学习重点 5)
├── package.json
└── tsconfig.json
技术选型
| 选择 | 原因 |
|---|---|
| TypeScript | 与 OpenCode 一致,方便对照 |
| Bun | 快速的运行时,OpenCode 使用 |
| Zod | 类型验证,OpenCode 核心依赖 |
| AI SDK | Vercel 的 AI SDK,简化 LLM 调用 |
四、项目搭建
4.1 创建目录结构
mkdir -p external/tiny-agent/src/{tool,agent,session,provider,tui}
4.2 package.json
{
"name": "tiny-agent",
"version": "0.1.0",
"type": "module",
"scripts": {
"dev": "bun run src/index.ts"
},
"dependencies": {
"ai": "^4.0.0",
"zod": "^3.24.0",
"@anthropic-ai/sdk": "^0.30.0",
"openai": "^4.70.0"
},
"devDependencies": {
"@types/bun": "latest",
"typescript": "^5.0.0"
}
}
4.3 tsconfig.json
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"paths": {
"@/*": ["./src/*"]
}
}
}
4.4 入口文件 src/index.ts
console.log("🤖 tiny-agent v0.1.0")
console.log("A minimal AI coding agent for learning purposes")
五、运行验证
cd external/tiny-agent
bun install
bun dev
输出:
🤖 tiny-agent v0.1.0
A minimal AI coding agent for learning purposes
项目搭建完成!
六、与 OpenCode 的对照
让我们看看 OpenCode 的入口文件 packages/opencode/src/index.ts:
// OpenCode 使用 yargs 处理命令行参数
const cli = yargs(hideBin(process.argv))
.scriptName("opencode")
.command(RunCommand) // 主运行命令
.command(ServeCommand) // 启动服务器
.command(AuthCommand) // 认证
// ... 更多命令
关键观察:
- OpenCode 是一个 CLI 工具,使用 yargs 处理命令
- 有多个子命令:run、serve、auth、models...
- 我们的 tiny-agent 会简化这些,专注于核心逻辑
七、下一步预告
第01篇:Tool 抽象设计
我们将学习 OpenCode 最核心的设计模式之一:Tool 系统。
// 目标:实现这样的 API
const readTool = Tool.define("read", {
description: "读取文件内容",
parameters: z.object({
path: z.string().describe("文件路径"),
}),
execute: async (args) => {
// 实现逻辑
},
})
将分析的 OpenCode 源码:
packages/opencode/src/tool/tool.ts- Tool 抽象定义packages/opencode/src/tool/read.ts- read 工具实现
总结
| 完成项 | 描述 |
|---|---|
| ✅ 项目结构 | 创建 tiny-agent 目录和基础文件 |
| ✅ 依赖配置 | TypeScript + Bun + AI SDK |
| ✅ 运行验证 | bun dev 输出 Hello World |
| ✅ 架构理解 | 了解 OpenCode 的模块划分 |
代码仓库:external/tiny-agent/