baitouwuya/dsh-super-cards:讓 DSH 助手用原生卡片回答結構化問題

前言

在 DSH 裏做智能體,最怕的一種體驗是:模型回答本身就該是一張表或一張曲線圖,結果它吐出來幾十行 Markdown,表格列還對不齊,圖表只能用 ASCII 湊。這不是模型能力問題,是表達通道的問題——Markdown 沒有表格對齊、沒有圖表組件、沒有可點擊的按鈕。

baitouwuya 維護的 dsh-super-cards 就是這個通道問題的解法:插件註冊一個 render_ui 工具,模型遇到對比、指標、表格、圖表、步驟、方案選擇這類結構化問題時,改用 UI 卡片輸出,渲染在對話流裏。下面介紹這個插件能做什麼、怎麼裝、怎麼用。

這是什麼

dsh-super-cards(中文名「超級卡片」)是一個 DSH Web 插件,零運行時依賴,已發佈到 npm,包名同樣是 dsh-super-cards。當前版本 0.14.0,在 DSH 0.2.2-rc.1(cordis 4.1.0)上實測可用,倉庫自帶的 npm test 報告 253/253 通過。許可證是 MIT,作者 baitouwuya。

它解決的問題很具體:模型輸出結構化內容時不再拼 Markdown,而是調用 render_ui 把答案渲染成卡片。卡片內容全部來自會話日誌裏記錄的 render_ui 工具調用參數,所以刷新、回放、fork 之後卡片仍然存在——這一點和臨時拼一段 HTML 的做法不同。

核心功能

29 種區塊

插件提供 29 種區塊:文本、標題、提示框、指標、表格、鍵值、列表、標籤、進度、條形圖、走勢圖、餅圖、代碼、引用、時間線、鏈接、操作按鈕、分隔線、實時計數、設置控件、流程圖/UML、樹、熱力圖、diff、看板、標籤頁、並排分欄、圖片、自定義 HTML。完整形態和上限見倉庫的 docs/zh/blocks.md。

兩種寫法

  • content:只描述材料,卡片自己挑控件、自己排版。2–3 節並排成列,4–5 節變成標籤頁。
  • blocks:精確指定每個塊。

兩者可以混用。

四種落位

卡片可以落在四個位置:正文內聯(answer)、過程摺疊區(process)、輸入框上方常駐看板(dock)、回合結尾的下一步卡片(tail)。

漸進式披露

29 種區塊的完整 schema 不會常駐進模型上下文。render_ui 的描述裏只帶一個緊湊的區塊目錄,模型需要某個塊的精確字段時,再調用 render_ui_blocks 按需取回。

可選自動「下一步」卡

回合結束後,可以由一個小模型生成一張尾卡:一句回顧、一個問題、2–4 個可點選項。默認關閉,需要顯式打開。

安裝與啓用

已發佈到 npm,命令行安裝(profile 名以你的安裝爲準,桌面版是 desktop):

dsh plugin --profile desktop add dsh-super-cards

裝好之後重啓 DSH(或重載插件行)並刷新頁面。

另外三種方式:

  1. 在「插件」頁點 Add plugin,粘貼包名 dsh-super-cards。
  2. 用 plugin_manager 的 install_bundle 指向本倉庫目錄,用於開發或離線安裝。
  3. 通過插件市場安裝:設置 → 插件市場 → 添加索引源,索引源地址如下,然後在 Discover 裏搜索 dsh-super-cards。
https://raw.githubusercontent.com/baitouwuya/dsh-super-cards/main/market/index.json

需要注意的是,這個索引源是這個插件自己的市場入口,不是 DSH 的官方市場。

典型用法

裝好後,直接用自然語言讓模型用卡片回答即可,不需要額外開關。下面是 README 裏給出的 render_ui 參數示例,可以直接參考:

// render_ui 的參數
{
  "title": "本週發佈",
  "content": {
    "summary": "18 次發佈全部完成,2 次回滾已恢復。",
    "metrics": [
      { "label": "發佈次數", "value": 18, "delta": "+3", "tone": "success" },
      { "label": "失敗回滾", "value": 2, "delta": "-1", "tone": "success" }
    ],
    "actions": [{ "label": "查看日誌", "prompt": "查看本週的發佈日誌", "tone": "primary" }]
  }
}

這一調用會渲染出一張標題爲「本週發佈」的卡片,含一段摘要、兩個帶漲跌標記的指標格、以及一個「查看日誌」按鈕。按鈕點擊只是把 prompt 放進輸入框,不會自動發送,用戶按 Enter 繼續追問。

配置項

配置寫在 profile 的 cordis.patch.yml 中 super-cards 行的 config 對象裏。三種改法效果相同,最終都寫回同一份行配置:插件頁有四項基礎配置(自動下一步、看板、默認落位、塊數上限);設置頁有完整表單,加上下游步驟的選項數、超時、最小長度、生成用的 provider 與 model,以及啓用的塊類型;也可以手寫 YAML:

- insert:
    - id: super-cards
      name: dsh-super-cards
      config:
        maxBlocks: 12
        dock: true
        defaultPlace: answer
        blocks: [text, heading, callout, stats, table, progress]

行裏所有字段都可省略,省略即用默認值。出現未聲明的鍵會讓校驗失敗並報出鍵名,不會靜默忽略。

幾個值得注意的默認行爲:

  • maxBlocks 默認 24,範圍 1 到 24。
  • dock 默認 true;設爲 false 時,即使模型傳 place: "dock" 也會落到 answer。
  • defaultPlace 默認 answer,取 answer、process、dock、tail 之一。
  • nextSteps 默認 false,顯式 true 纔開啓自動下一步卡。
  • nextStepsProvider 與 nextStepsModel 必須成對出現,只寫一個會被忽略,回退到會話路由。
  • blocks 不是隻改一處:它同時影響工具枚舉、工具描述裏的區塊目錄、校驗錯誤提示與自動排版回退。想完全禁止聯網的 image 塊,就在列表裏去掉它。

保存配置後不需要重啓 DSH。apply() 在掛載時讀取配置並註冊工具、提示詞與可選服務,所以重掛一次之後工具描述、塊枚舉、校驗提示都會換成新配置。已打開的頁面不需要刷新;但首次安裝或升級插件版本後仍建議刷新一次,讓 Client 半重新加載。

另外,插件隨包帶了 @deepseek-ai/schemastery 和 @deepseek-ai/cosmokit 的副本(當前 schemastery 3.19.0、cosmokit 1.9.0),因爲本地插件解析不到應用自己的 node_modules。DSH 升級後建議重新從應用包裏同步這一對包:

npm run sync:vendor
npm run sync:vendor -- "/Applications/DeepSeek Harness.app/Contents/Resources/app.asar"

同步後運行 npm test,再重載插件行。

適用場景與注意

適合誰:在 DSH Web 客戶端裏做助手、希望把對比、指標、表格、圖表、流程、方案選擇這類結構化回答做成卡片的開發者。它的定位是客戶端 UI 增強,不是服務器端渲染,也不是替代助手本身的推理邏輯。

幾個需要留意的地方:

  • 插件以當前 DSH 進程的權限運行,能讀寫它會話內可見的數據。安裝前先看一遍源碼和 LICENSE(MIT)。
  • 自動下一步卡默認關閉,開啓後每次回合結束都會額外發起一次小模型調用,超時默認 15000 毫秒(範圍 1000 到 60000),回答短於 nextStepsMinChars(默認 200 字符)不生成。
  • 自動排版的分欄、標籤頁規則由卡片側決定,blocks 寫法是你要精確控制佈局時的出口。
  • 環境要求 Node >= 22.19.0(見包內 engines 字段)。
  • 這個倉庫在社區目錄裏的分類是「客戶端」,社區目錄是獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-super-cards 做的事情不復雜:把結構化回答從 Markdown 拉進對話流的原生 UI,並保證卡片內容可隨會話日誌留存、回放和 fork。如果你已經在用 DSH 做帶指標和表格的回答,值得裝上試一下;如果只是偶爾發一段文字,那它帶來的收益有限。

目錄頁:https://www.skillhub.cn/plugins/baitouwuya/dsh-super-cards

源碼與文檔:https://github.com/baitouwuya/dsh-super-cards

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

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

小夜