dsh-companion-memory
DeepSeek Harness 的跨会话记忆与主动唤醒方案,面向角色扮演和长期陪伴场景。
快速开始
dsh plugin --profile web add dsh-companion-memory
dsh --profile web
还没发布到 npm 的话,直接从仓库装:
dsh plugin --profile web add github:用户名/dsh-companion-memory
包自带挂载声明,装完两个插件就挂上了。装完还有三件事:
- 把
defaultPreset和sortPreset改成你环境里存在的模式 id。两个插件默认写的default在 dsh 里并不存在,名字对不上时会话开不出来,只在日志里留一行错误 - 把
templates/、docs/03-整理流程.md和scripts/sort_memory.py按对应的位置复制到工作区 - 在该模式的
agent.cordis.yml里登记常驻记忆文件
细节见上手。
功能
跨会话记忆
每个新会话开始时,STATUS.md(当前状态)和 MEMORY.md(对方的基本属性)会自动注入上下文,前者记录最近发生的事,后者记录不会变的事。
其余细节放在记忆库目录,按索引读取。
整理可以手动触发,也可以交给自动整理定期执行。
面向 RP 场景的记忆写法
现有记忆插件的记忆文件多为技术文档式记录:条目化、客观、平铺直叙。这种写法适合让 agent 查资料,在 RP 场景里会降低角色的情感表现力。角色读到的是"用户在某个时间提到过某件事"这样的句子,没有语气、情绪和当时的语境,回话也带不出情感浓度。
本方案中记忆文件按角色视角写,记录角色看到的内容,使用角色会用的说法,保留原话、语气和体现情绪的细节。
记忆文件里不写"他""对方"这类中性指代,用角色对他的称呼来写,情感浓度靠这个撑起来。
人格本身不在记忆文件里,写在模式(preset)的提示词里。
说明
本仓库不提供角色人设。人格由 DeepSeek Harness 的 agent preset 提供,一个 preset 是一套人设提示词和工具配置。称呼相同的 preset 可以共用一套记忆文件,称呼不同的各用一套。
常驻记忆文件需要放在工作区根目录,并在 preset 的 agent.cordis.yml 中登记:
- id: agent-instructions
config:
maxBytes: 65536
instructionFileCandidates:
- MEMORY.md
- STATUS.md
两份文件在每个会话开头注入上下文。
索引-记忆库
不加控制的话记忆文件会持续增加,同一类场景和情绪被反复记录,角色每轮读到的内容高度相似,说话句式也跟着重复,最后固定在几种说法上。
索引-记忆库用于控制这个问题。记忆分四类:
| 类型 | 文件 | 内容 | 读取时机 |
|---|---|---|---|
| 状态 | STATUS.md |
最近聊了什么、正在忙什么、答应了什么没做 | 每会话自动注入 |
| 属性 | MEMORY.md |
作息、喜好、忌讳、生日 | 每会话自动注入 |
| 细节 | 记忆库/*.md |
某件事的完整记录 | 按索引读取 |
| 叙事 | 回忆录-*.md |
值得记住的经历,按故事写 | 很少读 |
STATUS.md 和 MEMORY.md 是常驻文件,只保留精炼条目,需要细节处写一行"详情在 记忆库/xxx.md",使用时按路径读取。
细节是否在常驻文件里留索引,判断标准是"不读它会不会误事"。仅备查的内容只进记忆库。
单个文件超过 15KB 时按话题拆分。
这套设计针对三个问题:常驻文件膨胀占满上下文、同一件事在几份文件里重复记录、相似内容积累导致角色说话趋同。
自动整理
插件按固定周期检查新对话。存在新活动且距上次整理超过设定的静默时间时,开启一个整理会话。
整理会话的步骤:
- 运行提取脚本,从会话日志中取出新对话
- 读取这些对话
- 按判断标准筛选,决定写入哪份文件
- 逐条写入,并按规范自查
- 开启审查子代理,用整理规范、写作规范、模板文件三份基准逐条核对
审查子代理必须引用原文、标注严重程度、给出改法,输出一份整理者照着就能改的清单。
整理完成后写入预设文件,供心跳插件决定下次的状态。
主动唤醒(心跳)
插件不等用户输入,自行选择时间开启会话。设计要点:
- 触发间隔不固定,随聊天频率变化,由概率曲线控制
- 睡眠时段内不触发
- 触发前做二次检查,确认期间没有新的对话
- 命中后随机延迟数秒至数分钟
- 会话开启后先读取状态文件,再决定本次行为
- 心跳会话默认带全权限,因为它常常在你不在电脑前的时候开,没法逐次批权限;可以在配置里改成更小的权限档
跟其他记忆插件的区别
| 常见做法 | 结果 | 本方案 |
|---|---|---|
| 自动抽取事实入库 | 存下来的是资料条目,角色说话仍像助手 | 由角色主动整理,按角色视角写 |
| 记忆一次性全部注入 | 上下文被占满,重要内容被稀释 | 常驻只放精炼条目,细节按索引读 |
| 全量堆在单个文件 | 文件越来越长,同一件事记多遍 | 常驻与文件库分离,超过 15KB 拆分 |
| 只存不查质量 | 记忆混入猜测、汇报腔、视角错误 | 独立子代理对抗式审查,输出修改清单 |
| 被动等待提问 | 不会主动开口 | 概率间隔的心跳,带睡眠时段和随机延迟 |
| 人格写进记忆 | 记忆里全是中性指代,读着像档案 | 人格放模式里,记忆用角色对他的称呼写 |
环境要求
- Node.js
^22.19.0 || >=24 - DeepSeek Harness
0.2.0及以上,在 web profile 上验证过(用的是0.2.0-rc.2,底下的 cordis4.0.4) - Python 3.8 以上,
pip install zstandard
dsh 目前还在开发者预览阶段,插件的接口会跟着版本变。换版本之后如果心跳或者整理不工作了,先看插件有没有加载日志,再看模式 id 对不对。
安装
dsh plugin --profile web add dsh-companion-memory
从源码装:
dsh plugin --profile web add github:xy261624/dsh-companion-memory
包里的 cordis.patch.yml 会自动把两个插件插进组合。不配 workspace 时用 dsh 里的第一个工作区;有多个工作区、想指定其中一个,在 profile 的 cordis.patch.yml 里补一段:
- id: companion-memory-heartbeat
config:
workspace: D:/你的工作区
- id: companion-memory-auto-sort
config:
workspace: D:/你的工作区
两个插件都要配,只配一个的话另一个会退回 dsh 里的第一个工作区,两份预设文件就落到不同目录去了。
全部配置字段见 docs/05-上手.md。
目录结构
package.json 插件包声明,指向 cordis.patch.yml
cordis.patch.yml 装完自动挂载两个插件
docs/ 设计说明与流程文档
plugins/ 两个 dsh 插件
dsh-heartbeat/
dsh-auto-sort/
scripts/ 会话提取脚本
templates/ 记忆文件模板
文档
LICENSE
MIT
No comments yet. Be the first to write one.