核心目标

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

步骤

  1. 安装 Node.js、pnpm
  2. 创建项目,初始化 TypeScript
  3. 写一个最简单的 src/index.ts
  4. 运行它

向 AI 提问

请一步一步教我在 Windows/macOS 上创建一个 Node.js + TypeScript + pnpm 项目。
要求:
1. 命令逐条给出
2. 解释每条命令是做什么的
3. 最后让我成功运行 src/index.ts 并输出 Hello OpenClaw

验收标准

  • 能在终端执行项目启动命令
  • 终端能输出 Hello OpenClaw
  • 知道 package.jsontsconfig.jsonsrc/index.ts 各自是干什么的

第 2 天:补最少够用的 TypeScript

目标:掌握项目一定会用到的部分

重点概念

  • stringnumberboolean
  • 函数参数类型和返回值类型
  • interface
  • class
  • async/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 基础

目标:只学项目里会用到的文件读写和异步函数

练习

  1. 读取一个本地 txt 文件
  2. 把一个对象写入 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 最小交互

目标:第一个"外部可见成果"

步骤

  1. 创建 Telegram Bot
  2. 获取 Token
  3. 写一个最简单的 bot
  4. 用户发什么,它回什么

向 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
roleuser 或 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_iduser_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 天:专项调试日

目标:测试稳定性

测试场景

  1. 存 3 条消息,再查最近 3 条
  2. 查空会话
  3. 读取存在的偏好
  4. 读取不存在的偏好键
  5. 偏好文件不存在

向 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>;
}

第一个 SkillPrintMessageSkill

向 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()

目标:整个项目的中枢

流程

  1. 取历史消息
  2. 组装 Prompt
  3. 调 LLM 判断是否调用 Skill
  4. 如果调用,就执行 Skill
  5. 如果不调用,就直接回复
  6. 把用户消息和结果都存入 Memory

向 AI 提问

请帮我实现一个初学者友好的 Agent 类。
要求有 processMessage(sessionId, userId, userMessage) 方法,流程是:
1. 从 Memory 读取最近消息
2. 获取 Skill 列表
3. 调用 LLM 做决策
4. 如果需要,执行 Skill
5. 把用户消息和回复保存回 Memory
6. 返回最终字符串结果
请把每一步拆成独立的小函数,方便我理解

验收标准

  • processMessage() 可独立运行
  • 输入"你好"可以得到普通回复
  • 输入"读取 test.txt"可以触发 Skill

第 28 天:Agent 调试日

重点测试

  1. 模型返回非法 JSON
  2. 模型选错 Skill
  3. 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

目标:第一次全链路联调

测试消息

  1. 普通聊天:“你好”
  2. 技能调用:“读取 test.txt”

日志打印

  • 收到消息
  • 准备调用 Agent
  • Agent 决策结果
  • Skill 执行结果
  • 回复完成

第 33-34 天:会话连续性

目标:让 AI 能记住最近说过的话

实现

  • 取最近 5-10 条消息发给模型
  • 在 Prompt 中告诉模型"优先参考历史消息"

测试

  1. 用户说:“我叫小王”
  2. 用户再说:“我刚才说我叫什么?”
  3. 模型应尽量回答"小王"

第 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 天计划,可以考虑:

  1. 扩展更多 Skills:天气查询、待办事项、日历管理等
  2. 支持更多平台:Discord、微信等
  3. 增加高级功能:长期记忆、用户画像、多轮对话优化
  4. 性能优化:异步处理、消息队列、缓存策略
  5. 部署上线:云服务器、Docker 容器化

完成时间:2026-03-08 预计完成时间:45 天 每日投入:3 小时