前言¶
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