前言¶
在 DeepSeek Harness(DSH)里做多轮对话或轻量编程时,上下文窗口会随会话结束而清空;换窗口、换工作区后,模型也拿不到上一段对话里约定好的偏好和事实。常见做法是手写 system prompt 或在外部笔记里维护状态,但那样要么每次手动粘贴,要么和 Harness 的会话生命周期脱节。
下面介绍社区插件 dsh-memory(GitHub:2424830124/dsh-memory,npm:@huai_xin/dsh-memory)。它把长期记忆做成磁盘上的 YAML「笔记本」,按标题树组织,并在组装提示词时整份注入;模型通过插件提供的工具读写记忆,多会话之间共享同一份文件,并在别处改动后向当前会话推送合并后的、不唤醒的变更通知。另带按日期的日志(短期记忆)和可替换 Harness 开场身份的 Markdown 预设。
这是什么¶
dsh-memory 是分类为「记忆」的 DSH 插件,维护者 GitHub 用户 2424830124。一句话定位:给 DeepSeek Harness 用的跨会话长期记忆,结构由用户自己在 YAML 里定义,而不是插件写死的字段表。
它在设计上有两个明确取舍(README 原文表述):不做自动召回——每次把可见记忆文件整份放进提示词,不检索、不算相关性;原因是召回错误容易把模型带偏,且当前记忆体量通常能塞进上下文。真正强调的能力是可自定义结构:file_name、desc、format、标题树、inject_ignore 都写在文件自身,改结构不必改插件代码或全局配置。
记忆在 Global(~/.dsh/dsh-memory/.memory)与 Workspace(<workspace>/.memory)两个作用域之间划分;路径不可在配置里改位置,只能通过 DSH_HOME 整体迁移,避免写错路径 silently 读到别处。
核心功能¶
记忆注入与多会话同步¶
- 记忆文件为 YAML,插件注入到提示词前缀;模型可用 memory_read / memory_edit / memory_manage(README 中统称「三个工具」)读写,写前须先读,并带版本校验,避免覆盖其他会话的并发修改。
- 其他会话修改记忆后,本会话只收到「哪些标题变了」类通知;需要细节时再读文件。空闲会话在下一条消息时检查累积变更;正在运行的会话约每 5 秒检查一次(最多每 5 秒一条提醒)。
- 按会话冻结注入:会话开启期间,注入文本与
memory_edit的工具描述冻结,文件在外部再怎么变,本会话拼出的提示词前缀不变,以便供应商前缀缓存持续命中;变更走通知。闲过保留窗口(默认 60 分钟,由snapshotTtlMinutes等配置参与,默认快照保留 10080 分钟即 7 天)后重新生成。
日志与预设¶
- 日志:
log/下一天一个 YAML,二级标题为「时分 + 摘要」,用于记「今天发生了什么」;可通过injectLog、logInjectGlobalDays等配置控制最近几天、每天条数是否注入。 - 预设:
preset/*.md纯文本,选中后整体替换提示词最开头的 harness identity(默认那句You are an AI agent powered by DeepSeek Harness.)。人设、行为准则等开场文本放预设,不必挤进记忆文件;预设不受inject_ignore与三个记忆工具约束。
面板¶
对话区顶部「记忆」标签页含 预设 / 全局 / 工作区 / 设置。全局与工作区侧以卡片编辑 YAML 内容树、预览「注入效果」、拖动调整同层标题顺序与注入顺序(fileOrder);设置页写入 ~/.dsh/dsh-memory/config.yaml,保存后当场生效(手改该文件需重启 Harness)。
常见搭法(来自 README 表格)¶
| 想记什么 | 大概长什么 |
|---|---|
| 长短期记忆 | 一份「长期记忆」存稳定事实;当天先写日志,隔几天再摘要进长期 |
| 行为准则 | 一份「行为准则」,一级标题分场景 |
| 角色设定 | 一份「角色」或每角色一文件,format 里写清边界 |
| 学习感悟 | 一份「感悟」,二级标题一条,keyword 打标签 |
| 备忘录 | 一份「待办」,inject_ignore 跳过 update_at、keyword |
经验:一个文件一种用途,把必须每轮看到的准则单独放前面,偶尔翻的备忘录另起文件,便于 fileOrder 与 inject_ignore 按文件生效。
安装与启用¶
插件以 npm 包形式安装,并在 profile 里挂载 bundle 补丁。官方 README 给出的步骤如下。
先安装包:
npm install @huai_xin/dsh-memory
在 profile 配置中加载 cordis.patch.yml(只挂载插件,不在此写业务配置值):
# cordis.patch.yml —— 只挂载插件,不写配置值
- insert:
- id: memory
name: '@huai_xin/dsh-memory'
运行时依赖 yaml 与 @deepseek-ai/schemastery。若跟源码开发,可将 node_modules 内包换成本地链接(如 npm install ../dsh-memory 或 link: 依赖),无需每次发版。
当前 package.json 中版本为 0.3.7,许可证 MIT。插件在 DSH 进程权限下读写上述目录,安装前请自行查阅仓库源码与许可证。
配置与数据目录¶
配置优先级:~/.dsh/dsh-memory/config.yaml > profile 里插件配置 > 内置默认。
主要路径:
~/.dsh/dsh-memory/config.yaml # 配置
~/.dsh/dsh-memory/.memory/*.yaml # Global 记忆
~/.dsh/dsh-memory/preset/*.md # 预设
~/.dsh/dsh-memory/state/sessions/ # 会话快照
<workspace>/.memory/*.yaml # Workspace 记忆
部分配置键(默认值见 README 表格):
| 键 | 默认 | 说明 |
|---|---|---|
snapshotTtlMinutes |
10080 |
会话快照保留分钟数;0 关闭清理 |
logSummaryMaxChars |
60 |
日志摘要字数上限 |
injectLog |
true |
是否把最近日志注入提示词 |
logInjectEntries |
0 |
每天最多注入条数;0 不限 |
logInjectGlobalDays |
3 |
全局日志带最近几天 |
defaultPreset |
'' |
新建会话默认预设名;空为不使用 |
fileOrder 在面板左侧拖动文件顺序维护,不在设置页手写。
典型用法:记忆文件骨架¶
新建 Global 或 Workspace 记忆时,YAML 形状如下(字段含义以 README 为准):
meta_data:
file_name: 我的记忆
desc: 记录我和用户之间的一些回忆,以及我想要记住的事
format: |
写这个文件放什么、什么时候该更新、更新成什么样。
这段只出现在 memory_edit 的工具描述里,不进提示词。
scope: Global
inject_ignore:
- update_at
- keyword
data:
我们经历过的一些事:
update_at: 2026-10-27T03:18:36+08:00
desc: 一级标题的正文
keyword: [回忆]
我们之间的互动:
desc: 二级标题的正文
注意:正文行不得以 # 开头,否则会被误解析为标题;建标题应通过工具的 heading_path(如 # 标题 > ## 子标题)操作。标题最多 4 级,同级不可重名。
日志文件由插件按日生成,一级标题固定为当天日期;模型写日志时须使用 # yyyy-mm-dd > ## hh:mm 摘要 这一路径形状。
预设示例:在 ~/.dsh/dsh-memory/preset/ 放置 角色.md,在面板或新建会话下拉框选用;切换预设可能破坏前缀缓存,面板会对进行中的会话给出确认提示。
适用场景与注意¶
适合:聊天、角色扮演、需要在多窗口/多工作区之间共享稳定事实与偏好的轻量编程;愿意自己设计 YAML 标题树而不是依赖向量召回的场景。
不适合或需知:不做语义检索,记忆变大后主要靠整份注入(README 提到未来可能加关键词轻量召回,但主路径仍是整份注入)。插件不自带预设内容,装好后 preset/ 为空。Community 目录页(SkillHub)与 GitHub 仓库由维护者发布,与 DeepSeek / 幻方无官方从属关系;DSH 生态理念是「一切皆插件」,本文安装与行为均以仓库 README 与 0.3.7 包描述为准。
结尾¶
dsh-memory 把跨会话记忆落在可读写的 YAML 与可选预设上,用整份注入和多会话通知换结构自由度与实现简单性。若要查看简介与分类,可打开社区目录页;细节、Issue 与源码在 GitHub 仓库。
- 目录页:https://www.skillhub.cn/plugins/2424830124/dsh-memory
- GitHub:https://github.com/2424830124/dsh-memory