前言¶
在 DeepSeek Harness(DSH)里做多项目、多场景对话时,常遇到两类问题:全局记忆混在一起,换目录或换「人设」后上下文对不上;若在会话中途不断改系统提示里的记忆,还会打穿供应商的前缀缓存,成本上升。社区插件目录里归类为「记忆」的 dsh-persona 走另一条路——按角色槽位隔离存储,会话开始时把记忆冻结进提示词,并在回合结束后用独立复盘写入。下面介绍它是什么、怎么装、日常怎么用,以及使用时要注意的点。
这是什么¶
dsh-persona 由维护者 TBAOT 发布,是面向 DSH 的「角色记忆」插件:每个角色有两档长期记忆(用户画像 user + 角色笔记 memory),在会话开始时一次性注入提示词;支持 add / patch / remove 维护条目,并有硬字符上限,写满会拒绝并要求合并。多个角色通过槽位与工作区绑定各自独立,未绑定工作区可回退到默认桶或经面板认领。
许可为 MIT;package.json 中版本为 0.4.4,引擎要求 dsh 为 >=0.2.1-rc.2 <0.3.0、node 为 >=20.18。
核心功能¶
两档记忆与冻结注入¶
数据落在 <DSH_HOME>/personas/<角色>/memory/(DSH_HOME 默认为 ~/.dsh):
user.md:用户画像(默认上限 1375 字符)memory.md:角色笔记(默认上限 2200 字符)topics/:预留,供按需读取的细节
条目为普通 Markdown,条目之间用单独一行 § 分隔。记忆在会话开始时读一次,整个会话内不再变更,以便系统提示前缀稳定、利于前缀缓存命中;本会话复盘写入的内容,下一个会话才会出现在注入里。工具返回仍显示实时用量。
槽位、面板与工作区绑定¶
包装声明 4 个槽位(slot-1…slot-4)。装好并在 profile 的 dsh.profile.bundles 中启用后,左栏底部出现「角色」面板:
- 左侧:角色列表(名字、槽位 id、绑定工作区数量)
- 记忆:两档编辑器与用量
- 复盘记录:最近 30 条
- 工作区:从应用已有工作区选择绑定,或手动填写必须真实存在的子目录路径
工作区 → 角色 映射写在 <DSH_HOME>/personas/index.json。会话归属由工作目录决定,无需在新建会话时选预设;改名不丢记忆(目录跟槽位走)。
每轮复盘(自动写)¶
回合关闭后异步跑一次模型,读对话摘要与当前记忆,返回结构化改动写入同一存储:不阻塞当轮回复,不改当轮已冻结的快照。每次操作记在 <角色>/review/log.jsonl;单条超限只拒那条;JSON 解析失败记 parse-failed,不重试。模型来源顺序:插件配置的 provider + model → 平台默认 → 皆无则跳过并警告。
复盘相关配置示例(摘自 README):
- id: persona-review
name: dsh-persona/review
config:
personaId: default
enabled: true
everyTurns: 1
maxTokens: 1200
dryRun: false
provider: wb-proxy
model: deepseek-v4.1-flash
memory 工具¶
模型通过 memory 工具维护记忆,须指定 target 为 user 或 memory:
| 操作 | 行为 |
|---|---|
add |
追加;与已有条目完全重复会被拒绝 |
patch |
用 old_text 定位唯一片段并替换 |
remove |
用 old_text 定位并删除整条 |
一次调用可带多条 operations,按顺序执行,最终结果须在上限内,否则整批拒绝。写入前会检查不可见 Unicode 与疑似密钥/私钥。
未绑定工作区与「未认领池」¶
会话 cwd 不属于任何角色工作区时,回退到配置中的 personaId(默认 default),记忆与复盘落在 personas/default/;该桶不在名册里,未绑定项目共用一份。面板显示为「未认领池」,可一键 adopt 到当前角色(POST /dsh-persona/api/adopt)。要避免混用,请在工作区面板完成绑定或认领。
角色私有技能¶
可将技能放在 <DSH_HOME>/personas/<角色>/skills/(目录式 SKILL.md 或平铺式 .md)。会话开始时仅把本角色目录下的技能索引注入该会话提示词;共享技能仍放 ~/.dsh/skills 或 ~/.agents/skills。
从 dsh-soul-md 迁移¶
若曾使用 dsh-soul-md,可用仓库脚本迁移(源数据不动,可重复运行):
node scripts/migrate-soul-md.mjs --persona slot-1 \
--patch ~/.dsh/profiles/<profile>/cordis.patch.yml
安装与启用¶
README 注明:npm 上的 dsh-persona 为他人占用名(0.0.1,描述为 name reserved),本仓库未发布到 npm,请从 git 安装。
1、安装插件(将 <profile> 换成你的 profile 名):
dsh plugin --profile <profile> add github:TBAOT/dsh-persona
本地开发时 README 还支持 dsh plugin --profile <profile> add link:<本地路径>。
2、在对应 profile 的 dsh.profile.bundles 列表中加入 dsh-persona。
3、重启 Harness。
卸载时从 bundles 移除并卸载包即可;<DSH_HOME>/personas/ 下数据不会自动删除,需自行备份或清理。
主配置块示例:
- id: persona-memory
name: dsh-persona
config:
personaId: default
userLimit: 1375
memoryLimit: 2200
inject: true
userTitle: 用户画像 / USER PROFILE
memoryTitle: 长期记忆 / MEMORY
一个 personaId 对应一份记忆;多角色独立时,可为每个角色在预设里挂一行 dsh-persona 并设置不同的 personaId。
典型用法¶
1、安装并加入 bundles 后,打开左栏「角色」,在空槽新建角色并命名。
2、在「工作区」里把常用项目目录绑定到该角色;之后该目录及子目录下的会话自动归属此角色,会话开始时会注入该角色的冻结记忆。
3、对话中模型可用 memory 工具更新画像或笔记;同时可开启 persona-review,让每轮结束自动复盘写入。观察阶段可设 dryRun: true,只记录不落盘。
4、若有未绑定目录的历史会话,在面板「未认领池」查看并 adopt 到目标角色,或提前绑定工作区以免写入 default 桶。
5、角色专属工作流可把 SKILL.md 放进该角色 skills/ 目录,无需改全局技能路径。
适用场景与注意¶
适合:同一 DSH 上并行多个「角色」或项目线,需要隔离长期记忆、又希望控制提示词前缀稳定;愿意接受「当会话内新记忆下一会话才进注入」的折中。
隐私与权限:记忆为本地明文文件,插件本身不联网;注入内容与复盘调用会随你配置的模型供应商出站。安装前宜浏览 GitHub 仓库 源码与 MIT 许可证;插件以当前 DSH 进程权限运行,与任意社区插件一样,信任边界由你自行评估。
生态说明:DSH 奉行「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-persona 把「多角色 + 两档记忆 + 冻结注入 + 每轮复盘」收进一套本地文件与工作区映射里,并附面板与 adopt 流程处理未绑定目录。需要细节时,以目录页 dsh-persona 与仓库 TBAOT/dsh-persona README 为准。