Vision-Pilot:讓模型「看」並「等」屏幕變化的 DSH 插件

前言

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 讓模型在任務週期結束、準備收工或切換任務時主動做一次收尾:

  1. keepShotIds 裏的關鍵截圖被移進 archives/ 子目錄,索引路徑同步更新。
  2. summary 連同本次保留清單追加寫入 archive-summary.txt。
  3. 當前目錄下其餘所有臨時碎片立即刪除,返回各類碎片數量。

保護區: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 裏,模型每次調用都會被提醒:

  1. 觀察 Observe——每步開始前,用截圖或差分確認當前屏幕狀態。
  2. 行動 Act——點擊目標(絕對座標或相對百分比)。
  3. 等待 Wait——點擊後必須立刻 vp_wait_change。絕對禁止連續兩次點擊(盲點)。
  4. 驗證 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
羽毛球分组比赛记分
小程序二维码

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

小夜