dsh-otherbot-radar:讓 QQ 羣裏的 DSH agent 聽見別的機器人

前言

在 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 確認雷達是否掛上、全量權限是否到位。

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

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

小夜