前言¶
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