1. openclaw 记忆文件到底在解决什么问题
openclaw 的记忆 memory 文件配置,说白了就是让本地 AI 工具链在跨会话时还能记住你的偏好、项目背景和昨天聊过的方案。它不是一个抽象概念,而是落在磁盘上的一组 Markdown 与 JSONL 文件:MEMORY.md存长期事实,memory/YYYY-MM-DD.md存当天流水,sessions/存原始会话,USER.md和SOUL.md分别锚定用户画像与 Agent 人格。适合谁?适合在本地跑 openclaw、又想把模型请求统一走一个 Key/API 通道的开发者——你既不想每次换模型都改一堆环境变量,也不想记忆文件因为通道配置写错而根本没被加载。
我见过最常见的翻车现场是:settings.json里通道字段写对了,但 memory 路径用了相对路径,启动目录一换,Agent 就“失忆”了;或者 Key 塞进了错误的层级,请求能通但记忆读写静默失败。这篇就围绕settings.json骨架,把 memory 路径与 TaoToken 通道字段一次写清楚,再附一次启动加载与记忆读写的验证动作,让你自己能确认 memory 文件被正确识别。
核心检索词先摆出来:openclaw 记忆 memory 文件配置,本质是两件事——记忆落盘位置和模型请求出口。前者决定 Agent 记不记得住,后者决定它能不能稳定调用模型。两者在settings.json里是分开的字段,混在一起写就会互相干扰。
2. TaoToken 前置:统一 Key 与通道字段怎么摆
TaoToken 在这里的角色是统一 Key/API 通道。你不需要在 openclaw 里为每个模型单独配一套凭证,而是把请求出口指向一个兼容接口,Key 用同一套。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api (这个不加 UTM)。
在动手改settings.json之前,先把 Key 准备好。到控制台创建 API Key,路径是 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,然后在 API Keys 页面生成并复制,页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。这一步别跳过,后面所有验证都依赖这个 Key。
注意:Key 只放在
settings.json的通道字段里,不要写进MEMORY.md或USER.md。记忆文件是给模型读的,凭证泄露风险要自己兜住。
如果你后面要长期跑编码或 Agent 任务,可以了解 Coding Plan,入口是 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入细节和字段说明在文档里,地址是 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。想先验证模型通不通,用模型对话页面最快:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
3. 可复制的 settings.json 骨架(含 memory 路径与通道字段)
下面这份骨架可以直接抄,改三个地方:apiKey、workspace的绝对路径、model名称。其余字段保持结构即可。
{ "openclaw": { "workspace": "/Users/yourname/.openclaw/workspace", "memory": { "enabled": true, "longTermFile": "MEMORY.md", "shortTermDir": "memory", "sessionsDir": "sessions", "userFile": "USER.md", "soulFile": "SOUL.md", "loadTodayAndYesterday": true, "maxShortTermFiles": 7 }, "provider": { "type": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "model": "claude-sonnet-4-5", "timeoutMs": 60000, "maxRetries": 2 } } }几个字段值得单独说。workspace必须是绝对路径,openclaw 启动时不会帮你解析~,写成~/.openclaw/workspace在部分 shell 下会失败。memory.longTermFile和shortTermDir是相对workspace的路径,不要写成绝对路径,否则加载器会拼出双斜杠或找不到文件。loadTodayAndYesterday控制新会话是否自动加载今天和昨天的日志,调试阶段建议保持true,方便你观察记忆是否被读进来。
provider.baseUrl指向https://taotoken.net/api,注意结尾不要多加/v1,openclaw 的兼容层会自己补。provider.type用openai-compatible即可,这是最通用的对接方式。maxRetries设 2 是为了在网络抖动时自动重试,但别设太大,否则记忆写入失败会拖慢启动。
提示:如果你的 openclaw 版本把 provider 配置放在独立的
providers.json,把上面provider整块挪过去,memory块留在settings.json。字段名不变。
目录结构要和字段对应上,启动前确认工作区长这样:
/Users/yourname/.openclaw/workspace/ ├── MEMORY.md ├── USER.md ├── SOUL.md ├── memory/ │ ├── 2026-03-05.md │ └── 2026-03-04.md └── sessions/ └── session-001.jsonlMEMORY.md里先写一行可识别的内容,比如- 用户偏好:使用 Python 3.12,代码风格简洁。这行会在验证阶段被读出来,用来确认长期记忆加载成功。
4. 启动加载与记忆读写的验证动作
配置写完,先做启动加载验证。在终端里跑:
cd /Users/yourname/.openclaw openclaw --config ./settings.json --log-level debug观察日志里有没有这几行关键输出:memory: long-term file loaded、memory: short-term files loaded count=2、provider: baseUrl=https://taotoken.net/api。如果long-term file loaded没出现,说明longTermFile路径拼错了,或者文件不存在。如果provider那行没出现,说明provider块没被解析,检查 JSON 是否有多余逗号。
启动成功后,做一次记忆读写验证。在 openclaw 交互界面里输入:
请读取 MEMORY.md 的第一条内容并原样返回预期返回类似用户偏好:使用 Python 3.12,代码风格简洁。如果返回的是“无法访问文件”或空内容,说明记忆加载器没拿到workspace路径,回到settings.json检查workspace是否为绝对路径。
再验证写入。输入:
把“今天验证了 memory 加载”追加到今天的日志文件然后去memory/目录看当天的YYYY-MM-DD.md,应该多出一行。如果文件没变化,但对话里模型说“已写入”,那多半是shortTermDir指向了别处,或者进程没有写权限。用ls -la memory/确认目录权限,必要时chmod 755 memory。
最后验证通道是否真的走了 TaoToken。在 debug 日志里搜POST https://taotoken.net/api,能看到请求记录就说明通道字段生效了。如果看到的是别的域名,说明baseUrl被其他配置覆盖了,检查有没有环境变量OPENAI_BASE_URL之类的在抢优先级。
5. 本篇常见错排查
报错一:memory: long-term file not found。九成是workspace用了相对路径或~。openclaw 不做 shell 展开,改成/Users/yourname/.openclaw/workspace这种绝对路径即可。另一个可能是longTermFile写成了./MEMORY.md,去掉./。
报错二:provider: unauthorized 401。Key 错了或没带对前缀。TaoToken 的 Key 通常以sk-开头,复制时别把前后空格带进去。如果 Key 正确仍 401,检查baseUrl是不是写成了https://taotoken.net/api/带尾斜杠,某些兼容层会把尾斜杠拼成双斜杠导致鉴权失败。
报错三:记忆文件被加载但内容为空。检查MEMORY.md的编码,必须是 UTF-8 无 BOM。用file MEMORY.md确认。如果是 UTF-16,加载器会读出乱码或空字符串。
报错四:新会话不加载昨天日志。loadTodayAndYesterday为true时,加载器按系统日期找YYYY-MM-DD.md。如果你的系统时区和日志文件名日期不一致,就会找不到。统一用本地日期命名,或者把maxShortTermFiles调大让它按文件名排序兜底。
报错五:写入记忆后重启丢失。说明写的是内存缓存,没落盘。检查memory.enabled是否为true,以及shortTermDir是否有写权限。用touch memory/test.md手动测一下权限,能创建就说明是配置问题,不能创建就是权限问题。
注意:排查时优先看 debug 日志里的
memory:和provider:前缀行,这两类行能覆盖 80% 的配置错误。别一上来就改代码。
6. 把通道和记忆分开管,后面少踩坑
实测下来,openclaw 的记忆问题和通道问题经常被混在一起报错,但它们的排查路径完全不同。记忆看workspace和memory块,通道看provider块。把这两块在settings.json里物理隔开,日志里也分开打前缀,定位速度会快很多。
如果你要长期跑编码或 Agent 任务,建议把 Key 和通道配置固定下来,用 Coding Plan 管理额度,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。接入字段有疑问就翻文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。想快速确认某个模型在当前通道下能不能调通,直接去模型对话页面发一条消息:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Key 管理和新建都在 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。
最后留一个我自己的习惯:每次改完settings.json,先跑一次openclaw --config ./settings.json --dry-run(如果你的版本支持),它会打印解析后的 memory 路径和 provider 基址,不用真启动就能看出字段有没有被正确读取。这个动作比反复重启省时间。