1. 从一次“失忆”说起:OpenClaw 的 Gateway 与记忆系统到底在解决什么
如果你正在本地跑 OpenClaw 这类自托管 Agent,大概率遇到过两个很具体的场景:一是消息从 Telegram、Slack、CLI 同时进来,Agent 把 A 会话的上下文串到了 B 会话里;二是聊到第 40 轮,它突然不记得你十分钟前说过的偏好。前者是 Gateway 的会话路由没配对,后者是记忆系统没接上。
OpenClaw 的定位是一个自托管 Gateway 网关,把聊天渠道(Telegram、Discord、Slack、Signal、iMessage 等)和编码智能体连起来,所有数据落在你自己的磁盘上。它适合愿意自己掌控数据、又想让 Agent 7×24 小时在线的开发者。它的架构分五层:L1 接口输入层、L2 网关控制平面、L3 Agent 运行器、L4 执行与工具层、L5 混合内存系统。其中 L2 的 Gateway 决定“消息去哪”,L5 的记忆系统决定“Agent 记得什么”。
这篇不铺开讲全部五层,只聚焦两件能立刻落地的事:Gateway 的配置骨架,以及记忆系统的读写验证。同时把模型调用通道统一到 TaoToken,用一个 Key 打通对话、Embedding 和后续的 Coding Plan,省得在多个平台之间来回切。
2. 前置准备:用 TaoToken 统一模型与 Embedding 通道
OpenClaw 的记忆检索依赖 Embedding(默认 text-embedding-3-small 这类模型),Agent 推理又依赖对话模型。如果这两类请求走不同平台,Key 管理、额度、限流都要分开处理。TaoToken 提供统一的 API 通道,对话和向量化可以共用一个 Key。
你需要先拿到 Key:访问 https://taotoken.net/api-keys 创建,然后确认两件事——Base URL 用https://taotoken.net/api,模型名按平台文档填写。接入文档在 https://taotoken.net/doc ,里面有各语言 SDK 的示例。
注意:OpenClaw 的配置文件里,凡是出现
base_url或api_base的地方,都指向https://taotoken.net/api,不要带多余路径后缀,否则容易出现 404。
如果你后续要长期跑编码类 Agent(比如让它改代码、跑测试),可以了解下 Coding Plan:https://taotoken.net/coding-plan ,它更适合高频工具调用的场景。只是想先验证模型通不通,用模型对话页面 https://taotoken.net/models 手动发一条消息最快。
3. 可复制配置:config.toml 与 settings.json 骨架
OpenClaw 的全局配置在~/.openclaw/openclaw.json,但很多部署方式会用config.toml做启动参数、用settings.json做运行时设置。下面给一份能直接改的骨架,重点标出 Gateway 和记忆系统相关的字段。
3.1 config.toml:Gateway 与模型通道
# ~/.openclaw/config.toml [gateway] # Gateway 监听端口,渠道适配器通过它接入 port = 8787 # 绑定的主机,本地部署用 127.0.0.1 即可 host = "127.0.0.1" # 会话存储目录,Session Router 依赖它做隔离 session_store = "~/.openclaw/agents/main/sessions" # 车道队列并发上限,群聊刷屏时防止状态竞争 lane_queue_size = 32 [model] # 统一走 TaoToken 通道 provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" # 对话模型,按平台文档填 chat_model = "gpt-4o-mini" # 请求超时,工具调用链较长时适当放大 timeout_ms = 60000 [memory] # 记忆根目录,MEMORY.md 和 memory/*.md 都在这里 workspace = "~/.openclaw/workspace" # 索引数据库,SQLite 单文件 index_db = "~/.openclaw/memory/index.sqlite" # 分块参数,默认 400 tokens、重叠 80 chunk_tokens = 400 chunk_overlap = 80 # 混合检索权重,向量 0.7 + 关键词 0.3 vector_weight = 0.7 text_weight = 0.3 # 最低相关度阈值 min_score = 0.35 [embedding] provider = "openai-compatible" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" model = "text-embedding-3-small"api_key用环境变量注入,别写死在文件里。启动前export TAOTOKEN_API_KEY=你的Key。
3.2 settings.json:记忆检索与工具策略
{ "memorySearch": { "enabled": true, "hybrid": true, "maxResults": 6, "minScore": 0.35, "extraPaths": [] }, "toolPolicy": { "allow": ["memory_search", "memory_get", "read", "write", "exec"], "deny": ["browser"] }, "contextWindowGuard": { "threshold": 0.8, "flushPrompt": "Pre-compaction memory flush. Store durable memories now (use memory/YYYY-MM-DD.md; create memory/ if needed)." } }contextWindowGuard.threshold设为 0.8,意思是上下文用到模型上限的 80% 时触发压缩前的记忆刷新。toolPolicy.deny里先关掉 browser,减少工具 Schema 的 token 开销——工具定义本身就要吃掉 3000 到 5000 tokens,而且无法压缩。
3.3 记忆目录结构
配置生效后,工作区应该长这样:
~/.openclaw/workspace/ ├── MEMORY.md # 长期记忆,RAG 源 ├── AGENTS.md # 行为准则 ├── IDENTITY.md # 身份定义 ├── SOUL.md # 人格设定 ├── USER.md # 用户信息 ├── TOOLS.md # 工具黑白名单 └── memory/ ├── 2026-01-10-reminders.md └── 2026-02-05.md只有.md文件会被索引,JSONL 会话日志不参与索引。这是设计上的取舍:原始日志用于审计追溯,Markdown 才是可检索的长期记忆。
4. 验证:Gateway 连通与记忆读写是否生效
配置写完不代表生效,得动手验证。分三步:Gateway 通不通、记忆写没写进去、检索能不能捞回来。
4.1 验证 Gateway 连通
启动 Gateway 后,先用 curl 打一下健康检查端点:
curl -s http://127.0.0.1:8787/health正常返回类似:
{"status":"ok","sessions":1,"lane_queue":0}如果返回连接拒绝,检查config.toml里的host和port,以及进程是否真的起来了。lane_queue持续大于 0 说明有任务卡在队列里,通常是某个工具调用没返回。
4.2 验证模型通道
单独测一下 TaoToken 通道,确认 Key 和 Base URL 没问题:
curl -s https://taotoken.net/api/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o-mini", "messages": [{"role": "user", "content": "ping"}] }'能拿到choices字段就说明通道通了。这一步排掉的是配置层问题,别等到 Agent 跑起来报错才回头查。
4.3 验证记忆写入
在 OpenClaw 里发一条明确要求记忆的消息,比如“记住我喜欢蓝色,以后 UI 建议用冷色调”。然后检查工作区:
ls -la ~/.openclaw/workspace/memory/ cat ~/.openclaw/workspace/memory/2026-02-05.md如果 Agent 判断这条信息值得持久化,会通过 write 或 exec 工具写入memory/YYYY-MM-DD.md。文件出现后,MemoryIndexManager通过fs.watch检测到变更,触发增量同步。
4.4 验证记忆检索
新开一个会话,问“我之前说过喜欢什么颜色”。Agent 应该先调memory_search,再调memory_get精读。你可以在日志里看到类似返回:
{ "results": [ { "path": "memory/2026-02-05.md", "startLine": 1, "endLine": 3, "score": 0.85, "snippet": "用户提到喜欢蓝色,特别是天空蓝...", "source": "memory" } ], "provider": "openai", "model": "text-embedding-3-small" }score高于 0.35 才会返回。如果搜不到,先确认文件在memory/下、以.md结尾,再确认索引数据库里有没有对应记录:
sqlite3 ~/.openclaw/memory/index.sqlite "SELECT path, source, hash FROM files;"有记录但搜不到,多半是 Embedding 没生成成功,检查[embedding]段的 Key 和模型名。
5. 本篇常见错排查
Gateway 起来了但渠道消息进不来。先看session_store目录权限,Session Router 要能读写。再看渠道适配器的 webhook 地址是否指向 Gateway 的host:port。本地部署时host用127.0.0.1,外部渠道回调需要能访问到,必要时改成局域网地址。
记忆文件写了但检索为空。三个检查点:文件是否.md结尾(.json、.env会被白名单直接拒绝);memorySearch.enabled是否为 true;索引数据库的chunks表有没有数据。SELECT COUNT(*) FROM chunks;返回 0 说明索引没跑起来。
Embedding 请求 401 或 404。401 是 Key 问题,确认环境变量注入成功;404 是 Base URL 问题,https://taotoken.net/api后面不要再拼/v1之类的路径,具体以接入文档为准。
上下文压缩后关键信息丢失。这是设计取舍,不是 bug。压缩指令默认只保留 decisions、TODOs、open questions、constraints,不保留具体数值和时间点。重要精确信息让 Agent 主动写进MEMORY.md,别指望压缩摘要能留住。
工具调用陷入死循环。轻量模型在复杂工具链下容易反复调用同一个工具。先精简toolPolicy.allow,把用不到的工具关掉,减少 Schema 干扰。长期跑编码任务的话,Coding Plan 的额度模型更适合高频调用场景。
6. 把通道和记忆一起收口
Gateway 和记忆系统是 OpenClaw 里最容易配错、也最影响体验的两块。Gateway 配错表现为消息串会话,记忆系统配错表现为 Agent 反复失忆。两者的共同依赖是模型通道——对话模型负责推理,Embedding 模型负责检索,走同一个 TaoToken Key 能省掉不少对账工作。
配置骨架可以直接抄,但验证动作别省。先 curl 健康检查,再单独测通道,最后用一条“记住我喜欢蓝色”跑通写入和检索的完整链路。链路通了,再往上叠多渠道、多 Agent 路由才有意义。