dsh-dfy-qq:给 DSH 补上 QQ 对话行为层

前言

在 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)

默认关闭。开启后,群里谁说话就记其原话(只记文本,不记图),攒够句数后可蒸馏语气为子人格文档:

  1. 原话进入 state.peopleVoice,按 voiceSamples(默认 40 句)/ voiceChars(默认 6000 字)截断;重复句不重复记,/ 开头指令不记。
  2. 在设置页「认人」区块点「生成子人格」,或由模型调用 dfy_people_persona。
  3. 输出到 personas/群友/<昵称>-<账号>.md,含身份、语言指纹、原话样本与使用边界(只借语气,不冒充、不代承诺)。
  4. 生成后默认可用;不想上场则加入 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;缺一处会出现「有插件无页面」或相反。

典型用法

第一次配置(设置页四块)

  1. 工作区:所有相对路径的根,填绝对路径即可。
  2. 人设:「人设文件」一行一个,例如 kb/persona.md、AGENTS.md;或在「人设文本」写全文(文本优先于文件)。保存后看「当前来源 · N 字符」;字数过小请看配置体检。
  3. 子人格(可选):默认目录 personas,每人格一个 .md;插件从 # 标题 与 > 简介: 抽摘要,全文由 dfy_persona_read 读取。
  4. 表情包:文件夹留空则 <工作区>/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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye