Skip to content

从 Letta Code 到 Mini-Letta:给 Agent 装上会成长的记忆 ​

在线阅读:https://luxiang0412.github.io/letta-memory-book/ 读 letta-ai/letta-code(70ead335)记忆子系统的源码,从零写一个带 git 记忆、系统提示编译、上下文压缩、后台反思、多机同步与隔离 的 agent。 配套代码:github.com/luxiang0412/mini-letta(本地位于 code/mini-letta;Bun + TypeScript,v0.1 → v1.0,每个 Part 一个 tag)。

读完这本书,你能从零写出一个带长期记忆的 agent:它的记忆是 git 仓库里的 Markdown 文件,只有已提交的记忆会被编译进系统提示;对话中途的记忆变化以 <memory_update> 告知模型而不破坏提示缓存;长对话会在溢出前自动压缩,被压掉的细节能用 recall 找回;对话之后,一个反思子 agent 在隔离的 git worktree 里整理记忆,再由一个六状态的收尾状态机合并回来;记忆能在多台机器之间同步,同一台机器上的其他 agent 看不到它。

目录 ​

Part 0 导读

Part I 全景

Part II 记忆即文件:MemFS

Part III 编译:从记忆到系统提示

Part IV 上下文窗口与 recall

Part V 睡眠时间:后台反思

Part VI 平台化

附录

快速开始 ​

bash
cd code/mini-letta
bun install
bun test                                   # 50 个测试,离线
export MINI_LETTA_HOME=$(mktemp -d)        # 永远在临时目录里玩
bun src/cli.ts chat -p "记住:我用 pnpm"
bun src/cli.ts chat -c another -p "你知道我什么?"
bun scripts/demo.ts && bun src/cli.ts palace   # 看 Memory Palace
git diff v0.2 v0.3                         # 看某一章加了什么

这本书是怎么验证的 ​

  • 代码:mini-letta 每个 tag 都在独立 worktree 里重新跑过测试和类型检查:v0.1 4 个、v0.2 8 个、v0.3 15 个、v0.4 21 个、v0.5 34 个、v1.0 50 个,全部通过;madge 检查无循环依赖。
  • 真模型:在本地 Ollama(qwen2.5:3b)上跑过 v0.1–v0.5 的关键流程。小模型的失误(谎称已提交、覆盖文件、空反思、只说不做、摘要超长)都原样记录在相应章节,并推动了 mini-letta 里的防御设计。
  • 对照 letta-code:所有 path:line 都在 70ead335 上用 grep -n 核对过。在一个本地克隆里做了三次探针:<memory_update> 的生命周期(第 3、9 章)、全局 core.autocrlf 对反思 worktree 的影响(第 16 章)、以及同一个记忆仓库上 letta-code 与 mini-letta 两个编译器的输出逐字节一致(第 8 章)。
  • 对照中修掉的缺口:写书过程中 v1.0 tag 移动过四次,修复了 --no-verify 绕过 hook、回合之间的提交未被审计、frontmatter 解析与 letta-code 不一致、小窗口下反思永远失败等问题,故事都写在了正文里。
  • 界面与部署:Memory Palace 用 headless Chrome 截图(含 390px 窄屏检查);docker compose 部署后,端到端脚本对运行中的服务跑通了 10 个检查点。

已知局限 ​

  • mini-letta 只实现 MemFS v2;反思子 agent 在同一进程内运行(letta-code 是独立进程);没有 memory worker、冲突修复 worker、反思重试退避、多对话反思。
  • 内核沙箱只实现了 Linux bubblewrap;Docker 镜像内不可用时自动降级。
  • 真模型验证只用了一个 3B 小模型;它暴露了很多问题,但不代表更强模型的表现。

本书基于 letta-code 的公开源码写成,与 Letta 官方无关。

配套代码:github.com/luxiang0412/mini-letta