DSH Hub

HuanLinOTO/dsh-plugin-aigc-canvas

dsh-plugin-aigc-canvas

UIWeb UI17 GitHub stars· updated 2026-09-24

Provider-agnostic AIGC HTTP bridge + infinite canvas + ffmpeg post-processing; 13 tools incl. canvas linking/reroll/media-edit

Install

npx @deepseek-ai/dsh plugin --profile web add @huanlin/dsh-plugin-aigc-canvas

Restart `dsh web` after install. Bundle APIs can change during the developer preview.

README badge

dsh-plugin-aigc-canvas DSH Hub badge
[![DSH Hub](https://dshhub.dev/badge/dsh-plugin-aigc-canvas.svg)](https://dshhub.dev/plugins/dsh-plugin-aigc-canvas)

Paste this into your README. The star count updates with every catalog sync.

From the README

Excerpt from HuanLinOTO/dsh-plugin-aigc-canvas, cleaned of badges and images.

<a href="https://dshfind.com/zh/plugins/huanlinoto/dsh-plugin-aigc-canvas"><img src="https://dshfind.com/api/card/huanlinoto/dsh-plugin-aigc-canvas?lang=zh" alt="dsh-plugin-aigc-canvas card"></a>

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 中配置:

字段类型默认值说明
baseURLstringstub://aigc-backendAIGC 后端 API 地址。stub://aigc-backend = 内置 stub 后端(无网络,合成 PNG/MP4/MP3 字节)。其他值会触发 backend-error 等待未来实现
apiKeyEnvcredential-refAIGC_API_KEYAPI key 的环境变量名 / 凭据引用。stub 后端不读
requestTimeoutMsnumber60000单次后端请求超时(ms)
mediaSizeLimitnumber104857600 (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 热重建)

…

Related plugins