前言¶
DSH 的回覆默認是黑字白底的純 Markdown,層次全靠加粗、縮進和 > 引用撐。當你要表達「結論是什麼」「這三步按順序做」「兩邊對比如何」時,純文本往往讀第二遍纔看懂。下面介紹的插件 dsh-rich-response,給模型教了一套小的輸出協議,把回覆渲染成結論卡、要點卡片行、對比表和編號步驟流,而不是給所有文字上色。
先說明兩點事實:插件維護者是 xiangxueyujiandelin,分類爲客戶端;README 頂部帶有醒目警告「調試中,請勿下載」,且星標數爲 0。也就是說協議和渲染器已經實現並通過作者的測試,作者稱已於 2026-11-05 在真實運行的 DSH 桌面版 0.2.2-rc.1 上驗證,但在它去掉調試狀態前,不建議在生產流程中直接掛載。
這是什麼¶
一句話:dsh-rich-response 是一個 DSH 客戶端插件,它不重寫模型,而是讓模型在需要時輸出帶語義標記的塊,客戶端再把這些塊渲染成帶底色和左邊框的卡片。正文保持乾淨,只有明確標記的塊才染色。
它解決的不是「DSH 不好看」,而是「純文本表達結構時缺少載體」:結論、提示、警告、要點、步驟、對比,在原生 Markdown 裏只能靠標題和引用模擬。
核心功能¶
插件定義了兩個塊族:
第一類是語義塊,直接用 GitHub Alerts 語法 > [!NOTE]、[!TIP]、[!WARNING]、[!IMPORTANT]。作者的考慮是這套語法在訓練數據裏到處都有,模型零學習成本。
第二類是結構塊,用 ::: 圍欄承載,包含五種:
summary:頂部結論卡points:要點卡片行,可指定列數table:對比表steps:編號步驟流columns:分欄
渲染後是帶底色和左邊框的卡片,長這樣:
:::summary{title="結論"}
丟失的是**可定位座標**,不是數據本身。
:::
:::points{cols="3"}
- **數據在** — ref 會讀寫,ttl>0 即會話存活
- **入口沒了** — 頁面方式取不回
- **uuid 不可轉** — 無法塞進另一條對循環
:::
着色遵循「顏色即語義」:藍塊是補充,琥珀是警告,綠是結論。底色低飽和,識別主要靠左邊框。作者給出的度量是着色面積約 11%,對比「全面染色」方案的約 38%,後者讀起來更像噪音。
宿主半區會把這套協議的用法(約 400 字)追加到系統提示詞末尾,只提示什麼場景用、什麼場景不用,不做啓發式改寫。客戶端仍然只渲染模型真正寫出來的圍欄,普通回覆走宿主原生 Markdown。
安裝與啓用¶
安裝命令來自 README 原文:
dsh plugin --profile web add github:xiangxueyujiandelin/dsh-rich-response
裝完需要重啓 DSH,因爲 bundle 層在啓動時組裝。桌面版也可以不經 CLI,手動掛載,逐步驟見倉庫裏的 docs/desktop-install.md。
本地開發時:
git clone https://github.com/xiangxueyujiandelin/dsh-rich-response
cd dsh-rich-response
dsh plugin --profile web add .
想讓插件不修改系統提示詞,可以在插件條目裏關掉它:
- insert:
- id: dsh-rich-response
name: 'dsh-rich-response'
config:
enabled: false
按 package.json,插件要求 DSH 引擎版本不低於 0.2.1-rc.2,客戶端平臺爲 web,依賴 @deepseek-ai/dsh-client-ui-theme,許可證爲 MIT。
典型用法¶
不用額外寫配置,裝完後直接正常提問即可。模型會在合適的時候自己輸出圍欄,比如讓它給你一段「先做 X,再做 Y」的操作指引,或結論加依據的結構。下面是一段可對照 README 復現的輸出:
:::summary{title="結論"}
不要直接改這個字段
:::
:::steps
1. 先備份配置文件
2. 再改這個字段
3. 最後用 `dsh plugin --profile web add .` 重裝
:::
部署在團隊協作場景時,可以讓模型把討論過程用 table 塊輸出成對比表,讀者掃一眼就能看清選項差異。
降級與流式輸出¶
模型不配合是常態,插件設計了五級降級,全程不給用戶任何錯誤提示:
- L0 解析成功 → 完整卡片
- L1 可選字段缺失 → 用默認值補齊
- L2 結構非法 → 靜默退回普通 Markdown
- L3 圍欄未閉合 → 按引用塊渲染
- L4 完全沒有標記 → 普通 Markdown(宿主默認)
parseRich 永不拋異常,作者稱用 3000 組 fuzz 用例強制保證這一點。
流式輸出也考慮到了:回覆逐 token 到達時,::: 圍欄常常一段時間沒閉合。實測行爲是閉合前 0 個塊、文本按普通 Markdown 渲染,閉合後 1 個塊、切換成卡片,不閃爍不跳動。渲染層只需一條規則:Markdown 照常渲染,遇到 level 0 的塊才切卡片。
怎麼掛進 DSH¶
插件替換的是一個 keyed 渲染器:
ctx.slots.register(
{ name: 'conversation.chat.node', key: 'assistant-step', priority: -10 },
RichAssistantNodeView,
)
priority: -10 用來遮蔽內置渲染器(內置用默認 0)。推理摺疊、工具調用分組、圖片畫廊、文件提及、turn-process 聯動等其餘部分原樣透傳,不做處理。
自測情況¶
作者給了八套測試共 222 項斷言,運行方式:
npm run test:all
不需要安裝依賴,Node 22+ 即可。套件分佈如下:
parser-test.mjs— 協議解析與降級矩陣(31)semantic-test.mjs— S 族語義塊識別與字符區間(22)verify-build.mjs— 構建產物與源碼漂移(13)check-seam.mjs— 宿主 API 契約(89)register-seam.mjs— 註冊期崩潰與會話切換生命週期(10)host-half-test.mjs— 宿主半區協議注入(15)mutation-test.mjs— 16 個變異,驗證自檢腳本本身(16)render-e2e.mjs— 回覆區整片空白等渲染故障(42)
幾個值得看的點。check-seam.mjs 針對的是第一版猜錯宿主 API、第二版模塊格式用錯導致 DSH 啓動失敗、第三版漏傳 MarkdownText 的 labels prop 造成聊天正文整片空白這三處返工,README 記錄了每個用到的宿主 API 與 DSH 真實產物的對照結果,見 docs/host-seam-reference.md。mutation-test.mjs 則逐條破壞源碼(刪 labels、改 locale、去掉 ErrorBoundary 等),確認對應斷言真的會失敗,避免「斷言全綠只是因爲斷言寫錯」。render-e2e.mjs 用一個按宿主真實行爲寫的假 MarkdownText 跑產物,能復現正文空白這類故障。
適用場景與注意事項¶
適合想給 DSH 回覆增加結構的開發者與團隊。前提是要清楚三點:
第一,插件以當前 DSH 進程的權限運行,安裝前應通讀源碼,確認 index.js(宿主半區)和 client.js(渲染器)的行爲符合預期。許可證是 MIT,作者爲 lin(GitHub 用戶名 xiangxueyujiandelin)。
第二,README 明確標註「調試中,請勿下載」,軟件版本 0.1.0。它更適合作爲參考實現學習,或者在測試環境試用,不要直接當作穩定組件接入。
第三,結構塊的產出依賴模型遵循協議。插件通過系統提示詞引導,不強制改寫,所以模型不配合時會走降級路徑,回到普通 Markdown,不會有報錯。
短評:dsh-rich-response 的思路是「模型多寫一點標記,渲染層多給一點結構」,對純文本的層級表達是有效的增強。問題在於它仍處於調試狀態,生產能力有限,先讀代碼再決定是否使用。
目錄頁:https://www.skillhub.cn/plugins/xiangxueyujiandelin/dsh-rich-response
倉庫:https://github.com/xiangxueyujiandelin/dsh-rich-response