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

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

Browse files
installers/nudify/install_flux_ultimate_nudify_v0.14.sh ADDED
@@ -0,0 +1,447 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # ═══════════════════════════════════════════════════════════════════════════════
3
+ # FLUX Ultimate Nudify - Installation Script v0.14
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='\033[0;31m'
17
+ GREEN='\033[0;32m'
18
+ YELLOW='\033[1;33m'
19
+ BLUE='\033[0;34m'
20
+ MAGENTA='\033[0;35m'
21
+ CYAN='\033[0;36m'
22
+ NC='\033[0m'
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.14${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 "\n${YELLOW}[1/8] Verifying ComfyUI Installation...${NC}"
128
+
129
+ if [ ! -d "$COMFY_DIR" ]; then
130
+ echo -e "${RED}Error: ComfyUI not found at $COMFY_DIR${NC}"
131
+ exit 1
132
+ fi
133
+
134
+ echo -e "${GREEN}βœ“ ComfyUI found at $COMFY_DIR${NC}"
135
+
136
+ # ═══════════════════════════════════════════════════════════════════════════════
137
+ # STEP 2: CREATE DIRECTORIES
138
+ # ═══════════════════════════════════════════════════════════════════════════════
139
+ echo -e "\n${YELLOW}[2/8] Creating Directory Structure...${NC}"
140
+
141
+ dirs=(
142
+ "models/checkpoints"
143
+ "models/unet"
144
+ "models/diffusion_models"
145
+ "models/vae"
146
+ "models/clip"
147
+ "models/clip/t5"
148
+ "models/text_encoders"
149
+ "models/loras"
150
+ "models/upscale_models"
151
+ "models/ipadapter"
152
+ "models/clip_vision"
153
+ "models/controlnet"
154
+ "models/facerestore_models"
155
+ "models/facedetection"
156
+ "models/insightface/models/buffalo_l"
157
+ "models/ultralytics/bbox"
158
+ "models/ultralytics/segm"
159
+ "models/sams"
160
+ "models/reswapper"
161
+ "models/hyperswap"
162
+ "user/default/workflows"
163
+ )
164
+
165
+ for dir in "${dirs[@]}"; do
166
+ mkdir -p "$COMFY_DIR/$dir"
167
+ done
168
+
169
+ echo -e "${GREEN}βœ“ Directories created${NC}"
170
+
171
+ # ═══════════════════════════════════════════════════════════════════════════════
172
+ # STEP 3: INSTALL CUSTOM NODES
173
+ # ═══════════════════════════════════════════════════════════════════════════════
174
+ echo -e "\n${YELLOW}[3/8] Installing Custom Nodes...${NC}"
175
+
176
+ cd "$COMFY_DIR/custom_nodes"
177
+
178
+ # Core nodes
179
+ for repo in \
180
+ "https://github.com/ltdrdata/ComfyUI-Manager.git" \
181
+ "https://github.com/rgthree/rgthree-comfy.git" \
182
+ "https://github.com/cubiq/ComfyUI_essentials.git" \
183
+ "https://github.com/ltdrdata/ComfyUI-Impact-Pack.git" \
184
+ "https://github.com/ltdrdata/ComfyUI-Impact-Subpack.git" \
185
+ "https://github.com/Gourieff/ComfyUI-ReActor.git" \
186
+ "https://github.com/cubiq/ComfyUI_IPAdapter_plus.git" \
187
+ "https://github.com/Fannovel16/comfyui_controlnet_aux.git" \
188
+ "https://github.com/ssitu/ComfyUI_UltimateSDUpscale.git" \
189
+ "https://github.com/kijai/ComfyUI-segment-anything-2.git" \
190
+ "https://github.com/kijai/ComfyUI-KJNodes.git" \
191
+ "https://github.com/spacepxl/ComfyUI-Image-Filters.git" \
192
+ "https://github.com/EllangoK/ComfyUI-post-processing-nodes.git" \
193
+ "https://github.com/chrisgoringe/cg-use-everywhere.git" \
194
+ "https://github.com/pythongosssss/ComfyUI-Custom-Scripts.git"
195
+ do
196
+ name=$(basename "$repo" .git)
197
+ if [ ! -d "$name" ]; then
198
+ echo -e "${GREEN}β†’ Installing $name${NC}"
199
+ git clone "$repo" 2>/dev/null || true
200
+ [ -f "$name/requirements.txt" ] && pip install -r "$name/requirements.txt" --break-system-packages 2>/dev/null || true
201
+ else
202
+ echo -e "${GREEN}βœ“ $name already installed${NC}"
203
+ fi
204
+ done
205
+
206
+ # Run Impact Pack install script
207
+ [ -f "ComfyUI-Impact-Pack/install.py" ] && python ComfyUI-Impact-Pack/install.py 2>/dev/null || true
208
+
209
+ echo -e "${GREEN}βœ“ All custom nodes installed${NC}"
210
+
211
+ # ═══════════════════════════════════════════════════════════════════════════════
212
+ # STEP 4: CORE PIPELINE MODELS
213
+ # ═══════════════════════════════════════════════════════════════════════════════
214
+ echo -e "\n${YELLOW}[4/8] Downloading Core Pipeline Models...${NC}"
215
+
216
+ # Stage 1: Kontext
217
+ echo -e "\n${MAGENTA}═══ Stage 1: FLUX.1 Kontext Dev ═══${NC}"
218
+
219
+ dl "https://huggingface.co/black-forest-labs/FLUX.1-Kontext-dev/resolve/main/flux1-kontext-dev.safetensors" \
220
+ "$COMFY_DIR/models/unet/flux1-kontext-dev.safetensors" \
221
+ "FLUX.1 Kontext Dev"
222
+
223
+ dl "https://huggingface.co/msrcam/ComfyUI_Models/resolve/main/loras/kontext/clothes_remover_v0.safetensors" \
224
+ "$COMFY_DIR/models/loras/clothes_remover_v0.safetensors" \
225
+ "Clothes Remover LoRA"
226
+
227
+ # Stage 2: Flux Dev
228
+ echo -e "\n${MAGENTA}═══ Stage 2: FLUX.1 Dev ═══${NC}"
229
+
230
+ dl "$MIRROR_REPO/checkpoints/flux/fluxed-up-7.1-fp16.safetensors" \
231
+ "$COMFY_DIR/models/checkpoints/fluxed-up-7.1-fp16.safetensors" \
232
+ "Fluxed Up 7.1 FP16" \
233
+ "https://civitai.com/api/download/models/2577735?type=Model&format=SafeTensor&size=pruned&fp=fp16"
234
+
235
+ dl "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/clip_l.safetensors" \
236
+ "$COMFY_DIR/models/clip/clip_l.safetensors" \
237
+ "CLIP-L"
238
+
239
+ dl "https://huggingface.co/comfyanonymous/flux_text_encoders/resolve/main/t5xxl_fp8_e4m3fn.safetensors" \
240
+ "$COMFY_DIR/models/clip/t5/t5xxl_fp8_e4m3fn.safetensors" \
241
+ "T5-XXL FP8"
242
+
243
+ # Stage 3: Klein 9B
244
+ echo -e "\n${MAGENTA}═══ Stage 3: FLUX.2 Klein 9B ═══${NC}"
245
+
246
+ dl "https://huggingface.co/black-forest-labs/FLUX.2-klein-base-9b-fp8/resolve/main/flux-2-klein-base-9b-fp8.safetensors" \
247
+ "$COMFY_DIR/models/unet/flux-2-klein-base-9b-fp8.safetensors" \
248
+ "FLUX.2 Klein 9B FP8"
249
+
250
+ dl "https://huggingface.co/Comfy-Org/flux2-klein-9B/resolve/main/split_files/text_encoders/qwen_3_8b_fp8mixed.safetensors" \
251
+ "$COMFY_DIR/models/text_encoders/qwen_3_8b_fp8mixed.safetensors" \
252
+ "Qwen 3 8B FP8"
253
+
254
+ dl "https://huggingface.co/Comfy-Org/flux2-dev/resolve/main/split_files/vae/flux2-vae.safetensors" \
255
+ "$COMFY_DIR/models/vae/flux2-vae.safetensors" \
256
+ "FLUX2 VAE"
257
+
258
+ # Shared VAE
259
+ dl "https://huggingface.co/black-forest-labs/FLUX.1-dev/resolve/main/ae.safetensors" \
260
+ "$COMFY_DIR/models/vae/ae.safetensors" \
261
+ "FLUX.1 VAE"
262
+
263
+ # ═══════════════════════════════════════════════════════════════════════════════
264
+ # STEP 5: LoRAs
265
+ # ═══════════════════════════════════════════════════════════════════════════════
266
+ echo -e "\n${YELLOW}[5/8] Downloading LoRAs...${NC}"
267
+
268
+ # Download from mirror repo (consolidated)
269
+ echo -e "${CYAN}═══ Downloading LoRAs from mirror ═══${NC}"
270
+
271
+ for lora in \
272
+ "flux1dev/flux1dev_nudity_female_v2.safetensors" \
273
+ "flux1dev/flux1dev_anatomy_female.safetensors" \
274
+ "flux1dev/flux1dev_nipple_default.safetensors" \
275
+ "flux1dev/flux1dev_pussy_default.safetensors" \
276
+ "flux2klein/flux2klein_nsfw.safetensors" \
277
+ "flux2klein/flux2klein_nipple.safetensors" \
278
+ "flux2klein/flux2klein_pussy.safetensors" \
279
+ "flux2klein/flux2klein_body_version_a.safetensors"
280
+ do
281
+ name=$(basename "$lora")
282
+ dl "$MIRROR_REPO/loras/$lora" \
283
+ "$COMFY_DIR/models/loras/$name" \
284
+ "$name"
285
+ done
286
+
287
+ # Detail LoRAs - mirror first
288
+ dl "$MIRROR_REPO/loras/add_detail.safetensors" \
289
+ "$COMFY_DIR/models/loras/add_detail.safetensors" \
290
+ "Add Detail LoRA" \
291
+ "https://civitai.com/api/download/models/135867"
292
+
293
+ dl "$MIRROR_REPO/loras/skin_detail.safetensors" \
294
+ "$COMFY_DIR/models/loras/skin_detail.safetensors" \
295
+ "Skin Detail LoRA" \
296
+ "https://civitai.com/api/download/models/87153"
297
+
298
+ # ═══════════════════════════════════════════════════════════════════════════════
299
+ # STEP 6: FACE & DETECTION MODELS
300
+ # ═══════════════════════════════════════════════════════════════════════════════
301
+ echo -e "\n${YELLOW}[6/8] Downloading Face & Detection Models...${NC}"
302
+
303
+ # Face Restore - mirror first
304
+ echo -e "${CYAN}═══ Face Restore ═══${NC}"
305
+
306
+ dl "$MIRROR_REPO/facerestore/codeformer.pth" \
307
+ "$COMFY_DIR/models/facerestore_models/codeformer.pth" \
308
+ "CodeFormer" \
309
+ "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth"
310
+
311
+ dl "$MIRROR_REPO/facerestore/GFPGANv1.4.pth" \
312
+ "$COMFY_DIR/models/facerestore_models/GFPGANv1.4.pth" \
313
+ "GFPGAN v1.4" \
314
+ "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth"
315
+
316
+ dl "$MIRROR_REPO/facerestore/GPEN-BFR-1024.onnx" \
317
+ "$COMFY_DIR/models/facerestore_models/GPEN-BFR-1024.onnx" \
318
+ "GPEN-BFR-1024"
319
+
320
+ dl "$MIRROR_REPO/facerestore/GPEN-BFR-2048.onnx" \
321
+ "$COMFY_DIR/models/facerestore_models/GPEN-BFR-2048.onnx" \
322
+ "GPEN-BFR-2048"
323
+
324
+ # Detection models - from mirror
325
+ echo -e "${CYAN}═══ Detection Models ═══${NC}"
326
+
327
+ dl "$MIRROR_REPO/detection/parsing_parsenet.pth" \
328
+ "$COMFY_DIR/models/facedetection/parsing_parsenet.pth" \
329
+ "Parsing ParseNet"
330
+
331
+ dl "$MIRROR_REPO/detection/detection_Resnet50_Final.pth" \
332
+ "$COMFY_DIR/models/facedetection/detection_Resnet50_Final.pth" \
333
+ "Detection Resnet50"
334
+
335
+ dl "$MIRROR_REPO/detection/face_yolov8m.pt" \
336
+ "$COMFY_DIR/models/ultralytics/bbox/face_yolov8m.pt" \
337
+ "YOLOv8m Face"
338
+
339
+ dl "$MIRROR_REPO/detection/hand_yolov8s.pt" \
340
+ "$COMFY_DIR/models/ultralytics/bbox/hand_yolov8s.pt" \
341
+ "YOLOv8s Hand"
342
+
343
+ dl "$MIRROR_REPO/detection/person_yolov8s-seg.pt" \
344
+ "$COMFY_DIR/models/ultralytics/segm/person_yolov8s-seg.pt" \
345
+ "YOLOv8s Person Seg"
346
+
347
+ dl "$MIRROR_REPO/detection/sam_vit_l_0b3195.pth" \
348
+ "$COMFY_DIR/models/sams/sam_vit_l_0b3195.pth" \
349
+ "SAM ViT-L"
350
+
351
+ # InsightFace - from mirror
352
+ echo -e "${CYAN}═══ InsightFace ═══${NC}"
353
+
354
+ for model in 1k3d68.onnx 2d106det.onnx det_10g.onnx genderage.onnx w600k_r50.onnx; do
355
+ dl "$MIRROR_REPO/insightface/buffalo_l/$model" \
356
+ "$COMFY_DIR/models/insightface/models/buffalo_l/$model" \
357
+ "Buffalo_L $model"
358
+ done
359
+
360
+ # Swappers - from mirror
361
+ echo -e "${CYAN}═══ Swappers ═══${NC}"
362
+
363
+ dl "$MIRROR_REPO/swappers/reswapper_128.onnx" \
364
+ "$COMFY_DIR/models/reswapper/reswapper_128.onnx" \
365
+ "ReSwapper 128"
366
+
367
+ dl "$MIRROR_REPO/swappers/reswapper_256.onnx" \
368
+ "$COMFY_DIR/models/reswapper/reswapper_256.onnx" \
369
+ "ReSwapper 256"
370
+
371
+ dl "$MIRROR_REPO/swappers/hyperswap_1a_256.onnx" \
372
+ "$COMFY_DIR/models/hyperswap/hyperswap_1a_256.onnx" \
373
+ "HyperSwap 1A"
374
+
375
+ dl "$MIRROR_REPO/swappers/hyperswap_1b_256.onnx" \
376
+ "$COMFY_DIR/models/hyperswap/hyperswap_1b_256.onnx" \
377
+ "HyperSwap 1B"
378
+
379
+ dl "$MIRROR_REPO/swappers/hyperswap_1c_256.onnx" \
380
+ "$COMFY_DIR/models/hyperswap/hyperswap_1c_256.onnx" \
381
+ "HyperSwap 1C"
382
+
383
+ # ═══════════════════════════════════════════════════════════════════════════════
384
+ # STEP 7: UPSCALE & POST-PROCESSING
385
+ # ═══════════════════════════════════════════════════════════════════════════════
386
+ echo -e "\n${YELLOW}[7/8] Downloading Upscale & Post-Processing Models...${NC}"
387
+
388
+ echo -e "${CYAN}═══ Upscalers ═══${NC}"
389
+
390
+ dl "$MIRROR_REPO/upscalers/4x_NMKD-Siax_200k.pth" \
391
+ "$COMFY_DIR/models/upscale_models/4x_NMKD-Siax_200k.pth" \
392
+ "4x NMKD-Siax"
393
+
394
+ dl "$MIRROR_REPO/upscalers/4x-UltraSharp.pth" \
395
+ "$COMFY_DIR/models/upscale_models/4x-UltraSharp.pth" \
396
+ "4x UltraSharp"
397
+
398
+ dl "$MIRROR_REPO/upscalers/RealESRGAN_x4.pth" \
399
+ "$COMFY_DIR/models/upscale_models/RealESRGAN_x4.pth" \
400
+ "RealESRGAN x4"
401
+
402
+ echo -e "${CYAN}═══ IP-Adapter ═══${NC}"
403
+
404
+ dl "$MIRROR_REPO/ipadapter/ip-adapter-plus_sdxl_vit-h.safetensors" \
405
+ "$COMFY_DIR/models/ipadapter/ip-adapter-plus_sdxl_vit-h.safetensors" \
406
+ "IP-Adapter Plus SDXL"
407
+
408
+ dl "$MIRROR_REPO/ipadapter/ip-adapter-plus-face_sdxl_vit-h.safetensors" \
409
+ "$COMFY_DIR/models/ipadapter/ip-adapter-plus-face_sdxl_vit-h.safetensors" \
410
+ "IP-Adapter Plus Face"
411
+
412
+ echo -e "${CYAN}═══ CLIP Vision ═══${NC}"
413
+
414
+ dl "$MIRROR_REPO/clip/CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" \
415
+ "$COMFY_DIR/models/clip_vision/CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" \
416
+ "CLIP ViT-H-14"
417
+
418
+ echo -e "${CYAN}═══ ControlNet ═══${NC}"
419
+
420
+ dl "$MIRROR_REPO/controlnet/flux-depth-controlnet-v3.safetensors" \
421
+ "$COMFY_DIR/models/controlnet/flux-depth-controlnet-v3.safetensors" \
422
+ "FLUX Depth ControlNet v3"
423
+
424
+ # ═══════════════════════════════════════════════════════════════════════════════
425
+ # STEP 8: WORKFLOW
426
+ # ═══════════════════════════════════════════════════════════════════════════════
427
+ echo -e "\n${YELLOW}[8/8] Installing Workflow...${NC}"
428
+
429
+ cat > "$COMFY_DIR/user/default/workflows/Flux_Ultimate_Nudify_v0.14.json" << 'WORKFLOW_EOF'
430
+ {"id":"flux-ultimate-nudify-v013","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 v0.14\n━━━━━━━━━━━━━━━━━━━━━━━━━\n\n3-Stage Pipeline:\nβ€’ Stage 1: Clothes Removal\nβ€’ Stage 2: Anatomy Enhancement\nβ€’ Stage 3: Detail Refinement\n\n+ Face Restore + Upscale\n\nJust 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":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":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":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":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"]],"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}
431
+ WORKFLOW_EOF
432
+
433
+ echo -e "${GREEN}βœ“ Workflow installed${NC}"
434
+
435
+ # ═══════════════════════════════════════════════════════════════════════════════
436
+ # DONE
437
+ # ════════════════════���══════════════════════════════════════════════════════════
438
+ echo -e "\n${GREEN}═══════════════════════════════════════════════════════════════════════════════${NC}"
439
+ echo -e "${GREEN} βœ“ FLUX Ultimate Nudify v0.14 - Installation Complete!${NC}"
440
+ echo -e "${GREEN}═══════════════════════════════════════════════════════════════════════════════${NC}"
441
+
442
+ echo -e "\n${CYAN}To start ComfyUI:${NC}"
443
+ echo " cd $COMFY_DIR && python main.py --listen 0.0.0.0 --port 8188"
444
+
445
+ echo -e "\n${CYAN}Workflow location:${NC}"
446
+ echo " $COMFY_DIR/user/default/workflows/Flux_Ultimate_Nudify_v0.14.json"
447
+ echo ""