HuanLinOTO/dsh-plugin-aigc-canvas
dsh-plugin-aigc-canvas
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-canvasRestart `dsh web` after install. Bundle APIs can change during the developer preview.
README badge
[](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 中配置:
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
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.listpriming 一次快照 - 节点按 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 热重建)
…
