前言¶
DeepSeek Harness(DSH)採用「一切皆插件」的理念,把擴展能力交給社區。在開發 Computer Use 類任務時,一個常見問題是:模型能看到屏幕,卻很難「等」界面變化,只能反覆盲猜重試。ccr-wer/dsh-copilot-vision(Vision-Pilot)是一個面向 DSH 的 Computer Use 增強插件,把視覺差分、位置編碼與人機共駕授權組合在一起,讓模型既能看,也能等,還能精準操作。
插件定位¶
- 名稱:Vision-Pilot(dsh-copilot-vision)
- 維護者:ccr-wer
- 分類:工作流
- 定位:Computer Use 增強插件,純 JS 實現,支持視覺差分、網格位置編碼、長程任務閉環與人機共駕授權。
核心能力¶
雙軌執行¶
本地軌道通過 robot-ts 直接操作 Windows 屏幕(捕獲、鼠標註入、鍵盤注入、底層鉤子);src/vp-ssh-core.js 預留了遠程軌道接口,當前發版只啓用本地軌道。
動態視覺感知¶
vp_screenshot_diff:用 pixelmatch 逐像素比對歷史截圖,合併 4 鄰域連通塊,丟棄小於 100 像素的噪聲,把「哪裏變了」交給模型。vp_wait_change:每 100ms 在內存裏截屏比對,變化出現時才落一張正式截圖,零落盤;換顯示器或改縮放後會報錯,不重採樣硬算。- 網格放大圖不再固定 4 倍:按區域面積自適應倍率(≤50,000 物理像素 4x、≤200,000 2x、更大 1x 只畫網格),放大後單邊 ≤2,000 像素,避免細長條被放大成畸形長圖。每個區域以
gridScale字段標明實際倍數。
位置編碼注入¶
每個差分區域附一張 gridPath 放大圖,按區域面積與單邊長度自適應倍率(4x / 2x / 1x,放大後單邊 ≤2,000 像素)的最近鄰放大,每 20 物理像素一條半透明紅線,網格原點是區域左上角。模型只負責數格子、報百分比,vp_click_relative 完成精確換算。
人機共駕安全¶
授權採用三態:unauthorized / pending-persistent / persistent。鐵律是「授權只由人的動作進入和撤銷,不由時鐘改變」——沒有到期時間,持續授權等再久都不失效。
- 進入授權:按 Shift+Space 直接進入持續授權;或模型調用
vp_request_auth(mode='persistent'),在宿主問答卡片上確認一次。 - 急停:任何時候再按一次 Shift+Space,立即回到
unauthorized。這是物理熱鍵,不經過模型、不依賴宿主 UI。 - 熱鍵失效即收權(Fail-Closed):EventTap 啓動失敗、監聽線程退出、心跳(默認每 2 秒)發現鉤子不再活躍,都會立刻把狀態強制收回
unauthorized並寫一條revokeAll審計。 - 撤銷與注入競態:每個動作在放行時記下授權代數,真正調用 robot-ts 前再用微任務同步複覈一次。人按撤銷的瞬間,正在飛的這一下最多落到「已執行的移動」爲止,後續注入立即中止。
- 等待可被打斷:
vp_wait_change輪詢期間一旦授權被撤銷,立刻拋「授權已被撤銷,等待中斷」。 - 未授權即攔截:
vp_click/vp_click_relative/vp_type/vp_key在未授權時直接拋錯並提示人類開啓持續授權。 - 審計:JSON Lines 記錄每次授權遷移,以及每次注入的放行/拒絕(
actionAllowed/actionDenied),只記動作與工具名。
語義級記憶壓縮(vp_summarize)¶
臨時圖會跨會話堆積。vp_summarize 讓模型在任務週期結束、準備收工或切換任務時主動做一次收尾:
keepShotIds裏的關鍵截圖被移進archives/子目錄,索引路徑同步更新。summary連同本次保留清單追加寫入archive-summary.txt。- 當前目錄下其餘所有臨時碎片立即刪除,返回各類碎片數量。
保護區:audit.log、shot-index.json、archives/ 永遠不會被刪除;被清理掉的 shotId 在索引裏保留條目。
工具集¶
| 工具 | 功能 |
|---|---|
vp_screenshot |
截主屏全屏,返回 shotId。 |
vp_screenshot_diff |
與歷史截圖逐像素差分,輸出差異區域 + 網格放大圖。 |
vp_wait_change |
高頻輪詢等待屏幕變化,變化即返回;超時不消耗 shotId。 |
vp_click |
按絕對物理座標點擊(需持續授權)。 |
vp_click_relative |
在差分區域的網格圖內按相對百分比點擊(需持續授權)。 |
vp_type |
在當前焦點輸入一段文本(Unicode 直注,中英文通喫;絕不自動回車;需持續授權)。 |
vp_key |
發送一次按鍵或組合鍵(enter / tab / esc / ctrl+c);回車只能由它觸發;需持續授權。 |
vp_request_auth |
請求人類開啓持續授權(僅 mode='persistent'),經宿主問答卡片等待確認。 |
vp_auth_status |
只讀查詢授權狀態、熱鍵可用性與審計日誌路徑。 |
vp_summarize |
歸檔關鍵截圖、寫入總結,清空其餘全部臨時碎片。 |
長程任務工作流(OSA V Loop)¶
這段協議內嵌在全部 10 個工具的 description 裏,模型每次調用都會被提醒:
- 觀察 Observe——每步開始前,用截圖或差分確認當前屏幕狀態。
- 行動 Act——點擊目標(絕對座標或相對百分比)。
- 等待 Wait——點擊後必須立刻
vp_wait_change。絕對禁止連續兩次點擊(盲點)。 - 驗證 Verify——結合變化區域與超時判斷是否達標;
timeout:true意味着可能失敗或卡死,必須重新截圖觀察、重新規劃。
安裝與啓用¶
從 npm 安裝:
DSH_HOME=<DSH_HOME> dsh plugin --profile web add dsh-copilot-vision
從本地 tarball 安裝(開發調試):
npm pack
DSH_HOME=<DSH_HOME> dsh plugin --profile web add file:<絕對路徑>/dsh-copilot-vision-1.3.2.tgz
宿主支持 web(問答卡片授權)、headless(無 UI 答者,只能 Shift+Space,需真人在場)、desktop(待審覈後內置驗證)。
限制與邊界¶
- 輸入能力邊界:支持鍵盤輸入(
vp_type文本 /vp_key按鍵與組合鍵);不支持拖拽、滾輪、雙擊。 - 輸入法干擾:中文輸入法會吞掉掃描碼注入的字母鍵;插件對無修飾鍵的字符鍵改走 Unicode 直注,但組合串仍可能被
vp_key enter一起提交。 - 聊天窗口自干擾:宿主聊天窗口的流式重繪會被當成屏幕變化;等頁面加載時,先把聊天窗口移出主屏或最小化。
- 鼠標移動不可檢測:Windows 屏幕捕獲不含硬件光標,挪鼠標不產生任何像素變化。
- 熱鍵無法區分真人與合成按鍵;真正的護欄在插件之外。
- 靜默摘鉤不可觀測:Windows 若在消息循環仍在跑的情況下靜默卸掉低層鉤子,綁定層看不到;心跳無法判定失效。
- 無熱鍵時的殘餘風險:EventTap 啓動即不可用時,插件不會自動收權,但人仍可通過
vp_request_auth卡片確認進入persistent。 - 索引併發:截圖索引整份覆蓋寫、不做跨進程併發保護,多進程共用
VP_SHOT_DIR會互相覆蓋。 - 臨時目錄衛生:超過 3 天的差分/網格切片會在插件啓動時被自動清理;模型在收工時調用
vp_summarize會把關鍵截圖歸檔。
適用場景與注意¶
適合需要「看、等、操作」閉環的 Computer Use 任務。插件以當前 DSH 進程權限運行,安裝前應檢查源碼與許可證。
小結¶
Vision-Pilot 把視覺差分、網格位置編碼與人機共駕授權整合進 DSH 生態,讓模型既能「看」屏幕,也能「等」變化,還能「精準」操作。通過持續授權與物理熱鍵急停,將安全與可控性前置。
- 插件目錄頁:https://www.skillhub.cn/plugins/ccr-wer/dsh-copilot-vision
- GitHub:https://github.com/ccr-wer/dsh-copilot-vision