dsh-qq-bridge:把固定 DSH 会话接到 QQ,保留原上下文

前言

在 DSH 里跑 agent,常见做法是只在 Web 界面或 CLI 里对话。若希望同一个会话在 QQ 群里也能被 @、被昵称唤起,且仍沿用该会话已有的上下文,而不是为 QQ 单独开新会话、重新 priming,就需要在 OneBot/NapCat 与 DSH 之间做桥接,并控制「谁可以驱动模型、哪些消息只记录不调用」。

下面介绍社区插件 dsh-qq-bridge(维护者 sj244):它把一个已存在的固定 DSH 会话接到 QQ(OneBot / NapCat 个人号),白名单 fail-closed,@ / 昵称 / 戳一戳必唤醒,其余消息可按概率抽样或只写入缓冲,唤醒时再摘要注入。插件分类为「联网工具」,当前版本 v0.1.3(MIT),仓库 sj244/dsh-qq-bridge。

这是什么

dsh-qq-bridge 是 DeepSeek Harness(DSH)的 Web 侧插件:通过配置 targetSessionId,QQ 入站消息注入指定会话;插件用 agents.get(id) 显式加载目标,取不到时用 agents.resume({ resumeSessionId }),不回退到其他会话。出站受「来源闸门」约束,默认只有被 QQ 唤醒那一轮里、[QQ]…[/QQ] 标记块内的文字才会发到群里,避免 DSH 界面里的技术说明和思考过程漏进 QQ。

项目自述为 vibecoding 产物;README 写明 M1–M8 已在真实 NapCat + 真实 QQ 上端到端跑通(Windows 真机)。它不接管审批、不在加载时自动下载或执行任何内容、也不做 QQ 官方机器人。

核心功能

固定会话与上下文

  • targetSessionId 指向哪个会话,QQ 消息就进哪个会话,原有上下文继续可用。
  • 未唤醒期间的消息最多保留 200 条缓冲;真正唤醒时,取最近 recentChatLimit 条(默认 8)拼成 [QQ 未唤醒期间聊天记录] … [记录结束] 附在当前消息前,投递成功后缓冲清空。

唤醒策略(省 token)

白名单为空数组时,任何来源都不能唤醒(fail-closed)。流程概览:

QQ 消息 ─┬─ 不在白名单 ─────────────────→ 丢弃(fail-closed)
         ├─ 在会话跟随窗口内 ───────────→ 唤醒(reason: listening)
         ├─ 群里 + atOnlyInGroup + 没 @ ─→ 丢弃
         ├─ 被 @ / 命中昵称 / 被戳我 ───→ 唤醒
         ├─ random() < wakeProbability ──→ 唤醒(默认 5%)
         └─ 其余 ──────────────────────→ 只记录(零模型调用)
  • 私聊白名单:whitelist;群白名单:groupWhitelist。
  • 群内若 atOnlyInGroup: true,未被 @ 的群消息完全不处理(跟随窗口检查排在该规则之前)。
  • 模型可通过工具 qq_bridge_listen({ minutes: 5 }) 在同一群/同一私聊开跟随窗口(默认 5 分钟,上限 60);窗口内普通消息也会唤醒,会产生实际调用费用。

出站与来源闸门

replyMode 控制出站方式:

值 行为
marker(默认) 仅 [QQ]…[/QQ] 块内内容发出
tool 用 qq_bridge_send 工具发送
always 整轮回复都发出(旧行为)

只有「被 QQ 唤醒的那一轮」生效;在 DSH 里与同一会话聊天时,标记块不会发到 QQ。超长(超过 replyMaxChars)则一条都不发。

图片、表情包与 NapCat

  • 图片先缓存;唤醒时可用多模态模型转成文字填回原位置;登记为表情包后可按情绪或哈希复用,减少重复视觉调用。
  • 非文本段(表情、语音、文件等)转为占位符,避免整条消息丢失;戳自己合成 [戳一戳](戳的是我) 并必唤醒。
  • 插件可作为 WebSocket 客户端连接 NapCat 正向 WebSocket;onebotUrl 留空则完全不启用传输(默认,偏安全)。
  • 会话内可调用 qq_bridge_napcat:查状态、下载并 sha256 校验发行包、写 onebot11.json、启动 NapCat;不会在无人操作时自动下载或执行。

设置界面

昵称、白名单、概率、目标会话、出站方式、OneBot 地址、视觉模型等可在 设置 → 插件 → 插件配置 修改,保存即生效。accessTokenEnv 填环境变量名,token 由 DSH 凭据服务解析,不写入 cordis.patch.yml。

安装与启用

正式安装(资料原文命令):

dsh plugin --profile web add github:sj244/dsh-qq-bridge

装完以及每次改插件代码后,需重启 dsh web 才会加载。

接入 OneBot 时,可在 profile 的 cordis.patch.yml 按 id 覆盖,或在设置界面修改,例如:

- id: qq-bridge
  config:
    onebotUrl: 'ws://127.0.0.1:3001'
    accessTokenEnv: 'NAPCAT_ACCESS_TOKEN'

NapCat 侧需开 WebSocket 服务器(非 HTTP)。token 解析优先级:进程环境变量 → ~/.dsh/.credentials.yaml 的 refs: → 工作目录 .env;建连时重新解析,轮换 token 不必重启。

典型用法

  1. 安装插件并重启 dsh web,在插件配置里填写 targetSessionId、白名单、昵称与 wakeProbability(默认 0.05)。
  2. 配置 onebotUrl 与 accessTokenEnv,确保 NapCat 正向 WS 可达;selfId 可留空,连上后插件会 get_login_info 取得本号 QQ,过滤自消息防死循环。
  3. 若尚未部署 NapCat,在目标会话中按 README 顺序调用 qq_bridge_napcat:status → download(需代理时可设 downloadProxy)→ 手动运行一次安装器 → configure → launch(首次仍须扫码登录 QQ)。
  4. 在群里 @ 机器人或命中昵称测试唤醒;默认出站用 [QQ]回复内容[/QQ] 包裹要发到群里的句子。
  5. 需要连续聊几句时,由模型在合适时机调用 qq_bridge_listen,并注意窗口内每条消息都会唤醒。

开发期可用本地路径 dsh plugin --profile web add "<REPO>" 做 link 安装;README 说明了 Windows 下 @deepseek-ai 依赖 junction 的注意事项。

适用场景与注意

适合:已有固定 DSH 会话(例如长期「大肥鱼」人格或项目 agent),希望在小范围 QQ 群或私聊里以群友方式互动,且要严格限制谁可驱动、控制随机插话比例的场景。

不建议:公共大群长期无人值守;README 明确 NapCat 为第三方客户端,存在账号风控风险,是否启用由用户自行决定。

安全与权限:插件以当前 dsh 进程权限运行;安装前应阅读 源码与 LICENSE,理解白名单、出站闸门与「不提供审批桥接」等边界。卸载插件或退出 DSH 时,由 subprocess 托管的 NapCat 会一并结束。

DSH 生态强调「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-qq-bridge 解决的是「一个会话、两处入口」:QQ 侧可控唤醒与只记录,DSH 侧保留完整上下文与默认不出群的出站策略。进一步的设计与变更见仓库内 DESIGN.md、HANDOVER.md、CHANGELOG.md。

  • 目录页:https://www.skillhub.cn/plugins/sj244/dsh-qq-bridge
  • GitHub:https://github.com/sj244/dsh-qq-bridge
羽毛球分组比赛记分
小程序二维码

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

Xiaoye