前言¶
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纔會啓用。 - 發到後端之前會執行
maxIntensityPercent和maxDurationSeconds。 - 同一設備的新命令會替換舊的自動停止計時器。
toy_stop省略設備 id 時停止全部設備。- 插件卸載、HMR 或
toy_disconnect會停止輸出,並等待 WebSocket 關閉。
源碼裏,toy_control 當前暴露的標量類型是 vibrate、oscillate、constrict、inflate、suction。Buttplug 連接目前只暴露可映射爲百分比的標量 feature;位置、方向、傳感器、原始訪問和訂閱不在當前範圍內。
4、實機驗證的兼容映射¶
插件爲 BLE 名稱爲 RoomFun、型號標識爲 RF_CANNON_PT3、固件 4.3 的設備內置了兼容映射,暴露爲帶一個振動通道的 RoomFun Cannon。README 寫明:不會假定其他 RoomFun 型號兼容。
實現參考了 Chemtrails 的協議記錄,以及 Buttplug 和 Buttplug 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 或更高,並且 pnpm 在 PATH 中。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_connect → toy_scan → toy_list → toy_control → toy_stop → toy_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