deepseek-harness-intelligent-ui 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -1
- package/README.md +145 -35
- package/README.zh-CN.md +144 -34
- package/THIRD_PARTY_NOTICES.md +8 -0
- package/client/client.js +17 -17
- package/package.json +13 -6
- package/renderer/renderer.js +500 -0
- package/src/catalog/patch.js +283 -0
- package/src/guidance.js +6 -1
- package/src/plugin.js +6 -2
- package/src/portable/artifacts.js +87 -0
- package/src/tools/patch.js +139 -0
- package/src/tools/render.js +4 -2
package/README.zh-CN.md
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
[](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/main/docs/compatibility.md)
|
|
12
12
|
[](LICENSE)
|
|
13
13
|
|
|
14
|
-
[演示](#-演示) · [快速开始](#-快速开始) · [如何选择](#-agent-如何选择呈现方式) · [沙箱组件](#-沙箱组件ui_render_widget) · [安全](#-安全模型) · [配置](#%EF%B8%8F-配置) · [开发](#-开发与验证)
|
|
14
|
+
[演示](#-演示) · [质量](#-真实模型质量基线) · [快速开始](#-快速开始) · [如何选择](#-agent-如何选择呈现方式) · [沙箱组件](#-沙箱组件ui_render_widget) · [安全](#-安全模型) · [配置](#%EF%B8%8F-配置) · [开发](#-开发与验证)
|
|
15
15
|
|
|
16
16
|
</div>
|
|
17
17
|
|
|
@@ -72,36 +72,60 @@ JSON 还在生成,组件就已出现。实时组件在**同一个** iframe 中
|
|
|
72
72
|
|
|
73
73
|
## 🎬 演示
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
### 真实 DeepSeek 模型,端到端
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
https://github.com/user-attachments/assets/e4eb0adc-659e-4c80-b473-449aa42ca00f
|
|
78
|
+
|
|
79
|
+
<details>
|
|
80
|
+
<summary><b>🎞️ GIF 精选片段</b>(适用于无法播放视频的页面,如 npm)</summary>
|
|
81
|
+
<br>
|
|
82
|
+
|
|
83
|
+
<p align="center">
|
|
84
|
+
<img src="https://raw.githubusercontent.com/dreamfarer-space/deepseek-harness-intelligent-ui/main/docs/assets/real-model/demo.gif" alt="真实 deepseek-flash 模型在 DSH Web 中的表现,由鲸鱼娘解说:表单回传、带滑块的阻尼振动 Plot、用 ui_patch 两轮原位修改图表" width="100%">
|
|
85
|
+
</p>
|
|
86
|
+
|
|
87
|
+
</details>
|
|
88
|
+
|
|
89
|
+
<img align="right" width="120" src="https://raw.githubusercontent.com/dreamfarer-space/deepseek-harness-intelligent-ui/main/scripts/eval/demo/assets/whale/greet.webp" alt="担任演示解说的 DeepSeek 鲸鱼娘">
|
|
90
|
+
|
|
91
|
+
🎥 **完整视频(H.264,2 分 27 秒,9.5 MB):** [docs/assets/real-model/demo.mp4](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/main/docs/assets/real-model/demo.mp4)。视频覆盖全部 11 个浏览器用例,每一章都停在真实结果上:纯文本、图表、数据表、表单回传、Plot、Three.js 与「让模型修复」、停止 → 重新生成、两轮原位修改、Fast 3G、CDN 不可达、手机宽度。由 DeepSeek 鲸鱼娘解说,立绘来自 [dsh-whale-musume](https://github.com/Sutera-Diffusus/dsh-whale-musume)(MIT,见[致谢](#致谢))。
|
|
78
92
|
|
|
79
93
|
> [!NOTE]
|
|
80
|
-
>
|
|
94
|
+
> 2026-10-16 由 `npm run eval:real -- --stage browser --record` 录制,`npm run eval:demo` 剪辑合成。每张卡片都是真实 **`deepseek-flash`** 模型在装有本插件的真实 **DSH Web 0.2.0-rc.1** 里当场生成的。没有任何脚本回放,**失败也原样保留**:每章标题卡都标出 ✓ 或 ✗,解说会说明哪里出了问题。模型生成期间视频加速播放,右下角秒表显示真实耗时。评测结果见[真实模型质量基线](#-真实模型质量基线)。
|
|
95
|
+
|
|
96
|
+
| 多系列柱状图:**✗**(调用中途被截断) | `ui_patch` 两轮原位修改:✓ |
|
|
97
|
+
|:---:|:---:|
|
|
98
|
+
|  |  |
|
|
99
|
+
| *图表内容正确,但卡片显示「生成已中断」:还有组件没生成完* | *「改成折线图」→「加上小程序 30/45/60/80」:同一张卡片,第 3 版,数值准确* |
|
|
100
|
+
| **提交表单 → 模型使用提交的值:✓** | **阻尼振动 `Plot`,滑块实时重绘:✓** |
|
|
101
|
+
|  |  |
|
|
102
|
+
| *提交的 全国 / 4 / 乐观 生成了季度预测* | *y = A·e^(−γt)·cos(ωt) 及包络线;拖动滑块不调用模型* |
|
|
103
|
+
| **Three.js:✗,再由「让模型修复」修好** | **中途停止 → 重新生成:✓** |
|
|
104
|
+
|  |  |
|
|
105
|
+
| *首次生成报错 `view is not defined`;修复后球心 (0,0,R),带坐标轴* | *中断的卡片保留静态预览,「重新生成」得到完整场景* |
|
|
106
|
+
| **Fast 3G、禁用缓存:✓** | **CDN 不可达:✓(按设计降级)** |
|
|
107
|
+
|  |  |
|
|
108
|
+
| *three.js 加载变慢,但仍正常渲染* | *失败直接显示在卡片上,对话不受影响* |
|
|
109
|
+
| **手机宽度(390 px):✓** | **可排序数据表:✗(5 分钟内没出表)** |
|
|
110
|
+
|  |  |
|
|
111
|
+
| *无溢出,指标与图表都能放下* | *Agent 把时间都花在上网查车型参数上* |
|
|
81
112
|
|
|
82
113
|
<details>
|
|
83
|
-
<summary><b
|
|
114
|
+
<summary><b>🧪 脚本化模型演示</b>(插件管线 E2E:深色主题、刷新恢复、沙箱隔离)</summary>
|
|
84
115
|
<br>
|
|
85
116
|
|
|
86
|
-
|
|
87
|
-
|:---:|:---:|
|
|
88
|
-
|  |  |
|
|
89
|
-
| *指标卡、栅格、标签页、带悬停提示的堆叠柱状图、可排序表格、时间线、表单* | *用 `UI.three()` 绘制 `x²+y²+z²=2Rz`,拖动滑块在本地即时改变曲面* |
|
|
117
|
+

|
|
90
118
|
|
|
91
|
-
|
|
92
|
-
|:---:|:---:|
|
|
93
|
-
|  |  |
|
|
119
|
+
🎥 [docs/assets/demo.mp4](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/v0.2.1/docs/assets/demo.mp4)。由 `npm run e2e:all -- --record` 录制,背后是 `scripts/e2e/` 中的**脚本化 mock**,回答内容是预设的。它展示的是插件管线(流式、渲染、双向通信、持久化、隔离),不代表真实模型的表现。
|
|
94
120
|
|
|
95
|
-
|
|
|
121
|
+
| 看板流式出现并定稿 | Three.js 组件:R 滑块、旋转、缩放 |
|
|
96
122
|
|:---:|:---:|
|
|
97
|
-
|  |  |
|
|
98
124
|
|
|
99
125
|
| 深色主题 | 手机宽度(深色) | 刷新后恢复 |
|
|
100
126
|
|:---:|:---:|:---:|
|
|
101
127
|
|  |  |  |
|
|
102
128
|
|
|
103
|
-
**在 GitHub 内联播放:** 把 `docs/assets/demo.mp4` 拖进 GitHub 的评论或 Release 编辑框,再把生成的 `https://github.com/user-attachments/assets/…` 链接单独一行粘贴到这里。GitHub 只对上传的附件内联播放视频,不支持仓库内的文件。
|
|
104
|
-
|
|
105
129
|
</details>
|
|
106
130
|
|
|
107
131
|
## 🚀 快速开始
|
|
@@ -125,7 +149,7 @@ npx deepseek-harness-intelligent-ui doctor # 只诊断,不做修
|
|
|
125
149
|
|---|---|
|
|
126
150
|
| 升级 | `dsh plugin --profile web add deepseek-harness-intelligent-ui@latest` |
|
|
127
151
|
| 试用预发布版(仅在存在 `next` 标签时) | `dsh plugin --profile web add deepseek-harness-intelligent-ui@next` |
|
|
128
|
-
| 固定版本 | `dsh plugin --profile web add deepseek-harness-intelligent-ui@0.2.
|
|
152
|
+
| 固定版本 | `dsh plugin --profile web add deepseek-harness-intelligent-ui@0.2.4` |
|
|
129
153
|
| 卸载 | `dsh plugin --profile web remove deepseek-harness-intelligent-ui`(或 `npx deepseek-harness-intelligent-ui uninstall`) |
|
|
130
154
|
| 从源码目录安装 | `dsh plugin --profile web add file:/path/to/deepseek-harness-intelligent-ui` |
|
|
131
155
|
|
|
@@ -168,6 +192,7 @@ CI 每天定时在 Windows、Linux、macOS 上跑完整矩阵,DSH 一发新版
|
|
|
168
192
|
| 工具 | 适用场景 | 渲染方式 |
|
|
169
193
|
|---|---|---|
|
|
170
194
|
| `ui_render` | 结构化回答 | 固定目录中的原生 React 组件,随 JSON 流式渐进渲染 |
|
|
195
|
+
| `ui_patch` | 修改之前显示的界面 | 对该界面做组件级操作,未改动的组件保留交互状态([详情](#-原位增量更新ui_patch)) |
|
|
171
196
|
| `ui_render_widget` | 自定义可视化、三维、模拟、小应用 | 不透明源沙箱 iframe 中的 HTML/CSS/JS:先 CSS,再实时 morph HTML,最后执行 JS,全程**一个** iframe |
|
|
172
197
|
|
|
173
198
|
## 🧩 组件目录(`ui_render`)
|
|
@@ -189,6 +214,18 @@ CI 每天定时在 Windows、Linux、macOS 上跑完整矩阵,DSH 一发新版
|
|
|
189
214
|
|
|
190
215
|
**`Math` 与 `Mermaid` 的渲染:** 两者在与组件相同的沙箱中,从 CDN 白名单加载 KaTeX 或 Mermaid。第三方代码不在 DSH 页面中运行,宿主包体积保持在约 127 KB。CDN 不可用时,显示源码文本。
|
|
191
216
|
|
|
217
|
+
## 🔁 原位增量更新(`ui_patch`)
|
|
218
|
+
|
|
219
|
+
用户要求修改之前显示的界面时(例如“把柱状图换成折线图,其余不变”),Agent 按组件 id 打补丁,不必重新发送整棵组件树。
|
|
220
|
+
|
|
221
|
+
- **标识:** 每次 `ui_render` 的结果都会告诉模型该界面的 `uiId`(即其调用 id)和版本号 1。每次补丁被接受后,结果会给出新版本号和组件的 `id:类型` 概览。
|
|
222
|
+
- **操作:** `setProps`(合并属性,`unset` 删除属性)、`replaceNode`(保留 id,替换类型、属性或子节点)、`insertChild`(在容器下插入新组件)、`removeNode`。操作按顺序执行,**要么全部生效,要么全部不生效**。生成的新版本还要通过与全新 `ui_render` 相同的完整校验(类型、属性、引用、成环、深度、规模、Tabs 标签数)。
|
|
223
|
+
- **并发:** `baseVersion` 为必填项。基于旧版本的补丁会作为过期请求被拒绝,并告知当前版本,模型据此重新生成补丁后重试。补丁始终独占执行、不会并行,因此版本构成一条有序链。
|
|
224
|
+
- **作用范围:** Host 不保存任何状态,而是重放本会话自己的历史(先是被接受的 render,再是被接受的 patch)来重建当前版本,所以补丁只能作用于同一会话中的界面。未知 id、其他会话的界面,以及因上下文压缩而不可见的界面都会被拒绝,此时模型改用 `ui_render`。
|
|
225
|
+
- **交互状态:** 组件 id 在各版本间保持不变,交互状态按 `uiId` + 组件 id 保存。补丁未替换的组件都会保留表格排序、选中的标签页、表单输入、已提交锁定和 `Plot` 滑块位置。被 `replaceNode` 替换的组件状态重置;要重置任意组件,换一个新 id 即可。补丁新增的表单字段使用默认值。
|
|
226
|
+
- **显示:** 补丁在流式生成或执行时,卡片只显示一行“正在更新界面…”,上一版本保持可用,绝不会出现改了一半的界面。成功后,新版本显示在新回复下方,旧副本收起为“已更新为第 N 版”。被拒绝、失败或中断的补丁不会改动上一版本。完整快照保存在持久化的工具结果元数据中,刷新页面后显示的就是最新版本。
|
|
227
|
+
- **沙箱组件**(`ui_render_widget`)暂不支持打补丁:Agent 会重新渲染它,重新渲染时 `UI.state` 依然保留。
|
|
228
|
+
|
|
192
229
|
## 🪟 沙箱组件(`ui_render_widget`)
|
|
193
230
|
|
|
194
231
|
<img src="https://raw.githubusercontent.com/dreamfarer-space/deepseek-harness-intelligent-ui/main/docs/assets/readme/widget-streaming.zh.svg" alt="组件字段按顺序流式到达:先显示占位,再实时 morph 预览,最后在同一个 iframe 中定稿并执行代码" width="100%">
|
|
@@ -222,7 +259,7 @@ CI 每天定时在 Windows、Linux、macOS 上跑完整矩阵,DSH 一发新版
|
|
|
222
259
|
- **显示位置:**
|
|
223
260
|
- 回合进行中,UI 在工具调用处内联显示。从准备、执行到结果,始终是同一个组件实例,交互状态不会丢。
|
|
224
261
|
- 回合结束后,插件通过 `conversation.chat.turnTail` 把 UI **重新显示在回复下方**,内联处改为一行提示。
|
|
225
|
-
-
|
|
262
|
+
- **按界面保存的交互状态**(以工具调用为单位,打过补丁的各版本共用原 `ui_render` 调用的状态):当前标签页、表格排序、表单值、已提交锁定、Plot 滑块、组件控件值、`UI.state`、iframe 高度。这些状态保存在内存和 `localStorage` 中(有容量上限),移到回复下方或刷新页面后都会恢复。UI 本身则从持久化的会话日志重建。
|
|
226
263
|
- **中途停止:**
|
|
227
264
|
- 已进入会话日志的调用:保留已完成的部分(组件的静态预览,或已生成的组件),并显示提示和“重新生成”按钮。
|
|
228
265
|
- 参数仍在流式输出时就被停止的调用:DSH 会整体丢弃它。插件会暂存已生成的内容,同样在被停止的回合下方显示。
|
|
@@ -251,7 +288,7 @@ CI 每天定时在 Windows、Linux、macOS 上跑完整矩阵,DSH 一发新版
|
|
|
251
288
|
|
|
252
289
|
| 配置项 | 默认值 | 含义 |
|
|
253
290
|
|---|---|---|
|
|
254
|
-
| `enableCatalog` | `true` | 注册 `ui_render` |
|
|
291
|
+
| `enableCatalog` | `true` | 注册 `ui_render` 和 `ui_patch` |
|
|
255
292
|
| `enableWidget` | `true` | 注册 `ui_render_widget` |
|
|
256
293
|
| `injectGuidance` | `true` | 注入“何时使用 UI”的系统提示 |
|
|
257
294
|
| `cdnAllowlist` | esm.sh、jsdelivr、unpkg | 组件(以及 Math/Mermaid)可加载资源的来源 |
|
|
@@ -268,11 +305,12 @@ npm install
|
|
|
268
305
|
npm run build
|
|
269
306
|
npm test # 单元/组件测试(含 DSH 兼容性检查与安装器 CLI)
|
|
270
307
|
npm run typecheck
|
|
271
|
-
npm run e2e:all # 构建 → 安装到临时 DSH 目录 → mock 模型 + 真实 DSH Web →
|
|
308
|
+
npm run e2e:all # 构建 → 安装到临时 DSH 目录 → mock 模型 + 真实 DSH Web → 30 项浏览器检查
|
|
272
309
|
npm run e2e:all -- --record # 同时重新录制 docs/assets/demo.mp4 / demo.gif(需要 ffmpeg)
|
|
273
310
|
npm run e2e:all -- --spec ./deepseek-harness-intelligent-ui-<版本>.tgz # 改为对 npm pack 打出的包做 E2E
|
|
274
311
|
npm run smoke -- --spec ./deepseek-harness-intelligent-ui-<版本>.tgz # 安装冒烟测试(不需要浏览器)
|
|
275
312
|
npm run docs:art # 重新生成 docs/assets/readme/ 下的 README 动画插图
|
|
313
|
+
npm run eval:real # 真实模型质量基线(需要 DEEPSEEK_API_KEY),见下文
|
|
276
314
|
```
|
|
277
315
|
|
|
278
316
|
E2E 可以在 Windows、Linux、macOS 上运行。它会按平台自动查找 Chrome(可用 `CHROME_PATH` 指定),`DSH_BIN` 可指定其他 `dsh` 可执行文件。检查项见 `scripts/e2e/browser.mjs`,最近一次报告在 [`docs/e2e-report.json`](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/v0.2.1/docs/e2e-report.json)。GitHub Actions 会在三个系统上,针对每个受支持的 DSH 版本跑完全部测试。
|
|
@@ -296,32 +334,102 @@ E2E 可以在 Windows、Linux、macOS 上运行。它会按平台自动查找 Ch
|
|
|
296
334
|
|
|
297
335
|
</details>
|
|
298
336
|
|
|
299
|
-
|
|
300
|
-
<summary><b>🤖 真实模型评测</b></summary>
|
|
301
|
-
<br>
|
|
337
|
+
## 📊 真实模型质量基线
|
|
302
338
|
|
|
303
|
-
|
|
339
|
+
工具调用的参数能解析,不等于用户真正拿到了可用、正确的界面。`npm run eval:real` 把三层结果**分开**统计,任何一层通过都不能代替另一层:
|
|
304
340
|
|
|
305
|
-
|
|
341
|
+
| 层 | 证明什么 | 最新 · 2026-10-16 · `deepseek-flash` |
|
|
342
|
+
| --- | --- | :---: |
|
|
343
|
+
| **Mock E2E** | 渲染、流式、交互、持久化与隔离(模型回答是**脚本化**的) | **30 / 30** |
|
|
344
|
+
| **真实模型 · API** | 模型选对工具、**首次**就给出合法参数、渲染出的界面包含所要求的组件和数据。模型看到的是插件真实的工具与引导,并执行工具自身的 `execute()`(含 `ui_patch`) | **30 / 32**(94%) |
|
|
345
|
+
| **真实模型 · 浏览器** | 模型生成的界面在真实 DSH Web + Chrome 中真正可用:能渲染、能交互、经得起停止/恢复和弱网,控制台无错误 | 自动化 **9 / 11**<br>人工复核后 **8 / 11** |
|
|
306
346
|
|
|
307
|
-
|
|
347
|
+
| 耗时(真实模型) | p50 | p95 |
|
|
348
|
+
| --- | ---: | ---: |
|
|
349
|
+
| 首次出现可见预览(浏览器) | 7.6 s | 70.2 s |
|
|
350
|
+
| 界面生成完成(浏览器) | 11.8 s | 73.4 s |
|
|
351
|
+
| 流结束后的浏览器端执行(组件代码、从 CDN 加载 three.js) | 26 ms | 2.9 s |
|
|
352
|
+
| 单次模型 API 调用 | 2.4 s | 75.7 s |
|
|
308
353
|
|
|
309
|
-
|
|
354
|
+
长尾来自体积较大的 Three.js 组件:模型要先写出 10–20 KB 代码,预览才会开始。
|
|
355
|
+
|
|
356
|
+
**本次评测发现的问题。** 以下都是模型与 Agent 的真实行为,不是评测噪声,每一条都对应[完整报告](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/main/docs/real-model-eval.md)中失败或被标注的用例:
|
|
357
|
+
|
|
358
|
+
- **工具调用中途被截断(R-chart):** 图表本身渲染正确,但这一轮在还有组件流式生成时就结束了。插件正确地把卡片降级为「生成已中断,以下为已完成的部分」,并提供「重新生成」。自动化内容检查通过了,但人工复核判为失败;现在新增的检查会让任何留下中断卡片的用例失败。
|
|
359
|
+
- **Agent 去查资料而不是出界面(R-table):** DSH 的 Agent 把 5 分钟预算全花在上网查车型参数上(20 步,约 130 万 token),始终没有渲染出表格。
|
|
360
|
+
- **Three.js 作用域错误:** 两次录制,出现同一类错误的两种形式:本次是 `view is not defined`,上次是 `THREE is not defined`,都是组件代码在作用域之外使用了变量。卡片上标出「1 个脚本错误」,两次都是用户点击 **「让模型修复」** 后得到了正常场景。
|
|
361
|
+
- **首次参数无效(API):** 嵌套 `props` 漏写右花括号(D2,两轮都出现),以及组件 id 重复(B1)。插件会拒绝这些调用,模型重试后能改对,但用户会短暂看到一张被拒绝的卡片,所以这些用例算作失败。
|
|
362
|
+
- **界面之外的 Agent 行为:** DSH 的 Agent 可能先搜索工作区、先反问用户,或派子智能体查资料。浏览器阶段会像真实用户一样回答反问(选推荐项),并等待界面本身出现,而不只是等这一轮结束。
|
|
363
|
+
|
|
364
|
+
<details>
|
|
365
|
+
<summary><b>▶️ 如何运行</b></summary>
|
|
366
|
+
<br>
|
|
367
|
+
|
|
368
|
+
把密钥放进环境变量。不会读取任何凭据文件;如果报告里仍含有密钥,运行会拒绝写出报告。
|
|
310
369
|
|
|
311
370
|
```sh
|
|
312
|
-
export DEEPSEEK_API_KEY='
|
|
313
|
-
|
|
371
|
+
export DEEPSEEK_API_KEY='<your-key>' # PowerShell:$env:DEEPSEEK_API_KEY = '<your-key>'
|
|
372
|
+
npm run eval:real # Mock E2E + API + 浏览器;任何失败都以退出码 1 结束
|
|
373
|
+
npm run eval:real -- --repeat 3 # 每个 API 用例跑 3 次 → 单用例成功率与 p50/p95
|
|
374
|
+
npm run eval:real -- --record && npm run eval:demo # 同时录制并剪辑演示视频
|
|
375
|
+
npm run eval:gallery # 把 README 截图统一排版为 1200×750
|
|
314
376
|
```
|
|
315
377
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
378
|
+
| 选项 | 作用 |
|
|
379
|
+
| --- | --- |
|
|
380
|
+
| `--stage mock,api,browser` | 只运行部分层(默认 `all`)。仍可用 `A`/`B`/`C`/`D` 选择 API 类别。 |
|
|
381
|
+
| `--only B3,R-chart` | 只运行这些用例。 |
|
|
382
|
+
| `--keep-other-layers` | 保留本次没有运行的层(配合 `--only` 时保留其他用例),各自保留原来的日期。 |
|
|
383
|
+
| `--append` | 配合 `--only`:把重跑结果作为额外样本加入,绝不用一次侥幸成功覆盖失败。 |
|
|
384
|
+
| `--rescore` | 用当前断言、基于已保存的对话记录重新判定上一次 API 运行,不调用模型。 |
|
|
385
|
+
| `DEEPSEEK_EVAL_MODEL` | 模型 id(默认 `deepseek-flash`)。 |
|
|
320
386
|
|
|
321
|
-
|
|
387
|
+
GitHub 上的 **Real-model eval** 工作流可按需手动触发,使用仓库密钥 `DEEPSEEK_API_KEY` 运行同一条命令,并上传报告和截图。用 `deepseek-flash` 完整跑一遍约花费 ¥1.5。
|
|
322
388
|
|
|
323
389
|
</details>
|
|
324
390
|
|
|
391
|
+
<details>
|
|
392
|
+
<summary><b>🔬 每个用例检查什么</b></summary>
|
|
393
|
+
<br>
|
|
394
|
+
|
|
395
|
+
**API 阶段**(`scripts/eval/api-stage.mjs`,16 个用例,断言 v3)。每条要求单独成为一项检查,报告会写明具体是*哪一条*失败:
|
|
396
|
+
|
|
397
|
+
- **纯文本(A1–A4):** 不调用任何界面工具,给出有内容的回答。
|
|
398
|
+
- **图表与数据表(B1–B3、B5):**
|
|
399
|
+
- 按含义识别的指标卡(收入、活跃用户(含月活/MAU)、转化率、客单价);
|
|
400
|
+
- 包含全部五个所需列的可排序表格;
|
|
401
|
+
- **含 Q1–Q4、且同时有线上与线下两个系列的柱状图**(2026-10-10 那份 B3 回答只有表单、没有图表,现作为测试夹具保留,必须判为失败);
|
|
402
|
+
- 至少 4 个里程碑的时间线(`Timeline`,或包含 4 个以上按序年份的 Mermaid 图)。
|
|
403
|
+
- **表单(B4、D1):** 包含滑块、复选框和下拉选择。D1 按浏览器的方式提交表单,并要求后续回答使用提交的区域、季度数和情景。
|
|
404
|
+
- **数学 Plot(C2):** 三个滑块,*每个滑块都出现在表达式中*,函数形状为 `exp(…)·sin/cos(…)`。
|
|
405
|
+
- **Three.js 与组件(C1、C3、C4):** 使用 `UI.three()`/`import("three")`,有动画、光照、启动/暂停和参数控件。
|
|
406
|
+
- **多轮修改:** D2 新增一列,每款机型的值都正确,旧值全部保留。D3 连续修改两次(柱状 → 折线,再按准确数值加入第三个系列,原系列不变)。是否用 `ui_patch` 原位修改也会记录。
|
|
407
|
+
|
|
408
|
+
每个用例都记录:工具选择、首次 Schema 是否有效与是否恢复、每次调用的 API 耗时、API 返回的模型 id 与 `system_fingerprint`,以及提示词哈希。
|
|
409
|
+
|
|
410
|
+
**浏览器阶段**(`scripts/eval/browser-stage.mjs`,11 个用例,每个都在新会话中运行):
|
|
411
|
+
|
|
412
|
+
- **纯文本:** 不创建任何卡片。
|
|
413
|
+
- **图表:** 有图例、Q1–Q4、至少 8 根柱子,本地悬停提示。
|
|
414
|
+
- **数据表:** 点击表头重新排序,不调用模型。
|
|
415
|
+
- **表单:** 用真实鼠标和键盘填写并提交;后续回答必须提到提交的值;表单随后锁定。
|
|
416
|
+
- **Plot:** 拖动滑块会重绘曲线。
|
|
417
|
+
- **Three.js:** 画布**确实绘制了内容而非空白**(像素统计),拖动会改变画面,且没有组件脚本错误。失败时会尝试「让模型修复」并报告结果。
|
|
418
|
+
- **停止/恢复:** 中途停止 → 静态预览、提示和「重新生成」→ 完整场景。
|
|
419
|
+
- **两轮原位修改:** 只有一张活跃卡片,第 3 版,折线图,第三个系列。
|
|
420
|
+
- **弱网络:** Fast 3G,禁用缓存。
|
|
421
|
+
- **无网络:** 屏蔽 CDN;失败必须显示在卡片上,DSH 页面不能有未捕获错误,对话必须能继续。
|
|
422
|
+
- **手机宽度(390 px):** 无溢出;指标网格最多 2 列。
|
|
423
|
+
|
|
424
|
+
每个用例还会记录控制台错误,并区分宿主页面和组件 iframe。额度用尽等 DSH 运行失败记为*基础设施*错误,不计入模型成功率。
|
|
425
|
+
|
|
426
|
+
自动化检查无法评判视觉质量,所以报告还附有对每张截图的**抽样人工复核**。
|
|
427
|
+
|
|
428
|
+
</details>
|
|
429
|
+
|
|
430
|
+
> [!IMPORTANT]
|
|
431
|
+
> [2026-10-10 的报告](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/main/docs/history/2026-10-10-real-model-eval-report.json)(15/15)只是**历史快照**,不是通过率。它出自一个只检查 API 的旧判分器:B3 没有渲染出图表却被判为通过,而且没有保存重新判分所需的参数。当前结果见 [`docs/real-model-eval.md`](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/main/docs/real-model-eval.md)(可读版)和 [`docs/real-model-eval-report.json`](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/blob/main/docs/real-model-eval-report.json)。
|
|
432
|
+
|
|
325
433
|
## 已知限制
|
|
326
434
|
|
|
327
435
|
- 沙箱组件、`Math` 和 `Mermaid` 需要能访问 CDN 白名单。离线时,`Math` 和 `Mermaid` 退回显示源码,`UI.three` 会报告脚本错误。
|
|
@@ -331,3 +439,5 @@ node scripts/run-real-model-suite.mjs all
|
|
|
331
439
|
## 致谢
|
|
332
440
|
|
|
333
441
|
概念、流式组件协议和部分提示词来自 [CopilotKit/OpenIntelligentUI](https://github.com/CopilotKit/OpenIntelligentUI)(MIT 许可)。本项目采用 MIT 许可。
|
|
442
|
+
|
|
443
|
+
**演示视频中的鲸鱼娘。** 担任视频解说的 DeepSeek 鲸鱼娘(共 26 个姿态)来自 [Sutera-Diffusus/dsh-whale-musume](https://github.com/Sutera-Diffusus/dsh-whale-musume)(MIT © Sutera-Diffusus,立绘作者 [@SuteraWu](https://github.com/SuteraWu))。原始文件及其许可证见 [`scripts/eval/demo/assets/whale/`](https://github.com/dreamfarer-space/deepseek-harness-intelligent-ui/tree/main/scripts/eval/demo/assets/whale),不包含在 npm 包中。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -23,3 +23,11 @@ Copyright (c) Big Sky Software. Permission to use, copy, modify, and/or distribu
|
|
|
23
23
|
## React — MIT License
|
|
24
24
|
|
|
25
25
|
React is provided at runtime by the DSH Web shell. It is not bundled.
|
|
26
|
+
|
|
27
|
+
## dsh-whale-musume whale-girl illustrations (demo video only) — MIT License
|
|
28
|
+
|
|
29
|
+
https://github.com/Sutera-Diffusus/dsh-whale-musume
|
|
30
|
+
|
|
31
|
+
26 unmodified illustrations in `scripts/eval/demo/assets/whale/` narrate the demo video and GIF in `docs/assets/real-model/`. They are not included in the npm package. The full licence text is in `scripts/eval/demo/assets/whale/LICENSE`.
|
|
32
|
+
|
|
33
|
+
Copyright (c) 2026 Sutera-Diffusus. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, subject to the condition that the above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
|