前言¶
在 DeepSeek Harness(DSH)的开发场景中,模型上下文窗口有限,对话结束后的记忆往往无法保留。手动维护上下文既繁琐又容易丢失关键信息。dsh-local-memory 插件通过本地文件系统实现了跨会话记忆的持久化。
该插件由 caopu16 维护,属于记忆类插件。它的核心价值在于:自动捕获每轮对话摘要,将近期记忆注入当前上下文,并提供一个基于关键词的检索工具,供模型在需要时主动召回历史信息。
核心功能¶
该插件主要提供三项能力:
1、capture(捕获)
每轮对话结束(turn/end)后,将用户与助手的对话内容摘要为 markdown bullet 格式,并追加写入项目目录下的 .memsearch/memory/YYYY-MM-DD.md 文件中。
2、inject(注入)
在每轮对话的第一步,自动注入最近 injectDays 天的记忆快照(默认为 2 天)。这使得模型在处理新话题时,能够即时获得短期上下文。
3、memory_search(检索)
提供 memory_search 工具,支持纯 JS 关键词匹配。与 inject 仅限于近期不同,该工具可以检索全部历史日文件,供模型在话题可能早于注入窗口时主动捞取信息。
安装与启用¶
官方推荐使用 DSH 的插件命令安装。
# 已安装 dsh CLI 时
dsh plugin --profile web add github:caopu16/dsh-local-memory
# 从 deepseek-harness 源码运行时
cd /path/to/deepseek-harness
pnpm dsh plugin --profile web add github:caopu16/dsh-local-memory
安装完成后,必须重启 DSH 并新开一个会话,memory_search 工具才会出现在工具列表中。已打开的会话不会自动获得新工具。
配置¶
插件安装后,由 bundle 自带的 cordis.patch.yml 挂载。如果需要覆盖默认配置,可以在 ~/.dsh/profiles/web/cordis.patch.yml 中 patch 同一行:
- id: local-memory
name: 'dsh-local-memory'
config:
injectDays: 3
searchMaxResults: 10
provider: ''
model: ''
主要配置项说明如下:
| 配置项 | 默认值 | 说明 |
|---|---|---|
captureEnabled |
true |
是否捕获新对话摘要 |
injectEnabled |
true |
是否在每轮第 1 步注入记忆 |
searchEnabled |
true |
是否注册 memory_search 工具 |
injectDays |
2 |
注入时回看几个日文件 |
searchMaxResults |
20 |
单次检索最多返回的轮次块数 |
captureMaxChars |
24000 |
单轮原文送摘要器的字符上限 |
summarizeMaxTokens |
1200 |
摘要的最大 token 数 |
典型用法¶
在正常对话中,插件自动运行,无需手动干预。capture 负责记录,inject 负责补充上下文。
当话题涉及几天前的内容(超出了 injectDays 的窗口)时,模型可以主动调用工具:
memory_search(query: "flyway V22", top_k: 5)
系统会遍历所有历史日文件,根据关键词和子串匹配打分,返回包含日期、轮次标题和正文片段的结果。
技术实现与生态¶
该插件采用纯 JS 和纯文本实现,没有 native 依赖。这意味着它不需要依赖 pymilvus、numpy 或 memsearch CLI,因此不会受到本地 CPU 架构(如未达到 x86-64-v2 基线)的影响。
在生态方面,它与 opencode 的 memsearch 插件保持兼容,共用 .memsearch/memory/ 目录和锚点格式。两者可以互读,不会互相覆盖。
项目结构¶
项目结构如下:
~/dsh-local-memory/
├── src/
│ ├── index.mjs # 插件入口
│ ├── capture.mjs # 摘要与写入
│ ├── inject.mjs # 记忆读取与注入
│ └── search.mjs # 关键词检索
├── lib/ # 构建产物
├── cordis.patch.yml # DSH 补丁声明
└── package.json