dsh-rich-response:把 DSH 回覆渲染成可掃讀的語義色塊

前言

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

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

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

小夜