大多数插件的价值是「多一个功能」,而 dsh-genui 改的是回答本身的形态:助手回复里那段本来看起来像代码块的文本,会当场变成能点的看板、能拖的函数图、能判分的小测。作者是 omdsh-dev,仓库在 GitHub 上已有约 530 星标,最近一次提交在 1 天前,仍在活跃维护,采用 MIT 许可。
先把信任口径说清:本站对这款插件只做了静态安装检查(未做真实安装),属于「可安装性通过、实装未验证」的状态。下面所有机制描述都来自插件详情页与它的 README,不是本站实机跑出来的结论。
它把「回答」变成「界面」的方式
核心动作很小:模型在回复里写一段放在 dsh-ui 围栏中的 JSON,描述它想要什么界面;浏览器端的渲染器认领这门围栏语言,把 JSON 画成组件。你问「这个月订单怎么样」,回答可以同时包含一行文字、三张统计卡、一张趋势图和一个进度条;想换视角时,面板上直接有「刷新」「切换视图」按钮,点一下让模型更新数据,不用再打一段话重复提问。
已支持的组件超过 30 种:卡片、表格、图表、表单、标签页、折叠面板、文件树、时间线、diff 等等。它强调「边生成边出现」——组件嵌在回答里,写到哪渲染到哪,不必等整段回复写完。交互还能回传:按钮、复选、单选、开关、下拉、输入、提交与测验都有事件循环,点了会把事件送回模型。
两条渲染通道:为什么不用改宿主源码
dsh-genui 内置两套渲染通道,在宿主激活它的浏览器模块之后自动选择,因此不需要修改宿主源码。
Registry 通道
当宿主暴露了 fence-registry 扩展点(较新的 dsh 构建),围栏会经过宿主的流式渲染管线注册,行为和宿主原生功能无缝衔接。
DOM 通道
当宿主没有这个扩展点(包括支持范围内的原版 DSH 构建),插件改为观察会话 DOM,自行挂载自己的渲染树。两条通道最终效果一致:组件、交互、面板与持久化行为完全相同。
流式渲染与多表面兼容
自 0.7.2 起支持流式渲染;自 0.8.3 起围栏发现支持多表面——除了标准 md-code-block,还兼容部分宿主构建使用的 deepsuite 风格 .code-block / .code-block-small,并以「label+」结构兜底。在 DSH 0.1.7 的通用代码块场景下,当宿主最终 DOM 缺少围栏 language 元数据时,插件会从公开的 ChatSnapshot 读取当前 assistant 的原始 Markdown,并且只接管 dsh-ui 围栏。哪怕你的构建换了别的类名,围栏照样能渲染,控制台会给一条一次性提示说明宿主 DOM 发生了漂移。
白名单与不用 eval:模型塞不进脚本
安全性建立在一个很朴素的前提上:组件是白名单的。模型只能声明白名单里的组件类型,没有通道把任意 HTML 或脚本塞进页面。函数表达式也走独立解析器,不是 eval。此外还有一条「秘密禁令」——GenUI 不得索取密码、API Key、访问令牌或恢复码;即使页面里出现密码输入,也保持打码、不持久化、不进表单收集。
体积分账:主包 110 KB,引擎按需加载
主渲染包保持轻量,约 110 KB min / 28 KB gzip。mermaid、three.js 与 echarts 三个引擎被单独打包成按需资产,首次用到时才通过插件自注册的 HTTP 路由加载——启动时只下载渲染核心,没有图表的对话不会为图表引擎付流量。这一点在排错时也很关键:引擎不再内联进 client.js,所以「装了但 3D 不出图」往往不是坏了,而是资产没被触发。
交互不是装饰:事件循环与诚实交互
它把「本地优先」写成了原则:UI 自己能完成的状态变化(判卷、判题、重置、展开、选中)一律本地即时完成,action 只用在必须模型参与的事上。离散交互按「一次手势一次事件」立即回传;slider 连续拖动保留尾沿防抖,只回传最终值。还有一条「诚实交互」规则——不带 action 的按钮渲染成禁用态,消灭「看着能点、点了没反应」的假按钮;带 action 的按钮点击后立即显示「已触发」的本地反馈,而这只证明本地事件已触发,不代表模型已收到。
统一组件协议会在校验和渲染之前把原生字段别名确定性归一化,例如 card.label 归一为 title、table.data 归一为 rows。mermaid 图渲染失败会自动修复重试(剥反引号、引号化中文与空格标签),仍失败才降级源码,错误图永不直接上屏。
硬上限与自愈:病态 spec 也拖不垮界面
每个围栏都要过规格守卫:坏节点静默丢弃,同围栏其余组件照常渲染,单个坏组件不再拖垮整条围栏;数值会被钳位、字符串会被截断,整棵树限制在 200 节点 / 8 层嵌套。状态持久化按「会话 + 内容指纹」保存,上限 200 块 LRU 淘汰;会话面板默认最多 200 节点 / 200 条追加。围栏自修默认开启,每个 turn 最多发送两条 correction,渲染失败与「已验证但没交付」共用这个上限,子代理回合不会收到围栏修正。
导出与嵌入
已完成的区块可以导出为 HTML 或 GenUI JSON。HTML 里内含渲染器、样式、KaTeX WOFF2 字体和规格实际需要的图形引擎,本地控件继续可用,但模型动作按钮会被禁用;相对媒体地址会转成绝对地址,离线打开时网络媒体仍需连原站点。自定义组件会禁用 HTML 导出。想嵌到别的应用时,可以从 @changfenhuang/dsh-genui/embed 导入 GenuiBlock、GenuiActionContext、ErrorBoundary 与 processGenuiSpec,复用同一份组件、样式与规格校验;模型指引则从 @changfenhuang/dsh-genui/skill 读取。
总结
dsh-genui 的真正看点不是「多几个组件」,而是把模型的回答变成一个可声明、可交互、受白名单约束的界面层,并用两条通道绕开了改宿主源码。想对照同类插件的中文清单与安装形态,见 DeepSeek Harness Hub 插件清单。
适合与不适合
适合:希望回答里直接出现数据看板、图表、函数图与可交互表单的场景;需要把测验、表单的判题与收集放在本地完成、只把必要的下一步交给模型的场景;想在会话面板里做常驻工作区、并让答案边流式输出边出现的用法;已经跑在支持范围内的 dsh 构建、愿意动手确认激活状态的技术用户。
不适合:宿主 DSH 版本低于支持范围(DSH 0.1.1-rc.x 及更早需改用 dsh-genui 0.9.8)的人;不愿意开浏览器控制台确认 [genui] client active 这行日志、只想装完就万事大吉的人;把敏感信息交给模型、期望界面帮你收集密码或密钥的场景——这是插件的硬禁令,做不到。
标签:dsh-genui、DeepSeek Harness、GenUI 渲染通道
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。