一个把 多张输入图片(1 张参考图 REF + N 张素材图 SRC)组织成 ComfyUI workflow 并以 Job 队列方式运行的示例工程。
(HTTP: 上传/创建任务/查状态/SSE/取结果)
+-------------------+ +-------------------------+
| meie-ui (Vite) | <----> | meie-server API (8090) |
+-------------------+ +-------------------------+
| ^
| |
| SSE events |
v |
+-------------------------+
| Redis + BullMQ Queue |
+-------------------------+
^ |
| consume | enqueue(jobId)
| v
+-------------------------------+
| meie-server Worker (BullMQ) |
+-------------------------------+
| POST /prompt + WS /ws
v
+------------------+
| ComfyUI (8000) |
+------------------+
^ |
| reads input | writes output
| v
COMFY_INPUT_DIR/UPLOAD_SUBDIR/<jobId>/... (ComfyUI output dir)
+------------------+
| SQLite (meie.db) |
+------------------+
(job/事件/结果元数据持久化)
apps/meie-ui: React + Vite 前端apps/meie-server: Node.js 后端(API + Worker + SQLite + BullMQ)workflow_api.json: 旧版 ComfyUI workflow(legacy)workflow_api.lite.json: lite workflow(Depth + Canny 双 ControlNet + IPAdapter,多数场景推荐默认)workflow_api.full.json: full workflow(在 lite 基础上增加:自动 Prompt、自动 Mask、可选后处理;对节点依赖更多)- 约定:后端会优先通过关键节点的
_meta.title定位节点(例如POS_PROMPT/NEG_PROMPT/REF_COMPOSITION/SRC_FEATURE_STYLE/IPAdapterAdvanced (Track B)等)。 - 如果你在 ComfyUI 里编辑并重新导出 workflow,建议尽量保持这些标题不变;否则需要同步更新后端的 title 映射(或确保关键节点的 id 仍与默认一致)。
- 约定:后端会优先通过关键节点的
POST /v1/jobs 的 params 支持选择工作流模式:
{
"workflow_mode": "lite",
"workflow_strict": false
}workflow_mode:"lite"或"full"(默认"lite")workflow_strict:true时若缺少节点类型会直接失败;false时会自动回退到更简单的 workflow(full -> lite -> legacy)
- UI(
meie-ui)调用 API(meie-server)上传ref和sources[] - API 把上传的图片写入 ComfyUI input 目录下的
UPLOAD_SUBDIR/<jobId>/... - API 将 jobId 入队(BullMQ/Redis)
- Worker 取队列任务,构建/校验 workflow,调用 ComfyUI:
POST /prompt提交任务WS /ws或轮询 history 读取进度与输出
- Worker 保存输出元数据到 SQLite
- UI 通过 SSE(
/v1/jobs/:jobId/events)更新进度,完成后展示输出图
注意:如果你的机器只有 1 张 GPU,ComfyUI 的 devices=1 属正常现象。多 Worker 只会增加“提交并发”,但 ComfyUI 仍可能在 GPU 上串行执行(队列排队)。
你需要准备以下组件:
- 推荐:Node.js 20+(本项目脚本使用了
node --env-file-if-exists读取根目录.env) - 也可用 Node 18,但需要你自行在 shell 里导出环境变量(或改脚本用 dotenv)
推荐用 Docker(最省心):
docker run --name redis-meie -p 6379:6379 -d redis:7如果你不用 Docker:
- Windows:建议用 WSL2 跑 Redis,或使用兼容产品(如 Memurai)
- macOS:
brew install redis && brew services start redis - Linux:
apt/yum/pacman安装redis-server并启动
默认连接:redis://127.0.0.1:6379
需要在本机跑一个 ComfyUI 服务(默认端口 8000),并确保 workflow 里使用到的自定义节点已安装(例如 IPAdapter 相关节点)。
一个常见的安装方式(示例):
- 安装 Python(建议 3.10/3.11)并创建虚拟环境
- 克隆 ComfyUI 仓库并安装依赖
- 启动 ComfyUI(示例端口 8000)
你最终需要的是:ComfyUI 能访问自己的 input/ 目录,并能正常接受 POST /prompt。
默认连接:http://127.0.0.1:8000
本项目后端会在启动时尝试读取仓库根目录的 .env(如果存在)。
最小可用示例(Windows 路径建议用正斜杠):
说明:上传的图片会保存到:
COMFY_INPUT_DIR/UPLOAD_SUBDIR/<jobId>/ref.(png|jpg|webp)
COMFY_INPUT_DIR/UPLOAD_SUBDIR/<jobId>/src_0.(png|jpg|webp)、src_1...
更多配置项见 .env.example。
npm install- 启动 API(默认
http://127.0.0.1:8090)
npm run dev:server- 启动 Worker
npm run dev:worker- 启动 UI(默认
http://localhost:5173)
npm run dev:uiWindows 提示:
- 如果你在 PowerShell 里遇到
npm.ps1执行策略问题,可以改用:cmd /c npm run dev:ui(或在 CMD 里运行)- 或 PowerShell 使用
-NoProfile
npm run dev- 打开 UI:
http://localhost:5173 - 左侧上传:
- 参考图(REF):1 张
- 素材图(SRC):至少 1 张(支持多张)
- 点击「创建任务」
- 右侧「进行中」Tab 可查看排队/运行中的任务进度
- 任务完成后,点击任务可在中间区域查看结果并下载
Base URL:http://127.0.0.1:8090
POST /v1/jobs- Header:
X-User-Id: <string>(用于按用户限流与历史查询) - Body:
multipart/form-dataref: 单文件sources: 多文件(>= 1)params: JSON(可选)debug:"1"(可选)
- 返回:
202 { "jobId": "<uuid>" }
GET /v1/jobs/:jobId
GET /v1/jobs/:jobId/events- 事件包括:
snapshot、state、progress、completed、failed
GET /v1/jobs?state=active|done|all&limit=100- Header:
X-User-Id: <string>
GET /v1/jobs/:jobId/images/:idx
POST /v1/jobs/:jobId/cancel
MIT