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

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

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

小夜