dsh-plugin-chrome:給 DSH 會話一個看得見的 Chrome 窗口

前言

讓 Agent 幹瀏覽器裏的活,常見的做法是起一個 headless 瀏覽器:Agent 在裏面點按鈕、填表單,把截圖和日誌回傳給你。整個過程接近黑盒——頁面沒加載出來、選擇器失效、被登錄框擋住,你只能看日誌猜,想插手也沒有入口。

dsh-plugin-chrome 走的是另一條路:每個 DSH 會話開一個真實的、可見的 Chrome 窗口,畫面即時串流到 Web GUI,你在旁邊看着 Agent 操作,隨時可以自己點幾下接管。下面介紹它的功能、安裝和用法。

這是什麼

dsh-plugin-chrome 是 DeepSeek Harness(DSH)的瀏覽器可視化插件,由 jiaererw 維護,MIT 許可證,代碼在 GitHub 開源。它解決的問題是:Agent 操作瀏覽器時,你既能即時看到它在做什麼,也能隨時手動介入。

DSH 的理念是一切皆插件。這個插件裝進 profile 後,會話頂部會多出一個 Chrome 標籤頁,Agent 則自動獲得一套瀏覽器工具。

核心功能

每個會話一個可見窗口

每個 DSH 會話擁有一個可見的真實 Chrome 窗口(非 headless),使用隔離的 user-data-dir,不與日常瀏覽器混用。Agent 的每一步操作都能直接看到。

即時畫面串流

Web GUI 的 Chrome 標籤頁通過 Chrome screencast 即時串流窗口畫面,頁面活躍時幀流順暢。空閒頁面由心跳兜底強制截幀——靜默 3 秒後約每 2 秒一幀,畫面不會凍結。

16 個 chrome_* 工具

chrome_open / chrome_status / chrome_close / chrome_navigate
chrome_tabs / chrome_snapshot / chrome_screenshot / chrome_click
chrome_click_at / chrome_fill / chrome_type / chrome_press_key
chrome_hover / chrome_scroll / chrome_evaluate / chrome_wait

其中 chrome_tabs 覆蓋列表 / 新建 / 關閉 / 選擇四種操作;快照、截圖與點擊始終作用於當前選中的標籤頁。

快照與截圖

chrome_snapshot 返回帶穩定元素 uid 的緊湊可訪問性樹,點擊與填寫直接以 uid 爲目標,比傾倒整個 DOM 輕得多,也不容易因頁面結構變動而失效。

chrome_screenshot 是雙通道設計:圖片塊送入模型上下文,讓模型“看到”頁面;同時保存到面板的會話截圖歷史,歷史條目保留標題、URL、尺寸元數據,跨重啓保留。

安全設計

  • CDP 不暴露固定端口;
  • Web API 拒絕跨站請求(基於 Sec-Fetch-Site),並對 sessionId 做白名單校驗;
  • 瀏覽器數據按會話隔離。

資源治理與生命週期

  • 空閒窗口自動關閉,默認 10 分鐘,可配置;
  • chrome_close 顯式關閉;插件卸載或宿主關閉時,會關閉它打開的所有窗口;
  • 懶啓動:只在首次 chrome_* 調用或面板 Open 按鈕時才啓動 Chrome;
  • 孤兒收養:DSH 異常退出遺留的 Chrome,插件通過 DevToolsActivePort 重連接管,而不是報錯失敗;
  • 自動標籤頁恢復:每次操作確保存在可用標籤頁,避免窗口全是 chrome:// 內部頁時無法工作。

安裝與啓用

前置條件:已安裝 DeepSeek Harness (DSH),機器上有 Chrome 或 Edge;插件要求 Node >= 20。

官方安裝命令:

npx -p @deepseek-ai/dsh dsh plugin --profile web add github:jiaererw/dsh-plugin-chrome

本地開發可以用本地路徑安裝:

npx -p @deepseek-ai/dsh dsh plugin --profile web add D:/harness/dsh-plugin-chrome

安裝後需重啓 DSH,每個會話頂部會出現 Chrome 標籤頁。

兩個可能遇到的問題:

1、如果 profile 的 cordis.patch.yml 裏還保留着舊的 dsh-plugin-chrome 手動掛載行(本地開發時加的),先移除再用 CLI 安裝,避免雙重掛載;
2、pnpm 的 strict-dep-builds 可能阻止安裝:在 profile 的 pnpm-workspace.yaml 的 allowBuilds 中加入 dsh-plugin-chrome: true 後重試。

配置

配置通過 profile 的 cordis.patch.yml 覆蓋插件行(整體替換):

- id: dsh-plugin-chrome
  config:
    headless: false            # 保持 false——可見窗口是本插件的意義
    executablePath: ''         # 留空自動檢測 Chrome/Edge,也可填絕對路徑
    idleTimeoutMs: 600000      # 空閒自動關閉(0 禁用)
    windowWidth: 1280
    windowHeight: 900
    screencastFrameSkip: 4     # 畫面抽幀(1 = 最流暢)
    screencastQuality: 70      # JPEG 質量 1-100
    maxSnapshotText: 60000     # 單次快照最大字符數
    maxTabs: 16
    extraArgs: ''              # 額外的 Chrome 啓動參數

瀏覽器數據與截圖存放在 ~/.dsh/data/dsh-plugin-chrome/sessions/<sessionId>/,可用 dataRoot 覆蓋。

典型用法

讓 Agent 執行一句自然語言指令:

Open Chrome, go to https://example.com, take a screenshot, then click the “Login” button and fill in the username.

對應的工具流程是:chrome_open → chrome_navigate → chrome_screenshot(模型看到圖片)→ chrome_snapshot(拿到 uid)→ chrome_click / chrome_fill。

面板側的操作:

1、打開會話頂部的 Chrome 標籤頁,Live view 持續顯示窗口畫面;
2、側欄可以創建、切換、關閉標籤頁,與真實窗口同步;
3、隨時手動點擊真實窗口接管,Agent 下一次工具調用就能看到你的變更;
4、每次 chrome_screenshot 都存入面板截圖歷史,點擊縮略圖可放大查看。

幾個常見情況的處置:

  • 自行關閉窗口後不用重裝,任意下一次 chrome_* 調用或面板 Open 按鈕會重新啓動;
  • Agent 報 “unknown uid” 說明頁面已經變了,讓它重跑一次 chrome_snapshot;
  • 面板黑屏時先檢查窗口是否在運行(頂部狀態點),首次啓動需要幾秒。

適用場景與注意事項

適合的人:

  • 想即時盯着 Agent 瀏覽器操作、不放心純日誌回傳的;
  • 調試瀏覽器自動化流程,需要看現場而不是猜日誌的;
  • 有登錄態需求的任務——每個會話使用隔離 profile,登錄態不與日常瀏覽器互通(設計如此)。如需登錄,讓 Agent 在會話內完成,登錄態在會話內持久。

注意事項:

1、純文本模型慎用截圖。chrome_screenshot 會把圖片塊寫入會話歷史,若模型不接受圖片,後續每輪都會被拒絕(UNSUPPORTED_CONTENT: does not accept image input)且會話不再響應,重試無效。需要截圖的會話請使用支持視覺的模型,或在該會話中避免 chrome_screenshot;
2、headless 配置應保持 false,可見窗口是這個插件的核心;
3、安全提醒:插件以當前 dsh 進程的權限運行,安裝前請自行檢查源碼與許可證(本項目爲 MIT)。文中提到的社區目錄 skillhub.cn 是獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-plugin-chrome 把 Agent 的瀏覽器操作從黑盒變成現場:窗口可見、畫面即時、隨時接管,16 個工具加生命週期兜底讓它能在會話里長期穩定跑。如果你在用 DSH 做瀏覽器相關任務,值得一裝。

  • 目錄頁:https://www.skillhub.cn/plugins/jiaererw/dsh-plugin-chrome
  • GitHub:https://github.com/jiaererw/dsh-plugin-chrome
羽毛球分组比赛记分
小程序二维码

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

小夜