qwen-edit-turbo latest: bake Qwen4Play_v2 lora (on by default), drop Amateur-Photo lora
Browse files- README.md +2 -1
- serverless/Dockerfile +2 -2
- serverless/README.md +5 -1
- serverless/client/qwen-edit-turbo-v4.json +3 -3
- serverless/client/qwen_edit_async.py +6 -5
- serverless/client/qwen_edit_sync.py +9 -7
- serverless/endpoints/qwen-edit-turbo/endpoint.json +2 -2
- serverless/endpoints/qwen-edit-turbo/params/qwen-edit-turbo-v4.json +87 -20
- serverless/endpoints/qwen-edit-turbo/workflows/qwen-edit-turbo-v4.json +3 -3
README.md
CHANGED
|
@@ -56,7 +56,8 @@ neither is set.
|
|
| 56 |
The `serverless/` folder in the HF repo holds RunPod serverless workers that
|
| 57 |
run these workflows as an API (models baked into per-family images for fast
|
| 58 |
cold starts). Current endpoint: `qwen-edit-turbo` (`dom5lwr0o5wq6u`), image
|
| 59 |
-
`plx1029/comfyui-serverless:qwen-edit-turbo-
|
|
|
|
| 60 |
|
| 61 |
## How this stays up to date
|
| 62 |
|
|
|
|
| 56 |
The `serverless/` folder in the HF repo holds RunPod serverless workers that
|
| 57 |
run these workflows as an API (models baked into per-family images for fast
|
| 58 |
cold starts). Current endpoint: `qwen-edit-turbo` (`dom5lwr0o5wq6u`), image
|
| 59 |
+
`plx1029/comfyui-serverless:qwen-edit-turbo-latest` (Qwen4Play lora baked in,
|
| 60 |
+
on by default). See `serverless/README.md`.
|
| 61 |
|
| 62 |
## How this stays up to date
|
| 63 |
|
serverless/Dockerfile
CHANGED
|
@@ -8,7 +8,7 @@
|
|
| 8 |
# -f serverless/Dockerfile \
|
| 9 |
# --secret id=hf_token,env=HF_TOKEN \
|
| 10 |
# --build-arg ENDPOINT=qwen-edit-turbo \
|
| 11 |
-
# -t plx1029/comfyui-serverless:qwen-edit-turbo-
|
| 12 |
#
|
| 13 |
# Layer order mirrors build.sh: custom nodes + models first (heavy, rarely
|
| 14 |
# change), serverless code last (tiny, changes often) — so code iterations
|
|
@@ -45,7 +45,7 @@ RUN --mount=type=secret,id=hf_token HF_TOKEN=$(cat /run/secrets/hf_token) \
|
|
| 45 |
RUN --mount=type=secret,id=hf_token HF_TOKEN=$(cat /run/secrets/hf_token) \
|
| 46 |
hf download aleph65/ComfyUI models/loras/Qwen_LoRA_Skin_Fix_v2.safetensors --local-dir /workspace/ComfyUI
|
| 47 |
RUN --mount=type=secret,id=hf_token HF_TOKEN=$(cat /run/secrets/hf_token) \
|
| 48 |
-
hf download aleph65/ComfyUI models/loras/
|
| 49 |
|
| 50 |
# ---- serverless code (top layer: cheap to rebuild) ----
|
| 51 |
COPY apply_patches.sh /workspace/apply_patches.sh
|
|
|
|
| 8 |
# -f serverless/Dockerfile \
|
| 9 |
# --secret id=hf_token,env=HF_TOKEN \
|
| 10 |
# --build-arg ENDPOINT=qwen-edit-turbo \
|
| 11 |
+
# -t plx1029/comfyui-serverless:qwen-edit-turbo-latest .
|
| 12 |
#
|
| 13 |
# Layer order mirrors build.sh: custom nodes + models first (heavy, rarely
|
| 14 |
# change), serverless code last (tiny, changes often) — so code iterations
|
|
|
|
| 45 |
RUN --mount=type=secret,id=hf_token HF_TOKEN=$(cat /run/secrets/hf_token) \
|
| 46 |
hf download aleph65/ComfyUI models/loras/Qwen_LoRA_Skin_Fix_v2.safetensors --local-dir /workspace/ComfyUI
|
| 47 |
RUN --mount=type=secret,id=hf_token HF_TOKEN=$(cat /run/secrets/hf_token) \
|
| 48 |
+
hf download aleph65/ComfyUI models/loras/Qwen4Play_v2.safetensors --local-dir /workspace/ComfyUI
|
| 49 |
|
| 50 |
# ---- serverless code (top layer: cheap to rebuild) ----
|
| 51 |
COPY apply_patches.sh /workspace/apply_patches.sh
|
serverless/README.md
CHANGED
|
@@ -8,7 +8,7 @@ Images: `plx1029/comfyui-serverless` on Docker Hub. Current endpoint:
|
|
| 8 |
|
| 9 |
| endpoint | image tag | RunPod endpoint id | contents |
|
| 10 |
|---|---|---|---|
|
| 11 |
-
| qwen-edit-turbo | `qwen-edit-turbo-
|
| 12 |
| qwen-edit-nsfw | `qwen-edit-nsfw-v1` | `tplcz9jtzihoxa` | Qwen-Rapid-AIO-NSFW v11.4 + next-scene lora, RES4LYF sampler, workflow `qwen-edit-nsfw` |
|
| 13 |
| faceswap-lissie | `faceswap-lissie-v1` | `qkeibkeoefcrk3` | Flux-2-Klein 9B + Qwen3-8B TE + bfs-head/lissie loras + Qwen3-VL-4B + RMBG-2.0 (baked), workflow `new-faceswap-lissie-v4` |
|
| 14 |
|
|
@@ -21,6 +21,10 @@ image via `"workflow"`, or a fully custom API-format graph via
|
|
| 21 |
|
| 22 |
Serverless-specific workflow tweaks (baked copies under `endpoints/*/workflows/`
|
| 23 |
differ from `workflows/api/` in exactly these ways):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
- `qwen-edit-nsfw`: removed the KJNodes `WidgetToString` node (it reads
|
| 25 |
UI-only metadata and crashes headless); the Image-Saver metadata node gets a
|
| 26 |
static model-name string instead. Behavior is otherwise identical.
|
|
|
|
| 8 |
|
| 9 |
| endpoint | image tag | RunPod endpoint id | contents |
|
| 10 |
|---|---|---|---|
|
| 11 |
+
| qwen-edit-turbo | `qwen-edit-turbo-latest` | `dom5lwr0o5wq6u` | Qwen-Image-Edit-2511 **bf16** + Lightning 4/8-step loras + Skin-Fix/Qwen4Play loras, workflow `qwen-edit-turbo-v4` |
|
| 12 |
| qwen-edit-nsfw | `qwen-edit-nsfw-v1` | `tplcz9jtzihoxa` | Qwen-Rapid-AIO-NSFW v11.4 + next-scene lora, RES4LYF sampler, workflow `qwen-edit-nsfw` |
|
| 13 |
| faceswap-lissie | `faceswap-lissie-v1` | `qkeibkeoefcrk3` | Flux-2-Klein 9B + Qwen3-8B TE + bfs-head/lissie loras + Qwen3-VL-4B + RMBG-2.0 (baked), workflow `new-faceswap-lissie-v4` |
|
| 14 |
|
|
|
|
| 21 |
|
| 22 |
Serverless-specific workflow tweaks (baked copies under `endpoints/*/workflows/`
|
| 23 |
differ from `workflows/api/` in exactly these ways):
|
| 24 |
+
- `qwen-edit-turbo` (since the `latest` tag; `-v1` had Amateur-Photo instead):
|
| 25 |
+
lora slot 2 of the "User LoRAs" node is `Qwen4Play_v2` and **enabled by
|
| 26 |
+
default** (params `lora_qwen4play` / `lora_qwen4play_strength` toggle it);
|
| 27 |
+
the Amateur-Photo lora is not in the image anymore.
|
| 28 |
- `qwen-edit-nsfw`: removed the KJNodes `WidgetToString` node (it reads
|
| 29 |
UI-only metadata and crashes headless); the Image-Saver metadata node gets a
|
| 30 |
static model-name string instead. Behavior is otherwise identical.
|
serverless/client/qwen-edit-turbo-v4.json
CHANGED
|
@@ -342,8 +342,8 @@
|
|
| 342 |
"strengthTwo": null
|
| 343 |
},
|
| 344 |
"lora_2": {
|
| 345 |
-
"lora": "
|
| 346 |
-
"on":
|
| 347 |
"strength": 1,
|
| 348 |
"strengthTwo": null
|
| 349 |
},
|
|
@@ -755,4 +755,4 @@
|
|
| 755 |
]
|
| 756 |
}
|
| 757 |
}
|
| 758 |
-
}
|
|
|
|
| 342 |
"strengthTwo": null
|
| 343 |
},
|
| 344 |
"lora_2": {
|
| 345 |
+
"lora": "Qwen4Play_v2.safetensors",
|
| 346 |
+
"on": true,
|
| 347 |
"strength": 1,
|
| 348 |
"strengthTwo": null
|
| 349 |
},
|
|
|
|
| 755 |
]
|
| 756 |
}
|
| 757 |
}
|
| 758 |
+
}
|
serverless/client/qwen_edit_async.py
CHANGED
|
@@ -63,9 +63,10 @@ def build_input(args):
|
|
| 63 |
if args.lora_skin_fix:
|
| 64 |
params["lora_skin_fix"] = True
|
| 65 |
params["lora_skin_fix_strength"] = args.lora_skin_fix_strength
|
| 66 |
-
if args.
|
| 67 |
-
params["
|
| 68 |
-
|
|
|
|
| 69 |
|
| 70 |
payload = {"images": images, "params": params}
|
| 71 |
if args.workflow:
|
|
@@ -110,8 +111,8 @@ def main():
|
|
| 110 |
ap.add_argument("--output-max-dim", type=int)
|
| 111 |
ap.add_argument("--lora-skin-fix", action="store_true")
|
| 112 |
ap.add_argument("--lora-skin-fix-strength", type=float, default=1.0)
|
| 113 |
-
ap.add_argument("--lora-
|
| 114 |
-
ap.add_argument("--lora-
|
| 115 |
ap.add_argument("--workflow")
|
| 116 |
ap.add_argument("--set", action="append", metavar="NODE.INPUT=VALUE")
|
| 117 |
ap.add_argument("--workflow-json")
|
|
|
|
| 63 |
if args.lora_skin_fix:
|
| 64 |
params["lora_skin_fix"] = True
|
| 65 |
params["lora_skin_fix_strength"] = args.lora_skin_fix_strength
|
| 66 |
+
if args.no_lora_qwen4play:
|
| 67 |
+
params["lora_qwen4play"] = False
|
| 68 |
+
if args.lora_qwen4play_strength is not None:
|
| 69 |
+
params["lora_qwen4play_strength"] = args.lora_qwen4play_strength
|
| 70 |
|
| 71 |
payload = {"images": images, "params": params}
|
| 72 |
if args.workflow:
|
|
|
|
| 111 |
ap.add_argument("--output-max-dim", type=int)
|
| 112 |
ap.add_argument("--lora-skin-fix", action="store_true")
|
| 113 |
ap.add_argument("--lora-skin-fix-strength", type=float, default=1.0)
|
| 114 |
+
ap.add_argument("--no-lora-qwen4play", action="store_true")
|
| 115 |
+
ap.add_argument("--lora-qwen4play-strength", type=float, default=None)
|
| 116 |
ap.add_argument("--workflow")
|
| 117 |
ap.add_argument("--set", action="append", metavar="NODE.INPUT=VALUE")
|
| 118 |
ap.add_argument("--workflow-json")
|
serverless/client/qwen_edit_sync.py
CHANGED
|
@@ -21,8 +21,9 @@ All arguments:
|
|
| 21 |
--input-max-dim max size of the main image fed to the model (default 2048)
|
| 22 |
--ref-max-dim max size of the reference image (default 1024)
|
| 23 |
--output-max-dim upscale target for the result (default 2560)
|
| 24 |
-
--lora-skin-fix / --lora-
|
| 25 |
-
--lora-
|
|
|
|
| 26 |
--workflow which baked workflow to run (default qwen-edit-turbo-v4)
|
| 27 |
--set NODE.INPUT=VALUE raw graph override, repeatable (advanced)
|
| 28 |
--workflow-json FILE full API-format graph passthrough (advanced)
|
|
@@ -59,9 +60,10 @@ def build_input(args):
|
|
| 59 |
if args.lora_skin_fix:
|
| 60 |
params["lora_skin_fix"] = True
|
| 61 |
params["lora_skin_fix_strength"] = args.lora_skin_fix_strength
|
| 62 |
-
if args.
|
| 63 |
-
params["
|
| 64 |
-
|
|
|
|
| 65 |
|
| 66 |
payload = {"images": images, "params": params}
|
| 67 |
if args.workflow:
|
|
@@ -106,8 +108,8 @@ def main():
|
|
| 106 |
ap.add_argument("--output-max-dim", type=int)
|
| 107 |
ap.add_argument("--lora-skin-fix", action="store_true")
|
| 108 |
ap.add_argument("--lora-skin-fix-strength", type=float, default=1.0)
|
| 109 |
-
ap.add_argument("--lora-
|
| 110 |
-
ap.add_argument("--lora-
|
| 111 |
ap.add_argument("--workflow")
|
| 112 |
ap.add_argument("--set", action="append", metavar="NODE.INPUT=VALUE")
|
| 113 |
ap.add_argument("--workflow-json")
|
|
|
|
| 21 |
--input-max-dim max size of the main image fed to the model (default 2048)
|
| 22 |
--ref-max-dim max size of the reference image (default 1024)
|
| 23 |
--output-max-dim upscale target for the result (default 2560)
|
| 24 |
+
--lora-skin-fix / --lora-skin-fix-strength enable the optional skin-fix lora
|
| 25 |
+
--no-lora-qwen4play disable the Qwen4Play lora (on by default)
|
| 26 |
+
--lora-qwen4play-strength override its strength (default 1.0)
|
| 27 |
--workflow which baked workflow to run (default qwen-edit-turbo-v4)
|
| 28 |
--set NODE.INPUT=VALUE raw graph override, repeatable (advanced)
|
| 29 |
--workflow-json FILE full API-format graph passthrough (advanced)
|
|
|
|
| 60 |
if args.lora_skin_fix:
|
| 61 |
params["lora_skin_fix"] = True
|
| 62 |
params["lora_skin_fix_strength"] = args.lora_skin_fix_strength
|
| 63 |
+
if args.no_lora_qwen4play:
|
| 64 |
+
params["lora_qwen4play"] = False
|
| 65 |
+
if args.lora_qwen4play_strength is not None:
|
| 66 |
+
params["lora_qwen4play_strength"] = args.lora_qwen4play_strength
|
| 67 |
|
| 68 |
payload = {"images": images, "params": params}
|
| 69 |
if args.workflow:
|
|
|
|
| 108 |
ap.add_argument("--output-max-dim", type=int)
|
| 109 |
ap.add_argument("--lora-skin-fix", action="store_true")
|
| 110 |
ap.add_argument("--lora-skin-fix-strength", type=float, default=1.0)
|
| 111 |
+
ap.add_argument("--no-lora-qwen4play", action="store_true")
|
| 112 |
+
ap.add_argument("--lora-qwen4play-strength", type=float, default=None)
|
| 113 |
ap.add_argument("--workflow")
|
| 114 |
ap.add_argument("--set", action="append", metavar="NODE.INPUT=VALUE")
|
| 115 |
ap.add_argument("--workflow-json")
|
serverless/endpoints/qwen-edit-turbo/endpoint.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
{
|
| 2 |
"name": "qwen-edit-turbo",
|
| 3 |
-
"description": "Qwen-Image-Edit-2511 bf16 + Lightning 4/8-step turbo (qwen-edit-turbo-v4)",
|
| 4 |
"default_workflow": "qwen-edit-turbo-v4",
|
| 5 |
"hf_repo": "aleph65/ComfyUI",
|
| 6 |
"models": [
|
|
@@ -10,7 +10,7 @@
|
|
| 10 |
"models/loras/Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors",
|
| 11 |
"models/loras/Qwen-Image-Edit-2511-Lightning-8steps-V1.0-bf16.safetensors",
|
| 12 |
"models/loras/Qwen_LoRA_Skin_Fix_v2.safetensors",
|
| 13 |
-
"models/loras/
|
| 14 |
],
|
| 15 |
"custom_nodes": [
|
| 16 |
"rgthree-comfy",
|
|
|
|
| 1 |
{
|
| 2 |
"name": "qwen-edit-turbo",
|
| 3 |
+
"description": "Qwen-Image-Edit-2511 bf16 + Lightning 4/8-step turbo + Qwen4Play (qwen-edit-turbo-v4)",
|
| 4 |
"default_workflow": "qwen-edit-turbo-v4",
|
| 5 |
"hf_repo": "aleph65/ComfyUI",
|
| 6 |
"models": [
|
|
|
|
| 10 |
"models/loras/Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors",
|
| 11 |
"models/loras/Qwen-Image-Edit-2511-Lightning-8steps-V1.0-bf16.safetensors",
|
| 12 |
"models/loras/Qwen_LoRA_Skin_Fix_v2.safetensors",
|
| 13 |
+
"models/loras/Qwen4Play_v2.safetensors"
|
| 14 |
],
|
| 15 |
"custom_nodes": [
|
| 16 |
"rgthree-comfy",
|
serverless/endpoints/qwen-edit-turbo/params/qwen-edit-turbo-v4.json
CHANGED
|
@@ -1,24 +1,91 @@
|
|
| 1 |
{
|
| 2 |
"params": {
|
| 3 |
-
"prompt":
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
"
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
"
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
"
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
},
|
| 21 |
-
"defaults": {
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
}
|
|
|
|
| 1 |
{
|
| 2 |
"params": {
|
| 3 |
+
"prompt": {
|
| 4 |
+
"node": "40",
|
| 5 |
+
"input": "prompt"
|
| 6 |
+
},
|
| 7 |
+
"image": {
|
| 8 |
+
"node": "20",
|
| 9 |
+
"input": "image",
|
| 10 |
+
"type": "image"
|
| 11 |
+
},
|
| 12 |
+
"image_ref": {
|
| 13 |
+
"node": "30",
|
| 14 |
+
"input": "image",
|
| 15 |
+
"type": "image"
|
| 16 |
+
},
|
| 17 |
+
"use_ref": {
|
| 18 |
+
"node": "56",
|
| 19 |
+
"input": "value"
|
| 20 |
+
},
|
| 21 |
+
"mode": {
|
| 22 |
+
"node": "5",
|
| 23 |
+
"input": "value",
|
| 24 |
+
"choices": {
|
| 25 |
+
"turbo-4": 1,
|
| 26 |
+
"turbo-8": 2,
|
| 27 |
+
"quality": 3
|
| 28 |
+
}
|
| 29 |
+
},
|
| 30 |
+
"seed": {
|
| 31 |
+
"node": "43",
|
| 32 |
+
"input": "seed"
|
| 33 |
+
},
|
| 34 |
+
"input_max_dim": {
|
| 35 |
+
"node": "21",
|
| 36 |
+
"input": "value"
|
| 37 |
+
},
|
| 38 |
+
"ref_max_dim": {
|
| 39 |
+
"node": "31",
|
| 40 |
+
"input": "value"
|
| 41 |
+
},
|
| 42 |
+
"upscale_input": {
|
| 43 |
+
"node": "15",
|
| 44 |
+
"input": "value"
|
| 45 |
+
},
|
| 46 |
+
"downscale_input": {
|
| 47 |
+
"node": "16",
|
| 48 |
+
"input": "value"
|
| 49 |
+
},
|
| 50 |
+
"upscale_output": {
|
| 51 |
+
"node": "46",
|
| 52 |
+
"input": "value"
|
| 53 |
+
},
|
| 54 |
+
"output_max_dim": {
|
| 55 |
+
"node": "47",
|
| 56 |
+
"input": "value"
|
| 57 |
+
},
|
| 58 |
+
"lora_skin_fix": {
|
| 59 |
+
"node": "52",
|
| 60 |
+
"input": "lora_1",
|
| 61 |
+
"subkey": "on"
|
| 62 |
+
},
|
| 63 |
+
"lora_skin_fix_strength": {
|
| 64 |
+
"node": "52",
|
| 65 |
+
"input": "lora_1",
|
| 66 |
+
"subkey": "strength"
|
| 67 |
+
},
|
| 68 |
+
"lora_qwen4play": {
|
| 69 |
+
"node": "52",
|
| 70 |
+
"input": "lora_2",
|
| 71 |
+
"subkey": "on"
|
| 72 |
+
},
|
| 73 |
+
"lora_qwen4play_strength": {
|
| 74 |
+
"node": "52",
|
| 75 |
+
"input": "lora_2",
|
| 76 |
+
"subkey": "strength"
|
| 77 |
+
}
|
| 78 |
},
|
| 79 |
+
"defaults": {
|
| 80 |
+
"mode": "turbo-8"
|
| 81 |
+
},
|
| 82 |
+
"image_slots": [
|
| 83 |
+
"image",
|
| 84 |
+
"image_ref"
|
| 85 |
+
],
|
| 86 |
+
"when_image_absent": {
|
| 87 |
+
"image_ref": {
|
| 88 |
+
"use_ref": false
|
| 89 |
+
}
|
| 90 |
+
}
|
| 91 |
}
|
serverless/endpoints/qwen-edit-turbo/workflows/qwen-edit-turbo-v4.json
CHANGED
|
@@ -342,8 +342,8 @@
|
|
| 342 |
"strengthTwo": null
|
| 343 |
},
|
| 344 |
"lora_2": {
|
| 345 |
-
"lora": "
|
| 346 |
-
"on":
|
| 347 |
"strength": 1,
|
| 348 |
"strengthTwo": null
|
| 349 |
},
|
|
@@ -755,4 +755,4 @@
|
|
| 755 |
]
|
| 756 |
}
|
| 757 |
}
|
| 758 |
-
}
|
|
|
|
| 342 |
"strengthTwo": null
|
| 343 |
},
|
| 344 |
"lora_2": {
|
| 345 |
+
"lora": "Qwen4Play_v2.safetensors",
|
| 346 |
+
"on": true,
|
| 347 |
"strength": 1,
|
| 348 |
"strengthTwo": null
|
| 349 |
},
|
|
|
|
| 755 |
]
|
| 756 |
}
|
| 757 |
}
|
| 758 |
+
}
|