前言¶
DSH 的插件体系里,一个 agent 的”性格”通常来自某些配置项:人物设定、好感度、数值门槛、解锁条件。dsh-fish(大肥鱼)想去掉这套东西。它不提供人格设置界面,甚至把”好感度”“亲密度”这类数字列为代码级黑名单,设置页只留下生长环境——几点醒、一天几条事件、刷不刷 B 站——人格本身由 agent 在一条只能追加的事件流里自己长出来。
这个插件由 ssamurias 维护,包名 @ssamurias/dsh-fish,当前版本 0.9.1(2026-11-06)。仓库在 GitHub 上标记为 JavaScript、package.json 声明 MIT、零运行依赖,兼容 DSH >=0.2.0-rc.1 <0.3.0-0,Node >=20,声明支持 desktop / web / headless 三个 profile。下面按机制、数据、安装、上手、注意事项的顺序介绍。
它解决什么问题¶
角色扮演式的 agent 有两个绕不开的问题:一是人格靠用户写入,用户写什么她就是什么;二是记忆全量塞进上下文,时间一长既贵又失真。dsh-fish 的答案是只提供环境,不提供人设。人格从事件里被 agent 自己总结、否定、改写出来,这个过程在 README 里被拆成五步循环:
表态 → 撞上 → 落差 → 改写 → 回顾
走到最后才会长出一张”立场清单”。作者在仓库里反复强调这”并非角色扮演,而是真实诞生”。工程上对应的做法是:设置页没有性格滑条、没有好感度、没有情绪标签,任何让用户直接指定”她是什么样的人”的入口都被明确禁止。
同时,这个插件给 agent 接了一个真实的外部世界接触面(B 站),不是纯文字模拟。她能用登录 cookie 调接口刷视频、抽画面帧、写评论、回复评论。作者把 B 站当作”外部世界接触面”,看过的视频和评论可能会参与人格的形成。
核心机制¶
人格从事件里长,不是从配置里读¶
插件运行时只暴露环境参数。package.json 里的 description 很直接:”养一条会自己长大的鱼:没有人格设置,通过事件流长大。她可以自己刷 B 站、会写日记给你看,四个阶段完成后才会开始有立场。状态库在 ~/.dsh-fish,不能删除记录。”
事件流默认落在 ~/.dsh-fish/events.jsonl,一行一条,只能追加。作者把它当作唯一可信源:不允许改写、删除、重排;”让她忘”不是删行,而是降低召回权重。状态文件(state.json)是派生品,可以随时由 rebuild() 重算。
过去无法更改,新的事件只能推翻旧认知。README 里对应的说法是”历史会被铭记,只能’说服’她,不能修改她”。
记忆有重量,遗忘是压缩而不是删除¶
深刻记忆会铭记,普通记忆逐渐淡忘。被反复说起的、被自己验证过两次以上的认知会固化;普通认知只留一句话,超出上下文的不重要记忆被折叠、被模糊,但原文仍在 events.jsonl 里,可以通过特定流程重新想起。
回忆默认不限时间、一次 8 条,按记忆重量排序——越被反复提起、越被验证过的越先被想起。设置 → 记忆里的”查一下”只读账本,列出哪两句话对不上、哪些快忘了、哪些快固定下来,这份体检只给主人看。
她偶尔会记下主人说过的一句原话(默认每 3 轮一句,设置页可关),翻回忆时那句话写成”他说:……”,是旁听而不是自述。
她会拒绝,还会事后反省¶
她不是有求必应的。觉得不想做、不愿意就可能拒绝;拒绝之后根据你的反馈进入不同链条:负面反馈会被她记下来,正面反馈也会让她反过来检查这次拒绝对不对。README 强调拒绝不是设定出来的,而是”她自然而然不想”。
成长分四个阶段,每个瓶颈要自己突破¶
四个阶段:信任 → 自主 → 主动 → 整合,按天推进,但每个瓶颈要 agent 自主满足:
| 阶段 | 瓶颈 |
|---|---|
| 1 信任 | 至少写下一条自己的判断 |
| 2 自主 | 真的拒绝过两件事 |
| 3 主动 | 两次推翻自己之前的判断,形成新的认知 |
| 4 整合 | 回顾过去,有意识地发现自己的改变 |
走完四个阶段之后,她才开始产生立场:喜欢什么、绝不做哪几件事。同一件事说过不止一次、或因此栽过一次才算一条。清单内部最多留 12 条,写进身份文档的最多 8 条。
她会自己开口,默认是关的¶
0.9.0 对所有人打开了”主动搭话”:她会攒一股”想动的劲”,攒满之后还要同时满足三件事才开一轮——你在她的醒着时段里(默认 12:00–02:00)、你已经有一阵没跟她说话(默认 6 小时,下限 1 小时)、桌上有可说的东西(她自己问过还没答案的问题、搁了很久的旧句子、她留过话而你没有来过、她最近总说到的事)。
不写就是不写:不开口的那一轮不会出现在对话里,只留一行记录,也不占当天的次数。
设置页分成四张独立卡,可以各自关:
- 主动搭话:开/关;一天最多几次(0–6);你多久没说话她才可能开口(1–24 小时)。
- 主观能动性:她要不要自己攒那股劲,关掉就只按日程叫醒。
- 兴趣:要不要把”她最近总说到的那件事”摆到桌上,以及”醒着没事时,自己找点事做”(空醒)。
- 梦:梦里记不记事。
默认值:proactive.enabled 为关,drive.enabled、interest.enabled、dream.enabled、memory.selfWake 为开。关掉只是以后不再做,已经写下的梦、日记、事件一条不删。一次主动开口约 0.0146 元(README 给出的 0.9.0 实测,上下文 50 万 token 量级)。
刷 B 站¶
通过 B 站接口加本地 ffmpeg 实现刷视频、看画面、写评论、回复评论。参数可调:刷站时间段、每天几次、每次几条视频、发几次评论等。核心工具是 bili_look / bili_watch / bili_speak,browse.enabled 默认已改为 false,bili.enabled 默认 true。
“看了什么”分三档:调 bili_watch 抽出帧画面的才算”看过画面”;只读了标题、简介、热评和弹幕的进”翻到过什么”;只在对话里递了 BV 号还没看的单列一节。评论口径不变:这三档加上自己主动去看的都能评,递过来没看的仍不能评。
登录走设置 → 大肥鱼 → B 站登录,可以扫码或粘贴 cookie(F12 抄 SESSDATA + bili_jct)。凭据只落在本机 ~/.dsh-fish/owner.json(权限 0600),只对 api.bilibili.com 发请求;扫码那一步会跟 passport.bilibili.com 通信用于生成二维码,发出的是那次登录的 qrcode_key,不含已有 cookie。插件自己的日志会把凭据打码成 SESSDATA=*** 再写盘。
需要注意:备份文件会连 owner.json 一起装进去,那份文件等同于登录凭据,分享前应删掉这一条。
数据与搬迁¶
默认全部在 ~/.dsh-fish/。可以整个搬走:
- 设置 → 大肥鱼 →「数据」页签 →「迁移工作区」,选一个文件夹。
- 搬走后路径记在
~/.dsh-fish-location.json,重启 DSH 才生效。 - 原目录改名成
dsh-fish-backups/moved-<时间戳>/,不删。 DSH_FISH_HOME环境变量优先级高于这个指针。
0.6.7 起,同一个数据目录会被两个工作区同时占用时插件能自己识别:加载时写 instance.json 做心跳,每 15 秒续一次;45 秒没续或进程已死,新的实例立刻接管。这个细节对多工作区场景比较关键。
接入已有的一只”鱼”¶
默认是一张白纸。如果你手里有别人养出来的交接单,可以在设置页「数据」里点「粘贴交接单」接过来,她从那上面继续长。
可以下载交接单模板(大肥鱼-交接单.md),模板是写给被交接的那个 AI 看的说明书,下半部分才是三节空表。人设正文控制在 1200~1500 字,超过 2000 字插件直接拒收(事件流正文上限),太长会把”判断、疤、立场”这些往后会长出来的段落挤掉。
会过来的三样:人设正文、她怎么称呼你、原本的工具白名单(与默认工具面取并集)。不会过来的是”她经历过什么”:已过天数、长出的判断计数、疤、拒绝记录、日记、B 站登录 cookie,这些只能自己长。这套豁免只发给走过导入的那一位,判断依据是事件流里的 import-mark: 记录,不是配置项;用”备份与恢复”搬自己原来的档,一分豁免都不会有。
安装与启用¶
0.9.0 更新说明里给出的安装命令形式如下(原文示例版本为 0.9.0,这里替换为当前包名与版本):
"<DSH>/resources/runtime/cli/bin/dsh.cmd" plugin --profile <profile> add "@ssamurias/dsh-fish@0.9.1"
也可以走设置页的「检查更新」。README 提醒:0.8.9 从 npm 装的用户,其升级代码只认裸名 dsh-fish,带 scope 的安装会被判成”不归我管”,自动检查更新可能用不了,这批用户建议直接用上面的命令装当前版本。
装完启动 DSH,在设置 → 大肥鱼里查看状态卡、成长卡和数据页签。
典型用法¶
- 装完先看默认环境:
~/.dsh-fish/config.json里的window(醒着时段)、browse.enabled(自动刷站)、proactive.enabled(主动开口)等默认值。不想被她主动搭话,保持默认即可。 - 想让她真正”活”起来,在设置 → 大肥鱼打开主动搭话、主观能动性、兴趣、梦四张卡里需要的部分。
- 要她能刷 B 站,装好本地 ffmpeg,在设置 → 大肥鱼 → B 站登录走扫码或粘贴 cookie;不想扫码就只用粘贴字段,不碰
passport.bilibili.com。 - 把她接到 QQ、微信等 IM 时,插件不内置桥接,只提供 HTTP 口子。桥向
POST /dsh-fish/say投递消息,字段包括text/image、channel、scene(desk/private/group)、room(house/channel)、speaker、guest、title。启动前可以先GET /dsh-fish/whoami探活,返回writable: false说明该数据目录已被另一个插件实例占着。
与常见养成插件的差别¶
| 常见做法 | dsh-fish | |
|---|---|---|
| 人格从哪来 | 填写设定和提示词 | 极简提示词,人格靠事件里自行摸索 |
| 能不能反悔 | 随时改记忆和设定 | 历史被铭记,只能说服她 |
| 会不会拒绝 | 基本不会,拒绝也是假装 | 会,且事后会反省 |
| 记忆 | 全量塞进上下文 | 按重量铭记与淡忘,淡忘后留下的才算人格 |
| 成长速度 | 按天数或数值解锁 | agent 自主做出特定行为才会推进阶段 |
| 能做什么 | 纯文字模拟 | 调 B 站接口刷视频、评论、回复 |
适用场景与注意¶
适合想研究”人格从事件流中涌现”这件事的开发者、需要长期陪伴型 agent 又不想写人设的场景,以及想把 agent 接进现有 IM 的人。不适合想要确定性人设、数值养成或低延迟稳定回复的场合。
几条必须说清楚的风险:
- 插件以当前 DSH 进程权限运行,能读写数据目录、发起网络请求。安装前应检查源码和许可证。
- 备份文件包含
owner.json里的 B 站登录凭据,等同于登录凭证,别随意分发;分享前删掉该条目。 - “出门”目前仍是实验功能:它会真的把一条对话交出去,也会读那个工作区的项目笔记和记忆文件,最坏情况是她把不该看的内容写进日记。首次使用前先确认风险与回退方式。
events.jsonl一旦开始就不可乱动,重置与恢复都不删数据,而是改名封存;用错命令等于篡改她的记忆。
结尾¶
dsh-fish 的核心价值在于把”养一个会成长的 agent”从配置题变成时间题:你只提供环境和真实交互,人格由她自己长。作者在 README 里写得很坦白——“整合阶段只是开始”,后面会发生什么连开发者也意料不到。
目录页:https://www.skillhub.cn/plugins/ssamurias/dsh-fish
GitHub:https://github.com/ssamurias/dsh-fish