前言¶
在 DSH(DeepSeek Harness)里做智能体,网页侧通常有系统提示、记忆和连续上下文;接到 QQ 群或私聊时,通道往往只送来一条用户消息,模型每轮还要自己「记得」去装人设、认人、择机发表情、该不该接话。把这些规则堆在提示词里既难维护,也容易和通道行为脱节。
下面介绍社区插件 dsh-dfy-qq(维护者 beiheng127):在宿主侧实现 QQ 对话行为层——人设、认人、表情包、主动接话、子人格与群聊短期记忆,并带可视化设置页「肥鱼·QQ」。插件不绑定某台机器,相对路径默认相对「工作区」解析;当前版本 0.5.5(MIT,Node >= 20)。目录页:skillhub.cn/plugins/beiheng127/dsh-dfy-qq;源码:github.com/beiheng127/dsh-dfy-qq。
这是什么¶
dsh-dfy-qq 是 DSH 的本地 npm 插件包:主进程 index.js 注册工具、注入 system prompt、提供 HTTP API 与 ctx.dfyqq 服务;浏览器端 client.js 在「设置」里挂载「肥鱼·QQ」面板。两半通过 /api/dfy-qq/* 通信,改配置后需重启 DSH(前端可刷新页面)。
它解决的核心差异是:QQ 里你希望机器人「像某个人」、偶尔发表情、在该接话时接一句,而不是只回 @ 或永远纯文字——这些由插件规则与工具完成,而不是单靠模型每轮自觉执行。
核心功能¶
README 归纳的六项能力如下。
| 能力 | 做什么 |
|---|---|
| 人设装载 | 读一个或多个 md/txt(或直接写文本),拼成 system prompt 注入每一轮 |
| 认人 | 读群友档案 md 注入;见过的号自动记昵称与次数;提供 dfy_people_upsert 写档案 |
| 表情包 | 扫目录建索引、概率发图、大保底、按语境与「最近没发过」挑图 |
| 主动接话 | 向通道层提供 shouldSpeak():关键词 / 概率 / 冷却 |
| 子人格 | 扫 personas/ 目录,模型按语境挑 0~2 个,经 dfy_persona_read 读全文再用 |
| 群聊记忆 | 每个会话保留最近 N 条(谁说了什么),超出滚掉 |
此外还有回复长度硬约束、设置页「配置体检」,以及 GET /api/dfy-qq/status 的 checks。
群友子人格(0.5.5)¶
默认关闭。开启后,群里谁说话就记其原话(只记文本,不记图),攒够句数后可蒸馏语气为子人格文档:
- 原话进入
state.peopleVoice,按voiceSamples(默认 40 句)/voiceChars(默认 6000 字)截断;重复句不重复记,/开头指令不记。 - 在设置页「认人」区块点「生成子人格」,或由模型调用
dfy_people_persona。 - 输出到
personas/群友/<昵称>-<账号>.md,含身份、语言指纹、原话样本与使用边界(只借语气,不冒充、不代承诺)。 - 生成后默认可用;不想上场则加入
personasEnabled排除表。账号为主键,与「认人 · 群友档案」同一套身份。
配置持久化(0.5.4)¶
插件关闭再开、patch 清空或工作区路径变更时,配置仍保留:
- 生效配置每次启动写入
~/.dsh/dfy-qq-config.json(与 profile、工作区无关)。 - 合并顺序:默认值 → 快照 → 本次 patch 中真正改过的键。
- 设置页保存会写快照;旧路径
<workspace>/.dfyqq/config.json仅对快照缺失键兜底。 - 彻底重置:删除
~/.dsh/dfy-qq-config.json后重启。
内置 QQ 通道(OneBot 11)¶
插件内跑反向 WebSocket 服务(channel.js),NapCat / LLOneBot / go-cqhttp 连上即可,README 说明不必再装 dsh-onebot-qq。官方 QQ 机器人通道通常只推送 @ 消息;若要主动接话,需走 OneBot 类实现。
第三方通道也可只调用行为层:
const verdict = ctx.get('dfyqq')?.shouldSpeak(payload);
if (verdict?.speak) { /* 放行这条消息 */ }
payload 宜包含 text、mentioned、groupId、userId、nickname,以利于短期记忆与认人。
模型可调工具¶
| 工具 | 用途 |
|---|---|
dfy_persona_show |
当前人设来源、字数、开头 800 字 |
dfy_people_upsert |
写/改群友档案一行(账号为主键) |
dfy_emoji_draw |
掷骰子决定是否发图;force: true 直接抽一张 |
dfy_emoji_status |
图库状态 |
dfy_persona_list |
列子人格(含使用次数) |
dfy_persona_read |
读某人格全文(用法记在 .dfyqq/persona-usage.jsonl) |
群友子人格生成另需 dfy_people_persona(见 README「群友子人格」一节)。
安装与启用¶
这是本地插件,不走 npm 发布;DSH 不会自动扫描 plugins/,需在正在使用的 profile 的 package.json 登记并 pnpm install。
1. 获取代码¶
git clone https://github.com/beiheng127/dsh-dfy-qq.git ~/.dsh/plugins/dsh-dfy-qq
也可在 GitHub 页 Code → Download ZIP,解压为 ~/.dsh/plugins/dsh-dfy-qq(目录名须一致)。
2. 注册进 profile¶
profile 一般在 ~/.dsh/profiles/<名字>/package.json(桌面版默认 desktop)。在 dependencies 与 dsh.profile.bundles 中加入插件(link: 路径按本机实际修改):
{
"dependencies": {
"dsh-dfy-qq": "link:C:/Users/you/.dsh/plugins/dsh-dfy-qq"
},
"dsh": {
"profile": {
"bundles": [
"dsh-dfy-qq"
]
}
}
}
在 profile 目录执行:
cd ~/.dsh/profiles/desktop
pnpm install
3. 重启 DSH¶
重启后 设置 → 肥鱼·QQ 出现配置页。README 提醒:cordis.patch.yml 负责挂运行时,package.json 的 dsh.client 负责设置页 tab;缺一处会出现「有插件无页面」或相反。
典型用法¶
第一次配置(设置页四块)¶
- 工作区:所有相对路径的根,填绝对路径即可。
- 人设:「人设文件」一行一个,例如
kb/persona.md、AGENTS.md;或在「人设文本」写全文(文本优先于文件)。保存后看「当前来源 · N 字符」;字数过小请看配置体检。 - 子人格(可选):默认目录
personas,每人格一个.md;插件从# 标题与> 简介:抽摘要,全文由dfy_persona_read读取。 - 表情包:文件夹留空则
<工作区>/emoji;索引默认kb/表情包-索引.md;可调发图概率与大保底;QQ 侧认gif / png / jpg,webp易变成文件卡片。
索引表第四列「用途 / 情绪」填关键词(、 分隔),发图时会按最近聊天匹配;不填则随机挑图。
接入 NapCat 反向 WS¶
设置页打开「QQ 通道(内置 OneBot 11)」,默认地址:
ws://127.0.0.1:6700/onebot/v11/ws
NapCat 的 onebot11_<QQ号>.json 或 WebUI 增加客户端,例如:
{
"network": {
"websocketClients": [
{ "name": "dsh-dfy-qq", "url": "ws://127.0.0.1:6700/onebot/v11/ws", "token": "", "enable": true }
]
}
}
连上后设置页显示「已连 1 个」;<工作区>/.dfyqq/channel.log 可见 OneBot 已连接。群消息被 @ 或命中主动接话规则时,插件建会话 dfyqq-group-<群号> 并 followup;文本按 replyMaxChars 分段发出;模型调 dfy_emoji_draw 得路径后由通道发图。
定时任务¶
设置页「定时任务」一行一条:
09:00 | 123456789 | 早上问个好
21:30 | private-934705339 | 提醒今天没写完的活
格式为 HH:MM | 群号或 private-QQ | 主题;# 开头忽略。到点插件建/复用会话,按主题让模型主动开句再发送;同一分钟同目标一天只跑一次(记在 qq-channel.json)。
常用配置键(节选)¶
设置页可改;README 说明工作区 <stateDir>/config.json 中的值可覆盖 cordis 配置,且与 ~/.dsh/dfy-qq-config.json 持久化策略并存(见上文 0.5.4)。
| 键 | 默认 | 说明 |
|---|---|---|
autoSpeakEnabled |
false |
允许不 @ 接话 |
autoSpeakChance |
0.12 |
接话概率 |
emojiChance |
0.5 |
发图概率 |
emojiPity |
4 |
大保底轮数 |
memoryRounds |
20 |
每会话保留条数 |
replyMaxChars |
220 |
单条回复字数上限,0 不限 |
qqEnabled |
false |
内置 OneBot 通道开关 |
qqWsPort |
6700 |
反向 WS 端口 |
完整表见仓库 README「配置项」一节。
适用场景与注意¶
适合谁:已在用 DSH 做对话智能体、并希望通过 OneBot(或自写通道)接 QQ 群/私聊,且需要人设、认人、表情包与接话规则落在宿主侧而非纯提示词堆砌的开发者。
生态说明:DSH 社区奉行「一切皆插件」;SkillHub 为社区目录站点,与 DeepSeek / 幻方无官方从属关系,本文不以「官方应用商店」表述。
安全与权限:插件以当前 DSH 进程权限运行,会读写工作区、~/.dsh/dfy-qq-config.json 及 .dfyqq 状态目录,并监听本地 OneBot WS。安装前请阅读源码与 MIT LICENSE,确认路径、群白名单(qqGroups)与 token 设置符合你的环境。
依赖关系:六个工具、设置页、索引与体检可独立使用;真正在 QQ 说话需 OneBot 类通道或调用 ctx.dfyqq 的自有通道。改 index.js 与 client.js 后需重启 DSH。
结尾¶
经过上面的步骤,你可以在 DSH 里把 QQ 对话当成「带人设、认人、表情与接话策略的行为层 + 可选内置 OneBot 通道」,而不是每次在通道里重写一遍规则。
- 目录页:https://www.skillhub.cn/plugins/beiheng127/dsh-dfy-qq
- 仓库:https://github.com/beiheng127/dsh-dfy-qq