1. OpenClaw 龙虾 Memory 没写进 workspace 的典型现场
你大概率遇到过这种画面:跟 OpenClaw 龙虾聊了半小时,交代了项目背景、命名习惯、接口约定,结果新开一轮对话,它像失忆一样从头问起。翻到~/.openclaw/workspace/一看,MEMORY.md还是空的,memory/子目录里也没有当天的滚动文件。这时候很多人第一反应是「Memory 模块坏了」,但实测下来,真正坏在模块本身的概率很低,更多是记忆写入路径没落到 workspace,或者请求根本没走到模型侧。
先把核心检索词说清楚:OpenClaw 龙虾的 Memory 模块,是负责把对话上下文持久化成长期记忆的组件,它决定 Agent 能不能记住你的偏好、规则和固定上下文。适合谁?适合所有在本地跑 Agent、希望它跨会话保持个性化和项目连续性的开发者。它默认只认 workspace 工作区目录,系统根目录下不会生成也不识别用户级记忆数据。
那为什么会出现「Memory 没写进 workspace」?我把它拆成两条链路来看,这样排查不会乱:
第一条是本地落盘链路:会话结束 → Memory 模块触发写入 → 目标路径解析 → 文件系统权限校验 → 写入MEMORY.md或memory/日期.md。这条链路上任何一环出问题,文件都不会出现在 workspace 里。
第二条是模型调用链路:Memory 模块在写入前,往往需要先让模型对上下文做一次摘要或结构化提取,这一步要走 API 请求。如果请求因为 Key 无效、Base URL 配错、额度耗尽而失败,Memory 模块拿不到摘要结果,自然也就没有内容可写。表现出来就是「模块没报错,但 workspace 里啥都没有」。
这两条链路经常被混在一起看,导致排查方向跑偏。比如有人一直盯着目录权限改,其实是 API Key 早就失效了;也有人反复换 Key,结果是 workspace 路径被自定义到了一个不存在的目录。所以下面我会按「先确认落盘路径,再确认调用通道」的顺序,给你一套能直接复制执行的排查流程。
这里要引入一个关键工具:TaoToken。它是一个统一的大模型 API 通道,提供统一的 Key 和 Base URL,兼容 OpenAI 风格的接口调用。对于 OpenClaw 这类需要频繁调用模型的 Agent 框架来说,用统一通道的好处是:Key 管理集中、模型切换方便、请求是否真正到达模型侧可以通过统一入口核对。当 Memory 模块「看起来没写盘」时,用 TaoToken 的调用日志能快速判断到底是本地写入问题还是请求根本没发出去。
我试过把 OpenClaw 的模型调用统一收敛到 TaoToken 上,排查 Memory 问题时思路清晰很多:先看 TaoToken 侧有没有收到请求,再看本地 workspace 有没有落盘,两个维度一交叉,问题基本就锁定了。
2. TaoToken 前置:统一 Key 与 API 通道准备
在动手排查之前,先把调用通道理顺。OpenClaw 龙虾的 Memory 模块在写入前会调用模型做上下文摘要,这条调用如果走的是默认或零散配置,出问题时你很难判断请求到底发没发出去。把模型调用统一到 TaoToken,等于给整条链路加了一个可观测的中间层。
你需要准备三样东西,我把它称为「三件套」:Base URL、API Key、Model ID。这三者在 OpenClaw 的配置里必须同时正确,缺一个都会导致请求失败,进而让 Memory 写入静默中断。
Base URL 用 TaoToken 的 API 地址:https://taotoken.net/api。注意这里不要加任何多余路径,OpenClaw 内部会按 OpenAI 兼容格式拼接/v1/chat/completions。API Key 在控制台的 API Keys 页面创建,建议单独为 OpenClaw 建一个 Key,方便后续按项目排查用量。Model ID 填你实际要用的模型标识,比如gpt-4o-mini这类,具体以控制台模型列表为准。
创建 Key 的入口在这里:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。进去之后点新建,复制出来的 Key 只显示一次,记得先存到安全的地方。
如果你还没决定用哪个模型,可以先去模型对话页面试一下:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。在网页里发一条消息,确认 Key 和模型都能正常工作,再往 OpenClaw 里配。这一步能帮你排除「Key 本身无效」这种低级但高频的问题。
对于长期跑 Agent、需要稳定编码和记忆能力的场景,可以考虑 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。它的定位是给持续性的编码和 Agent 任务提供更稳定的调用额度,避免跑到一半因为额度问题导致 Memory 写入中断。
配置文档在这里,遇到字段不确定时对照看:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
这里有个容易踩的坑:很多人把 Base URL 写成带/v1的完整路径,结果 OpenClaw 又拼了一次/v1,变成/v1/v1/chat/completions,请求直接 404。记住 TaoToken 的 Base URL 就是https://taotoken.net/api,后面的路径交给框架自己拼。
另外,如果你用的是 Claude Code 这类工具,Anthropic 兼容入口单独配置:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code_anthropic&utm_campaign=rewrite 。OpenClaw 走 OpenAI 兼容格式即可,不用混用。
把三件套准备好之后,先别急着改 OpenClaw 配置,用一条 curl 命令验证通道是否通。这一步很关键,能避免后面把「通道问题」误判成「Memory 模块问题」。
curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer 你的_API_Key" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}], "max_tokens": 10 }'如果返回里有choices字段和正常内容,说明通道没问题。如果返回 401,说明 Key 无效或没带上;如果返回 404,多半是 Base URL 拼错了;如果返回超时,检查网络出口。这一步过了,再进入 OpenClaw 的配置环节。
3. 可复制配置:Memory 落盘路径与模型通道
这一节给你可以直接复制的配置片段。OpenClaw 的配置分两块:一块是 workspace 工作区路径,决定 Memory 往哪写;一块是模型调用通道,决定 Memory 摘要请求往哪发。两块都要对,Memory 才能正常落盘。
先看 workspace 路径。OpenClaw 3.x 里,用户级记忆数据只存放在 workspace 目录下,默认是~/.openclaw/workspace/。如果你在config.yaml里自定义了agents.defaults.workspace,那记忆文件必须放在自定义路径下,否则模块判定为「无记忆文件」,表现为不写入。
打开配置文件:
vim ~/.openclaw/config.yaml找到 workspace 相关字段,确认它指向的路径真实存在。下面是一个可复制的配置片段,把 workspace 和模型通道一起配好:
agents: defaults: workspace: /home/你的用户名/.openclaw/workspace model: provider: openai-compatible base_url: https://taotoken.net/api api_key: sk-你的_TaoToken_Key model_id: gpt-4o-mini timeout: 60 memory: enabled: true write_mode: append daily_roll: true summary_model: gpt-4o-mini这里几个字段解释一下。workspace必须是绝对路径,不要用~,因为部分运行环境下~不会展开,会导致路径解析失败。base_url填 TaoToken 的 API 地址,不带/v1。api_key填你创建的 Key。model_id和summary_model保持一致,Memory 摘要和主对话用同一个模型即可。
memory.enabled必须为true,否则模块根本不启动。write_mode: append表示追加写入,避免覆盖已有记忆。daily_roll: true开启每日滚动记忆,框架会自动在memory/子目录下生成日期文件。
如果你更习惯用 JSON 格式管理配置,OpenClaw 也支持从settings.json读取。下面是对应的 JSON 片段:
{ "agents": { "defaults": { "workspace": "/home/你的用户名/.openclaw/workspace", "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的_TaoToken_Key", "modelId": "gpt-4o-mini", "timeout": 60 } } }, "memory": { "enabled": true, "writeMode": "append", "dailyRoll": true, "summaryModel": "gpt-4o-mini" } }注意 JSON 里字段名用的是驼峰,YAML 里用的是下划线,别混。路径同样要写绝对路径。
配好之后,手动创建 workspace 目录和核心记忆文件,确保结构规范:
WORKSPACE_PATH="/home/你的用户名/.openclaw/workspace" mkdir -p ${WORKSPACE_PATH}/memory touch ${WORKSPACE_PATH}/MEMORY.md chmod 755 ${WORKSPACE_PATH} chmod 644 ${WORKSPACE_PATH}/MEMORY.mdMEMORY.md必须全大写,写成memory.md或Memory.md都不会被识别。memory/子目录必须小写。这两个命名规范是硬性的,Linux 下大小写敏感,写错就是静默失效。
如果你之前从 2.x 升级上来,还要清理旧插件残留。检查config.yaml里有没有plugins.enabled下的memory-core、plugins.slots.memory、plugins.allow里的旧条目,全部删掉。3.x 已经把 Memory 内置,旧插件配置会和内置模块冲突,导致模块被禁用。
清理完重启网关:
openclaw gateway restart重启后确认模块状态:
openclaw status --all输出里找到 memory 相关行,确认是enabled。如果显示disabled或load failed,说明配置还有问题,回到上面检查字段拼写和旧配置残留。
4. 三步验证:写入测试、目录比对、日志回查
配置改完不代表问题解决,必须做验证。我给你三步动作,按顺序执行,能定位到底是配置问题还是调用链路问题。
第一步:写入测试。主动触发一次记忆写入,看模块有没有反应。启动 OpenClaw 后,跟它说一句明确要求记住的话,比如「记住我的项目叫 Alpha,主分支是 main」。然后正常结束这轮会话。这一步的目的是产生一次真实的 Memory 写入事件。
第二步:目录比对。检查 workspace 下文件有没有变化。执行:
WORKSPACE_PATH="/home/你的用户名/.openclaw/workspace" ls -la ${WORKSPACE_PATH} ls -la ${WORKSPACE_PATH}/memory cat ${WORKSPACE_PATH}/MEMORY.md重点看三处:MEMORY.md的修改时间是不是刚刚,memory/下有没有生成当天日期的文件,文件内容里有没有你刚才说的「Alpha」和「main」。如果修改时间没变、内容为空,说明写入没发生。
这时候要区分两种情况。如果memory/下连日期文件都没生成,说明 Memory 模块根本没触发写入,问题在模块启用状态或 workspace 路径解析。如果日期文件生成了但内容为空,说明模块触发了,但摘要请求失败,问题在模型调用通道。
第三步:日志回查。打开两个终端,一个看网关错误日志,一个看运行日志:
tail -f ~/.openclaw/logs/gateway.err.log tail -f ~/.openclaw/logs/gateway.log然后重复第一步的写入测试,观察日志输出。如果看到no such file or directory,是路径问题,回到第 3 节确认 workspace 绝对路径。如果看到permission denied,是权限问题,用chown把 workspace 归属改回当前用户。如果看到401或invalid api key,是 Key 问题,回到第 2 节重新验证通道。如果看到timeout或connection refused,是网络或 Base URL 问题。
日志里还有一种情况值得注意:没有任何 Memory 相关输出。这说明模块压根没加载,回去检查memory.enabled是否为true,以及有没有旧插件配置把它顶掉了。
为了更直观地判断请求有没有到达模型侧,可以在 TaoToken 控制台看调用记录。如果日志显示 Memory 模块发起了摘要请求,但 TaoToken 侧没有对应记录,说明请求在本地就被拦截了,多半是 Base URL 或网络出口问题。如果 TaoToken 侧有记录但返回错误,那就是 Key 或额度问题。这个交叉验证能省很多时间。
控制台入口:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。进去后看请求日志,按时间排序,对照你触发写入测试的时间点。
三步走完,基本能定位到具体环节。下面把常见报错和对应处理整理成对照表,方便你直接查。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth
排查 Memory 没写进 workspace 时,日志里高频出现这几类报错。我按真实报错原文给你对照处理,每条都对应到具体环节。
401 Unauthorized / invalid api key。这是最常见的一类。含义是请求带上了 Key,但 Key 无效、过期或没带上。处理方式:回到 TaoToken 控制台确认 Key 还在、没被删;检查config.yaml里api_key字段有没有多余空格或换行;确认 Key 前缀完整。如果用的是环境变量注入,检查变量名有没有拼错。改完重启网关再测。
local proxy failed / connection refused。这类报错说明请求根本没发出去,卡在本地。常见原因是 Base URL 写错,比如写成了https://taotoken.net/api/v1导致路径重复,或者写成了不存在的地址。也可能是本地网络出口被限制。处理方式:把 Base URL 改回https://taotoken.net/api,用第 2 节的 curl 命令单独验证通道。如果 curl 通但 OpenClaw 不通,检查 OpenClaw 有没有读取到正确的配置文件,有时候是改了config.yaml但实际生效的是settings.json。
Error reading choices / choices is empty。这个报错出现在解析模型返回时。含义是请求发出去了,也收到了响应,但响应结构里没有choices字段。常见原因是模型 ID 写错,或者通道返回了错误结构。处理方式:确认model_id是 TaoToken 支持的模型标识;用 curl 直接请求同一个模型,看返回结构是否正常。如果 curl 返回正常但 OpenClaw 报这个错,检查 OpenClaw 版本是否过旧,旧版本对 OpenAI 兼容格式的解析可能有差异。
OAuth / token refresh failed。如果你在 OpenClaw 里配了需要 OAuth 的模型通道,会出现这类报错。TaoToken 走的是 API Key 模式,不需要 OAuth。处理方式:把 provider 改成openai-compatible,用api_key字段而不是 OAuth 流程。如果你之前配过其他通道的 OAuth 残留,清理掉相关字段。
plugin conflict / memory module disabled。这是 2.x 升级 3.x 后的典型问题。旧插件配置和内置模块冲突,导致模块被禁用。处理方式:删除config.yaml里所有memory-core相关配置,删除~/.openclaw/plugins/memory-core/目录,重启网关。
no such file or directory。路径不存在。检查 workspace 绝对路径是否真实存在,MEMORY.md是否创建。注意不要用~,用完整路径。
permission denied。权限不足。检查 workspace 归属用户是不是当前用户,权限是不是至少 755(目录)和 644(文件)。如果之前用sudo跑过初始化,目录可能归属 root,用chown -R $USER:$USER改回来。
这里再强调一次三件套的完整性:Base URL、Key、Model ID 必须同时正确。任何一项缺失或错误,都会导致 Memory 摘要请求失败,进而表现为「没写进 workspace」。排查时不要只盯着一个字段改,三个一起核对。
如果你在排查过程中需要重新生成 Key,入口还是 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。接入文档在:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。遇到字段不确定时对照文档,比反复试错快。
6. 把链路收敛到统一通道,Memory 问题不再靠猜
排查到最后你会发现,OpenClaw 龙虾 Memory 没写进 workspace,绝大多数情况不是模块本身有 bug,而是落盘路径和调用通道这两条链路里有一环没对齐。路径问题靠目录检查和权限修复解决,通道问题靠统一 Key 和 Base URL 解决。
把模型调用收敛到 TaoToken 之后,最大的变化是排查从「猜」变成了「看」。请求有没有发出去、有没有到达模型侧、返回了什么错误,在控制台和日志里都能对上。Memory 模块的摘要请求走同一条通道,出问题时你能快速判断是本地写入失败还是调用失败,不用在两个方向之间反复横跳。
如果你还在用零散的 Key 和多个 Base URL 拼凑 OpenClaw 的模型调用,建议统一到一条通道上。长期跑 Agent 和编码任务的,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。只是想先验证模型能不能正常对话的,去模型对话页面发一条消息最快:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。
最后留一个实用习惯:每次改完 OpenClaw 配置,先跑一遍第 4 节的三步验证,再开始正式对话。写入测试、目录比对、日志回查,三步不到两分钟,能省掉后面半小时的排查。Memory 文件建议定期备份MEMORY.md,它是你 Agent 个性化的核心资产,丢了重建成本很高。