中文EN

dsh-speak-up

workflow已测通过npmSEE LICENSE IN LICENSE

让 AI 伙伴自己起个话头:按设定间隔掷一次本地骰子决定要不要往指定会话里说话,带安静时段与试运行。

下载量 / Downloads
10,914
依赖体积 / node_modules
0.2 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-speak-up

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-speak-up(主动搭话)· 让它自己先开口

给 DSH 里某个会话装一颗「会自己起话头」的心:没人在跟它说话的时候,它也有可能先开口。

定时器到点
  └─ 掷一次本地骰子(Math.random,一个 token 都不花)
       ├─ 没掷中 → 什么都不做,只留一条记录
       └─ 掷中   → 往「目标会话」送一句话 → agent.followup(message)
                    → DSH 自己开一轮:它的人格、历史、工具、记忆全都照旧

一句话:只有掷中之后的那一步才花模型,掷骰子本身是纯本地随机。


适配哪个 DSH 版本(不用操心)

这个插件跟着 DSH 一起更新:作者这边跑的就是最新版的 DSH,最新版插件永远是给最新版 DSH 写的。

所以看到「不适配 / 不支持」之类的提示,基本都是装到了旧版本 —— 升级到最新版、重启一次 DSH 就好。

真遇到新版对不上(比如 DSH 刚升级、插件还没跟上),提个 issue,作者会跟着改。

当前实测对照:插件 0.2.4 ↔ DSH 0.2.1-rc.3(2026-10-26)

装

一、在 DSH 里装(推荐)

打开 设置 → 插件 → 安装,把这一行填进去:

dsh-speak-up

或者命令行(--profile 照你平时那个写;桌面端一般是 desktop、网页端是 web):

dsh plugin --profile desktop add dsh-speak-up
也可以在 npm 上直接看到这个包(含历史版本):<https://www.npmjs.com/package/dsh-speak-up>
上面那条要是碰到网络问题(npm 抽风、或者想固定某一次的代码快照),可以改用 tarball 直链,不用 git:
dsh plugin --profile desktop add https://codeload.github.com/Yuuyuko-uu/dsh-speak-up/tar.gz/refs/heads/main

装完重启一次 DSH,然后去 设置 → 主动搭话 看一眼在不在。

⭐ 最省事的一条:把仓库链接贴给你自己的 DSH,说「帮我装这个插件」。

二、手动装(没有 dsh 命令、或者装不动的时候)

1. 把这个文件夹放到 profile 能找到的地方:

%USERPROFILE%\.dsh\profiles\<profile>\node_modules\dsh-speak-up\

2. 在 profile 的 package.json 里,把 dsh-speak-up 加进 dsh.profile.bundles 数组;

3. cordis.patch.yml 里那一行会把它插进 loader(id: speak-up);

4. 重启 DSH。

⚠️ 改 package.json 一定要存成 UTF-8 无 BOM。存成带 BOM 的话,DSH 下次启动会直接起不来,
报 Unexpected token '' … is not valid JSON(看着像插件坏了,其实只是开头多了三个看不见的字节)。
检查是哪个文件(不同装法位置不一样,别猜 —— 真正的 profile 目录里同时有 cordis.yml、cordis.patch.yml、package.json):
```powershell
Get-ChildItem C:\,D:\,E:\ -Directory -Filter profiles -Recurse -Depth 4 -ErrorAction SilentlyContinue |
ForEach-Object {
Get-ChildItem $_.FullName -Directory -ErrorAction SilentlyContinue | ForEach-Object {
$p = Join-Path $_.FullName 'package.json'
if ((Test-Path (Join-Path $_.FullName 'cordis.patch.yml')) -and (Test-Path $p)) {
$b = [System.IO.File]::ReadAllBytes($p)
$bom = ($b.Length -ge 3 -and $b[0] -eq 0xEF -and $b[1] -eq 0xBB -and $b[2] -eq 0xBF)
"{0} BOM={1}" -f $p, $bom
}
}
}
```
BOM=True 的那一行就是要修的(标准安装在 C:\Users\<你>\.dsh\profiles\<档名>\package.json)。
去掉 BOM(路径换成上面那一行):
```powershell
$p = "把上面 BOM=True 那一行的路径粘到这里"
[System.IO.File]::WriteAllText($p, [System.IO.File]::ReadAllText($p), (New-Object System.Text.UTF8Encoding($false)))
```
让 AI 帮你改时,别让它用 Set-Content -Encoding UTF8 或 Out-File -Encoding utf8
—— Windows 自带的这两个默认带 BOM。

三、开发时(想改代码、改完就想看到)

上面那个 node_modules\dsh-speak-up 做成指向你这个文件夹的目录联接(junction / 符号链接),

或者 pnpm add link:<这个文件夹的绝对路径> —— 这样改的就是装的那一份。

⚠ 本仓库自己不装、不改任何 DSH 配置、不重启任何东西:上面三步都由装的人自己做。
⚠ 改完插件代码,只重启 DSH 才一定生效(关掉插件再打开、重装都不一定重新读代码)。

更新到最新版

最省事:把这个仓库的地址丢给你自己的 DSH,说「帮我更新这个插件」。装完重启一次 DSH。

也可以点 设置 → 主动搭话 最上面的「检查更新」 —— 有新版会提示,还能一键复制更新命令。

命令行(--profile 照你平时那个写,桌面端一般 desktop、网页端 web):

dsh plugin --profile desktop remove dsh-speak-up
dsh plugin --profile desktop add dsh-speak-up
⚠️ 必须先卸再装:直接装可能拿到缓存里的旧副本,装完还是老的。
⚠️ 装完重启一次 DSH才会用新代码。

我的设置会不会丢?

不会。 设置存在 DSH 家目录(%USERPROFILE%\.dsh\)里,不在插件代码里;卸载只删代码:

.dsh\speak-up-config.json

所以卸载 → 重装,设置、搭话记录 都还在。

三件小事提醒:

  • 别用「重装 DSH」来更新插件 —— 那是两件事,重装可能动到 profile。
  • 新版本新加的设置项会用默认值(以前没这一项),想要自己的值就再填一次。
  • 设置项改名或换单位时,旧值会按规则自动换算,不用你管。

怎么用

设置页(设置 → 主动搭话)里从上到下:

项 · 默认 · 说明

总开关 · 开 · 关掉就完全不动

试运行 · 开 · 开着时掷中了也只记账、不真发

掷骰子间隔(分钟) · 30 · 1~1440;改完保存,下一轮就按新间隔走,不用重启

搭话冷却(分钟) · 20 · 它真的说了话之后,这么多分钟内不再开口;只是把念头投进去、它没开口不算;0 = 不冷却。手动按钮不受它限制

没中加成(百分点) · 10 · 每没掷中一次,下一次命中线加这么多;0 = 关掉这个功能

加成上限(百分点) · 40 · 加成最多加到这么多

安静时段起/止(小时) · 1 / 8 · 含起不含止;跨午夜也行(23~7);起 === 止 = 不启用(设置页里单独一行红字写着)

近:刚聊过 → 命中线 ×0.15 · 20 分钟 · 距它上次说话不到 20 分钟 → 命中线乘 0.15(更难开口)

远:冷太久 → 命中线 ×1.5 · 360 分钟 · 超过 6 小时没说话 → 命中线乘 1.5(更容易开口);中间那段 ×1

峰时命中线(%) · 20 · 峰时(贵)→ 少开口。峰谷时段是固定的,不用填

谷时命中线(%) · 60 · 谷时(便宜)→ 多开口

目标会话 · 空 · 勾选清单(可勾多个);勾一下立刻自动保存,不用再按保存

触发文案 · 见下 · 用它自己的口吻写(这是它的动机,不是系统提示)

角色 · user · 见下面「做不到的地方」—— developer 目前送不了,本插件会拒发

峰谷时段写死在代码里,不给设置项(就一条规则):

峰时(贵):周一~周五  09:00–12:00 和 14:00–18:00
谷时(便宜,价钱是峰时的一半):其余全部
         —— 含 12:00–14:00 午休、18:00~次日 09:00、周六周日全天

(判断用这台机器的本地时区;它这台就是北京时间。周末直接算谷时。)

一句话记住这个数怎么来的(骰子 掷到命中线以下才开口):

命中线 = min(100, 峰时/谷时命中线 × 时机因子(刚聊过 0.15 / 冷太久 1.5 / 中间 1)
                       + min(加成上限, 连着没中几次 × 没中加成))
  • 「两格命中线填成一样」= 不分峰谷,全天一个命中线。
  • 掷中(含试运行掷中)就把「连着没中」清零,回到一开始;没掷中就一次次往上加,加到上限为止。
  • ⚠ 「连着没中」这个数只记在内存里:DSH 一重启就回到 0。
  • ⚠ 这两格(没中加成 / 加成上限)只影响自动的定时掷骰;手动按钮(演练 / 真发)不掷骰子,也不动这个计数器。

⚠ 安静时段会盖住谷时:安静时段内根本不掷,谷时命中线再高也用不上。

默认安静时段是 1~8 点、默认谷时里有 18:00~次日 9:00 —— 想让谷时那半便宜时段真的用上,

得把安静时段改小(或让起 === 止关掉它)。

触发文案的默认值是中性的(「好久没人跟我说话了,我该主动去打个招呼」)。在设置页那一格里改成你自己的口吻就行,

不用动代码 —— 这一句是「它的动机」,不是系统提示,写得越像它自己越好。

默认值只在 lib/host.js 的 默认配置 里写了一份。

配置文件落在 %USERPROFILE%\.dsh\speak-up-config.json(不是 DSH 的 config,本插件自己一份)。

⚠ 改名(dsh-her-words → dsh-speak-up)之前的 her-words-config.json 还会被兜底读一次,设置不丢。

怎么安全地试(建议按这个顺序)

1. 装好、重启,打开 设置 → 主动搭话,确认「最近记录」里有那条启动日志:

已装好 v0.1.0:……现在命中线 20.0 = 峰时命中线 20% × 时机因子 1(刚起来…)|没中加成 +10/次,最多 +40|搭话冷却 20 分钟|……。

没有这条说明宿主半边没起来,先别往下走。

2. 在「目标会话」的清单里 勾上要说话的那个会话(点一下就生效,不用再按保存)。

3. 点 「演练一次(绝不真发)」:它不掷骰子、直接走一遍「本来要发什么」。不会真发。

4. 让它自己按 30 分钟跑几轮,看记录里的命中线是不是你想要的节奏。每条都写成

掷出 X(命中线 Y —— 掷到 Y 以下就开口)|Y = 这一档命中线 × 时机因子(距上次说话 …),

没中还会告诉你「下次命中线变多少(没中加成 +10)」。觉得太频繁就调小命中线 / 拉长间隔。

5. 时机满意了,关掉「试运行」。之后只有掷中才会真发。

6. 想当场验证「真发到底能不能跑通」:点 「真发一次(跳过等待)」,然后去目标会话里看

有没有多出一轮,以及它是不是照自己的口吻开了话头。

随时可以再打开「试运行」让它安静下来。「总开关」关掉则连记录都不再走。

⚠ 改数字 / 触发文案 / 开关 / 角色之后要点「保存设置」——页面顶上会显示
「⚠ 上面有改动还没保存」提醒你。只有「目标会话」的勾选是一点就自动保存的。
💡 有改动的时候,底下会自动浮出一条「⚠ 有改动还没保存 + 保存设置」的条,
不用再滚到页面最下面去找那个按钮;保存完它自己就收起来了。

自测(不装插件也能跑)

两个冒烟测试不碰 DSH、不碰会话(`DS

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:5,最后更新 2026-11-05

链接

GitHub · Homepage · npm

同类插件