dsh-genui

265Star23Fork3Issue0Watching

让 DSH 模型在回复中直接生成可交互的图表、表单、统计卡片等界面,无需跳出对话即可查看数据、调整参数、让模型重算。

语言
TypeScript
License
MIT
分支
main
dshdsh-plugin

安装

$ dsh plugin --profile web add github:omdsh-dev/dsh-genui

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

让 DSH 模型在聊天回复中直接生成可交互的界面组件(统计卡、图表、表单、面板),用户不用离开对话就能浏览数据、操作组件、并把操作回传给模型让它继续计算或更新界面。

核心能力

  • 在模型回答中流式渲染 JSON 描述的组件:模型边写边渲染,首个完成的组件立即出现,不用等整段回复写完
  • 提供 30+ 白名单组件:文本、卡片、表格、图表(柱/线/环)、表单(输入/选择/复选/开关/滑块/单选/提交)、进度条、步骤条、时间线、文件树、Mermaid 图表、3D 场景、数学函数绘图、对话式问答等
  • 注册 render_ui 工具:模型也可通过工具调用把同一份组件规格渲染成工具行卡片(适合"交付物型"界面)
  • 注册 validate_dsh_ui 工具:模型在发出复杂围栏前自检,坏节点会被自动修复并附上修复后的 JSON
  • 支持组件动作事件回流:带 action 的按钮/输入/开关等被点击后,触发一个 [genui-action] 消息回传模型,模型据此更新界面(300 ms 尾部防抖)
  • 提供会话顶部面板:模型可在面板里持续叠加/替换组件(/panel 命令唤起),上拉边框可拖拽改变高度

技术实现

  • 语言: TypeScript
  • 关键依赖: @deepseek-ai/cordis(Cordis 注入宿主)、@deepseek-ai/dsh-client-runtime@deepseek-ai/dsh-client-ui-primitives(浏览器渲染原语)、@deepseek-ai/dsh-tools(注册 render_ui/validate_dsh_ui 工具)、react(UI 框架)
  • 架构模式: 插件由"服务端半 + 浏览器半"两部分组成。服务端半(src/plugin/index.ts)通过 Cordis 注入宿主,往系统提示词中插入一段 dsh-ui 围栏语言说明、注册两个工具、并在宿主 WebServer 上挂一条按需加载 mermaid/three 的资源路由;浏览器半(src/client/index.tsx)启动时探测宿主是否提供 fence-registry 扩展点,选择"注册通道"或"DOM 通道"渲染围栏
  • 入口文件: src/index.ts(包入口)→ src/plugin/index.ts(服务端逻辑);客户端逻辑在 src/client/index.tsx

适用场景

让模型的回答从纯文本升级为可交互面板:业务监控、订单/收入趋势展示、教学题卡与自判打分、流程图与架构图、函数曲线实时调参、轻量表单收集等。最适合"用户问一句、模型回一段带可点组件的回答"的场景,省去打开外部 BI/工具页面的来回跳转。

前置依赖与兼容性

依赖最低版本说明
DSH(@deepseek-ai/dsh-client-runtime / dsh-client-ui-primitives / dsh-client-ui-slots / dsh-client-ui-tool / dsh-invariants / dsh-llm / dsh-system-prompt / dsh-tools / cordis)^0.1.0-rc.6宿主需具备 fence-registry 或 DOM 通道的渲染能力(DOM 通道覆盖任意 0.1.0-rc.6+ 构建)
Node.js^22.19.0 或 >=24.0.0安装脚本与构建脚本需要
pnpm>=11.7.0 且 <12dsh plugin 命令依赖;可用 corepack 启用
React^18.0.0 或 ^19.0.0通过 peerDependencies 注入,宿主自带
平台跨平台无 os/cpu 限制;mermaid 与 three 以 IIFE 资源按需加载

安装方式

dsh plugin --profile web add github:omdsh-dev/dsh-genui

配置项

本插件无需额外配置。安装后宿主自动注入 dsh-ui 围栏语言段、注册 render_uivalidate_dsh_ui 工具,并在宿主 WebServer 上挂 /plugins/@omdsh-dev/dsh-genui/assets/* 静态资源路由用于按需加载 mermaid 与 three 引擎。模型输出的围栏规格有内置硬性资源上限(200 节点 / 嵌套 8 层 / 各类字段长度上限),超出部分会被静默丢弃,不会让界面崩溃。

常见问题

Q: 围栏渲染成了普通代码块,怎么办?

A: 依次检查三件事:宿主 dsh 是否具备 fence-registry 扩展点(不具备会自动回退到 DOM 通道)、dsh plugin --profile web list 是否能看到本插件、最后重启 dsh web 并硬刷新(Cmd/Ctrl+Shift+R)。

Q: 安装时报 pnpm not found on PATH,怎么解决?

A: dsh 的 plugin 子命令依赖 pnpm。运行 corepack enablenpm i -g pnpm 安装后,必须新开一个终端让 PATH 生效,确认 pnpm -v 有输出再重试。

Q: 装好了但 mermaid 或 3D 场景渲染不出来?

A: 这两个引擎按需加载,首次使用时会从 /plugins/@omdsh-dev/dsh-genui/assets/*.js 拉取。先硬刷新一次浏览器;若仍失败,移除后重新安装即可(dsh plugin --profile web remove @omdsh-dev/dsh-genui 再 add)。

Q: 模型不输出 dsh-ui 围栏,只回文字怎么办?

A: 新会话需要重启 dsh web 才生效;或者在提问时直接说"用 dsh-ui 画一个统计面板"提醒模型。

Q: 刚 clone 下来没有 lib/ 目录,能直接用吗?

A: 不能直接用。lib/ 是构建产物,需要先 pnpm installpnpm run check(会自动构建)。

Q: 围栏节点太多会被截断吗?

A: 会的。插件有硬性资源上限:单条围栏最多 200 个节点、嵌套深度 8 层;超出部分会被静默丢弃,不会让界面崩溃。

Q: 怎么卸载这个插件?

A: 运行 dsh plugin --profile web remove @omdsh-dev/dsh-genui,然后重启 dsh web;围栏会自然降级回普通代码块,不会污染已有会话。

上手难度

入门 — 普通用户无需任何配置;模型侧的语法通过 SKILL.md 与系统提示词自动教给模型,用户只需在 prompt 中描述"用 dsh-ui 画一个 XX 面板"即可。开发者要二次开发的话需要熟悉 React、Cordis 与 DSH 客户端运行时。

已知问题与限制

  • 资源上限硬编码:单条围栏上限 200 节点 / 嵌套 8 层;面板上限 200 节点 / 200 次追加,达到上限后模型需发 replace 重建(src/client/guard.ts:25-65src/client/panel-store.ts:29-34
  • mermaid / three 引擎按需从 /plugins/@omdsh-dev/dsh-genui/assets/*.js 加载;极老的不带该资源路由的宿主构建会降级为源码/加载失败提示,需更新 dsh(README.md:136
  • 工具注册依赖可选的 tools 服务:没有工具通道的宿主仍保留围栏通道,但失去 render_ui / validate_dsh_ui 工具(src/plugin/index.ts:157-197
  • DOM 通道在宿主 React 重渲染时可能擦掉插件挂载的根:插件用 MutationObserver + 1 秒扫描双保险修复,但极端情况下仍有视觉抖动(src/client/dom-fence.tsx:25-28
  • 围栏内容中密码、API Key、访问令牌等"秘密"被协议层禁用:模型被提示拒绝索取,但本插件无运行时强制遮罩,依赖模型遵循提示词