前言¶
在 DeepSeek Harness(DSH)里,常见做法是用户发消息、模型才响应;若希望机器人在「没人 @ 它」时也能偶尔主动说一句,很多人会想到 cron 或固定模板的定时推送。那种方式到点必发,容易打扰,内容也缺少上下文。
下面介绍社区插件 dsh-heartbeat-inner(维护者 zy666946):它按固定间隔「醒来」,先经过规则与模型共同判断,再决定要不要通过 OneBot/QQ 私聊找主人;多数周期会选择不发。插件归类为「工作流」,当前 GitHub 星标为 1,许可证 MIT,package 版本 0.2.0,要求 Node.js >= 22。
这是什么¶
dsh-heartbeat-inner 是给 DeepSeek Harness 用的主动心跳插件:定时醒来,自己判断「现在要不要主动找主人说句话」——不是机械定时问候,而是大多数时候不发。
一句话概括(来自项目自述):让 AI 有自己的节律,而不是只在被叫时才有反应。
- 目录页:https://www.skillhub.cn/plugins/zy666946/dsh-heartbeat-inner
- 源码:https://github.com/zy666946/dsh-heartbeat-inner
和「定时任务」的差别¶
| 定时任务 | dsh-heartbeat | |
|---|---|---|
| 触发 | 到点必发 | 到点先想,再决定发不发 |
| 内容 | 模板 / 复读 | 结合「多久没聊、你上次说了什么、现在几点」现想一句 |
| 克制 | 需要人工配 | 内建四道刹车,多数时候选择沉默 |
| 记忆 | 无 | 内心会话持久化,上次想过什么还记得 |
日志里会出现两类结果,例如:
[heartbeat] 发出去了:在呢在呢,刚把水杯放下就看到你喊我了
[heartbeat] 决定不发:他刚问完话,聊天正热着,我等着顺着那句接就行,不用再单独塞一条过去
核心功能与工作方式¶
调度与四道刹车¶
每 intervalMinutes 分钟醒来一次,依次检查:
- 是否处于安静时段(
quietFrom/quietTo,支持跨零点,如 23→7 表示 23:00–07:00) - 距上次主动发送是否小于
minGapMinutes - 主人是否在
userActiveMinutes内刚说过话 - 当日主动条数是否已达
dailyMax
任一条件不满足则直接睡回去;全部通过后,调用「思考」引擎,模型输出 JSON:
{"send": false, "reason": "…"}→ 记一笔,睡回去{"send": true, "message": "…"}→ 通过 OneBot 发出去
内心会话¶
插件维护独立的内心会话并持久化,记得上次想过、发过什么;与真实聊天会话不共享记忆(它不知道你在别的渠道聊了什么——README 中列为已知限制)。
思考引擎(二选一)¶
A. HTTP 引擎(推荐)
把 prompt POST 到本地 HTTP 服务,由常驻进程调模型并返回纯文本。若已安装 dsh-qq,其 127.0.0.1:3002/think 可直接作为 thinkUrl,与 QQ 插件共享同一常驻 SDK 会话。未装 dsh-qq 时,仓库提供参考实现 examples/bridge-think-endpoint.mjs(POST /think,内部复用 dsh --profile sdk)。
B. 子进程引擎(零依赖)
不配 thinkUrl 时,插件会 spawn 一次 dsh --profile sdk,问完即关;每次约多 5–10 秒冷启动,且同一 profile 不能被两个 dsh 实例同时占用(web 里实测易卡,README 建议优先 HTTP,或为心跳单独建 profile,如 hb)。
发送渠道¶
目前内置 OneBot v11 正向 WebSocket(NapCat / LLOneBot / Lagrange 等),默认 send_private_msg 私聊;群消息需改 lib/index.js 中 sendViaOneBot 的 action(项目欢迎 PR 做成配置项)。
Web 设置页与 API¶
挂进 web profile 后,设置 → 心跳 提供可视化面板:今日发送数、下次醒来、上次内容,以及全部可调参数;保存即时生效,无需重启。覆盖配置写入 $DSH_HOME/heartbeat/config.json,优先级高于 profile 里的 cordis 配置。
同源 HTTP 接口(需登录态):
| 方法 | 路径 | 作用 |
|---|---|---|
| GET | /api/heartbeat/state |
状态 + 生效配置 |
| GET | /api/heartbeat/config |
可编辑配置 |
| POST | /api/heartbeat/config |
保存并热更新 |
| POST | /api/heartbeat/trigger |
手动想一次 |
| POST | /api/heartbeat/reset |
清空设置页覆盖值 |
安装与启用¶
DSH 生态是「一切皆插件」;社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系。安装前请自行审阅源码与 MIT 许可证——插件以当前 dsh 进程权限运行。
1. 拿到源码¶
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
git clone https://github.com/zy666946/dsh-heartbeat-inner "$DSH_HOME/plugins/dsh-heartbeat"
也可将 release 中的 dsh-heartbeat-*.tgz 解压到 $DSH_HOME/plugins/dsh-heartbeat。
2. 挂进 profile¶
以 web profile 为例:
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
cd "$DSH_HOME/profiles/web"
mkdir -p node_modules
ln -sfn "$DSH_HOME/plugins/dsh-heartbeat" node_modules/dsh-heartbeat
编辑 $DSH_HOME/profiles/web/package.json,增加依赖与 bundle:
{
"dependencies": {
"dsh-heartbeat": "link:../../plugins/dsh-heartbeat"
},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"dsh-heartbeat"
]
}
}
}
3. 配置¶
在 $DSH_HOME/profiles/web/cordis.patch.yml 末尾追加:
- id: heartbeat
config:
enabled: true
intervalMinutes: 30 # 多久醒一次
quietFrom: 0 # 安静时段(支持跨零点,23→7 表示 23:00-07:00)
quietTo: 7
minGapMinutes: 120 # 两次主动消息最小间隔
userActiveMinutes: 40 # 主人刚说话后多少分钟内不打扰
dailyMax: 5 # 每天最多主动发几条
cwd: "/path/to/your/workspace"
thinkUrl: "http://127.0.0.1:3002" # HTTP 思考引擎
channel:
kind: onebot
wsUrl: "ws://127.0.0.1:3001?access_token=你的token"
targetId: "主人的QQ号"
子进程引擎时可省略 thinkUrl,并可选:
dshBin: "/usr/local/bin/dsh"
profile: hb # 基于 sdk 模板初始化的独立 profile
重启 dsh 后,在设置里打开「心跳」页即可微调。
典型用法示例¶
HTTP 思考接口¶
若自建桥接,请求形如:
curl -X POST http://127.0.0.1:3002/think \
-H 'content-type: application/json' \
-d '{"prompt":"..."}'
响应示例:
{"ok": true, "text": "{\"send\": false, \"reason\": \"凌晨了,别吵他\"}"}
OneBot 渠道¶
channel:
kind: onebot
wsUrl: "ws://127.0.0.1:3001?access_token=xxx"
targetId: "123456789"
环境变量¶
| 变量 | 作用 |
|---|---|
DSH_NO_HEARTBEAT=1 |
本进程不跑心跳(桥接等子进程用,避免抢同一内心会话) |
DSH_HEARTBEAT_DEBUG=1 |
打印子进程 stderr,排查用 |
状态文件¶
$DSH_HOME/heartbeat/state.json # 上次发送时间、今日计数、上次说的话
$DSH_HOME/heartbeat/config.json # 设置页保存的覆盖值
删除 config.json 即回到 profile 配置。
设置页还提供 「现在就想一次」,可绕过安静时段手动触发一轮思考(对应 POST /api/heartbeat/trigger)。
适用场景与注意¶
适合谁: 已在 DSH 上跑 web profile、并接好 OneBot/QQ 私聊,希望机器人在「不刷屏」的前提下偶尔主动开口的开发者或自用部署。
务必注意:
- 插件与 dsh 同进程权限,安装前检查仓库代码与 MIT 许可。
- 内心会话与主聊天不共享上下文;跨渠道聊天它感知不到。
- 子进程引擎在 web 服务中易与 profile 锁冲突,优先 HTTP + dsh-qq 或独立
hbprofile。 - 目前仅 OneBot 私聊;插件被装载两次可能打印
duplicate prefix route(项目称已做幂等保护)。 - Node 需 >= 22;peer 依赖
@deepseek-ai/cordis^4.0.1。
结尾¶
dsh-heartbeat-inner 把「定时醒来 + 模型自决 + 规则刹车 + 内心记忆」收进一个 DSH 工作流插件,并附带设置页与 OneBot 出站,适合不想用固定 cron 模板、又希望控制打扰频率的场景。