mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-01-23 20:40:18 +08:00
Compare commits
No commits in common. "main" and "3.39" have entirely different histories.
0
.cache/.cache_directory
Normal file
0
.cache/.cache_directory
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
22568
github-stats-cache.json
Normal file
22568
github-stats-cache.json
Normal file
File diff suppressed because it is too large
Load Diff
12448
github-stats.json
12448
github-stats.json
File diff suppressed because it is too large
Load Diff
@ -44,7 +44,7 @@ import manager_migration
|
||||
from node_package import InstalledNodePackage
|
||||
|
||||
|
||||
version_code = [3, 39, 2]
|
||||
version_code = [3, 39]
|
||||
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||
|
||||
|
||||
@ -1701,11 +1701,6 @@ def write_config():
|
||||
'db_mode': get_config()['db_mode'],
|
||||
}
|
||||
|
||||
# Sanitize all string values to prevent CRLF injection attacks
|
||||
for key, value in config['default'].items():
|
||||
if isinstance(value, str):
|
||||
config['default'][key] = value.replace('\r', '').replace('\n', '').replace('\x00', '')
|
||||
|
||||
directory = os.path.dirname(manager_config_path)
|
||||
if not os.path.exists(directory):
|
||||
os.makedirs(directory)
|
||||
|
||||
@ -997,15 +997,6 @@ async def get_snapshot_list(request):
|
||||
return web.json_response({'items': items}, content_type='application/json')
|
||||
|
||||
|
||||
def get_safe_snapshot_path(target):
|
||||
"""
|
||||
Safely construct a snapshot file path, preventing path traversal attacks.
|
||||
"""
|
||||
if '/' in target or '\\' in target or '..' in target or '\x00' in target:
|
||||
return None
|
||||
return os.path.join(core.manager_snapshot_path, f"{target}.json")
|
||||
|
||||
|
||||
@routes.get("/snapshot/remove")
|
||||
async def remove_snapshot(request):
|
||||
if not is_allowed_security_level('middle'):
|
||||
@ -1014,12 +1005,8 @@ async def remove_snapshot(request):
|
||||
|
||||
try:
|
||||
target = request.rel_url.query["target"]
|
||||
path = get_safe_snapshot_path(target)
|
||||
|
||||
if path is None:
|
||||
logging.error(f"[ComfyUI-Manager] Invalid snapshot target: {target}")
|
||||
return web.Response(text="Invalid snapshot target", status=400)
|
||||
|
||||
path = os.path.join(core.manager_snapshot_path, f"{target}.json")
|
||||
if os.path.exists(path):
|
||||
os.remove(path)
|
||||
|
||||
@ -1036,12 +1023,8 @@ async def restore_snapshot(request):
|
||||
|
||||
try:
|
||||
target = request.rel_url.query["target"]
|
||||
path = get_safe_snapshot_path(target)
|
||||
|
||||
if path is None:
|
||||
logging.error(f"[ComfyUI-Manager] Invalid snapshot target: {target}")
|
||||
return web.Response(text="Invalid snapshot target", status=400)
|
||||
|
||||
path = os.path.join(core.manager_snapshot_path, f"{target}.json")
|
||||
if os.path.exists(path):
|
||||
if not os.path.exists(core.manager_startup_script_path):
|
||||
os.makedirs(core.manager_startup_script_path)
|
||||
|
||||
198
model-list.json
198
model-list.json
@ -5180,204 +5180,6 @@
|
||||
"size": "25.75GB"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "LTX-2 19B Dev FP8",
|
||||
"type": "checkpoint",
|
||||
"base": "LTX-2",
|
||||
"save_path": "checkpoints/LTX-2",
|
||||
"description": "LTX-2 19B Dev FP8 model.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-19b-dev-fp8.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-dev-fp8.safetensors",
|
||||
"size": "27.1GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B Distilled FP8",
|
||||
"type": "checkpoint",
|
||||
"base": "LTX-2",
|
||||
"save_path": "checkpoints/LTX-2",
|
||||
"description": "LTX-2 19B Distilled FP8 model.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-19b-distilled-fp8.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-distilled-fp8.safetensors",
|
||||
"size": "27.1GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B Dev",
|
||||
"type": "checkpoint",
|
||||
"base": "LTX-2",
|
||||
"save_path": "checkpoints/LTX-2",
|
||||
"description": "LTX-2 19B Dev model.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-19b-dev.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-dev.safetensors",
|
||||
"size": "43.3GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B Distilled",
|
||||
"type": "checkpoint",
|
||||
"base": "LTX-2",
|
||||
"save_path": "checkpoints/LTX-2",
|
||||
"description": "LTX-2 19B Distilled model.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-19b-distilled.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-distilled.safetensors",
|
||||
"size": "43.3GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 Spatial Upscaler",
|
||||
"type": "upscale",
|
||||
"base": "upscale",
|
||||
"save_path": "default",
|
||||
"description": "Spatial upscaler model for LTX-2. This model enhances the spatial resolution of generated videos.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-spatial-upscaler-x2-1.0.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-spatial-upscaler-x2-1.0.safetensors",
|
||||
"size": "996MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 Temporal Upscaler",
|
||||
"type": "upscale",
|
||||
"base": "upscale",
|
||||
"save_path": "default",
|
||||
"description": "Temporal upscaler model for LTX-2. This model enhances the temporal resolution of generated videos.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-temporal-upscaler-x2-1.0.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-temporal-upscaler-x2-1.0.safetensors",
|
||||
"size": "262MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B Distilled LoRA",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras",
|
||||
"description": "A LoRA adapter that transforms the standard LTX-2 19B model into a distilled version when loaded.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2",
|
||||
"filename": "ltx-2-19b-distilled-lora-384.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2/resolve/main/ltx-2-19b-distilled-lora-384.safetensors",
|
||||
"size": "7.67GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B IC LoRA - Canny Control",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for canny control on LTX-2 19B IC model. Intended for advanced edge control and guided generation.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Canny-Control",
|
||||
"filename": "ltx-2-19b-ic-lora-canny-control.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Canny-Control/resolve/main/ltx-2-19b-ic-lora-canny-control.safetensors",
|
||||
"size": "654MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B IC LoRA - Depth Control",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for depth control on LTX-2 19B IC model. Adds depth-aware generation guidance.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Depth-Control",
|
||||
"filename": "ltx-2-19b-ic-lora-depth-control.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Depth-Control/resolve/main/ltx-2-19b-ic-lora-depth-control.safetensors",
|
||||
"size": "654MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B IC LoRA - Detailer",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA detailer for LTX-2 19B IC. Improves fine details and sharpness in generated outputs.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Detailer",
|
||||
"filename": "ltx-2-19b-ic-lora-detailer.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Detailer/resolve/main/ltx-2-19b-ic-lora-detailer.safetensors",
|
||||
"size": "2.62GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B IC LoRA - Pose Control",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for pose control on LTX-2 19B IC model. Enables pose-guided image/video generation.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Pose-Control",
|
||||
"filename": "ltx-2-19b-ic-lora-pose-control.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-IC-LoRA-Pose-Control/resolve/main/ltx-2-19b-ic-lora-pose-control.safetensors",
|
||||
"size": "654MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Dolly In",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for dolly-in camera control with LTX-2 19B. Simulates camera moving closer to subject.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-In",
|
||||
"filename": "ltx-2-19b-lora-camera-control-dolly-in.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-In/resolve/main/ltx-2-19b-lora-camera-control-dolly-in.safetensors",
|
||||
"size": "327MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Dolly Left",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for dolly-left camera control with LTX-2 19B. Simulates camera moving left.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Left",
|
||||
"filename": "ltx-2-19b-lora-camera-control-dolly-left.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Left/resolve/main/ltx-2-19b-lora-camera-control-dolly-left.safetensors",
|
||||
"size": "327MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Dolly Out",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for dolly-out camera control with LTX-2 19B. Simulates camera moving away from subject.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Out",
|
||||
"filename": "ltx-2-19b-lora-camera-control-dolly-out.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Out/resolve/main/ltx-2-19b-lora-camera-control-dolly-out.safetensors",
|
||||
"size": "327MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Dolly Right",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for dolly-right camera control with LTX-2 19B. Simulates camera moving right.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Right",
|
||||
"filename": "ltx-2-19b-lora-camera-control-dolly-right.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Dolly-Right/resolve/main/ltx-2-19b-lora-camera-control-dolly-right.safetensors",
|
||||
"size": "327MB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Jib Down",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for jib-down camera control with LTX-2 19B. Simulates vertical camera movement downwards.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Down",
|
||||
"filename": "ltx-2-19b-lora-camera-control-jib-down.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Down/resolve/main/ltx-2-19b-lora-camera-control-jib-down.safetensors",
|
||||
"size": "2.21GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Jib Up",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for jib-up camera control with LTX-2 19B. Simulates vertical camera movement upwards.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Up",
|
||||
"filename": "ltx-2-19b-lora-camera-control-jib-up.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Jib-Up/resolve/main/ltx-2-19b-lora-camera-control-jib-up.safetensors",
|
||||
"size": "2.21GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-2 19B LoRA - Camera Control Static",
|
||||
"type": "lora",
|
||||
"base": "LTX-2",
|
||||
"save_path": "loras/LTX-2",
|
||||
"description": "LoRA for static camera control with LTX-2 19B. Simulates stationary/static camera view.",
|
||||
"reference": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Static",
|
||||
"filename": "ltx-2-19b-lora-camera-control-static.safetensors",
|
||||
"url": "https://huggingface.co/Lightricks/LTX-2-19b-LoRA-Camera-Control-Static/resolve/main/ltx-2-19b-lora-camera-control-static.safetensors",
|
||||
"size": "2.21GB"
|
||||
},
|
||||
{
|
||||
"name": "LTX-Video Spatial Upscaler v0.9.7",
|
||||
"type": "upscale",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,15 +1,5 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "Fossiel",
|
||||
"title": "ComfyUI-MultiGPU-Patched",
|
||||
"reference": "https://github.com/Fossiel/ComfyUI-MultiGPU-Patched",
|
||||
"files": [
|
||||
"https://github.com/Fossiel/ComfyUI-MultiGPU-Patched"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Patched fork of ComfyUI-MultiGPU providing universal .safetensors and GGUF multi-GPU distribution with DisTorch 2.0 engine, model-driven allocation options (bytes/ratio modes), WanVideoWrapper integration, and up to 10% faster GGUF inference. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "synchronicity-labs",
|
||||
"title": "ComfyUI Sync Lipsync Node",
|
||||
|
||||
@ -1,327 +1,5 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "huyl3-cpu",
|
||||
"title": "comfyui_segment_anything_a100 [REMOVED]",
|
||||
"reference": "https://github.com/huyl3-cpu/comfyui_segment_anything_a100",
|
||||
"files": [
|
||||
"https://github.com/huyl3-cpu/comfyui_segment_anything_a100"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Heavily optimized A100 GPU fork of ComfyUI Segment Anything using BF16 precision, VRAM Locking, and Zero-Copy GPU processing for massive batch processing."
|
||||
},
|
||||
{
|
||||
"author": "PauldeLavallaz",
|
||||
"title": "comfyui_morpheus_model_management [REMOVED]",
|
||||
"reference": "https://github.com/PauldeLavallaz/comfyui_morpheus_model_management",
|
||||
"files": [
|
||||
"https://github.com/PauldeLavallaz/comfyui_morpheus_model_management"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodo personalizzato per ComfyUI che consente di sfogliare una libreria locale di immagini di talent con interfaccia gallery, filtri avanzati e output multipli. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "laboratoiresonore",
|
||||
"title": "ComfyUI_PerformanceLab [REMOVED]",
|
||||
"reference": "https://github.com/laboratoiresonore/ComfyUI_PerformanceLab",
|
||||
"files": [
|
||||
"https://github.com/laboratoiresonore/ComfyUI_PerformanceLab"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Make any ComfyUI workflow faster, use less VRAM, or produce better quality - with AI assistance"
|
||||
},
|
||||
{
|
||||
"author": "Linsoo",
|
||||
"title": "ComfyUI-Linsoo-Custom-Nodes [REMOVED]",
|
||||
"reference": "https://github.com/Linsoo/ComfyUI-Linsoo-Custom-Nodes",
|
||||
"files": [
|
||||
"https://github.com/Linsoo/ComfyUI-Linsoo-Custom-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: Linsoo Save Image, Linsoo Load Image (In development.. not working), Linsoo Empty Latent Image, Linsoo Multi Inputs, Linsoo Multi Outputs"
|
||||
},
|
||||
{
|
||||
"author": "PauldeLavallaz",
|
||||
"title": "ComfyUI-concat_images_to_api_gemini [REMOVED]",
|
||||
"reference": "https://github.com/PauldeLavallaz/ComfyUI-concat_images_to_api_gemini",
|
||||
"files": [
|
||||
"https://github.com/PauldeLavallaz/ComfyUI-concat_images_to_api_gemini"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: Concat Images → Gemini (MP only), Concat Two Images (RAW passthrough), Grid Collage AR Cols, ..."
|
||||
},
|
||||
{
|
||||
"author": "aistudynow",
|
||||
"title": "comfyui-wilddragon-nodes [REMOVED]",
|
||||
"reference": "https://github.com/aistudynow/comfyui-wilddragon-nodes",
|
||||
"files": [
|
||||
"https://github.com/aistudynow/comfyui-wilddragon-nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Image Face Crop (2025), Person Selector, Pose Face Filter, Person BBox Tracker, Face Restore & Blend, ...\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "Wladimir Palant",
|
||||
"title": "image-resize-comfyui [REMOVED]",
|
||||
"reference": "https://github.com/ussoewwin/image_resize_comfyui",
|
||||
"files": [
|
||||
"https://github.com/ussoewwin/image_resize_comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced image resizing node for ComfyUI with aspect ratio preservation and mask support"
|
||||
},
|
||||
{
|
||||
"author": "umisetokikaze",
|
||||
"title": "comfyui_mergekit [REMOVED]",
|
||||
"reference": "https://github.com/umisetokikaze/comfyui_mergekit",
|
||||
"files": [
|
||||
"https://github.com/umisetokikaze/comfyui_mergekit"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:DefineSaveName, SetModels, get_skip, LoadLR, LoadTarget, SetTokenizer, Merge, SetLayer, SetModels"
|
||||
},
|
||||
{
|
||||
"author": "LSDJesus",
|
||||
"title": "ComfyUI-Luna-Collection [REMOVED]",
|
||||
"reference": "https://github.com/LSDJesus/ComfyUI-Luna-Collection",
|
||||
"files": [
|
||||
"https://github.com/LSDJesus/ComfyUI-Luna-Collection"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Collection of finetuned and custom nodes for Pyrite and I\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "r3dial",
|
||||
"title": "Redial Discomphy - Discord Integration for ComfyUI [REMOVED]",
|
||||
"reference": "https://github.com/r3dial/redial-discomphy",
|
||||
"files": [
|
||||
"https://github.com/r3dial/redial-discomphy"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI that enables direct posting of images, videos, and messages to Discord channels. This node seamlessly integrates your ComfyUI workflows with Discord communication, allowing you to automatically share your generated content."
|
||||
},
|
||||
{
|
||||
"author": "EricRorich",
|
||||
"title": "ComfyUI-Parametric-Face-Canvas [REMOVED]",
|
||||
"reference": "https://github.com/EricRorich/ComfyUI-Parametric-Face-Canvas",
|
||||
"files": [
|
||||
"https://github.com/EricRorich/ComfyUI-Parametric-Face-Canvas"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Generates a parametric 3D face wireframe and renders it as a 2D image with adjustable facial proportions and camera orientation for use in AI pipelines.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "pixixai",
|
||||
"title": "ComfyUI_Pixix-Tools [UNSAFE/REMOVED]",
|
||||
"reference": "https://github.com/pixixai/ComfyUI_pixixTools",
|
||||
"files": [
|
||||
"https://github.com/pixixai/ComfyUI_pixixTools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Load Text (from folder)\nNOTE: The files in the repo are not organized.[w/The contents of files from arbitrary paths can be read remotely through this node.]"
|
||||
},
|
||||
{
|
||||
"author": "fllywaay",
|
||||
"title": "Comfyui-TextLine-counter [REMOVED]",
|
||||
"reference": "https://github.com/zpengcom/Comfyui-TextLine-counter",
|
||||
"files": [
|
||||
"https://github.com/zpengcom/Comfyui-TextLine-counter"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A simple multi-line text processing tool, such as line count statistics, ignoring blank lines, etc."
|
||||
},
|
||||
{
|
||||
"author": "daveand",
|
||||
"title": "ComfyUI-daveand-utils [REMOVED]",
|
||||
"reference": "https://github.com/daveand/ComfyUI-daveand-utils",
|
||||
"files": [
|
||||
"https://github.com/daveand/ComfyUI-daveand-utils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Utility nodes including ModelConfigSelector for saving checkpoint configurations and managing manual sampler overrides. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "tristanvdb",
|
||||
"title": "ComfyUI-toolset [REMOVED]",
|
||||
"reference": "https://github.com/tristanvdb/ComfyUI-toolset",
|
||||
"files": [
|
||||
"https://github.com/tristanvdb/ComfyUI-toolset"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Human-in-the-loop image selection tool for ComfyUI workflows using a Flask web server, enabling users to pause workflows and interactively select images via a web browser interface."
|
||||
},
|
||||
{
|
||||
"author": "chuchu114514",
|
||||
"title": "comfyui_proportion_solver [REMOVED]",
|
||||
"reference": "https://github.com/chuchu114514/comfyui_proportion_solver",
|
||||
"files": [
|
||||
"https://github.com/chuchu114514/comfyui_proportion_solver"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This plugin includes two core nodes designed to handle proportion optimization tasks of varying complexity"
|
||||
},
|
||||
{
|
||||
"author": "chuchu114514",
|
||||
"title": "comfyui_text_list_stepper [REMOVED]",
|
||||
"reference": "https://github.com/chuchu114514/comfyui_text_list_stepper",
|
||||
"files": [
|
||||
"https://github.com/chuchu114514/comfyui_text_list_stepper"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Used for batch extraction of prompt words."
|
||||
},
|
||||
{
|
||||
"author": "balu112121",
|
||||
"title": "ComfyUI URL Image Loader [REMOVED]",
|
||||
"reference": "https://github.com/balu112121/comfyui-LoadImageFromURL",
|
||||
"files": [
|
||||
"https://github.com/balu112121/comfyui-LoadImageFromURL"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom ComfyUI node for loading images directly from URLs for AI image generation workflows."
|
||||
},
|
||||
{
|
||||
"author": "huyl3-cpu",
|
||||
"title": "ComfyUI_A100_Ultimate_Optimizer [REMOVED]",
|
||||
"reference": "https://github.com/huyl3-cpu/ComfyUI_A100_Ultimate_Optimizer",
|
||||
"files": [
|
||||
"https://github.com/huyl3-cpu/ComfyUI_A100_Ultimate_Optimizer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A100 GPU batch processing and optimization node for ComfyUI. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "BlackVortexAI",
|
||||
"title": "BV Nodes [DEPRECATED]",
|
||||
"reference": "https://github.com/BlackVortexAI/ComfyUI-BVortexNodes",
|
||||
"files": [
|
||||
"https://github.com/BlackVortexAI/ComfyUI-BVortexNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This repository contains a user-defined node for ComfyUI, currently there are nodes for capturing captions. But will be expanded in the future."
|
||||
},
|
||||
{
|
||||
"author": "scott-createplay",
|
||||
"title": "ComfyUI_frontend_tools [REMOVED]",
|
||||
"reference": "https://github.com/scott-createplay/ComfyUI_frontend_tools",
|
||||
"files": [
|
||||
"https://github.com/scott-createplay/ComfyUI_frontend_tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A comprehensive utility suite for ComfyUI that helps maintain clean, organized workflows with node cleaner, layout tools, HUD projection, and wireless connection management.\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "yutrodimitri-ship-it",
|
||||
"title": "ComfyUI-YUTRO-CastingStudio-v2 [REMOVED]",
|
||||
"reference": "https://github.com/yutrodimitri-ship-it/ComfyUI-YUTRO-CastingStudio-v2",
|
||||
"files": [
|
||||
"https://github.com/yutrodimitri-ship-it/ComfyUI-YUTRO-CastingStudio-v2"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A professional modular suite of nodes for ComfyUI designed for virtual casting agencies, professional photographers, and content creators to generate high-quality model portfolios efficiently. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "amamisonlyuser",
|
||||
"title": "MixvtonComfyui [REMOVED]",
|
||||
"reference": "https://github.com/amamisonlyuser/MixvtonComfyui",
|
||||
"files": [
|
||||
"https://github.com/amamisonlyuser/MixvtonComfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: CXH_Leffa_Viton_Load, CXH_Leffa_Viton_Run\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "AhBumm",
|
||||
"title": "ComfyUI_MangaLineExtraction [REMOVED]",
|
||||
"reference": "https://github.com/AhBumm/ComfyUI_MangaLineExtraction-hf",
|
||||
"files": [
|
||||
"https://github.com/AhBumm/ComfyUI_MangaLineExtraction-hf"
|
||||
],
|
||||
"description": "p1atdev/MangaLineExtraction-hf as a node in comfyui",
|
||||
"install_type": "git-clone"
|
||||
},
|
||||
{
|
||||
"author": "danieljanata",
|
||||
"title": "ComfyUI-QwenVL-Override [REMOVED]",
|
||||
"reference": "https://github.com/danieljanata/ComfyUI-QwenVL-Override",
|
||||
"files": [
|
||||
"https://github.com/danieljanata/ComfyUI-QwenVL-Override"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Adds two nodes that reuse upstream ComfyUI-QwenVL presets but add a runtime override that can be wired/unwired without getting stuck."
|
||||
},
|
||||
{
|
||||
"author": "Futureversecom",
|
||||
"title": "ComfyUI-JEN [REMOVED]",
|
||||
"reference": "https://github.com/futureversecom/ComfyUI-JEN",
|
||||
"files": [
|
||||
"https://github.com/futureversecom/ComfyUI-JEN"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Comfy UI custom nodes for JEN music generation powered by Futureverse"
|
||||
},
|
||||
{
|
||||
"author": "TheBill2001",
|
||||
"title": "comfyui-upscale-by-model [REMOVED]",
|
||||
"reference": "https://github.com/TheBill2001/comfyui-upscale-by-model",
|
||||
"files": [
|
||||
"https://github.com/TheBill2001/comfyui-upscale-by-model"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This custom node allow upscaling an image by a factor using a model."
|
||||
},
|
||||
{
|
||||
"author": "XYMikky12138",
|
||||
"title": "ComfyUI-NanoBanana-inpaint [REMOVED]",
|
||||
"reference": "https://github.com/XYMikky12138/ComfyUI-NanoBanana-inpaint",
|
||||
"files": [
|
||||
"https://github.com/XYMikky12138/ComfyUI-NanoBanana-inpaint"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes for API-based inpainting (Gemini, Imagen) with aspect ratio constraints, smart cropping, resize fitting, intelligent paste-back with transparency support. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "Blonicx",
|
||||
"title": "ComfyUI-Rework-X [REMOVED]",
|
||||
"id": "rework-x",
|
||||
"reference": "https://github.com/Blonicx/ComfyUI-X-Rework",
|
||||
"files": [
|
||||
"https://github.com/Blonicx/ComfyUI-X-Rework"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a plugin for ComfyUI that adds new Util Nodes and Nodes for easier image creation and sharing."
|
||||
},
|
||||
{
|
||||
"author": "scott-createplay",
|
||||
"title": "ComfyUI_video_essentials [REMOVED]",
|
||||
"reference": "https://github.com/scott-createplay/ComfyUI_video_essentials",
|
||||
"files": [
|
||||
"https://github.com/scott-createplay/ComfyUI_video_essentials"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Essential video processing nodes for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "thnikk",
|
||||
"title": "comfyui-thnikk-utils [REMOVED]",
|
||||
"reference": "https://github.com/thnikk/comfyui-thnikk-utils",
|
||||
"files": [
|
||||
"https://github.com/thnikk/comfyui-thnikk-utils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes to clean up your workflow."
|
||||
},
|
||||
{
|
||||
"author": "Tr1dae",
|
||||
"title": "LoRA Matcher Nodes for ComfyUI [REMOVED]",
|
||||
"reference": "https://github.com/Tr1dae/ComfyUI-LoraPromptMatcher",
|
||||
"files": [
|
||||
"https://github.com/Tr1dae/ComfyUI-LoraPromptMatcher"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This custom node provides two different approaches to automatically match text prompts with LoRA models using their descriptions."
|
||||
},
|
||||
|
||||
{
|
||||
"author": "jkhayiying",
|
||||
"title": "ImageLoadFromLocalOrUrl Node for ComfyUI [REMOVED]",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -370,13 +370,10 @@ try:
|
||||
pass
|
||||
|
||||
with std_log_lock:
|
||||
try:
|
||||
if self.is_stdout:
|
||||
original_stdout.flush()
|
||||
else:
|
||||
original_stderr.flush()
|
||||
except (OSError, ValueError):
|
||||
pass
|
||||
|
||||
def close(self):
|
||||
self.flush()
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
[project]
|
||||
name = "comfyui-manager"
|
||||
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||
version = "3.39.2"
|
||||
version = "3.39"
|
||||
license = { file = "LICENSE.txt" }
|
||||
dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
|
||||
|
||||
|
||||
167
scanner.py
167
scanner.py
@ -20,7 +20,7 @@ from pathlib import Path
|
||||
from typing import Set, Dict, Optional
|
||||
|
||||
# Scanner version for cache invalidation
|
||||
SCANNER_VERSION = "2.0.13" # Add fallback for dynamic v3 node_id
|
||||
SCANNER_VERSION = "2.0.11" # Multi-layer detection: class existence + display names
|
||||
|
||||
# Cache for extract_nodes and extract_nodes_enhanced results
|
||||
_extract_nodes_cache: Dict[str, Set[str]] = {}
|
||||
@ -552,22 +552,12 @@ def extract_nodes_enhanced(
|
||||
if exists:
|
||||
phase5_nodes.add(node_name)
|
||||
|
||||
# Phase 6: Dict comprehension pattern (NEW in 2.0.12)
|
||||
# Detects: NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
|
||||
# Example: TobiasGlaubach/ComfyUI-TG_PyCode
|
||||
phase6_nodes = _fallback_dict_comprehension(code_text, file_path)
|
||||
|
||||
# Phase 7: Import-based class names for dict comprehension (NEW in 2.0.12)
|
||||
# Detects imported classes that are added to export lists
|
||||
phase7_nodes = _fallback_import_class_names(code_text, file_path)
|
||||
|
||||
# Union all results (FIX: Scanner 2.0.9 bug + Scanner 2.0.10 bug + Scanner 2.0.12 dict comp)
|
||||
# Union all results (FIX: Scanner 2.0.9 bug + Scanner 2.0.10 bug)
|
||||
# 2.0.9: Used early return which missed Phase 3 nodes
|
||||
# 2.0.10: Only checked registrations, missed classes referenced in display names
|
||||
# 2.0.12: Added dict comprehension and import-based class detection
|
||||
all_nodes = phase1_nodes | phase2_nodes | phase3_nodes | phase4_nodes | phase5_nodes | phase6_nodes | phase7_nodes
|
||||
all_nodes = phase1_nodes | phase2_nodes | phase3_nodes | phase4_nodes | phase5_nodes
|
||||
|
||||
# Phase 8: Empty dict detector (logging only, doesn't add nodes)
|
||||
# Phase 6: Empty dict detector (logging only, doesn't add nodes)
|
||||
if not all_nodes:
|
||||
_fallback_empty_dict_detector(code_text, file_path, verbose)
|
||||
|
||||
@ -654,152 +644,6 @@ def _fallback_item_assignment(code_text: str) -> Set[str]:
|
||||
return nodes
|
||||
|
||||
|
||||
def _fallback_dict_comprehension(code_text: str, file_path: Optional[Path] = None) -> Set[str]:
|
||||
"""
|
||||
Detect dict comprehension pattern with __name__ attribute access.
|
||||
|
||||
Pattern:
|
||||
NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
|
||||
NODE_CLASS_MAPPINGS = {c.__name__: c for c in [ClassA, ClassB]}
|
||||
|
||||
This function detects dict comprehension assignments to NODE_CLASS_MAPPINGS
|
||||
and extracts class names from the iterable (list literal or variable reference).
|
||||
|
||||
Returns:
|
||||
Set of class names extracted from the dict comprehension
|
||||
"""
|
||||
try:
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings('ignore', category=SyntaxWarning)
|
||||
parsed = ast.parse(code_text)
|
||||
except:
|
||||
return set()
|
||||
|
||||
nodes = set()
|
||||
export_lists = {} # Track list variables and their contents
|
||||
|
||||
# First pass: collect list assignments (to_export = [...], exports = [...])
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Name):
|
||||
var_name = target.id
|
||||
# Check for list literal
|
||||
if isinstance(node.value, ast.List):
|
||||
class_names = set()
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name):
|
||||
class_names.add(elt.id)
|
||||
export_lists[var_name] = class_names
|
||||
|
||||
# Handle augmented assignment: to_export += [...]
|
||||
elif isinstance(node, ast.AugAssign):
|
||||
if isinstance(node.target, ast.Name) and isinstance(node.op, ast.Add):
|
||||
var_name = node.target.id
|
||||
if isinstance(node.value, ast.List):
|
||||
class_names = set()
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name):
|
||||
class_names.add(elt.id)
|
||||
if var_name in export_lists:
|
||||
export_lists[var_name].update(class_names)
|
||||
else:
|
||||
export_lists[var_name] = class_names
|
||||
|
||||
# Second pass: find NODE_CLASS_MAPPINGS dict comprehension
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Name) and target.id in ['NODE_CLASS_MAPPINGS', 'NODE_CONFIG']:
|
||||
# Check for dict comprehension
|
||||
if isinstance(node.value, ast.DictComp):
|
||||
dictcomp = node.value
|
||||
|
||||
# Check if key is cls.__name__ pattern
|
||||
key = dictcomp.key
|
||||
if isinstance(key, ast.Attribute) and key.attr == '__name__':
|
||||
# Get the iterable from the first generator
|
||||
for generator in dictcomp.generators:
|
||||
iter_node = generator.iter
|
||||
|
||||
# Case 1: Inline list [ClassA, ClassB, ...]
|
||||
if isinstance(iter_node, ast.List):
|
||||
for elt in iter_node.elts:
|
||||
if isinstance(elt, ast.Name):
|
||||
nodes.add(elt.id)
|
||||
|
||||
# Case 2: Variable reference (to_export, exports, etc.)
|
||||
elif isinstance(iter_node, ast.Name):
|
||||
var_name = iter_node.id
|
||||
if var_name in export_lists:
|
||||
nodes.update(export_lists[var_name])
|
||||
|
||||
return nodes
|
||||
|
||||
|
||||
def _fallback_import_class_names(code_text: str, file_path: Optional[Path] = None) -> Set[str]:
|
||||
"""
|
||||
Extract class names from imports that are added to export lists.
|
||||
|
||||
Pattern:
|
||||
from .module import ClassA, ClassB
|
||||
to_export = [ClassA, ClassB]
|
||||
NODE_CLASS_MAPPINGS = {cls.__name__: cls for cls in to_export}
|
||||
|
||||
This is a complementary fallback that works with _fallback_dict_comprehension
|
||||
to resolve import-based node registrations.
|
||||
|
||||
Returns:
|
||||
Set of imported class names that appear in export-like contexts
|
||||
"""
|
||||
try:
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings('ignore', category=SyntaxWarning)
|
||||
parsed = ast.parse(code_text)
|
||||
except:
|
||||
return set()
|
||||
|
||||
# Collect imported names
|
||||
imported_names = set()
|
||||
for node in ast.walk(parsed):
|
||||
if isinstance(node, ast.ImportFrom):
|
||||
for alias in node.names:
|
||||
name = alias.asname if alias.asname else alias.name
|
||||
imported_names.add(name)
|
||||
|
||||
# Check if these names appear in list assignments that feed into NODE_CLASS_MAPPINGS
|
||||
export_candidates = set()
|
||||
has_dict_comp_mapping = False
|
||||
|
||||
for node in ast.walk(parsed):
|
||||
# Check for dict comprehension NODE_CLASS_MAPPINGS
|
||||
if isinstance(node, ast.Assign):
|
||||
for target in node.targets:
|
||||
if isinstance(target, ast.Name) and target.id == 'NODE_CLASS_MAPPINGS':
|
||||
if isinstance(node.value, ast.DictComp):
|
||||
has_dict_comp_mapping = True
|
||||
|
||||
# Collect list contents
|
||||
if isinstance(node, ast.Assign):
|
||||
if isinstance(node.value, ast.List):
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name) and elt.id in imported_names:
|
||||
export_candidates.add(elt.id)
|
||||
|
||||
# Handle augmented assignment
|
||||
elif isinstance(node, ast.AugAssign):
|
||||
if isinstance(node.value, ast.List):
|
||||
for elt in node.value.elts:
|
||||
if isinstance(elt, ast.Name) and elt.id in imported_names:
|
||||
export_candidates.add(elt.id)
|
||||
|
||||
# Only return if there's a dict comprehension mapping
|
||||
if has_dict_comp_mapping:
|
||||
return export_candidates
|
||||
|
||||
return set()
|
||||
|
||||
|
||||
def _extract_repo_name(file_path: Path) -> str:
|
||||
"""
|
||||
Extract repository name from file path.
|
||||
@ -936,9 +780,6 @@ def extract_v3_nodes(code_text):
|
||||
node_id = extract_node_id_from_schema(node)
|
||||
if node_id:
|
||||
nodes.add(node_id)
|
||||
else:
|
||||
# Fallback: use class name when node_id is dynamic/empty
|
||||
nodes.add(node.name)
|
||||
|
||||
return nodes
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user