🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

生成式界面 yunyv/dsh-intelligent-ui

DeepSeek Harness
yunyv14 天前有提交已提供中文文档扫描:含敏感能力

让模型在对话里直接写出可操作的界面,而不是描述界面的文字。 这是 DeepSeek Harness 的一个插件。

31.5/100
综合分
2
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/17 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yunyv/dsh-intelligent-ui
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · ui
装得上吗
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L5 · 运行时冒烟等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件
查看扫描证据(共 28 处,展示前 27 条)
  • 读取本地文件
    lib/index.js:92
    content: await readFile(SKILL_BODY_URL, "utf8")
  • 写入本地文件
    lib/index.js:203
    mkdirSync(dir, { recursive: true });
  • 读取本地文件
    lib/index.js:216
    return readFileSync(file, "utf8");
  • 读取本地文件
    lib/index.js:225
    return readFileSync(file);
  • 读取本地文件
    lib/index.js:233
    return existsSync(file);
  • 写入本地文件
    lib/index.js:261
    writeFileSync(temp, bytes);
  • 写入本地文件
    lib/index.js:263
    renameSync(temp, file);
  • 删除本地文件
    lib/index.js:276
    unlinkSync(file);
  • 读取本地文件
    lib/index.js:438
    names = readdirSync(versionsDir(paths, id));
  • 读取本地文件
    lib/index.js:455
    entries = readdirSync(paths.artifactsDir, { withFileTypes: true });
  • 删除本地文件
    lib/index.js:464
    rmSync(artifactDir(paths, id), {
  • 删除本地文件
    lib/index.js:689
    unlinkSync(lockFile);
  • 删除本地文件
    lib/index.js:707
    unlinkSync(lockFile);
  • 读取本地文件
    src/skill.ts:73
    content: await readFile(SKILL_BODY_URL, 'utf8'),
  • 读取本地文件
    src/store/disk.ts:200
    names = readdirSync(versionsDir(paths, id))
  • 读取本地文件
    src/store/disk.ts:219
    entries = readdirSync(paths.artifactsDir, { withFileTypes: true })
  • 删除本地文件递归
    src/store/disk.ts:229
    rmSync(artifactDir(paths, id), { recursive: true, force: true })
  • 写入本地文件
    src/store/io.ts:33
    mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/store/io.ts:54
    return readFileSync(file, 'utf8')
  • 读取本地文件
    src/store/io.ts:64
    return readFileSync(file)
  • 读取本地文件
    src/store/io.ts:73
    return existsSync(file)
  • 写入本地文件
    src/store/io.ts:105
    writeFileSync(temp, bytes)
  • 写入本地文件
    src/store/io.ts:107
    renameSync(temp, file)
  • 删除本地文件
    src/store/io.ts:122
    unlinkSync(file)
  • 删除本地文件
    src/store/lock.ts:70
    unlinkSync(lockFile)
  • 读取本地文件
    src/store/lock.ts:82
    ageMs = options.now() - statSync(lockFile).mtimeMs
  • 删除本地文件
    src/store/lock.ts:90
    unlinkSync(lockFile)
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-sidebar-right@deepseek-ai/dsh-client-ui-slots@deepseek-ai/dsh-client-ui-tool@deepseek-ai/dsh-skill@deepseek-ai/dsh-tools@deepseek-ai/schemastery
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 模型写声明式DSL
  • 沙箱执行渲染界面
  • 原地改写与版本历史
展开完整介绍(176 字)↓

DSH 插件:生成式界面 / Generative UI for DeepSeek Harness。模型写声明式 DSL,无 DOM Worker 沙箱里执行,宿主用原生 DOM 画成真界面;另有一条自包含文档的逃生舱。原地改写、版本历史、跨重启可 patch。对标 ChatGPT Intelligent UI 与 Claude Artifacts。

README

由 DeepSeek 最新模型翻译生成
dsh-intelligent-ui 让模型在对话里直接写出可操作的界面,而不是描述界面的文字。 这是 DeepSeek Harness 的一个插件。 把 ChatGPT 所说的 Intelligent UI(内部代号 DIL)和 Claude 所说的 Artifacts 那套做法开源出来:模型的回答不再是"关于一个仪表盘的文字",而就是那个仪表盘。能拖的滑块、能拨的开关、当场重算的数字(不发起第二次模型调用),以及一张模型可以原地改写、而你拖过的位置不丢的卡片。 全部内容是一个工具(artifact)、两条渲染路径、一层落盘产物。 检索关键词:DSH 插件 · DeepSeek Harness 插件 · 生成式 UI · GenUI · ChatGPT 智能 UI · Claude 产物 Artifacts · 声明式 DSL · Worker 沙箱 · 原生 DOM 渲染树 · 产物版本历史 这是什么 要一个你平时只能"读到"的东西——比如「做个能改席位和付费周期的订阅成本计算器」——回答本身就是一个能用的计算器。模型写一份很小的声明式文档,DSH 编译并在沙箱里执行它,宿主接着用原生 DOM 把结果画出来:真控件、宿主自己的字号与配色、明暗两套主题都正确。 由此得来三件事,而这三件就是全部意义: - 你能操作这个回答。
展开完整文档(README 剩余 1 节)
dsh-intelligent-ui

让模型在对话里直接写出可操作的界面,而不是描述界面的文字。 这是 DeepSeek Harness 的一个插件。

把 ChatGPT 所说的 Intelligent UI(内部代号 DIL)和 Claude 所说的 Artifacts 那套做法开源出来:模型的回答不再是"关于一个仪表盘的文字",而就是那个仪表盘。能拖的滑块、能拨的开关、当场重算的数字(不发起第二次模型调用),以及一张模型可以原地改写、而你拖过的位置不丢的卡片。

全部内容是一个工具(artifact)、两条渲染路径、一层落盘产物。

检索关键词:DSH 插件 · DeepSeek Harness 插件 · 生成式 UI · GenUI · ChatGPT 智能 UI · Claude 产物 Artifacts · 声明式 DSL · Worker 沙箱 · 原生 DOM 渲染树 · 产物版本历史

这是什么

要一个你平时只能"读到"的东西——比如「做个能改席位和付费周期的订阅成本计算器」——回答本身就是一个能用的计算器。模型写一份很小的声明式文档,DSH 编译并在沙箱里执行它,宿主接着用原生 DOM 把结果画出来:真控件、宿主自己的字号与配色、明暗两套主题都正确。

由此得来三件事,而这三件就是全部意义:

- 你能操作这个回答。 输入可改的图表、能勾的清单、能调的配置——而不是它们的截图。
- 它一直是对的。 你让它改一处,它就地改写同一个产物。版本历史意味着你刚才在看的那一版还在盘上。
- 它活得比会话长。 产物落盘,所以上周做的卡片今天仍然可以被原地改写,App 重启也一样。

两条路径

| | 编译路径 engine: "dil"(默认) | 逃生舱 engine: "html" |
| 模型写什么 | DIL 文档:正文 + {@body …} 声明 + 一个根 <box> | 自包含文档:css 再 html |
| 谁执行 | 帧内一个无 DOM 的 Worker 跑编译产物 | 帧自己跑文档 |
| 谁渲染 | 宿主接到渲染树,用原生 DOM 画 | 帧自己画 |
| 拿到什么 | 主题免费、上行 token 省、控件天生联动、结构先流出来 | 表达力无上限(canvas、WebGL、D3、自定义仿真) |

关键区分:沙箱是执行容器,不是显示容器。 编译产物跑在一个碰不到 DOM 的 Worker 里,吐出一棵渲染树交给宿主画。所以"卡片里的代码够到宿主的元素"不是被防住了,而是没有路径。

安装

从 npm:

dsh plugin --profile desktop add dsh-intelligent-ui

或者直接从仓库装:

dsh plugin --profile desktop add github:yunyv/dsh-intelligent-ui

装完必须重启 App。构建产物已经提交进仓库,所以从 git 安装不需要任何构建步骤,也不需要授予构建权限。

想锁定一个确切的产物,可以走 tarball:

dsh plugin --profile desktop add ./dsh-intelligent-ui-0.1.0.tgz

开发用 checkout:

git clone https://github.com/yunyv/dsh-intelligent-ui && cd dsh-intelligent-ui
pnpm install && pnpm run check
bash scripts/reinstall-desktop.sh

不要用目录链接安装。 链接会把源码树里仅供类型检查的 node_modules/@deepseek-ai/ 暴露给 Loader;Node 解析到那些副本,而它们自己的传递依赖并没有装,导入直接抛 Cannot find package,整条 bundle 激活失败。

用起来

不需要配置。你只要要一个可交互的东西,模型就会去用这个工具。一份 DIL 文档长这样——正文、声明的状态、然后一棵树:

{@body const [seats,setSeats] = DIL.useState(5)}
{@body const [yearly,setYearly] = DIL.useState(false)}
{@body const total = 200 (yearly ? 10 : 12) * seats}
<box gap={4}>
团队订阅成本 <slider label="席位" value={seats} onChange={setSeats} min={1} max={50}/> <checkbox checked={yearly} onChange={setYearly}>按年付费</checkbox> <card> 每年合计
¥{total.toLocaleString()}
</card>
</box>

(DIL 只借用了花括号,它不是 JavaScript 的模板语法。¥ 是字面量,{total.toLocaleString()} 才是插值。)

作者契约——完整的组件清单、让一份文档真的跑得起来的那些规则——作为 bundled skill 随包分发,所以它只在真的要写界面的那一轮才加载,而不是躺在每一次请求里。说 skill genui 就能读到。

卡片出现在哪里也归模型控制:它写一个语言标记为 dsh-artifact、内容只有产物 id 的围栏块,帧就挂载在回答里的那个位置。

它是怎么工作的

src/tool.ts 工具的全部判断;不 import 任何 @deepseek-ai/,所以测试能直接驱动它 src/index.ts harness 绑定:Config、产物根目录、注册、呈现钩子 src/dil/ 移植来的 DIL 流式编译器(解析、代码生成、流式边界、降级投影) src/store/ 落盘产物层 src/client/ 浏览器半:围栏认领、按 engine 分派、侧栏面板 src/client/dil/ 沙箱、渲染树渲染器、补丁模型、状态回环 assets/genui-skill.md DIL 作者契约,作为 bundled skill 按需加载 vendor/dil-replica/ 上游原样副本(出处见 PROVENANCE.md)

编译器是流式的:喂给它一份还在增长的文档前缀,它报出哪些组件已经闭合、哪些还开着,所以卡片能在模型还在写的时候就出现。容错也不是全有全无——一个没写完的元素被丢掉,它周围的照样渲染。

一个产物可以同时在屏上出现两次(对话里的卡片 + 右侧栏),两份共享同一份状态,所以在任何一边拖控件,另一边跟着走。

产物层

落盘在 ~/.dsh/storages/dsh-intelligent-ui/,数据模型抄 coda0HQ/open-artifacts(MIT):

index.json 目录,永不存内容 artifacts/art-xxxxxxxx/versions/ v0001.html v0001.json 内容与元数据分家 v0002.html v0002.json

版本只追加,绝不改写。每条带 versionNumber / parentVersionId / contentSha256 / contentBytes / changelog;restore 生成新 head 而不动历史;expectedLatestVersion 做乐观并发;read(id, N) 取任意历史版本。

写序是「内容 → sidecar → 原子替换索引」,读路径与写路径都以磁盘为准,所以崩在中间也不会让 head 指到不存在的字节。

配置

| 键 | 默认 | 含义 |
| storeRoot | '' | 产物目录;空表示 ~/.dsh/storages/dsh-intelligent-ui |
| maxSourceBytes | 2000000 | 超过这个体积的文档直接拒绝 |
| maxArtifactsPerSession | 40 | 单会话产物上限 |
| includeDegradedText | true | 附加纯文本投影,供模型回读 |

开发

pnpm run check # typecheck(三个工程)&& 构建 && vitest && 上游自带的测试

442 个测试全绿:自有 344,上游移植 98。 浏览器半是对着构建产物 lib/client.js 测的,走真实的 __ModuleLoader__.load({ id, factory }) 契约——所以那里的注册或渲染失败是真缺陷,不是测试脚手架的假象。

只改 src/client/ 时可以不用重启 App,把构建产物覆盖进安装副本,浏览器会重新装载:

pnpm run build && cp lib/client.js ~/.dsh/profiles/desktop/node_modules/dsh-intelligent-ui/lib/client.js

宿主侧(src/.ts)的任何改动都需要重装并且重启。

给插件作者的三条

三个故障,都很值得知道,全都是在评审里看不出来、只能靠踩出来的。

一、宿主半的加载是静默失败的。 一个解析不到的模块说明符不会在对话里留下任何痕迹:条目只是变成 fiberPhase: failed,工具凭空消失。为了拿类型而写进 peerDependencies 的包会被打包器外置——所以只要运行时并不真的提供它,插件就一个字节都没跑起来,而 inject、Config、技能断言全都还是通过的。tests/host-bundle.spec.ts 现在把"构建产物只能 import 运行时真有的东西"变成硬约束。

二、成功加载过的模块会被缓存到进程结束。 把插件条目关掉再开会重新导入,这能救回一次加载失败。但它不会重读一个模块已经成功加载过的文件:ESM 缓存会作答,apply 跑在旧代码上,盘上的包是什么无关紧要。换了代码就必须重启。

三、ctx.inject(deps, cb) 才是等可选服务的正确姿势。 用 ctx.get(name) 探一次、没有就退,这在服务齐备时看不出任何问题,只在冷启动跑到提供方前面时才静默失效——然后它会一直时好时坏。可选依赖既不是一条硬 inject,也不是一次探测,而是需要等的东西。

关于改名。 它原来叫 dsh-genui,后来发现这个名字被占了:lhuans/dsh-genui 是一个同样做 DSH 生成式界面的插件,比我们早一个月,而那个名字本身也没说出我们的做法。两者的分歧正在要点上——它从 schema 渲染 Vue 组件,我们把一份声明式文档编译出来、把渲染树交给宿主。

来源与许可

MIT。DIL 路径在 vendor/ 下原样收录了 Disdjj/intelligent-ui-demo(MIT);src/dil/ 与 src/client/dil/ 下的编译器与沙箱是它的移植。确切的 commit、改了什么、为什么,都在 PROVENANCE.md。第三方代码从不就地编辑——改动一律发生在 src/。

协议是 ChatGPT DIL protocolVersion 14 的一个快照,上游随时会改;细节封在 src/dil/ 与 src/client/dil/ 里。

与上游有两处有意的分歧,都写成了测试而不是任其漂移:块内的闭合标签不再吞掉文档后半段;纯文本投影保留插值的位置(n = {n} 而不是 n = ),免得终端读者拿到一句带空洞的残句。
预览分享卡片长什么样 ↓yunyv/dsh-intelligent-ui
分享 · DeepSeek Harness Hub
yunyv/dsh-intelligent-ui

让模型在对话里直接写出可操作的界面,而不是描述界面的文字。 这是 DeepSeek Harness 的一个插件。

回到顶部