aleph65 commited on
Commit
705c355
·
verified ·
1 Parent(s): 3f19eb7

qwen-edit-turbo latest: bake Qwen4Play_v2 lora (on by default), drop Amateur-Photo lora

Browse files
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-v1`. See `serverless/README.md`.
 
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-v1 .
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/Qwen_LoRA_Amateur_Photo_v1.safetensors --local-dir /workspace/ComfyUI
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-v1` | `dom5lwr0o5wq6u` | Qwen-Image-Edit-2511 **bf16** + Lightning 4/8-step loras + Skin-Fix/Amateur 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,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": "Qwen_LoRA_Amateur_Photo_v1.safetensors",
346
- "on": false,
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.lora_amateur:
67
- params["lora_amateur"] = True
68
- params["lora_amateur_strength"] = args.lora_amateur_strength
 
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-amateur", action="store_true")
114
- ap.add_argument("--lora-amateur-strength", type=float, default=1.0)
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-amateur enable the optional loras
25
- --lora-skin-fix-strength / --lora-amateur-strength (default 1.0)
 
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.lora_amateur:
63
- params["lora_amateur"] = True
64
- params["lora_amateur_strength"] = args.lora_amateur_strength
 
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-amateur", action="store_true")
110
- ap.add_argument("--lora-amateur-strength", type=float, default=1.0)
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/Qwen_LoRA_Amateur_Photo_v1.safetensors"
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": {"node": "40", "input": "prompt"},
4
- "image": {"node": "20", "input": "image", "type": "image"},
5
- "image_ref": {"node": "30", "input": "image", "type": "image"},
6
- "use_ref": {"node": "56", "input": "value"},
7
- "mode": {"node": "5", "input": "value",
8
- "choices": {"turbo-4": 1, "turbo-8": 2, "quality": 3}},
9
- "seed": {"node": "43", "input": "seed"},
10
- "input_max_dim": {"node": "21", "input": "value"},
11
- "ref_max_dim": {"node": "31", "input": "value"},
12
- "upscale_input": {"node": "15", "input": "value"},
13
- "downscale_input": {"node": "16", "input": "value"},
14
- "upscale_output": {"node": "46", "input": "value"},
15
- "output_max_dim": {"node": "47", "input": "value"},
16
- "lora_skin_fix": {"node": "52", "input": "lora_1", "subkey": "on"},
17
- "lora_skin_fix_strength": {"node": "52", "input": "lora_1", "subkey": "strength"},
18
- "lora_amateur": {"node": "52", "input": "lora_2", "subkey": "on"},
19
- "lora_amateur_strength": {"node": "52", "input": "lora_2", "subkey": "strength"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  },
21
- "defaults": {"mode": "turbo-8"},
22
- "image_slots": ["image", "image_ref"],
23
- "when_image_absent": {"image_ref": {"use_ref": false}}
 
 
 
 
 
 
 
 
 
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": "Qwen_LoRA_Amateur_Photo_v1.safetensors",
346
- "on": false,
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
+ }