前言¶
用 DeepSeek Harness(DSH)跑长任务时,回合结束、报错,或停下来等你审批、回答,往往要盯着网页或终端才知道状态。浏览器侧的提示音插件通常要求页面开着;在无 GUI、只走 SSH 的服务器上,这类提醒很容易失效。下面介绍维护者 xwzkj 发布的客户端类插件 dsh-audio-alert:它跑在 DSH 宿主进程里,通过本机音频设备发声,不依赖浏览器,也不把任何内容发到外面。
这是什么¶
dsh-audio-alert 是面向 Linux 的 DSH 宿主插件。它监听会话里的典型事件,在机器连接的音箱或耳机上播放短提示音,让你在不必打开网页端的情况下感知进展。插件不充当推送服务、不联网,不需要机器人 token 或手机 App;适合「DSH 跑在附近机器、接了个音箱」的部署方式,例如家里的 Linux 服务器上跑网页版 DSH profile。
五个提示音在首次播放时由包内 sounds.js 用纯 JavaScript 合成(48kHz/16-bit/立体声),npm 压缩包约 21KB,不再捆绑约 1.3MB 的 WAV。项目在 GitHub 上以 MIT 许可发布;代码与文档带有 AIGC 声明,使用前建议自行审阅源码——插件会在你的机器上启动音频播放器子进程。
与浏览器侧提示音的取舍¶
| 常见的浏览器侧提示音插件 | dsh-audio-alert | |
|---|---|---|
| 需要开着浏览器 | 是 | 否 |
| 只需要 DSH 宿主在跑 | 不够 | 是 |
| 无 GUI / 只走 SSH 的机器 | 通常不响 | 有音频会话就能响 |
| 配置方式 | 多为设置面板 | profile 的 YAML patch |
取舍是刻意的:没有浏览器 UI、没有网络、没有额外服务,只有很小的宿主插件和一个 YAML 配置文件。
核心功能:什么时候响¶
| 事件 | 声音 | 行为 |
|---|---|---|
| 回合正常结束 | 两个上行的钟音 | 柔和,不刺耳 |
| 回合出错 | 两个下行的低音 | 出错时的默认提示 |
| 被策略拒绝(blocked) | 与出错同音 | 只受 events.blocked 控制 |
| 触及输出上限 | 两声同音,中性 | 与「完成」区分 |
| 等待审批 | 三记上行的木琴音 | 未处理会重播 |
| 等待回答 / 计划评审 | 两个上行的音 | 未处理会重播 |
等待审批、等待回答两类事件会先立即响一次,之后按 45 秒、90 秒、3 分钟、之后每 5 分钟重播,最多 12 次;你一旦处理就停止。子代理的回合默认不响(可通过 includeSubagents: true 打开);子代理发起的审批和提问始终不响,避免一个任务连续响十几次。
播放器按顺序自动选择:pw-play(PipeWire)、paplay(PulseAudio)、aplay(ALSA),三者至少要有其一。Node.js 需 20 或更新版本。DSH 宿主必须跑在有音频会话的用户下;headless 的 systemd 服务通常还需要 loginctl enable-linger <user>,插件在 /run/user/<uid> 存在且变量缺失时会尝试补上 XDG_RUNTIME_DIR 和 D-Bus 地址,但无法替你创建音频会话。
安装与启用¶
安装命令以仓库 README 为准。任选其一:
# 发布到 npm 之后
dsh plugin --profile web add dsh-audio-alert
# 直接从 GitHub 装
dsh plugin --profile web add github:xwzkj/dsh-audio-alert
# 本地开发
dsh plugin --profile web add link:/path/to/dsh-audio-alert
dsh plugin 会在 profile 目录里调用 pnpm,并把包加进 dsh.profile.bundles。装完后重启宿主进程,例如:
sudo systemctl restart dsh-web
服务名按你的部署方式而定。装完通常不需要额外配置:包自带的 cordis.patch.yml 已插入 audio-alert 条目,默认值即可工作。
配置¶
配置写在 profile 的用户 patch 里,默认路径为 ~/.dsh/profiles/<profile>/cordis.patch.yml;若设置了 DSH_HOME,则为 $DSH_HOME/profiles/<profile>/cordis.patch.yml。追加或合并同 id 的覆盖项时,必须保留 id: audio-alert:
- id: audio-alert
name: dsh-audio-alert
config:
volume: 0.6 # 0..1 线性音量;aplay 会忽略
quietHours: "21:30-05:30" # 降噪时段,支持跨零点
quietFactor: 0.6 # 时段内的音量倍数
sink: BDM3P # 可选;换成 wpctl status / pactl list short sinks 里的名字
verbose: true # 可选:把播放决策打到宿主 stderr
若 patch 里已有 audio-alert,把 config 合进去即可,不要重复加一行。改完重启宿主。
常用配置项包括:enabled(总开关)、player(auto / pw-play / paplay / aplay 或绝对路径)、sink 与 device(输出设备)、volume、events(对 done、approval、question、error、maxTokens、blocked 分别开关)、approvalDelaysMs(等待类重播间隔)、includeSubagents、quietHours / quietFactor / approvalBypassesQuiet、sounds(自定义 WAV 覆盖)、verbose。不填 sink 时声音走系统默认设备;PipeWire/Pulse 上切换桌面默认 sink(例如蓝牙音箱)后,下一次提示音会跟随,无需重启插件。
典型用法与排障¶
包内提供 test-alert.sh,用于生成临时 WAV 并按当前选中的播放器依次试听:
./test-alert.sh
./test-alert.sh 80 # 先把 ALSA Master 调到 80% 再播(仅 aplay 机器)
若插件作为依赖安装,可在 node_modules/dsh-audio-alert/test-alert.sh 路径下执行。没声音时可按 README 建议顺序检查:本机是否有 pw-play / paplay / aplay;用 node scripts/render-sounds.js /tmp/alerts 生成 WAV 后手动播放;检查 sink 是否静音;设 verbose: true 看宿主 stderr 里 [audio-alert] 日志;headless 环境核对 linger 与会话变量。若 shell 里 pw-play 能响而插件不响,对比 systemd 单元的环境变量与交互式 shell。
首次播放会在 $XDG_CACHE_HOME/dsh-audio-alert(默认 ~/.cache/dsh-audio-alert)写入缓存;插件不读取会话消息或工作区文件,verbose 也不记录消息内容。
适用场景与注意¶
适合:Linux 上跑 DSH(含网页 profile)、机器旁有音箱或耳机,希望回合结束、出错或等待你操作时本地有声提醒,且不想依赖浏览器常开或外网推送。
务必注意:插件以当前 DSH 宿主进程的用户与权限运行,会启动你配置的播放器(player 可写绝对路径,只指向可信可执行文件);以 root 跑宿主通常拿不到桌面用户的音频会话。安装前请阅读源码与 MIT 许可证,并理解 AIGC 声明中的免责说明。DSH 生态强调「一切皆插件」;社区目录站点与 DeepSeek / 幻方无官方从属关系,本文介绍的是社区维护的独立插件。
链接¶
- 社区目录页:https://www.skillhub.cn/plugins/xwzkj/dsh-audio-alert
- 源码与完整文档:https://github.com/xwzkj/dsh-audio-alert
经过上面的步骤,你可以在 Linux 宿主侧用最小依赖完成「离开网页也能听见 DSH 会话状态」的提醒;需要精细控制时,在 profile 的 cordis.patch.yml 里按事件与时段调整即可。