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

动效交互界面 Scorp1o117/dsh-motion-ui

DeepSeek Harnessv0.8.9
Scorp1o1177 天前有提交已提供中文文档扫描:含敏感能力

让 DeepSeek Harness 的回答按需变成可交互界面、图解与动画:从对比表、测验和参数计算,到…

49.1/100
综合分
41
GitHub 星标
811
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-motion-ui
npm 源 · dsh-motion-ui 的发布者账号已校验与本仓库一致

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-motion-ui @ 0.8.9
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 20:22:38

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 64 处,展示前 50 条)
  • 发起网络请求
    client.js:3403
    const response = await fetch(url, { credentials: "same-origin", ...options });
  • 发起网络请求
    client.js:4288
    fetch("/api/plugins/dsh-generative-ui/document?" + new URLSearchParams({ documentId: raw.documentId, sessionId }), { credentials: "same-origin", signa
  • 发起网络请求
    client.js:4314
    const r = await fetch(url, { credentials: "same-origin", ...options }), value = await r.json();
  • 发起网络请求
    client.js:4347
    const r = await fetch(url + "&revision=" + revision3, { credentials: "same-origin" }), v2 = await r.json();
  • 写入剪贴板
    client.js:5473
    await navigator.clipboard.writeText(text3);
  • 发起网络请求
    client.js:5642
    fetch("/api/plugins/dsh-generative-ui/document?" + new URLSearchParams({ documentId: record.documentId, sessionId }), { method: "POST", credentials: "
  • 发起网络请求
    client.js:6322
    const r = await fetch("/api/plugins/dsh-generative-ui/media-capabilities", { credentials: "same-origin", cache: "no-store" });
  • 写入剪贴板
    client.js:6390
    await navigator.clipboard.writeText(scene.prompt);
  • 读取本地文件
    lib/motion-design-skill.js:14
    readFile(new URL('SKILL.md',base)),readFile(new URL('ADAPTER.md',base),'utf8'),
  • 读取本地文件
    lib/motion-design-skill.js:15
    readFile(new URL('upstream.json',base),'utf8'),readFile(new URL('SOURCES.md',base),'utf8')
  • 写入本地文件
    lib/store.js:21
    await mkdir(dirname(path), { recursive: true }); const temp = `${path}.${randomUUID()}.tmp`;
  • 写入本地文件
    lib/store.js:22
    try { await writeFile(temp, JSON.stringify(value), { encoding: 'utf8', mode: 0o600 }); await rename(temp, path); }
  • 写入本地文件
    lib/store.js:22
    try { await writeFile(temp, JSON.stringify(value), { encoding: 'utf8', mode: 0o600 }); await rename(temp, path); }
  • 删除本地文件
    lib/store.js:23
    finally { await unlink(temp).catch(e => { if (e.code !== 'ENOENT') throw e; }); }
  • 读取本地文件
    lib/store.js:31
    const record = JSON.parse(await readFile(this.documentPath(id), 'utf8'));
  • 读取本地文件
    lib/store.js:39
    const saved = JSON.parse(await readFile(path, 'utf8'));
  • 写入本地文件
    lib/store.js:53
    await mkdir(dirname(path), { recursive: true });
  • 写入本地文件
    lib/store.js:58
    await writeFile(temp, JSON.stringify(record), { encoding: 'utf8', mode: 0o600 });
  • 读取本地文件
    lib/store.js:62
    if (await readFile(path, 'utf8') !== JSON.stringify(record)) throw new UiStoreError(500, 'History record differs from saved version');
  • 删除本地文件
    lib/store.js:64
    } finally { await unlink(temp).catch(e => { if (e.code !== 'ENOENT') throw e; }); }
  • 读取本地文件
    lib/store.js:68
    let names = []; try { names = await readdir(dirname(this.historyPath(id, 0))); } catch (e) { if (e.code !== 'ENOENT') throw e; }
  • 读取本地文件
    lib/store.js:79
    const record = JSON.parse(await readFile(this.historyPath(id, revision), 'utf8'));
  • 读取本地文件
    lib/store.js:122
    const {readdir}=await import('node:fs/promises');const record=await this.readDocument(id),names=(await readdir(this.directory)).filter(n=>n.startsWith
  • 读取本地文件
    lib/ui-skill.js:38
    const skill=readFileSync(new URL('../skills/intelligent-ui/SKILL.md',import.meta.url),'utf8');
  • 读取本地文件
    lib/visual-assets.js:4
    const register=(directory,prefix='')=>{for(const f of readdirSync(directory,{withFileTypes:true})){if(f.isDirectory()){register(new URL(f.name+'/',dir
  • 读取本地文件
    lib/visual-assets.js:5
    ctx.effect(()=>ctx.connection.fetch.register({path:'/api/plugins/dsh-generative-ui/assets/'+name,methods:['GET'],requestBody:'buffered',fetch:()=>new
  • 执行外部命令来自配置/变量
    lib/video.js:26
    const child=spawn(command,args,{shell:false,windowsHide:true,stdio:['ignore','pipe','pipe'],signal,cwd});
  • 执行外部命令来自配置/变量
    lib/video.js:35
    const child=spawn(executable('ffmpeg'),['-v','error','-nostdin','-y','-f','image2pipe','-framerate',String(spec.fps),'-protocol_whitelist','file,pipe,
  • 读取本地文件
    lib/video.js:43
    const info=await stat(path);if(!info.isFile())throw Error('Motion video: input is not a regular file');return path;
  • 读取本地文件
    lib/video.js:60
    if(process.env.DSH_MOTION_BROWSER){await access(process.env.DSH_MOTION_BROWSER);return {executablePath:process.env.DSH_MOTION_BROWSER}}
  • 读取本地文件
    lib/video.js:61
    try{await access(chromium.executablePath());return {}}catch{}
  • 读取本地文件
    lib/video.js:67
    for(const path of candidates)try{await access(path);return {executablePath:path}}catch{}
  • 写入本地文件
    lib/video.js:87
    async job(sessionId,kind){if(typeof sessionId!=='string'||!sessionId)throw Error('Motion video: conversation required');const id=randomUUID(),director
  • 写入本地文件
    lib/video.js:88
    async save(job){if(job.recipe){await writeFile(join(job.directory,'recipe.json'),JSON.stringify(job.recipe,null,2),'utf8');if(!job.files.includes('rec
  • 写入本地文件
    lib/video.js:101
    const file=`audio-${i}${ext}`;await copyFile(t.path,join(job.directory,file));job.files.push(file);saved.push({...t,path:file,duration:seconds});
  • 读取本地文件
    lib/video.js:104
    const sourceJob=JSON.parse(await readFile(join(dirname(t.path),'manifest.json'),'utf8'));
  • 写入本地文件
    lib/video.js:106
    for(const [source,suffix]of [['narration.txt','.txt'],['timings.json','-timings.json'],['subtitles.raw.json','-subtitles.json']]){const target=`voice-
  • 写入本地文件
    lib/video.js:122
    await writeFile(join(job.directory,'source.html'),standaloneCanvas(record.document,node,state,theme));await writeFile(join(job.directory,'document.jso
  • 写入本地文件
    lib/video.js:126
    if(args.audioPath){await localMediaPath(args.audioPath);const ext=extname(args.audioPath).toLowerCase();if(!['.wav','.mp3','.m4a','.aac','.ogg','.flac
  • 删除本地文件
    lib/video.js:210
    await unlink(join(job.directory,'silent.mp4'));
  • 读取本地文件
    lib/video.js:240
    if(!await stat(join(job.directory,file)).then(s=>s.size>0,()=>false)){
  • 删除本地文件
    lib/video.js:271
    for(let i=0;i<clips.length;i++)await unlink(join(job.directory,`clip-${i}.mp4`));await unlink(join(job.directory,'joined.mp4'));await unlink(join(job.
  • 读取本地文件
    lib/voice.js:9
    let saved={};try{saved=JSON.parse(await readFile(join(homedir(),'.mmx','config.json'),'utf8'))}catch{}
  • 读取密钥环境变量
    lib/voice.js:10
    return {key:process.env.MINIMAX_API_KEY||saved.api_key,region:process.env.MINIMAX_REGION||saved.region||'cn'};
  • 写入本地文件
    lib/voice.js:57
    const job=await studio.job(sessionId,'voice');job.files=['narration.txt'];await writeFile(join(job.directory,'narration.txt'),args.text);await studio.
  • 写入本地文件
    lib/voice.js:63
    const audio=join(job.directory,'narration.mp3');await writeFile(audio,Buffer.from(result.data.audio,'hex'));job.files.push('narration.mp3');await stud
  • 写入本地文件
    lib/voice.js:68
    const raw=await subtitles.json();await writeFile(join(job.directory,'subtitles.raw.json'),JSON.stringify(raw,null,2));job.files.push('subtitles.raw.js
  • 写入本地文件
    lib/voice.js:69
    await writeFile(join(job.directory,'timings.json'),JSON.stringify(timings,null,2));
  • 读取本地文件
    lib/project-archive.js:10
    const body=await readFile(join(directory,name)),n=Buffer.from(name),crc=crc32(body),h=Buffer.alloc(30);
  • 写入本地文件
    lib/project-archive.js:15
    await writeFile(join(directory,'project.zip'),Buffer.concat([...locals,...central,end]));
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery@deepseek-ai/dsh-tools@deepseek-ai/dsh-home-paths
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

4 张 · 点击查看大图

功能亮点

  • 生成可交互组件
  • HTML/SVG图表
  • 动画视图

为 DeepSeek Harness Web 提供交互式 UI、HTML/SVG 图表与动画

v0.8.92026-10-31
支持 DSH 0.2.1-rc.4 和 0.2.1-rc.5,保留此前声明的兼容版本。 开发 SDK 已更新至 rc.5,客户端已重新构建。 验证:项目测试通过;在独立的 rc.4 和 rc.5 Web Profile 中安装插件并检查配置页面。原生 Desktop 未在本次实机验证。
v0.8.82026-10-24
支持 DSH 0.2.1-rc.3:兼容性与 SDK 对等版本范围现已包含新的宿主版本,开发用 SDK 固定到 rc.3,客户端已重新构建。rc.2 到 rc.3 的宿主差异把导航入口定制重建为基于区域自有固定项和「更多」菜单,并移除了 ctx.layout.entryVisibility、插件商店、左侧栏拖拽排序和 agentPresetNavigation,Motion UI 均未用到这些。 「更多」菜单位于侧边栏和会话头部插槽,在会话文档界面之外;皮肤语法仍以通用方式保护原生组件几何。工具契约、渲染行为、用户设置和模型限制均未变。 验证:针对重新构建的包运行 149 项单元/集成测试;用官方命令行从随附 Web 模板做隔离配置档安装、配置组合、启动,并完成带认证的 HTTP 200 请求,无激活警告。完整细节见 docs/compatibility-0.2.1-rc.3.md。Web 已测;桌面端验证另行进行。
v0.8.72026-10-18
补齐 0.8.6 遗漏的原生组件圆角防护,修复 Issue #4。 · 补齐原生组件的皮肤兼容 · 修复步骤卡片和提示块遗漏圆角防护的问题(Issue #4):明亮扁平的步骤卡片恢复 18px,提示块保留左侧直角、右侧圆角。 · 扩展防护至步骤编号、按钮、徽标、标签、进度、分段选择、步进控件、操作菜单与开关滑块等原生元素,避免相同皮肤补丁继续清除局部形状。 · 为文本/代码复制块的独立样式记录原始圆角,保留各风格和自由模式下的桌面/窄屏设计。 · 保留非对称圆角、有意使用的直角、设置预览及模型画布内部样式。 · 验证 · 扩展原有 2,304 个组合检查,逐个核对步骤、提示块及更多原生元素的四角几何,并检查开关伪元素。 · 执行完整回归及正式包安装验证。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
DSH Motion UI 让 DeepSeek Harness 的回答按需变成可交互界面、图解与动画:从对比表、测验和参数计算,到 HTML/SVG 画布、机械演示与本地视频制作。模型仍可正常用文字回答;是否生成界面取决于任务、模型和设置。 能做什么? | 场景 | 能力 | | 日常说明 | 卡片、对比、流程、时间线、代码、公式与选项卡 | | 数据探索 | 表格筛选 / 排序、CSV 导出、图表和可调参数 | | 学习与收集信息 | 本地测验、表单、函数图和结构图解 | | 自由表达 | 模型生成的 HTML/SVG、动画、基础 3D 和交互画布 | | 机械演示 | 装配拆解、齿轮和曲柄连杆等可调示意 | | 视频制作 | 动效时间轴、分镜预览、MP4 导出、剪辑,以及可选的配音和字幕 | 生成的界面可以在正文和 智能 UI 侧栏查看;兼容的参数与部分视图状态可保存,后续也可让模型修改已有界面。控件变化在本地响应,只有明确提交后续请求时才会把参数发送给 Agent。 实际生成示例 下图来自开发期的真实 DSH 会话。第一张由 DeepSeek V4.1 Flash Fast 在电路问题中主动生成;第二张由 DeepSeek V4.1 Flash 按动画需求生成,展示的是静态截图。效果随模型与提示词变化,示意图不等同于精确仿真。
展开完整文档(README 剩余 1 节)
DSH Motion UI

让 DeepSeek Harness 的回答按需变成可交互界面、图解与动画:从对比表、测验和参数计算,到 HTML/SVG 画布、机械演示与本地视频制作。模型仍可正常用文字回答;是否生成界面取决于任务、模型和设置。

能做什么?

| 场景 | 能力 |
| 日常说明 | 卡片、对比、流程、时间线、代码、公式与选项卡 |
| 数据探索 | 表格筛选 / 排序、CSV 导出、图表和可调参数 |
| 学习与收集信息 | 本地测验、表单、函数图和结构图解 |
| 自由表达 | 模型生成的 HTML/SVG、动画、基础 3D 和交互画布 |
| 机械演示 | 装配拆解、齿轮和曲柄连杆等可调示意 |
| 视频制作 | 动效时间轴、分镜预览、MP4 导出、剪辑,以及可选的配音和字幕 |

生成的界面可以在正文和 智能 UI 侧栏查看;兼容的参数与部分视图状态可保存,后续也可让模型修改已有界面。控件变化在本地响应,只有明确提交后续请求时才会把参数发送给 Agent。

实际生成示例

下图来自开发期的真实 DSH 会话。第一张由 DeepSeek V4.1 Flash Fast 在电路问题中主动生成;第二张由 DeepSeek V4.1 Flash 按动画需求生成,展示的是静态截图。效果随模型与提示词变化,示意图不等同于精确仿真。

串并联电路的交互讲解:电路、参数和对比曲线

可调节振幅和频率的单摆动画示意

查看全部截图及来源。

兼容性与安装

- 支持 DSH Web / Desktop;当前仓库明确声明兼容 0.2.0-rc.2、0.2.1-rc.1、0.2.1-rc.2 和 0.2.1-rc.3,以 package.json 为准。
- 要求 Node.js >=22.19。日常界面不需要视频工具链;视频制作的额外要求见下文。

Desktop 先在 应用 → 管理 dsh 命令 安装桌面版 dsh:

dsh plugin --profile desktop add dsh-motion-ui

Web 将 desktop 改为 web。安装后重启 DSH;Web 还需刷新浏览器页面。插件设置位于 插件 → 已安装 → dsh-motion-ui,也可通过 Enhancement Suite 安装。

如果安装过开发版 dsh-generative-ui,请先卸载旧插件,再安装 Motion UI;两者注册相同工具,不应同时启用。旧界面文档保留兼容读取,但需要在新插件入口重新选择设置。

快速开始

直接提出适合可视化的需求,例如:

- “用可调参数的界面解释电压、电流和功率的关系。”
- “把这两个方案做成对比表,让我调整预算。”
- “做一个带答案解析的本地小测验。”
- “用动画展示齿轮传动,提供转速和暂停控件。”

在插件设置中可选择引导模式或自由模式。引导模式提供设计指导、风格和示例;自由模式让模型自主设计,不注入这套风格与案例。模型是否主动调用工具,以及界面质量和准确性,取决于模型及请求。

工具与工作方式

| 工具 | 用途 |
| render_text / render_scene | 快速文字排版或常见流程、对比、分配和预算场景 |
| render_ui | 经校验的原生组件、图表、测验和表单 |
| render_canvas | 自由 HTML / SVG 画布与动画 |
| render_mechanism | 装配、齿轮、曲柄连杆示意 |
| ui_catalog | 按需获取协议、字段和示例 |
| inspect_ui / update_ui / patch_ui | 查看和继续修改已有界面 |

生成过程中可渐进预览已完成的内容;正式交互在结果成功交付并恢复状态后启用。对 PTC / 组合工具调用,部分宿主路径可能只显示文本回退。卸载插件不会自动删除保存在本地的界面状态。

视频制作

明确要求制作视频时,模型可预览时间轴、渲染 MP4、检查视频或拼接片段;也可交付可编辑源码与工程文件。使用前请准备本机 Chrome / Edge 或 Playwright Chromium、FFmpeg 和 FFprobe,插件不会自动下载浏览器或编码器。可在插件设置中检查视频环境。

配音可选使用 MiniMax,需要单独配置认证并可能产生 API 费用;没有配音服务也可制作无声动效。普通对话不会自动导出视频。抽帧检查只覆盖采样画面,不等同于完整视觉、音频或内容审核。

限制与安全

- 图表、计算和示意图的正确性取决于输入数据、模型生成和具体实现;专业用途请核对结果。
- 自由画布运行于隔离 iframe,限制对宿主页面及网络的访问;隔离不提供硬性的 CPU / 内存上限,复杂或异常代码仍可能影响页面响应。
- 不要将无关的密钥或私密内容交给生成的画布。外部服务、模型和素材各有自己的使用条件。
- 本项目不声称实现 ChatGPT 的专有 UI 协议或编译器。

更多资料

- 更新记录 · 验证说明 · 历史详细文档(包含协议与示例;旧安装和兼容性信息可能过时)
- 扩展组件核心复用 dsh-genui;机械图解参考 Anatomy;动效技能来自 OpenDesign。具体版本、来源和许可见 dsh-genui NOTICE、Anatomy NOTICE 和 motion-design NOTICE。
- npm · 问题反馈 · MIT License
预览分享卡片长什么样 ↓Scorp1o117/dsh-motion-ui
分享 · DeepSeek Harness Hub
Scorp1o117/dsh-motion-ui

让 DeepSeek Harness 的回答按需变成可交互界面、图解与动画:从对比表、测验和参数计算,到…

回到顶部