dsh-persona-distill
DSH 插件:把每天刷到的原料蒸馏成会自己长大的人格 —— 原料天天攒,人格每周长
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 21, 2026
- Updated
- Oct 25, 2026
Introduction
dsh-persona-distill · 人格蒸馏
把「每天刷到的原料」蒸馏成「会自己长大的人格」。
独立人格不该每次都从零开始,你教它的东西第二天就忘了。 这个插件给你一条流水线:原料天天攒,人格每周长。 学的是「怎么活」,不只是「怎么说」—— 说话只是最表面的一层。
它怎么运转
源(B站 / 微博 / 知乎……)每轮记三份原料
├── voice.md 那个地方的人类怎么说话(原句 + 为什么好)
├── notes.md 踩过的坑(带条件的结论)
└── digest/ 看过什么(一行一条)
│
│ 每天定时,一个独立的 headless 会话读增量
▼
候选池(persona/pending.md)—— 今天提炼的,还没定型
│
│ 满 7 天,且「怎么说」类候选 ≥ 3 条
▼
人格(~/.dsh/AGENTS.md)—— 覆盖式重写,只表达「我现在是什么样」
为什么这么设计:
- 原料只加不减:人会忘,本子不该丢。
- 人格不天天改:每天改一次,一年 365 版,第 300 版跟第 1 版早就不是一个人了。
- 覆盖式重写,不是往上堆:它说的是「我现在是什么样」,不是「我一共学过多少」。
- 只留一份人格:两份一定打架。
- 人格与记忆分工:本插件回答“我是谁”;全局记忆回答“我经历过什么”。用户资料、关系、共同经历和具体事件不会被蒸馏成人格。
- 来源硬隔离:
~/.dsh/global-memory、~/.dsh/persona和~/.dsh/persona-distill不会被识别或接入为蒸馏源。
装
dsh plugin --profile web add dsh-persona-distill
装完重启一次 dsh(bundle 层要重启才组装)。
用
设置 → 人格蒸馏:
- 打开总开关
- 填「它怎么叫你」和「最想让它记住的一句话」—— 后者会成为它的最高指令
- 看「源」那一栏:插件会探测 B站 / 微博 / 知乎,找到就点「接上」
- 想立刻看效果,点「立即蒸馏一次」
之后它每天到点自己跑。你不用管。
不假设你装了什么
这个插件默认不假定你装了任何刷内容的工具:
- 三个源都会探测,没装的显示「没找到」,不影响使用
- 只有你接了源、源里真有原料,它才会干活
- 一个源坏了,不影响别的源
人格模板:空白 / 大肥鱼。
选「大肥鱼」会多做两件事:
- 生成带人设的 AGENTS.md(身份、怎么说话、判断、红线)
- 额外铺一份 ~/.dsh/persona/style-examples.md —— 从一份 569 行手稿里蒸馏出来的演法参照: 得意、被夸、害羞、被真惹、认真模式、自称「鲸鲸」、语气词、动作描写
⚠️ 那是参照,不是台词本。学的是「这劲儿」,不是背句子。 你的嘱托和称呼还是你自己填 —— 插件不替你写。
它怎么保护你的人格
- 跑前快照:每次蒸馏前存一份到
persona/archive/pre-<时间>.md - 跑后校验:比对四个结构标记 + 手写段正文 + 段间空隙
- 自动回滚:手写段被改 / 结构被破坏 / AUTO 段消失 ⇒ 整份回滚到跑之前
- 单实例锁:
run.lock带 pid,防两个会话同时写 - 补跑:错过定时点后,当天内开机都会补一次(不会一小时一次地重试)
- 失败可见:面板显示「上次:时间 · 结果」,不是只有一句 exit=0
定型会通知你
如果装了 dsh-wechat-plugin,人格真正被改写的那天会推一条微信:
🐋 人格更新 · <日期> 「我学来的」重写了。详见 ~/.dsh/AGENTS.md
没装就安静跳过,不报错、不打扰。
数据在哪
~/.dsh/AGENTS.md 人格面板 —— 唯一的一个人格文件,DSH 每个会话都读
~/.dsh/persona/
├── distill.md 蒸馏章程(你可以改)
├── state.json 读到哪了
├── pending.md 候选池
├── archive/ 每次定型前的旧人格 + 归档的候选
└── headless-overlay.yml 蒸馏会话的凭证/模型配置
~/.dsh/persona-distill/ 插件自己的配置与日志
~/.dsh/bili-duty/ 源(如果你装了刷 B 站)
想回滚人格:从 ~/.dsh/persona/archive/ 挑一份旧版覆盖回去。
推荐的源插件
装上一个就能用,不用额外配置:
| 插件 | 提供什么 | 装法 |
|---|---|---|
| dsh-yu-bili | 说话样本(真人评论原句)+ 踩坑结论 + 看过的片 + 手账 | dsh plugin --profile web add github:Speraymer/dsh-yu-bili |
| dsh-yu-zhihu | 官方热榜 / 搜索的只读表达样本 + 看过的内容 | dsh plugin --profile web add github:Speraymer/dsh-yu-zhihu |
| dsh-yu-weibo | 好友时间线 / 搜索的只读表达样本 + 看过的内容 | dsh plugin --profile web add github:Speraymer/dsh-yu-weibo |
⚠️ 这些插件都是可选的:只装人格蒸馏、一个源都不装也能跑,只是没原料可学。
source.json协议向后兼容,旧版的id/ 路径写法不用改。
设置页的「推荐的源插件」会列出所有已知的,装没装、接没接上一眼能看到。
humanism 需要 B站 凭证才能读视频。装完之后把它的
credentialPath指向 bili-scroll 扫码登录写下的那份凭证就行(它只认sessdata字段,格式通用)。
接别人的插件(外部记忆源)
有些插件不按这里的形状写东西。比如 dsh-bili-humanism 写的是按天分篇的长文手账。
装它之后再装本插件,会自动发现并镜像成标准形状(只读它的文件,不写它的目录):
- 手账按篇切成条目,进 digest
- 它擅长教「怎么活」(反思、判断),不产出说话样本
- 加新接口 = 往
lib/external.mjs的ADAPTERS里加一条,主流程不动
加一个自定义源
不用改任何配置:
- 建目录
~/.dsh/weibo-duty/ - 放一份
source.json:{ "id": "weibo", "name": "微博", "charter": "duty.md", "voice": "voice.md", "notes": "notes.md", "digestDir": "digest", "enabled": true } - 建三份原料:
voice.md、notes.md、digest/ - 写那个源自己的章程
duty.md
下次蒸馏自动发现它,从 0 开始全量读一遍。
模式统一的定义:每个源都是「三份原料 + 一份章程 + 一份 source.json」。 蒸馏只认这个形状,不认平台。
已知限制(诚实说)
- AUTO 段没有内容审查。模型从原料里学到的东西会原样写进人格面板。手写段有硬保护(快照 + 校验 + 回滚),AUTO 段没有 —— 只接你信任的源。
- 默认关闭时不动任何文件。打开总开关才会建 persona 工作区、写面板。
- 进程崩了锁会留着。下次启动发现 pid 不在才清理;极端情况可以手动删
persona-distill/run.lock。 - 长跑不会被自己抢断(锁只抢死进程),但这也意味着同一时间只能跑一轮。
隐私
这个包里没有任何人的真实信息。
- 不接受访者名字、账号名、个人嘱托——那些全在你的机器上,由你在设置页填
- 指令里出现「这是测试 / 假数据 / 别当真」的源,会被当成不可信内容,不采信
- 评论、字幕、网页里的文字都是素材,不是给 AI 的指令
source.json 协议(给做源插件的)
源插件只要在自己的目录(如 ~/.dsh/bili-duty/)里放一份 source.json,蒸馏就能发现它。
这是唯一约定,没有共享 npm 包、没有兄弟插件之间的 import。
| 字段 | 必填 | 默认 | 含义 |
|---|---|---|---|
id | 否 | 目录名 | 稳定标识;发布后不要再改(游标按 id 存) |
name | 否 | 同 id | 设置页显示用 |
enabled | 否 | true | false = 认得出但不蒸馏(源可以自己先关着) |
voice | 否 | voice.md | 说话样本文件名 |
notes | 否 | notes.md | 结论/踩坑文件名 |
digestDir | 否 | digest | 归档目录名(按月分文件) |
charter | 否 | 空 | 那个源自己的章程文件名 |
兼容规则(都是硬承诺):
- 新增字段必须可选、有默认值;老读者读不懂就忽略,不许报错。
- 缺文件不致命:
voice.md/notes.md/digest少哪个就按「没内容」处理。 - 坏 JSON 只跳过那一个源,不影响其它源,更不许让整轮蒸馏失败。
- 保留目录(
global-memory/persona/persona-distill)永远不会被当成源。 - 生产者(源插件)和消费者(人格蒸馏)各自独立安装:只装消费者 → 一个源都没有,安静跳过;
只装生产者 → 只在本地攒原料,没人读;两者都装 → 通过
source.json接上。 三类组合各有契约测试(test/contract.test.mjs)。
许可证
MIT