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

AIGC 无限画布 HuanLinOTO/dsh-plugin-aigc-canvas

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

DSH 插件:一个节点-连线式的 AIGC 画布。向模型暴露五类工具:文生图 / 文生视频 / 首尾帧生视频 /…

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

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

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

状态速览

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

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

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

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

✓npm 包@huanlin/dsh-plugin-aigc-canvas @ 0.2.2
✓Node 引擎要求 >=20 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 30 处,展示前 17 条)
  • 读取本地文件
    lib/index.js:394
    if (!existsSync(path)) return;
  • 删除本地文件
    lib/index.js:396
    await rm(imported, { force: true });
  • 写入本地文件
    lib/index.js:397
    await rename(path, imported);
  • 读取本地文件
    lib/index.js:412
    const parsed = JSON.parse(readFileSync(path, "utf8"));
  • 写入本地文件
    lib/index.js:663
    await writeFile(tmp, JSON.stringify(value), "utf8");
  • 写入本地文件
    lib/index.js:664
    await rename(tmp, path);
  • 删除本地文件
    lib/index.js:666
    await import("node:fs/promises").then(({ rm }) => rm(tmp, { force: true }).catch(() => {}));
  • 读取本地文件
    lib/index.js:713
    raw = await readFile(path, "utf8");
  • 写入本地文件
    lib/index.js:740
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:752
    await mkdir(join(cwd, CANVAS_DIR, sessionId), { recursive: true });
  • 写入本地文件
    lib/index.js:753
    await writeFile(filePath, params.promptText, "utf8");
  • 读取本地文件
    lib/index.js:803
    const info = await stat(resolved).catch(() => void 0);
  • 读取本地文件
    lib/index.js:1017
    const bytes = await readFile(join(ASSETS_DIR, filename));
  • 发起网络请求
    lib/index.js:1351
    response = await fetch(url, {
  • 执行外部命令来自配置/变量
    lib/index.js:1477
    const child = spawn(cmd, args, {
  • 读取本地文件
    lib/index.js:1509
    const info = await stat(filePath).catch(() => void 0);
  • 发起网络请求
    lib/client.js:22
    response = await fetch(`/aigc-canvas/api/${method}`, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

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

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

功能亮点

  • 节点连线式画布
  • 文生图与文生视频
  • 首尾帧生视频
展开完整介绍(128 字)↓

服务商无关的 AIGC HTTP 桥 + 无限画布 + ffmpeg 后处理,13 个工具含画布连边、reroll、媒体编辑 | 服务商无关的 AIGC HTTP 桥 + 无限画布 + ffmpeg 后处理;13 个工具,含画布连边、reroll、媒体编辑

README

由 DeepSeek 最新模型翻译生成
dsh-aigc-canvas DSH 插件:一个节点-连线式的 AIGC 画布。向模型暴露五类工具:文生图 / 文生视频 / 首尾帧生视频 / 多参考生视频 / 音频生成。生成的图片 / 视频 / 音频以及提示词都作为画布元素存在(用 uuid 寻址),生成完成后自动按多对一(promise + 所有参考元素 → 输出)在画布上连线。 安装 从 npm 安装(推荐): dsh plugin --profile web add @huanlin/dsh-plugin-aigc-canvas 从本地 clone 开发安装(开发阶段): dsh plugin --profile web add link:D:\Projects\deepseek-harness\dsh-aigc-canvas 预构建的 lib/ 一并入库(含 @deepseek-ai/ private peer deps,必须预构建)。从 npm 安装开箱即用,无需 allowBuilds。 配置 在 cordis.patch.yml 或 DSH GUI 中配置: | 字段 | 类型 | 默认值 | 说明 | | baseURL | string | stub://aigc-backend | AIGC 后端 API 地址。
展开完整文档(README 剩余 1 节)
dsh-aigc-canvas

DSH 插件:一个节点-连线式的 AIGC 画布。向模型暴露五类工具:文生图 / 文生视频 / 首尾帧生视频 / 多参考生视频 / 音频生成。生成的图片 / 视频 / 音频以及提示词都作为画布元素存在(用 uuid 寻址),生成完成后自动按多对一(promise + 所有参考元素 → 输出)在画布上连线。

安装

从 npm 安装(推荐):
dsh plugin --profile web add @huanlin/dsh-plugin-aigc-canvas

从本地 clone 开发安装(开发阶段):
dsh plugin --profile web add link:D:\Projects\deepseek-harness\dsh-aigc-canvas

预构建的 lib/ 一并入库(含 @deepseek-ai/ private peer deps,必须预构建)。从 npm 安装开箱即用,无需 allowBuilds。

配置

在 cordis.patch.yml 或 DSH GUI 中配置:

| 字段 | 类型 | 默认值 | 说明 |
| baseURL | string | stub://aigc-backend | AIGC 后端 API 地址。stub://aigc-backend = 内置 stub 后端(不走网络,合成 PNG/MP4/MP3 字节)。填其他值会触发 backend-error,等待未来实现 |
| apiKeyEnv | credential-ref | AIGC_API_KEY | API key 的环境变量名 / 凭据引用。stub 后端不读 |
| requestTimeoutMs | number | 60000 | 单次后端请求超时(ms) |
| mediaSizeLimit | number | 104857600 (100 MiB) | 单个媒体文件大小上限(媒体路由校验) |

工具

模型可见的六个工具,都在调用代理的会话作用域内执行(模型不需要传 sessionId):

aigc_text_to_image

文生图。prompt 也作为 prompt 元素存入画布,生成的图片作为 image 元素,自动连线 prompt → image。

参数:prompt(必填)、negative_prompt、width(默认 1024)、height(默认 1024)、seed。

aigc_text_to_video

文生视频。同上,prompt 元素 → video 元素。

参数:prompt(必填)、negative_prompt、width(默认 1280)、height(默认 720)、duration_seconds(默认 5)、seed。

aigc_first_last_frame_to_video

首尾帧 + 文生视频。first_frame_uuid / last_frame_uuid 必须是已存在的 image 元素 uuid(由 aigc_text_to_image 返回)。prompt 元素 + 两个 image 元素都 → video 元素(三条边)。

参数:prompt(必填)、first_frame_uuid(必填)、last_frame_uuid(必填)、width、height、duration_seconds、seed。

aigc_multi_reference_to_video

多参考生视频。reference_uuids 是 image / video / audio 元素的 uuid 数组(至少一个)。prompt 元素 + 所有参考元素都 → video 元素。

参数:prompt(必填)、reference_uuids(必填,非空数组)、width、height、duration_seconds、seed。

aigc_generate_audio

文本生成音频。prompt 元素 → audio 元素。

参数:prompt(必填)、duration_seconds(默认 10)、seed。

aigc_canvas_list_elements

只读:返回当前会话画布的完整快照(elements + edges)。用于长工具序列后恢复状态、查找要传给后续调用的 uuid。

参数:无。

画布视图

通过 better-sidebar 的服务消费(ctx.betterSidebar.registerTab)注册一个 aigc-canvas:main tab。tab 是单实例(每个会话一个),打开后:

- 通过 WebSocket /aigc-canvas/ws/canvas?sessionId=... 订阅 host 端的画布变更推送
- 首次加载会先 HTTP POST /aigc-canvas/api/canvas.list priming 一次快照
- 节点按 vertical flow 排列,每个节点的入边在节点上方以 chip 形式显示(短 uuid)
- 不同 kind 用左侧色条区分:prompt 蓝 / image 绿 / video 橙 / audio 紫
- WS 断开后 2 秒自动重连

better-sidebar 未安装时,host 半的工具 + 元素表仍然正常工作,只是没有 UI 可视化(未来的 host-side 消费者可以通过 ctx.aigcCanvas 服务读取状态)。

存储

每个会话的画布状态(元素表 + 边)持久化到:

<cwd>/.dsh-aigc-canvas/<sessionId>/canvas.json

媒体文件落到同目录:

<cwd>/.dsh-aigc-canvas/<sessionId>/<uuid>.<ext>

扩展名由 kind 决定:prompt → .txt(实际上 prompt 元素不写文件,只在 JSON 中存 promptText)、image → .png、video → .mp4、audio → .mp3。

刷新浏览器 / 重启 DSH 后,会话画布从 canvas.json 重新水合,媒体文件保留在原位。

开发

pnpm install # 安装开发依赖(schemastery、typescript、vitest、tsdown)
pnpm run typecheck # tsc --noEmit 类型检查
pnpm test # vitest run 单元测试(canvas-registry / tools / wire)
pnpm run build # tsdown 构建 → lib/index.js + lib/client.js
pnpm watch # tsdown --watch(client bundle 热重建)

构建产物:
- lib/index.js — host 入口(cordis 插件,提供 ctx.aigcCanvas 服务 + 路由 + 工具)
- lib/client.js — 浏览器 bundle(window.__ModuleLoader__.load 闭包工厂,id = @dsh-external/dsh-aigc-canvas)
- lib/index.d.ts 等 — TypeScript 声明(由 tsc -p tsconfig.json 产出,不在 tsdown 流程内)

不发布 ./invariant:本插件没有独立、可分歧的运行时观察(路由全部处于 host webServer 信任围栏之下,元素表由 smoke spec 覆盖,client 视图是 host 状态的纯投影),按 DSH v0.1.2-rc.1 收紧后的 invariant 规则不再发布空 invariant 伴生,在此记录原因。

目录结构

dsh-aigc-canvas/
├── src/
│ ├── index.ts # host 入口:apply + /aigc-canvas/api + /aigc-canvas/file + WS │ ├── config.ts # Schemastery Config schema + resolveAigcConfig │ ├── context-types.ts # cordis Context augmentation(结构化镜像) │ ├── wire.ts # HTTP helpers + AigcError │ ├── trust-fence.ts # Host 头信任围栏(从 better-sidebar 拷贝) │ ├── canvas-registry.ts # 元素表 + 边 + 持久化(host-owned state) │ ├── aigc-backend.ts # 抽象 AIGC 后端客户端(stub 实现) │ ├── tools.ts # 6 个 defineTool │ ├── types.d.ts # @deepseek-ai/dsh-tools + cordis 环境类型声明 │ └── client/ │ ├── index.tsx # client 入口:注册 better-sidebar tab │ ├── CanvasView.tsx # 画布主视图 │ ├── CanvasNode.tsx # 节点组件 │ ├── store.ts # CanvasStore(WS 订阅 + useSyncExternalStore) │ ├── api.ts # HTTP/WS 客户端 │ ├── locales.ts # i18n(zh/en) │ └── canvas.module.css # 画布样式 ├── tests/ │ ├── canvas-registry.spec.ts │ ├── tools.spec.ts │ └── wire.spec.ts ├── cordis.patch.yml # bundle 层:插入插件行 ├── package.json # dsh.bundle.patch + peerDeps + 预构建 lib/ ├── tsconfig.json # NodeNext + ES2022 + strict ├── tsconfig.prepare.json # 消费端自包含构建 ├── tsdown.config.ts # dev/CI 构建(host + client 双 bundle) ├── tsdown.prepare.config.ts # 消费端 prepare 构建 ├── vitest.config.ts └── README.md

后端实现路线(stub → 真实)

当前 aigc-backend.ts 的 stub 在 baseURL === 'stub://aigc-backend'(或为空)时返回合成字节;其他 baseURL 立即抛 backend-error(HTTP 501)。

要接入真实后端:

1. 在 aigc-backend.ts 的每个 generate 方法的 !this.isStub 分支里替换为真实 fetch 调用(参考 dsh-mineru 的 MinerUClient)。
2. 后端 API 形状建议保持 { prompt, ..., signal } → { mediaBytes, meta } 的统一契约,这样 tools.ts 不需要改动。
3. 工具的参数 schema 已包含 width / height / duration_seconds / seed 等通用字段,后端可以选择性消费。
4. 媒体格式:stub 用最小合法 PNG / ftyp-only MP4;真实后端返回的字节由 host 直接落盘 + 浏览器渲染,不需要转码。

安全边界

- 路由受 Host 头信任围栏保护(与 /api 一致;0.0.0.0 部署时,由 dsh web 启动器动态派生的 LAN IP 列表生效)
- /aigc-canvas/file 仅限会话 canvas 目录内的媒体文件
- 工具执行绑定到调用代理的会话 id(exec.agent.session.id),模型不能跨会话读取 / 引用其他会话的元素
- apiKeyEnv 通过 ctx.get('credentials') 懒解析,先于 process.env

已知限制(v0.1 阶段)

- 后端 stub,无真实 AIGC 调用
- 画布视图是垂直 flow,不是真正的图布局(force-directed / DAG 布局待后续)
- 边以 chip 形式标注在节点上方,没有 SVG 连线(避免引入 react-flow 等运行时依赖)
- 元素不支持删除 / 编辑(只能通过删除 canvas.json + 重启会话来重置画布)

规范符合性

按 DSH 官方插件规范组织(参考 dsh-external/turtle-ui 与 plugin-development-guide.md):

- 插件形态:export const name / inject / Config / apply,无 default 导出
- 清单:types + exports(. / ./client / ./client/service / ./package.json)、dsh.bundle.patch、peerDependencies、engines、files 产物明细、prepare(消费者侧 tsdown,git 安装可用)
- client 契约:仅导出 apply/inject(+ 类型);store 为 CanvasStore 工厂,实例归 apply 所有;client bundle 复刻官方 preset(externals = 平台模块表 + runtime/client 豁免、纯度门、CSS Modules 内联)
- 预构建 lib/ 入库:含 @deepseek-ai/* private peer,必须预构建;lib/ 不进 .gitignore;github: 安装开箱即用
- 零源码 patch:未修改 DSH checkout 任何文件
预览分享卡片长什么样 ↓HuanLinOTO/dsh-plugin-aigc-canvas
分享 · DeepSeek Harness Hub
HuanLinOTO/dsh-plugin-aigc-canvas

DSH 插件:一个节点-连线式的 AIGC 画布。向模型暴露五类工具:文生图 / 文生视频 / 首尾帧生视频 /…

这是你的仓库?认领条目

回到顶部