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

无限画布影棚 q253595422/dsh-imagegen-video

DeepSeek Harnessv1.19.1
q2535954226 天前有提交已提供中文文档扫描:含敏感能力

图片与视频一体化的 DSH 生图 / 生视频插件。

55/100
综合分
65
GitHub 星标
2,601
npm 周下载
—/5
用户评分

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

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

状态速览

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

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

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

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/31 14:12:38

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

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

可执行外部命令读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 84 处,展示前 31 条)
  • 发起网络请求
    lib/index.js:666
    const response = await fetch(url, {
  • 发起网络请求
    lib/index.js:803
    const body = await responseJson(await fetch(endpoint(config.apiUrl, "/chat/completions"), {
  • 发起网络请求
    lib/index.js:1104
    const response = await fetch(`${config.apiUrl.replace(/ +$/, "")}/chat/completions`, {
  • 发起网络请求
    lib/index.js:1809
    response = await fetch(url, {
  • 发起网络请求
    lib/index.js:2070
    response = await fetch(pollUrl, {
  • 发起网络请求
    lib/index.js:2213
    response = await fetch(requestUrl, {
  • 请求外部主机api.snapgen.ai
    lib/index.js:3389
    const response = await fetch("https://api.snapgen.ai/api/refresh-token", {
  • 执行外部命令来自配置/变量
    lib/index.js:5690
    const child = spawn(command, [...args], {
  • 读取本地文件
    lib/index.js:5749
    if (!statSync(candidate).isFile()) return false;
  • 读取本地文件
    lib/index.js:5751
    accessSync(candidate, constants.X_OK);
  • 读取密钥环境变量
    lib/index.js:7017
    const clientSecret = process.env.ANTIGRAVITY_CLIENT_SECRET?.trim() ?? "";
  • 执行外部命令来自配置/变量
    lib/index.js:9448
    const child = spawn(ffmpeg, [
  • 读取本地文件
    lib/index.js:13778
    const manifest = JSON.parse(await readFile(manifestPath, "utf8"));
  • 读取本地文件
    lib/index.js:14782
    pipeClip(createReadStream(found.path, {
  • 读取本地文件
    lib/index.js:14796
    pipeClip(createReadStream(found.path), res);
  • 写入本地文件
    lib/index.js:17033
    await mkdir(dir, { recursive: true });
  • 执行外部命令来自配置/变量
    lib/index.js:17043
    spawn(process.platform === "win32" ? "explorer.exe" : process.platform === "darwin" ? "open" : "xdg-open", [dir], {
  • 读取本地文件
    lib/index.js:20517
    entries = await readdir(root, { withFileTypes: true });
  • 执行外部命令来自配置/变量
    lib/index.js:20843
    const child = spawn(command, args, {
  • 写入本地文件
    lib/index.js:20904
    await mkdir(destination, { recursive: true });
  • 写入本地文件
    lib/index.js:20911
    await mkdir(path.dirname(destination), { recursive: true });
  • 写入本地文件
    lib/index.js:20912
    await writeFile(destination, bytes);
  • 写入本地文件
    lib/index.js:20937
    await rename(from, to);
  • 删除本地文件
    lib/index.js:20940
    await rm(from, {
  • 删除本地文件
    lib/index.js:20977
    await rm(destination, {
  • 写入本地文件
    lib/index.js:20981
    await mkdir(root, { recursive: true });
  • 删除本地文件
    lib/index.js:21000
    await rm(staging, {
  • 删除本地文件
    lib/index.js:21024
    await rm(destination, {
  • 删除本地文件
    lib/index.js:21041
    await rm(staging, {
  • 删除本地文件
    lib/index.js:21066
    await rm(path.join(staging, "repo", ".git"), {
  • 执行外部命令来自配置/变量
    lib/index.js:21392
    const child = spawn(argv[0], argv.slice(1), {
扫描于 2026/11/3(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
涉及外部主机:api.snapgen.ai

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

依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-api-remotes@deepseek-ai/dsh-api-session-controller@deepseek-ai/dsh-attachment@deepseek-ai/dsh-client-connection@deepseek-ai/dsh-client-locale@deepseek-ai/dsh-client-store@deepseek-ai/dsh-client-ui-conversation@deepseek-ai/dsh-client-ui-primitives@deepseek-ai/dsh-client-ui-renderer@deepseek-ai/dsh-client-ui-settings@deepseek-ai/dsh-client-ui-slots
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

6 张 · 点击查看大图

DeepSeek Harness 插件:图片 + 视频生成工作台,带无限画布。基于 dickpy/dsh-imagegen 分叉,补齐完整视频流水线与片段拼接。

v1.21.02026-11-01
· v1.21.0 · 画布底部工具条自适应,Agent 生成结果可直接内嵌 本版修掉无限画布底部三件浮层(任务工具条、缩放条、缩略图)互相压盖的问题,让窄面板下换行避让而不是叠在一起; 同时给 Agent 的图片工具补上落盘路径输出,模型可以在回复正文里直接内嵌生成结果。 · 主要更新 · 画布底部浮层不再互相压盖,窄了就换行。 任务工具条、缩放条、缩略图原来是三个各自绝对定位的图层 (left: 50% / left: 14px / left: 14px; bottom: 62px),彼此不知道对方尺寸。在三栏布局下画布实际只拿到约 1000px, 711px 的任务工具条与 236px 的缩放条横向重叠约 107px,压住缩放条最左侧的「选择 / 平移 / 添加图片 / 添加文本」四个按钮; 面板窄到 560px 时工具条还会溢出左边被裁掉。这类重叠取决于面板宽度而不是窗口宽度,所以 @media 断点测不到, jsdom 也没有排版引擎,整套测试一直是绿的。 现在三者合并成一个 .canvasChrome 换行 flex 行:宽度够时同排,不够时任务工具条换到第二行而不是盖上去; 任务工具条自身也会在面板比它窄时把 17 个按钮折行。侧列固定靠左,任务工具条用 margin-inline: auto 居中, 换行后它独占的一行同样居中。 · 画布给底部浮层留出真实高度,「适应全部内容」不再把节点放到工具条后面。 底部浮层浮在画布之上、不占布局空间, 所以 fitView / 新建节点 / 新画布种子节点算的都是被遮挡的几何中心。现在用 ResizeObserver 实测 视口底 − 任务工具条顶 的差值(不是浮层总高:缩略图在左侧、不挡中间,按总高留会白扔 150px), 三处都减掉它。之所以实测而不是写常量,是因为折行、以及 Hover 时弹簧动画都会改变这个高度。 · Agent 生成结果输出落盘绝对路径,支持在回复正文内嵌图片。 generate_image / edit_image 的工具结果新增 files(当前生成图的绝对路径)与 embed_id;generate_image 与 edit_image 提交时带 agentTool 标记, 用来把 Agent 生成与面板手动生成区分开。最终回复在最前面用 Markdown 图片语法内嵌、说明文字在后。 不新增任何 UI 注入,官方工具卡与工作步骤展示保持原样。 · 修复 files[] 永远是空数组。 上一条最初只读取 task.result.embedId,但没有任何地方给它赋值: 生成路径在 history.append() 里内联构造历史 id,结果回来时没有这个字段,taskResult() 直接短路成 files: []。 现在两条路径(模型生成与代码渲染)都先建好 id、再交给 append,并且只在 store 确实列出了该条目时才回显 embedId ——写盘被静默丢弃时不会给出磁盘上并不存在的路径。 · 白给一个画布全屏控件。 顶栏新增全屏按钮,走真实 Fullscreen API;从任何途径退出全屏(Esc、浏览器自身控件) 都会回写到按钮状态。模板库抽屉改为挂载到画布根节点——挂到 的 portal 在全屏元素之下会被盖住。 · 验证 · tsc --noEmit 0 错,pnpm build 通过,pnpm test 全套通过。 · 新增真浏览器布局守卫 scripts/verify-canvas-layout.mjs:在 997 / 860 / 720 / 560 / 420px 五档面板宽度下断言 三件浮层两两零重叠、且都在画布内;fixture 用到的每个类名都先与组件和样式表双向核对,防止 fixture 过期后仍然假绿。 · 反向验证(pnpm run test:negative)新增一例:把旧的三件绝对定位注回仓库副本,守卫必须变红 (实测重叠从 0 变成 2644px²)。 · Agent 侧的 files[] 修复有针对性断言:C9 的历史 sink 改成与真实 store 一致的行为,断言回显的 id 与每张生成图各一条绝对 .png 路径——旧写法下这个断言必然失败。 · 已知限制 · 三栏布局(画布约 997px)下,任务工具条只能在左侧 236px 侧列之外的剩余空间里居中,视觉上比窗口正中偏右约 124px。 这是「不压住缩放按钮」的取舍;要严格居中就得放弃避让。 · 面板窄于约 690px 时任务工具条会折成两行(实测 560px 与 420px 都是 2 行、83px 高)。能点、不重叠, 但底部被占的高度从 43px 变成 83px。更窄的面板
v1.20.02026-11-01
· v1.20.0 · 接入 snapgen.ai 视频模型 本版新增 snapgen.ai 视频协议族,把 Grok / Muse / Vela 系列视频模型接进插件;同时把视频时长与画面比例的选项改成由模型目录驱动,并解除“渠道必须至少有一个图片模型”的限制。 · 主要更新 · 新增 snapgen.ai 渠道预设,支持 grok-1.5-lite、grok-video、grok-lower、muse-ai-video、vela-ai-video: - 该服务不是 OpenAI 兼容接口,src/snapgen-engine.ts 单独实现四条差异:multipart 提交 + 自研反爬守卫头 x-guard-id;返回历史 uuid 而不是任务 id;GET /history/{uuid} 用数字状态(1 生成中 / 2 完成 / 3 失败); 成片地址在 generated_video[0].video_url(预签名,未鉴权即可下载)。video-engine.ts 只做编排。 - 密钥栏填 refresh_token:Access Token 只有约 10 分钟有效期,且过期返回的是 HTTP 403 TOKEN_EXPIRED 而不是 401,所以引擎按 JWT exp 提前续期,并在收到带 TOKEN 字样的 403 时强制刷新后重试一次。 接受原始 refresh_token、{"refresh_token":"…","cdp_port":9333} 形式的 JSON,或仍在有效期内的 access_token。 - 每次提交都需要一枚一次性 Cloudflare Turnstile token(绑定 site key,无法缓存或本地计算), 由本机 CDP Chrome 在真实 snapgen.ai 页面上现场换取:默认端口 9333,无头 Chrome 亦可。 换不到时错误码为 snapgen-turnstile。 · 按模型收窄时长与比例词表:grok-* 为 6/10/15 秒,muse-ai-video 固定 10 秒,vela-ai-video 固定 5 秒; 比例在 grok-* 上映射为 landscape / portrait / square / 3:2 / 2:3,在 muse/vela 上只有前三种。 视频面板与画布作曲家的时长、比例、分辨率下拉都改为读 describeVideoModel() 的目录数据, 不再写死 [5, 10] 与 ['16:9','9:16','1:1']。 · 只有视频模型的渠道可以保存:以前 validateChannelDraft 要求至少一个图片模型标识,只接视频的渠道存不下来; 现在图片或视频模型任一非空即可,侧栏的就绪状态与模型计数也一并按两者合计。 · 预设列表显示并可搜索视频模型:预设行原来只展示图片模型别名,snapgen 这类纯视频预设会显示为空白; 现在搜索与行内说明都包含视频模型别名。 · 修复浏览器布局守卫的假失败:verify-video-layout.mjs 用 1520px 宽的窗口描述问题,却从未设置视口, 无头 Chrome 默认 756×469 会命中样式表自己的 @media (max-width: 760px) 断点,把生成行折成一列后 报出并不存在的“37% 太窄”。现在用 Emulation.setDeviceMetricsOverride 固定视口,守卫测得 97% 通过。 · 修复对比任务并发断言在负载下抖动:模拟上游的重叠窗口只有 50ms,整套测试并行跑时会退化成串行, 报 maxGenerationRequests===1。窗口放宽到 300ms,断言仍是“两条请求在上游重叠”。 · 验证 · tsc --noEmit 0 错,pnpm build 通过。 · 离线冒烟新增两组断言:守卫字节与线上实测值逐字节对齐(含 /api 前缀参与签名的证明), 以及空密钥 / 不支持的生成模式在触网前就失败并留下诊断记录。smoke-video.mjs 33 项全过。 · 通过插件本体的 generateVideo() 对 api.snapgen.ai 实跑出片: 文生视频 muse-ai-video 10 秒 4.3 MB、图生视频 10 秒 7.7 MB,ffprobe 均为 h264 + aac 的有效 MP4。 · 已知限制 · vela-ai-video 提交会被接受,但服务端当前稳定返回 HIGH_TRAFFIC_ERROR(页面也标为维护中),插件如实透传该错误。 · grok-video 与 grok-lower 需要付费套餐,免费账号上游返回 D
v1.19.12026-10-30
· v1.19.1 · 修正提示词换行展示位置 本版修正历史提示词换行与截断展示位置,恢复侧栏卡片整洁,并在右侧大图详情区域完整展示提示词。 · 主要更新 · 左侧边栏历史卡片恢复 2 行截断: - 修正此前全局去掉行数截断导致左侧长文本卡片被撑得过长、破坏列表平衡的问题。 - 左侧 .historyPrompt 恢复 -webkit-line-clamp: 2 截断与文本省略(ellipsis)。 · 右侧结果区顶部大图上方提示词独立完整展示: - 在大图上方的元数据区域增加 .canvasPromptLine 独立行,完整保留换行(white-space: pre-wrap)。 - 支持文本自由划选与复制(user-select: text),下方或后方紧跟生成参数标签。 - 图片生成与视频生成结果视图同步生效。 · 安装 从 DSH 插件市场安装: dsh plugin --profile web add @q253595422/dsh-imagegen-video@1.19.1 本地安装发布产物: dsh plugin --profile web add ./q253595422-dsh-imagegen-video-1.19.1.tgz
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-imagegen-video 图片与视频一体化的 DSH 生图 / 生视频插件。 生图之外,本仓库提供完整的生视频链路,以及画布视频节点、片段拼接。 各版本的改动见 CHANGELOG.md,第三方代码归属见 NOTICE。 在 DeepSeek Harness 里,生成、编辑、管理,一站完成;图片与视频同一套工作流。 快速导航 🚀 快速开始 · 无限画布 · 片段拼接 · 电商套图 · 文生图 / 图生图 · 生视频 · 模板 / 画廊 · 模型配置 · 交流群 · 授权与致谢 赞助商 | 赞助商 | 简介与接入地址 | | | 椰子API — OpenAI 兼容的多模型网关。一个 API Key 同时覆盖 GPT Image 与 Gemini 图像模型,不必分别注册各家;在插件里就是一个普通渠道,不需要改代码。https://api.closeai.hk/v1 · Bearer API Key | | | 清衍 API — 面向国内开发者的 AI API 中转站,站点自述支持 Claude、GPT、Gemini 等模型。
展开完整文档(README 剩余 1 节)
dsh-imagegen-video

图片与视频一体化的 DSH 生图 / 生视频插件。
生图之外,本仓库提供完整的生视频链路,以及画布视频节点、片段拼接。
各版本的改动见 CHANGELOG.md,第三方代码归属见 NOTICE。

在 DeepSeek Harness 里,生成、编辑、管理,一站完成;图片与视频同一套工作流。
快速导航 🚀 快速开始 · 无限画布 · 片段拼接 · 电商套图 · 文生图 / 图生图 · 生视频 · 模板 / 画廊 · 模型配置 · 交流群 · 授权与致谢

赞助商

| 赞助商 | 简介与接入地址 |
| | 椰子API — OpenAI 兼容的多模型网关。一个 API Key 同时覆盖 GPT Image 与 Gemini 图像模型,不必分别注册各家;在插件里就是一个普通渠道,不需要改代码。https://api.closeai.hk/v1 · Bearer API Key |
| | 清衍 API — 面向国内开发者的 AI API 中转站,站点自述支持 Claude、GPT、Gemini 等模型。https://api.metajing.cn/v1 · Authorization: Bearer <key> |
| | 鲸屿 Whale Isle — 基于 DeepSeek Harness 的开源社区桌面客户端:AI 对话、终端与 Git、模型与 MCP 接入、主题壁纸与桌宠、用量统计,装好即可把本插件跑在桌面上。Windows x64 · macOS Apple Silicon · MIT |
| | jev-chat — 聊天辅助决策工具:回复前先读懂对方意图与当下风险,再给出可一键填入的草稿,发不发由你。Android · Windows · macOS · iOS,MIT。官网 chatjevs.com |
| | Mr. Day One — AI 原生编辑器,把仓库、终端和诊断信息接进同一条智能体回路:改代码、跑测试、读报错、再复审结果。https://mrday.one |
| | Harness Catalog — DeepSeek Harness 插件目录:逐个评测、给出真实安装命令,并说明什么场景该用它。本项目已收录其中。dsh-imagegen-video 条目 |
| | 莱昂 LEON — AI 电商操盘手 × GEO 顾问:把电商一线经验蒸馏成可审计的方法论与 AI 工作流,提供 GEO 品牌托管、电商方法论体系搭建与多智能体工作流定制。点击名称或徽章访问站点 |

以上是赞助位,不是中立推荐。 七项均由第三方独立维护:两家 API 网关的可用模型、价格、限流与稳定性,桌面客户端、移动应用与编辑器的兼容性、稳定性及其使用条款,顾问站点的服务内容与交付承诺,以及插件目录的收录与评价,均以各自站点公告为准,本项目不做担保。配置网关后密钥会发送给对应服务,请按需自行评估;不要用它们处理你不愿意交给第三方的内容。

快速开始

需要已安装 DeepSeek Harness 和 Node.js 20+。

安装包有两个来源:npm registry(推荐,包名即版本,npm view 能查、能被锁文件盯住)与 GitHub Release 资产(每次附带 SHA256SUMS)。

npm(registry 直达)
dsh plugin --profile web add @q253595422/dsh-imagegen-video

或 GitHub Release 资产(把两处 X.Y.Z 换成目标版本号)
dsh plugin --profile web add https://github.com/q253595422/dsh-imagegen-video/releases/download/vX.Y.Z/q253595422-dsh-imagegen-video-X.Y.Z.tgz

也可以先到 Releases 页面下载 .tgz,再安装本地文件:

dsh plugin --profile web add ./q253595422-dsh-imagegen-video-X.Y.Z.tgz

⚠️ 不要与 @dickpy/dsh-imagegen 同时安装。 两者注册的是同一套 /api/dsh-imagegen/ 路由和同一个 UI 面板,同时启用会冲突。数据目录 ~/.dsh/dsh-imagegen/ 也是两者共用的,切换前请先备份。详见 授权与致谢。

安装后重启 dsh web,侧边栏会出现「生图」入口。到「设置 → 生图配置」添加提供方、填写 API 地址与密钥、检测并选择生图模型,保存后即可开始创作。Windows 若遇 PowerShell 脚本策略限制,请使用 dsh.cmd。

其他安装方式、升级与回滚

- 让 Agent 安装:把上面的安装命令发给 DSH、Codex 或其他 coding agent。
- 指定版本:把上面两处命令里的 X.Y.Z 换成同一个目标版本号(形如 1.2.3)——URL 里的 vX.Y.Z 与文件名里的 X.Y.Z 是同一个版本;版本号在 GitHub Releases 页面可见,或运行 npm view @q253595422/dsh-imagegen-video version 查最新版。也可以直接在 Releases 页面下载对应版本的 tgz,再按上面的本地文件命令安装。
- 升级:重复执行 add 命令指向新版本即可;插件也会在面板中提示新版本。更新后重启 dsh web。
- DSH Desktop 用户:宿主 CLI 不允许写入 desktop 这个 profile,所以面板不会假装去更新,而是直接给出可复制的命令和下载地址,由你自己执行——不会只甩一句「更新失败」而没有原因。
- 渠道配置、历史记录和画廊数据保存在 DSH 宿主侧,正常升级不会清空。

核心功能

| 能力 | 用途 |
| 无限画布 | 把提示词、参考图和生成节点连成可迭代的创作流程。 |
| 视频节点与拼接 | 视频节点与图片节点同一套控制;多选后按画布位置拼成一条成片。 |
| 分镜节点 | 一列镜头各出一段视频,可接上一镜尾帧;成品就是普通视频节点,同样能拼接。 |
| 时间线与身份锚定 | 成片可以在时间线里排序、裁剪、加转场再拼;钉住的角色/物品会跟着后续每一次生成。 |
| 电商套图 | 从商品参考图生成主图、卖点图、场景图等成套素材。 |
| 文生图 / 图生图 | 使用兼容的生图渠道生成、编辑并比较图片。 |
| 生视频 | 文生视频、图生视频、首尾帧与多参考图;按协议族适配异步渲染与轮询。 |
| 代码生成 | 让 DSH 里已有的对话模型写绘图程序,本机渲染成视频或图片;不调生图/生视频模型,每个任务单独选。 |
| 对话与 Agent | 在 DSH 对话中生成图片、继续编辑,并把结果带回会话。 |
| 画廊与历史 | 图片与视频同列管理,支持模板与标签;在不同设备上接续创作。 |

把文字、图片和生成配置连起来;从历史或画廊加入素材,再继续生成和迭代。

画布、文件节点与技能细节

- 支持图片、文本、视频、生成配置、文件与分镜节点;图片节点可标注、移除背景或拆分图层。
- 分镜:一个节点就是一列镜头,每镜一条提示词与一个时长,顺序即片序。可以「每镜独立」一次提交全部待生成的镜头,也可以「接上一镜尾帧」一次跑一镜——用上一镜的最后一帧当这一镜的第一帧。每一镜的成品都是普通视频节点,预览、下载、收藏、重试和拼接都走原来那条链路;分镜自己有「拼接全部镜头」,交给同一套本机 ffmpeg 和同一张顺序确认卡。
- 时间线:画布底部的胶片按钮把选中的成片按阅读顺序排成一条,可以重排、逐段设入点/出点、给每条接缝选硬切 / 叠化 / 淡入淡出并调时长,也可以整体关掉声音。面板上显示的总时长与最终文件一致。
- 身份锚定:任意有图的图片节点右键「钉为身份参考」,选角色 / 物品 / 风格并起名。之后每一次图像与视频生成都会自动带上这些参考,提示词里补一句说明谁是第几张;连线仍然优先,二者去重合并。定义存在节点上,重拍那张图就能改脸。
- 取尾帧续拍:任意已完成的片段可以一键取结尾帧,落成图片节点并接好一个视频配置节点,直接写下一镜的描述就能接着拍。
- 海报编辑:在图片节点上叠加文字与 Logo 图层,拖动改位置,实时预览;导出是一张新图片节点,原图与图层配方都保留,随时可以重开继续改。整条链路纯本地 Canvas 2D,不调用任何模型、不消耗额度。
- 快捷键面板:按 ?(或 F1)随时呼出,或点工具栏的键盘图标;Esc 关闭。常用操作同时写在控件自身的提示里(如「撤销 (Ctrl+Z)」),不必先记住有这块面板。
- 单个文件最大 50MB;可在画布内预览常见文档、表格、PDF、图片与音视频。
- 内置文本润色、图片描述、内容抽取和图片转可编辑 PPT 等技能;图片转 PPT 不需要另外安装第三方技能或配置 OCR token。
- 图片转 PPT 使用配置的聊天模型理解版式,在本地生成可编辑文字与基础矢量形状;复杂照片或插画可能会简化。
- 也可安装和管理外部技能。重任务技能会启动具有本机文件读写与命令执行能力的无头 Agent;运行前请检查技能来源和权限。
- 旧版第三方 image-to-editable-ppt 可继续用于独立 Agent 工作流;它不参与内置图片转 PPT,相关 OCR 或图片后端配置也不是内置流程的前置条件。
- 技能配置格式与安全边界见 docs/skill-config.md。

片段拼接

把生好的视频片段拖到画布上,框选两段以上,底部会出现「拼接这 N 段」按钮。

- 顺序按画布位置:从上到下、从左到右;每个被选中的片段上会标出 ①②③,确认卡里也会列出最终顺序 —— 你看到的序号就是成片里的顺序。
- 本机 ffmpeg 执行:不调用任何模型、不联网、不消耗额度。工具从 ~/.local/bin、/opt/homebrew/bin、/usr/local/bin、/usr/bin 依次查找;找不到时按钮会明确说明原因,而不是静默失败。
- 成片进入视频历史:拼接结果作为一条普通视频记录落盘,可以在侧栏看到、播放,也可以收藏进素材库。
- 找不到的片段会让整次拼接失败并指出是第几段,而不是悄悄少拼一段。
- 要剪再接就用时间线:底部胶片按钮打开时间线,逐段裁剪、选转场、决定是否保留声音,再一次性交给同一条 ffmpeg 链路。不设时间线时行为与以前完全一致(整段、硬切、带音轨)。
- 输出统一为 1280×720 / 30fps / H.264 + AAC,不同尺寸或帧率的输入会等比缩放并补边,不会变形。

判定规则与已知边界见 docs/compose-contract.md。

分镜节点也有自己的「拼接全部镜头」:它把各镜已经生成的片段按镜头顺序交给同一条链路,还在生成的镜头会被跳过并说明少了几镜。

从商品主体和可选风格参考出发,先预览套图计划、逐张调整提示词,再批量生成;主图可作为其他用途图片的一致性参考。

输入提示词即可生成,也可上传参考图进行编辑。图生图支持多张参考图(最多 5 张,单张 10 MiB、合计 16 MiB):可多选、拖拽或粘贴,逐张移除,缩略图里用方向键翻看。请求形状按协议族各自整形——第一张始终在 image,其余在 images,所以只接受单张的渠道看到的仍是一张图;面板会在提交前就按模型能力拦下超额张数,而不是让服务端默默截断。此外支持多张结果、比例与清晰度设置、任务队列、历史恢复和全屏预览。

在 DSH 对话里可让 Agent 调用生图;用 /edit_image 描述修改内容,也可从工作台或画廊把图片加入当前会话继续编辑。

生视频

在「生视频」标签页里写视频描述,选择视频模型、比例、分辨率与时长即可提交。视频是异步渲染:宿主先提交任务、再按协议族轮询,渲染完成后把成片以文件落盘,并在面板内直接播放;渲染通常需要数分钟,期间可以关闭页面,任务仍在宿主继续执行。

视频模型按渠道单独配置,与图片模型分开:渠道里的「视频模型」目录决定该渠道能用哪些视频模型,因为视频走的是提交+轮询协议,和图片的同步返回不是一回事。

先规划(导演规划)

视频面板的先规划开关默认打开。开启后,提交前会先跑一轮推理,把一句话需求拆成镜头、动作、运镜、时长与风格,再落成真正发给模型的提示词与参数:

- 提示词:上游收到的是规划后的多镜头描述,而不是你输入的原句。结构参照 Wan 2.2 官方 --use_prompt_extend 的电影语言(景别、光线、运镜、风格),在「生成前先规划」之后,原句只作为素材。
- 参数:时长、画幅、分辨率可以按镜头节奏收紧,但永远不会超过你自己选的值;规划提出的画幅/分辨率还会再按模型协议族收敛一次(例如算力萌只接受 16:9 / 9:16 / 1:1)。
- 可检查:点「预览规划」不消耗渲染,只运行规划本身;确认后提交会沿用这份预览,不会重新问一次对话模型,所以所预览即所提交。
- 降级有据:对话模型调用失败、超时或返回的不是合法 JSON 时,会自动改用离线镜头规划,并在面板与视频历史里标明降级原因与来源(对话模型 / 本地规则),不会静默地把原句发出去。
- 拒绝非法输入:空描述直接报 video-prompt-empty;超过 4000 字符报 video-prompt-too-long,且都不会提交到上游。

规划用的对话模型复用「设置 → 提示词增强模型」那一处配置(promptModel / promptApiUrl / promptApiKey),不需要额外申请密钥:

- promptModel:任意支持 /chat/completions 的模型;留空时退回本地规则规划。
- promptApiUrl / promptApiKey:留空时复用生图渠道的地址与密钥。
- 规划阶段失败只降级、不会中断渲染;渲染本身失败仍按原有报错返回。

代码落点:src/video-director.ts(规划与参数收敛)、src/generation-runtime.ts(接入 runVideo)、POST /api/dsh-imagegen/video/plan(预览)。对应离线检查:pnpm run test:director。

支持的协议族与模式

| 协议族 | 模型示例 | 说明 |
| Agnes 视频 | agnes-video-2.5-flash、agnes-video-2.5 | 提交 POST /v1/videos,轮询 GET /v1/videos/{id},取 metadata.url;支持文生视频、首尾帧、多参考图、seed。 |
| 火山 Seedance(方舟) | doubao-seedance-2-0-260128、doubao-seedance-2-0-fast-260128、doubao-seedance-1-0-pro-250528 | 方舟原生任务协议:提交 POST /contents/generations/tasks,轮询 GET /contents/generations/tasks/{id},成片在 content.video_url。提示词与参考图放在 content 数组里(参考图带 role:first_frame / last_frame / reference_image),比例字段是 ratio,分辨率小写。时长:2.x 为 4–15 秒、1.0 为 2–12 秒。分辨率:2.0 支持 480p/720p/1080p/4k,fast / mini 只到 720p;1.0 为 480p/720p/1080p。1.0 不支持 reference_image 角色,1.0 pro fast 也不支持尾帧,面板会把这两种模式从该型号上收起来。 |
| 算力萌 comemoe | wan2.2-t2v、zhimeng-h3-local | wan2.2-t2v 仅文生视频;zhimeng-h3-local 支持图生视频。比例只接受 16:9 / 9:16 / 1:1;5 秒片子实测约 9 分钟。 |
| xAI Grok | grok-imagine-video-1.5、grok-imagine-video-1.5-lite | 提交 POST /videos/generations(注意不是 /videos),轮询 GET /videos/{id},取 video.url 与 video.duration。 |
| 通用视频 | 其他视频模型 id | 按 OpenAI 兼容视频端点尽力适配;未识别的协议族会明确报错,不会静默发出错误请求。 |

- 生成模式:文生视频、图生视频(单张参考图)、首尾帧(首帧+尾帧插值)、参考图(多张风格/主体参考);不同模型支持的模式不同,面板只会给出该模型支持的选项。
- 成片存储:视频保存在本机数据目录的 videos/ 下,历史列表只存元数据,播放走支持 Range 的同源路由,所以可以拖动进度条。
- Agent 调用:Agent 可调用 generate_video(文生视频)与 generate_video_from_image(图生视频/首尾帧/参考图),并用 get_video_generation_task 查询进度;视频渲染较慢,不要紧凑轮询。

火山方舟(Seedream / Seedance) 的生图与生视频可以共用一个渠道(https://ark.cn-beijing.volces.com/api/v3),渠道里分别填图片模型与视频模型即可:

- 生图(Seedream):方舟的 size 只能是档位(1K/1.5K/2K/3K/4K)或 宽x高,二选一,且没有 aspect_ratio 参数。所以选了具体比例时,插件按该模型的像素预算换算出显式的偶数宽高(例如 5.0 pro 在 16:9 / 4K 下是 2784x1566),这样比例才真的生效;auto 才回落到档位字符串。
- 水印:生图的 watermark 默认是 true(右下角「AI生成」),插件每次都显式发 watermark: false。生视频的默认值是 false,插件同样显式发送,不依赖上游默认值。
- 音轨:生视频的 generate_audio 默认是 true(2.5 / 2.0 才有这个字段);面板没有音轨控制,插件显式发 false,1.0 系列则完全不带这个字段。
- 响应格式:方舟的 Seedream 用 response_format: 'url',插件随后回源下载;网关版的 Seedream 仍走 b64_json。
- 模型 ID:请填方舟控制台的模型 ID(doubao-seedream- / doubao-seedance-)——协议族是从这个 id 前缀判断的。方舟的推理接入点(ep-…)目前无法判断协议族:图片会被当成通用渠道、生视频会在提交前直接报「协议族未知」而不是静默发一个形状错误的请求。要在接入点上用,请把该渠道的模型 ID 填成对应的方舟模型 ID。

代码生成路径(不调生图/生视频模型)

画布合成栏里有一个「生成方式」下拉,两个选项:模型生成(默认,就是上面那整条链路)和代码生成。它按任务选,不写进设置、不做全局开关;同一个画布上这一张用模型、下一张用代码都行。

选「代码生成」时:

- 谁来画:用 DSH 里已经接入的对话模型——就是你在对话面板里选中的那个模型,不是插件设置里的「提示词增强模型」,插件也不新增任何模型或密钥配置。宿主把这个请求当成一次无头对话:系统提示里给绘图 API 与约束,用户消息就是你的描述,模型返回一段 JavaScript 绘图程序。
- 谁来渲染:本机 node:vm 沙箱逐帧执行这段程序,拿到 RGBA 像素后交给 ffmpeg 编码(视频)或直接写成 PNG(图片)。全过程不产生任何网络请求,也不消耗生图/生视频额度。沙箱里没有 require、没有 process、没有文件系统,只有一套绘图方法(矩形、圆、路径、渐变、文字等)。
- 参数照旧:分辨率、比例、时长仍按合成栏选的档位生效(480P/720P/1080P × 比例,30fps),视频帧数 = 时长 × 30。同一套档位,代码路径不另立一套。
- 产物对等:视频落进同一个 videos/ 目录、同一条视频历史(条目带 renderer: 'code'),因此预览、下载、收藏、取尾帧、多选拼接、时间线裁剪与转场、工作流执行器全部照常;图片落进同一个 images/ 与图片历史,可以继续做标注、海报编辑、当参考图。
- 模型会「答非所问」时降级:如果模型返回的不是代码(比如直接回了一段说明),会改用内置标题卡渲染,任务标记 degraded 并记录原因——照样出图/出片,不会白跑一趟。真正无法继续的情况(语法错、运行时抛错、超时、缺 ffmpeg)才失败。
- 重试不重复问模型:第一次生成的绘图程序存在任务里,重试会沿用它;想换一版再重新生成。

失败语义(错误码会直接显示在节点上,并附一行「可在上方「生成方式」里切回模型生成后重试」):

| 错误码 | 含义 | 怎么办 |
| code-prompt-empty | 描述为空 | 写一句画面描述(代码路径靠这句话绘图,不会自己编) |
| code-prompt-too-long | 描述超过 4000 字符 | 压缩到核心画面与文案 |
| code-no-chat-model | DSH 里没有选中的对话模型 | 在对话面板选一个模型,或切回模型生成 |
| code-chat-failed | 对话模型调用失败(鉴权、网络、上游报错) | 看节点上的原始原因;换模型或切回模型生成 |
| code-not-code / code-syntax | 模型返回的不是可执行代码,或代码编译不过 | 重试(会重新问模型),或切回模型生成 |
| code-runtime | 代码逐帧执行时抛错(报文里带第几帧) | 同上 |
| render-timeout | 整次渲染超过 120 秒 | 缩短时长或降分辨率后重试 |
| render-no-ffmpeg | 本机找不到 ffmpeg,无法编码视频 | brew install ffmpeg,或在设置里填 FFMPEG_PATH;图片不需要 ffmpeg |
| render-cancelled | 用户取消 | 重新提交即可 |
| render-encoder-died / render-encoder-failed | ffmpeg 进程异常退出 | 重试;持续失败请查 ffmpeg 是否可用 |

缺 ffmpeg 在提交前就会提示(合成栏下方一行黄色说明),不会等渲染到一半才报。

依赖只有 ffmpeg(视频路径;图片路径零依赖)。不引入任何新框架或原生模块。

多模型对比

同一提示词可提交给多个模型并列查看结果,便于快速挑选风格与质量。

提示词模板库内置八个来源(精选案例、沧河、手绘、Prompt/Signal、evolink、itgoyo、songtianlun、youart),共三千余条,可搜索、筛选、收藏并直接带入生图。模板库以右侧抽屉打开,约占工作区 75% 宽度:左边缘可拖动调宽(宽度记在本地),可一键铺满工作区,手机上自动全宽;搜索可限定当前来源或横跨全部来源;最近用过的 24 条留在「历史记录」里一键复用。选中的提示词可以替换输入框内容,也可以追加在后面。生成结果可在画廊中用标签和收藏继续整理;删除是可撤销的——被删的条目先进回收站,保留 30 天,期间可以逐条还原或一键清空,只有清空(或超过 30 天后的首次访问)才真正删除磁盘上的文件。

模型配置

在「设置 → 生图配置」添加渠道,填写 API 地址与密钥,检测并选择生图模型。可配置多个提供方,并设置默认生图模型和可选的提示词增强聊天模型。

支持 OpenAI 兼容的 Images API / Chat Completions,以及 xAI Grok、Google Nano Banana、Seedream、Qwen-Image、GLM-Image、MiniMax 等预置渠道;也可手动添加兼容模型。

接口与渠道补充说明

- 通用渠道默认自动判断 Images API 与 Chat Completions;也可在设置中手动指定。
- One-API、New API、LiteLLM 等只暴露 /chat/completions 的网关,可填写完整接口地址并选择对应模型。
- API 密钥保存在 DSH 宿主设置中;未被自动识别的兼容模型可手动添加。
- 不同服务商的图生图、尺寸与返回格式可能不同,请确认所选模型实际支持的能力。

数据与安全

- API 请求经 DSH 宿主转发;密钥保存在本机设置中,不直接暴露给浏览器。
- 历史、画廊、画布和图片保存在 DSH 数据目录 ~/.dsh/dsh-imagegen/,由你控制。
- 生图与图生图会把提示词或参考图发送给所配置的 API 服务商;请按服务商政策处理敏感内容。
- 内置轻量技能会把所选内容发送给配置的聊天模型。图片转 PPT 的 PPTX 在本地生成,由原生文字与基础矢量形状组成,不会把整张原图直接铺成幻灯片背景;结果需人工检查。
- 外部重任务技能可能读写本机文件并执行命令;运行前请确认技能可信、输入内容可共享。
- 生图会消耗 API 服务商额度;请人工检查生成结果。不要把 API 密钥贴到 Issue、日志或截图中。
- 诊断日志(两个工作台右上角):失败的 API 请求会留在本机内存里(最多 200 条,重启即清空,不写磁盘,不产生后台请求),可一键复制后贴进 Issue。记录含实际请求地址、HTTP 状态、网络错误码、耗时、体积与服务商原始响应;密钥已在写入前脱敏(Bearer 令牌、查询串密钥、内联 base64 均替换为占位符,API Key 只记「是否发送」)。
生图与生视频写同一个缓冲:视频的提交 / 轮询 / 下载三条腿各自标记。

交流群

微信群「龙虾吹水🦞群」:使用问题、版本更新与画布玩法都可以在群里聊。

二维码 7 天内有效(2026 年 11 月 1 日前)。过期或人数已满时,请改到 Issues 提问题,并提醒维护者换一张新码。安全敏感的问题不要发在群里,也不要贴 API 密钥。

授权与致谢

本项目按 Apache-2.0 发布。各版本的改动逐条列在 CHANGELOG.md;第三方代码与素材的版权、许可与来源见 NOTICE 与 THIRD_PARTY_NOTICES.md。

核心能力:生图(文生图 / 图生图 / 多参考图编辑)、生视频(文生视频 / 图生视频 / 首尾帧 / 多参考图)、图片转可编辑 PPT(最多 12 张,每张一页)、无限画布(图片与视频节点、分镜节点、片段拼接、技能)、电商套图、模板库与画廊。

支持与问题反馈请提到本仓库的 Issues(Bug 报告 · 功能建议 · 全部 Issues)。

与 @dickpy/dsh-imagegen 不能共存:两者注册同一套 /api/dsh-imagegen/ 路由与同一个 UI 面板,同时安装会冲突;数据目录 ~/.dsh/dsh-imagegen/ 也是共用的。要换回原版,请先卸载本插件。

本地开发

pnpm run typecheck
pnpm run build
pnpm run watch
pnpm test
node scripts/smoke-video.mjs
pnpm run test:negative

pnpm test 跑全部离线检查(verify-tracked 排第一);pnpm run test:negative 做反向验证——把每处修复对应的缺陷重新注回仓库副本,要求对应检查变红,工作树不被改动。时间线与身份锚定各有自己的纯函数套件,可以单独跑: pnpm run test:timeline、pnpm run test:cast、pnpm run test:timeline-compose (最后一个需要本机 ffmpeg,缺工具时明确跳过)。

跟进本项目的上游发布:

pnpm run upstream:check # 有新版本时退出码为 1
pnpm run upstream:plan # 生成移植报告到 .upstream/<版本>/report.md
pnpm run upstream:adopt v1.8.3 # 记录「已整合到哪个版本」

upstream:plan 会把每个改动文件按能否干净应用到当前树分类:新增(整份复制)、可直接应用、冲突(需人工读)、本项目自有(视频链、发布说明、授权,不覆盖)。
它只生成报告,不改任何源码。这几个命令都是手动跑的——本项目不跟随上游版本线,所以没有定时检测;要跟进时自己跑一次 upstream:check。

本地打包并安装到 DSH 验收:

pnpm pack --pack-destination .
dsh plugin --profile web add ./q253595422-dsh-imagegen-video-X.Y.Z.tgz

仓库里的离线套件不需要网络与付费 API 调用;需要浏览器或 ffmpeg 的检查在缺少工具时会明确跳过并返回成功,而不是伪装成失败。并行跑构建与测试请用 ./scripts/with-lock.sh,它会把整棵工作树串行化。

许可证

Apache-2.0

版权归属与第三方许可见 NOTICE 与 THIRD_PARTY_NOTICES.md。
预览分享卡片长什么样 ↓q253595422/dsh-imagegen-video
分享 · DeepSeek Harness Hub
q253595422/dsh-imagegen-video

图片与视频一体化的 DSH 生图 / 生视频插件。

回到顶部