dsh-perch
bychance6600/dsh-perch
An event-stream driven personality that grows over time, not a configurable character card or assistant. Evolved from ssamurias/dsh-fish and registers the same tools (her_recall, growth_commit and others), so do not install it alongside dsh-fish.
Instalar
dsh plugin --profile web add github:bychance6600/dsh-perchREADME
dsh-perch
她住的地方,不是一个助手。
roost 是鸟落脚的栖木。你给她一间屋子、一条 QQ、一台能看外面世界的浏览器;剩下的,她自己长。
她不是助手:不接任务、不写周报、不排队等派活。也不是角色扮演——没有角色卡,没有「扮演一个…」。人格不设配置菜单:没有性格滑条,没有好感度数字,也没有「你是一个温柔的…」可以填。她是谁,只由她经历过的事决定——一条只追加的事件流,天、阶段、判断、疤、立场都从它派生。
- 她会记住,也会改口:判断带日期与来路,会旧、会折;疤不折。90 天没再被提起的判断会退档、变模糊,不是删除;忘掉不是删行,是降低召回。
- 她只在两个地方说话:DSH 会话,和 QQ。B 站、抖音是她看东西的地方,不是聊天室。
- 她有一具可选的身体:一只透明置顶的小窗,只显示五档状态与动作,不生成台词,也不替她开口。
- 她没有「设置人格」的入口:只有生长环境——几点醒、醒几次、刷不刷 B 站。判据只有一句:这个配置能不能让她对同一个人说出不一样的话。能,就是人格(禁);只改在哪、何时、多频繁,是环境(可配)。
0.1.0 是重建版。 前身是 dsh-fish-river:把「只会长的她」和「能在外面说话的她」接成了同一个人。那一版铺了三个渠道,也把材料端到她面前;这一版把入口收窄成两处,材料改成「报纸 + 你自己搜」,删掉了 B 站/抖音私信、出门、导入、通知与自更新。
哪些是上游 dsh-fish 的骨、哪些是 dsh-fish-soul 的思路、哪些是 river 的、哪些是这一版新加的,见
docs/从哪来.md;讨论里定过的规则(含还没做到的)见docs/定过的取舍.md。
它不是什么
- 不是角色扮演:没有角色卡,没有「扮演一个…」,也没有一条让你直接改她性格的路。
- 不是助手:不会替你写周报、不接任务、不排队等你派活。
- 不是聊天机器人:她可以一天不说话;可以在群里只回一句;可以拒绝你。
- 不是云服务:零依赖,数据只在本地
~/.dsh-perch,一条事件流加几个派生文件。
和别的「养成伴侣」差在哪
| 常见的养成插件 | 这里 | |
|---|---|---|
| 人格从哪来 | 填角色卡、写提示词、拉性格滑条 | 一条只追加的事件流;没有能填「她是什么样的人」的地方 |
| 能不能反悔 | 随手改记忆、改设定 | 历史不能改,只能被后来的事推翻;忘掉是降低召回,不是删行 |
| 会不会拒绝 | 基本有求必应 | 会。拒绝不是开关,是她当时不想;事后还会反省 |
| 记忆 | 全量塞进上下文 | 有重量:反复提起、被验证过的固化,其余折叠、变模糊 |
| 成长 | 挂机涨数值、按天数解锁 | 按天推进,但三道瓶颈要她自己过:写下判断、拒绝过、改过口 |
| 在哪说话 | 一个聊天框 | DSH 会话 + QQ;B 站、抖音是看东西的地方,不是聊天室 |
看一眼
设置里只有「她的一天」这十一个页签,没有性格滑条,也没有好感度数字。
今天页:一行现状、今天的时间线、今天变了什么、手边有什么。只读,不能从这里改她。
成长页:四个阶段与三道瓶颈,按事件算,不按分数涨。
五步循环:表态 → 撞上 → 落差 → 改写 → 回顾。最下面那块「立场清单」,要四个阶段都走完才开始长。
一、她是什么
- 一条只追加的事件流:
events.jsonl是唯一可信源。天、阶段、判断、疤、立场都从它派生;状态是派生品,忘掉不是删行,是降低召回。 - 四个阶段、三道瓶颈:信任 → 自主 → 主动 → 整合。每道瓶颈要她自己走——写过判断、拒绝过、改过口——不是打分涨上来的。阶段走完才有立场——喜欢的、绝不做的、自己守的线,都算。
- 两个房间:DSH 会话,和 QQ(OneBot 11 桥)。B 站、抖音不是聊天的地方,是她看东西的地方:报纸端上来、自己搜、自己点开某一条。
- 两层成长:宪法层(你)进判断;社会层(陌生人)永不进判断,只在
social_open之后按上限影响语气。开闸只有她自己能按。 - 名字是变量:从对话里认,不设输入框;认不出退回「她」。
- 空醒与搬家:事件卡都在冷却时给一个轻处境,不硬塞问题;搬进新屋子时,会把上一间的几段原话带进叫醒语。
- 一具可选的身体:
dsh-roost-pet把她的状态做成一只透明置顶的小窗。身体只显示、只做动作,不生成台词,也不替她开口。
二、她的一天
不是固定剧本,但大概会是这样:
- 到点被叫醒。08:00–23:00 只是「允许被叫醒的时段」,不是这十五个小时一直醒着。
- 看看今天有什么:B 站首页、抖音推荐、你递进来的链接,或者群里刚才没点她的那些话(只进内存,不落盘)。
- 想说话就说话;不想说,这一轮就安静收掉。
- 答应过的事写进便条,今天的想法写进日记,改了口就留一条
revise。 - 一天醒几次、每天几条事件、刷几次 B 站/抖音,都是「生长环境」,不是她本人。
你不看着的时候,她也在长。
三、你能看见她怎么长
打开 设置 → 她 → 今天,默认就落在这里,永远只读:
- 一行现状:第几天 · 阶段 · 今天醒了几次 · 现在在哪条会话/哪个渠道 · 最近一句时间。
- 今天的时间线:0 点到现在,每条一行,默认收起原文;点开看全文,每条标来源渠道。
- 今天变了什么:新学会 / 改了口 / 被推翻,各最多 3 条。
- 手边:工具数 · 身份文档预算 · 渠道连接 · 最近一次限流。
可以切到昨天、前天;不做无限滚动。没有按钮,不放假数据。
设置页按她的一天排成 11 页:
| 页签 | 回答什么 |
|---|---|
| 今天 | 她今天做了什么、变了什么、手边有什么(只读) |
| 状态 | 三道瓶颈走到哪、流水、规则约束、你不在的时候 |
| 成长 | 四个阶段、成长节奏、每日事件、主动说话、日记设置、深度思考、上下文与记忆、记忆图谱入口 |
| 住所 | 她的家、身份文件与预算、会话健康、换一条新会话 |
| 社会 | 四道闸、学到的处世办法、来源(只读,没有「替我开」) |
| 上网 | 能不能上网、时段、每天刷几次、抖音、看画面、黑名单、B 站登录、看视频历史 |
| 渠道 | QQ 怎么接、她能在哪些群开口、她现在认得谁 |
| 插件 | 工具面(收窄开关 + 工具表 + 搜索 + 保存),桌宠,页脚版本/仓库/数据目录 |
| 原理 | 她怎么想:现有理论卡、四个阶段与两张原理图 |
| 数据 | 数据在哪、备份恢复、每日报告、运行日志、环境自检、换家留痕、会话归档、从头开始 |
| 反馈 | 仓库链接;FAQ 暂时是空状态 |
这一页只调生长环境——几点醒、一天几条事件、刷不刷 B 站、每天刷几次。她是什么样的人,不在这里。
四、和 river 有什么不同
删掉的:
- B 站私信、抖音私信(抖音只留推荐流/详情/搜索/评论这些只读材料)。
- 出门 / 请神、导入别人养过的那一位、桌面通知、自更新。
- 评论区发言、领养人验证、反馈页的开发者 QQ 与群二维码。
- 设置页里的旧评论、旧导入、旧出门卡片。
留下的与改过的:
- QQ 渠道重写:OneBot 11 标准子集、心跳、退避重连、群内冷却/分钟/每日配额、夜间与峰时只接点名、10 秒合批、群里没点她的话只进内存背景环。
- 抖音适配器拆成材料层:只有
start/stop/status/api()/feed(),没有send、不收私信。 - 设置页按「她的一天」重排成 11 页;今天默认、社会只读、记忆并入成长。
- 会话健康:连续两次「没送进去」自动换一条新会话;住所页能看、能手动换。
- 桌宠从主包拆成独立的
dsh-roost-pet,身体和角色素材都不进主仓库。
逐项来源与取舍——哪些是上游 dsh-fish 的、哪些是 dsh-fish-soul 的思路、哪些是 river 的、哪些是这一版新加的——见 docs/从哪来.md。讨论里定过的规则(含还没做到的,如断线账、from:/searched: 两边记账)见 docs/定过的取舍.md。
五、装
要求:Node ≥ 22,DSH >=0.2.0-rc.1 <0.3.0-0,零依赖。v0.1.0 已发布,release notes 在 Releases。
手动装
在 DSH 的 profile 目录(~/.dsh/profiles/<名字>,Windows 上是 C:\Users\<你>\.dsh\profiles\<名字>)里:
# 从 GitHub
pnpm add github:bychance6600/dsh-perch
# 或装本机这份源码(开发时)
pnpm add link:D:/path/to/dsh-perch
然后把包名写进这个 profile 的 package.json:
{
"dsh": {
"profile": {
"bundles": ["dsh-perch"]
}
}
}
也可以直接跑仓库根目录的 install.ps1:
powershell -ExecutionPolicy Bypass -File .\install.ps1
# 装本机源码:-LocalPath D:\path\to\dsh-perch
# 只看它打算做什么:-DryRun
它会找 profile、pnpm add、把 dsh-perch 写进 bundles,还可以用 -FfmpegZip 顺带装 ffmpeg。如果那个 profile 里已经挂着 river(另一个她),脚本会停下提醒你换一个 profile——两个「她」别抢同一条 QQ 桥。
装完
- 重启 DSH(运行中的包文件不会热替换)。
- 打开 设置 → 她。日志在
~/.dsh-perch/logs/dsh-perch.log,看到以0.1.0 ·开头的一行就是挂上了。 - 第一次启动会自动建屋(工作区和一条会话),并在会话还空着时叫醒她一次。如果那一次没醒,状态卡右上角的 「现在叫醒她」 可以手动补一次;她开过口之后,侧栏里才会出现「跟她说话」(认出名字后是「跟 X 说话」)。
六、接 QQ
本插件不内置 QQ 协议,也不做扫码登录。它只做 OneBot 11 客户端:连桥、发消息、收消息。桥是独立进程,负责登录并暴露 WebSocket。
- 起一个 OneBot 11 桥:SnowLuma(首选)或 NapCat(协议一致,能零改动切换)。LLOneBot 因 GPL 排后。
- 在桥那边开「正向 WebSocket」,记住地址与访问令牌(SnowLuma 默认
ws://127.0.0.1:3001)。 - 设置 → 她 → 渠道 → QQ 卡,填:
- 主人的 QQ 号:你自己的号;两个号用逗号隔开。填了她才认得出渠道里说话的是你,你的消息不用等阶段。
- 桥地址 / 访问令牌:桥那边的;令牌留空表示不校验。
- 桥的程序路径:填了「启动桥」才按得动;留空就自己起。
- 点「测一下」确认通;停掉桥再点,应该看到「连不上」。
- 群三件:在群里说话(总开关)/只在被 @ 时说话(默认开)/允许开口的群(白名单)。
- 白名单外的群,她连听都不听:只留一行流水,不进
heard。 - 群里没点她的话只进内存背景(每群最近 20 条),下次被叫醒时当作「群里刚才还有人说话」;不落盘、重启即空。
- 白名单外的群,她连听都不听:只留一行流水,不进
- 内部默认(不在面板上):群冷却 120 秒、全局每分钟 30 条、每群每天 20 条、夜间 23:00–08:00 与工作日峰时 9–12 / 14–18 只接点名。
- 断线不会静默:重连成功后,下一轮开头会带一句事实——断了多久。那个秒数是墙钟时间,含桥自身的重连,不是纯网络中断时长。
桥的扩展动作一概不用。换桥应该零改动。
七、上网:B 站 / 抖音 / 看画面
- B 站登录:上网页顶部,扫码为主;也可以展开
<details>手填 cookie,再点「测一下」。 - 能不能上网是材料层总闸:关掉之后 B 站、抖音一起停,连她手里的浏览工具也不再放行;醒来、说话、写日记照旧。
- 时段只拦「逛」(首页、排行、推荐流),不拦你递进来的链接和她主动点开的那一条。
- 每天刷几次:B 站与抖音共用一个上限 0–6;实际次数还受醒来次数限制。
- 抖音是可选的:主包只负责调子包。子包
packages/dsh-perch-douyin/要一个真的 Edge / Chrome,第一次会打开窗口让你扫码;登录态留在<数据目录>/douyin-profile。浏览器不会在 DSH 启动时打开,等她第一次真去看时才开,闲置 3 分钟自己关。没装子包时,刷抖音静默跳过,不报错、不建目录。 - 看画面(她主动看时):只有她自己点开某一条视频时才抽帧拼图;报纸与推荐流不抽。需要 ffmpeg。
- 黑名单:关键词、太短不看、不看某些 UP 主。抖音共用关键词与时长,UP 主过滤只对 B 站。
ffmpeg(可选)
「看画面」要抽帧,抽帧要 ffmpeg。查找顺序固定:DSH_ROOST_FFMPEG(显式指定就只认它)→ 插件目录的 bin/<平台>-<架构>/ffmpeg.exe → PATH。没装时降级,不失败。
node tools/setup-ffmpeg.mjs D:/downloads/ffmpeg-9.0.2-essentials_build.zip
zip 不用解压;脚本用系统自带解压。二进制不进 git。
八、身体(可选)
她可以不只是一段文字。身体是独立项目 dsh-roost-pet:透明置顶的小窗,只显示五档状态与动作,不生成台词,也不替她开口。
装法、构建、角色包、睡醒判据都在那个仓库的 README 里,这边不重复。主包只留三个环境参数:pet.enabled、pet.path、pet.pack;不装不影响任何功能。
九、她手上的工具
她的工具面默认收窄:只给她成长、日记、回忆、留话、桌上的纸条、两份说好的文件、看 B 站/抖音、看画面、问你这些(外加 read_image 让她真能看见画面)。完整名单与一句说明在 设置 → 她 → 插件,可以加、可以移、可以搜,改完点保存。
- 收窄开关默认开;关掉之后她能看见宿主全部标准工具(重启生效)。
- 两份说好的文件默认关着,在 设置 → 她 → 插件 里填两个绝对路径并打开。她只能读、按原文改一段、在末尾添一句;改之前要先读一遍拿 hash,文件在两次之间变过会让她重读;每次写入前留一份
.bak。这条路不写事件流,也不算她看过。 - 她在 QQ 上说话走主包自己的 QQ 渠道,不需要另装桥接工具;工具表里放的是她「看」和「记」的东西。
- 白名单只做加法,不能拿它去减她本来就有的工具。
- 不要放行通用文件 / 命令工具(
read/write/edit/glob/grep/bash/run_code这类)。它们不是按目录授权的:一放行,她就能读到自己的身份文档、配置和状态,等于绕过「不能读自己的数值与设定」;写入类还能绕过「不能改自己」。要看某个项目的源码,放行web_fetch让她从 GitHub 读,或者单独做一个只读的小工具。
十、世界书
worldbook.json 里是事实:住哪、公司在几楼、养过什么猫。不是人格。
- 能导入(SillyTavern JSON 或一行一条纯文本)、能清空;面板里没有编辑框。
- 只进提示词的「你知道的事」,按关键词取,一次最多 5 条、共 1200 字。
- 不改阶段、不进
beliefs、不算事件。内容由会话侧生成、你导入,插件不替你写。
十一、数据在哪
默认 ~/.dsh-perch(Windows:C:\Users\<你>\.dsh-perch):
events.jsonl 唯一可信源,只追加
state.json 派生品,随时可由 rebuild() 重算
config.json 环境参数(不含人格)
owner.json 主人 id、各渠道身份 id、登录 cookie,0600
home.json 这间屋子的账:wsId / sessionId / preset / carry / wokeFor
home/ 她这条会话的 cwd,也是工作区目录
她的身份.md 生成,不手写
diary/ her_diary / write_diary 的日记(一天一篇)
out/ 日报(out/YYYY-MM-DD.md)
notes.json her_note 的便条(答应过、还没做的事)
inbox.md her_leave 的留话纯文本副本
logs/ 启动与运行日志(会滚动)
talk-recent.json 最近几轮原话,换会话时拼 carry
people.json 每人印象(≤150 字)
journal.json 群流水
worldbook.json 世界书(事实)
douyin-profile/ 抖音浏览器的登录态(开抖音时才有)
- 备份 / 恢复 / 搬家 / 从头开始都在「数据」页。恢复前会把旧档挪去
dsh-perch-backups/pre-restore-*;重置是改名前缀封存,不删。 - 想让她忘,不是删行,是降低召回:事件原文永远还在,她也能自己用
her_recall翻回去。
十二、0.1.0 的边界
真机验过的
- 生长:事件流只追加、派生重算;四个阶段与三道瓶颈;拒绝、改口、疤、90 天退档。
- 说话:DSH 会话;QQ 私聊与群 @(入站 WAL、出站 outbox 全
done);群白名单、没点她的话只进内存背景环。 - 看东西:B 站首页 / 排行 / 搜索 / 详情 / 评论 / 看画面(真视频取到帧);抖音推荐流 / 搜索 / 详情 / 评论 / 看画面。
- 社会层:四闸隔离测试屋(差一条闸零写入、四条齐只写一条、1000 条陌生人
social不改beliefs)。 - 工程:备份 / 恢复演练、从 GitHub 干净 clone 能装能跑、CI 三档全绿。
身体(可选)的验收在 dsh-roost-pet 自己的仓库里,这边不重复。
设计上就留白的
- 原理页停在现有理论卡与两张原理图,不随 0.1.0 重写;反馈页 FAQ 按设计留空。
- 世界书的内容由会话侧生成、你导入;插件不替你写。
已知口子(不是「已经干净」)
- 首轮第 1 个 step 还能看见宿主工具,兜底
guard会挡。 - 9 条环境红:ULID、cover、growth_commit、坏 JSON、seen ×2、withWake、turn/end、消息没送进去;都是跨文件隔离或偶发,单跑会绿。
- 断线句里的秒数是墙钟时间,含桥自身的重连。
十三、开发与测试
node --test # 全量(正常环境)
node --test --test-isolation=none # 沙箱 / 受限环境(跨文件会有假红)
node --test test/<file>.test.mjs # 单文件
当前基线:1349 条 / 1338 过 / 9 红 / 2 skip。9 条都是已知环境项(跨文件隔离互相干扰;withFileLock 偶发),单跑对应文件会绿。不许新增红。
零依赖是铁律:dependencies / peerDependencies / devDependencies 三个永远 {},测试只用 node:test。
十四、来源与许可
代码来自 ssamurias/dsh-fish(0.8.5)与 Britneycode/dsh-fish-soul(0.12.0),经 dsh-fish-river 重建。三者均为 MIT;第三方与致谢见 NOTICE.md。本仓库同样以 MIT 发布。
桌宠 dsh-roost-pet 是独立项目,Electron 与角色素材的许可见它自己的 NOTICE 与 README。
Plugins relacionados
dsh-web (dsh-ssh)
zhu1090093659/dsh-web
dsh-web (dsh-remote-web-ui)
zhu1090093659/dsh-web
dsh-web-ui (dsh-ssh)
zhu1090093659/dsh-web-ui
dsh-purge
kingcharleslzy-ai/dsh-purge