msrcam commited on
Commit
fb6351b
Β·
verified Β·
1 Parent(s): 874ed0c

Upload installers/nudify/install_flux_ultimate_nudify_v0.15.sh with huggingface_hub

Browse files
installers/nudify/install_flux_ultimate_nudify_v0.15.sh ADDED
@@ -0,0 +1,470 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ═══════════════════════════════════════════════════════════════════════════════
3
+ # FLUX Ultimate Nudify - Installation Script v0.15
4
+ # ═══════════════════════════════════════════════════════════════════════════════
5
+ #
6
+ # Core 3-Stage Pipeline:
7
+ # Stage 1: Clothes Removal (FLUX.1 Kontext Dev)
8
+ # Stage 2: Anatomy Enhancement (FLUX.1 Dev - Fluxed Up 7.1)
9
+ # Stage 3: Detail Refinement (FLUX.2 Klein 9B + LoRAs)
10
+ #
11
+ # ═══════════════════════════════════════════════════════════════════════════════
12
+
13
+ set -e
14
+
15
+ # Colors
16
+ RED=''
17
+ GREEN=''
18
+ YELLOW=''
19
+ BLUE=''
20
+ MAGENTA=''
21
+ CYAN=''
22
+ NC=''
23
+
24
+ # Configuration
25
+ COMFY_DIR="${COMFY_DIR:-/workspace/ComfyUI}"
26
+ CIVITAI_TOKEN="${CIVITAI_TOKEN:-eff2ba98a34d6fd7918164753e878bb9}"
27
+
28
+ # Mirror repo for risky models
29
+ MIRROR_REPO="https://huggingface.co/msrcam/ComfyUI_Models/resolve/main"
30
+
31
+ # Auto-detect HF token
32
+ if [ -n "$HF_TOKEN" ]; then
33
+ :
34
+ elif [ -f "$HOME/.cache/huggingface/token" ]; then
35
+ HF_TOKEN=$(cat "$HOME/.cache/huggingface/token")
36
+ echo -e "${GREEN}βœ“ Using cached HuggingFace token${NC}"
37
+ elif [ -f "$HOME/.huggingface/token" ]; then
38
+ HF_TOKEN=$(cat "$HOME/.huggingface/token")
39
+ echo -e "${GREEN}βœ“ Using cached HuggingFace token${NC}"
40
+ else
41
+ echo -e "${YELLOW}! No HF token found - gated models may fail${NC}"
42
+ HF_TOKEN=""
43
+ fi
44
+
45
+ # Banner
46
+ echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════════════${NC}"
47
+ echo -e "${CYAN} FLUX ULTIMATE NUDIFY v0.15${NC}"
48
+ echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════════════${NC}"
49
+ echo ""
50
+
51
+ # ═══════════════════════════════════════════════════════════════════════════════
52
+ # INSTALL ARIA2C IF MISSING
53
+ # ═══════════════════════════════════════════════════════════════════════════════
54
+ if ! command -v aria2c &> /dev/null; then
55
+ echo -e "${YELLOW}Installing aria2c...${NC}"
56
+ apt-get update -qq && apt-get install -y -qq aria2 > /dev/null 2>&1 || true
57
+ fi
58
+
59
+ # ═══════════════════════════════════════════════════════════════════════════════
60
+ # DOWNLOAD FUNCTION WITH FALLBACK
61
+ # ═══════════════════════════════════════════════════════════════════════════════
62
+ dl() {
63
+ local url="$1"
64
+ local dest="$2"
65
+ local desc="$3"
66
+ local fallback_url="${4:-}"
67
+
68
+ if [ -f "$dest" ]; then
69
+ echo -e "${GREEN}βœ“ Already exists: ${desc}${NC}"
70
+ return 0
71
+ fi
72
+
73
+ mkdir -p "$(dirname "$dest")"
74
+ echo -e "${YELLOW}↓ ${desc}${NC}"
75
+
76
+ # Add civitai token if needed
77
+ if [[ "$url" == *"civitai.com"* ]]; then
78
+ url="${url}?token=${CIVITAI_TOKEN}"
79
+ fi
80
+
81
+ # Try primary URL
82
+ if command -v aria2c &> /dev/null; then
83
+ if [[ "$url" == *"huggingface.co"* ]] && [ -n "$HF_TOKEN" ]; then
84
+ aria2c -x 16 -s 16 -k 1M -c --console-log-level=warn \
85
+ --header="Authorization: Bearer ${HF_TOKEN}" \
86
+ -d "$(dirname "$dest")" -o "$(basename "$dest")" "$url" 2>/dev/null && {
87
+ echo -e "${GREEN}βœ“ Downloaded: ${desc}${NC}"
88
+ return 0
89
+ }
90
+ else
91
+ aria2c -x 16 -s 16 -k 1M -c --console-log-level=warn \
92
+ -d "$(dirname "$dest")" -o "$(basename "$dest")" "$url" 2>/dev/null && {
93
+ echo -e "${GREEN}βœ“ Downloaded: ${desc}${NC}"
94
+ return 0
95
+ }
96
+ fi
97
+ fi
98
+
99
+ # Try wget as backup
100
+ wget -q --show-progress -O "$dest" "$url" 2>/dev/null && {
101
+ echo -e "${GREEN}βœ“ Downloaded: ${desc}${NC}"
102
+ return 0
103
+ }
104
+
105
+ # Try fallback URL if provided
106
+ if [ -n "$fallback_url" ]; then
107
+ echo -e "${YELLOW} Trying fallback URL...${NC}"
108
+ aria2c -x 16 -s 16 -k 1M -c --console-log-level=warn \
109
+ -d "$(dirname "$dest")" -o "$(basename "$dest")" "$fallback_url" 2>/dev/null && {
110
+ echo -e "${GREEN}βœ“ Downloaded from fallback: ${desc}${NC}"
111
+ return 0
112
+ }
113
+ wget -q --show-progress -O "$dest" "$fallback_url" 2>/dev/null && {
114
+ echo -e "${GREEN}βœ“ Downloaded from fallback: ${desc}${NC}"
115
+ return 0
116
+ }
117
+ fi
118
+
119
+ echo -e "${RED}βœ— Failed: ${desc}${NC}"
120
+ rm -f "$dest" 2>/dev/null
121
+ return 1
122
+ }
123
+
124
+ # ═══════════════════════════════════════════════════════════════════════════════
125
+ # STEP 1: VERIFY COMFYUI
126
+ # ═══════════════════════════════════════════════════════════════════════════════
127
+ echo -e "
128
+ ${YELLOW}[1/8] Verifying ComfyUI Installation...${NC}"
129
+
130
+ if [ ! -d "$COMFY_DIR" ]; then
131
+ echo -e "${RED}Error: ComfyUI not found at $COMFY_DIR${NC}"
132
+ exit 1
133
+ fi
134
+
135
+ echo -e "${GREEN}βœ“ ComfyUI found at $COMFY_DIR${NC}"
136
+
137
+ # ═══════════════════════════════════════════════════════════════════════════════
138
+ # STEP 2: CREATE DIRECTORIES
139
+ # ═══════════════════════════════════════════════════════════════════════════════
140
+ echo -e "
141
+ ${YELLOW}[2/8] Creating Directory Structure...${NC}"
142
+
143
+ dirs=(
144
+ "models/checkpoints"
145
+ "models/unet"
146
+ "models/diffusion_models"
147
+ "models/vae"
148
+ "models/clip"
149
+ "models/clip/t5"
150
+ "models/text_encoders"
151
+ "models/loras"
152
+ "models/upscale_models"
153
+ "models/ipadapter"
154
+ "models/clip_vision"
155
+ "models/controlnet"
156
+ "models/facerestore_models"
157
+ "models/facedetection"
158
+ "models/insightface/models/buffalo_l"
159
+ "models/ultralytics/bbox"
160
+ "models/ultralytics/segm"
161
+ "models/sams"
162
+ "models/reswapper"
163
+ "models/hyperswap"
164
+ "user/default/workflows"
165
+ )
166
+
167
+ for dir in "${dirs[@]}"; do
168
+ mkdir -p "$COMFY_DIR/$dir"
169
+ done
170
+
171
+ echo -e "${GREEN}βœ“ Directories created${NC}"
172
+
173
+ # ═══════════════════════════════════════════════════════════════════════════════
174
+ # STEP 3: INSTALL CUSTOM NODES
175
+ # ═══════════════════════════════════════════════════════════════════════════════
176
+ echo -e "
177
+ ${YELLOW}[3/8] Installing Custom Nodes...${NC}"
178
+
179
+ cd "$COMFY_DIR/custom_nodes"
180
+
181
+ # Core nodes
182
+ for repo in \
183
+ "https://github.com/ltdrdata/ComfyUI-Manager.git" \
184
+ "https://github.com/rgthree/rgthree-comfy.git" \
185
+ "https://github.com/cubiq/ComfyUI_essentials.git" \
186
+ "https://github.com/ltdrdata/ComfyUI-Impact-Pack.git" \
187
+ "https://github.com/ltdrdata/ComfyUI-Impact-Subpack.git" \
188
+ "https://github.com/Gourieff/ComfyUI-ReActor.git" \
189
+ "https://github.com/cubiq/ComfyUI_IPAdapter_plus.git" \
190
+ "https://github.com/Fannovel16/comfyui_controlnet_aux.git" \
191
+ "https://github.com/ssitu/ComfyUI_UltimateSDUpscale.git" \
192
+ "https://github.com/kijai/ComfyUI-segment-anything-2.git" \
193
+ "https://github.com/kijai/ComfyUI-KJNodes.git" \
194
+ "https://github.com/spacepxl/ComfyUI-Image-Filters.git" \
195
+ "https://github.com/EllangoK/ComfyUI-post-processing-nodes.git" \
196
+ "https://github.com/chrisgoringe/cg-use-everywhere.git" \
197
+ "https://github.com/pythongosssss/ComfyUI-Custom-Scripts.git"
198
+ do
199
+ name=$(basename "$repo" .git)
200
+ if [ ! -d "$name" ]; then
201
+ echo -e "${GREEN}β†’ Installing $name${NC}"
202
+ git clone "$repo" 2>/dev/null || true
203
+ [ -f "$name/requirements.txt" ] && pip install -r "$name/requirements.txt" --break-system-packages 2>/dev/null || true
204
+ else
205
+ echo -e "${GREEN}βœ“ $name already installed${NC}"
206
+ fi
207
+ done
208
+
209
+ # Run Impact Pack install script
210
+ [ -f "ComfyUI-Impact-Pack/install.py" ] && python ComfyUI-Impact-Pack/install.py 2>/dev/null || true
211
+
212
+ echo -e "${GREEN}βœ“ All custom nodes installed${NC}"
213
+
214
+ # ═══════════════════════════════════════════════════════════════════════════════
215
+ # STEP 4: CORE PIPELINE MODELS
216
+ # ═══════════════════════════════════════════════════════════════════════════════
217
+ echo -e "
218
+ ${YELLOW}[4/8] Downloading Core Pipeline Models...${NC}"
219
+
220
+ # Stage 1: Kontext
221
+ echo -e "
222
+ ${MAGENTA}═══ Stage 1: FLUX.1 Kontext Dev ═══${NC}"
223
+
224
+ dl "https://huggingface.co/black-forest-labs/FLUX.1-Kontext-dev/resolve/main/flux1-kontext-dev.safetensors" \
225
+ "$COMFY_DIR/models/unet/flux1-kontext-dev.safetensors" \
226
+ "FLUX.1 Kontext Dev"
227
+
228
+ dl "https://huggingface.co/msrcam/ComfyUI_Models/resolve/main/loras/kontext/clothes_remover_v0.safetensors" \
229
+ "$COMFY_DIR/models/loras/clothes_remover_v0.safetensors" \
230
+ "Clothes Remover LoRA"
231
+
232
+ # Stage 2: Flux Dev
233
+ echo -e "
234
+ ${MAGENTA}═══ Stage 2: FLUX.1 Dev ═══${NC}"
235
+
236
+ dl "$MIRROR_REPO/checkpoints/flux/fluxed-up-7.1-fp16.safetensors" \
237
+ "$COMFY_DIR/models/checkpoints/fluxed-up-7.1-fp16.safetensors" \
238
+ "Fluxed Up 7.1 FP16" \
239
+ "https://civitai.com/api/download/models/2577735?type=Model&format=SafeTensor&size=pruned&fp=fp16"
240
+
241
+ dl "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/clip_l.safetensors" \
242
+ "$COMFY_DIR/models/clip/clip_l.safetensors" \
243
+ "CLIP-L"
244
+
245
+ dl "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensors" \
246
+ "$COMFY_DIR/models/clip/t5/t5xxl_fp8_e4m3fn.safetensors" \
247
+ "T5-XXL FP8"
248
+
249
+ # Stage 3: Klein 9B
250
+ echo -e "
251
+ ${MAGENTA}═══ Stage 3: FLUX.2 Klein 9B ═══${NC}"
252
+
253
+ dl "https://huggingface.co/black-forest-labs/FLUX.2-klein-base-9b-fp8/resolve/main/flux-2-klein-base-9b-fp8.safetensors" \
254
+ "$COMFY_DIR/models/unet/flux-2-klein-base-9b-fp8.safetensors" \
255
+ "FLUX.2 Klein 9B FP8"
256
+
257
+ dl "https://huggingface.co/Comfy-Org/flux2-klein-9B/resolve/main/split_files/text_encoders/qwen_3_8b_fp8mixed.safetensors" \
258
+ "$COMFY_DIR/models/text_encoders/qwen_3_8b_fp8mixed.safetensors" \
259
+ "Qwen 3 8B FP8"
260
+
261
+ dl "https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/vae/flux2-vae.safetensors" \
262
+ "$COMFY_DIR/models/vae/flux2-vae.safetensors" \
263
+ "FLUX2 VAE"
264
+
265
+ # Shared VAE
266
+ dl "https://huggingface.co/black-forest-labs/FLUX.1-dev/resolve/main/ae.safetensors" \
267
+ "$COMFY_DIR/models/vae/ae.safetensors" \
268
+ "FLUX.1 VAE"
269
+
270
+ # ═══════════════════════════════════════════════════════════════════════════════
271
+ # STEP 5: LoRAs
272
+ # ═══════════════════════════════════════════════════════════════════════════════
273
+ echo -e "
274
+ ${YELLOW}[5/8] Downloading LoRAs...${NC}"
275
+
276
+ # Download from mirror repo (consolidated)
277
+ echo -e "${CYAN}═══ Downloading LoRAs from mirror ═══${NC}"
278
+
279
+ for lora in \
280
+ "flux1dev/flux1dev_nudity_female_v2.safetensors" \
281
+ "flux1dev/flux1dev_anatomy_female.safetensors" \
282
+ "flux1dev/flux1dev_nipple_default.safetensors" \
283
+ "flux1dev/flux1dev_pussy_default.safetensors" \
284
+ "flux2klein/flux2klein_nsfw.safetensors" \
285
+ "flux2klein/flux2klein_nipple.safetensors" \
286
+ "flux2klein/flux2klein_pussy.safetensors" \
287
+ "flux2klein/flux2klein_body_version_a.safetensors"
288
+ do
289
+ name=$(basename "$lora")
290
+ dl "$MIRROR_REPO/loras/$lora" \
291
+ "$COMFY_DIR/models/loras/$name" \
292
+ "$name"
293
+ done
294
+
295
+ # Detail LoRAs - mirror first
296
+ dl "$MIRROR_REPO/loras/add_detail.safetensors" \
297
+ "$COMFY_DIR/models/loras/add_detail.safetensors" \
298
+ "Add Detail LoRA" \
299
+ "https://civitai.com/api/download/models/135867"
300
+
301
+ dl "$MIRROR_REPO/loras/skin_detail.safetensors" \
302
+ "$COMFY_DIR/models/loras/skin_detail.safetensors" \
303
+ "Skin Detail LoRA" \
304
+ "https://civitai.com/api/download/models/87153"
305
+
306
+ # ═══════════════════════════════════════════════════════════════════════════════
307
+ # STEP 6: FACE & DETECTION MODELS
308
+ # ═══════════════════════════════════════════════════════════════════════════════
309
+ echo -e "
310
+ ${YELLOW}[6/8] Downloading Face & Detection Models...${NC}"
311
+
312
+ # Face Restore - mirror first
313
+ echo -e "${CYAN}═══ Face Restore ═══${NC}"
314
+
315
+ dl "$MIRROR_REPO/facerestore/codeformer.pth" \
316
+ "$COMFY_DIR/models/facerestore_models/codeformer.pth" \
317
+ "CodeFormer" \
318
+ "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth"
319
+
320
+ dl "$MIRROR_REPO/facerestore/GFPGANv1.4.pth" \
321
+ "$COMFY_DIR/models/facerestore_models/GFPGANv1.4.pth" \
322
+ "GFPGAN v1.4" \
323
+ "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth"
324
+
325
+ dl "$MIRROR_REPO/facerestore/GPEN-BFR-1024.onnx" \
326
+ "$COMFY_DIR/models/facerestore_models/GPEN-BFR-1024.onnx" \
327
+ "GPEN-BFR-1024"
328
+
329
+ dl "$MIRROR_REPO/facerestore/GPEN-BFR-2048.onnx" \
330
+ "$COMFY_DIR/models/facerestore_models/GPEN-BFR-2048.onnx" \
331
+ "GPEN-BFR-2048"
332
+
333
+ # Detection models - from mirror
334
+ echo -e "${CYAN}═══ Detection Models ═══${NC}"
335
+
336
+ dl "$MIRROR_REPO/detection/parsing_parsenet.pth" \
337
+ "$COMFY_DIR/models/facedetection/parsing_parsenet.pth" \
338
+ "Parsing ParseNet"
339
+
340
+ dl "$MIRROR_REPO/detection/detection_Resnet50_Final.pth" \
341
+ "$COMFY_DIR/models/facedetection/detection_Resnet50_Final.pth" \
342
+ "Detection Resnet50"
343
+
344
+ dl "$MIRROR_REPO/detection/face_yolov8m.pt" \
345
+ "$COMFY_DIR/models/ultralytics/bbox/face_yolov8m.pt" \
346
+ "YOLOv8m Face"
347
+
348
+ dl "$MIRROR_REPO/detection/hand_yolov8s.pt" \
349
+ "$COMFY_DIR/models/ultralytics/bbox/hand_yolov8s.pt" \
350
+ "YOLOv8s Hand"
351
+
352
+ dl "$MIRROR_REPO/detection/person_yolov8s-seg.pt" \
353
+ "$COMFY_DIR/models/ultralytics/segm/person_yolov8s-seg.pt" \
354
+ "YOLOv8s Person Seg"
355
+
356
+ dl "$MIRROR_REPO/detection/sam_vit_l_0b3195.pth" \
357
+ "$COMFY_DIR/models/sams/sam_vit_l_0b3195.pth" \
358
+ "SAM ViT-L"
359
+
360
+ # InsightFace - from mirror
361
+ echo -e "${CYAN}═══ InsightFace ═══${NC}"
362
+
363
+ for model in 1k3d68.onnx 2d106det.onnx det_10g.onnx genderage.onnx w600k_r50.onnx; do
364
+ dl "$MIRROR_REPO/insightface/buffalo_l/$model" \
365
+ "$COMFY_DIR/models/insightface/models/buffalo_l/$model" \
366
+ "Buffalo_L $model"
367
+ done
368
+
369
+ # Swappers - from mirror
370
+ echo -e "${CYAN}═══ Swappers ═══${NC}"
371
+
372
+ dl "$MIRROR_REPO/swappers/reswapper_128.onnx" \
373
+ "$COMFY_DIR/models/reswapper/reswapper_128.onnx" \
374
+ "ReSwapper 128"
375
+
376
+ dl "$MIRROR_REPO/swappers/reswapper_256.onnx" \
377
+ "$COMFY_DIR/models/reswapper/reswapper_256.onnx" \
378
+ "ReSwapper 256"
379
+
380
+ dl "$MIRROR_REPO/swappers/hyperswap_1a_256.onnx" \
381
+ "$COMFY_DIR/models/hyperswap/hyperswap_1a_256.onnx" \
382
+ "HyperSwap 1A"
383
+
384
+ dl "$MIRROR_REPO/swappers/hyperswap_1b_256.onnx" \
385
+ "$COMFY_DIR/models/hyperswap/hyperswap_1b_256.onnx" \
386
+ "HyperSwap 1B"
387
+
388
+ dl "$MIRROR_REPO/swappers/hyperswap_1c_256.onnx" \
389
+ "$COMFY_DIR/models/hyperswap/hyperswap_1c_256.onnx" \
390
+ "HyperSwap 1C"
391
+
392
+ # ═══════════════════════════════════════════════════════════════════════════════
393
+ # STEP 7: UPSCALE & POST-PROCESSING
394
+ # ═══════════════════════════════════════════════════════════════════════════════
395
+ echo -e "
396
+ ${YELLOW}[7/8] Downloading Upscale & Post-Processing Models...${NC}"
397
+
398
+ echo -e "${CYAN}═══ Upscalers ═══${NC}"
399
+
400
+ dl "$MIRROR_REPO/upscalers/4x_NMKD-Siax_200k.pth" \
401
+ "$COMFY_DIR/models/upscale_models/4x_NMKD-Siax_200k.pth" \
402
+ "4x NMKD-Siax"
403
+
404
+ dl "$MIRROR_REPO/upscalers/4x-UltraSharp.pth" \
405
+ "$COMFY_DIR/models/upscale_models/4x-UltraSharp.pth" \
406
+ "4x UltraSharp"
407
+
408
+ dl "$MIRROR_REPO/upscalers/RealESRGAN_x4.pth" \
409
+ "$COMFY_DIR/models/upscale_models/RealESRGAN_x4.pth" \
410
+ "RealESRGAN x4"
411
+
412
+ echo -e "${CYAN}═══ IP-Adapter ═══${NC}"
413
+
414
+ dl "$MIRROR_REPO/ipadapter/ip-adapter-plus_sdxl_vit-h.safetensors" \
415
+ "$COMFY_DIR/models/ipadapter/ip-adapter-plus_sdxl_vit-h.safetensors" \
416
+ "IP-Adapter Plus SDXL"
417
+
418
+ dl "$MIRROR_REPO/ipadapter/ip-adapter-plus-face_sdxl_vit-h.safetensors" \
419
+ "$COMFY_DIR/models/ipadapter/ip-adapter-plus-face_sdxl_vit-h.safetensors" \
420
+ "IP-Adapter Plus Face"
421
+
422
+ echo -e "${CYAN}═══ CLIP Vision ═══${NC}"
423
+
424
+ dl "$MIRROR_REPO/clip/CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" \
425
+ "$COMFY_DIR/models/clip_vision/CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" \
426
+ "CLIP ViT-H-14"
427
+
428
+ echo -e "${CYAN}═══ ControlNet ═══${NC}"
429
+
430
+ dl "$MIRROR_REPO/controlnet/flux-depth-controlnet-v3.safetensors" \
431
+ "$COMFY_DIR/models/controlnet/flux-depth-controlnet-v3.safetensors" \
432
+ "FLUX Depth ControlNet v3"
433
+
434
+ # ═══════════════════════════════════════════════════════════════════════════════
435
+ # STEP 8: WORKFLOW
436
+ # ═══════════════════════════════════════════════════════════════════════════════
437
+ echo -e "
438
+ ${YELLOW}[8/8] Installing Workflow...${NC}"
439
+ cat > "$COMFY_DIR/user/default/workflows/Flux_Ultimate_Nudify_v0.15.json" << 'WORKFLOW_EOF'
440
+ {"id":"flux-ultimate-nudify","revision":1,"last_node_id":700,"last_link_id":700,"nodes":[{"id":1,"type":"LoadImage","pos":[-400,300],"size":[315,314],"flags":{"pinned":true},"order":0,"mode":0,"outputs":[{"name":"IMAGE","type":"IMAGE","links":[1],"slot_index":0},{"name":"MASK","type":"MASK","links":null}],"properties":{"Node name for S&R":"LoadImage"},"widgets_values":["input.png","image"],"color":"#223","bgcolor":"#335"},{"id":10,"type":"Note","pos":[-400,50],"size":[315,200],"flags":{},"order":1,"mode":0,"properties":{},"widgets_values":["FLUX ULTIMATE NUDIFY
441
+ ━━━━━━━━━━━━━━━━━━━━━━━━━
442
+
443
+ 3-Stage Pipeline:
444
+ β€’ Stage 1: Clothes Removal
445
+ β€’ Stage 2: Anatomy Enhancement
446
+ β€’ Stage 3: Detail Refinement
447
+
448
+ + Face Restore + Upscale
449
+
450
+ Just upload image and Queue!"],"color":"#232","bgcolor":"#353"},{"id":20,"type":"PrimitiveNode","pos":[-400,660],"size":[210,82],"flags":{},"order":2,"mode":0,"outputs":[{"name":"INT","type":"INT","links":[2,3,4],"slot_index":0}],"properties":{},"widgets_values":[42,"randomize"],"title":"🎲 Global Seed"},{"id":101,"type":"UNETLoader","pos":[50,50],"size":[315,82],"flags":{},"order":3,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[101],"slot_index":0}],"properties":{"Node name for S&R":"UNETLoader"},"widgets_values":["flux1-kontext-dev.safetensors","fp8_e4m3fn"],"color":"#234","bgcolor":"#345"},{"id":102,"type":"LoraLoaderModelOnly","pos":[50,180],"size":[315,82],"flags":{},"order":4,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":101}],"outputs":[{"name":"MODEL","type":"MODEL","links":[102],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["clothes_remover_v0.safetensors",1.0],"color":"#234","bgcolor":"#345"},{"id":103,"type":"VAELoader","pos":[50,310],"size":[315,58],"flags":{},"order":5,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[103,113],"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["ae.safetensors"],"color":"#234","bgcolor":"#345"},{"id":104,"type":"DualCLIPLoader","pos":[50,420],"size":[315,106],"flags":{},"order":6,"mode":0,"outputs":[{"name":"CLIP","type":"CLIP","links":[104],"slot_index":0}],"properties":{"Node name for S&R":"DualCLIPLoader"},"widgets_values":["clip_l.safetensors","t5xxl_fp8_e4m3fn.safetensors","flux"],"color":"#234","bgcolor":"#345"},{"id":105,"type":"CLIPTextEncode","pos":[50,580],"size":[315,120],"flags":{},"order":7,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":104}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[105],"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["remove all clothes, completely nude, naked body, realistic skin texture, natural lighting, high detail photograph"],"title":"Stage 1: Remove Clothes","color":"#232","bgcolor":"#353"},{"id":106,"type":"FluxKontextImageEncode","pos":[420,50],"size":[250,80],"flags":{},"order":8,"mode":0,"inputs":[{"name":"vae","type":"VAE","link":103},{"name":"image","type":"IMAGE","link":1}],"outputs":[{"name":"LATENT","type":"LATENT","links":[106],"slot_index":0}],"properties":{"Node name for S&R":"FluxKontextImageEncode"},"widgets_values":[2],"color":"#234","bgcolor":"#345"},{"id":107,"type":"KSampler","pos":[420,180],"size":[300,262],"flags":{},"order":9,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":102},{"name":"positive","type":"CONDITIONING","link":105},{"name":"negative","type":"CONDITIONING","link":null},{"name":"latent_image","type":"LATENT","link":106},{"name":"seed","type":"INT","link":2,"widget":{"name":"seed"}}],"outputs":[{"name":"LATENT","type":"LATENT","links":[107],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[42,"randomize",28,3.5,"euler","simple",0.85],"color":"#234","bgcolor":"#345"},{"id":108,"type":"VAEDecode","pos":[420,500],"size":[200,46],"flags":{},"order":10,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":107},{"name":"vae","type":"VAE","link":113}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[150],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"},"color":"#234","bgcolor":"#345"},{"id":201,"type":"CheckpointLoaderSimple","pos":[800,50],"size":[315,98],"flags":{},"order":11,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[201],"slot_index":0},{"name":"CLIP","type":"CLIP","links":[204],"slot_index":1},{"name":"VAE","type":"VAE","links":[205],"slot_index":2}],"properties":{"Node name for S&R":"CheckpointLoaderSimple"},"widgets_values":["fluxed-up-7.1-fp16.safetensors"],"color":"#423","bgcolor":"#534"},{"id":202,"type":"LoraLoaderModelOnly","pos":[800,200],"size":[315,82],"flags":{},"order":12,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":201}],"outputs":[{"name":"MODEL","type":"MODEL","links":[202],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux1dev_nudity_female_v2.safetensors",0.45],"color":"#423","bgcolor":"#534"},{"id":203,"type":"LoraLoaderModelOnly","pos":[800,330],"size":[315,82],"flags":{},"order":13,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":202}],"outputs":[{"name":"MODEL","type":"MODEL","links":[203],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux1dev_anatomy_female.safetensors",0.35],"color":"#423","bgcolor":"#534"},{"id":2031,"type":"LoraLoaderModelOnly","pos":[800,460],"size":[315,82],"flags":{},"order":14,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":203}],"outputs":[{"name":"MODEL","type":"MODEL","links":[2031],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux1dev_nipple_default.safetensors",0.3],"color":"#423","bgcolor":"#534"},{"id":204,"type":"CLIPTextEncode","pos":[800,590],"size":[315,120],"flags":{},"order":15,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":204}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[207],"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["enhance female anatomy, detailed realistic breasts, natural nipples, detailed vagina, realistic skin texture, natural body proportions, professional photograph, 8k uhd"],"title":"Stage 2: Anatomy","color":"#322","bgcolor":"#533"},{"id":205,"type":"VAEEncode","pos":[1170,50],"size":[200,46],"flags":{},"order":16,"mode":0,"inputs":[{"name":"pixels","type":"IMAGE","link":150},{"name":"vae","type":"VAE","link":205}],"outputs":[{"name":"LATENT","type":"LATENT","links":[208],"slot_index":0}],"properties":{"Node name for S&R":"VAEEncode"},"color":"#423","bgcolor":"#534"},{"id":206,"type":"KSampler","pos":[1170,150],"size":[300,262],"flags":{},"order":17,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":2031},{"name":"positive","type":"CONDITIONING","link":207},{"name":"negative","type":"CONDITIONING","link":null},{"name":"latent_image","type":"LATENT","link":208},{"name":"seed","type":"INT","link":3,"widget":{"name":"seed"}}],"outputs":[{"name":"LATENT","type":"LATENT","links":[209],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[42,"randomize",32,4.0,"euler","simple",0.55],"color":"#423","bgcolor":"#534"},{"id":207,"type":"VAEDecode","pos":[1170,470],"size":[200,46],"flags":{},"order":18,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":209},{"name":"vae","type":"VAE","link":205}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[250],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"},"color":"#423","bgcolor":"#534"},{"id":301,"type":"UNETLoader","pos":[1550,50],"size":[315,82],"flags":{},"order":19,"mode":0,"outputs":[{"name":"MODEL","type":"MODEL","links":[301],"slot_index":0}],"properties":{"Node name for S&R":"UNETLoader"},"widgets_values":["flux-2-klein-base-9b-fp8.safetensors","fp8_e4m3fn"],"color":"#243","bgcolor":"#354"},{"id":302,"type":"CLIPLoader","pos":[1550,180],"size":[315,82],"flags":{},"order":20,"mode":0,"outputs":[{"name":"CLIP","type":"CLIP","links":[302],"slot_index":0}],"properties":{"Node name for S&R":"CLIPLoader"},"widgets_values":["qwen_3_8b_fp8mixed.safetensors","flux2"],"color":"#243","bgcolor":"#354"},{"id":303,"type":"VAELoader","pos":[1550,310],"size":[315,58],"flags":{},"order":21,"mode":0,"outputs":[{"name":"VAE","type":"VAE","links":[303],"slot_index":0}],"properties":{"Node name for S&R":"VAELoader"},"widgets_values":["flux2-vae.safetensors"],"color":"#243","bgcolor":"#354"},{"id":304,"type":"LoraLoaderModelOnly","pos":[1920,50],"size":[280,82],"flags":{},"order":22,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":301}],"outputs":[{"name":"MODEL","type":"MODEL","links":[304],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux2klein_nsfw.safetensors",0.35],"color":"#243","bgcolor":"#354"},{"id":305,"type":"LoraLoaderModelOnly","pos":[1920,180],"size":[280,82],"flags":{},"order":23,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":304}],"outputs":[{"name":"MODEL","type":"MODEL","links":[305],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux2klein_nipple.safetensors",0.3],"color":"#243","bgcolor":"#354"},{"id":306,"type":"LoraLoaderModelOnly","pos":[1920,310],"size":[280,82],"flags":{},"order":24,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":305}],"outputs":[{"name":"MODEL","type":"MODEL","links":[306],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux2klein_pussy.safetensors",0.35],"color":"#243","bgcolor":"#354"},{"id":3061,"type":"LoraLoaderModelOnly","pos":[1920,440],"size":[280,82],"flags":{},"order":25,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":306}],"outputs":[{"name":"MODEL","type":"MODEL","links":[3061],"slot_index":0}],"properties":{"Node name for S&R":"LoraLoaderModelOnly"},"widgets_values":["flux2klein_body_version_a.safetensors",0.25],"color":"#243","bgcolor":"#354"},{"id":307,"type":"CLIPTextEncode","pos":[1550,420],"size":[315,120],"flags":{},"order":26,"mode":0,"inputs":[{"name":"clip","type":"CLIP","link":302}],"outputs":[{"name":"CONDITIONING","type":"CONDITIONING","links":[307],"slot_index":0}],"properties":{"Node name for S&R":"CLIPTextEncode"},"widgets_values":["ultra detailed skin texture, perfect realistic anatomy, detailed nipples, detailed vagina, natural lighting, sharp focus, professional photograph, 8k uhd, masterpiece quality"],"title":"Stage 3: Detail Refine","color":"#232","bgcolor":"#353"},{"id":308,"type":"VAEEncode","pos":[2250,50],"size":[200,46],"flags":{},"order":27,"mode":0,"inputs":[{"name":"pixels","type":"IMAGE","link":250},{"name":"vae","type":"VAE","link":303}],"outputs":[{"name":"LATENT","type":"LATENT","links":[308],"slot_index":0}],"properties":{"Node name for S&R":"VAEEncode"},"color":"#243","bgcolor":"#354"},{"id":309,"type":"KSampler","pos":[2250,150],"size":[300,262],"flags":{},"order":28,"mode":0,"inputs":[{"name":"model","type":"MODEL","link":3061},{"name":"positive","type":"CONDITIONING","link":307},{"name":"negative","type":"CONDITIONING","link":null},{"name":"latent_image","type":"LATENT","link":308},{"name":"seed","type":"INT","link":4,"widget":{"name":"seed"}}],"outputs":[{"name":"LATENT","type":"LATENT","links":[309],"slot_index":0}],"properties":{"Node name for S&R":"KSampler"},"widgets_values":[42,"randomize",36,4.0,"euler","simple",0.45],"color":"#243","bgcolor":"#354"},{"id":310,"type":"VAEDecode","pos":[2250,470],"size":[200,46],"flags":{},"order":29,"mode":0,"inputs":[{"name":"samples","type":"LATENT","link":309},{"name":"vae","type":"VAE","link":303}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[310],"slot_index":0}],"properties":{"Node name for S&R":"VAEDecode"},"color":"#243","bgcolor":"#354"},{"id":401,"type":"FaceDetailer","pos":[2600,50],"size":[340,780],"flags":{},"order":30,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":310},{"name":"model","type":"MODEL","link":3061},{"name":"clip","type":"CLIP","link":302},{"name":"vae","type":"VAE","link":303},{"name":"positive","type":"CONDITIONING","link":307},{"name":"negative","type":"CONDITIONING","link":null},{"name":"bbox_detector","type":"BBOX_DETECTOR","link":401},{"name":"sam_model_opt","type":"SAM_MODEL","link":402},{"name":"segm_detector_opt","type":"SEGM_DETECTOR","link":null},{"name":"detailer_hook","type":"DETAILER_HOOK","link":null},{"name":"scheduler_func_opt","type":"SCHEDULER_FUNC","link":null}],"outputs":[{"name":"image","type":"IMAGE","links":[411],"slot_index":0},{"name":"cropped_refined","type":"IMAGE","links":null},{"name":"cropped_enhanced_alpha","type":"IMAGE","links":null},{"name":"mask","type":"MASK","links":null},{"name":"detailer_pipe","type":"DETAILER_PIPE","links":null},{"name":"cnet_images","type":"IMAGE","links":null}],"properties":{"Node name for S&R":"FaceDetailer"},"widgets_values":[1024,true,1024,42,"randomize",25,4.0,"euler","simple",0.5,5,true,true,0.5,10,3.0,"center-1",0,0.93,0,0.7,"False",10,false,1.0,false,0.0,1.0],"color":"#253","bgcolor":"#364"},{"id":410,"type":"UltralyticsDetectorProvider","pos":[2600,880],"size":[260,78],"flags":{},"order":31,"mode":0,"outputs":[{"name":"BBOX_DETECTOR","type":"BBOX_DETECTOR","links":[401],"slot_index":0}],"properties":{"Node name for S&R":"UltralyticsDetectorProvider"},"widgets_values":["face_yolov8m.pt"],"color":"#253","bgcolor":"#364"},{"id":411,"type":"SAMLoader","pos":[2600,1010],"size":[260,82],"flags":{},"order":32,"mode":0,"outputs":[{"name":"SAM_MODEL","type":"SAM_MODEL","links":[402],"slot_index":0}],"properties":{"Node name for S&R":"SAMLoader"},"widgets_values":["sam_vit_l_0b3195.pth","AUTO"],"color":"#253","bgcolor":"#364"},{"id":501,"type":"UpscaleModelLoader","pos":[3000,50],"size":[315,58],"flags":{},"order":33,"mode":0,"outputs":[{"name":"UPSCALE_MODEL","type":"UPSCALE_MODEL","links":[501],"slot_index":0}],"properties":{"Node name for S&R":"UpscaleModelLoader"},"widgets_values":["4x_NMKD-Siax_200k.pth"],"color":"#352","bgcolor":"#463"},{"id":502,"type":"ImageUpscaleWithModel","pos":[3000,160],"size":[260,46],"flags":{},"order":34,"mode":0,"inputs":[{"name":"upscale_model","type":"UPSCALE_MODEL","link":501},{"name":"image","type":"IMAGE","link":411}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[502],"slot_index":0}],"properties":{"Node name for S&R":"ImageUpscaleWithModel"},"color":"#352","bgcolor":"#463"},{"id":503,"type":"ImageScaleToTotalPixels","pos":[3000,260],"size":[315,82],"flags":{},"order":35,"mode":0,"inputs":[{"name":"image","type":"IMAGE","link":502}],"outputs":[{"name":"IMAGE","type":"IMAGE","links":[503],"slot_index":0}],"properties":{"Node name for S&R":"ImageScaleToTotalPixels"},"widgets_values":["lanczos",8.0],"color":"#352","bgcolor":"#463"},{"id":601,"type":"SaveImage","pos":[3000,400],"size":[400,450],"flags":{"pinned":true},"order":36,"mode":0,"inputs":[{"name":"images","type":"IMAGE","link":503}],"properties":{"Node name for S&R":"SaveImage"},"widgets_values":["Nudify_Final"],"color":"#444","bgcolor":"#666"}],"links":[[1,1,0,106,1,"IMAGE"],[2,20,0,107,4,"INT"],[3,20,0,206,4,"INT"],[4,20,0,309,4,"INT"],[101,101,0,102,0,"MODEL"],[102,102,0,107,0,"MODEL"],[103,103,0,106,0,"VAE"],[113,103,0,108,1,"VAE"],[104,104,0,105,0,"CLIP"],[105,105,0,107,1,"CONDITIONING"],[106,106,0,107,3,"LATENT"],[107,107,0,108,0,"LATENT"],[150,108,0,205,0,"IMAGE"],[201,201,0,202,0,"MODEL"],[202,202,0,203,0,"MODEL"],[203,203,0,2031,0,"MODEL"],[2031,2031,0,206,0,"MODEL"],[204,201,1,204,0,"CLIP"],[205,201,2,205,1,"VAE"],[207,204,0,206,1,"CONDITIONING"],[208,205,0,206,3,"LATENT"],[209,206,0,207,0,"LATENT"],[250,207,0,308,0,"IMAGE"],[301,301,0,304,0,"MODEL"],[302,302,0,307,0,"CLIP"],[303,303,0,308,1,"VAE"],[304,304,0,305,0,"MODEL"],[305,305,0,306,0,"MODEL"],[306,306,0,3061,0,"MODEL"],[3061,3061,0,309,0,"MODEL"],[307,307,0,309,1,"CONDITIONING"],[308,308,0,309,3,"LATENT"],[309,309,0,310,0,"LATENT"],[310,310,0,401,0,"IMAGE"],[401,410,0,401,6,"BBOX_DETECTOR"],[402,411,0,401,7,"SAM_MODEL"],[411,401,0,502,1,"IMAGE"],[501,501,0,502,0,"UPSCALE_MODEL"],[502,502,0,503,0,"IMAGE"],[503,503,0,601,0,"IMAGE"]],"groups":[{"id":1,"title":"πŸ“₯ INPUT","bounding":[-450,0,400,800],"color":"#2a3a4a","font_size":24},{"id":2,"title":"πŸ”΅ STAGE 1: CLOTHES REMOVAL","bounding":[0,0,750,600],"color":"#3a5fcd","font_size":22},{"id":3,"title":"πŸ”΄ STAGE 2: ANATOMY","bounding":[750,0,750,600],"color":"#cd3a5f","font_size":22},{"id":4,"title":"🟒 STAGE 3: DETAIL","bounding":[1500,0,1050,600],"color":"#5fcd3a","font_size":22},{"id":5,"title":"πŸ’œ FACE DETAILER","bounding":[2550,0,400,1150],"color":"#5f3acd","font_size":22},{"id":6,"title":"⬆️ UPSCALE + OUTPUT","bounding":[2950,0,500,900],"color":"#888888","font_size":22}],"config":{},"extra":{"ds":{"scale":0.4,"offset":[500,200]}},"version":0.4}
451
+ WORKFLOW_EOF
452
+
453
+ echo -e "${GREEN}βœ“ Workflow installed${NC}"
454
+
455
+ # ═══════════════════════════════════════════════════════════════════════════════
456
+ # DONE
457
+ # ═══════════════════════════════════════════════════════════════════════════════
458
+ echo -e "
459
+ ${GREEN}═══════════════════════════════════════════════════════════════════════════════${NC}"
460
+ echo -e "${GREEN} βœ“ FLUX Ultimate Nudify v0.15 - Installation Complete!${NC}"
461
+ echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════════════${NC}"
462
+
463
+ echo -e "
464
+ ${CYAN}To start ComfyUI:${NC}"
465
+ echo " cd $COMFY_DIR && python main.py --listen 0.0.0.0 --port 8188"
466
+
467
+ echo -e "
468
+ ${CYAN}Workflow location:${NC}"
469
+ echo " $COMFY_DIR/user/default/workflows/Flux_Ultimate_Nudify_v0.15.json"
470
+ echo ""