前言¶
长对话的 agent 最常见的死法是”聊着聊着忘了你是谁”。靠上下文窗口硬塞,迟早要被压缩挡掉;压缩一发生,”他为什么严谨”就只剩”他是个严谨的人”,来路没了。向量检索能把句子存起来,但存进去的是碎片,答出来的是相似度,既没有”该不该说”的判断,也说不清这个印象是从哪句话长出来的。
下面介绍 h1-cat 维护的 dsh-headwater(分类:记忆,当前星标 0)。它的思路不是”存更多”,而是用三层文件把”原话”和”理解”分开:原话永不改写,理解可以随时改,改错了也有个底账可查。
这是什么¶
一句话定位:给 DSH Harness agent 加一套自己的记忆——原话一句不丢,从原话里长出”我理解你是谁”,开口前先判断这话现在该不该说。
- 维护者:h1-cat
- 分类:记忆
- 许可:MIT
- 不装模型、不做向量检索、不切块,只有三层文件加十个小工具
它把记忆分成三层:
<workspace>/.composure/
├── episodes.jsonl L0 流水账 每句话原样追加,永不改写
├── book.json
│ ├── portrait L1 报表 "当前理解":他是谁 / 还没了结 / 最近状态
│ ├── relation L2 账本 熟悉、张力、承受力
│ ├── open L2 账本 悬着的话
│ ├── stances L2 账本 我说过的立场
│ └── sayings L2 账本 我说过的重话 + 后续反应
规则只有一条:L0 永不改,L1/L2 随便改。理解错了改报表,上了下一次重算就覆盖;事实丢了说明流水账里本来就没有。
安装与启用¶
官方安装命令不是 dsh plugin add github:...,而是带上 profile:
dsh plugin --profile desktop add github:h1-cat/dsh-headwater
粘贴到 PowerShell 回车,DSH 开着也没关系。如果用的是网页版(web profile),把命令里的 desktop 换成 web。
然后重启 DSH,设置页里会多出一个「记忆」。
卸载:
dsh plugin --profile desktop remove dsh-headwater
记忆数据不会跟着删。它留在工作区的 .composure 目录里,是你的数据,不是这个应用的。
最常见的报错是第二步提示「找不到 dsh 命令」,说明装的是精简版、便携版或商店版,没带命令行工具。这种情况要手动装一次,步骤在仓库的 INSTALL.md 里。别的报错可以直接到 Issues 提交。
会话开始:记忆自己出现¶
插件每一轮把一小段挂在提示词末尾,section 名为 headwater,order 850:
## 我记得的
他是谁:…
还没了结:…
最近状态:…
## 分寸
熟悉 0.30,张力 0.00,承受力 0.62。关系平稳。
悬着的话:…
我说过:…
这不是等模型调用工具才会出现的记忆,而是自动注入,通常三到十行。
说之前:问一次¶
headwater_check(draft, intent, topic)
→ verdict: say | soften | warn_then_say | hold | stop
五档含义依次是:直接说;说但先接住对方状态;先说”这话可能不太好听”再讲;先别说;别聊正事了,收一句留门的话。
第 3 档处理”难听但还是要说”,第 5 档处理”对方不想聊了”。这两条都不是”少说话”,而是分寸上的差别。
要原话:回查¶
headwater_recall(query, days, role, limit)
按时间或关键词翻原文,返回带时间戳的片段,不是摘要。之前说过什么、哪天说的,可以直接查。
重写理解¶
headwater_portrait(action: 'write', who, threads, mood)
整段覆盖,写成当前的判断,会随认识加深而变化,”这是对的”。
它自己会重算¶
不需要谁记得去调用。每 8 轮对话、且距上次重算超过 30 分钟,插件会用一次轻量模型调用把最近 40 条原文压成新一版理解。
这两个旋钮写在数据目录的 settings.json 里,改完立即生效:
headwater_config(everyTurns=8, minMinutes=30) 每几轮重算一次、两次之间的最小间隔
也可以手动催一次:
headwater_recompute()
它返回 detail 说明这一步走到哪了:material(原文不够)/ empty(模型只产出了推理)/ json(没给可解析的 JSON)/ finish(调用被中断)。
一个实际坑:deepseek-flash 这类推理模型会先把 token 预算花在推理上,正文可能一个 text-delta 都没有。插件会先探测模型支持的最小 reasoning effort,再给 maxTokens: 3000。如果换模型后重算总是 at: 'empty',就是这个原因。
说话方式也跟着上¶
记住一个人说什么,和说得像个人,是两件事。后者只能靠原文里的口气,写一句”他是个务实的人”学不来。所以每轮提示末尾还多一段样本:
他平时是这么说话的(原话,一个字没改。这是标尺不是台词——学句长、断句和用词,别复述内容):
- 「……」
- 「……」
五条样本由代码从 episodes.jsonl 里挑,不经模型,规则包括:长度 10–160 字,跳过代码块,末尾是问号的不收;按长度分三档各取几条,免得全是同一口气同一话题;刚说的两条不收,避免模型把”他刚说的”当成”我该说的”原地复读;> 引用块里混着”我说过的话”的整条跳过;总字数超过 260 从最长的开始砍。原文一个字不改,模型顺手润色一次,口气就被磨平了。
关掉:headwater_config(voice=false)。
需要说明:样本给的是”人怎么说话”的标尺,不是”你该是个怎样的人”的设定,它不替你定性格。
话掉在地上,插件自己捡¶
不需要模型记得调用 headwater_open。每一句话进来插件自己看:
短(≤20 字)+ 问句之外 + 含「算了 / 随便 / 不想说 / 没事 / 别问了 / 无所谓 / 没意思 / 不想聊」
→ 自动挂一条 relational 的悬着的话
去重、最多同时挂 5 条、标记 auto: true。
不做成”等模型自觉”的原因很直接:那等于让最关键的动作依赖最不可靠的东西,模型聊到第三十轮想不起来调工具是常态。自动挂上之后,它会在下一轮提示里出现,模型自己决定接不接。
不会被更新抹掉¶
三个机制挡住压缩磨平印象这件事。
一是锚点,不参与压缩,只增不减,每一轮都出现:
headwater_anchor(action='add', text='他要的是能跑起来的东西,不是说法')
重算时模型也能提议新锚点(anchors_add),但代码只负责去重和追加,绝不覆盖已有的。移除必须显式调用并给理由,同时记进变更日志。
二是变更日志,每次重算记下 who / threads / mood 从什么变成了什么:
who: …… → ……(多了"担心理解被磨成标签"这一层)
headwater_state 返回最近 6 条,能回答”它什么时候开始这样看我的”。
三是核心印象有保护期,who 默认 6 小时才允许改写一次,threads 和 mood 每次都能变:
headwater_config(whoMinutes=360)
细节变得快,轮廓变得慢。
第四个是数据自己有历史。账本目录(默认 .composure)如果是 git 仓库,插件会把变化自动提交进去:每 autoCommitMinutes(默认 20)分钟检查一次,有变化就提交;每次重算”当前理解”之后立刻提交一次;commit message 带原因和时间,例如 memory: portrait recomputed 2026-11-05 04:20。目录里没有 .git 时不替你 init,只记一条日志,仓库边界由人划。判断只用 git 退出码,不读子进程输出,受限环境也能跑,失败只记日志,绝不影响记忆写入。
这样”它什么时候开始这样看我的”不仅可查变更记录,还能用 git log / git diff 看到具体哪一版账本长什么样:
git -C .composure log --oneline -5
反应记录¶
每说一句较有分量的话(通过 headwater_check 之后实际说了),系统会盯着下一条用户消息:追问细节记 engaged,回”嗯”“哦”“随便”记 dismissed,其他记 acknowledged。这是全套里唯一别人不会替你记的东西——说完之后那个人怎么样了。
它不做的事¶
- 不做向量检索、不切块、不装模型
- 不改人设,声音层给的是标尺不是性格设定
- 不替你写台词,只给结论和理由
适用场景与注意¶
适合交流长、需要记住此前说过什么、以及需要判断分寸的对话型 agent。它默认以当前 dsh 进程的权限运行,安装前应先打开源码看一眼,并确认 MIT 许可符合你的分发要求。
一条纪律贯穿整个实现:写入中立,读取带倾向。账本记的是事实(他说了什么、隔多久、用了什么词),倾向只发生在解释的时候。这样换人设、换模型,底账都是同一份。
数据都在自己的工作区 .composure,不联网、不上传,唯一一次对外调用是重算”当前理解”,用的是你在 DSH 里自己配的那个模型。
关闭¶
在 profile 的 cordis.patch.yml 里给 headwater 那行加 disabled: true,或在插件管理器里停用。停用后不写入任何东西,账本留着。
结尾¶
dsh-headwater 的价值不在”多记住几句”,在于把原话、理解和分寸拆成三层,让原话永远在、理解可重写、说出口前过一次判断。目录页在 https://www.skillhub.cn/plugins/h1-cat/dsh-headwater ,源码在 https://github.com/h1-cat/dsh-headwater 。