前言¶
DSH 的理念是「一切皆插件」,客户端编排型 Agent 的能力基本靠插件补齐。macOS 上让 Agent 操作本机,常见做法有两种:一种是截图后只靠坐标猜位置,点不准、点错之后不会自我纠正;另一种是包一个外部 driver 进程,部署时多一个运行时依赖。
dsh-computer-use 是维护者 lqq151510 发布的客户端插件,分类为客户端,面向 macOS。它把「读屏 → 操作 → 复核」合成一套 computer_* 工具:读屏走辅助功能树加 OCR,操作优先走语义定位而不是坐标,屏幕上没有可访问元素的部分再退回 CoreGraphics 像素操作。前提是本机是 macOS,且要给 DeepSeek Harness 授予辅助功能和屏幕录制权限。
这是什么¶
一句话定位:给 DeepSeek Harness 加上 macOS 桌面操控能力,Agent 能截图看见桌面,并移动鼠标、点击、拖拽、滚动、打字和按快捷键。
它注册八个工具:
computer_permissions
computer_screenshot
computer_windows
computer_mouse
computer_keyboard
computer_sequence
computer_read
computer_act
其中 computer_read 是核心:一次调用同时返回辅助功能树(元素的 role、title、value、actions、屏幕坐标、稳定 index)和 Vision OCR 文字及其坐标。两条通道共用同一套屏幕 point 坐标,模型不用先选通道,也不用自己做像素到坐标的换算。
computer_act 则按 index 或可见标题直接 press / focus / set_value / click,过程中不移动真实指针,因此能操作后台窗口。每次操作带「元素指纹」(role + 标题 + 位置),界面在两次调用之间变化导致路径漂移时会重新按指纹查找同一个控件。
注册的八个工具¶
| 工具 | 作用 |
|---|---|
computer_permissions |
检查「辅助功能 / 屏幕录制」授权,缺哪一项、去哪开 |
computer_read |
读辅助功能树 + OCR 文字,一次拿到;给 app 或 window 可读后台窗口 |
computer_act |
按 index 或标题直接 press / focus / set_value / click |
computer_screenshot |
截全屏 / 窗口 / 区域,图片直接进模型上下文 |
computer_windows |
列出窗口、查前台 app、把某个 app 切到前台 |
computer_mouse |
move(支持 dx/dy)click(repeat / intervalMs / downMs)hold double_click right_click drag scroll position |
computer_keyboard |
type(含中文)key(holdMs 控制按住时长)hotkey |
computer_sequence |
把一串输入原语按顺序一次执行,逐步返回耗时 |
安装与启用¶
关于安装命令需要先说明一点:本文核对的 README 只给出了卸载命令,目录页是脚本渲染的,抓取结果里没有可核对的安装命令文本。因此下面不拼接 dsh plugin add ... 之类的命令,只给出已核实的线索。
卸载命令(来自 README):
dsh plugin --profile desktop remove dsh-computer-use
rm -rf ~/.dsh/computer-use
反向推导,安装后需要保证 profile 里包含该插件(README 提到插件是 link: 进 profile 的)。仓库信息见文末目录页,装之前按 README 的 files 列表确认目录结构一致:
index.js
lib/*.js
native/ComputerUse.swift
native/CUInput.swift
cordis.patch.yml
locale/*.json
icon.svg
自动加载依赖 Node 22+(package.json 的 engines 字段),运行平台只声明 darwin。cordis.patch.yml 里可以关掉高风险项,例如把 allowInput 设为 false 就变成「只截图,禁用鼠标键盘」:
- id: computer-use
name: dsh-computer-use
config:
allowInput: true # false = 只截图,禁用鼠标键盘
resolution: points # points(推荐)| pixels
defaultDisplay: 1
blockedApps: # 这些 app 在前台时拒绝发送输入
- 1Password
- Keychain Access
typeMaxChars: 8000
warmup: true # 启动时后台预编译助手
blockedApps 默认拦住 1Password 和 Keychain Access,避免对凭据类窗口自动输入。
改完 lib/*.js 需要重新加载插件:
# 在 DSH 里调 plugin_manager:
# action=set_plugin target=include:computer-use enabled=false
# action=set_plugin target=include:computer-use enabled=true
原生 Swift 改动不用重载插件,lib/helper.js 会按源码哈希自动重编译。
首次授权¶
系统设置 → 隐私与安全性,给 DeepSeek Harness 勾两项:
- 辅助功能(Accessibility)——发送鼠标/键盘事件必需;
- 屏幕录制(Screen Recording)——截图必需。
勾选后重启 Harness。跑一次 computer_permissions 可以看到是否齐全,传 openSettings: true 会直接打开对应系统面板。
典型工作流¶
README 给的推荐顺序是「先读屏,再动手」,四步:
computer_read:拿到elements(每个带index和centerX/centerY)和text(OCR 行 + 坐标);- 能按语义操作就
computer_act action=press target=<index>(走 AX,后台窗口也能点,不怕遮挡); - AX 里没有的控件,再用
computer_mouse按坐标点,用computer_keyboard打字; - 改完再
computer_read一次复核结果(读输入框 value、读计算器显示)。
README 里有三个可复现的例子。第一个是计算器:用 computer_act 依次按可见标题 press 7、乘、6、等于,不按坐标;再用 computer_read 读到 7 × 6 与 42。这个例子同时也验证了指纹机制——计算器的清除按钮标题在 AC 与 C 之间变化,靠指纹重建路径才能继续点中。
第二个是后台写入:TextEdit 在后台(前台是计算器)时,computer_act action=set_value 直接写入文本,之后用 osascript 回读一致。
第三个是 OCR 通道:打开一张 PNG(用 Preview),辅助功能树里没有任何文本节点;computer_read 用 Vision 逐行识别,并把每行的 x / y / width / height 一并返回。返回的坐标是屏幕 point,可以直接交给 computer_mouse 的 centerX / centerY,也可以先按文字判断这一行是什么、再决定点不点。
原生助手与无运行时依赖¶
截图走系统自带的 /usr/sbin/screencapture;鼠标、键盘和辅助功能操作由一个 Swift 助手(native/ComputerUse.swift)完成,首次使用时用 xcrun swiftc 编译,产物缓存在 ~/.dsh/computer-use/bin/dsh-cu,按源码哈希缓存,升级插件会自动重编。仓库里不打包 DMG、不拉 driver 进程、也没有预编译二进制。它刻意不依赖 pyautogui / cliclick / robotjs,单个约 120 KB 的静态可执行文件,只链 AppKit/CoreGraphics,命令通过 argv 传 JSON、stdout 回 JSON。
找不到编译器时,工具会返回「先跑 xcode-select --install」,而不是静默失败。
鼠标键盘另有一个轻量助手 native/CUInput.swift,只链 CoreGraphics,首次调用后以 unix socket 常驻 daemon(空闲 15 分钟自动退出),省掉每次调用的进程启动开销。README 记录的本机实测延迟(M 系列,daemon 已热):
| 操作 | 普通模式 | game 模式 |
|---|---|---|
move(绝对/相对) |
~30 ms | ~0.2 ms |
key 单键 |
~50 ms | ~10 ms |
click 单击 |
~45 ms | ~5 ms |
sequence 连招 |
一次调用走完,总耗时 = 各步之和 | 同左 |
game: true 会砍掉事件间隔(按下-抬起 3ms、连发间隔 40ms),换取最低延迟。README 明确说明这些是「把输入发得又快又稳」的手段,不用于绕过平台的人机验证或反作弊。
坐标与已知限制¶
坐标统一是屏幕 point,原点在主屏左上角。截图默认降采样到 point 尺寸,所以「图上的像素」就是「点击的 point」;窗口或区域截图返回值里还带 origin 和 pointsPerPixel 用于换算。截图默认落在 $TMPDIR/dsh-computer-use/,20 分钟后自动清理。
使用边界:
- 只实现 macOS,其他平台的工具会直接说明不支持。
- 输入是全局合成事件,发给当前前台窗口,插件不会自己切窗口。先用
computer_windows确认,必要时activate。 type走 Unicode 事件直接插入文本,不经过输入法候选;个别只认物理键位的游戏或远程桌面可能无效。- 自绘界面(部分 Electron、游戏、画布)可交互元素很少,退回 OCR + 坐标点击。
computer_read的 OCR 默认zh-Hans + en-US、精确模式、原分辨率;窗口级约 0.3–1 秒,整屏可能要十几秒。只要文字时用computer_read,不要用截图硬猜。OCR 语言顺序有讲究,zh-Hans必须在最前,en-US在前会让中文识别质量下降。- 定位不到元素返回
element-not-found,并建议重新读屏或改用坐标;权限缺失会说明是哪一项、去哪个系统面板开。
适用场景与注意¶
适合:在 macOS 上做桌面自动化、需要读写后台窗口、或者要按界面语义而不是坐标驱动 Agent 的场景。自带 Swift 助手意味着原生逻辑全部可审计,不需要信任外部二进制。
需要注意:插件以当前 DSH 进程的权限运行,键盘鼠标事件是全局合成事件,因此它能驱动的是当前前台窗口。安装前建议先读一遍 GitHub 仓库源码并确认许可证(package.json 声明为 MIT),同时确认 cordis.patch.yml 里的 allowInput 与 blockedApps 是否符合自己的安全预期。
社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系,本文只整理该插件的公开实现细节。
小结¶
dsh-computer-use 的价值在于把「读屏」收敛成一个工具、把「操作」优先落在语义定位上,再拿一套 point 坐标把 AX 与像素两条路径接起来。整套方案没有外部运行时,macOS 加两项系统授权即可跑通。
- 目录页:https://www.skillhub.cn/plugins/lqq151510/dsh-computer-use
- GitHub:https://github.com/lqq151510/dsh-computer-use