dsh-memory
Verified@zheexinn/dsh-memory · v0.5.3 · MIT · Web UI
Long-term shared memory plugin for the DeepSeek Harness: LLM auto-extraction, fusion recall (semantic + entity graph), self-maintenance, own-your-storage file backend, remote API & MCP
Install
dsh plugin add @zheexinn/dsh-memory Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Published to npm without a public repository. Inspect the package contents before installing.
Creators
Readme
dsh-memory
DeepSeek Harness 的长期共享记忆插件。
跨会话 · 多智能体 · 自我维护 · 可视化面板
English | 中文
dsh-memory 给 DeepSeek Harness 的每个会话装上真正的长期记忆:自动抽取、评分、存储、召回;跨会话/子代理/工作流共享;并自我维护——衰减的归档、洞察的反思、噪音的整合——你只管继续工作。
为什么? 每个会话都从失忆开始:你的名字、你的偏好、上周踩过的坑——全忘了。dsh-memory 用一个宿主级单例记忆服务 + 后台 LLM 管线解决它。
✨ 特性
| 🧠 五类记忆 | semantic(事实)· episodic(事件)· procedural(方法)· preference(偏好)· insight(洞察) |
| 🔄 跨会话共享 | 一个宿主平面单例,多会话/子代理/工作流同读同写 |
| ⚙️ LLM 自动抽取 | 每 N 回合把会话浓缩成带重要性/置信度的记忆候选 |
| 📉 遗忘曲线 | score = importance × confidence × 2^(−t/半衰期),旧记忆自然衰减 |
| 🔍 融合召回 | 评分 × 字符 n-gram 语义相似(TF-IDF 余弦) × 实体共现图谱 |
| 🕸️ 实体图谱 | 路径/标识符/版本/引语/高频中文词成为节点,共现成为边 |
| 🧹 自我维护 | 衰减自动归档;LLM 反思蒸馏洞察;整合把实体簇折叠成单条事实 |
| 🗄️ 存储自主 | 自管文件后端——storage.root 指向任意目录(Obsidian 库也行);一个可读 JSON 文件即唯一真源 |
| 🤝 外部智能体 | 零依赖 CLI、文档化文件格式、令牌门禁 HTTP API、stdio MCP 服务(Claude Code 等) |
| 🎛️ 可视化面板 | 时间线/关系/归档三页签 + 可交互力导向图 |
| 🪶 零运行时依赖 | 纯 ESM + harness 插件协议——无 zod、无 SDK、无原生二进制 |
🚀 快速开始
从 npm(推荐——钉精确版本):
dsh plugin --profile web add @zheexinn/[email protected] # 然后重启 dsh web
从源码(本地开发):
// ~/.dsh/profiles/web/package.json
{
"dependencies": { "@zheexinn/dsh-memory": "link:<仓库路径>" },
"dsh": { "profile": { "bundles": ["@zheexinn/dsh-memory"] } }
}
cd ~/.dsh/profiles/web && pnpm install # 然后重启 dsh web
就这些。在「记忆」面板写一条(或让模型调 memory_remember),然后开个新会话问「你还记得什么?」——模型有 memory_recall,且每回合结束时高分记忆自动注入其运行时上下文。
🏗️ 工作原理
flowchart LR
U[用户回合] --> A[Agent 循环]
A --> E["turn/end 钩子"]
E --> X[LLM 抽取<br/>转写 → 候选]
X --> S[(记忆服务<br/>宿主平面单例)]
A --> C[上下文组装]
C -->|"systemPrompt.context<br/>高分记忆"| S
S --> F[memory.json<br/>唯一真源]
M[后台任务] -->|"归档 · 反思 · 整合"| S
P[面板] <-->|"/memory/api/*"| S
R[外部智能体] -->|"HTTP / MCP / CLI"| S
R -->|"或直接读写文件"| F
三个平面,一份记忆:
- Hub 行(宿主平面)——
memory服务单例、自管存储后端、面板与远程 API; - Agent 行(智能体平面)——四个模型工具、动态上下文召回、自动抽取、后台维护。默认全局挂载,也可移入 agent preset;
- Client——注册在会话环与设置里的三页签面板。
🧩 记忆生命周期
- 摄取——每 N 个完成回合,水位线以来的会话日志渲染成受限转写(保留最新内容);
- 抽取——一次辅助 LLM 调用(复用会话自己的
request/header路由)返回候选数组(类型/内容/重要性/置信度/范围); - 门槛——低于
minConfidence丢弃;低于verifyConfidence打「待验证」(检索分数折半、面板虚线显示); - 合并——同「内容+范围」合并进已有条目而非重复,抬升重要性;
- 存储——记录写入
memory.json(临时文件 + rename 原子重写); - 召回——遗忘曲线评分 × n-gram 余弦 × 图谱加权融合排序,高分条目注入每个会话的运行时上下文;
- 维护——衰减条目自动归档(隐藏不删、可恢复);反思蒸馏洞察;整合把事件簇折叠成事实;
- 可视化——时间线含来源与引用次数;实体卡片说明每个关系的含义;可交互图谱。
⚙️ 配置
# profile cordis.patch.yml
- id: memory-hub
name: '@zheexinn/dsh-memory'
config:
storage:
root: 'D:/_Tools/Obsidian/memory' # 默认 ${DSH_HOME|~/.dsh}/storages
recallTopK: 5
recallBudget: 1500
importanceLearningRate: 0.01
semanticWeight: 0.6
graphWeight: 0.4
archiveThreshold: 0.05
server: # 远程 API(默认关闭)
enabled: true
token: '足够长的随机串'
- id: memory-agent
name: '@zheexinn/dsh-memory/agent'
config:
recallTopK: 5
recallBudget: 1200
extraction:
enabled: true
everyNTurns: 1 # >1 即攒批:多个回合合并抽取
maxInputChars: 6000
minTranscriptChars: 40 # 琐碎回合直接跳过
minConfidence: 0.3
verifyConfidence: 0.6
maxCandidates: 8
timeoutMs: 60000
maxTokens: 1024
archiveEveryNTurns: 10 # 0 关闭
reflectEveryNTurns: 10 # 0 关闭
consolidateEveryNTurns: 20 # 0 关闭
# 后台 LLM 调用的固定路由(缺省复用会话 request/header 路由):
# provider: deepseek
# model: deepseek-chat
每个旋钮都有代码默认值——零配置即可运行。
🗄️ 存储:记忆归你所有
Hub 在 harness 存储中枢上注册自己的文件后端。整个记忆库就是一个人类可读的 JSON 文件:
{storage.root}/memory.json # { unit, global, tables.entries }
- 默认根目录是 harness 的 storages 目录,现有数据无缝继续;
storage.root指向任意目录——包括 Obsidian 库:文件成为笔记库中可见、可搜索、可版本化的一部分;迁移现有库只需把memory.json拷过去;- harness 其他域不受影响——只有
memory搬家; - 落盘格式已文档化(docs/external-format.md)且稳定:外部智能体可直接读取,自带 CLI 以与插件完全相同的语义写入(去重合并、软删除、原子写 + 乐观并发保护)。
npm run memory-cli -- list --scope user # recall / remember / forget / restore / purge / stats / export
🌐 远程访问与 MCP
开启令牌门禁的远程 API(server.enabled + server.token),任何外部智能体都能通过 HTTP 读写记忆:
| 端点 | 用途 |
|---|---|
GET /memory/remote/stats |
统计 |
GET /memory/remote/list |
列表 |
GET /memory/remote/recall?query=&scope=&top_k= |
融合召回 |
POST /memory/remote/remember |
写入 |
POST /memory/remote/forget |
软删除 |
POST /memory/remote/purge |
永久删除 {id}(不可恢复) |
GET /memory/remote/export |
全量导出 |
自带的零依赖 MCP 服务把这些端点桥接给任何 MCP 客户端:
{
"mcpServers": {
"@zheexinn/dsh-memory": {
"command": "node",
"args": [
"<仓库路径>/scripts/mcp-server.mjs",
"--api", "http://127.0.0.1:3080/memory/remote",
"--token", "足够长的随机串"
]
}
}
}
Claude Code 等即可获得一等公民工具:memory_remember / memory_recall / memory_forget / memory_reflect。
🧪 可插拔 embedding
默认语义层是零依赖字符 n-gram 索引(中文 bigram + 路径/标识符/版本整词)。任何插件都能在不改本包的情况下替换它:
ctx.provide('memoryEmbedding', {
// 契约:rank(texts, query) → scores[](与 texts 等长,0..1)
rank: async (texts, query) => texts.map((text) => similarity(text, query)),
})
失败自动回退内置 n-gram 索引。
🔌 Preset 集成
agent 行默认全局挂载。要限定到特定 agent preset:从全局补丁移除 memory-agent 行,加进 preset 的 cordis.yml:
- id: memory-agent
name: '@zheexinn/dsh-memory/agent'
config: { recallTopK: 5, recallBudget: 1200 }
memory-hub 行必须留在宿主组合——它是进程单例。
🛠️ 开发
npm test # 六组行为测试:pipeline / hub / external / vector / graph / mcp
npm run build # 客户端打包(wire 格式)
npm run smoke # node 半边加载检查
🗺️ 路线图
- 面板检索框(关键词 + 语义混合搜索 UI)
- 参考 embedding provider(本地 sentence-transformers 桥)
- 跨机部署开箱指引(服务发现、HTTPS)
❓ FAQ
自动抽取会多花 LLM 调用吗? 会——每 everyNTurns 个完成回合一次辅助调用,复用会话自己的模型路由。调大 everyNTurns,或 extraction.enabled: false 只用工具手动写。
远程 API 暴露安全吗? 默认关闭且 Bearer 门禁。仅本机使用最安全;跨机请经反向代理走 HTTPS 并保管 token。
旧记忆会怎样? 插件从不硬删除任何东西:记忆衰减 → 归档(隐藏、可恢复),删除都是墓碑,可在归档页恢复。
能用 sqlite 吗? 自管后端刻意保持单 JSON 文件(它就是外部智能体格式)。sqlite 后端是可能的未来变体,格式文档即迁移面。
📄 License
MIT © 2026 zhang66633 · 安全问题请通过 GitHub security advisory 私下报告。