dsh-plugin-midscene:为 DeepSeek Harness 增加 Midscene 驱动的 UI 自动化

前言

DSH 的扩展方式是「一切皆插件」。当模型需要操作真实界面时,Android 和 Web 往往要分别处理目标、定位和运行环境。ciky20171114/dsh-plugin-midscene 为 DeepSeek Harness(DSH)提供基于 Midscene 的 AI-driven UI automation:模型看到屏幕,按自然语言描述定位元素,并作用于真实 Android 设备或真实 Chrome 页面。

它通过一个 ctx.midscene 能力接缝提供 android_uiweb_ui 两个工具。

这是什么

dsh-plugin-midscene 是一个 DSH 插件,由 ciky20171114 维护,许可证为 MIT。

它的能力结构可以概括为:

  • 单一接缝:ctx.midscene
  • 两个 provider:Android 和 Web
  • 两个工具:android_uiweb_ui

核心功能

  • Android provider 面向一个 ADB-connected device。
  • Web provider 面向已运行 Chrome 的 active page;provider 只连接,不启动 Chrome。
  • android_uiweb_ui 使用单一 action 参数,支持 tapactinputqueryassertbooleanback
  • 视觉模型通过环境变量配置为 Midscene 兼容模型;资料说明这不是通过 DSH 的 ctx.llm 配置。

安装与启用

先准备环境:

  1. DSH CLI 和一个 profile。
  2. Android 场景:adb devices 能看到设备。
  3. Web 场景:Chrome 以 --remote-debugging-port=9222 --user-data-dir=<dir> 启动;插件只连接,不启动 Chrome。

安装:

dsh plugin --profile mysetup add dsh-plugin-midscene

安装后,在 profile 的 cordis.patch.yml 中添加 exactly one provider row。示例路径:

~/.dsh/profiles/mysetup/cordis.patch.yml

同一 context 中,两个 provider 不能同时拥有 ctx.midscene,所以只能配置一行 provider。

Android 示例:

- insert:
    - id: midscene-android
      name: dsh-plugin-midscene/android
      config:
        deviceId: ''
        aiActionContext: ''

deviceId 为空表示取 getConnectedDevices() 的第一个设备;aiActionContext 是自由上下文。

Web 示例:

- insert:
    - id: midscene-web
      name: dsh-plugin-midscene/web
      config:
        browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser/<id>'
        aiActionContext: ''

browserWSEndpoint 可以从:

http://127.0.0.1:9222/json/version

webSocketDebuggerUrl 获取。Chrome 重启后 id 变化,需要更新 provider row 并 restart dsh。

启动:

dsh --profile mysetup

如果 3080 被占用,可添加:

dsh --profile mysetup --port 3081

本地开发时可以使用:

dsh plugin --profile dev add /path/to/dsh-plugin-midscene

模型配置

通过环境变量配置 Midscene 兼容视觉模型:

export MIDSCENE_MODEL_NAME=glm-4.6v
export MIDSCENE_MODEL_BASE_URL=https://open.bigmodel.cn/api/paas/v4/
export MIDSCENE_MODEL_API_KEY=<your key>
export MIDSCENE_MODEL_FAMILY=glm-v

工具与错误语义

android_uiweb_ui 共用单一 action 参数,模型选择动作后由工具处理。已核实的动作包括:

tap
act
input
query
assert
boolean
back

失败的 assert 是成功结果,表现为 pass: false;基础设施失败才走 error path。

设计边界与限制

这个插件的设计边界是 no policy, no recovery:

  • 没有 retry
  • 没有 precondition checks
  • 没有 automatic recovery

其他限制:

  1. 每个 provider instance 只支持一个 target。
  2. 无 reconnect;中途断连表现为 rejected call。
  3. @midscene/android@midscene/web 固定在 exactly 1.11.0
  4. Web 的 puppeteer 是 peer dependency;Chrome 由部署方提供,不由插件下载。
  5. Web provider 在 teardown 时 disconnect 而不 close,Chrome 进程由部署方保留。

安装排障

pnpm ≥ 10 可能因 sharp / @ffmpeg-installer/linux-x64 的 transitive install scripts 报 ERR_PNPM_IGNORED_BUILDS。需要按 profile 做一次 allowBuilds 修复:打开:

~/.dsh/profiles/<name>/pnpm-workspace.yaml

按 pnpm 输出的 allowBuilds 提示调整相关项,然后重新执行 add 命令。

适用场景与注意

适合已经使用 DSH,并需要让模型操作真实 Android 设备或 Chrome 页面的场景。

使用前建议:

  • 插件以当前 dsh 进程权限运行,安装前应检查源码和许可证。
  • 它不负责启动 Chrome,也不会自动恢复异常 UI 状态。
  • Web 场景需要部署方提供 Chrome,并由环境解析 puppeteer
  • 视觉模型需要通过环境变量指向可访问的服务。

链接

  • 插件目录页:https://www.skillhub.cn/plugins/ciky20171114/dsh-plugin-midscene
  • GitHub 仓库:https://github.com/ciky20171114/dsh-plugin-midscene
羽毛球分组比赛记分
小程序二维码

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

Xiaoye