1. OpenClaw 长期记忆缺失,GBrain 开源记忆层能补上什么
OpenClaw 这类 Agent 跑久了,你大概率会遇到同一个尴尬:昨天刚跟它聊过的项目背景、上周定下的技术选型、某个客户的偏好,今天开新会话它全忘了。OpenClaw 自带的记忆系统记的是偏好、习惯这类表层信息,你长期积累下来的知识——笔记、会议纪要、决策记录——根本没被覆盖进去。这个差距决定了 Agent 到底是「一个听话的工具」还是「越用越懂你的第二大脑」。
GBrain 就是冲着这个缺口来的开源记忆层。它的核心设计叫「compiled truth + timeline」,翻译过来是「当前判断 + 时间线」:每个人、每家公司、每个项目都有独立的一页 Markdown 文件,上半部分写当前最准确的结论,下半部分只追加不修改地记录时间线。普通笔记是纯追加式的,时间一长就变成一堆碎片,你根本找不到「现在最新的结论在哪」;这套结构把结论和证据强制分开,Agent 才有办法持续更新、持续调取。
它适合谁?如果你已经在用 OpenClaw 或 Hermes Agent 跑工作流,手里又攒了一堆 Markdown 笔记、会议记录、日历数据,那 GBrain 基本就是为你准备的。它把对话和资料沉淀成可检索的 Markdown 知识库,Agent 每次提问先去这个库里查一遍再回答。本文要交付的是:GBrain 的部署配置、OpenClaw 的记忆读写接入代码,以及通过 TaoToken 统一 Key 调用模型完成记忆摘要的可复制步骤与验证动作。整套流程走下来,你会得到一个能记住你长期知识的 Agent。
需要提前说清楚两个门槛。第一,GBrain 对模型能力要求偏高,官方测试跑通的是 Claude Opus 4.6 和 GPT-5.4 Thinking 这类强模型,小模型在摘要和实体抽取环节容易出错。第二,数据得你自己灌进去,会议要录、笔记要存、日历要导,冷启动确实不轻松。但只要你愿意把知识沉淀成 Markdown,后面的检索和调用就是自动化的。
2. TaoToken 前置准备:统一 Key 与模型接入配置
GBrain 的记忆摘要、实体抽取、dream cycle 整理,全都要调模型。如果你每个环节都单独配一家厂商的 Key,管理成本会很高,而且模型切换时改配置很烦。TaoToken 的价值就在这里:一个统一 Key,通过 OpenAI 兼容接口调用多家模型,GBrain 和 OpenClaw 都指向同一个 Base URL 就行。
先拿 Key。打开 https://taotoken.net/api-keys ,登录后创建一个 API Key,复制保存好,后面配置里会反复用到。注意这个 Key 只在创建时完整显示一次,丢了就得重建。
拿到 Key 之后,你需要确认三件事,我把它整理成一张对照表,配置时逐项核对:
| 配置项 | 值 | 说明 |
|---|---|---|
| Base URL | https://taotoken.net/api | OpenAI 兼容接口地址,不加任何 UTM 参数 |
| API Key | sk-开头的一串 | 从 API Keys 页面获取 |
| Model ID | 如claude-opus-4-6/gpt-5.4-thinking | 按 GBrain 摘要任务选强模型 |
这里有个坑要提前避开:Base URL 末尾不要带/v1,也不要带斜杠。很多 OpenAI SDK 会自动拼/v1/chat/completions,你手动加了/v1反而会变成/v1/v1/...,直接 404。TaoToken 的接口地址就是https://taotoken.net/api,SDK 会自己补全路径。
如果你还没决定用哪个模型,可以先到 https://taotoken.net/models 看看当前可用的模型列表和上下文长度。GBrain 的 dream cycle 要处理长文档,建议选上下文窗口大的模型,否则一页 Markdown 塞进去就被截断了。
环境变量建议这样设,避免把 Key 硬编码进代码:
export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api" export GBRAIN_MODEL="claude-opus-4-6"设完之后用echo $TAOTOKEN_API_KEY确认一下有没有生效。如果你用的是 Windows PowerShell,把export换成$env:语法。这一步看着简单,但后面 GBrain 和 OpenClaw 都读这几个变量,配错了排查起来很费时间。
3. GBrain 部署与 OpenClaw 记忆读写接入配置
这一节是全文的技术核心,我会把 GBrain 的安装、数据库初始化、OpenClaw 的记忆读写接入,以及模型调用配置全部串起来。你按顺序操作即可。
3.1 安装 GBrain 与初始化本地库
GBrain 依赖 Bun 运行时,先装 Bun:
curl -fsSL https://bun.sh/install | bash && source ~/.bashrc装完验证一下bun --version,能输出版本号就对了。接着拉取 GBrain 并初始化:
bun add github:garrytan/gbrain gbrain initgbrain init会在本地建一个数据库,大约两秒就绪。默认是本地 SQLite,适合笔记量在 1000 个文件以内的场景。如果你笔记超过 1000 个,或者有多设备访问需求,建议迁移到 Supabase 云端数据库,迁移命令在 GBrain 的 README 里有说明。
初始化完成后,导入你的 Markdown 笔记目录:
gbrain import ~/notes导入过程会解析每个 Markdown 文件,按「compiled truth + timeline」结构建立索引。导入完成后可以先用 CLI 验证检索效果:
gbrain query "上次讨论的架构选型"如果这条命令能返回相关笔记片段,说明 GBrain 本体已经跑通了。接下来才是关键:让 OpenClaw 能读写这个记忆库。
3.2 OpenClaw 记忆读写接入配置
OpenClaw 通过一个配置文件声明记忆后端。在 OpenClaw 的配置目录下创建或修改memory.toml,路径通常是~/.openclaw/memory.toml:
[memory] backend = "gbrain" gbrain_path = "/Users/你的用户名/.gbrain/db.sqlite" [memory.read] enabled = true top_k = 5 min_score = 0.35 [memory.write] enabled = true auto_capture = true capture_roles = ["user", "assistant"] [model] base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model_id = "claude-opus-4-6"这份配置里三件套齐全:Base URL 指向 TaoToken 的https://taotoken.net/api,Key 从环境变量TAOTOKEN_API_KEY读取,Model ID 指定摘要用的强模型。top_k = 5表示每次检索返回最相关的 5 条记忆,min_score是相似度阈值,低于这个分数的记忆不会被塞进上下文,避免噪声干扰。
如果你更习惯用 JSON 配置,等价写法是这样:
{ "memory": { "backend": "gbrain", "gbrain_path": "/Users/你的用户名/.gbrain/db.sqlite", "read": { "enabled": true, "top_k": 5, "min_score": 0.35 }, "write": { "enabled": true, "auto_capture": true } }, "model": { "base_url": "https://taotoken.net/api", "api_key_env": "TAOTOKEN_API_KEY", "model_id": "claude-opus-4-6" } }两种格式选一种就行,别同时存在,否则 OpenClaw 加载时会报配置冲突。
3.3 记忆摘要的模型调用代码
GBrain 的 dream cycle 需要调模型把当天对话摘要成结构化记忆。下面这段 Python 代码演示如何通过 TaoToken 完成一次记忆摘要,你可以把它挂到定时任务里:
import os from openai import OpenAI client = OpenAI( base_url=os.environ["TAOTOKEN_BASE_URL"], api_key=os.environ["TAOTOKEN_API_KEY"], ) def summarize_to_memory(raw_dialogue: str) -> str: prompt = f"""把下面的对话整理成一条记忆,按以下格式输出: ## 当前判断 (一句话结论) ## 时间线 - (日期)发生了什么 对话内容: {raw_dialogue} """ resp = client.chat.completions.create( model=os.environ["GBRAIN_MODEL"], messages=[{"role": "user", "content": prompt}], temperature=0.2, ) return resp.choices[0].message.content if __name__ == "__main__": sample = "今天和张工确认了数据库从 MySQL 迁到 PostgreSQL,下周三前完成迁移脚本。" print(summarize_to_memory(sample))这段代码的关键点:base_url用 TaoToken 的接口地址,model从环境变量读,temperature压到 0.2 让摘要更稳定。跑通之后,把返回的 Markdown 写回 GBrain 对应的档案页即可。
4. 验证请求:确认记忆读写与模型调用都通了
配置写完不代表跑通,得一步步验证。我按「先模型、再记忆、后联动」的顺序来,每步都有明确的成功标志。
第一步,验证 TaoToken 模型调用。用 curl 直接打一次接口,排除 SDK 层面的干扰:
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-opus-4-6", "messages": [{"role": "user", "content": "回复两个字:通了"}] }'成功的话你会看到一段 JSON,choices[0].message.content里是「通了」。如果返回 401,说明 Key 有问题;返回 404,多半是 Base URL 写错了。
第二步,验证 GBrain 检索。往笔记目录里放一个测试文件test-memory.md,内容写「项目代号:蓝鲸。技术栈:Rust + WebAssembly。」然后重新导入并查询:
gbrain import ~/notes gbrain query "蓝鲸项目用什么技术栈"成功标志是返回结果里包含Rust + WebAssembly。如果查不到,检查文件是不是.md后缀,以及gbrain import的路径对不对。
第三步,验证 OpenClaw 联动。启动 OpenClaw,开一个新会话,问它「蓝鲸项目用什么技术栈」。如果 OpenClaw 能答出Rust + WebAssembly,说明记忆读取链路通了。再跟它聊几句新内容,等 dream cycle 跑完(或手动触发),用gbrain query查新内容有没有被写进去,验证写入链路。
第四步,验证摘要质量。手动跑一次第 3.3 节的摘要脚本,看输出的 Markdown 是不是「当前判断 + 时间线」结构。如果模型把结论和时间线混在一起,说明 prompt 需要调整,或者模型能力不够,换更强的 Model ID 再试。
四步都过了,整套「OpenClaw + GBrain + TaoToken」的记忆层就算真正跑起来了。这时候你再跟 Agent 聊长期项目,它会先去 GBrain 里查一遍再回答,而不是从零开始。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
配置过程中最容易卡在几个固定报错上,我把真实遇到过的整理出来,对照着排查能省不少时间。
401 Unauthorized。这个最常见,九成是 Key 的问题。先确认echo $TAOTOKEN_API_KEY有输出,再确认 Key 没有多余空格或换行。如果你把 Key 写进了配置文件而不是环境变量,检查有没有被引号包错。还有一种情况:Key 创建后没复制完整,只复制了前半段。到 https://taotoken.net/api-keys 重新生成一个,完整复制。
local proxy failed。这个报错通常出现在 OpenClaw 启动时,意思是它连不上配置的 Base URL。检查memory.toml里的base_url是不是https://taotoken.net/api,末尾有没有多余的斜杠或/v1。另外确认你的网络能正常访问这个地址,用curl -I https://taotoken.net/api看能不能拿到响应头。
reading 'choices' of undefined。这是 OpenAI SDK 的经典报错,意思是返回的 JSON 里没有choices字段。原因通常是接口返回了错误信息而不是正常响应,但代码直接去读resp.choices[0]。排查方法:在调用后先打印完整响应print(resp),看实际返回了什么。多数情况是模型 ID 写错了,或者 Base URL 拼成了/v1/v1/...。
OAuth 相关报错。如果你在配置里看到 OAuth 字样,说明某个环节还在走旧的鉴权流程。TaoToken 用的是 Bearer Token,不需要 OAuth。检查配置文件里有没有残留的oauth_token或auth_type = "oauth"字段,删掉,改成api_key_env = "TAOTOKEN_API_KEY"。
模型返回空内容。有时候请求成功了,但content是空字符串。这通常是模型把内容放进了reasoning_content字段(思考型模型的特性)。处理办法是优先读content,为空时再读reasoning_content。或者换一个非思考型模型做摘要任务。
GBrain 导入后查不到。先确认文件是.md后缀,再确认gbrain import的路径没有写错。如果笔记里有大量非 UTF-8 编码的文件,导入会跳过,用file -I 文件名检查编码,转成 UTF-8 再导入。
排查的核心思路就一条:先确认模型调用通不通(curl 直打),再确认 GBrain 本体通不通(CLI 查询),最后确认两者联动通不通(OpenClaw 问答)。分层排查,别一上来就怀疑整个链路。
6. 长期编码与 Agent 场景:把记忆层用起来
记忆层跑通只是起点,真正让它产生价值的是日常使用习惯。我自己的做法是:每天结束前让 OpenClaw 把当天的对话和笔记过一遍,通过 TaoToken 调模型摘要成结构化记忆,写回 GBrain。第二天开新会话,Agent 自动带着昨天的上下文,不用我重复交代背景。
如果你要长期跑编码类 Agent,比如让 OpenClaw 持续维护一个项目,记忆层的作用会更明显。项目决策、踩过的坑、接口约定,全部沉淀成 Markdown,Agent 每次改代码前先查一遍,避免重复犯错。这种场景建议用 Coding Plan 这类长期方案,配合 TaoToken 的统一 Key,模型调用成本可控,也不用频繁换 Key。
接入文档在 https://taotoken.net/doc ,里面有各语言 SDK 的完整示例和参数说明。模型对话调试可以到 https://taotoken.net/chat ,直接在网页上试 prompt 效果,确认摘要格式对了再写进代码。如果你用 Claude Code 做主力编码工具,它的接入配置在 https://taotoken.net/claude-code 有专门说明,Base URL、Key、Model ID 三件套填法和我上面写的一致。
最后说个实用技巧:GBrain 的档案页是纯 Markdown,你可以直接用 Git 管理。每次 dream cycle 写入后自动 commit,这样记忆的演变过程本身也成了可追溯的历史。哪天 Agent 给出了奇怪的结论,你能翻 commit 记录看它是从哪条记忆推出来的。这比黑盒式的向量数据库透明得多,也是 GBrain 用 Markdown 做存储的聪明之处。