前言¶
在 DeepSeek Harness(DSH)裏讓智能體「上網」,常見做法要麼是抽象 HTTP 抓取,要麼用無頭瀏覽器但無法處理登錄、驗證碼和二次驗證。許多站點還會在 iframe 裏被 X-Frame-Options 擋住,登錄態也難在人和 Agent 之間交接。
@noext34/dsh-browser(倉庫 Noext/dsh-browser)把一臺真實的 Chromium 嵌在 DSH 右側邊欄:Agent 通過工具驅動頁面,遇到需要人工的步驟時你可以接管同一瀏覽器、同一配置與 Cookie,完成後再交回。維護者爲 Noext,在 SkillHub 社區目錄中歸類爲聯網工具。
這是什麼¶
一句話:dsh-browser 在 Host 上啓動 Chromium,用 Chrome DevTools Protocol(CDP)把畫面以 JPEG 串流推到側邊欄畫布,輸入從側邊欄回傳到頁面;Agent 與人共用同一會話、同一 Profile。
與「只在模型裏描述網頁」不同,密碼直接進 Chromium,不進入模型上下文、Session 日誌或截圖(README 中明確說明)。
架構要點¶
Host 側維護一個 Chromium Session;CDP 使用 Page.startScreencast 輸出幀,輸入走 Input.*。鏡像不是 iframe,而是 WebSocket 上的二進制幀,因此登錄頁不被幀策略攔住,且站點 HTML 不進入 DSH 的 DOM。
每個活躍 Agent 對應一個 Chromium Session,兩個 Session 不共享 Cookie;Session 銷燬時關閉瀏覽器。鏡像按側邊欄 CSS 尺寸做 1:1 視口模擬(至少 360×300),點擊座標與頁面所見一致。
Agent 可用工具¶
安裝後,Agent 獲得一組 browser_* 工具:
| 工具 | 作用 |
|---|---|
browser_open |
打開地址並返回頁面文本 |
browser_read |
讀取當前頁可見文本 |
browser_click |
點擊 CSS 選擇器或座標點 |
browser_type |
輸入文本,可選提交 |
browser_press |
按鍵(Enter、Tab、方向鍵等) |
browser_screenshot |
捕獲 PNG 持久圖像 |
browser_navigate |
後退、前進、刷新 |
browser_tabs |
列出、切換、新建或關閉標籤 |
browser_request_human |
請求人工接管並等待交回 |
當人類處於接管狀態時,上述工具會失敗,並提示:a human is controlling the side-panel browser; wait for them to hand it back。
人機交接(handover)¶
同一租約有三種狀態:idle(無人駕駛)、agent(工具可用)、human(拒絕一切 browser_*,側欄顯示 You are driving)。
- 在工具欄點 Take control 接管瀏覽器。
- 完成後點 Done — hand back 交回 Agent。
- Agent 調用
browser_request_human時,頁籤會顯示原因橫幅,工具調用阻塞直到你交回、超時或取消。
若長時間無操作,接管會在 humanIdleMs 後自動失效,避免 forgotten 標籤長期鎖住 Agent。
安裝與啓用¶
插件面向 web profile,npm 包名爲作用域包 @noext34/dsh-browser(npm 上無作用域的 dsh-browser 屬於另一位作者的其他插件)。
當前 package.json 版本爲 0.2.3,要求 Node >=24.9.0、DSH >=0.2.0,許可證 MIT。
按 README 安裝並啓動:
dsh plugin --profile web add @noext34/dsh-browser
dsh --profile web
從 npm 安裝可在 Plugins 頁面使用 Update 按鈕;git 安裝不提供 DSH 內的就地更新。更新命令:
dsh plugin --profile web update @noext34/dsh-browser
新代碼在 Host 重啓後加載;運行中版本可通過 GET /api/dsh-browser/status 或 Host 日誌中的 dsh-browser <version> starting 覈對。
Chromium 可執行文件依次從環境變量 DSH_BROWSER_EXECUTABLE、Playwright 緩存(npx playwright install chromium)、常見系統路徑發現;可用配置項 executablePath 固定路徑。
配置項¶
默認值與含義見 README;前六項可在 Plugins → Browser 頁面編輯,修改寫入 profile 的 cordis.patch.yml,變更項可 Reset to default。
| 字段 | 默認 | 含義 |
|---|---|---|
executablePath |
自動發現 | Chromium 可執行路徑 |
headed |
true |
是否在 Host 顯示器上顯示窗口;false 爲無頭,側邊欄鏡像仍可用 |
persistentProfile |
true |
Cookie 與登錄保存在 $DSH_HOME/browser-profiles |
width, height |
1280, 800 |
初始視口 |
quality |
62 |
鏡像 JPEG 質量 |
maxSessions |
2 |
單 Host 併發瀏覽器數 |
humanIdleMs |
600000 |
人工接管空閒多久後失效 |
idleTimeoutMs |
300000 |
無觀衆且無活動時關閉瀏覽器 |
startUrl |
about:blank |
新瀏覽器打開的地址 |
chromiumArgs |
— | 額外 Chromium 啓動參數 |
示例(YAML 片段):
- id: dsh-browser
config:
headed: false
idleTimeoutMs: 120000
典型用法¶
- 啓動帶 web profile 的 DSH 後,打開右側邊欄,選擇 Browser,輸入地址訪問頁面。
- 或在對話中讓 Agent 操作,例如:
open example.com and tell me what the page says(README 原文示例)。 - 需要登錄或驗證碼時,自己接管完成輸入,再交回 Agent 繼續在已認證頁面工作。
適用場景與注意¶
適合誰:需要在 DSH 工作流裏做真實網頁交互的開發者——查閱需登錄的文檔、填表、多標籤操作,且希望登錄態在人與 Agent 之間無縫傳遞。
安全與權限:瀏覽器擁有獨立於 DSH 沙箱的完整網絡能力;README 要求將 browser_* 視作與 shell 同級權限。Profile 目錄權限爲 0700,可用工具欄 Clear profile 刪除;CDP 綁定隨機本機迴環端口且不對外通告。Host 以 root 運行時 Chromium 使用 --no-sandbox 才能啓動,隔離邊界主要在 Profile 目錄而非渲染器沙箱。
已知限制(README):僅 Chromium;Host 重啓後歷史與未保存表單不保留(persistentProfile 開啓時 Cookie 保留);不支持 Firefox/WebKit;鏡像爲 JPEG,文本清晰度受 quality 影響;模態對話框會自動接受且無法在鏡像中展示。
安裝前請自行閱讀 GitHub 倉庫 源碼與 MIT 許可證;插件在 DSH Host 進程權限下運行,社區目錄 SkillHub 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。
結尾¶
dsh-browser 用真實 Chromium、CDP 串流與租約式人機交接,把「Agent 能瀏覽」和「人能登錄」放在同一 Profile 裏解決,而不是在模型上下文裏重演網頁。