DSH 本地混合记忆插件:L1 快照(MEMORY.md/USER.md,由 memory_* 工具按需读取)+ L2 可检索知识库(facts + SQLite FTS5,滑窗分词支持中文检索)+ L3 从 Hermes/Claude Code/Codex/WorkBuddy 以及 Agent Hub 已批准文档(memory/global、memory/projects、accepted decisions)导入,内容哈希去重。v0.2.0 已移除全部自动注入:记忆只在模型调用 12 个 memory_* 工具之一时才进入上下文,数据全部留在本地。
安装
# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)
dsh plugin --profile web add github:Frog755/dsh-hybrid-memory
装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。
README
融合 Hermes 轻量快照记忆 与 Noema 可检索知识库 的 DeepSeek Harness 记忆插件。
Hybrid memory plugin for DeepSeek Harness — combining Hermes-style frozen-snapshot memory with Noema-style searchable knowledge base.
为什么有这个插件(Why)
- Hermes 的记忆(
MEMORY.md/USER.md)轻量、省 token、保 prefix cache,但不可检索、无审核。 - Noema(dsh-noema)可检索、可导入、可解释,但需要 Rust 二进制服务端、每次召回动 prompt。
- dsh-hybrid-memory 各取所长:
| 层 | 抄谁 | 做什么 |
|---|---|---|
| L1 快照 | Hermes | MEMORY.md/USER.md,按需读取——只在模型主动调用 memory_* 工具(如 memory_recall)时才进入上下文;字符上限(与模型无关) |
| L2 知识库 | Noema | facts/ 一事实一文件 + node:sqlite FTS5 索引 + 实体抽取;按需 memory_recall/search/browse |
| L3 导入 | Noema | 从 Hermes / Claude Code / Codex / WorkBuddy 导入既有记忆,内容哈希账本去重 |
数据位置(重要)
记忆数据放在 D 盘,绝不落 C 盘:
D:\Develop\DeepSeek Harness\memory\
├── MEMORY.md ← L1 agent 笔记(环境事实/项目约定/工具怪癖)
├── USER.md ← L1 关于用户(偏好/沟通风格/习惯)
├── facts/ ← L2 一事实一文件(人类可读 Markdown,active 状态)
├── pending/ ← 审核队列:review=true 的内容先进这里,接受后移到 facts/
├── index.db ← L2 SQLite FTS5 索引
└── imports.json ← L3 导入去重账本
可用环境变量 DSH_HYBRID_MEMORY_ROOT 覆盖默认根目录。
Hermes 导入路径:插件会自动探测 Hermes 记忆位置——优先
HERMES_HOME环境变量,其次常见安装路径(D:\Develop\hermes、~/.hermes、~/hermes),取第一个存在memories/目录的位置。你的机器实测是D:\Develop\hermes\memories\。
安装
# 从 npm(发布后)
dsh plugin --profile web add @frog755/dsh-hybrid-memory@latest
# 或本地开发(源码目录)
dsh plugin --profile web add link:D:\Develop\DeepSeek Harness\projects\dsh-hybrid-memory
dsh web
首次安装需要重启一次 DSH(全新插件必须进入启动树);之后热重载即可。
模型工具(12 个)
| 工具 | 层 | 作用 |
|---|---|---|
memory_add |
L1 | 新增常驻条目(memory=agent 笔记 / user=关于用户) |
memory_replace |
L1 | 按标题替换常驻条目 |
memory_remove |
L1 | 按标题删除常驻条目 |
memory_remember |
L2 | 保存知识库事实(默认 auto-accept;review=true 进审核队列) |
memory_search |
L2 | FTS5 + 实体加权全文检索 |
memory_browse |
L2 | 浏览知识库目录 / 按 tag 过滤 |
memory_recall |
L1+L2 | 融合召回:快照 + 检索结果按 token 预算打包 |
memory_import |
L3 | 从 Hermes/Claude/Codex/WorkBuddy 导入 |
memory_import_agent_hub |
L3 | 只导入 Agent Hub approved memory/global、projects、accepted decisions |
memory_status |
管理 | 数据根、字符用量、事实数、待审数、账本大小 |
memory_review_list / memory_review_decide |
审核 | 查看/接受/拒绝/编辑候选记忆 |
设计要点
- 按需读取、零上下文开销:L1 快照与 L2 知识库都不自动注入对话(无
systemPrompt.section常驻注入、无 pre-step 召回、无 skill 附带记忆,v0.2.0 起);只在模型主动调用memory_*工具时按需进入上下文。 - 字符上限而非 token 上限:L1 限制(agent 4000 / user 2000 字符)与模型无关,跨模型一致(Hermes 原设计)。
- 中文检索:FTS5 的 unicode61 不切中文,插件在写入索引前用 2 字滑窗预分词,
memory_search按词匹配。 - 威胁扫描:写入内容检测提示注入 / 外泄 / 危险指令,命中即拒。
- 原子写 + 漂移检测:写文件走临时文件 + rename;磁盘内容被外部编辑破坏结构时拒绝写入并留
.bak快照。 - 审核队列:默认
auto-accept(Hermes 风格直接写);需要时memory_remember(review=true)写入pending/(文件 + SQLite status=pending),memory_review_decide(accept)会把 Markdown 移到facts/并转正,edit会同步重建 FTS 索引。
记忆按需读取(无自动注入)
插件不做任何自动注入——L1 快照不再冻结进 system prompt,agent/pre-step 首步/触发词召回与 tools/post-execute skill 附带记忆均已移除(v0.2.0)。记忆只在模型判断需要时,主动调用 memory_* 工具查找后才进入上下文:
- 查知识库:
memory_search/memory_browse/memory_recall(融合 L1 快照 + L2 检索) - 查状态:
memory_status(数据根、字符用量、事实数、待审数等)
代价:模型若忘记主动调用工具,记忆不会自动出现;换来的是上下文零记忆开销、无 [系统注入·记忆] 标签。
HTTP 端点(可选)
插件还在 DSH web server 上暴露两个端点:
GET /__hybrid-memory/status— 状态 JSON(数据根、L1 字符用量、L2 事实/待审数、账本大小)POST /__hybrid-memory/import— 触发导入,可选 body{ "sources": ["hermes", ...] }
开发
# 核心逻辑(不需要宿主依赖)
node --test tests/core.test.js # 32 个,覆盖 L1/L2/L3 核心逻辑
# Agent Hub 投影(前两个用例不需要宿主依赖;第三个会 import 插件本体)
node --test tests/agent-hub-source.test.js
# 冒烟测试:真实加载插件并断言事件/工具注册(需要 @deepseek-ai/* 可解析)
node --test tests/smoke.test.js
@deepseek-ai/* 通过 devDependencies 的 link: 指向本机 DSH 宿主目录,所以只有
「本机已装 DSH」的 clone 才能跑需要 import 插件本体的用例;裸 clone 或 CI 上这类
用例会自动 skip(不会红)。
截图
| DSH 设置中的插件列表(真实界面) | 架构示意 |
|---|---|
![]() |
兼容性
- DeepSeek Harness(Cordis 架构),web profile
- Node.js 22.5+ —— 插件使用内置
node:sqlite模块(DatabaseSync),无原生依赖 - peer 依赖:
@deepseek-ai/dsh-llm、@deepseek-ai/dsh-tools
隐私说明
记忆数据全部留在本地。 插件只写入配置的数据根目录(默认 D:\Develop\DeepSeek Harness\memory,可用 DSH_HYBRID_MEMORY_ROOT 覆盖),不向任何外部服务发送数据。L1 快照与 L2 事实都只在模型主动调用 memory_* 工具时按需读取进上下文,无自动注入。无遥测、无网络调用。
License
MIT
链接
同类插件
vectorize-io/hindsight#coding-agents★ 48490
Hindsight:会学习的 Agent 长期记忆系统,自动召回/保存、知识页、深度反思与按仓库隔离的记忆银行。
volcengine/OpenViking#examples/dsh-memory-plugin★ 39688
面向 DeepSeek Harness 的 OpenViking 记忆与上下文插件:pre-step 自动召回与画像注入、会话捕获、`viking://` URI 防护,以及对接 OpenViking 服务端的 recall/write 记忆工具。
agentscope-ai/ReMe#dsh★ 3578
将 DeepSeek Harness 接入 ReMe 本地优先、自进化的个人知识库:自动把已完成的主 Agent 对话沉淀为用户掌控的 Markdown 记忆,通过 reme_search 结合 BM25、可选向量检索和 wikilink 展开搜索对话与资料,并按日整理长期记忆。
zilliztech/memsearch#MemSearch★ 2736
供 DSH 与其他编程 Agent 共享的 Markdown 记忆,支持自动捕获、步骤前上下文注入、搜索召回,以及通过审阅面板实现 memory-to-skill 自进化。
vshulcz/deja-vu#extensions/dsh★ 1176
读取本机上其他三十三个编程智能体已经写下的会话文件——Claude Code、Codex、Cursor、VS Code Copilot Chat、opencode、OpenClaw、Hermes、Kimi、Cline、Zed 等,包括安装之前的历史:提供 deja_recall、deja_session、deja_blame、deja_fix、deja_how、deja_remember 六个工具与 /deja 命令,并可选地把召回结果加入运行时上下文。本地 BM25 索引,不用大模型,不用向量嵌入,不联网(dsh plugin --profile web add dsh-deja)。
adoresever/graph-memory★ 644
DeepSeek Harness 的可追溯、可检索跨会话记忆:把对话知识沉淀为带类型的图节点(任务/技能/事件)与关系边。

社区评论
评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。