dsh-persona:多角色两档长期记忆与每轮复盘

前言

在 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 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜