🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

主动心跳 zy666946/dsh-heartbeat-inner

DeepSeek 客户端
zy6669467 天前有提交已提供中文文档扫描:含敏感能力兼容 / 相关生态

定时醒来判断要不要主动找你说话,多数时候选择沉默

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/28 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/zy666946/dsh-heartbeat-inner.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 7 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 13 处,展示前 13 条)
  • 读取本地文件
    lib/index.js:55
    return JSON.parse(readFileSync(overridePath(), 'utf8'))
  • 写入本地文件
    lib/index.js:63
    mkdirSync(path.dirname(overridePath()), { recursive: true })
  • 写入本地文件
    lib/index.js:64
    writeFileSync(overridePath(), JSON.stringify(next, null, 2))
  • 读取本地文件
    lib/index.js:92
    const parsed = JSON.parse(readFileSync(statePath(), 'utf8'))
  • 写入本地文件
    lib/index.js:100
    mkdirSync(path.dirname(statePath()), { recursive: true })
  • 写入本地文件
    lib/index.js:101
    writeFileSync(statePath(), JSON.stringify(state, null, 2))
  • 读取本地文件
    lib/index.js:197
    const parsed = JSON.parse(readFileSync(lastTurnPath(), 'utf8'))
  • 发起网络请求
    lib/index.js:314
    const response = await fetch(cfg.qqStateUrl, { signal: controller.signal })
  • 发起网络请求
    lib/index.js:342
    const response = await fetch(`${thinkUrl.replace(/ $/, '')}/think`, {
  • 执行外部命令来自配置/变量
    lib/index.js:365
    const proc = spawn(cfg.dshBin, ['--profile', cfg.profile], {
  • 写入本地文件
    lib/index.js:830
    try { writeFileSync(overridePath(), '{}') } catch {}
  • 发起网络请求
    lib/client.js:43
    return fetch(API + path, { cache: 'no-store' }).then(readJson)
  • 发起网络请求
    lib/client.js:46
    return fetch(API + path, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DSH 主动心跳插件:定时醒来,自己判断要不要主动找主人说句话(独立内心会话 + 设置页 + OneBot/QQ)

README

由 DeepSeek 最新模型翻译生成
dsh-heartbeat-inner 给 DeepSeek Harness 的一个主动心跳插件:它会定时醒来,自己判断「现在要不要主动找主人说句话」——不是机械的定时问候,而是大多数时候不发。 一句话概括:让 AI 有自己的节律,而不是只在被叫时才有反应。 它和「定时任务」有什么不一样 | | 定时任务 | dsh-heartbeat | | 触发 | 到点必发 | 到点先想,再决定发不发 | | 内容 | 模板 / 复读 | 结合「多久没聊、你上次说了什么、现在几点」现想一句 | | 克制 | 需要人工配 | 内建四道刹车,多数时候选择沉默 | | 记忆 | 无 | 内心会话持久化,上次想过什么还记得 | 真实产生的两种日志: [heartbeat] 发出去了:在呢在呢,刚把水杯放下就看到你喊我了 🐟 [heartbeat] 决定不发:他刚问完话,聊天正热着,我等着顺着那句接就行,不用再单独塞一条过去 工作方式 每 N 分钟醒来 │ ├─ 安静时段? ────────────────→ 睡回去 ├─ 距上次主动发 < 最小间隔? ──→ 睡回去 ├─ 主人刚说过话? ────────────→ 睡回去 ├─ 今天发够上限了?
展开完整文档(README 剩余 1 节)
dsh-heartbeat-inner

给 DeepSeek Harness 的一个主动心跳插件:它会定时醒来,自己判断「现在要不要主动找主人说句话」——不是机械的定时问候,而是大多数时候不发。

一句话概括:让 AI 有自己的节律,而不是只在被叫时才有反应。

它和「定时任务」有什么不一样

| | 定时任务 | dsh-heartbeat |
| 触发 | 到点必发 | 到点先想,再决定发不发 |
| 内容 | 模板 / 复读 | 结合「多久没聊、你上次说了什么、现在几点」现想一句 |
| 克制 | 需要人工配 | 内建四道刹车,多数时候选择沉默 |
| 记忆 | 无 | 内心会话持久化,上次想过什么还记得 |

真实产生的两种日志:

[heartbeat] 发出去了:在呢在呢,刚把水杯放下就看到你喊我了 🐟 [heartbeat] 决定不发:他刚问完话,聊天正热着,我等着顺着那句接就行,不用再单独塞一条过去

工作方式

每 N 分钟醒来 │ ├─ 安静时段? ────────────────→ 睡回去 ├─ 距上次主动发 < 最小间隔? ──→ 睡回去 ├─ 主人刚说过话? ────────────→ 睡回去 ├─ 今天发够上限了? ──────────→ 睡回去 │ ▼ POST 思考接口(或本地子进程)→ 模型输出 JSON │
├─ {"send": false, "reason": "…"} → 记一笔,睡回去
└─ {"send": true, "message": "…"} → 通过 OneBot 发出去

安装

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,加两行:

{
"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" # 见下节 channel: kind: onebot wsUrl: "ws://127.0.0.1:3001?access_token=你的token" targetId: "主人的QQ号"

重启 dsh,然后 设置 → 心跳 就有可视化面板了(改完点保存即时生效,不用重启)。

两种「思考」引擎

A. HTTP 引擎(推荐)

插件把 prompt 发给一个本地 HTTP 服务,由它调用模型并返回纯文本。这样可以把「想」交给一个常驻的 SDK 进程,避免每次冷启动。

如果你装了 dsh-qq,它的 127.0.0.1:3002/think 就是现成的思考接口, thinkUrl 直接指向它即可,不用再单独跑一个桥接进程 —— 两个插件共享同一个常驻 SDK 会话。

没装 dsh-qq 的话,本项目自带一个参考实现 examples/bridge-think-endpoint.mjs:它就是一个 POST /think 接口,内部复用 dsh --profile sdk 的会话。

请求
curl -X POST http://127.0.0.1:3002/think \
-H 'content-type: application/json' \
-d '{"prompt":"..."}'

响应 {"send": false, "reason": "凌晨了,别吵他"}

B. 子进程引擎(零依赖)

不配 thinkUrl 时,插件会自己 spawn 一个 dsh --profile sdk,问一句、收答案、关掉。

- 优点:不需要额外服务
- 缺点:每次多 5~10 秒冷启动;同一个 profile 不能被两个 dsh 实例同时占用,否则会卡在启动(建议给它单独的 profile,比如 hb)

dshBin: "/usr/local/bin/dsh"
profile: hb # 基于 sdk 模板初始化的独立 profile

发送渠道

目前内置 OneBot v11 正向 WebSocket(NapCat / LLOneBot / Lagrange 都支持):

channel:
kind: onebot
wsUrl: "ws://127.0.0.1:3001?access_token=xxx"
targetId: "123456789"

发送走 send_private_msg。如果要发群消息,改 lib/index.js 里 sendViaOneBot 的 action 即可(欢迎提 PR 做成配置项)。

设置页

挂进 web profile 后,设置里会出现「心跳」页:

- 状态:今天发了几条 / 下次醒来 / 上次说了什么
- 参数:上面那张表里的全部项
- 按钮:保存并生效(写盘 + 重排下一拍)、现在就想一次(绕过安静时段)

保存写入 $DSH_HOME/heartbeat/config.json,优先级高于 profile 配置,重启后保留。

对应的 HTTP 接口(同源,需登录态):

| 方法 | 路径 | 作用 |
| GET | /api/heartbeat/state | 状态 + 生效配置 |
| GET | /api/heartbeat/config | 可编辑配置 |
| POST | /api/heartbeat/config | 保存并热更新 |
| POST | /api/heartbeat/trigger | 手动想一次 |
| POST | /api/heartbeat/reset | 清空设置页覆盖值 |

环境变量

| 变量 | 作用 |
| DSH_NO_HEARTBEAT=1 | 本进程不跑心跳(给桥接等子进程用,避免抢同一个内心会话) |
| DSH_HEARTBEAT_DEBUG=1 | 打印子进程 stderr,排查用 |

状态文件

$DSH_HOME/heartbeat/state.json # 上次发送时间、今日计数、上次说的话 $DSH_HOME/heartbeat/config.json # 设置页保存的覆盖值

删掉 config.json 即回到 profile 配置。

已知限制

- 内心会话与真实聊天会话不共享记忆:它记得自己想发过什么,但不知道你在另一个渠道聊了什么
- 子进程引擎在 web 服务里实测容易卡(同 profile 锁),优先用 HTTP 引擎
- 插件被装载两次时会打印 duplicate prefix route(已加幂等保护,正常不会出现)
- 目前只有 OneBot 渠道,且只发私聊

开发

node --check lib/index.js # 服务端
node --check lib/client.js # 浏览器端(手写 bundle,只验语法)

浏览器端是手写的 __ModuleLoader__ bundle,不需要构建工具,改完重启 dsh 即可。

License

MIT
预览分享卡片长什么样 ↓zy666946/dsh-heartbeat-inner
分享 · DeepSeek Harness Hub
zy666946/dsh-heartbeat-inner

定时醒来判断要不要主动找你说话,多数时候选择沉默

这是你的仓库?认领条目

回到顶部