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

千问绘影 Demerier/dsh-image-forge

DeepSeek Harness
Demerier10 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness 插件:Qwen-Image 2.1出图与参考图编辑,支持 ComfyUI / 官方…

30.5/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Demerier/dsh-image-forge
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件发起外部网络请求
查看扫描证据(共 71 处,展示前 59 条)
  • 读取本地文件
    lib/index.js:72
    if (existsSync(candidate)) return candidate;
  • 读取本地文件
    lib/index.js:172
    return `${readFileSync(new URL("../skill.md", import.meta.url), "utf8")}\n> 下面两处路径由插件在注册时填入,可直接用 read 工具打开:\n${REFERENCE_FILES.map((relative) => {
  • 读取本地文件
    lib/index.js:428
    raw = await readFile(boardFile(outputDir, id), "utf8");
  • 读取本地文件
    lib/index.js:502
    names = await readdir(boardsDir(outputDir));
  • 读取本地文件
    lib/index.js:523
    const parsed = JSON.parse(await readFile(stateFile(outputDir), "utf8"));
  • 写入本地文件
    lib/index.js:544
    await mkdir(boardsRoot(outputDir), { recursive: true });
  • 写入本地文件
    lib/index.js:555
    await writeFile(staging, body, "utf8");
  • 写入本地文件
    lib/index.js:557
    await rename(staging, target);
  • 删除本地文件
    lib/index.js:559
    await unlink(staging).catch(() => void 0);
  • 写入本地文件
    lib/index.js:564
    await mkdir(boardsDir(outputDir), { recursive: true });
  • 读取本地文件
    lib/index.js:623
    names = await readdir(boardsDir(outputDir));
  • 删除本地文件
    lib/index.js:776
    await unlink(removed.path);
  • 删除本地文件
    lib/index.js:797
    await unlink(boardFile(outputDir, id));
  • 发起网络请求
    lib/index.js:1080
    const response = await fetch(url, {
  • 发起网络请求
    lib/index.js:1124
    const response = await fetch(url, {
  • 发起网络请求
    lib/index.js:1688
    const response = await fetch(url, {
  • 写入本地文件
    lib/index.js:2222
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    lib/index.js:2229
    await writeFile(staging, image.bytes);
  • 删除本地文件
    lib/index.js:2233
    await unlink(staging).catch(() => void 0);
  • 删除本地文件
    lib/index.js:4362
    await unlink(probe);
  • 发起网络请求
    lib/client.js:864
    const response = await fetch(STUDIO_BOARD_ROUTE, {
  • 发起网络请求
    lib/client.js:943
    const response = await fetch(`${STUDIO_BOARD_ROUTE}?board=${encodeURIComponent(id)}`, {
  • 发起网络请求
    lib/client.js:977
    const response = await fetch(STUDIO_CONFIG_ROUTE, {
  • 发起网络请求
    lib/client.js:1063
    const response = await fetch(STUDIO_CONFIG_ROUTE, { credentials: "same-origin" });
  • 发起网络请求
    lib/client.js:1102
    const response = await fetch(`${STUDIO_ASSETS_ROUTE}?${params.toString()}`, {
  • 发起网络请求
    lib/client.js:1197
    const response = await fetch(STUDIO_OPTIMIZE_ROUTE, {
  • 读取本地文件
    src/boards.ts:273
    raw = await readFile(boardFile(outputDir, id), 'utf8')
  • 读取本地文件
    src/boards.ts:344
    names = await readdir(boardsDir(outputDir))
  • 读取本地文件
    src/boards.ts:372
    const parsed: unknown = JSON.parse(await readFile(stateFile(outputDir), 'utf8'))
  • 写入本地文件
    src/boards.ts:394
    await mkdir(boardsRoot(outputDir), { recursive: true })
  • 写入本地文件
    src/boards.ts:410
    await writeFile(staging, body, 'utf8')
  • 写入本地文件
    src/boards.ts:412
    await rename(staging, target)
  • 删除本地文件
    src/boards.ts:414
    await unlink(staging).catch(() => undefined)
  • 写入本地文件
    src/boards.ts:420
    await mkdir(boardsDir(outputDir), { recursive: true })
  • 读取本地文件
    src/boards.ts:483
    names = await readdir(boardsDir(outputDir))
  • 删除本地文件
    src/boards.ts:663
    await unlink(removed.path)
  • 删除本地文件
    src/boards.ts:683
    await unlink(boardFile(outputDir, id))
  • 发起网络请求
    src/comfyui.ts:275
    const response = await fetch(url, {
  • 发起网络请求
    src/comfyui.ts:327
    const response = await fetch(url, {
  • 发起网络请求
    src/comfyui.ts:850
    const response = await fetch(url, { method: 'POST', body: form, redirect: 'error', signal: composed.signal })
  • 读取本地文件
    src/config-defaults.ts:78
    if (existsSync(candidate)) return candidate
  • 读取本地文件
    src/output.ts:55
    await access(path, constants.F_OK)
  • 写入本地文件
    src/output.ts:111
    await mkdir(dir, { recursive: true })
  • 写入本地文件
    src/output.ts:121
    await writeFile(staging, image.bytes)
  • 写入本地文件
    src/output.ts:123
    await rename(staging, path)
  • 删除本地文件
    src/output.ts:125
    await unlink(staging).catch(() => undefined)
  • 读取本地文件
    src/refs.ts:156
    info = await stat(path)
  • 读取本地文件
    src/refs.ts:165
    bytes = await readFile(path)
  • 读取本地文件
    src/skill.ts:37
    const body = readFileSync(new URL('../skill.md', import.meta.url), 'utf8')
  • 读取本地文件
    src/studio-routes.ts:332
    stats = await stat(target)
  • 读取本地文件
    src/studio-routes.ts:345
    await pipeline(createReadStream(target), res)
  • 读取本地文件
    src/studio-service.ts:254
    const info = statSync(path, { throwIfNoEntry: false })
  • 读取本地文件
    src/studio-service.ts:257
    const bytes = readFileSync(path)
  • 发起网络请求
    src/studio-view.ts:236
    const response = await fetch(STUDIO_BOARD_ROUTE, {
  • 发起网络请求
    src/studio-view.ts:319
    const response = await fetch(`${STUDIO_BOARD_ROUTE}?board=${encodeURIComponent(id)}`, {
  • 发起网络请求
    src/studio-view.ts:350
    const response = await fetch(STUDIO_CONFIG_ROUTE, { credentials: 'same-origin', signal })
  • 发起网络请求
    src/studio-view.ts:442
    const response = await fetch(STUDIO_CONFIG_ROUTE, { credentials: 'same-origin' })
  • 发起网络请求
    src/studio-view.ts:476
    const response = await fetch(`${STUDIO_ASSETS_ROUTE}?${params.toString()}`, {
  • 发起网络请求
    src/studio-view.ts:565
    const response = await fetch(STUDIO_OPTIMIZE_ROUTE, {
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-skill@deepseek-ai/dsh-tools@deepseek-ai/dsh-llm@deepseek-ai/schemastery@deepseek-ai/cordis
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 插件:Qwen-Image 出图与参考图编辑,本地自带受管运行时,不装 ComfyUI 也能跑;也支持 ComfyUI / 官方 API。

README

由 DeepSeek 最新模型翻译生成
dsh-image-forge dsh-image-forge:肥鱼女仆指着一张画布,画面上是「dsh-image-forge」标题与画板/素材库的功能示意 在 DeepSeek Harness 里用 Qwen-Image 出图、改图。 说「画一张 16:9 的夏日饮料海报」,出图;丢一张客厅照片说「改成晚上的」,改图。比例、像素由插件换算,不用你查表;成果按画板归档,工作台里能看、能摆、能接着改。 图像工作台:左边写提示词、选画幅,右边画布上落着刚生成的图 两个入口,一套后端:对话里说一句话,模型按 Qwen 契约改写后调用工具;或者打开设置页的「图像工作台」点按钮。两边共用同一份配置、同一个输出目录、同一批画板。 目录:能不能用 · 快速开始 · 出图 · 改图 · 工作台 · 工具 · 提示词怎么写 · 后端 · 可能踩的坑 · 许可 · 更多文档 能不能用 需要本机装好的 ComfyUI + 三个 Qwen-Image 2.1 权重。文生图、改图(图生图)都跑在这台机器上,首次下载权重之后完全离线,不联网、不耗云端额度。 - 显存 8 GB 起步(实测机型 RTX 4070 Laptop)。没有 ComfyUI 就照 部署指引 从零装。 - 插件不自带运行时、不下载权重、不碰 ComfyUI 的配置;它没起来时插件只负责把缺什么说清。
展开完整文档(README 剩余 1 节)
dsh-image-forge

dsh-image-forge:肥鱼女仆指着一张画布,画面上是「dsh-image-forge」标题与画板/素材库的功能示意

在 DeepSeek Harness 里用 Qwen-Image 出图、改图。

说「画一张 16:9 的夏日饮料海报」,出图;丢一张客厅照片说「改成晚上的」,改图。比例、像素由插件换算,不用你查表;成果按画板归档,工作台里能看、能摆、能接着改。

图像工作台:左边写提示词、选画幅,右边画布上落着刚生成的图

两个入口,一套后端:对话里说一句话,模型按 Qwen 契约改写后调用工具;或者打开设置页的「图像工作台」点按钮。两边共用同一份配置、同一个输出目录、同一批画板。

目录:能不能用 · 快速开始 · 出图 · 改图 · 工作台 · 工具 · 提示词怎么写 · 后端 · 可能踩的坑 · 许可 · 更多文档

能不能用

需要本机装好的 ComfyUI + 三个 Qwen-Image 2.1 权重。文生图、改图(图生图)都跑在这台机器上,首次下载权重之后完全离线,不联网、不耗云端额度。

- 显存 8 GB 起步(实测机型 RTX 4070 Laptop)。没有 ComfyUI 就照 部署指引 从零装。
- 插件不自带运行时、不下载权重、不碰 ComfyUI 的配置;它没起来时插件只负责把缺什么说清。

快速开始

1. 安装

插件已发布到 npm(包名 dsh-image-forge)。官方 DSH 桌面版内置插件管理器,两种装法任选:

桌面版界面安装

打开 DSH 桌面版的「插件」页 →「发现」标签 → 搜索 dsh-image-forge → 安装。市场索引源没有收录它也没关系:同页有直接输入包名安装的入口,填 dsh-image-forge 一样能装。

命令行安装(npm 包)

dsh plugin --profile <profile> add dsh-image-forge

也可以装 GitHub 上的最新源码:

dsh plugin --profile <profile> add github:Demerier/dsh-image-forge

装完完全退出 DSH 再打开(不是刷新窗口,插件的 cordis.yml 在启动时加载)。

别用 npm install 装它——这是 DSH 插件,脱离宿主跑不起来。
pnpm build 报 Cannot find package 'ansis' 时,删掉 node_modules 重装(本仓库用 nodeLinker: hoisted 绕开这个问题)。

2. 把 ComfyUI 指给它

什么都不用填:插件自动探测 8000 / 8188 / … 端口(非回环地址会被拒绝)。缺 Qwen-Image 权重时,照 ComfyUI 部署指引 把三个文件放进对应目录,qwen_image_status 会告诉你它缺哪个。

9 个配置字段都有默认值,日常一个都不用碰;全部字段见 docs/configuration.md。

3. 出第一张图

对话里直接说:

画一张 16:9 的夏日饮料海报,清凉一点

模型会把它改写成 Qwen 提示词契约再调工具,图片落盘并内联显示在回复里。也可以打开设置页「Qwen 出图」→「图像工作台」,手写提示词点「生成」。

验收标准:对话里能看到 qwen_image_generate / qwen_image_edit / qwen_image_status 三个工具;设置页左侧出现「Qwen 出图」。跑不通先调 qwen_image_status,它会点名缺什么。

本机改代码时:

pnpm install
pnpm build
dsh plugin --profile <profile> add <本仓库绝对路径>

完整流程(打包、版本号、tarball 安装)见 docs/local-install.md。

出图

在对话里直接说需求就行。模型会把话改写成契约再调工具,你不用管:

{"rewritten_prompt": "A wide photograph of …", "wh_ratio": "16:9"}

wh_ratio 七档,对应像素(约 1.5MP,32 对齐):

| wh_ratio | 像素 | 备注 |
| 1:1 | 1248×1248 | |
| 4:3 | 1408×1056 | |
| 3:4 | 1056×1408 | |
| 3:2 | 1536×1024 | |
| 2:3 | 1024×1536 | |
| 16:9 | 1664×928 | 32 网格上无法精确,偏差 +0.86% |
| 9:16 | 928×1664 | 偏差 −0.86% |

- 要固定像素就传 width / height(32 的倍数),优先于 wh_ratio。
- 图片存为 <outputDir>/<prefix>_<W>x<H>_<n>.png,编号自动跳过已占用的名字,重复出图不会覆盖旧的。

改图

给了参考图就是改图任务。

qwen_image_edit(prompt = <改图指令>, images = ["D:\\pictures\\room.png"], ratio_follow = "image1")

画布怎么定,三选一:

| 你说的话 | 传什么 | 画布 |
| 明说了比例或像素 | wh_ratio(或 width+height) | 该比例 |
| 没说,但想跟随某张图 | ratio_follow: "image1" | 按该图长宽比取最接近的像素 |
| 什么都没说 | 都不传 | 跟随第一张参考图 |

- 路径必须绝对;只认 PNG / JPEG / WebP。
- wh_ratio 和 ratio_follow 同时传会直接报错,二选一。
- 多张参考图时用 <image1> <image2> 指明用途,并说清哪张是画布。
- 显存不够就先调小 width / height。

工作台

设置页第一个页签。不想每次在对话里贴参数,就在这里点。

- 画幅只有七档,标的像素就是实际送进 ComfyUI 的像素。
- 传了参考图就是改图(最多 10 张),留空就是文生图。
- 提示词优化用当前会话的模型改写,结果写回输入框,你改完再生成。
- 结果是一块画布:拖空白处平移、滚轮缩放。选中一张点「用作参考」,下一轮就变成改图,新图会从原图拉一条虚线过来,改了哪几轮一眼看清。
- 按画板归档:顶部切换 / 新建 / 重命名,画布位置自动保存,重开页面回到上次的画板。「素材」页可以跨画板搜索,把图用作参考、定位回画布、或删掉。

工作台的「素材」页:画板栏 + 跨画板素材检索,每张图可「用作参考」「定位」或移除

ComfyUI 没起来时面板照样打开,顶部会写清查了哪些端口、为什么失败。

「优化提示词」需要宿主装了 @deepseek-ai/dsh-llm。没有的话只有这个按钮不可用,出图不受影响。

工具

| 工具 | 用途 | 主要参数 |
| qwen_image_generate | 出图 | prompt、wh_ratio、width/height、steps、seed、count、preset、board |
| qwen_image_edit | 改图 | prompt、images(1–10 张)、ratio_follow 或 wh_ratio、board |
| qwen_image_status | 检查环境 | 无 |

不确定为什么跑不通时,先跑 qwen_image_status。它会告诉你 ComfyUI 在不在、三个权重能不能识别、显卡剩多少显存、输出目录能不能写。不产图、不写盘。

board 不传时会新建一块画板,把返回的 board.id 传回后续调用就能归到同一块。同一组图继续出图 / 改图时记得传——新图和它的来源才会落在同一块画布上。

提示词怎么写

模型会自动改写,这里只说改写的方向。完整规则见 T2I 规则 与 改图规则。

| 场景 | 你可以这么说 | 改写方向 |
| 海报、页面、多物宽景 | 「画一张夏日饮料海报」 | 一整段英文散文,从背景到顶部到主体再到下方依次描写。比例不写进正文 |
| 肖像、特写、单品 | 「画我的猫的大头照」 | 同上,顺序是背景 → 姿态 → 头脸 → 身体 → 手持物 → 边缘细节 |
| 单张参考图改图 | 「把这张客厅改成晚上的」 | 只动点名的属性,其余保持。不加 <image1> 标签 |
| 多张参考图 | 「把我放进那张客厅照片」 | 必须用 <image1> <image2> 逐张说明,并指明哪张是画布 |
| 只想问怎么写 | 「这种需求提示词怎么写」 | 只给改写结果,不出图 |

工作台里可切两种风格:「长散文」(约 20 句英文细节描写)和「关键词」(主体+场景+风格+镜头+氛围+细节修饰,逗号分隔)。两派都遵守:比例不写进正文、画面里的文字逐字照抄。

性能:base 与 turbo

唯一影响速度与画质的选择是权重家族(设置页 comfyModel):

- base:25 步,官方全量。写实、画面里的中文文字、古典构图用它。
- turbo:8 步,快约 2.7×。没装 turbo 权重会自动退回 base,结果里会有提示。
盲测 5 题 base 3 : 2 turbo,单张 27–29 s → 9–11 s。turbo 氛围更强,但材质细节、中文小字、印章、古典构图会输给 base。

8 GB 卡(RTX 4070 Laptop)实测:文生图 1312×736 约 2 s/步,1.5MP 的 8 步改图 19–23 s。
全部实测数据见 docs/configuration.md 的证据一节。

部署见 ComfyUI 部署指引。

可能踩的坑

- 参考图只认 PNG / JPEG / WebP 的文件头,TIFF、AVIF 会被拒绝并说明原因。
- 没有局部重绘、没有放大。素材页只做检索和整理,不做批量导出或调色。
- 插件不会替你装 ComfyUI、不下权重、不改它的启动参数。
- 显存不够时报的是 ComfyUI 自己的 CUDA OOM,插件不做前置检查。卡上同时跑游戏或 Blender 会明显变慢。
- 图在对话里的显示靠工具结果里的 Markdown 绝对路径。

许可

插件本体 MIT。权重和官方提示词原文都不随包分发。

- Qwen-Image-2.1 权重受 Qwen RESEARCH LICENSE 约束,限研究用途,商用需自行向权利方取得授权。插件不下载、不携带。
- ComfyUI 是可选外部依赖(GPL-3.0),插件只通过 HTTP 与你的实例通信。
- skill.md 和 references/*.md 是本插件自撰的规则,不是官方原文。

「Qwen」「千问」是阿里巴巴集团商标。本项目是第三方作品,与阿里巴巴无关联、未获其背书。开源许可不授予商标使用权。详见 docs/license-and-limits.md。

ComfyUI 后端与工作流占位符协议({{prompt}} / {{seed}} / {{image}})参考并移植自 dsh-image-gen(Copyright 2026 shanliuling,Apache-2.0),许可全文见 THIRD-PARTY。

更多文档

| 文档 | 内容 |
| docs/comfyui-deployment.md | 本机部署:下载、建实例、放权重、校验、排障 |
| docs/configuration.md | 14 个配置字段的默认值和边界 |
| docs/usage-reference.md | 像素怎么算、表外比例、board 用法、status 各字段 |
| docs/license-and-limits.md | 分发和商用前的注意事项 |
| docs/local-install.md | 开发:本机构建、打包、tarball 安装 |
| docs/testing.md | 开发:怎么跑测试 |
| docs/client-bundle.md | 开发:改客户端和设置页 UI |
| docs/release-notes-0.2.0.md | 0.2.0 改了什么,以及从 0.1.0 升上来要注意什么 |
预览分享卡片长什么样 ↓Demerier/dsh-image-forge
分享 · DeepSeek Harness Hub
Demerier/dsh-image-forge

DeepSeek Harness 插件:Qwen-Image 2.1出图与参考图编辑,支持 ComfyUI / 官方…

这是你的仓库?认领条目

回到顶部