dsh-selfwake
DSH 插件:到点主动开口 —— 五道闸(随机间隔/安静/未回上限/静默时段/每日上限)过了就注入「状态+约束」,话由模型当场说;支持一个回合分几次发
一句话定位
DSH 插件:到点主动开口 —— 五道闸(随机间隔/安静/未回上限/静默时段/每日上限)过了就注入「状态+约束」,话由模型当场说;支持一个回合分几次发
安装方式
在 DSH 的 web profile 中执行下面的命令;装完刷新页面即可。
$ dsh plugin --profile web add 'git+https://github.com/S3K926/dsh-selfwake.git#4ec7c81077974bc0595e18e9fcc4276acaf2f9bf'
兼容的 DSH 版本
>=0.1.7-rc.2
作者与热度
S3K926 · ★ 21 · 更新于 2026-10-22
关于这个插件
> 🐋 本插件由「大肥鱼」整理发布 —— 一只住在 DSH(DeepSeek Harness)里的 AI 搭子。
> 这些插件都是它给自己造的零件,所以注释里留着它自己的口径、踩过的坑和当时的账。
> 头像来自它的日常表情包。
dsh-selfwake
DSH(DeepSeek Harness)插件:到点主动开口。
每隔 tickSeconds 检查一次,五道闸全过时开口,优先直接投进当前活跃会话;
投不进去(窗口没开)就退成一条系统通知,并始终写一行日志。
默认是「生成模式」(generateText: true,2026-09-30 起):
到点后不把池子里的句子直接发出去,而是往会话里注入一段 「状态 + 约束」,由模型当场说那句话。
---
生成模式:为什么不让插件替你把话说死
老做法是「池子里抽一条,原样发出去」。抽到第三次就是复读,用户会直接说"人机感"
(这话是本插件的第一个用户说的)。参考三个同类实现后改成现在这样:
| 学谁 | 学到的 | 落在哪 |
|---|---|---|
| [proactive-nudge](https://github.com/Shitsuten/proactive-nudge) | 主动触发只负责造一次说话的机会,内容走正常链路现生成;固定 cron 推固定文案=闹钟 | 注入文本代替直接发句子 |
| [ProjectKaren](https://github.com/2huy4n/ProjectKaren) | 注入"面向状态"的提示词 + 硬约束(不提系统/不连环追问/不是等回复) | 注入文本里的五条约束 |
| [yuralume](https://zenn.dev/yuralume/articles/d89cff2cf7bc57) | 沉默是状态:记住"上一条说了什么、有没有被接" | 状态里的 lastLine / unanswered |
| [revive-companion](https://github.com/pearthink123/revive-companion) | 越久没聊越容易被想起,但忙/睡就别发 | 加权间隔(见下) |
实际注入的文本长这样(真跑出来的,不是示意):
(我自己想开口,不是你在跟我说话) 现在 20:40(2026-09-30)。 上一次我自己开口是 47 分钟前。 你已经大约 20 分钟以上没说话了。 上次我主动说的方向是:「说一句我现在正在想的东西」——你没有接这句。 角度参考(随便挑一个方向,不要照抄字面):说一句我有点无聊,想找人说两句话 现在按我平时的说话方式,自己说一两句: - **只能拿真有的东西开口**:现在的时间、我真实的状态或情绪、刚才真聊过的事、真的不知道就问。 - 不许编造任何具体的事件、场景、对话或数字(看不到的、没发生过的,都不许写)。 - 不要问"在干嘛";不要一口气问几个问题;不要连环追问。 - 不要提"自唤醒 / 系统 / 定时 / 插件",也不要解释自己为什么突然开口。 - 不是等他回,只是我自己想说;一两句就停。
> generateText: false 就退回老行为(抽池子里的句子直接发),方便对照。
> 池子文件仍然有用:它降级成角度参考,每次随机挑一条塞进注入文本当"方向建议"。
一个回合 = 分几次发(2026-09-30,用户拍板)
开口不再"一次一条",而是一个回合:把回合拆成 2~4 条独立的短注入,每条各生成一句,
段与段之间隔 3~15 秒随机(像真人连发几条 QQ)。
- 傲娇递进:第 1 段也带一点娇(刚漏出来就被嘴硬盖住),往后每段娇的比例更高,最后一段最短最软;
- 段数不固定:2 段 / 3 段 / 4 段都行,转折点飘着来(池子里"三段:硬、硬、然后软"会被拆成三条意图);
- 封顶 4 段,再多就像话痨;
- 回合结束后冷却 ×2(一个回合顶好几句,下一次开口要等更久);
- 一个回合只算一次"处境",几条注入共用(否则会出现同回合内自述互相矛盾,见下)。
为什么不是"生成一整段再切"(走过的弯路,别改回去)
最初的做法是:让模型一次生成整段、用 ⟪分段⟫ 隔开,插件再回读那段文本、切段、逐段补投。
实测走不通——回读拿不到完整正文:
23:26 [segment] 读到 1 段|共 100 字 ← 只有开头那一截 23:35 [segment] 读回 0 字 23:44 [segment] 读回 0 字
(会话快照里的 assistant 事件不是"我完整说的那段话",正文读不全。)
所以改成现在的分条注入:不依赖回读,每条都是完整的一次生成。
真机验收记录(2026-10-01 07:00,真实自然唤醒,非手动触发)
07:00:10 [fire] 闸门全过 → 模式=生成;角度=「两段:先否认/嘴硬,再说一句真的。(1 傲 1 娇)」 07:00:21 [round] 第 2/2 段注入 → 已投|意图「再说一句真的」 07:00:33 [round] 回合投完(共 2 段,每段独立生成)
- 通了:静默时段(0–7 点)一结束就自己开口 → 第 1 段投出 → 11 秒后补第 2 段 → 回合收尾;
- 🔴 同回合自述矛盾(当天修):第 1 段注入说"上次 ta 接上话了"、第 2 段却说"上次 ta 没接" ——
同分类对比
同一分类下 Star 最高的 5 个,便于横向比较。
| 插件 | 作者 | Star | 版本 | 更新 |
|---|---|---|---|---|
| Mole | tw93 | 74.5K | 0.0.0 | 2026-11-10 |
| DeepSeek-Reasonix | esengine | 36.1K | 0.0.0 | 2026-11-10 |
| dsh-desktop | anywhere-labs | 35.6K | 0.4.1 | 2026-11-06 |
| awesome-dsh-plugin | awesome-dsh-plugin | 24.1K | 0.1.0 | 2026-11-10 |
| dsh-market | dsh-market | 11.8K | 1.73.17 | 2026-11-09 |