dsh-toy:把小玩具接到 DeepSeek Harness 的有界控制插件

前言

DeepSeek Harness(以下簡稱 DSH)把模型、工具、會話、沙箱和界面都做成可替換的插件。官方倉庫 deepseek-ai/deepseek-harness 的口號就是「Everything is a Plugin」:能力不寫死在覈心裏,而是由 Cordis 在啓動時按 profile 組裝。社區因此出現了大量擴展,覆蓋視覺、記憶、通知、主題等方向。

多數插件仍停在軟件世界裏。一旦要把藍牙、串口或 USB 上的實體設備交給智能體控制,事情會立刻變複雜:要選協議、起本地服務、處理權限,還得防止模型把強度和時長寫成不受約束的指令。Buttplug / Intiface 這類通用控制棧能覆蓋不少硬件,但默認並不會替你完成「問型號、選後端、設上限」這一整條鏈路。

dsh-toy 就是針對這條鏈路寫的 DSH 插件。它把連接、發現和控制收成一組模型可見工具,同時把強度、時長和停止行爲限制在配置裏。本文依據社區目錄頁和 GitHub 倉庫交叉覈對後整理,方便已經在用 DSH 的人判斷要不要裝、怎麼裝、能做什麼。

這是什麼

dsh-toy 是一個 DeepSeek Harness 插件,用來把小玩具接到 DSH。倉庫英文簡介是 Toy Control Protocol for DSH,package.json 裏寫得更具體:面向有安全邊界的 Buttplug / Intiface 與 MonsterParty 控制。維護者是 GitHub 用戶 c3ll256,主要語言是 TypeScript,許可證爲 BSD-3-Clause。社區目錄 deepseek-harness-plugin.com 把它歸在「工具與能力」,收錄日期爲 2026-08-15;倉庫創建於 2026-08-14,寫作時打開 GitHub 可見約 53 星(目錄頁同期標註 37 星,以倉庫頁面爲準)。當前 package.json 版本爲 0.2.0,要求 Node.js 22.19 或更高。

需要先說清生態位置。DSH 本身是 DeepSeek 開源的 agent 運行時,仍處於 developer preview。官方發現社區插件的入口是 GitHub 話題 dsh-plugin,並沒有官方應用商店。deepseek-harness-plugin.com 是獨立的社區目錄,和 DeepSeek / 幻方沒有從屬關係;目錄頁給出的安裝命令方便複製,但不等於經過官方審計。

插件要解決的問題也很具體:用戶不必理解底層協議,也不必手動啓動 Intiface。連接時,agent 會先詢問品牌和型號,再自動選擇連接方式;用戶確實不知道時,再進入未知硬件發現。品牌和型號名稱不是白名單,agent 會原樣傳遞用戶報告的文本。

核心功能

根據倉庫 README 和源碼,能力可以分成下面幾塊。

1、自動選擇連接方式

調用 toy_connect 之前,agent 必須先問型號,並把型號(以及已知時的品牌)傳給工具。工具不會讓用戶選擇底層協議。當前有三條路徑:

  • 在 macOS 上,未知硬件會先做只讀的原始 CoreBluetooth 廣播發現:不啓動 Intiface,不連接設備,也不寫入特徵值。掃描得到的廣播名稱可以作爲後續 toy_connect 的硬件證據;原始 BLE id 不能當作可控設備 id。
  • 普通藍牙、串口或 USB 型號走 Buttplug / Intiface。插件會先嚐試本機已有服務;127.0.0.1:12345 拒絕連接時,再自動啓動 Intiface Engine。
  • 安可尼、謎姬、醉清風等已知分享鏈接型號走 MonsterParty。已知雙通道設備會分別暴露各個輸出通道。

未知或文檔裏沒有的名稱,仍然走同一條路徑:把用戶報告的文本傳給 toy_connect,再調用 toy_scan。README 明確要求:agent 不得猜測協議,也不得向任意 BLE 特徵寫入數據。掃描只返回 Intiface 上游定義或經過實機驗證的兼容映射所覆蓋的設備;空結果表示設備仍不受支持或當前不可用,不代表可以做破壞性探測。

2、自動拉起 Intiface Engine

本地設備這條路徑裏,插件會先查找 PATH 中的 intiface-engine。如果沒有安裝,默認會從 Buttplug 官方 GitHub Release 下載固定版本,校驗 SHA-256 後緩存到用戶目錄再啓動。當前自動下載支持 macOS ARM64、Linux x64/ARM64 和 Windows x64;其他平臺需要用 intifaceExecutable 指向已安裝的引擎。可用 intifaceAutoDownload: false 關掉下載。

自行啓動時,實際命令是:

intiface-engine --websocket-port 12345 --use-bluetooth-le --use-serial --use-hid

插件只會在斷開或卸載時終止由自己啓動的進程,不會關掉用戶原本已經在跑的 Intiface。自行啓動時,還會把經過驗證的兼容映射寫入權限受限的臨時 user-device-config,關閉時刪除;外部已運行的 Intiface 繼續使用自身配置,若要用插件內置映射,需要先停掉那個外部服務。

3、有界控制與停止

面向模型的控制不是「任意寫特徵值」,而是有上限的標量命令。README 列出的安全限制包括:

  • 分享 token 只保存在插件配置裏,不會出現在模型可見的工具參數或結果中。
  • 原始 BLE 發現是隻讀掃描。
  • 默認 30 秒後自動停止輸出。
  • 默認禁止零時長保持,只有顯式配置 allowHold: true 纔會啓用。
  • 發到後端之前會執行 maxIntensityPercentmaxDurationSeconds
  • 同一設備的新命令會替換舊的自動停止計時器。
  • toy_stop 省略設備 id 時停止全部設備。
  • 插件卸載、HMR 或 toy_disconnect 會停止輸出,並等待 WebSocket 關閉。

源碼裏,toy_control 當前暴露的標量類型是 vibrateoscillateconstrictinflatesuction。Buttplug 連接目前只暴露可映射爲百分比的標量 feature;位置、方向、傳感器、原始訪問和訂閱不在當前範圍內。

4、實機驗證的兼容映射

插件爲 BLE 名稱爲 RoomFun、型號標識爲 RF_CANNON_PT3、固件 4.3 的設備內置了兼容映射,暴露爲帶一個振動通道的 RoomFun Cannon。README 寫明:不會假定其他 RoomFun 型號兼容。

實現參考了 Chemtrails 的協議記錄,以及 ButtplugButtplug Protocol Specification 的設備抽象與消息格式。倉庫 NOTICE 說明這是獨立的 TypeScript 實現,沒有再分發上述項目的源碼,協議名稱和消息字段只用於互操作。

安裝與啓用

社區目錄頁給出的安裝命令是:

dsh plugin add github:c3ll256/dsh-toy

目錄頁同時提醒:如需可復現安裝,可固定 commit 哈希:

dsh plugin add github:c3ll256/dsh-toy#commit

#commit 換成實際提交哈希即可。不要憑名稱自行拼接 owner/repo,以上命令以目錄頁原文爲準。

倉庫 README 給出的是帶 profile 的寫法,運行要求是 Node.js 22.19 或更高,並且 pnpmPATH 中。macOS 原始 BLE 發現還需要 Xcode Command Line Tools 提供的 Swift 編譯器。如尚未安裝 pnpm,README 建議先執行一次 npm install --global pnpm@10,然後:

npx -y @deepseek-ai/dsh plugin --profile web add github:c3ll256/dsh-toy

使用同一個 profile 啓動 DSH:

npx -y @deepseek-ai/dsh web

第一條命令會把 bundle 持久安裝並啓用到 web profile,之後啓動 DSH 時無需重複安裝。查看組合配置或移除插件:

npx -y @deepseek-ai/dsh --profile web --dump-config
npx -y @deepseek-ai/dsh plugin --profile web remove dsh-toy

需要其他 profile 時,把 web 換成對應名稱。

bundle 默認配置(README 與 cordis.patch.yml 一致的部分)如下:

- id: dsh-toy
  config:
    buttplugProtocolVersion: 4
    intifaceExecutable: intiface-engine
    intifaceAutoDownload: true
    rawBleScanDurationMs: 10000
    defaultDurationSeconds: 30
    maxDurationSeconds: 300
    maxIntensityPercent: 100
    allowHold: false

cordis.patch.yml 裏還默認了 buttplugUrl: ws://127.0.0.1:12345。舊版 Intiface server 可把 buttplugProtocolVersion 設爲 3

典型用法

已知型號

可以直接告訴 agent:

我的玩具是 Lovense Lush 3,請連接並掃描。

已知型號的工具順序是:toy_connecttoy_scantoy_listtoy_controltoy_stoptoy_disconnect

掃描前請打開設備、保持距離較近,並避免讓手機 APP 或其他程序同時佔用連接。macOS 首次掃描時可能會請求藍牙權限,需要允許運行 DSH 的終端或應用訪問藍牙。

不知道品牌或型號

也可以說:

我不知道品牌和型號,請直接用藍牙搜索。

在 macOS 上,agent 會先調用 toy_scan_raw_ble。如果掃描得到合理的廣播名稱,就把這個硬件報告的名稱用於 toy_connect;否則回退爲 unknown,自動連接 Intiface 並掃描已驗證協議。原始發現不可用或沒有結論時,繼續調用 toy_connect(model: "unknown")

面向模型的工具如下:

工具 作用
toy_scan_raw_ble 在 macOS 上繞過 Intiface,只讀發現可連接的原始 BLE 廣播
toy_connect 根據用戶提供的型號自動連接;不知道時使用 unknown
toy_scan 發現可用設備
toy_list 列出設備 id 和可控 feature
toy_control 發送有界標量命令
toy_stop 停止一個或全部設備
toy_disconnect 停止輸出並關閉連接

重連之後應重新調用 toy_list 刷新設備 id,不要沿用舊 id。

MonsterParty 分享鏈接

受支持的分享鏈接 token 應放到環境變量,而不是對話或 Git 倉庫裏:

MONSTERPARTY_TOKEN=<TOKEN>

然後在 profile 的 cordis.patch.yml 中覆蓋插件配置:

- id: dsh-toy
  config:
    monsterPartySessionToken: !!js process.env.MONSTERPARTY_TOKEN
    defaultDurationSeconds: 30
    maxDurationSeconds: 300
    maxIntensityPercent: 100
    allowHold: false

README 說明:分享 token 通常只能使用一次,並在斷開後失效;重新連接前應生成新鏈接。token 屬於臨時控制憑據,不要提交到 Git,也不要暴露在日誌或對話中。

常見故障

README 列出的排查項可以直接對照:

  • 出現 spawn intiface-engine ENOENT:更新到包含自動下載的版本,確認 intifaceAutoDownload: true,並且可以訪問 GitHub。
  • 掃描結果爲空:打開系統藍牙,確認設備有電且在附近,斷開手機 APP 或其他控制程序。
  • Intiface 啓動但掃描失敗:檢查系統是否已授予 DSH 或終端藍牙權限。
  • 原始 BLE 掃描無法構建輔助程序:執行 xcode-select --install,或改走 Intiface 回退。
  • MonsterParty 連接被拒絕:token 可能已使用或過期,生成新鏈接後再試。

適用場景與注意事項

適合已經在跑 DSH、希望用自然語言驅動本機或分享鏈接設備的人。它把協議選擇、Intiface 拉起和強度/時長上限收進插件,模型側只看到有限的工具。不適合把任意未知藍牙設備當成通用外設來探測:空掃描不是繼續寫特徵值的許可。

使用前有幾條邊界需要看清楚。

第一,插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。目錄頁和倉庫都要求:安裝前檢查源代碼倉庫和許可證。社區目錄不是官方應用商店,也不代替你自己做安全審查。需要可復現環境時,固定 commit 哈希。

第二,只控制本人擁有或已獲得明確授權的設備。這是 README 寫明的使用前提,不是可選項。

第三,能力範圍比「所有玩具協議」窄。MonsterParty 連接只實現 Chemtrails 記錄的 relay 行爲和 AKN_DS_SUCKEGG 映射,廠商協議變化可能需要更新實現。原始 BLE 廣播發現僅支持 macOS,依賴 Xcode Command Line Tools 的 Swift 編譯器,而且只負責只讀發現,不是未知設備的通用控制協議。測試使用本地協議 fixture,不連接物理硬件。

第四,自動下載 Intiface 需要能訪問 GitHub;其他 CPU/OS 組合要自行準備引擎。首次在 macOS 上掃描,還要處理系統藍牙授權。

小結

dsh-toy 把小玩具接到 DSH 的方式,不是讓用戶先搞懂 Buttplug 再手寫 WebSocket,而是:問型號、自動選後端、把控制限制在百分比和秒數里,並在卸載或斷開時停掉輸出。它是 c3ll256 維護的社區開源插件,BSD-3-Clause 許可,和 DeepSeek 官方核心倉庫沒有從屬關係。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-toy/

GitHub:https://github.com/c3ll256/dsh-toy

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

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

小夜