Skip to content

dsh-batch-image

Verified

dsh-batch-image · v0.8.2 · MIT · Web UI

输入框工具行里的「批量生图」按钮 + 可拖动浮窗:把一批「本机图片 + 提示词」当普通对话消息按批发进当前会话,交给 dsh-comfyui / dsh-qwen-paint 出图。多行提示词、txt 拖入、提示词模板、相同提示词去重省 token、重发失败/跳过、进度与预计剩余。

Install

dsh plugin add dsh-batch-image

Confirm the layer applied with dsh --profile default --dump-config — see the install guide.

Source

Tags

Creators

Readme

批量生图

npm version npm downloads license repo dsh-plugin platform

对话输入框里多一个按钮。点开它,把「一批本机图片 + 一批提示词」拆成 N 条普通消息发进当前会话, 让会话里的 Agent 用你已经装好的 ComfyUI 或 千问画图 一条一条出图。

一条消息 = 一张图。它会等上一轮真正跑完再发下一条,所以不会糊成一团。

  • 浮窗可以拖着走,位置、表单、提示词模板都会记住(重启 DSH 也不丢),不挤压聊天区
  • 某条失败不会停整批,可以单条重发 / 跳过
  • 相同提示词可以只写一次,省 token
  • 提示词可以直接从 .txt 拖进浮窗,不用一行行粘

批量生图浮窗


安装

前提:已经能跑 dsh(桌面版,或 npx @deepseek-ai/dsh web)。

装插件只有一条正路 —— dsh plugin(它转发给 pnpm,并把包登记进 profile 的组合包列表):

dsh plugin --profile <profile> add <包名>

用包名装(最常用,DSH 内置的 npm 安装)

dsh plugin --profile desktop add dsh-batch-image

# 要钉版本就带上
dsh plugin --profile desktop add [email protected]

界面同一条路:设置 → 插件,把 dsh-batch-image 填进去即可。 (Agent 侧是 plugin_manager 的 action: install_bundle,target 填同一个包名。)

已发布到 npm,latest 就是最新版(首发 0.7.0,2026-11-01)。 安装只要填包名;想钉版本就写 [email protected] 这样。 万一以后要发成带 scope 的包,安装时也填 scope 名:@kandsome1/dsh-batch-image。

另外两种来源(需要时再用)

# 从 GitHub
dsh plugin --profile desktop add github:kandsome1/dsh-batch-image

# 从本地 tarball(先 pnpm pack 产出)
dsh plugin --profile desktop add .\dsh-batch-image-0.7.0.tgz

仓库已在:github.com/kandsome1/dsh-batch-image(private)。两者与可见性无关地可用; 私有仓库时 GitHub 那条需要你本机已有凭据。

装完 重启一次 DSH —— 宿主那部分(列图片 / 上传 / 系统对话框)随启动加载。

停用 / 卸载 / 更新

做什么 怎么做
临时停用 plugin_manager action: set_bundle target: dsh-batch-image enabled: false
卸载 plugin_manager action: remove_bundle target: dsh-batch-image
更新 换成新版本号再 add 一次;替换已装的同名包要重启 DSH 才会加载新的 JS 模块

本机现在是目录 link: 安装(改完刷新页面即生效),那是开发态的做法,换机器按下文用包名装。

装完怎么确认它真的进去了

dsh --profile desktop --dump-config | findstr batch-image

应该能看到 # == dsh-batch-image 这一层 —— 那就是本插件的 patch 层在组合树里的位置。 (桌面版把 CLI 打在 app.asar 里,dsh 不一定直接在 PATH 上;GUI 里则看「设置 → 插件」的已装列表。)

别手动改 profile

profile 的 package.json 和 cordis.patch.yml 由 dsh plugin 维护,不要手写;也不要在 profile 目录里跑 pnpm。这个插件通过自己的 dsh.bundle.patch(cordis.patch.yml)自带你看到的那一行 batch-image, 且只 insert、不覆盖任何随发行版交付的条目。

顺带说清一件事:deepseek-harness 仓库里那份 docs/development.zh.md 是改 harness 源码的 贡献者指南(pnpm run build、start:web、CI 门禁…),装插件不用那一套。 这个插件是纯 ESM、没有构建步骤,不需要 pnpm 构建、也不需要 tsdown。


装好之后先确认

安装本身是即时的,但有三项功能要宿主路由,而宿主模块只在 DSH 启动时加载 —— 所以如果这几项不工作,重启一次 DSH 就好:

功能 需要重启吗
按钮、浮窗、拖拽、浏览… 挑目录 不需要,装好即可用
列出图片(读目录里的图) 需要
上传(把本地图落到临时目录换路径) 需要
系统对话框… 需要

三步开始

  1. 选图 —— 点 浏览…,在浮窗里挑目录(盘符 / 上一层 / 主目录 / 系统对话框都能用), 选定后点 用这个目录,该目录里的 png/jpg/webp/gif/bmp 会列出来; 或者点 上传 从电脑里多选图片(会落到临时目录,换取本机绝对路径)。
  2. 写提示词 —— 默认整段就是一条,随便换行都不会被拆开。要发多条见下面「② 提示词」。
  3. 点 开始发送 —— 右边出现任务清单逐条跑;关掉浮窗也会继续发。

界面说明

① 图片

控件 作用
路径框 图片所在目录(绝对路径,可手填)
列出图片 读出这个目录里的图片
浏览… 内置目录浏览器:盘符行 / ↑ 上一层 / 主目录 / 面包屑 / 系统对话框…
上传 浏览器多选图片 → 落到临时目录 → 换成真实路径
清空 清掉已选图片
缩略图右上角 × 把这一张排除出本批
按文件名筛选 + 只留筛选结果 30 张里只留你要的那几张

图片超过 12 张时缩略图默认折起来(一行 ▸ 缩略图 21 张,点开再看)。

② 提示词

默认整段一条 —— 一条提示词横跨十几行也不会被拆成十几条消息。

要一次发多条,三种办法(标题栏下拉也可手动指定):

切分方式 怎么用
自动判断(默认) 有 --- 就按 --- 分;否则有空行按空行分;都没有 → 整段一条
整段一条 强制整段算一条(哪怕里面写了 ---)
空行分段 两条之间空一行
--- 分段 两条之间放一行 ---
一行一条 一行就是一条(短提示词最省事)

标题栏实时显示 识别为 3 条 · 共 21 行 · 自动:整段一条 —— 切错了这里一眼就能看出来。 # 开头的行在所有模式下都当注释。

也可以把提示词文件直接拖进浮窗:.txt / .md / .csv / .tsv 拖到窗口任意位置松手, 内容就接进提示词框(多个文件之间空一行,原有内容不覆盖);拖进来时窗口会显示虚线高亮和一句提示。 提示词写在 txt 里攒着,比在输入框里维护要舒服得多。

不想拖、或者拖拽被别的程序抢走时,点提示词区右侧的 导入文件 选文件即可 —— 和拖入走同一段逻辑。两种方式都会拦掉事件冒泡,所以不会同时把文件塞进下面的对话输入框。

提示词模板:点右侧 模板 ▾ 展开,把当前这一整套提示词存下来(起个名字,留空就自动取首行), 以后点模板名一键换回整套,× 删除,最多存 50 个。 同名保存是原地覆盖 —— 载入模板后名字会自动填回输入框,改几个字再点 保存当前,不会存出一堆近似副本。 模板只写在本机 localStorage,不上网、也不进 npm 包。

下面那行是指令,写在每条消息最上面,决定让 Agent 用哪个工具出图,默认:

用本机 ComfyUI 出图;参考图直接用下面的本地路径,不要改写路径。

想走千问画图就改成 用 draw_image 出图。

③ 配对与节奏

控件 选项 说明
配对 一图一词 第 i 张配第 i 条,数量不等时循环补齐(21 图 + 1 词 = 21 条,都套那条词)
图 × 词 每张图分别套每条词(笛卡尔积)
只发提示词 不带参考图,纯文生图
提示词 每条写全 每条消息都把提示词完整写一遍
相同只写一次 内容相同的提示词只在第一条写全,其余写「与第 1 条相同」。21 张图套同一条长词时,输入 token 能砍掉一大半
节奏 等上一轮跑完 发一条 → 等这一轮结束 → 再发下一条(推荐)
一次性全排队 全塞进会话队列,宿主自己按顺序跑(这个模式不等)
间隔 秒 每条之后的额外冷却

④ 任务清单

每条一行:序号 · 状态点 · 提示词摘要 · 图名 · 耗时,右侧是动作。

  • 状态点:灰 = 待发,蓝闪 = 发送中,绿 = 成功,红 = 失败,黄 = 跳过
  • 点这一行 → 展开这条消息真正会发出去的完整正文,发之前可以核对
  • 重发 / 再发 / 跳过 —— 单条操作,不用整批重来
  • 一批里有失败时,标题栏会出现 重发失败 N:一键把所有失败的重排,不用一条条点
  • 标题栏显示 完成/总数 · 已用 mm:ss · 约剩 mm:ss
  • 跑完之后标题栏会出现 重置:把这一批的清单、进度、状态文字一起清掉,图片和提示词都保留 —— 想干净地重跑一批,或者截图都不碍眼

每条消息长什么样

用本机 ComfyUI 出图;参考图直接用下面的本地路径,不要改写路径。

批量出图 3/21
参考图:D:\shots\03-范静梅.png
提示词:近景仰拍,微微低头看向镜头,浅色背景大幅虚化

开启「相同只写一次」后,重复的那几条变成:

批量出图 7/21
参考图:D:\shots\07-范静梅.png
提示词:与第 1 条相同(不重复写,按第 1 条出图)

常见问题

它不等上一轮就把下一条发出去了? 先看「节奏」是不是被切到了 一次性全排队 —— 那个模式本来就不等。 串行模式下留意状态栏:出现 等待这一轮跑完… 就是在等;如果出现「没等到"这一轮在跑"的信号」, 说明两种判据都没读到,把「间隔」调大(比如 90 秒)先控住节奏。

只能看到 C 盘? 内置浏览器没有盘符概念,但插件打开时会探一遍 C:–J:,存在的盘会出现在盘符行,点一下就跨过去。 更远的盘直接在手填路径框里写 K:\xxx。

「系统对话框」弹的是老式树形窗口? 资源管理器风格那个对话框走 IFileOpenDialog,万一初始化失败会退回经典 FolderBrowserDialog (一棵树能看到所有盘),功能一样、样子老一点。

提示「重启一次 DSH」? 见上面那张表 —— 列出图片 / 上传 / 系统对话框 需要宿主路由,随 DSH 启动加载。

缩略图是空白方块? 两条取图路由都失败时方块里会显示文件类型(PNG / JPG),表示路径有效但预览取不到字节; 不影响发送(发出去的是路径,不是图片本身)。

怎么最省 token? ① 「提示词」选 相同只写一次;② 提示词用「整段一条」,少重复批次头; ③ 指令写短一点(它每条都会带)。

提示词写在 txt 里,怎么导进来? 两种:把文件拖进浮窗任意位置松手,或点提示词区的 导入文件 按钮去选(.txt / .md / .csv / .tsv)。 多个文件会按空行接在一起,提示词框里原有内容不会被覆盖,导完标题栏会告诉你一共识别成几条。 拖图片进来会被拒绝 —— 图片请走 ① 的 上传,因为这里要的是"路径",不是字节。

跑完之后下面那一堆状态/清单怎么去掉? 点标题栏的 重置:清掉任务清单、进度和状态文字,图片和提示词都保留 —— 换一批重跑或者截图都干净。

关掉浮窗会中断吗? 不会。批量循环跟浮窗无关,图标上的进度角标继续走,再点开还能看清单。

展开模板 / 清单变长会不会把面板顶出屏幕? 不会。面板高度按「顶边到窗口底部」实时算(min(760, 视口高 − top − 12)),内容再多也只有中间那块 滚动区变高,标题栏、底部的 开始发送 始终在屏幕里;把面板往屏幕下方拖也一样会自动收矮。 拖动手柄至少给你留 180px 在窗口内,不会拖丢。

重启 DSH 之后表单、模板、窗口位置会丢吗? 不会。这些设置存在 ~/.dsh/dsh-batch-image/settings.json(宿主侧), 浏览器里那份只是首帧缓存 —— 因为 dsh 桌面版默认 port: 0(每次启动换端口), 而浏览器的 localStorage 是按 origin 存的,换端口就等于换站点,缓存会自然失效。 所以真正的那份必须在宿主。想手动清空设置,删掉上面那个 json 即可。

按钮和图都不见了 / 插件像是没装? 先确认源码还在:

cd D:\CODE_DeepSeek\plugins\dsh-batch-image
git status --short          # 出现一片 " D " 就是文件被删了
git restore .               # 从提交里还原(这个仓库每次改完都提交过,能完整恢复)
node scripts\render-check.mjs   # 应输出 ok=108 fail=0

源码在、但界面还是空的,说明插件入口在 DSH 启动时没加载成功(入口只在启动/重新挂载时读一次, 缺文件那一刻启动过,之后不会自己重试)。不用重启 DSH,让它重新挂载即可:

plugin_manager  action: set_bundle  target: dsh-batch-image  enabled: false
plugin_manager  action: set_bundle  target: dsh-batch-image  enabled: true

关掉再打开这一下会把宿主路由和客户端模块一起重新挂上,之后刷新页面图标就回来了。


想改代码的人

实现细节(槽位选择、提交路径、等待判据、宿主路由、COM 互操作、离线自检、发布清单)都在 docs/DESIGN.md。自检一条命令:

node scripts\render-check.mjs

官方文档:开发指南、 架构文档、 打包与发布插件、 文档站。