dsh-otherbot-radar: DSH agents in QQ groups hear other bots

前言

在 DeepSeek Harness(DSH)里接 QQ 官方机器人时,agent 通常只在有人 @ 本机器人时才会被唤醒。群里其他成员、尤其是其他机器人发出的消息,在默认推送策略下既不会进会话,也很难事后核对「到底是平台没推,还是被中间件挡掉了」。若你希望 agent 能感知群内其他机器人的发言、按需介入或做转录回看,需要在 SDK 入站层额外做一层观测与唤醒策略。

下面介绍社区插件 dsh-otherbot-radar(维护者 ChencLi819,分类:工作流)。它在不发起额外网络请求、不接触开放平台凭据的前提下,钩住 QQ 机器人 SDK 的入站处理,把平台实际推到进程里的消息记下来,并按配置决定是否唤醒 agent。

这是什么

dsh-otherbot-radar 是 DSH 插件,当前版本 0.1.0(MIT 许可证)。定位可以概括为:QQ 群内「别家机器人雷达」—— SDK 入站全量记录(含被门控挡掉的消息)、别的机器人说话即可唤醒 agent、转录与诊断工具、以及基于文件的收件口桥。

依赖关系:需已安装并启用 DSH 的 QQ 机器人相关能力;可选 peer @tencent-connect/dsh-qqbot(>= 0.5.0);Node.js >= 22.13.0;宿主为 @tencent-connect/qqbot-nodejs 的 handleInboundMessage / send / sendMedia。

背景:为什么默认「听不见」

QQ 官方机器人平台按事件类型推送。未开启「接收全量消息」时,常见只有 GROUP_AT_MESSAGE_CREATE(有人 @ 本机器人)。开启全量后才会收到 GROUP_MESSAGE_CREATE(群内每条消息),且其他机器人消息(author.bot = true)会随全量推送过来。

全量开关不在 q.qq.com 网页后台,而需群主在手机 QQ 添加或管理机器人时勾选「设置接收全量消息能力」(详见 README 引用的官方文档与 FAQ)。开启后还要注意:@ 消息也会以 GROUP_MESSAGE_CREATE 送达,是否 @ 本机器人需看 mentions[].is_you;同一条消息可能重复推送,雷达会如实记多行以便核对。

核心功能

入站雷达

包装 SDK 的 handleInboundMessage,平台推来的每一条入站消息写入状态目录下的 radar.jsonl,包括被门控挡掉的消息,并附带「消息下场」 trace。排障时可以区分:平台没推,还是策略挡了。

唤醒策略

  • 别的机器人说话可唤醒 agent(无需 @);同一机器人在 10 分钟窗口内默认最多唤醒 10 次,减轻两个机器人互相刷屏。
  • 人类消息是否唤醒由 wakeOnHuman 控制:all(默认,群内消息都唤醒)或 mention(仅被 @ 时唤醒)。

转录与工具

别的机器人的发言单独写入 transcript.jsonl。插件注册两个工具,输出均为 { text: string }:

工具 用途
otherbot_recent 查看别的机器人最近说了什么(平台推送 + 收件口);可选 bot、group、limit(默认 20,最多 100)
otherbot_diag 雷达是否生效、平台实际推送了什么;可选 lines(默认 12,最多 40)

收件口(桥)

平台不推送时,任何能写文件的进程把消息写入 inbox/*.jsonl(一行一条 JSON),轮询间隔默认 3000 ms,即可唤醒 agent。agent 回复追加到 outbox.jsonl,由外部进程读走。

其他

  • 自回声识别:按已发出消息的 id + 正文丢弃 QQ 推回来的本机器人消息,避免自问自答。
  • 提示词注入:可选向 agent 说明群里有别的机器人及如何查询(promptEnabled / promptText)。

安装与启用

通过 DSH CLI 安装(命令来自仓库 README):

dsh plugin --profile desktop add dsh-otherbot-radar

# 或从 GitHub 安装
dsh plugin --profile desktop add github:ChencLi819/dsh-otherbot-radar

安装后重启 DSH 或等待热重载,新会话中应出现 otherbot_recent 与 otherbot_diag。

若使用仓库内 link: 开发安装,README 说明需运行 node tools/install.mjs,并用 node tools/smoke.mjs 做离线自检。以 link: 安装时若 radar.jsonl 始终不出现,可先运行 node tools/probe-tap.mjs 检查 SDK 模块解析与钩子(Node 按 realpath 解析可能导致插件与工作区 SDK 不是同一实例,插件内 lib/tap.js 有兜底逻辑)。

配置

在 profile 的 cordis.patch.yml 中覆盖 otherbot-radar 的 config(仅写需要改的字段)。默认值见仓库 index.js 的 DEFAULTS,示例:

- id: otherbot-radar
  config:
    wakeOnOtherBot: true
    wakeOnHuman: all              # all / mention
    otherBotBurstLimit: 10
    otherBotBurstWindowMinutes: 10
    bridge:
      enabled: true
      dir: ~/.dsh/otherbot-radar/inbox
      pollMs: 3000
    promptEnabled: true

常用项:enabled(总开关)、stateDir(默认 ~/.dsh/otherbot-radar)、selfName(写入 outbox 时代表自己的名字,建议填机器人名)。正式环境不要设置 sdkLoader(仅测试用)。

典型用法

用工具回看别的机器人发言

在 agent 会话中调用 otherbot_recent,可按机器人名片段、群、limit 过滤。数据来源包括 QQ 全量推送与收件口。

排障

调用 otherbot_diag,或直接查看:

文件 内容
~/.dsh/otherbot-radar/radar.jsonl 全量入站与 trace
~/.dsh/otherbot-radar/transcript.jsonl 仅别家机器人
~/.dsh/otherbot-radar/outbox.jsonl agent 回复
~/.dsh/otherbot-radar/boot.log 加载记录(含版本与配置)

README 中的对照表:入站 0 条多为未开全量或群内无消息;只有 GROUP_AT_MESSAGE_CREATE 需群主开全量;全量在推但 otherBot 为 0 时平台可能过滤机器人消息,只能走收件口。

通过收件口递话

字段宽松,例如:

{"bot":"小助手","text":"要比就比点具体的,别比嗓门","group":"<group_openid>"}

Windows PowerShell 一行写入示例(路径来自 README):

'{"bot":"小助手","text":"'"$text"'"}' | Add-Content -Encoding utf8 "$env:USERPROFILE\.dsh\otherbot-radar\inbox\inbox.jsonl"

已处理行不会重复唤醒;重启不会重读旧行。

适用场景与注意

适合谁:在 DSH 里运营 QQ 群 agent、需要监听或响应其他机器人发言、或要在平台推送不完整时用文件桥接外部消息的场景。

权限与安全:插件以当前 DSH 进程权限运行,只在进程内处理已送达 SDK 的事件,不自行联网拿凭据。安装前建议阅读源码与 MIT 许可证,确认行为符合你的群规与合规要求。

已知限制(摘自 README):

  • 对面机器人能否听见本 agent 的回复,取决于对方是否开全量或是否被 @;本插件解决的是「本侧听见」,双向需两侧都配置。
  • 平台不推送的内容无法凭空生成,只能靠收件口。
  • 桥消息无 msg_id,agent 回复属主动消息,受 QQ 主动消息频控(如群 1000 条/天)。
  • 钩子打在 SDK 原型上,@tencent-connect/qqbot-nodejs 大版本升级后应用 node tools/smoke.mjs 再确认。
  • 「接收全量消息」须群主授予,插件无法代开。

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

结尾

dsh-otherbot-radar 把 QQ 入站从「仅 @ 才醒」扩展为可观测的全量雷达、可配置的别家机器人唤醒、可回看的转录,并在推送不足时用 inbox / outbox 做文件桥。若你已在 DSH 上跑 QQ 机器人,可按上文 CLI 命令安装,用 otherbot_diag 确认雷达是否挂上、全量权限是否到位。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye