READMESource: main@800e1fed
dsh-text2img
把本机 ComfyUI 的文生图能力注册成 DeepSeek Harness(DSH)的原生工具 text2img。
装上之后,你在对话里说「帮我画一张图:……」,Agent 会扩写提示词、调用本地模型、把生成的图直接显示在对话里——不走网络,不上传任何数据,不消耗 API 额度。
同一个仓库还配套一个独立 CLI:
dshtext2img.py,不装 DSH 也能命令行出图。
特性
- 三种模型可选:FLUX.1 Dev(画质/遵循度最好)、Qwen-Image(图内可读文字最强)、SDXL(最快)
- 零云端依赖:ComfyUI 跑在
127.0.0.1:8188,图片落本地磁盘 - 图片直接进对话:经 DSH 的 attachments 服务变成会话附件,不是甩一个路径给你
- 自动拉起 ComfyUI:服务没起时自动运行启动脚本并轮询就绪(最多 120 秒)
- 不覆盖旧图:ComfyUI 只按自己的
output目录编号,文件被移走后会从00001重排,本插件在目标已存在时自动加_2、_3后缀 - 降级安全:附件服务缺席时退化为返回文件路径,工具本身不会失败
工具参数
| 参数 | 类型 | 说明 |
|---|---|---|
prompt |
string,必填 | 详细提示词,建议英文长句 |
model |
flux / qwen / sdxl |
默认 flux |
width / height |
integer | 默认 1024 × 1024 |
steps |
integer | 默认 20(flux/qwen)或 25(sdxl) |
seed |
integer | 固定种子可复现同一张图 |
guidance |
number | FLUX 专用,默认 3.5 |
negative |
string | 负向提示词(qwen/sdxl 生效,FLUX 忽略) |
output_name |
string | 输出文件名前缀 |
模型选型(RTX 5070 Ti Laptop 12GB 实测)
| 场景 | 模型 | 耗时 |
|---|---|---|
| 复杂场景、严格遵循提示词、最高画质 | flux | ~64–78 秒 |
| 图里需要可读文字(海报 / 图表 / Logo) | qwen | ~161 秒 |
| 要快、或需要特定画风(配 LoRA) | sdxl | ~10–16 秒 |
⚠️ FLUX.1 dev 的产出不可商用;Qwen-Image 与 SDXL 可以。
前置条件
- ComfyUI(本仓库在 0.38.0 + torch 2.9.1+cu128 上验证),默认监听
127.0.0.1:8188 - 模型文件按模型名放到 ComfyUI 的标准目录:
| 模型 | 文件 | 放置位置 |
|---|---|---|
| FLUX | flux1-dev-Q4_K_S.gguf |
models/unet/ |
| FLUX | t5-v1_1-xxl-encoder-Q4_K_S.gguf、clip_l.safetensors |
models/clip/ |
| FLUX | flux-vae-bf16.safetensors |
models/vae/ |
| Qwen-Image | qwen-image-Q3_K_S.gguf + Qwen 文本编码器 |
按 ComfyUI 官方蓝图 |
| SDXL | sd_xl_base_1.0.safetensors |
models/checkpoints/ |
- DSH(本仓库在 0.2.1-rc.2 上验证),Node.js
^22.19.0 || >=24.0.0
安装
本插件是纯插件挂载,不改内核、无构建步骤。把包放进 DSH profile 的 plugins/ 目录:
$dest = "$env:USERPROFILE\.dsh\profiles\desktop\plugins\dsh-text2img"
New-Item -ItemType Directory -Force -Path $dest | Out-Null
Copy-Item .\* $dest -Recurse -Force
然后在 profile 的 package.json 里登记两处:
{
"dependencies": {
"dsh-text2img": "file:./plugins/dsh-text2img"
},
"dsh": {
"profile": {
"bundles": [
// ……原有的 bundle……
"dsh-text2img"
]
}
}
}
重启 DSH 后,模型选择器旁的工具栏里就会出现 text2img 工具。
桌面端(Electron)的 profile 由应用独占,命令行
dsh plugin add写不进去;改完package.json后重启应用即可。
配置(环境变量)
默认值对应作者本机布局,换机器时全部可覆盖,无需改代码:
| 环境变量 | 默认值 | 作用 |
|---|---|---|
TEXT2IMG_COMFY_URL |
http://127.0.0.1:8188 |
ComfyUI 服务地址 |
TEXT2IMG_COMFY_OUTPUT |
D:\AI\ComfyUI\output |
ComfyUI 的 output 目录,插件从这里取图 |
TEXT2IMG_OUT_DIR |
D:\DSH输出\图片 |
图片最终保存目录 |
TEXT2IMG_START_BAT |
D:\AI\start_ai.bat |
ComfyUI 未运行时拉起的启动脚本;留空则只报错不自动启动 |
实现要点
- 不 import 任何
@deepseek-ai/*包,用ctx.tools.register(原始对象)注册,避免依赖解析问题 - 图片经
attachments.saveImage()变成会话附件,以{ type: 'image', attachment: {...} }内容块返回 - ComfyUI 没运行时自动拉起启动脚本并轮询
/system_stats就绪
踩过的坑(已在代码里内建修复)
| 坑 | 处理 |
|---|---|
原生 DualCLIPLoader 看不到 GGUF 文本编码器 |
FLUX 改用 DualCLIPLoaderGGUF |
Qwen-Image 缺 ModelSamplingAuraFlow 会出图异常 |
已加入该节点(shift=3.1) |
| FLUX 官方 VAE 在 hf-mirror 上返回 403 需授权 | 改用 Kijai/flux-fp8 的 flux-vae-bf16.safetensors |
Comfy-Org/flux2-dev 的 VAE 与 FLUX.1 不通用 |
明确不混用 |
| 输出文件互相覆盖 | 目标存在时自动加序号 |
ctx.effect 缺席导致插件加载失败 |
检测后降级为直接注册 |
目录结构
dsh-text2img/
├── package.json # dsh.bundle.patch 指向 cordis.patch.yml
├── cordis.patch.yml # 一行 insert,挂载插件
├── lib/index.js # 全部实现(工具注册 + ComfyUI 通信 + 工作流)
└── README.md
许可
MIT,见 LICENSE。
No comments yet. Be the first to write one.