用 dsh-genui 在 DeepSeek Harness 回答裏內聯渲染交互界面

前言

DeepSeek Harness(命令是 dsh)是 DeepSeek 開源的智能體運行時,目前仍是開發者預覽版。官方倉庫把設計概括成一句話:Everything is a Plugin——模型、工具、技能、會話、沙箱、存儲、循環、調度,一直到界面,都可以用插件增刪,不必改框架源碼。啓動 Web 界面的官方入口是:

npx @deepseek-ai/dsh web

真正對着網頁會話提問時,另一個缺口很快出現:回答多半還是一段文字、一張 Markdown 表格,或者一塊靜態代碼。問「這個月訂單怎麼樣」,模型會給出收入、環比、轉化率,但趨勢圖、統計卡、刷新按鈕都不會出現在回覆裏。想再看一眼,只能再打一段字。

dsh-genui 就是衝着這件事來的。模型把界面描述寫成 JSON,放進 dsh-ui 圍欄;瀏覽器端渲染器把它畫成卡片、圖表、表單、測驗,組件就嵌在回答中間。點刷新、拖滑塊、交卷,有的交互本地立刻完成,需要模型參與的會回傳,再更新同一塊界面。

本文按社區目錄詳情頁、GitHub 倉庫 README / SKILL.md / package.json / CHANGELOG.md,以及 DeepSeek Harness 官方倉庫 交叉覈對後整理。需要先說明一點:下文提到的插件目錄站點 deepseek-harness-plugin.com 是獨立的社區目錄,與 DeepSeek / 幻方沒有官方從屬關係,不能當成官方應用商店。

這是什麼

dsh-genui 是一款面向 DeepSeek Harness Web 界面的界面增強插件,由 GitHub 組織 omdsh-dev 維護,倉庫地址:https://github.com/omdsh-dev/dsh-genui 。npm 包名爲 @omdsh-dev/dsh-genui,許可證 MIT,主要語言 TypeScript。倉庫掛了 dshdsh-plugin 兩個 topic。社區目錄把它歸在「界面增強」,收錄日期 2026-08-15。

截至 2026-08-17,GitHub 倉庫約 147 星;目錄頁當時顯示 88 星。星標以倉庫一手數據爲準。當前 package.json 版本爲 0.8.6(CHANGELOG 標註日期 2026-08-16)。package.json 裏的 dsh.client.platformweb,也就是說它掛在網頁會話上,不是終端 TUI。

它解決的問題很具體:讓助手回覆不只是文字。模型輸出一份白名單 JSON,渲染器在圍欄所在位置畫出真實組件;不裝插件時,這段圍欄只是普通代碼塊,不報錯,也不污染會話。倉庫同時帶三樣東西:教模型寫圍欄的宿主插件、瀏覽器端渲染器,以及一份可複製到技能目錄的 SKILL.md

核心功能

回答即界面

組件嵌在回覆裏,不是單獨一張工具卡片。README 的對比很直接:普通回答是「本月收入 ¥128,430,環比 +12.4%,建議關注轉化率」;裝上插件後,同一段分析旁邊會渲染統計卡、趨勢圖、進度條。圍欄一閉合就開始渲染,不必等整段回覆寫完。

模型輸出的圍欄長這樣(寫給瀏覽器看的,日常使用不必手寫):

{"title":"訂單概覽","items":[
  {"type":"stat","label":"總收入","value":"¥128,430","delta":"+12.4%"},
  {"type":"stat","label":"訂單數","value":"1,024","delta":"-3.1%"}
]}

渲染結果是兩張統計卡片。delta- 開頭顯示爲紅色,以 + 開頭顯示爲綠色。

雙通道渲染

插件自帶兩套渲染通道,啓動時自動選擇,不綁定某一個 dsh 構建:

  • Registry 通道:宿主提供 fence-registry 擴展點時,圍欄走宿主流式渲染管線。
  • DOM 通道:宿主沒有該擴展點時(包括原版 DSH 與部分舊構建),插件觀察會話 DOM,自行掛載渲染樹。自 0.7.2 起 DOM 通道支持流式渲染:模型寫到哪,組件就出現到哪。自 0.8.3 起圍欄發現是多表面的,同時匹配標準 md-code-block、部分宿主使用的 .code-block / .code-block-small,並以 banner 標註 dsh-ui 的結構做兜底。

兩條通道上,組件、交互、面板和持久化行爲一致。CHANGELOG 0.8.6 還修了原版 DSH 0.1.0-rc.6 上因硬注入 inputTriggers 導致圍欄靜默不渲染的問題:該項改爲可選訂閱,缺服務時只是不註冊 /panel,渲染本身不受影響。

三十多種組件

SKILL.md 把允許的 type 列成一張白名單,模型不能另起爐竈。按用途大致是:

  • 佈局textrowcolgridcarddividerspacer
  • 展示statbadgeprogresslisttablekeyvaluetimelinefile-treediffjsoncodecalloutsteps
  • 圖表chart(柱狀 / 折線 / 環形)、plot(數學函數圖,參數滑塊可即時重繪,可選自動動畫)
  • 交互buttoninputselectcheckboxradioswitchtextareatabsaccordioncopysubmit
  • 高級mermaid(流程圖、時序、甘特等)、scene3d(少量 mesh 的 3D 場景)、quiz(點選判題、解析、重試)

表格表頭點擊可本地排序;文件樹目錄可本地摺疊。這些都不走模型。

本地優先,再回傳模型

文檔把交互分成兩層。UI 自己能做的事——判卷、判題、重置、展開、選中——一律本地即時完成。action 只留給必須模型參與的步驟:生成新內容、執行工具、給下一步建議。

具體約束來自 README 和 SKILL.md

  • 交互組件必須帶 action。不帶的按鈕渲染爲禁用態,避免「看着能點、點了沒反應」。
  • action 的按鈕點擊後立刻顯示「已觸發」。這隻證明本地事件已經發出,不代表模型已經收到。
  • 按鈕、開關、輸入、下拉、複選、單選、文本域、測驗帶 action 時,點擊或失焦會回傳模型,模型再更新界面。同名 action 做 300ms 尾沿防抖,連點合併爲一次,最後一次的值生效。
  • 多道選擇題可以做成卷子:每題一個帶 groupanswerexplanationradio,最後放一個 submit。用戶全部選完再點一次,分數、對錯和解析當場出現,零模型往返;題目隨後鎖定。「重新作答」在本地重置,可選 resetAction 通知模型。
  • 答案、交卷鎖定、輸入值按「會話 + 內容指紋」保存,上限 200 塊 LRU。刷新或重開會話,同一塊 UI 的狀態會恢復;內容變了則從頭開始。
  • GenUI 不得索取密碼、API Key、訪問令牌、恢復碼等祕密。即使出現密碼輸入,也保持打碼,不持久化,不進入表單收集。

工具通道和會話面板

圍欄適合「回答裏的界面」。交付物型 UI 可以走 render_ui 工具,把同一份 spec 畫成工具行卡片。

會話面板是輸入框上方的常駐區域:render_uipanel: true 的圍欄會原地更新同一塊表面。客戶端命令:

  • /panel:打開面板
  • /panel <指令>:把定製需求轉給模型
  • /panel clear:清空

頂邊框可拖拽調高。append: true 做增量合併:同名標籤頁追加內容,新標籤頁新增。整面板默認最多 200 個節點、200 條追加,到上限後模型應發送 replace 重建。0.8.6 在面板頭部加了關閉按鈕,效果與 /panel clear 相同。

規格守衛和體積

每個圍欄會過一遍規格守衛:壞節點靜默丟棄,數值鉗位,字符串截斷。整棵組件樹上限是 200 個節點、8 層嵌套。SKILL.md 還要求 JSON 必須嚴格合法:插件只修字符串內半角引號、尾隨逗號這類標點級小錯;缺括號、錯括號等結構錯誤不修,直接退化成帶紅橫幅的代碼塊。

mermaid 渲染失敗會先自動修復再試(剝反引號、給含中文或空格的標籤加引號),仍失敗才降級顯示源碼。組件是白名單,模型塞不進 HTML 或腳本;函數表達式走獨立解析器,不用 eval

主渲染包約 110 KB(minify)/ 28 KB(gzip)。mermaid 和 three.js 單獨打成按需資產,首次用到時經插件自注冊的 HTTP 路由加載,啓動時只下載渲染核心。

安裝與啓用

社區目錄頁給出的安裝命令是:

dsh plugin add github:omdsh-dev/dsh-genui

如需可復現安裝,目錄頁建議固定 commit 哈希:

dsh plugin add github:omdsh-dev/dsh-genui#<commit>

<commit> 換成倉庫裏實際的提交哈希。插件以當前 dsh 進程的權限運行,安裝時可能執行代碼,安裝前應檢查源代碼倉庫和許可證。

維護者 README 寫的是 Web profile 上的 git URL 安裝(公開倉庫,不需要 npm 賬號)。當前 package.json 標明 npm 包尚未作爲安裝主路徑,FAQ 也寫明 @omdsh-dev/dsh-genui 在 npm 上會 404。若目錄頁那條命令沒有把插件裝進網頁會話,按 README 使用下面這條:

dsh plugin --profile web add git+https://github.com/omdsh-dev/dsh-genui.git

前置條件有兩條,缺一不可:

  1. 已經安裝 dsh。開源版任意構建都可以,插件啓動時會自己選渲染通道。
  2. pnpmPATH 上,dsh plugin 依賴它。沒有就執行 corepack enablenpm i -g pnpm,然後新開一個終端,確認 pnpm -v 有輸出。

package.json 還聲明瞭運行環境:Node.js ^22.19.0 || >=24.0.0,pnpm >=11.7.0 <12;一組 @deepseek-ai/dsh-* peer 依賴對齊 ^0.1.0-rc.6,Cordis 爲 @deepseek-ai/cordis@^4.0.1

不要對剛 clone 下來、還沒裝依賴的目錄使用 link:。README 寫明 link: 不會安裝 mermaid / three / react,裝完渲染器會壞。本地開發迭代才用:

cd dsh-genui
pnpm install
dsh plugin --profile web add link:$PWD

clone 後也可以跑倉庫裏的一鍵腳本,它會檢查 dshpnpm 和倉庫可達性,再按 git URL 安裝,並把 SKILL.md 同步到技能目錄:

git clone https://github.com/omdsh-dev/dsh-genui.git
cd dsh-genui
./scripts/install.sh

默認裝進 web profile;./scripts/install.sh tui 可以指定別的 profile 名。裝完後重啓 dsh web,瀏覽器硬刷新(macOS 上是 Cmd+Shift+R),在新會話裏說「用 dsh-ui 畫個統計看板」做驗證。也可用 dsh plugin --profile web list 確認列表裏有本插件。

典型用法

讓模型主動出圍欄

新會話在重啓後纔會帶上插件教給模型的圍欄詞彙。如果模型仍只回文字,直接說「用 dsh-ui 輸出」即可。SKILL.md 也可以複製到 ~/.dsh/skills/genui/(安裝腳本還會同步到 ~/.agents/skills/genui/),用來增強模型對組件語法的遵循。

倉庫的 demo-prompts.md 提供了四幕演示腳本,用來展示佈局與數據、交互組件、函數圖 / 測驗 / mermaid / 3D,以及點擊按鈕後模型更新面板的事件循環。日常使用不必按腳本走,它更適合對照 README 裏的演示視頻看能力邊界。

事件循環怎麼轉起來

第四幕的官方示例是一塊「服務器監控面板」:四個統計卡、自動刷新開關、刷新按鈕、環境選擇。按鈕和選擇器都帶 action。用戶點「刷新數據」或切換環境後,模型收到 [genui-action],再用新的 dsh-ui 圍欄更新數值。這是文檔裏寫明的雙向互動,不是額外裝的工作流插件。

常見故障

README 的 FAQ 把幾類現象寫死了,安裝後可以對着查:

  • 顯示成代碼塊:確認當前 dsh 構建能走 fence-registry 或 DOM 通道兜底;dsh plugin --profile web list 裏有本插件;已經重啓並硬刷新。
  • 渲染圍欄時聊天界面白屏:dsh 版本過舊,先更新 dsh 再重裝插件。
  • dsh: pnpm not found on PATH:裝好 pnpm 後新開終端再試。
  • 安裝卡在 git 憑據或 404:倉庫是公開的,git URL 不需要登錄;對 @omdsh-dev/dsh-genui 的 404 表示 npm 包尚未發佈,應改用 git URL。
  • scene3d / mermaid 不渲染:這兩個引擎按需加載(/plugins/@omdsh-dev/dsh-genui/assets/*.js)。先重啓並硬刷新;仍不行就卸掉重裝:
dsh plugin --profile web remove @omdsh-dev/dsh-genui
dsh plugin --profile web add git+https://github.com/omdsh-dev/dsh-genui.git

舊版宿主缺少資產路由時會降級顯示源碼或加載失敗提示,更新 dsh 即可。

適用場景與注意事項

適合已經在用 DeepSeek Harness Web UI、希望回答裏直接出現結構化界面的人。比較對口的內容包括:指標看板、方案對比表、流程 / 步驟、測驗與本地判卷、函數曲線演示、少量 3D 幾何說明。SKILL.md 的判斷口訣是:換成結構化組件會不會比純文字更好掃、更好懂、更好操作;會就用,不必等用戶開口要 UI。一句話能說清的事、純閒聊、用戶明確不要 UI,以及跟內容無關的 3D 炫技,文檔要求別用。

使用前注意這幾條:

  1. 權限與來源。目錄頁寫明:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。安裝前檢查 GitHub 源碼和 MIT 許可證;生產環境建議固定 commit。該目錄不是 DeepSeek 官方商店,收錄不等於背書。
  2. 只覆蓋 Webpackage.json 聲明 platform: web。終端 TUI、無界面的 headless 運行不是它的目標。
  3. 依賴 pnpm 和較新的 dsh。缺 pnpm 裝不上;過舊的宿主可能白屏,或缺少 mermaid / three 的資產路由。
  4. 規格上限。整樹不超過 200 節點、8 層嵌套,超出會被裁掉。複雜 spec 可先走 validate_dsh_ui 工具(SKILL.md 要求:不少於 3 個組件或含長表格時先驗後發)。
  5. 不要收集祕密。插件規範禁止在 GenUI 裏要密碼和密鑰;即便界面裏出現了密碼框,也不會持久化、不會進表單收集。
  6. 不要用 link: 走捷徑。剛 clone 的目錄沒有依賴,渲染器會壞。公開安裝用 git URL;本地開發先 pnpm install 再 link。

小結

dsh-genui 把「回答」從純文本擴成可交互界面:模型寫 dsh-ui 圍欄,瀏覽器按白名單把 JSON 畫成組件。雙通道渲染讓原版 DSH 和新構建都能用;本地優先的交互避免無意義的模型往返;事件循環則把刷新、篩選這類操作接回智能體。它是社區 MIT 項目,不是官方內置功能。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-genui/

GitHub:https://github.com/omdsh-dev/dsh-genui

羽毛球分组比赛记分
小程序二维码

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

小夜