自进化记忆 OS,服务 LLM 与 AI 智能体:超持久记忆、混合检索、跨任务技能复用,省 35.24% token,支持 DeepSeek Harness。
71.3/100
综合分
12,228
GitHub 星标
3,529
npm 周下载
—/5
用户评分
数据截至 2026/11/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add @memtensor/memos-local-pluginnpm 源 · @memtensor/memos-local-plugin 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · search
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 0 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过安装清单取自 apps/memos-local-plugin/package.json
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包@memtensor/memos-local-plugin @ 2.0.21
✓Node 引擎要求 >=22.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 02:34:03
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0🔴 扫描:高危尚无人工评估
静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。
安装时即执行脚本可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 117 处,展示前 115 条)
- 读取密钥环境变量dist/core/config/index.js:211
return process.env.OPENCODE_GO_API_KEY; - 读取密钥环境变量dist/core/config/index.js:214
return process.env.OPENCODE_ZEN_API_KEY; - 读取本地文件dist/core/config/paths.js:33
const legacyDb = existsSync(join(legacyHome, "data", "memos.db")); - 读取本地文件dist/core/config/paths.js:34
const canonicalDb = existsSync(join(installRoot, "data", "memos.db")); - 读取本地文件dist/core/config/paths.js:58
const value = JSON.parse(readFileSync(markerFile, "utf8")); - 写入本地文件dist/core/config/paths.js:72
mkdirSync(pathResolve(markerFile, ".."), { recursive: true }); - 写入本地文件dist/core/config/paths.js:79
writeFileSync(tempFile, payload, { encoding: "utf8", mode: 0o600 }); - 写入本地文件dist/core/config/paths.js:80
renameSync(tempFile, markerFile); - 读取本地文件dist/core/config/paths.js:83
if (existsSync(join(root, "config.yaml")) || existsSync(join(root, ".auth.json"))) { - 读取本地文件dist/core/config/paths.js:87
return readdirSync(join(root, "skills")).length > 0; - 写入本地文件dist/core/logger/transports/file-rotating.js:70
appendFileSync(this.fd, text, "utf8"); - 写入本地文件dist/core/logger/transports/file-rotating.js:82
mkdirSync(dirname(this.opts.filePath), { recursive: true, mode: 0o700 }); - 读取本地文件dist/core/logger/transports/file-rotating.js:115
if (!existsSync(this.opts.filePath)) - 读取本地文件dist/core/logger/transports/file-rotating.js:123
while (existsSync(target) || existsSync(target + ".gz")) { - 写入本地文件dist/core/logger/transports/file-rotating.js:128
renameSync(this.opts.filePath, target); - 删除本地文件dist/core/logger/transports/file-rotating.js:137
unlinkSync(target); - 读取本地文件dist/core/logger/transports/file-rotating.js:151
const entries = readdirSync(dir) - 删除本地文件dist/core/logger/transports/file-rotating.js:158
unlinkSync(e.full); - 读取本地文件dist/core/logger/transports/file-rotating.js:176
return statSync(p).mtimeMs; - 发起网络请求dist/core/llm/fetcher.js:43
const resp = await fetch(opts.url, { - 发起网络请求dist/core/llm/fetcher.js:168
const resp = await fetch(opts.url, { - 读取本地文件dist/core/embedding/providers/local-process.js:19
if (!existsSync(entry)) { - 执行外部命令来自配置/变量dist/core/embedding/providers/local-process.js:40
const child = fork(fileURLToPath(entry), [], options); - 发起网络请求dist/core/embedding/fetcher.js:39
const resp = await fetch(opts.url, { - 发起网络请求dist/core/hub/client.js:472
const res = await fetch(`${normalizeHubUrl(hubUrl)}${route}`, { - 读取本地文件adapters/openclaw/index.ts:70
const packageJsonPath = candidates.find((candidate) => existsSync(candidate)); - 读取本地文件adapters/openclaw/index.ts:72
const pkg = JSON.parse(readFileSync(packageJsonPath, "utf8")) as { - 读取本地文件adapters/openclaw/index.ts:114
existsSync(path.join(candidate, "package.json")), - 读取本地文件adapters/openclaw/index.ts:132
return candidates.find((candidate) => existsSync(candidate)) ?? candidates[0]; - 执行外部命令来自配置/变量bridge/hermes-process.ts:74
childProcess.execFileSync(file, [...args], options) as unknown as string; - 读取本地文件bridge/status.ts:45
fs.readFileSync(statusFile, "utf8"), - 写入本地文件bridge/status.ts:147
fs.mkdirSync(path.dirname(statusFile), { recursive: true }); - 写入本地文件bridge/status.ts:148
fs.writeFileSync(statusFile, JSON.stringify(next), "utf8"); - 读取本地文件bridge.mts:109
const raw = fs.readFileSync(pidPath, "utf8").trim(); - 写入本地文件bridge.mts:120
fs.mkdirSync(path.dirname(pidPath), { recursive: true }); - 写入本地文件bridge.mts:121
fs.writeFileSync(pidPath, String(process.pid), "utf8"); - 读取本地文件bridge.mts:126
const content = fs.readFileSync(pidPath, "utf8").trim(); - 删除本地文件bridge.mts:127
if (content === String(process.pid)) fs.unlinkSync(pidPath); - 读取本地文件bridge.mts:188
fs.readFileSync(path.join(rootDir, "package.json"), "utf8"), - 读取本地文件bridge.mts:543
if (fs.existsSync(path.join(__dirname, "package.json"))) return __dirname; - 读取本地文件bridge.mts:545
if (fs.existsSync(path.join(parent, "package.json"))) return parent; - 读取密钥环境变量core/config/index.ts:244
return process.env.OPENCODE_GO_API_KEY; - 读取密钥环境变量core/config/index.ts:247
return process.env.OPENCODE_ZEN_API_KEY; - 读取本地文件core/config/paths.ts:75
const legacyDb = existsSync(join(legacyHome, "data", "memos.db")); - 读取本地文件core/config/paths.ts:76
const canonicalDb = existsSync(join(installRoot, "data", "memos.db")); - 读取本地文件core/config/paths.ts:101
const value = JSON.parse(readFileSync(markerFile, "utf8")) as { - 写入本地文件core/config/paths.ts:123
mkdirSync(pathResolve(markerFile, ".."), { recursive: true }); - 写入本地文件core/config/paths.ts:130
writeFileSync(tempFile, payload, { encoding: "utf8", mode: 0o600 }); - 写入本地文件core/config/paths.ts:131
renameSync(tempFile, markerFile); - 读取本地文件core/config/paths.ts:135
if (existsSync(join(root, "config.yaml")) || existsSync(join(root, ".auth.json"))) { - 读取本地文件core/config/paths.ts:139
return readdirSync(join(root, "skills")).length > 0; - 发起网络请求core/embedding/fetcher.ts:70
const resp = await fetch(opts.url, { - 发起网络请求core/hub/client.ts:504
const res = await fetch(`${normalizeHubUrl(hubUrl)}${route}`, { - 发起网络请求core/llm/fetcher.ts:79
const resp = await fetch(opts.url, { - 发起网络请求core/llm/fetcher.ts:242
const resp = await fetch(opts.url, { - 读取本地文件core/telemetry/sender.ts:44
const raw = fs.readFileSync(credPath, "utf-8"); - 读取本地文件core/telemetry/sender.ts:132
const existing = fs.readFileSync(idFile, "utf-8").trim(); - 写入本地文件core/telemetry/sender.ts:139
fs.mkdirSync(path.dirname(idFile), { recursive: true }); - 写入本地文件core/telemetry/sender.ts:140
fs.writeFileSync(idFile, newId, "utf-8"); - 读取本地文件core/telemetry/sender.ts:150
const raw = fs.readFileSync(filePath, "utf-8").trim(); - 写入本地文件core/telemetry/sender.ts:170
fs.mkdirSync(path.dirname(filePath), { recursive: true }); - 写入本地文件core/telemetry/sender.ts:171
fs.writeFileSync(filePath, `${Date.now()}|${id}`, "utf-8"); - 读取本地文件core/telemetry/sender.ts:180
const existing = fs.readFileSync(filePath, "utf-8").trim(); - 写入本地文件core/telemetry/sender.ts:187
fs.mkdirSync(path.dirname(filePath), { recursive: true }); - 写入本地文件core/telemetry/sender.ts:188
fs.writeFileSync(filePath, today, "utf-8"); - 发起网络请求core/telemetry/sender.ts:255
const resp = await fetch(this.armsEndpoint, { - 读取本地文件core/telemetry/sender.ts:336
lastPing = fs.readFileSync(this.dailyPingFile, "utf-8").trim(); - 执行外部命令来自配置/变量dist/bridge/hermes-process.js:56
const defaultExecFileSync = (file, args, options) => childProcess.execFileSync(file, [...args], options); - 读取本地文件dist/bridge/status.js:8
const parsed = JSON.parse(fs.readFileSync(statusFile, "utf8")); - 写入本地文件dist/bridge/status.js:87
fs.mkdirSync(path.dirname(statusFile), { recursive: true }); - 写入本地文件dist/bridge/status.js:88
fs.writeFileSync(statusFile, JSON.stringify(next), "utf8"); - 读取本地文件dist/bridge.cjs:97
const raw = fs.readFileSync(pidPath, "utf8").trim(); - 写入本地文件dist/bridge.cjs:109
fs.mkdirSync(path.dirname(pidPath), { recursive: true }); - 写入本地文件dist/bridge.cjs:110
fs.writeFileSync(pidPath, String(process.pid), "utf8"); - 读取本地文件dist/bridge.cjs:114
const content = fs.readFileSync(pidPath, "utf8").trim(); - 删除本地文件dist/bridge.cjs:116
fs.unlinkSync(pidPath); - 读取本地文件dist/bridge.cjs:186
const pkgVersion = JSON.parse(fs.readFileSync(path.join(rootDir, "package.json"), "utf8")).version; - 读取本地文件dist/bridge.cjs:525
if (fs.existsSync(path.join(__dirname, "package.json"))) - 读取本地文件dist/bridge.cjs:528
if (fs.existsSync(path.join(parent, "package.json"))) - 读取本地文件dist/bridge.cjs:536
return pathToEsmUrl(fs.existsSync(distAbs) ? distAbs : sourceAbs); - 读取本地文件dist/bridge.mjs:90
const raw = fs.readFileSync(pidPath, "utf8").trim(); - 写入本地文件dist/bridge.mjs:102
fs.mkdirSync(path.dirname(pidPath), { recursive: true }); - 写入本地文件dist/bridge.mjs:103
fs.writeFileSync(pidPath, String(process.pid), "utf8"); - 读取本地文件dist/bridge.mjs:107
const content = fs.readFileSync(pidPath, "utf8").trim(); - 删除本地文件dist/bridge.mjs:109
fs.unlinkSync(pidPath); - 读取本地文件dist/bridge.mjs:166
const pkgVersion = JSON.parse(fs.readFileSync(path.join(rootDir, "package.json"), "utf8")).version; - 读取本地文件dist/bridge.mjs:456
if (fs.existsSync(path.join(__dirname, "package.json"))) - 读取本地文件dist/bridge.mjs:459
if (fs.existsSync(path.join(parent, "package.json"))) - 读取本地文件scripts/normalize-sqlite-lock.cjs:9
const lock = JSON.parse(fs.readFileSync(file, "utf8")); - 写入本地文件scripts/normalize-sqlite-lock.cjs:22
fs.writeFileSync(file, JSON.stringify(lock, null, 2) + "\n"); - 读取本地文件scripts/sync-hermes-version.cjs:19
if (!fs.existsSync(packageJsonPath)) { - 读取本地文件scripts/sync-hermes-version.cjs:22
if (!fs.existsSync(manifestPath)) { - 读取本地文件scripts/sync-hermes-version.cjs:28
packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8")); - 读取本地文件scripts/sync-hermes-version.cjs:39
const manifest = fs.readFileSync(manifestPath, "utf8"); - 写入本地文件scripts/sync-hermes-version.cjs:55
fs.writeFileSync(manifestPath, synchronized, "utf8"); - 读取本地文件server/middleware/static.ts:63
const st = await stat(target); - 读取本地文件server/middleware/static.ts:77
const buf = await readFile(target); - 读取本地文件server/middleware/static.ts:81
const stream = createReadStream(target); - 执行外部命令固定命令server/routes/admin.ts:315
const child = spawn("bash", ["-c", cmd], { - 执行外部命令来自配置/变量server/routes/admin.ts:346
const child = spawn(command, [...args], { stdio: "ignore" }); - 读取本地文件server/routes/auth.ts:128
if (!existsSync(p)) return null; - 读取本地文件server/routes/auth.ts:130
const raw = JSON.parse(readFileSync(p, "utf8")) as AuthState; - 写入本地文件server/routes/auth.ts:142
mkdirSync(dirname(p), { recursive: true }); - 写入本地文件server/routes/auth.ts:143
writeFileSync(p, JSON.stringify(state, null, 2), "utf8"); - 写入本地文件server/routes/auth.ts:145
chmodSync(p, 0o600); - 读取本地文件server/routes/auth.ts:376
if (existsSync(p)) { - 读取本地文件server/routes/import-export.ts:414
const info = await stat(path); - 读取本地文件server/routes/import-export.ts:424
const raw = await readFile(path, "utf8"); - 读取本地文件server/routes/import-export.ts:537
const agentEntries = await readdir(path, { withFileTypes: true }); - 读取本地文件server/routes/import-export.ts:548
sessionFiles = (await readdir(sessionsDir)) - 读取本地文件server/routes/import-export.ts:560
fallbackTs = Math.floor((await stat(filePath)).mtimeMs); - 读取本地文件server/routes/import-export.ts:566
raw = await readFile(filePath, "utf8"); - 读取本地文件server/routes/migrate.ts:132
if (!existsSync(path)) { - 读取本地文件server/routes/migrate.ts:162
if (!existsSync(path)) { - 发起网络请求server/routes/models.ts:399
const r = await fetch(url, { ...init, signal: ctrl.signal });
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
界面预览
1 张 · 点击查看大图功能亮点
- 超持久记忆
- 混合检索
- 跨任务技能复用
最近更新
在 GitHub 查看全部 →memos-local-plugin-v2.0.212026-10-29
· 更新日志
· 新增
· 本地模型设置:Viewer 设置页现在提供本地嵌入的镜像 URL、模型路径、缓存目录、离线模式和加载超时。
· 改进
· 运行时兼容性:插件现在使用 SQLite 13.0.3 的 Node-API 预构建包,并要求实际宿主进程使用 Node 22 或更高版本。
· 修复
· 记忆恢复与捕获边界:修复脏数据恢复、孤儿 trace 写入和 LLM 空响应重试的稳定性问题。
v2.0.342026-09-23
MemoryOS 2.0.34 release.
原文(未汉化)
memos-local-plugin-v2.0.202026-09-21
· 更新日志
· 修复
· 记忆恢复与捕获边界:修复了脏数据恢复、孤儿 trace 写入和 LLM 空响应重试的稳定性问题。
· 记忆演化与 Hermes 安装改进:提升了记忆演化和 Hermes 安装的可靠性,整体性能更好。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成MemOS 2.0 Stardust(星尘)
让 Agent 拥有持续记忆与成长能力
[!TIP]
新支持:为 DeepSeek Harness(dsh)接入 MemOS
在 DeepSeek Harness 中使用自动召回、后台记忆沉淀、混合检索和本地记忆查看器;它们均由同一套 MemOS 核心驱动,并可复用于不同 Agent 生态。
开始接入 →
👾 MemOS:面向 LLM 与 AI Agent 的记忆操作系统
MemOS 是一个面向 LLM 与 AI Agent 的记忆操作系统,统一了长期记忆的存/取/管,内置 KB、多模态、工具记忆 与 企业级 优化,实现上下文感知与个性化的交互。
核心特性
- 统一记忆 API:用单一 API 完成记忆的增、删、改、查——以图结构组织,可检视、可编辑,不是黑盒向量库。
- 多模态记忆:原生支持文本、图像、工具轨迹与人格,在同一记忆系统中统一检索与推理。
- 多 Cube 知识库管理:将多个知识库组合为可复用的记忆 Cube,实现跨用户、项目与 Agent 的隔离、受控共享与动态组合。
- MemScheduler 异步写入:以异步方式执行记忆操作,毫秒级延迟,保障高并发下的生产稳定性。
- 记忆反馈与修正:通过自然语言反馈精炼记忆——可纠正、补充或替换已有记忆,持续演进。
展开完整文档(README 剩余 1 节)
MemOS 2.0 Stardust(星尘)
让 Agent 拥有持续记忆与成长能力
[!TIP]
新支持:为 DeepSeek Harness(dsh)接入 MemOS
在 DeepSeek Harness 中使用自动召回、后台记忆沉淀、混合检索和本地记忆查看器;它们均由同一套 MemOS 核心驱动,并可复用于不同 Agent 生态。
开始接入 →
👾 MemOS:面向 LLM 与 AI Agent 的记忆操作系统
MemOS 是一个面向 LLM 与 AI Agent 的记忆操作系统,统一了长期记忆的存/取/管,内置 KB、多模态、工具记忆 与 企业级 优化,实现上下文感知与个性化的交互。
核心特性
- 统一记忆 API:用单一 API 完成记忆的增、删、改、查——以图结构组织,可检视、可编辑,不是黑盒向量库。
- 多模态记忆:原生支持文本、图像、工具轨迹与人格,在同一记忆系统中统一检索与推理。
- 多 Cube 知识库管理:将多个知识库组合为可复用的记忆 Cube,实现跨用户、项目与 Agent 的隔离、受控共享与动态组合。
- MemScheduler 异步写入:以异步方式执行记忆操作,毫秒级延迟,保障高并发下的生产稳定性。
- 记忆反馈与修正:通过自然语言反馈精炼记忆——可纠正、补充或替换已有记忆,持续演进。
News
- 2026-08-17 · 🐋 MemOS 完成 DeepSeek Harness 接入 MemOS 现已通过本地插件与云插件,为 DeepSeek Harness 提供长期记忆能力:任务开始前自动召回相关上下文,回合成功结束后持续沉淀新的经验,无需修改 DSH 核心。
- 2026-07-02 · 🏆 MemOS 在 Agent 与用户记忆榜单上全面领先 在 MemOS 的加持下,OpenClaw 在五个 Agent 任务上的平均任务完成率从 36.63% 提升到 50.87%。MemOS 在 LoCoMo 取得 88.83、LongMemEval 取得 89.20,并在 OmniMemEval(覆盖 14 款商业记忆产品、十个数据集的统一评测)中领先。
- 2026-05-09 · 🧠 memos-local-plugin 2.0 Hermes Agent 与 OpenClaw 官方本地记忆插件。单一核心驱动自演化记忆:L1 轨迹、L2 策略、L3 世界模型与结晶化 Skill,本地优先存储 + 反馈驱动检索。
- 2026-04-10 · 👧🏻 MemOS Hermes Agent 本地插件 官方 Hermes Agent 记忆插件发布:混合检索(FTS5 + 向量)、智能去重、分层技能演化、多 Agent 协作。100% 本地,零云依赖。
- 2026-03-08 · 🦞 MemOS OpenClaw 插件——云端与本地 官方 OpenClaw 记忆插件发布。云插件:托管记忆服务,token 用量降低 72%,支持多 Agent 记忆共享(MemOS-Cloud-OpenClaw-Plugin)。本地插件(v1.0.0):100% 端侧记忆,持久化 SQLite,混合检索(FTS5 + 向量),任务摘要与技能演化,多 Agent 协作,配套完整记忆查看器面板。
📊 性能表现
MemOS 在多个评测榜单中处于领先地位——与主流商业记忆产品横向对比,覆盖 5 个用户记忆榜单和 5 个 Agent 记忆任务。
| 榜单 | 分数 |
| LoCoMo | 88.83 |
| LongMemEval | 89.20 |
| PersonaMem v2 | 40.58 |
| HaluMem | 80.91 |
| BEAM-10M | 56.75 |
| GDPVal | 62.07 |
| LiveCodeBench | 64.96 |
| OmniMath | 61.00 |
| SWE-Bench | 38.46 |
| BrowseComp-Plus | 23.85 |
评测框架 OmniMemEval——https://github.com/MemTensor/OmniMemEval。
🎯 MemOS 适用于
MemOS 为 AI agent 提供长期记忆能力,典型场景:
- AI 助手:保持上下文一致的连续对话
- 客服系统:召回历史工单与用户信息,提供针对性帮助
- 个性化 agent:适应用户偏好,持续学习与调整
- 多 agent 协作:共享或隔离的记忆空间
🚀 快速开始
MemOS 提供四种使用方式,按你的场景选择。
| | Cloud API | 本地部署 | MemOS 云插件 | 本地插件 |
| 适合谁 | 自建应用,全托管 | 自建基础设施的团队 | OpenClaw 用户,零运维 | DeepSeek Harness、Hermes 或 OpenClaw,100% 端侧 |
| 启动方式 | 申请 API Key | docker compose up | openclaw plugins install | npm install + 按 Agent 配置 |
| 依赖设施 | 无(托管) | Neo4j + Qdrant | 无(使用 MemOS Cloud) | 无(本地 SQLite) |
| 数据存放 | MemOS Cloud | 你的服务器 | MemOS Cloud | 你的机器 |
☁️ 使用 Cloud API(托管)
想通过全托管服务给应用加记忆——无需自建任何基础设施。
1. 申请 API Key:
- 在 MemOS 控制台 注册。
- 进入 API Keys 复制你的 Key(以 mpg- 开头),请妥善保存在服务端。
2. 写入与检索记忆:
import requests
API_KEY = "mpg-..." # 请保存在服务端
base = "https://memos.memtensor.cn/api/openmem/v1"
headers = {"Authorization": f"Token {API_KEY}", "Content-Type": "application/json"}
1. 写入一条记忆
requests.post(f"{base}/add/message", headers=headers, json={
"user_id": "alice",
"conversation_id": "conv_001",
"messages": [{"role": "user", "content": "I like strawberry"}],
})
2. 检索记忆
res = requests.post(f"{base}/search/memory", headers=headers, json={
"query": "What do I like?",
"user_id": "alice",
})
print(res.json())
下一步:
- MemOS Cloud 快速开始——几分钟内接入 MemOS Cloud 并启用记忆。
- MemOS Cloud 平台——探索云端控制台、功能与工作流。
🖥️ 本地部署 MemOS 服务
想把 MemOS 作为 REST 服务跑在自己的机器或集群上。
方式 A — Docker(推荐):
git clone https://github.com/MemTensor/MemOS.git
cd MemOS
cp docker/.env.example .env # 在 .env 中填入你的 API key
cd docker
docker compose up # 启动 MemOS API + Neo4j + Qdrant
API 服务地址:http://localhost:8000。
方式 B — 用 uvicorn 启动(不用 Docker):
git clone https://github.com/MemTensor/MemOS.git
cd MemOS
cp docker/.env.example .env # 在 .env 中填入你的 API key
确保 Neo4j 和 Qdrant 已启动,然后:
cd src
uvicorn memos.api.server_api:app --host 0.0.0.0 --port 8000 --workers 1
所有配置项(LLM、embedder、向量库、图库、调度器)见 docker/.env.example。完整部署指南:https://memos-docs.openmem.net/open_source/getting_started/rest_api_server/。
试用 API:
import requests, json
headers = {"Content-Type": "application/json"}
base = "http://localhost:8000/product"
1. 创建记忆 cube
requests.post(f"{base}/create_cube", headers=headers, data=json.dumps({
"cube_name": "Alice's memory",
"owner_id": "alice",
"cube_id": "alice_cube",
}))
2. 写入一条记忆
requests.post(f"{base}/add", headers=headers, data=json.dumps({
"user_id": "alice",
"writable_cube_ids": ["alice_cube"],
"messages": [{"role": "user", "content": "I like strawberry"}],
"async_mode": "sync",
}))
3. 检索记忆
res = requests.post(f"{base}/search", headers=headers, data=json.dumps({
"query": "What do I like?",
"user_id": "alice",
"readable_cube_ids": ["alice_cube"],
}))
print(res.json())
🧠 MemOS 插件:为你的 AI agent 提供持久记忆 ✨
OpenClaw、Hermes 与 DeepSeek Harness 均可接入同一套 MemOS 本地记忆核心;OpenClaw 与 DeepSeek Harness 还可选择托管的 MemOS 云插件 🏃🏻
| 🔌 插件 | 💡 核心特性 | 🧩 资源 |
| 🧠 memos-local-plugin 2.0 | | 🌐 官网 · 📖 文档 · 🐙 GitHub · 📦 NPM |
| ☁️ MemOS 云插件 | | 🖥️ MemOS 控制台 · 📖 完整教程 |
1. MemOS 云插件
使用 OpenClaw 或 DeepSeek Harness,想通过 MemOS Cloud 获得持久记忆——无需自建基础设施。
- 仓库: MemTensor/MemOS · apps/MemOS-Cloud-OpenClaw-Plugin
- NPM: @memtensor/memos-cloud-openclaw-plugin
- 控制台: https://memos-dashboard.openmem.net/
- 教程: https://memos-docs.openmem.net/openclaw/guide
安装:
openclaw plugins install @memtensor/memos-cloud-openclaw-plugin@latest
openclaw gateway restart
插件在每次 agent 运行前从 MemOS Cloud 召回记忆,运行结束后把新消息写回。
DeepSeek Harness
通过 DSH 原生插件机制为 DeepSeek Harness 接入 MemOS Cloud。每次用户请求的第一个模型步骤开始前,插件会自动召回相关云端记忆;当前回合成功结束后,再把新的用户与助手消息写回 MemOS Cloud。
1. 在 MemOS 控制台创建 API Key。
2. 将云插件安装到 DSH 默认的 web profile:
npx @deepseek-ai/dsh plugin --profile web add @memtensor/memos-cloud-dsh-plugin@latest
3. 在 ~/.dsh/.credentials.yaml 中写入 API Key:
MEMOS_API_KEY: mpg-your-key
4. 在 ~/.dsh/settings.yaml 中加入最小配置:
memos-cloud:
apiKeyEnv: MEMOS_API_KEY
5. 重启 DSH Web profile:
npx @deepseek-ai/dsh web
云插件采用 Fail-open 机制:MemOS Cloud 临时不可用时,不会中断当前 DSH 任务。
2. 本地插件(OpenClaw、Hermes 与 DeepSeek Harness)
使用 DeepSeek Harness、Hermes Agent 或 OpenClaw,想要 100% 端侧记忆——数据不离开本机。
- 仓库: MemTensor/MemOS · apps/memos-local-plugin
- NPM: @memtensor/memos-local-plugin
- 文档: https://memos-docs.openmem.net/cn/openclaw/local_plugin
- DeepSeek Harness: 接入说明
- 查看器面板: 见 apps/memos-local-plugin/viewer/
接入 DeepSeek Harness(macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/MemTensor/MemOS/main/apps/memos-local-plugin/install.sh | bash -s -- --agent dsh --profile web
安装 OpenClaw 或 Hermes(macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/MemTensor/MemOS/main/apps/memos-local-plugin/install.sh | bash
安装(Windows PowerShell):
irm https://raw.githubusercontent.com/MemTensor/MemOS/main/apps/memos-local-plugin/install.ps1 -OutFile "$env:TEMP\memos-install.ps1"; powershell -ExecutionPolicy Bypass -File "$env:TEMP\memos-install.ps1"
需先安装 Node.js,且已安装 DeepSeek Harness、OpenClaw 或 Hermes。安装器会将 MemOS 部署到所选 Agent 运行时:DeepSeek Harness 以独立 DSH bundle 方式接入;OpenClaw 与 Hermes 则在各自的 Agent 主目录中写入初始 config.yaml。
特性:混合检索(FTS5 + 向量)、智能去重、分层技能演化(L1 轨迹 / L2 策略 / L3 世界模型)、多 agent 协作、本地优先 SQLite 存储。
🤝 社区
- GitHub Issues: https://github.com/MemTensor/MemOS/issues
- GitHub Discussions: https://github.com/MemTensor/MemOS/discussions
- Discord: https://discord.gg/Txbx3gebZR
- 微信: 扫码加入微信群。
📚 引用
如果在研究中使用 MemOS,请引用:
@article{li2025memos_long,
title={MemOS: A Memory OS for AI System},
author={Li, Zhiyu and Song, Shichao and Xi, Chenyang and Wang, Hanyu and Tang, Chen and Niu, Simin and Chen, Ding and Yang, Jiawei and Li, Chunyu and Yu, Qingchen and Zhao, Jihao and Wang, Yezhaohui and Liu, Peng and Lin, Zehao and Wang, Pengyuan and Huo, Jiahao and Chen, Tianyi and Chen, Kai and Li, Kehang and Tao, Zhen and Ren, Junpeng and Lai, Huayi and Wu, Hao and Tang, Bo and Wang, Zhenren and Fan, Zhaoxin and Zhang, Ningyu and Zhang, Linfeng and Yan, Junchi and Yang, Mingchuan and Xu, Tong and Xu, Wei and Chen, Huajun and Wang, Haofeng and Yang, Hongkang and Zhang, Wentao and Xu, Zhi-Qin John and Chen, Siheng and Xiong, Feiyu},
journal={arXiv preprint arXiv:2507.03724},
year={2025},
url={https://arxiv.org/abs/2507.03724}
}
@article{li2025memos_short,
title={MemOS: An Operating System for Memory-Augmented Generation (MAG) in Large Language Models},
author={Li, Zhiyu and Song, Shichao and Wang, Hanyu and Niu, Simin and Chen, Ding and Yang, Jiawei and Xi, Chenyang and Lai, Huayi and Zhao, Jihao and Wang, Yezhaohui and others},
journal={arXiv preprint arXiv:2505.22101},
year={2025},
url={https://arxiv.org/abs/2505.22101}
}
⚖️ 许可证
MemOS 基于 Apache 2.0 许可证 开源。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
MemTensor/MemOS
自进化记忆 OS,服务 LLM 与 AI 智能体:超持久记忆、混合检索、跨任务技能复用,省 35.24% token,支持 DeepSeek Harness。
相关插件 · 搜索 / 抓取
LLM 知识平台Tencent/WeKnora
概览 ·快速开始 ·新特性 ·功能 ·客户端 ·文档 ·开发
★ 36,266已汉化DSH
72
跨代理记忆库zilliztech/memsearch
跨平台语义记忆,专为 AI 编程智能体打造。
★ 2,799已汉化DSH
70.9
跨智能体会话记忆vshulcz/deja-vu
你的编码智能体不再重复调试你已经修好的问题。
★ 1,367已汉化MCP
70.4
技能语料库EverMind-AI/SkillCorpus
SkillCorpus 能给你什么
★ 694已汉化DSH
69.7
动画花园资源检索yjl9903/AnimeGarden
按番剧、字幕组和类型搜索动画 BT 资源
★ 1,391已汉化DSH
69.2
代码图谱记忆syncable-dev/memtrace-public
你的智能体值得拥有结构化记忆。
★ 510已汉化MCP
67.8