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

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

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

小夜