Cura,拉丁语的"照看、照料"。这个插件做的事:给你的 DeepSeek Harness QQ Bot 注入灵魂——人格、说话规则、语料、记忆,也会照看你的作息与身体节奏。
dsh-cura 是 DeepSeek Harness(DSH)的伴生增强插件:它不接管消息流(那是 dsh-onebot-qq 的职责),而是"贴"在 dsh-onebot 为每个 QQ 聊天创建的 Agent 会话上,注入拟人化能力。
QQ ⇄ NapCat ⇄ dsh-onebot-qq(消息流 + STT + qq_* 工具,原样保留)
▲
│ 贴附(agents.get → systemPrompt.section)
dsh-cura(本插件):回复规则 / 人设 / 语料 / 健康与周期关怀
│
├─ ctx.llm.stream(模型随 DSH 设置走,如 xdpool)
├─ 管家工具:外部 MCP(瑞幸/高德…)挂进本会话(lib/butler.js)
└─ 托管 Python 语音通话引擎(可选,见下)
| 功能 | 状态 | 说明 |
|---|---|---|
| 回复规则注入 | ✅ | 把"像真人发 QQ 消息"的硬规则注入 QQ 会话的 system prompt(order 96,末位最大权重);设置页/patch 改完自动重注册,下一条消息即生效 |
| 人设补充注入 | ✅ | chatPersona 文本随规则一同注入 |
| 语料库 | ✅ 基础版 | corpus/ 目录的 txt/jsonl 作为"说话风格示例"轮换注入 |
| 情境表达规则库 | ✅ | MaiBot 式"情境→表达"规则:全局说话方式+反面清单进 system prompt 段,情境规则每轮按最近用户消息检索注入(systemPrompt.context,官方动态上下文);规则库 rules.json 人工可编辑、改完即生效,无需重启 |
| 规则库管理面板(DSH 内) | ✅ | DSH 左侧侧边栏新增 "Cura" 入口(内含「表达规则 / 语音通话 / 健康日志 / 周期关怀」四页)(sidebar.panellist + main keyed slot,浏览器半侧 lib/client.js):增删改查、启用/停用、手动学习、导出 JSON;数据走 Typert Remote(curaRules 命名空间,宿主行 lib/rules-remote.js,独立 patch 行),不依赖任何独立本地服务 |
| 规则自动学习 | ✅ | 定时(默认 6h)从对话事件流抽取新规则:LLM 抽取 → 本地去重审查(情境 bigram 相似 + 关键词重合)→ 入库;首跑只建游标不学习,库满自动停;学习引擎在 rules-remote 行(单一写方),面板可手动触发 |
| 健康日志(男女通用) | ✅ | 面板「健康日志」页手动记,或在 QQ 聊天里说(agent 的 health_log 工具自动抽取记录:睡眠/运动/情绪/备注);近 7 天汇总 + 关注目标每轮注入会话,Cura 会顺势劝早睡/夸坚持。数据只存本机 health.json(gitignored) |
| 周期关怀(可选,默认关) | ✅ | 健康模块的子功能:面板「周期关怀」页开启后,按末次月经+周期长度估算四阶段(月经/卵泡/排卵/黄体),今日阶段+相处建议每轮注入会话——经期多照顾、卵泡期推学习、排卵期排表达类任务、经前别硬催;阶段建议可在面板改。数据只存本机 health.json,生活方式参考而非医疗建议 |
| 管家工具(butler) | ✅ | 把外部 MCP server(瑞幸下单、高德地图、天气……)挂进 QQ 会话,Agent 能在现实里照顾人而不只是虚拟关怀。只挂本会话、不与 DSH 设置/ds-bot 的连接管理冲突(见下方组件说明);server 清单在 Config butlerServers 配,默认空 = 关 |
| 语音合成助手 | ✅ | say.ps1:edge-tts(自然,云)失败自动换 Windows 离线 SAPI(稳定,本地)。agent 用 shell 调它生成音频,再用 qq_send_voice(dsh-onebot 自带)发送——职责不重叠 |
| STT 包装器 | ✅ | stt-whisper.py:faster-whisper 包装,适配 dsh-onebot 的 custom STT 引擎({file}/{out} 模板) |
| 语音通话引擎托管 | 托管一个 Python 通话引擎(自动接听/对话/挂断,基于 KoishiRTC 系桥)。QQ 通话里"对方声音回放路由"在 Windows 上暂无可靠解(上游待验证),代码完整保留,随时可复活 |
需要已装好 dsh-onebot-qq、Node.js ≥ 20,并有一条能用的 QQ 通道。
- 进 DSH profile 目录装(默认 profile 一般是
~/.dsh/profiles/desktop,装了多个 profile 时就选你用的那个):cd <DSH profile 目录> npm install dsh-cura
- 编辑同目录的
package.json,把插件登记进 bundles(dependencies那行 npm 已经写好了): - 重启 DSH。插件设置页里填机器相关项(见「配置」)。
包的默认路径(rules.json / health.json / voice.json / corpus/ / say.ps1 / stt-whisper.py)全部按插件包根目录推导,装在哪个盘都不用改;要挪到别处(比如放自己的数据盘)在 profile 层覆盖即可。
- 把仓库克隆到固定位置:
git clone https://github.com/slow-stack/dsh-cura.git <你的目录>
- 在 DSH profile 的
node_modules里建 junction(以默认 profile 为例):cmd /c mklink /J "<DSH profile 目录>\node_modules\dsh-cura" "<你的目录>"
- 编辑
<DSH profile 目录>\package.json,两处登记:"dependencies": { "dsh-cura": "link:<你的目录>" }, "dsh": { "profile": { "bundles": [ "dsh-cura" /* 追加到数组 */ ] } }
- 重启 DSH。
⚠️ 踩坑提示(都是实测踩过的):bundle 层cordis.patch.yml必须是- insert:操作方言;插件package.json必须带"dsh": {"bundle": {"patch": "./cordis.patch.yml"}}元数据,否则加载器静默跳过;只放 node_modules 不登记 bundles 不会加载。
机器相关的值(引擎路径、目标 QQ 号)不要写进本仓库——在 profile 层的 cordis.patch.yml 按 id 覆盖:
- id: dsh-cura
name: dsh-cura
config:
targetUser: '你的QQ号' # 会话 onebot-private-<QQ号>
enginePython: <你的 python.exe> # 可选,留空则用 CURA_PYTHON 或 PATH 里的 python
engineDir: <插件目录>\engine # 可选(托管通话引擎时用,引擎随包在 engine/)其余字段(回复规则、人设、语料目录、场景、语音条模式)都在 Config schema 里,重启后在 DSH 插件设置页可视化修改;也可以直接改本仓库的 cordis.patch.yml 默认值。
QQ 语音通话与 DSH 内语音对话的 Python 侧:采集(sounddevice,WDM-KS 优先)→ VAD/断句 → faster-whisper ASR → 大脑(8765 或 DSH)→ TTS → 播放,含打断(barge-in)。
之前它散在工作区里、不是 git 仓库,现在整目录收进本仓库,只有源码与维护中的测试入库:
engine.py:主程序,dsh-chat子命令给 DSH 内语音用,无子命令时轮询 QQ 通话桥 6110.scratch/t_*.py:维护中的六套测试(session / reply / drain / threshold / polling / cal)config.json、engine.log、探针产物与.scratch下的探索脚本都不入库(含 QQ 号或本机路径)
跑测试(Windows,需要装了依赖的 Python 环境和系统 PATH——只给 conda 路径的话 soundcard 会找不到 ole32):
PYTHONPATH=<你的目录>/engine <你的 python.exe> engine/.scratch/t_session.py测试脚本随源码仓库分发,不打进 npm 包(
package.json的files只收录运行所需文件)。
让 QQ 会话里的 Agent 调用外部 MCP server,把"照顾"落进现实:点咖啡(自部署的瑞幸 MCP)、查地点/路线/天气(高德 amap MCP)、黄历、待办……社区 server 在 GitHub 上找(搜 mcp server + 场景名)。
配置(机器相关项请写在 profile 层 patch):
// dsh-cura 的 Config.butlerServers(JSON 数组;默认 [] = 关)
[
{ "serverName": "luckin", "transport": "streamable-http", "url": "http://你的云服务器:3000/mcp",
"headers": { "Authorization": "Bearer xxx" } },
{ "serverName": "amap", "transport": "stdio", "command": "npx",
"args": ["-y", "@amap/amap-maps-mcp-server"], "env": { "AMAP_MAPS_API_KEY": "你的key" } }
]与生态的冲突处理(为什么不另做一套"连接管理"):
- DSH 核心自带 MCP 连接管理(设置页 +
storages/mcp_connector.json,catalog 里就有 amap),ds-bot 另有按 Bot 粒度的 Connectors/Capabilities。本插件不做管理器,只做"会话内挂载器":server 清单来自本插件 Config,不提供审批流/密钥治理/连接状态页。 - 挂载走 DSH 官方通道:经
loader.import('@deepseek-ai/dsh-mcp-client')拿到官方 MCP 客户端,scope.plugin(mcpPlugin, config)挂到onebot-private-<QQ>这一个会话上(ds-bot 同款挂法)。ds-bot 的能力只挂它自己的 Bot 会话,两者作用域不相交。 - 工具名天然隔离:挂进来的是
mcp__<serverName>__*,与qq_*工具、cura 自有工具(say_aloud/voice_chat/health_log)互不覆盖。 - 重名防御:挂载前读核心连接表,同一
serverName已在 DSH 设置里连接的,以核心为准、本会话跳过并记 warning——避免同一会话出现两份同名工具。 - server 挂了不连坐:
failOnStartupError: false+ 后台汇报结果,一个坏 server 不影响会话的其他能力。
引导语(butlerPrompt)会作为 qq-bot:butler section(order 93)注入,让模型把工具和"照顾人"的场景对上:做完用一句话自然说结果,像朋友顺口提起,不像客服报菜单。
powershell -NoProfile -File <插件目录>\say.ps1 -Text "要说的话" -Out "$env:TEMP\reply.mp3"edge-tts 失败(断网/接口抽风)时自动降级为 Windows 离线 SAPI 语音。agent 在会话里用 shell 调用它生成音频文件,然后用 dsh-onebot 的 qq_send_voice 工具发送。
适配 dsh-onebot-qq 的 custom STT 引擎契约({file}/{out} 模板):
sttEnabled: true
sttEngine: custom
sttCommand: <你的python.exe> # 需要 faster-whisper
sttArgs: ["<插件目录>/stt-whisper.py", "--file", "{file}", "--out", "{out}"]- 情境→表达规则库:LLM 从聊天记录抽取
{"situation","style"}规则入库,按情境检索注入(MaiBot 1.x 模式) - 回复意愿门控:数值意愿 + 一次 yes/no "读空气"调用,决定是否回复(MaiBot 0.6 公式)
- dsh-mneme 深度联动:QQ 会话独立记忆域(agentPreset scope 隔离)
- 手机健康数据导入:Apple Health export.zip / Health Connect 导出文件解析入库(本机解析,不上传)
- DSH 设置页 Remote 面板(照 dsh-onebot settings-remote 契约)
- QQ 语音通话里的语音导航:amap MCP 算路 + TTS 逐步播报(过渡方案
say_aloud即可做);真正的通话内导航等通话引擎 RX 复活后再做 - 管家面板页:butlerServers 可视化编辑 + 各 server 连接状态展示(当前先靠 Config + 日志)
- 语音通话 RX 复活(等上游 KoishiRTC/oldhan13 解决 Windows 回放路由后,改一行配置即恢复)
- Touch-Night/KoishiRTC 与 oldhan13/napcat-qq-voice-call-win —— QQ 原生语音通话桥的实现与 Windows 部署手册
- ClaudiaGardner/maibot-qq-voice-call —— AVSDK Host 的原始实现
- NapNeko/dsh-onebot-qq —— QQ 通道层(本插件贴附的宿主)
- MaiM-with-u/MaiBot —— 拟人化回复的诸多配方来源
- tabler/tabler-icons —— 面板图标(MIT,
<path d>数据内联在lib/client.js的ICON_PATHS,版权声明见仓库根 NOTICE)
本项目对接的 QQ 通话桥使用腾讯未公开协议能力,存在账号风控风险,请自担风险、小号先行。不要用于骚扰、群发或任何违反平台规则与法律法规的场景。