核心目标
45 天后做出一个"极简可运行版本"的 OpenClaw,实现以下核心闭环:
用户发送消息 -> Gateway 接收 -> Memory 取历史 -> Agent 决策 -> Skill 执行 -> 返回结果
执行原则
每日学习节奏(3 小时)
| 时间段 | 内容 |
|---|---|
| 第 1 小时 | 学概念 + 让 AI 解释 |
| 第 2 小时 | 跟着 AI 写代码并运行 |
| 第 3 小时 | 调试、记录、整理笔记 |
任务颗粒度
对 0 基础来说,“实现 Memory 模块"这种说法太抽象。真正可执行的任务应该是:“今天我要让程序把一条用户消息存进 SQLite,并且能查出来”。
项目目录结构
mini-openclaw/
├─ src/
│ ├─ index.ts
│ ├─ gateway/
│ │ └─ telegramGateway.ts
│ ├─ agent/
│ │ └─ agent.ts
│ ├─ memory/
│ │ └─ memory.ts
│ ├─ skills/
│ │ ├─ skill.ts
│ │ ├─ printMessageSkill.ts
│ │ ├─ fileReadWriteSkill.ts
│ │ └─ skillManager.ts
│ ├─ llm/
│ │ └─ llmClient.ts
│ └─ utils/
│ └─ logger.ts
├─ data/
│ ├─ app.db
│ └─ user_preferences.md
├─ tests/
├─ .env
├─ package.json
├─ tsconfig.json
└─ README.md
第 1 阶段:基础准备与工具上手(第 1-7 天)
第 1 天:把 TypeScript 项目跑起来
目标:让本地出现一句 Hello OpenClaw
步骤:
- 安装 Node.js、pnpm
- 创建项目,初始化 TypeScript
- 写一个最简单的
src/index.ts - 运行它
向 AI 提问:
请一步一步教我在 Windows/macOS 上创建一个 Node.js + TypeScript + pnpm 项目。
要求:
1. 命令逐条给出
2. 解释每条命令是做什么的
3. 最后让我成功运行 src/index.ts 并输出 Hello OpenClaw
验收标准:
- 能在终端执行项目启动命令
- 终端能输出
Hello OpenClaw - 知道
package.json、tsconfig.json、src/index.ts各自是干什么的
第 2 天:补最少够用的 TypeScript
目标:掌握项目一定会用到的部分
重点概念:
string、number、boolean- 函数参数类型和返回值类型
interfaceclassasync/await
向 AI 提问:
我是 0 基础,请用和"聊天机器人项目"有关的 10 个最小例子教我 TypeScript。
每个例子都要包含:
1. 代码
2. 这段代码的作用
3. 我容易犯的错误
4. 一个小练习
验收标准:能看懂下面的代码
interface Message {
userId: string;
text: string;
}
function saveMessage(msg: Message): void {
console.log(msg.text);
}
第 3 天:学 Node.js 基础
目标:只学项目里会用到的文件读写和异步函数
练习:
- 读取一个本地 txt 文件
- 把一个对象写入 JSON 文件
向 AI 提问:
请给我两个 Node.js + TypeScript 小练习:
1. 读取本地 txt 文件并打印内容
2. 把一个 JavaScript 对象写入 JSON 文件
要求:
- 使用现代写法
- 每一步都解释
- 告诉我如何运行
验收标准:
- 能成功读取
notes.txt - 能成功生成一个
output.json - 知道同步和异步的区别
第 4 天:看懂 OpenClaw 的最小结构
目标:建立"模块地图”,理解为什么项目要拆成 Gateway、Agent、Skills、Memory
向 AI 提问:
请用 0 基础能听懂的方式解释这个项目结构。
重点回答:
1. Gateway 是做什么的
2. Agent 是做什么的
3. Skills 是做什么的
4. Memory 是做什么的
5. 它们之间的数据流是什么
6. 如果做精简版,哪些部分可以先不做
验收标准:
- 能用自己的话解释四个模块
- 能画出模块关系图:
Telegram -> Gateway -> Agent -> SkillManager -> Skill -> Agent -> Telegram
第 5 天:跑通 Telegram Bot 最小交互
目标:第一个"外部可见成果"
步骤:
- 创建 Telegram Bot
- 获取 Token
- 写一个最简单的 bot
- 用户发什么,它回什么
向 AI 提问:
请帮我用 TypeScript 写一个最简单的 Telegram Bot。
要求:
1. 用户发来消息后,机器人原样回复
2. 使用易上手的库
3. 告诉我如何保存 TELEGRAM_BOT_TOKEN 到 .env
4. 告诉我如何运行和测试
验收标准:
- 在 Telegram 发"你好",Bot 能回复
- 知道
.env是干嘛的 - 没有把 Token 硬编码进源码
第 6 天:SQLite 入门
目标:只做增删查里的"增"和"查"
重点:
- 建表
- 插入
- 查询
向 AI 提问:
请教我用 better-sqlite3 在 Node.js + TypeScript 项目中:
1. 创建 messages 表
2. 插入一条消息
3. 查询最近 10 条消息
请给我完整可运行示例,并解释 SQL 语句含义
验收标准:
- 程序运行后能自动创建数据库文件
- 能插入一条测试消息
- 能查询并打印出来
第 7 天:第一阶段复盘
目标:整理、检查、规划
向 AI 提问:
请根据我现在已经完成的内容,帮我整理:
1. 我已经掌握了哪些知识点
2. 现在项目还缺哪些模块
3. 下一步最合理的开发顺序是什么
4. 请给我一个精简版 OpenClaw 的依赖关系说明
验收标准:
- 有一份自己的模块顺序说明
- 知道下一阶段先做 Memory
第 2 阶段:Memory 系统实现(第 8-14 天)
第 8-9 天:保存消息和取最近消息
目标:把"聊天历史落盘"做出来
数据表设计:
| 字段 | 含义 |
|---|---|
| id | 自增主键 |
| session_id | 会话 ID |
| user_id | 用户 ID |
| role | user 或 assistant |
| message | 消息内容 |
| timestamp | 时间戳 |
实现函数:
saveMessage()getRecentMessages()
向 AI 提问:
我要做一个聊天机器人 Memory 模块。
请帮我设计一个最小 SQLite 消息表,并用 TypeScript + better-sqlite3 写出:
1. 初始化数据库和建表代码
2. saveMessage(sessionId, userId, role, message)
3. getRecentMessages(sessionId, limit)
4. 一个简单测试脚本
验收标准:
- 能连续存 3 条消息
- 能按时间顺序查出最近 3 条
- 知道
session_id和user_id的区别
第 10-11 天:偏好存储(简单版)
目标:用 Markdown 文件存偏好
文件格式:
- nickname: 小明
- favorite_color: blue
- cc_email: test@example.com
实现函数:
- 读取 Markdown 文件
- 解析为键值对象
向 AI 提问:
请帮我写一个 TypeScript 函数:
1. 读取 user_preferences.md 文件
2. 解析形如 "- key: value" 的 Markdown 列表
3. 返回一个 JavaScript 对象
4. 如果文件不存在,优雅处理
验收标准:
- 能读到偏好文件
- 程序能输出
{ nickname: "小明", favorite_color: "blue" } - 文件不存在时不会崩溃
第 12-13 天:封装成 Memory 类
目标:统一入口
Memory 类方法:
saveMessage()
getRecentMessages()
getPreference()
getAllPreferences()
向 AI 提问:
我已经有 SQLite 消息存储函数和 Markdown 偏好读取函数。
请帮我把它们封装成一个 Memory 类。
要求:
1. 类结构清晰
2. 方法职责单一
3. 给出每个方法的 TypeScript 类型
4. 再给一个测试用例
验收标准:
- 能通过
new Memory()使用它 - 每个方法都能独立测试通过
- 代码不再散落在多个脚本里
第 14 天:专项调试日
目标:测试稳定性
测试场景:
- 存 3 条消息,再查最近 3 条
- 查空会话
- 读取存在的偏好
- 读取不存在的偏好键
- 偏好文件不存在
向 AI 提问:
这是我的 Memory 类代码和测试结果。
预期:
- saveMessage 后应该能查到 3 条记录
实际:
- getRecentMessages 返回空数组
请你逐步帮我排查可能原因,并告诉我每一步该打印什么日志
第 3 阶段:Skills 系统实现(第 15-21 天)
第 15-16 天:定义 Skill 接口
目标:建立统一规范
Skill 接口:
interface Skill {
name: string;
description: string;
parameters: Record<string, unknown>;
execute(input: Record<string, unknown>): Promise<string>;
}
第一个 Skill:PrintMessageSkill
向 AI 提问:
请帮我设计一个适合初学者的 TypeScript Skill 接口。
然后实现一个 PrintMessageSkill:
- 输入 message
- 在控制台打印
- 返回"打印成功:xxx"
并给我一个测试示例
验收标准:
- Skill 接口看得懂
PrintMessageSkill.execute()能跑- 知道"声明"和"实现"的区别
第 17-18 天:实现文件读写 Skill
目标:实现 FileReadWriteSkill,加安全限制
安全要求:
- 只允许读写
data/目录下的文件 - 防止路径乱跑
向 AI 提问:
请帮我实现一个 FileReadWriteSkill。
要求:
1. 支持 read 和 write 两种操作
2. 只允许操作项目 data/ 目录下的 txt 文件
3. 如果文件不存在或路径非法,要返回明确错误信息
4. 用 TypeScript 实现,并给测试代码
验收标准:
- 能写入
data/test.txt - 能读出
data/test.txt - 非法路径会被拒绝
第 19-20 天:做 SkillManager
目标:统一注册和查找 Skill
SkillManager 方法:
registerSkill(skill)getSkill(name)listSkills()executeSkill(name, input)
向 AI 提问:
请帮我写一个 SkillManager 类,用于管理多个 Skill。
要求:
1. 支持注册、获取、列出、执行
2. 如果 skill 不存在,要抛出或返回可读错误
3. 给出 PrintMessageSkill 和 FileReadWriteSkill 的注册示例
验收标准:
- 能注册两个 Skill
- 能按名称执行它们
- 名称不存在时有明确错误提示
第 21 天:Skills 集成测试
目标:流程验证
测试内容:
- 手动调用
PrintMessageSkill - 手动调用
FileReadWriteSkill - 检查参数是否正确传递
- 检查错误处理是否友好
向 AI 提问:
我在执行 FileReadWriteSkill 时出错。
输入参数是:
{ "action": "read", "filePath": "data/test.txt" }
报错信息是:
xxxx
我的预期是:
读取 test.txt 内容并返回字符串
请帮我分析最可能的 3 个原因,并告诉我应该先检查哪里
第 4 阶段:Agent 决策层实现(第 22-28 天)
第 22-23 天:先把 LLM 调通
目标:让程序能把一句话发给模型,再拿回一句回复
向 AI 提问:
请帮我写一个最小的 TypeScript LLM Client。
要求:
1. 从 .env 读取 API Key
2. 提供 askLLM(message: string): Promise<string>
3. 输入一句话,返回模型回复
4. 代码尽量简单,适合初学者
验收标准:
- 调用函数能得到模型回复
- API Key 不写死在代码里
- 出错时有
try/catch
第 24-25 天:让模型返回 Skill 决策 JSON
目标:Agent 核心功能
目标 JSON 格式:
{
"shouldUseSkill": true,
"skillName": "FileReadWriteSkill",
"parameters": {
"action": "read",
"filePath": "data/test.txt"
},
"reason": "用户请求读取文件"
}
向 AI 提问:
请帮我写一个适合初学者的 Prompt。
目标:
让大模型根据用户输入和技能列表,返回固定 JSON,判断是否调用 Skill。
要求:
1. 输出格式稳定
2. 不要返回多余解释
3. 给 3 个示例输入输出
验收标准:
- 模型大多数时候能返回合法 JSON
- 用户说"帮我读取 test.txt"时会选择读文件 Skill
- 用户说"你好"时可以不选 Skill
第 26-27 天:封装 Agent.processMessage()
目标:整个项目的中枢
流程:
- 取历史消息
- 组装 Prompt
- 调 LLM 判断是否调用 Skill
- 如果调用,就执行 Skill
- 如果不调用,就直接回复
- 把用户消息和结果都存入 Memory
向 AI 提问:
请帮我实现一个初学者友好的 Agent 类。
要求有 processMessage(sessionId, userId, userMessage) 方法,流程是:
1. 从 Memory 读取最近消息
2. 获取 Skill 列表
3. 调用 LLM 做决策
4. 如果需要,执行 Skill
5. 把用户消息和回复保存回 Memory
6. 返回最终字符串结果
请把每一步拆成独立的小函数,方便我理解
验收标准:
processMessage()可独立运行- 输入"你好"可以得到普通回复
- 输入"读取 test.txt"可以触发 Skill
第 28 天:Agent 调试日
重点测试:
- 模型返回非法 JSON
- 模型选错 Skill
- Skill 参数不完整
防御性处理:
- JSON 解析失败时,回退成普通聊天
- Skill 不存在时,返回友好错误
- 参数缺失时,提示用户补充
第 5 阶段:Gateway 网关实现(第 29-35 天)
第 29-30 天:做 Telegram Gateway 最小版
目标:正式把 Bot 接到项目主流程
Gateway 职责:
- 接收 Telegram 消息
- 取出
user_id - 生成或确定
session_id - 调 Agent
- 把结果回给用户
向 AI 提问:
请帮我写一个 TypeScript Telegram Gateway。
要求:
1. 使用 telegraf
2. 收到文本消息后,提取 userId
3. 为当前用户生成固定 sessionId
4. 调用 agent.processMessage()
5. 把返回结果回复给用户
验收标准:
- Telegram 消息能进入 Agent
- Agent 返回内容能回到聊天窗口
第 31-32 天:打通 Gateway + Agent
目标:第一次全链路联调
测试消息:
- 普通聊天:“你好”
- 技能调用:“读取 test.txt”
日志打印:
- 收到消息
- 准备调用 Agent
- Agent 决策结果
- Skill 执行结果
- 回复完成
第 33-34 天:会话连续性
目标:让 AI 能记住最近说过的话
实现:
- 取最近 5-10 条消息发给模型
- 在 Prompt 中告诉模型"优先参考历史消息"
测试:
- 用户说:“我叫小王”
- 用户再说:“我刚才说我叫什么?”
- 模型应尽量回答"小王"
第 35 天:真实聊天测试
目标:最终彩排
测试内容:
- 用自己的 Telegram 号和 bot 连续聊 10 分钟
- 观察是否偶发不回复
- 观察是否回复很慢
- 观察是否技能调用失误
- 观察是否能记住刚才说的话
- 观察报错时是否会直接崩掉
第 6 阶段:整合与优化(第 36-42 天)
第 36-37 天:整理项目结构
目标:确保一键启动
任务:
- 所有模块都放到合理目录
.env.example写好pnpm dev一键启动- 新人下载后知道从哪里开始看
第 38-39 天:加用户体验细节
优化内容:
- 启动时打印欢迎信息
- Skill 执行时显示"正在处理…"
- 错误时显示友好提示
- 添加简单的帮助命令
第 40-42 天:性能优化
优化方向:
- 数据库查询优化
- 减少不必要的 LLM 调用
- 缓存常用数据
- 日志分级
第 43-45 天:最终验收
验收清单
功能验收:
- 用户可以和 Bot 正常聊天
- Bot 能调用 FileReadWriteSkill
- Bot 能记住最近 10 条消息
- 错误处理友好
- 项目可以一键启动
代码验收:
- 目录结构清晰
- 每个模块职责单一
- 有基本测试用例
- README 文档完整
文档验收:
- 安装步骤清晰
- 配置说明完整
- 常见问题解答
- 学习路线总结
关键学习心得
1. 每天记录的重要性
每天的学习笔记应该包含:
- 今天学到了什么概念
- 写了什么代码
- 遇到了什么报错
- 如何解决的
- 明天要做什么
2. 向 AI 提问的技巧
好的提问:
我在执行 FileReadWriteSkill 时出错。
输入参数是:{ "action": "read", "filePath": "data/test.txt" }
报错信息是:xxxx
我的预期是:读取 test.txt 内容并返回字符串
请帮我分析最可能的 3 个原因,并告诉我应该先检查哪里
不好的提问:
报错了,帮我修一下
3. 避免常见陷阱
- 不要试图一次学完所有知识
- 不要追求完美代码
- 不要跳过基础直接做复杂功能
- 不要害怕犯错,错误是最好的学习机会
下一步行动
如果你已经完成了这个 45 天计划,可以考虑:
- 扩展更多 Skills:天气查询、待办事项、日历管理等
- 支持更多平台:Discord、微信等
- 增加高级功能:长期记忆、用户画像、多轮对话优化
- 性能优化:异步处理、消息队列、缓存策略
- 部署上线:云服务器、Docker 容器化
完成时间:2026-03-08 预计完成时间:45 天 每日投入:3 小时