mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2025-12-15 01:27:05 +08:00
Compare commits
18 Commits
22f5f7b985
...
aa44c22cca
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aa44c22cca | ||
|
|
bba55d4d5a | ||
|
|
87111bd889 | ||
|
|
3661ffd3ab | ||
|
|
d8f111a5e3 | ||
|
|
ae5565ce68 | ||
|
|
e4c370a7d9 | ||
|
|
891005bcd3 | ||
|
|
d3a4a7a0fa | ||
|
|
10211d1a93 | ||
|
|
7f019a932b | ||
|
|
fae909de2f | ||
|
|
5e2ca4fe1a | ||
|
|
975642c9bf | ||
|
|
76fd32f146 | ||
|
|
3ae99bc761 | ||
|
|
1dde3c3ef0 | ||
|
|
457c93cd19 |
@ -14868,6 +14868,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A collection of utility nodes for lora operations in ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "lrzjason",
|
||||
"title": "Comfyui-LatentUtils",
|
||||
"reference": "https://github.com/lrzjason/Comfyui-LatentUtils",
|
||||
"files": [
|
||||
"https://github.com/lrzjason/Comfyui-LatentUtils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom ComfyUI node performing selective latent denoising and detail enhancement using Fourier Transform (FFT) to separate and enhance image frequencies while suppressing noise. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "cozy_comm",
|
||||
"title": "Cozy Communication",
|
||||
@ -19172,16 +19182,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom ComfyUI node using Together AI's Vision models for free image descriptions, image generation, and image-to-image transformation. Features include customizable prompts, advanced parameters, and robust error handling."
|
||||
},
|
||||
{
|
||||
"author": "jeffrey2212",
|
||||
"title": "Pony Character Prompt Picker for ComfyUI",
|
||||
"reference": "https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt",
|
||||
"files": [
|
||||
"https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The Pony Character Prompt Picker node reads an Excel file specified by the user, allows manual selection of a tab, and randomly picks a cell value from a specified column, starting from row 3 to the end. The selected value is output as a string to the next node in the ComfyUI workflow."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-FaceCalloutNode",
|
||||
@ -19192,6 +19192,36 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A collection of custom nodes for ComfyUI that provide advanced face callout, annotation, and compositing effects using OpenCV and PIL. These nodes are designed for image processing workflows that require face detection, annotation, and creative compositing."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-NvidiaCaptioner",
|
||||
"reference": "https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner",
|
||||
"files": [
|
||||
"https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI node for generating rich, detailed captions for images using NVIDIA's vision models. Supports batch processing, multiple captioning styles, and includes built-in caching for efficient workflows."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-Universal-Latent",
|
||||
"reference": "https://github.com/theshubzworld/ComfyUI-Universal-Latent",
|
||||
"files": [
|
||||
"https://github.com/theshubzworld/ComfyUI-Universal-Latent"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Enhanced empty latent node with extended aspect ratio support for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "jeffrey2212",
|
||||
"title": "Pony Character Prompt Picker for ComfyUI",
|
||||
"reference": "https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt",
|
||||
"files": [
|
||||
"https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The Pony Character Prompt Picker node reads an Excel file specified by the user, allows manual selection of a tab, and randomly picks a cell value from a specified column, starting from row 3 to the end. The selected value is output as a string to the next node in the ComfyUI workflow."
|
||||
},
|
||||
{
|
||||
"author": "Jonseed",
|
||||
"title": "ComfyUI-Detail-Daemon",
|
||||
@ -22733,6 +22763,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Calculates the percentage of a mask area compared to the total image size and outputs a boolean based on a defined threshold."
|
||||
},
|
||||
{
|
||||
"author": "a-und-b",
|
||||
"title": "ComfyUI_AB_Wildcard",
|
||||
"reference": "https://github.com/a-und-b/ComfyUI_AB_Wildcard",
|
||||
"files": [
|
||||
"https://github.com/a-und-b/ComfyUI_AB_Wildcard"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple node for advanced wildcard text processing. Supports variables, conditionals, tag aggregation, weighted selection, and deep nesting. Lightweight, fast, zero external dependencies."
|
||||
},
|
||||
{
|
||||
"author": "r3dial",
|
||||
"title": "Redial Discomphy - Discord Integration for ComfyUI",
|
||||
@ -30497,6 +30537,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "An advanced image stitching node for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "RamonGuthrie",
|
||||
"title": "ComfyUI-RBG-SmartSeedVariance",
|
||||
"reference": "https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance",
|
||||
"files": [
|
||||
"https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced seed diversity enhancement for ComfyUI with intelligent noise injection and directional biasing."
|
||||
},
|
||||
{
|
||||
"author": "vrgamegirl19",
|
||||
"title": "VRGameDevGirl Video Enhancement Nodes",
|
||||
@ -36732,6 +36782,16 @@
|
||||
"description": "Enhance first and last frames for smooth video loop generation in ComfyUI. Based on WAN Video workflow.",
|
||||
"tags": ["video", "frame", "loop", "workflow"]
|
||||
},
|
||||
{
|
||||
"author": "princepainter",
|
||||
"title": "Comfyui-PainterAudioLength",
|
||||
"reference": "https://github.com/princepainter/Comfyui-PainterAudioLength",
|
||||
"files": [
|
||||
"https://github.com/princepainter/Comfyui-PainterAudioLength"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A tool for calculating audio duration that takes audio input and outputs the audio length as a floating-point number. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "rafacost",
|
||||
"title": "rafacostComfy",
|
||||
@ -37618,16 +37678,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI nodes for loading images and drawing polygon masks interactively on them"
|
||||
},
|
||||
{
|
||||
"author": "cdanielp",
|
||||
"title": "COMFYUI_PROMPTMODELS",
|
||||
"reference": "https://github.com/cdanielp/COMFYUI_PROMPTMODELS",
|
||||
"files": [
|
||||
"https://github.com/cdanielp/COMFYUI_PROMPTMODELS"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom nodes for ComfyUI by PROMPTMODELS."
|
||||
},
|
||||
{
|
||||
"author": "supElement",
|
||||
"title": "ComfyUI_Element_easy",
|
||||
@ -37845,6 +37895,17 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Professional audio processing and mastering suite for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "jeankassio",
|
||||
"title": "JK AceStep Nodes",
|
||||
"id": "JK-AceStep-Nodes",
|
||||
"reference": "https://github.com/jeankassio/JK-AceStep-Nodes",
|
||||
"files": [
|
||||
"https://github.com/jeankassio/JK-AceStep-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced nodes optimized for ACE-Step audio generation in ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "ameyukisora",
|
||||
"title": "ComfyUI Empty Latent Advanced",
|
||||
@ -37984,6 +38045,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Two simple nodes that help you author sequence-friendly prompts from a single script that contains multiple clips. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "TuonoMindCode",
|
||||
"title": "ComfyUI-Resolution-Suggest-Downscale",
|
||||
"reference": "https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale",
|
||||
"files": [
|
||||
"https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Resolution suggestion and downscale helper node for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "sooxt98",
|
||||
"title": "comfyui_longcat_image",
|
||||
@ -38204,16 +38275,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Essential utility nodes for ComfyUI including prompt queue, batch processing, camera angle control, and resolution selector. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "Zeknes",
|
||||
"title": "Comfyui-LLM-Chat",
|
||||
"reference": "https://github.com/Zeknes/Comfyui-LLM-Chat",
|
||||
"files": [
|
||||
"https://github.com/Zeknes/Comfyui-LLM-Chat"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom ComfyUI node providing unified access to multiple Large Language Models including OpenAI-compatible APIs and local Ollama instances with image support."
|
||||
},
|
||||
{
|
||||
"author": "dandancow874",
|
||||
"title": "ComfyUI-LMStudio-Controller",
|
||||
@ -38296,7 +38357,117 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI custom node for downloading and managing LoRA models directly within the UI."
|
||||
},
|
||||
|
||||
{
|
||||
"author": "aTanguay",
|
||||
"title": "ComfyUI_Detonate",
|
||||
"reference": "https://github.com/aTanguay/ComfyUI_Detonate",
|
||||
"files": [
|
||||
"https://github.com/aTanguay/ComfyUI_Detonate"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Professional compositing nodes for ComfyUI - bringing Nuke and Fusion workflows to AI-powered image generation"
|
||||
},
|
||||
{
|
||||
"author": "akaugun",
|
||||
"title": "comfyui-lora-hook-trigger",
|
||||
"reference": "https://github.com/akaugun/comfyui-lora-hook-trigger",
|
||||
"files": [
|
||||
"https://github.com/akaugun/comfyui-lora-hook-trigger"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A clean and simple ComfyUI custom node that creates a LoRA Hook and automatically finds and loads trigger TXT files placed in a folder named after the LoRA file."
|
||||
},
|
||||
{
|
||||
"author": "tumbowungus",
|
||||
"title": "MultiMaskCouple",
|
||||
"reference": "https://github.com/tumbowungus/MultiMaskCouple",
|
||||
"files": [
|
||||
"https://github.com/tumbowungus/MultiMaskCouple"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI which simplifies the process of masking multiple prompts, making it easier to manage scenes with multiple distinct characters."
|
||||
},
|
||||
{
|
||||
"author": "fudosanit",
|
||||
"title": "ComfyUI-Random-Resolution",
|
||||
"reference": "https://github.com/fudosanit/ComfyUI-Random-Resolution",
|
||||
"files": [
|
||||
"https://github.com/fudosanit/ComfyUI-Random-Resolution"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI. Based on the specified resolution, it randomly selects and outputs one of three patterns: original orientation, swapped width/height, or a square format. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "SuLU-K",
|
||||
"title": "comfyui-easy-sam3-tools",
|
||||
"reference": "https://github.com/SuLU-K/comfyui-easy-sam3-tools",
|
||||
"files": [
|
||||
"https://github.com/SuLU-K/comfyui-easy-sam3-tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom nodes for building SAM3-centric editing pipelines inside ComfyUI, featuring mask merging, bounding box rendering, and DOM-based interactive editing. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "EMkrtchyan",
|
||||
"title": "ComfyUI-NormalsToDepth",
|
||||
"reference": "https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth",
|
||||
"files": [
|
||||
"https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Converts normal maps to depth maps for use in ComfyUI. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "SKFRMSEHF",
|
||||
"title": "SK-ComfyUI-FolderingLoader",
|
||||
"id": "skloader",
|
||||
"reference": "https://github.com/SKFRMSEHF/comfyui_SK_Loader",
|
||||
"files": [
|
||||
"https://github.com/SKFRMSEHF/comfyui_SK_Loader"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unified loader nodes with folder organization support for checkpoints, LoRA, VAE, and diffusion models"
|
||||
},
|
||||
{
|
||||
"author": "dcyd-lun",
|
||||
"title": "ComfyUI_text_diff",
|
||||
"reference": "https://github.com/dcyd-lun/ComfyUI_text_diff",
|
||||
"files": [
|
||||
"https://github.com/dcyd-lun/ComfyUI_text_diff"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Compare two texts with GitHub/GitLab-style diff highlighting in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "darrell-goh",
|
||||
"title": "ComfyUI-NanoBanana_node",
|
||||
"reference": "https://github.com/darrell-goh/ComfyUI-NanoBanana_node",
|
||||
"files": [
|
||||
"https://github.com/darrell-goh/ComfyUI-NanoBanana_node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI that allows you to interact with Nano Banana's Vertex API proxy, providing access to Gemini models with dynamic image inputs."
|
||||
},
|
||||
{
|
||||
"author": "This-is-Uncut",
|
||||
"title": "Custom-Node-ComfyUI-NBP-Uncut",
|
||||
"reference": "https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut",
|
||||
"files": [
|
||||
"https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Node to use NBP with custom API key to improve data privacy control."
|
||||
},
|
||||
{
|
||||
"author": "drawthingsai",
|
||||
"title": "draw-things-comfyui",
|
||||
"reference": "https://github.com/drawthingsai/draw-things-comfyui",
|
||||
"files": [
|
||||
"https://github.com/drawthingsai/draw-things-comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The official Draw Things extension for ComfyUI. Sends image-generation requests to Draw Things over gRPC. Supports Bridge Mode for DT+ cloud and local model execution."
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
@ -238,7 +238,8 @@
|
||||
],
|
||||
"https://github.com/1038lab/ComfyUI-VoxCPMTTS": [
|
||||
[
|
||||
"AILab_VoxCPMTTS"
|
||||
"AILab_VoxCPMTTS",
|
||||
"AILab_VoxCPMTTS_Advanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-VoxCPMTTS"
|
||||
@ -3836,6 +3837,14 @@
|
||||
"title_aux": "FitDiT[official] - High-fidelity Virtual Try-on"
|
||||
}
|
||||
],
|
||||
"https://github.com/Braeden90000/comfyui-load-image-url": [
|
||||
[
|
||||
"LoadImageFileOrURL"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI Load Image URL"
|
||||
}
|
||||
],
|
||||
"https://github.com/Brekel/ComfyUI-Brekel": [
|
||||
[
|
||||
"BrekelAutoPromptGenerator",
|
||||
@ -6232,6 +6241,16 @@
|
||||
"title_aux": "Duanyll Nodepack"
|
||||
}
|
||||
],
|
||||
"https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth": [
|
||||
[
|
||||
"DepthMathCombiner",
|
||||
"FrankotChellappa",
|
||||
"PoissonReconstruction"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NormalsToDepth"
|
||||
}
|
||||
],
|
||||
"https://github.com/Eagle-CN/ComfyUI-Addoor": [
|
||||
[
|
||||
"AD_AnyFileList",
|
||||
@ -7309,8 +7328,11 @@
|
||||
"https://github.com/FeiMao-326/Comfyui-General-API-Node": [
|
||||
[
|
||||
"FeiMao_326_GeneralAPINode",
|
||||
"FeiMao_326_GetListElement",
|
||||
"FeiMao_326_JsonParser",
|
||||
"FeiMao_326_TextBatchReplace",
|
||||
"FeiMao_326_TextIterator",
|
||||
"FeiMao_326_TextSplitByDelimiter",
|
||||
"ShowTextNode",
|
||||
"SimpleTextNode"
|
||||
],
|
||||
@ -10595,10 +10617,18 @@
|
||||
"JAX_EasyPrompt",
|
||||
"JAX_EasyPromptSimple",
|
||||
"JAX_ImageSizeMultiplier",
|
||||
"JAX_KritaCanvas",
|
||||
"JAX_KritaImageLayer",
|
||||
"JAX_KritaMaskLayer",
|
||||
"JAX_KritaOutput",
|
||||
"JAX_KritaPipeIn",
|
||||
"JAX_KritaResizeCanvas",
|
||||
"JAX_KritaSelection",
|
||||
"JAX_KritaSendText",
|
||||
"JAX_KritaStrength",
|
||||
"JAX_SamplerPipeOut"
|
||||
"JAX_KritaStyle",
|
||||
"JAX_Parameter",
|
||||
"JAX_SamplerPipeOut",
|
||||
"JAX_SendImageWebSocket"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Jax-Nodes"
|
||||
@ -13004,6 +13034,19 @@
|
||||
"title_aux": "ComfyUI-Lightx2vWrapper"
|
||||
}
|
||||
],
|
||||
"https://github.com/Moeblack/ComfyUI-SimpleChat": [
|
||||
[
|
||||
"GeminiImageEdit",
|
||||
"GeminiImageGen",
|
||||
"SimpleChatConfig",
|
||||
"SimpleChatImage",
|
||||
"SimpleChatNoASS",
|
||||
"SimpleChatText"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-SimpleChat"
|
||||
}
|
||||
],
|
||||
"https://github.com/MohammadAboulEla/ComfyUI-iTools": [
|
||||
[
|
||||
"iToolsAddOverlay",
|
||||
@ -13941,6 +13984,7 @@
|
||||
],
|
||||
"https://github.com/Nynxz/ComfyUI-NynxzNodes": [
|
||||
[
|
||||
"nynxz.CompareVideo.Options",
|
||||
"nynxz.Create.CompareVideo.Fade",
|
||||
"nynxz.Create.CompareVideo.Wipe",
|
||||
"nynxz.Parse.StringTemplate"
|
||||
@ -14900,6 +14944,14 @@
|
||||
"title_aux": "ComfyUI-RBG-ImageStitchPlus"
|
||||
}
|
||||
],
|
||||
"https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance": [
|
||||
[
|
||||
"RBG_Smart_Seed_Variance"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-RBG-SmartSeedVariance"
|
||||
}
|
||||
],
|
||||
"https://github.com/Randy420Marsh/civitai-api-url-resolver": [
|
||||
[
|
||||
"CivitaiShareToDirectURL"
|
||||
@ -15463,6 +15515,19 @@
|
||||
"title_aux": "ComfyUI SKBundle"
|
||||
}
|
||||
],
|
||||
"https://github.com/SKFRMSEHF/comfyui_SK_Loader": [
|
||||
[
|
||||
"SK_CheckpointLoader",
|
||||
"SK_CheckpointLoaderSimple",
|
||||
"SK_LoraLoader",
|
||||
"SK_UNETLoader",
|
||||
"SK_VAELoader",
|
||||
"SK_unCLIPCheckpointLoader"
|
||||
],
|
||||
{
|
||||
"title_aux": "SK-ComfyUI-FolderingLoader"
|
||||
}
|
||||
],
|
||||
"https://github.com/SLAPaper/ComfyUI-Image-Selector": [
|
||||
[
|
||||
"ImageDuplicator",
|
||||
@ -16279,10 +16344,12 @@
|
||||
"BboxSplit",
|
||||
"Cascade",
|
||||
"ImageFilters",
|
||||
"LMS_VisionController",
|
||||
"Luts",
|
||||
"LutsAdvanced",
|
||||
"RemoveAreaByMask",
|
||||
"RemoveBackground",
|
||||
"RemoveNoise",
|
||||
"SeedGenerator",
|
||||
"Waifu2x"
|
||||
],
|
||||
@ -16655,6 +16722,10 @@
|
||||
"https://github.com/ShootTheSound/comfyUI-Realtime-Lora": [
|
||||
[
|
||||
"ApplyTrainedLora",
|
||||
"MusubiQwenImageEditLoraTrainer",
|
||||
"MusubiQwenImageLoraTrainer",
|
||||
"MusubiWanLoraTrainer",
|
||||
"MusubiZImageLoraTrainer",
|
||||
"RealtimeLoraTrainer",
|
||||
"SD15LoraTrainer",
|
||||
"SDXLLoraTrainer"
|
||||
@ -17701,6 +17772,17 @@
|
||||
"title_aux": "ComfyUI DINO-X Detector Node"
|
||||
}
|
||||
],
|
||||
"https://github.com/SuLU-K/comfyui-easy-sam3-tools": [
|
||||
[
|
||||
"Sam3DrawBBox",
|
||||
"Sam3InteractiveBBoxEditor",
|
||||
"Sam3MaskRangeSelector",
|
||||
"SimpleMultiple"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-easy-sam3-tools"
|
||||
}
|
||||
],
|
||||
"https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": [
|
||||
[
|
||||
"Deflicker",
|
||||
@ -18570,6 +18652,14 @@
|
||||
"title_aux": "ComfyUI-Unprompted"
|
||||
}
|
||||
],
|
||||
"https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut": [
|
||||
[
|
||||
"NanoBananaProNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "Custom-Node-ComfyUI-NBP-Uncut"
|
||||
}
|
||||
],
|
||||
"https://github.com/ThunderBolt4931/comfyui_pixel_forge": [
|
||||
[
|
||||
"ConcatenateBatchHorizontally",
|
||||
@ -18923,6 +19013,14 @@
|
||||
"title_aux": "ComfyUI-MultiClip-Text-Script"
|
||||
}
|
||||
],
|
||||
"https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale": [
|
||||
[
|
||||
"TuonoResolutionSuggestDownscale"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Resolution-Suggest-Downscale"
|
||||
}
|
||||
],
|
||||
"https://github.com/TuriSc/comfyui-text-line-selector": [
|
||||
[
|
||||
"TextLineSelectorNode"
|
||||
@ -20855,6 +20953,14 @@
|
||||
"title_aux": "Save Checkpoint with Metadata"
|
||||
}
|
||||
],
|
||||
"https://github.com/a-und-b/ComfyUI_AB_Wildcard": [
|
||||
[
|
||||
"ABWildcardNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_AB_Wildcard"
|
||||
}
|
||||
],
|
||||
"https://github.com/a-und-b/ComfyUI_Delay": [
|
||||
[
|
||||
"Add Delay"
|
||||
@ -20917,6 +21023,60 @@
|
||||
"title_aux": "ComfyUI-AudioScheduler"
|
||||
}
|
||||
],
|
||||
"https://github.com/aTanguay/ComfyUI_Detonate": [
|
||||
[
|
||||
"DetonateBlur",
|
||||
"DetonateChannelCopy",
|
||||
"DetonateChromaKeyer",
|
||||
"DetonateClamp",
|
||||
"DetonateColorCorrect",
|
||||
"DetonateColorCurves",
|
||||
"DetonateConstant",
|
||||
"DetonateCornerPin",
|
||||
"DetonateCrop",
|
||||
"DetonateCryptomatteExtract",
|
||||
"DetonateDefocus",
|
||||
"DetonateDenoise",
|
||||
"DetonateDilate",
|
||||
"DetonateDisplacementMap",
|
||||
"DetonateEdgeDefringe",
|
||||
"DetonateEdgeDetect",
|
||||
"DetonateErode",
|
||||
"DetonateExposure",
|
||||
"DetonateGlow",
|
||||
"DetonateGrade",
|
||||
"DetonateGrain",
|
||||
"DetonateGridWarp",
|
||||
"DetonateHueSatVal",
|
||||
"DetonateInvert",
|
||||
"DetonateLUT",
|
||||
"DetonateLoadEXR",
|
||||
"DetonateLumaKeyer",
|
||||
"DetonateLumaKeyerSimple",
|
||||
"DetonateMaskFromColor",
|
||||
"DetonateMaskSmoother",
|
||||
"DetonateMatteControl",
|
||||
"DetonateMerge",
|
||||
"DetonateNoise",
|
||||
"DetonatePremultiply",
|
||||
"DetonateRamp",
|
||||
"DetonateRotoBezier",
|
||||
"DetonateRotoBezierFromImage",
|
||||
"DetonateSaturation",
|
||||
"DetonateSeamBlender",
|
||||
"DetonateSharpen",
|
||||
"DetonateShuffle",
|
||||
"DetonateTransform",
|
||||
"DetonateTriMapGenerator",
|
||||
"DetonateUnpremultiply",
|
||||
"DetonateVignette",
|
||||
"DetonateZDefocus",
|
||||
"DetonateZMerge"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Detonate"
|
||||
}
|
||||
],
|
||||
"https://github.com/abdozmantar/ComfyUI-DeepExtract": [
|
||||
[
|
||||
"VocalAndSoundRemoverNode"
|
||||
@ -21780,6 +21940,14 @@
|
||||
"title_aux": "ComfyUI-X-Portrait-Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/akaugun/comfyui-lora-hook-trigger": [
|
||||
[
|
||||
"LoraTriggerWithExample"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-lora-hook-trigger"
|
||||
}
|
||||
],
|
||||
"https://github.com/akawana/ComfyUI-Folded-Prompts": [
|
||||
[
|
||||
"FPFoldedPrompts",
|
||||
@ -22492,6 +22660,7 @@
|
||||
"EdgeWearMaskGenerator",
|
||||
"EmbedAlpha",
|
||||
"EmissionMaskGenerator",
|
||||
"FrankenMapExtractor",
|
||||
"FrequencyRecombine",
|
||||
"FrequencySeparation",
|
||||
"GammaAdjust",
|
||||
@ -22511,6 +22680,7 @@
|
||||
"MultiTextureBlender",
|
||||
"NormalConverter",
|
||||
"NormalFormatAuto",
|
||||
"NormalFormatBruteForce",
|
||||
"NormalFormatValidator",
|
||||
"NormalIntensity",
|
||||
"NormalMapCombiner",
|
||||
@ -22550,6 +22720,8 @@
|
||||
"TranslucencyMapGenerator",
|
||||
"TriplanarProjection",
|
||||
"UVCheckerGenerator",
|
||||
"UpscaleCalculator",
|
||||
"UpscaleToResolution",
|
||||
"WearGenerator"
|
||||
],
|
||||
{
|
||||
@ -25290,25 +25462,6 @@
|
||||
"title_aux": "comfyui-azul-scripts"
|
||||
}
|
||||
],
|
||||
"https://github.com/cdanielp/COMFYUI_PROMPTMODELS": [
|
||||
[
|
||||
"ClearCacheNode",
|
||||
"GetFrameByIndex",
|
||||
"GetLastFrame",
|
||||
"GetNode",
|
||||
"ListCacheNode",
|
||||
"PromptInfo",
|
||||
"PromptModelLoader",
|
||||
"PromptRefiner",
|
||||
"SetNode",
|
||||
"SetNodeNamed",
|
||||
"UnetLoaderGGUF",
|
||||
"UnetLoaderGGUFAdvanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "COMFYUI_PROMPTMODELS"
|
||||
}
|
||||
],
|
||||
"https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": [
|
||||
[
|
||||
"BOPBTL_BlendFaces",
|
||||
@ -27390,6 +27543,7 @@
|
||||
"GeminiImageNode",
|
||||
"GeminiInputFiles",
|
||||
"GeminiNode",
|
||||
"GenerateTracks",
|
||||
"GetImageSize",
|
||||
"GetVideoComponents",
|
||||
"GrowMask",
|
||||
@ -27445,6 +27599,7 @@
|
||||
"KlingDualCharacterVideoEffectNode",
|
||||
"KlingImage2VideoNode",
|
||||
"KlingImageGenerationNode",
|
||||
"KlingImageToVideoWithAudio",
|
||||
"KlingLipSyncAudioToVideoNode",
|
||||
"KlingLipSyncTextToVideoNode",
|
||||
"KlingOmniProEditVideoNode",
|
||||
@ -27456,6 +27611,7 @@
|
||||
"KlingSingleImageVideoEffectNode",
|
||||
"KlingStartEndFrameNode",
|
||||
"KlingTextToVideoNode",
|
||||
"KlingTextToVideoWithAudio",
|
||||
"KlingVideoExtendNode",
|
||||
"KlingVirtualTryOnNode",
|
||||
"LTXVAddGuide",
|
||||
@ -27816,6 +27972,10 @@
|
||||
"WanImageToImageApi",
|
||||
"WanImageToVideo",
|
||||
"WanImageToVideoApi",
|
||||
"WanMoveConcatTrack",
|
||||
"WanMoveTrackToVideo",
|
||||
"WanMoveTracksFromCoords",
|
||||
"WanMoveVisualizeTracks",
|
||||
"WanPhantomSubjectToVideo",
|
||||
"WanSoundImageToVideo",
|
||||
"WanSoundImageToVideoExtend",
|
||||
@ -28717,6 +28877,14 @@
|
||||
"title_aux": "DarkPrompts"
|
||||
}
|
||||
],
|
||||
"https://github.com/darrell-goh/ComfyUI-NanoBanana_node": [
|
||||
[
|
||||
"NanoBananaNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NanoBanana_node"
|
||||
}
|
||||
],
|
||||
"https://github.com/darth-veitcher/comfydv": [
|
||||
[
|
||||
"CircuitBreaker",
|
||||
@ -28962,6 +29130,14 @@
|
||||
"title_aux": "comfyui_facetools"
|
||||
}
|
||||
],
|
||||
"https://github.com/dcyd-lun/ComfyUI_text_diff": [
|
||||
[
|
||||
"TextDiff"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_text_diff"
|
||||
}
|
||||
],
|
||||
"https://github.com/denfrost/Den_ComfyUI_Workflow": [
|
||||
[
|
||||
"Den_CropImage_AS",
|
||||
@ -29452,6 +29628,22 @@
|
||||
"title_aux": "ComfyUI_Dragos_Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/drawthingsai/draw-things-comfyui": [
|
||||
[
|
||||
"DrawThingsControlNet",
|
||||
"DrawThingsHints",
|
||||
"DrawThingsLoRA",
|
||||
"DrawThingsNegative",
|
||||
"DrawThingsPositive",
|
||||
"DrawThingsPrompt",
|
||||
"DrawThingsRefiner",
|
||||
"DrawThingsSampler",
|
||||
"DrawThingsUpscaler"
|
||||
],
|
||||
{
|
||||
"title_aux": "draw-things-comfyui"
|
||||
}
|
||||
],
|
||||
"https://github.com/dreamhartley/ComfyUI_show_seed": [
|
||||
[
|
||||
"Show Seed"
|
||||
@ -30280,6 +30472,9 @@
|
||||
],
|
||||
"https://github.com/exedesign/Hunyuan-3D-v3": [
|
||||
[
|
||||
"Hunyuan3DPreview",
|
||||
"HunyuanBatchImageTo3D",
|
||||
"HunyuanBatchPreview",
|
||||
"HunyuanConfig",
|
||||
"HunyuanImageTo3D",
|
||||
"HunyuanTextTo3D"
|
||||
@ -31438,6 +31633,14 @@
|
||||
"title_aux": "ComfyUI_pose_inter"
|
||||
}
|
||||
],
|
||||
"https://github.com/fudosanit/ComfyUI-Random-Resolution": [
|
||||
[
|
||||
"RandomResolutionSelector"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Random-Resolution"
|
||||
}
|
||||
],
|
||||
"https://github.com/fuselayer/comfyui-lite-tracker": [
|
||||
[
|
||||
"LiteTracker_LoadModel",
|
||||
@ -31613,6 +31816,7 @@
|
||||
"JSONOutputList",
|
||||
"KSamplerImmediateSave",
|
||||
"NumberOutputList",
|
||||
"PickOutputLists",
|
||||
"StringOutputList"
|
||||
],
|
||||
{
|
||||
@ -33321,6 +33525,14 @@
|
||||
"title_aux": "fastgan-comfyui"
|
||||
}
|
||||
],
|
||||
"https://github.com/huihuihuiz/lora_downloader": [
|
||||
[
|
||||
"LoraDownloader"
|
||||
],
|
||||
{
|
||||
"title_aux": "LoRA Downloader for ComfyUI"
|
||||
}
|
||||
],
|
||||
"https://github.com/huixingyun/ComfyUI-HX-Captioner": [
|
||||
[
|
||||
"HXOllamaCaptioner"
|
||||
@ -33334,6 +33546,9 @@
|
||||
"ModelScopeImageCaptionNode",
|
||||
"ModelScopeImageEditNode",
|
||||
"ModelScopeImageNode",
|
||||
"ModelScopeLoraPresetNode",
|
||||
"ModelScopeMultiLoraLoaderNode",
|
||||
"ModelScopeSingleLoraLoaderNode",
|
||||
"ModelScopeTextNode",
|
||||
"ModelScopeVisionNode"
|
||||
],
|
||||
@ -34631,6 +34846,34 @@
|
||||
"title_aux": "ComfyUI_MusicTools"
|
||||
}
|
||||
],
|
||||
"https://github.com/jeankassio/JK-AceStep-Nodes": [
|
||||
[
|
||||
"AceStepClaude_Lyrics",
|
||||
"AceStepCohere_Lyrics",
|
||||
"AceStepCompileSettings",
|
||||
"AceStepFireworks_Lyrics",
|
||||
"AceStepGeminiLyrics",
|
||||
"AceStepGemini_Lyrics",
|
||||
"AceStepGroqLyrics",
|
||||
"AceStepGroq_Lyrics",
|
||||
"AceStepHuggingFace_Lyrics",
|
||||
"AceStepKSampler",
|
||||
"AceStepKSamplerAdvanced",
|
||||
"AceStepOpenAI_Lyrics",
|
||||
"AceStepPerplexity_Lyrics",
|
||||
"AceStepPostProcess",
|
||||
"AceStepPromptGen",
|
||||
"AceStepReplicate_Lyrics",
|
||||
"AceStepSaveText",
|
||||
"AceStepTogetherAI_Lyrics",
|
||||
"AceStepTorchCompile",
|
||||
"AceStepVocoderAdapter",
|
||||
"AudioQualityEvaluator"
|
||||
],
|
||||
{
|
||||
"title_aux": "JK AceStep Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt": [
|
||||
[
|
||||
"Pony Character Prompt Picker"
|
||||
@ -38890,6 +39133,15 @@
|
||||
"title_aux": "comfyui_wildcards"
|
||||
}
|
||||
],
|
||||
"https://github.com/lovelybbq/comfyui-custom-node-color": [
|
||||
[
|
||||
"ConvertHEXToRGB",
|
||||
"HexColorInput"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI Custom Node Color"
|
||||
}
|
||||
],
|
||||
"https://github.com/lovisdotio/ComfyUI-Replace-First-Frame-Last-Frame": [
|
||||
[
|
||||
"ReplaceFirstLastFrames"
|
||||
@ -38970,6 +39222,15 @@
|
||||
"title_aux": "Comfyui Kolors Utils"
|
||||
}
|
||||
],
|
||||
"https://github.com/lrzjason/Comfyui-LatentUtils": [
|
||||
[
|
||||
"HFEPostProcessor (lrzjason)",
|
||||
"LatentFrequencyEnhancer_lrzjason"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-LatentUtils"
|
||||
}
|
||||
],
|
||||
"https://github.com/lrzjason/Comfyui-LoraUtils": [
|
||||
[
|
||||
"ConvertLoraKeys",
|
||||
@ -40966,6 +41227,8 @@
|
||||
],
|
||||
"https://github.com/mittimi/ComfyUI_mittimiWidthHeight": [
|
||||
[
|
||||
"GoStopAnythingMittimi01",
|
||||
"OutputLongLengthMittimi01",
|
||||
"WidthHeightMittimi01"
|
||||
],
|
||||
{
|
||||
@ -43774,6 +44037,14 @@
|
||||
"title_aux": "Comfyui-PainterAudioCut"
|
||||
}
|
||||
],
|
||||
"https://github.com/princepainter/Comfyui-PainterAudioLength": [
|
||||
[
|
||||
"PainterAudioLength"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-PainterAudioLength"
|
||||
}
|
||||
],
|
||||
"https://github.com/princepainter/Comfyui-PainterFLF2V": [
|
||||
[
|
||||
"PainterFLF2V"
|
||||
@ -46721,12 +46992,9 @@
|
||||
],
|
||||
"https://github.com/slahiri/ComfyUI-AI-Photography-Toolkit": [
|
||||
[
|
||||
"SID_Anthropic_LLM",
|
||||
"SID_GGUF_LLM",
|
||||
"SID_Grok_LLM",
|
||||
"SID_OpenAI_Compatible_LLM",
|
||||
"SID_ZImagePromptGenerator",
|
||||
"SID_ZImagePromptGenerator_Advanced_V2"
|
||||
"SID_LLM_API",
|
||||
"SID_LLM_Local",
|
||||
"SID_ZImagePromptGenerator"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-AI-Photography-Toolkit"
|
||||
@ -48657,6 +48925,14 @@
|
||||
"title_aux": "ComfyUI-FaceCalloutNode"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner": [
|
||||
[
|
||||
"NvidiaCaptionerNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NvidiaCaptioner"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-SD3.5-Latent-Size-Picker": [
|
||||
[
|
||||
"FluxEmptyLatent",
|
||||
@ -48677,6 +48953,14 @@
|
||||
"title_aux": "Together Vision Node"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-Universal-Latent": [
|
||||
[
|
||||
"UniversalLatent"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Universal-Latent"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-ollama_killer": [
|
||||
[
|
||||
"OllamaKiller"
|
||||
@ -48881,7 +49165,8 @@
|
||||
"TALoadCheckpointModelWithName",
|
||||
"TALoadDiffusionModelWithName",
|
||||
"TALoadGGUFModelWithName",
|
||||
"TAPromptController"
|
||||
"TAPromptController",
|
||||
"ta_captioning"
|
||||
],
|
||||
{
|
||||
"title_aux": "TA-ComfyUI-Nodes-Pack"
|
||||
@ -49341,6 +49626,15 @@
|
||||
"title_aux": "comfyui-image-tiled-nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/tumbowungus/MultiMaskCouple": [
|
||||
[
|
||||
"MaskedRegionCond",
|
||||
"MultiMaskCouple"
|
||||
],
|
||||
{
|
||||
"title_aux": "MultiMaskCouple"
|
||||
}
|
||||
],
|
||||
"https://github.com/tungdop2/Comfyui_face_restorer": [
|
||||
[
|
||||
"FaceRestorer",
|
||||
@ -49639,7 +49933,8 @@
|
||||
"https://github.com/ussoewwin/ComfyUI-NunchakuFluxLoraStacker": [
|
||||
[
|
||||
"FastGroupsBypasserV2",
|
||||
"FluxLoraMultiLoader"
|
||||
"FluxLoraMultiLoader",
|
||||
"ModelPatchLoaderCustom"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NunchakuFluxLoraStacker"
|
||||
@ -50079,6 +50374,7 @@
|
||||
"vsLinx_BooleanOrOperator",
|
||||
"vsLinx_BypassOnBool",
|
||||
"vsLinx_FitImageIntoBBoxMask",
|
||||
"vsLinx_ImpactMultilineWildcardText",
|
||||
"vsLinx_LoadSelectedImagesBatch",
|
||||
"vsLinx_LoadSelectedImagesList",
|
||||
"vsLinx_MuteOnBool"
|
||||
@ -50958,7 +51254,9 @@
|
||||
],
|
||||
"https://github.com/wouterverweirder/comfyui_sam3": [
|
||||
[
|
||||
"SAM3Segmentation"
|
||||
"MaskOutline",
|
||||
"SAM3Segmentation",
|
||||
"SEGSToRectangle"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI SAM3"
|
||||
@ -51470,6 +51768,8 @@
|
||||
"PreviewImageLam",
|
||||
"PromptTranslator",
|
||||
"QRCode",
|
||||
"QwenImageEditNode",
|
||||
"QwenImageNode",
|
||||
"SaveImageLam",
|
||||
"SaveImgOutputLam",
|
||||
"SectionEnd",
|
||||
@ -53187,4 +53487,4 @@
|
||||
"title_aux": "SDXLResolutionPresets"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@ -2,6 +2,7 @@ import subprocess
|
||||
import sys
|
||||
import os
|
||||
import traceback
|
||||
import time
|
||||
|
||||
import git
|
||||
import json
|
||||
@ -219,7 +220,14 @@ def gitpull(path):
|
||||
repo.close()
|
||||
return
|
||||
|
||||
remote.pull()
|
||||
try:
|
||||
repo.git.pull('--ff-only')
|
||||
except git.GitCommandError:
|
||||
backup_name = f'backup_{time.strftime("%Y%m%d_%H%M%S")}'
|
||||
repo.create_head(backup_name)
|
||||
print(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||
print(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||
|
||||
repo.git.submodule('update', '--init', '--recursive')
|
||||
new_commit_hash = repo.head.commit.hexsha
|
||||
|
||||
15832
github-stats-cache.json
15832
github-stats-cache.json
File diff suppressed because it is too large
Load Diff
8446
github-stats.json
8446
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, 38, 1]
|
||||
version_code = [3, 38, 3]
|
||||
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||
|
||||
|
||||
@ -2253,9 +2253,17 @@ def git_pull(path):
|
||||
|
||||
current_branch = repo.active_branch
|
||||
remote_name = current_branch.tracking_branch().remote_name
|
||||
remote = repo.remote(name=remote_name)
|
||||
|
||||
remote.pull()
|
||||
try:
|
||||
repo.git.pull('--ff-only')
|
||||
except git.GitCommandError:
|
||||
branch_name = current_branch.name
|
||||
backup_name = f'backup_{time.strftime("%Y%m%d_%H%M%S")}'
|
||||
repo.create_head(backup_name)
|
||||
logging.info(f"[ComfyUI-Manager] Cannot fast-forward. Backup created: {backup_name}")
|
||||
repo.git.reset('--hard', f'{remote_name}/{branch_name}')
|
||||
logging.info(f"[ComfyUI-Manager] Reset to {remote_name}/{branch_name}")
|
||||
|
||||
repo.git.submodule('update', '--init', '--recursive')
|
||||
|
||||
repo.close()
|
||||
@ -2523,22 +2531,22 @@ def update_to_stable_comfyui(repo_path):
|
||||
logging.error('\t'+branch.name)
|
||||
return "fail", None
|
||||
|
||||
versions, current_tag, _ = get_comfyui_versions(repo)
|
||||
|
||||
if len(versions) == 0 or (len(versions) == 1 and versions[0] == 'nightly'):
|
||||
versions, current_tag, latest_tag = get_comfyui_versions(repo)
|
||||
|
||||
if latest_tag is None:
|
||||
logging.info("[ComfyUI-Manager] Unable to update to the stable ComfyUI version.")
|
||||
return "fail", None
|
||||
|
||||
if versions[0] == 'nightly':
|
||||
latest_tag = versions[1]
|
||||
else:
|
||||
latest_tag = versions[0]
|
||||
|
||||
if current_tag == latest_tag:
|
||||
tag_ref = next((t for t in repo.tags if t.name == latest_tag), None)
|
||||
if tag_ref is None:
|
||||
logging.info(f"[ComfyUI-Manager] Unable to locate tag '{latest_tag}' in repository.")
|
||||
return "fail", None
|
||||
|
||||
if repo.head.commit == tag_ref.commit:
|
||||
return "skip", None
|
||||
else:
|
||||
logging.info(f"[ComfyUI-Manager] Updating ComfyUI: {current_tag} -> {latest_tag}")
|
||||
repo.git.checkout(latest_tag)
|
||||
repo.git.checkout(tag_ref.name)
|
||||
execute_install_script("ComfyUI", repo_path, instant_execution=False, no_deps=False)
|
||||
return 'updated', latest_tag
|
||||
except:
|
||||
@ -3362,36 +3370,80 @@ async def restore_snapshot(snapshot_path, git_helper_extras=None):
|
||||
|
||||
|
||||
def get_comfyui_versions(repo=None):
|
||||
if repo is None:
|
||||
repo = git.Repo(comfy_path)
|
||||
repo = repo or git.Repo(comfy_path)
|
||||
|
||||
remote_name = None
|
||||
try:
|
||||
remote = get_remote_name(repo)
|
||||
repo.remotes[remote].fetch()
|
||||
remote_name = get_remote_name(repo)
|
||||
repo.remotes[remote_name].fetch()
|
||||
except:
|
||||
logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI")
|
||||
|
||||
versions = [x.name for x in repo.tags if x.name.startswith('v')]
|
||||
def parse_semver(tag_name):
|
||||
match = re.match(r'^v(\d+)\.(\d+)\.(\d+)$', tag_name)
|
||||
return tuple(int(x) for x in match.groups()) if match else None
|
||||
|
||||
# nearest tag
|
||||
versions = sorted(versions, key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True)
|
||||
versions = versions[:4]
|
||||
def normalize_describe(tag_name):
|
||||
if not tag_name:
|
||||
return None
|
||||
base = tag_name.split('-', 1)[0]
|
||||
return base if parse_semver(base) else None
|
||||
|
||||
current_tag = repo.git.describe('--tags')
|
||||
# Collect semver tags and sort descending (highest first)
|
||||
semver_tags = []
|
||||
for tag in repo.tags:
|
||||
semver = parse_semver(tag.name)
|
||||
if semver:
|
||||
semver_tags.append((semver, tag.name))
|
||||
semver_tags.sort(key=lambda x: x[0], reverse=True)
|
||||
semver_tags = [name for _, name in semver_tags]
|
||||
|
||||
if current_tag not in versions:
|
||||
versions = sorted(versions + [current_tag], key=lambda v: repo.git.log('-1', '--format=%ct', v), reverse=True)
|
||||
versions = versions[:4]
|
||||
latest_tag = semver_tags[0] if semver_tags else None
|
||||
|
||||
main_branch = repo.heads.master
|
||||
latest_commit = main_branch.commit
|
||||
latest_tag = repo.git.describe('--tags', latest_commit.hexsha)
|
||||
try:
|
||||
described = repo.git.describe('--tags')
|
||||
except Exception:
|
||||
described = ''
|
||||
|
||||
if latest_tag != versions[0]:
|
||||
versions.insert(0, 'nightly')
|
||||
else:
|
||||
versions[0] = 'nightly'
|
||||
try:
|
||||
exact_tag = repo.git.describe('--tags', '--exact-match')
|
||||
except Exception:
|
||||
exact_tag = ''
|
||||
|
||||
head_is_default = False
|
||||
if remote_name:
|
||||
try:
|
||||
default_head_ref = repo.refs[f'{remote_name}/HEAD']
|
||||
default_commit = default_head_ref.reference.commit
|
||||
head_is_default = repo.head.commit == default_commit
|
||||
except Exception:
|
||||
head_is_default = False
|
||||
|
||||
nearest_semver = normalize_describe(described)
|
||||
exact_semver = exact_tag if parse_semver(exact_tag) else None
|
||||
|
||||
if head_is_default and not exact_tag:
|
||||
current_tag = 'nightly'
|
||||
else:
|
||||
current_tag = exact_tag or described or 'nightly'
|
||||
|
||||
# Prepare semver list for display: top 4 plus the current/nearest semver if missing
|
||||
display_semver_tags = semver_tags[:4]
|
||||
if exact_semver and exact_semver not in display_semver_tags:
|
||||
display_semver_tags.append(exact_semver)
|
||||
elif nearest_semver and nearest_semver not in display_semver_tags:
|
||||
display_semver_tags.append(nearest_semver)
|
||||
|
||||
versions = ['nightly']
|
||||
|
||||
if current_tag and not exact_semver and current_tag not in versions and current_tag not in display_semver_tags:
|
||||
versions.append(current_tag)
|
||||
|
||||
for tag in display_semver_tags:
|
||||
if tag not in versions:
|
||||
versions.append(tag)
|
||||
|
||||
versions = versions[:6]
|
||||
|
||||
return versions, current_tag, latest_tag
|
||||
|
||||
|
||||
227
js/comfyui-gui-builder.js
Normal file
227
js/comfyui-gui-builder.js
Normal file
@ -0,0 +1,227 @@
|
||||
import { $el } from "../../scripts/ui.js";
|
||||
|
||||
function normalizeContent(content) {
|
||||
const tmp = document.createElement('div');
|
||||
if (typeof content === 'string') {
|
||||
tmp.innerHTML = content;
|
||||
return Array.from(tmp.childNodes);
|
||||
}
|
||||
if (content instanceof Node) {
|
||||
return content;
|
||||
}
|
||||
return content;
|
||||
}
|
||||
|
||||
export function createSettingsCombo(label, content) {
|
||||
const settingItem = $el("div.setting-item", {}, [
|
||||
$el("div.flex.flex-row.items-center.gap-2",[
|
||||
$el("div.form-label.flex.grow.items-center", [
|
||||
$el("span.text-muted", { textContent: label },)
|
||||
]),
|
||||
$el("div.form-input.flex.justify-end",
|
||||
[content]
|
||||
)
|
||||
]
|
||||
)
|
||||
]);
|
||||
return settingItem;
|
||||
}
|
||||
|
||||
export function buildGuiFrame(dialogId, title, iconClass, content, owner) {
|
||||
const dialog_mask = $el("div.p-dialog-mask.p-overlay-mask.p-overlay-mask-enter", {
|
||||
parent: document.body,
|
||||
style: {
|
||||
position: "fixed",
|
||||
height: "100%",
|
||||
width: "100%",
|
||||
left: "0px",
|
||||
top: "0px",
|
||||
display: "flex",
|
||||
justifyContent: "center",
|
||||
alignItems: "center",
|
||||
pointerEvents: "auto",
|
||||
zIndex: "1000"
|
||||
},
|
||||
onclick: (e) => {
|
||||
if (e.target === dialog_mask) {
|
||||
owner.close();
|
||||
}
|
||||
}
|
||||
// data-pc-section="mask"
|
||||
});
|
||||
|
||||
const header_actions = $el("div.p-dialog-header-actions", {
|
||||
// [TODO]
|
||||
// data-pc-section="headeractions"
|
||||
}
|
||||
);
|
||||
|
||||
const close_button = $el("button.p-button.p-component.p-button-icon-only.p-button-secondary.p-button-rounded.p-button-text.p-dialog-close-button", {
|
||||
parent: header_actions,
|
||||
type: "button",
|
||||
ariaLabel: "Close",
|
||||
onclick: () => owner.close(),
|
||||
// "data-pc-name": "pcclosebutton",
|
||||
// "data-p-disabled": "false",
|
||||
// "data-p-severity": "secondary",
|
||||
// "data-pc-group-section": "headericon",
|
||||
// "data-pc-extend": "button",
|
||||
// "data-pc-section": "root",
|
||||
// [FIXME] Not sure how to do most of the SVG using $el
|
||||
innerHTML: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="p-icon p-button-icon" aria-hidden="true"><path d="M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z" fill="currentColor"></path></svg><span class="p-button-label" data-pc-section="label"> </span><!---->'
|
||||
}
|
||||
);
|
||||
|
||||
const dialog_header = $el("div.p-dialog-header",
|
||||
[
|
||||
$el("div", [
|
||||
$el("div",
|
||||
{
|
||||
id: "cm-manager",
|
||||
},
|
||||
[
|
||||
$el("h2.px-4", [
|
||||
$el(iconClass, {
|
||||
style: {
|
||||
"font-size": "1.25rem",
|
||||
"margin-right": ".5rem"
|
||||
}
|
||||
}),
|
||||
$el("span", { textContent: title })
|
||||
])
|
||||
]
|
||||
)
|
||||
]),
|
||||
header_actions
|
||||
]
|
||||
);
|
||||
|
||||
const contentFrame = $el("div.p-dialog-content", {}, normalizeContent(content));
|
||||
const manager_dialog = $el("div.p-dialog.p-component.global-dialog", {
|
||||
id: dialogId,
|
||||
parent: dialog_mask,
|
||||
style: {
|
||||
'display': 'flex',
|
||||
'flex-direction': 'column',
|
||||
'pointer-events': 'auto',
|
||||
'margin': '0px',
|
||||
},
|
||||
role: 'dialog',
|
||||
ariaModal: 'true',
|
||||
// [TODO]
|
||||
// ariaLabbelledby: 'cm-title',
|
||||
// maximized: 'false',
|
||||
// data-pc-name: 'dialog',
|
||||
// data-pc-section: 'root',
|
||||
// data-pd-focustrap: 'true'
|
||||
},
|
||||
[ dialog_header, contentFrame ]
|
||||
);
|
||||
|
||||
const hidden_accessible = $el("span.p-hidden-accessible.p-hidden-focusable", {
|
||||
parent: manager_dialog,
|
||||
tabindex: "0",
|
||||
role: "presentation",
|
||||
ariaHidden: "true",
|
||||
"data-p-hidden-accessible": "true",
|
||||
"data-p-hidden-focusable": "true",
|
||||
"data-pc-section": "firstfocusableelement"
|
||||
});
|
||||
|
||||
return dialog_mask;
|
||||
}
|
||||
|
||||
export function buildGuiFrameCustomHeader(dialogId, customHeader, content, owner) {
|
||||
const dialog_mask = $el("div.p-dialog-mask.p-overlay-mask.p-overlay-mask-enter", {
|
||||
parent: document.body,
|
||||
style: {
|
||||
position: "fixed",
|
||||
height: "100%",
|
||||
width: "100%",
|
||||
left: "0px",
|
||||
top: "0px",
|
||||
display: "flex",
|
||||
justifyContent: "center",
|
||||
alignItems: "center",
|
||||
pointerEvents: "auto",
|
||||
zIndex: "1000"
|
||||
},
|
||||
onclick: (e) => {
|
||||
if (e.target === dialog_mask) {
|
||||
owner.close();
|
||||
}
|
||||
}
|
||||
// data-pc-section="mask"
|
||||
});
|
||||
|
||||
const header_actions = $el("div.p-dialog-header-actions", {
|
||||
// [TODO]
|
||||
// data-pc-section="headeractions"
|
||||
}
|
||||
);
|
||||
|
||||
const close_button = $el("button.p-button.p-component.p-button-icon-only.p-button-secondary.p-button-rounded.p-button-text.p-dialog-close-button", {
|
||||
parent: header_actions,
|
||||
type: "button",
|
||||
ariaLabel: "Close",
|
||||
onclick: () => owner.close(),
|
||||
// "data-pc-name": "pcclosebutton",
|
||||
// "data-p-disabled": "false",
|
||||
// "data-p-severity": "secondary",
|
||||
// "data-pc-group-section": "headericon",
|
||||
// "data-pc-extend": "button",
|
||||
// "data-pc-section": "root",
|
||||
// [FIXME] Not sure how to do most of the SVG using $el
|
||||
innerHTML: '<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg" class="p-icon p-button-icon" aria-hidden="true"><path d="M8.01186 7.00933L12.27 2.75116C12.341 2.68501 12.398 2.60524 12.4375 2.51661C12.4769 2.42798 12.4982 2.3323 12.4999 2.23529C12.5016 2.13827 12.4838 2.0419 12.4474 1.95194C12.4111 1.86197 12.357 1.78024 12.2884 1.71163C12.2198 1.64302 12.138 1.58893 12.0481 1.55259C11.9581 1.51625 11.8617 1.4984 11.7647 1.50011C11.6677 1.50182 11.572 1.52306 11.4834 1.56255C11.3948 1.60204 11.315 1.65898 11.2488 1.72997L6.99067 5.98814L2.7325 1.72997C2.59553 1.60234 2.41437 1.53286 2.22718 1.53616C2.03999 1.53946 1.8614 1.61529 1.72901 1.74767C1.59663 1.88006 1.5208 2.05865 1.5175 2.24584C1.5142 2.43303 1.58368 2.61419 1.71131 2.75116L5.96948 7.00933L1.71131 11.2675C1.576 11.403 1.5 11.5866 1.5 11.7781C1.5 11.9696 1.576 12.1532 1.71131 12.2887C1.84679 12.424 2.03043 12.5 2.2219 12.5C2.41338 12.5 2.59702 12.424 2.7325 12.2887L6.99067 8.03052L11.2488 12.2887C11.3843 12.424 11.568 12.5 11.7594 12.5C11.9509 12.5 12.1346 12.424 12.27 12.2887C12.4053 12.1532 12.4813 11.9696 12.4813 11.7781C12.4813 11.5866 12.4053 11.403 12.27 11.2675L8.01186 7.00933Z" fill="currentColor"></path></svg><span class="p-button-label" data-pc-section="label"> </span><!---->'
|
||||
}
|
||||
);
|
||||
|
||||
const _customHeader = normalizeContent(customHeader);
|
||||
const dialog_header = $el("div.p-dialog-header",
|
||||
[
|
||||
$el("div", [
|
||||
$el("div",
|
||||
{
|
||||
id: "cm-manager",
|
||||
},
|
||||
Array.isArray(_customHeader) ? _customHeader : [_customHeader]
|
||||
)
|
||||
]),
|
||||
header_actions
|
||||
]
|
||||
);
|
||||
|
||||
const contentFrame = $el("div.p-dialog-content", {}, normalizeContent(content));
|
||||
const manager_dialog = $el("div.p-dialog.p-component.global-dialog", {
|
||||
id: dialogId,
|
||||
parent: dialog_mask,
|
||||
style: {
|
||||
'display': 'flex',
|
||||
'flex-direction': 'column',
|
||||
'pointer-events': 'auto',
|
||||
'margin': '0px',
|
||||
},
|
||||
role: 'dialog',
|
||||
ariaModal: 'true',
|
||||
// [TODO]
|
||||
// ariaLabbelledby: 'cm-title',
|
||||
// maximized: 'false',
|
||||
// data-pc-name: 'dialog',
|
||||
// data-pc-section: 'root',
|
||||
// data-pd-focustrap: 'true'
|
||||
},
|
||||
[ dialog_header, contentFrame ]
|
||||
);
|
||||
|
||||
const hidden_accessible = $el("span.p-hidden-accessible.p-hidden-focusable", {
|
||||
parent: manager_dialog,
|
||||
tabindex: "0",
|
||||
role: "presentation",
|
||||
ariaHidden: "true",
|
||||
"data-p-hidden-accessible": "true",
|
||||
"data-p-hidden-focusable": "true",
|
||||
"data-pc-section": "firstfocusableelement"
|
||||
});
|
||||
|
||||
return dialog_mask;
|
||||
}
|
||||
@ -20,6 +20,7 @@ import { ComponentBuilderDialog, getPureName, load_components, set_component_pol
|
||||
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
||||
import { ModelManager } from "./model-manager.js";
|
||||
import { SnapshotManager } from "./snapshot.js";
|
||||
import { buildGuiFrame, createSettingsCombo } from "./comfyui-gui-builder.js";
|
||||
|
||||
let manager_version = await getVersion();
|
||||
|
||||
@ -44,12 +45,16 @@ docStyle.innerHTML = `
|
||||
|
||||
#cm-manager-dialog {
|
||||
width: 1000px;
|
||||
height: 455px;
|
||||
height: auto;
|
||||
box-sizing: content-box;
|
||||
z-index: 1000;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#cm-manager-dialog br {
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
.cb-widget {
|
||||
width: 400px;
|
||||
height: 25px;
|
||||
@ -80,6 +85,7 @@ docStyle.innerHTML = `
|
||||
}
|
||||
|
||||
.cm-menu-container {
|
||||
padding : calc(var(--spacing)*2);
|
||||
column-gap: 20px;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
@ -140,8 +146,8 @@ docStyle.innerHTML = `
|
||||
}
|
||||
|
||||
.cm-notice-board {
|
||||
width: 290px;
|
||||
height: 230px;
|
||||
width: auto;
|
||||
height: 280px;
|
||||
overflow: auto;
|
||||
color: var(--input-text);
|
||||
border: 1px solid var(--descrip-text);
|
||||
@ -238,68 +244,50 @@ var is_updating = false;
|
||||
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
|
||||
const style = `
|
||||
#workflowgallery-button {
|
||||
width: 310px;
|
||||
height: 27px;
|
||||
height: 50px;
|
||||
padding: 0px !important;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 17px !important;
|
||||
}
|
||||
#cm-nodeinfo-button {
|
||||
width: 310px;
|
||||
height: 27px;
|
||||
padding: 0px !important;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 17px !important;
|
||||
|
||||
}
|
||||
#cm-manual-button {
|
||||
width: 310px;
|
||||
height: 27px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
}
|
||||
|
||||
.cm-button {
|
||||
width: 310px;
|
||||
height: 30px;
|
||||
width: auto;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 17px !important;
|
||||
background-color: var(--comfy-menu-secondary-bg);
|
||||
border-color: var(--border-color);
|
||||
color: color: var(--input-text);
|
||||
}
|
||||
|
||||
.cm-button:hover {
|
||||
filter: brightness(125%);
|
||||
}
|
||||
|
||||
.cm-button-red {
|
||||
width: 310px;
|
||||
height: 30px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 17px !important;
|
||||
background-color: #500000 !important;
|
||||
border-color: #88181b !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.cm-button-red:hover {
|
||||
background-color: #88181b !important;
|
||||
}
|
||||
|
||||
.cm-button-orange {
|
||||
width: 310px;
|
||||
height: 30px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 17px !important;
|
||||
font-weight: bold;
|
||||
background-color: orange !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.cm-experimental-button {
|
||||
width: 290px;
|
||||
height: 30px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 17px !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cm-experimental {
|
||||
width: 310px;
|
||||
border: 1px solid #555;
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
@ -326,8 +314,14 @@ const style = `
|
||||
|
||||
.cm-menu-combo {
|
||||
cursor: pointer;
|
||||
width: 310px;
|
||||
box-sizing: border-box;
|
||||
padding: 0.5em 0.5em;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 6px;
|
||||
background: var(--comfy-menu-secondary-bg);
|
||||
}
|
||||
|
||||
.cm-menu-combo:hover {
|
||||
filter: brightness(125%);
|
||||
}
|
||||
|
||||
.cm-small-button {
|
||||
@ -831,7 +825,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
const isElectron = 'electronAPI' in window;
|
||||
|
||||
update_comfyui_button =
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Update ComfyUI",
|
||||
style: {
|
||||
@ -842,7 +836,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
});
|
||||
|
||||
switch_comfyui_button =
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Switch ComfyUI",
|
||||
style: {
|
||||
@ -853,7 +847,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
});
|
||||
|
||||
restart_stop_button =
|
||||
$el("button.cm-button-red", {
|
||||
$el("button.p-button.p-component.cm-button-red", {
|
||||
type: "button",
|
||||
textContent: "Restart",
|
||||
onclick: () => restartOrStop()
|
||||
@ -861,7 +855,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
|
||||
if(isElectron) {
|
||||
update_all_button =
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Update All Custom Nodes",
|
||||
onclick:
|
||||
@ -870,7 +864,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
else {
|
||||
update_all_button =
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Update All",
|
||||
onclick:
|
||||
@ -880,7 +874,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
|
||||
const res =
|
||||
[
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Custom Nodes Manager",
|
||||
onclick:
|
||||
@ -892,7 +886,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
}),
|
||||
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Install Missing Custom Nodes",
|
||||
onclick:
|
||||
@ -904,7 +898,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
}),
|
||||
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Custom Nodes In Workflow",
|
||||
onclick:
|
||||
@ -916,8 +910,8 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
}),
|
||||
|
||||
$el("br", {}, []),
|
||||
$el("button.cm-button", {
|
||||
$el("div", {}, []),
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Model Manager",
|
||||
onclick:
|
||||
@ -929,7 +923,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
}),
|
||||
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
type: "button",
|
||||
textContent: "Install via Git URL",
|
||||
onclick: async () => {
|
||||
@ -941,13 +935,13 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
}),
|
||||
|
||||
$el("br", {}, []),
|
||||
$el("div", {}, []),
|
||||
update_all_button,
|
||||
update_comfyui_button,
|
||||
switch_comfyui_button,
|
||||
// fetch_updates_button,
|
||||
|
||||
$el("br", {}, []),
|
||||
$el("div", {}, []),
|
||||
restart_stop_button,
|
||||
];
|
||||
|
||||
@ -960,12 +954,13 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
let self = this;
|
||||
|
||||
// db mode
|
||||
|
||||
this.datasrc_combo = document.createElement("select");
|
||||
this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened.");
|
||||
this.datasrc_combo.className = "cm-menu-combo";
|
||||
this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, []));
|
||||
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, []));
|
||||
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'DB: Channel (remote)' }, []));
|
||||
this.datasrc_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled ";
|
||||
this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'Channel (1day cache)' }, []));
|
||||
this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'Local' }, []));
|
||||
this.datasrc_combo.appendChild($el('option', { value: 'remote', text: 'Channel (remote)' }, []));
|
||||
|
||||
api.fetchApi('/manager/db_mode')
|
||||
.then(response => response.text())
|
||||
@ -975,14 +970,16 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
api.fetchApi(`/manager/db_mode?value=${event.target.value}`);
|
||||
});
|
||||
|
||||
const dbRetrievalSetttingItem = createSettingsCombo("DB", this.datasrc_combo);
|
||||
|
||||
// preview method
|
||||
let preview_combo = document.createElement("select");
|
||||
preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process.");
|
||||
preview_combo.className = "cm-menu-combo";
|
||||
preview_combo.appendChild($el('option', { value: 'auto', text: 'Preview method: Auto' }, []));
|
||||
preview_combo.appendChild($el('option', { value: 'taesd', text: 'Preview method: TAESD (slow)' }, []));
|
||||
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Preview method: Latent2RGB (fast)' }, []));
|
||||
preview_combo.appendChild($el('option', { value: 'none', text: 'Preview method: None (very fast)' }, []));
|
||||
preview_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
|
||||
preview_combo.appendChild($el('option', { value: 'auto', text: 'Auto' }, []));
|
||||
preview_combo.appendChild($el('option', { value: 'taesd', text: 'TAESD (slow)' }, []));
|
||||
preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Latent2RGB (fast)' }, []));
|
||||
preview_combo.appendChild($el('option', { value: 'none', text: 'None (very fast)' }, []));
|
||||
|
||||
api.fetchApi('/manager/preview_method')
|
||||
.then(response => response.text())
|
||||
@ -992,10 +989,12 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
api.fetchApi(`/manager/preview_method?value=${event.target.value}`);
|
||||
});
|
||||
|
||||
const previewSetttingItem = createSettingsCombo("Preview method", preview_combo);
|
||||
|
||||
// channel
|
||||
let channel_combo = document.createElement("select");
|
||||
channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list.");
|
||||
channel_combo.className = "cm-menu-combo";
|
||||
channel_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
|
||||
api.fetchApi('/manager/channel_url_list')
|
||||
.then(response => response.json())
|
||||
.then(async data => {
|
||||
@ -1004,7 +1003,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
for (let i in urls) {
|
||||
if (urls[i] != '') {
|
||||
let name_url = urls[i].split('::');
|
||||
channel_combo.appendChild($el('option', { value: name_url[0], text: `Channel: ${name_url[0]}` }, []));
|
||||
channel_combo.appendChild($el('option', { value: name_url[0], text: `${name_url[0]}` }, []));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1019,11 +1018,13 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
});
|
||||
|
||||
const channelSetttingItem = createSettingsCombo("Channel", channel_combo);
|
||||
|
||||
|
||||
// share
|
||||
let share_combo = document.createElement("select");
|
||||
share_combo.setAttribute("title", "Hide the share button in the main menu or set the default action upon clicking it. Additionally, configure the default share site when sharing via the context menu's share button.");
|
||||
share_combo.className = "cm-menu-combo";
|
||||
share_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
|
||||
const share_options = [
|
||||
['none', 'None'],
|
||||
['openart', 'OpenArt AI'],
|
||||
@ -1034,7 +1035,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
['all', 'All'],
|
||||
];
|
||||
for (const option of share_options) {
|
||||
share_combo.appendChild($el('option', { value: option[0], text: `Share: ${option[1]}` }, []));
|
||||
share_combo.appendChild($el('option', { value: option[0], text: `${option[1]}` }, []));
|
||||
}
|
||||
|
||||
api.fetchApi('/manager/share_option')
|
||||
@ -1056,12 +1057,14 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
});
|
||||
|
||||
const shareSetttingItem = createSettingsCombo("Share", share_combo);
|
||||
|
||||
let component_policy_combo = document.createElement("select");
|
||||
component_policy_combo.setAttribute("title", "When loading the workflow, configure which version of the component to use.");
|
||||
component_policy_combo.className = "cm-menu-combo";
|
||||
component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Component: Use workflow version' }, []));
|
||||
component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Component: Use higher version' }, []));
|
||||
component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Component: Use my version' }, []));
|
||||
component_policy_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
|
||||
component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Use workflow version' }, []));
|
||||
component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Use higher version' }, []));
|
||||
component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Use my version' }, []));
|
||||
api.fetchApi('/manager/policy/component')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
@ -1074,15 +1077,14 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
set_component_policy(event.target.value);
|
||||
});
|
||||
|
||||
update_policy_combo = document.createElement("select");
|
||||
const componentSetttingItem = createSettingsCombo("Component", component_policy_combo);
|
||||
|
||||
if(isElectron)
|
||||
update_policy_combo.style.display = 'none';
|
||||
update_policy_combo = document.createElement("select");
|
||||
|
||||
update_policy_combo.setAttribute("title", "Sets the policy to be applied when performing an update.");
|
||||
update_policy_combo.className = "cm-menu-combo";
|
||||
update_policy_combo.appendChild($el('option', { value: 'stable-comfyui', text: 'Update: ComfyUI Stable Version' }, []));
|
||||
update_policy_combo.appendChild($el('option', { value: 'nightly-comfyui', text: 'Update: ComfyUI Nightly Version' }, []));
|
||||
update_policy_combo.className = "cm-menu-combo p-select p-component p-inputwrapper p-inputwrapper-filled";
|
||||
update_policy_combo.appendChild($el('option', { value: 'stable-comfyui', text: 'ComfyUI Stable Version' }, []));
|
||||
update_policy_combo.appendChild($el('option', { value: 'nightly-comfyui', text: 'ComfyUI Nightly Version' }, []));
|
||||
api.fetchApi('/manager/policy/update')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
@ -1093,20 +1095,22 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
api.fetchApi(`/manager/policy/update?value=${event.target.value}`);
|
||||
});
|
||||
|
||||
return [
|
||||
$el("br", {}, []),
|
||||
this.datasrc_combo,
|
||||
channel_combo,
|
||||
preview_combo,
|
||||
share_combo,
|
||||
component_policy_combo,
|
||||
update_policy_combo,
|
||||
$el("br", {}, []),
|
||||
const updateSetttingItem = createSettingsCombo("Update", update_policy_combo);
|
||||
|
||||
if(isElectron)
|
||||
updateSetttingItem.style.display = 'none';
|
||||
|
||||
$el("br", {}, []),
|
||||
$el("filedset.cm-experimental", {}, [
|
||||
return [
|
||||
dbRetrievalSetttingItem,
|
||||
channelSetttingItem,
|
||||
previewSetttingItem,
|
||||
shareSetttingItem,
|
||||
componentSetttingItem,
|
||||
updateSetttingItem,
|
||||
|
||||
$el("filedset.cm-experimental.mt-auto", {}, [
|
||||
$el("legend.cm-experimental-legend", {}, ["EXPERIMENTAL"]),
|
||||
$el("button.cm-experimental-button", {
|
||||
$el("button.p-button.p-component.cm-button.cm-experimental-button", {
|
||||
type: "button",
|
||||
textContent: "Snapshot Manager",
|
||||
onclick:
|
||||
@ -1116,7 +1120,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
SnapshotManager.instance.show();
|
||||
}
|
||||
}),
|
||||
$el("button.cm-experimental-button", {
|
||||
$el("button.p-button.p-component.cm-button.cm-experimental-button", {
|
||||
type: "button",
|
||||
textContent: "Install PIP packages",
|
||||
onclick:
|
||||
@ -1134,7 +1138,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
|
||||
createControlsRight() {
|
||||
const elts = [
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
id: 'cm-manual-button',
|
||||
type: "button",
|
||||
textContent: "Community Manual",
|
||||
@ -1185,11 +1189,11 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
})
|
||||
]),
|
||||
|
||||
$el("button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
id: 'workflowgallery-button',
|
||||
type: "button",
|
||||
style: {
|
||||
...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {})
|
||||
// ...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {})
|
||||
},
|
||||
onclick: (e) => {
|
||||
const last_visited_site = localStorage.getItem("wg_last_visited")
|
||||
@ -1212,7 +1216,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}, [
|
||||
$el("p", {
|
||||
id: 'workflowgallery-button-last-visited-label',
|
||||
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : ''})`,
|
||||
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : 'none selected'})`,
|
||||
style: {
|
||||
'text-align': 'center',
|
||||
'color': 'var(--input-text)',
|
||||
@ -1228,13 +1232,12 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
})
|
||||
]),
|
||||
|
||||
$el("button.cm-button", {
|
||||
$el("button.p-button.p-component.cm-button", {
|
||||
id: 'cm-nodeinfo-button',
|
||||
type: "button",
|
||||
textContent: "Nodes Info",
|
||||
onclick: () => { window.open("https://ltdrdata.github.io/", "comfyui-node-info"); }
|
||||
}),
|
||||
$el("br", {}, []),
|
||||
];
|
||||
|
||||
var textarea = document.createElement("div");
|
||||
@ -1249,31 +1252,23 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
const close_button = $el("button", { id: "cm-close-button", type: "button", textContent: "Close", onclick: () => this.close() });
|
||||
const content = $el("div.cm-menu-container",
|
||||
[
|
||||
$el("div.cm-menu-column.gap-2", [...this.createControlsLeft()]),
|
||||
$el("div.cm-menu-column.gap-2", [...this.createControlsMid()]),
|
||||
$el("div.cm-menu-column.gap-2", [...this.createControlsRight()])
|
||||
]
|
||||
);
|
||||
|
||||
const content =
|
||||
$el("div.comfy-modal-content",
|
||||
[
|
||||
$el("tr.cm-title", {}, [
|
||||
$el("font", {size:6, color:"white"}, [`ComfyUI Manager ${manager_version}`])]
|
||||
),
|
||||
$el("br", {}, []),
|
||||
$el("div.cm-menu-container",
|
||||
[
|
||||
$el("div.cm-menu-column", [...this.createControlsLeft()]),
|
||||
$el("div.cm-menu-column", [...this.createControlsMid()]),
|
||||
$el("div.cm-menu-column", [...this.createControlsRight()])
|
||||
]),
|
||||
const frame = buildGuiFrame(
|
||||
'cm-manager-dialog', // dialog id
|
||||
`ComfyUI Manager ${manager_version}`, // dialog title
|
||||
"i.mdi.mdi-puzzle", // dialog icon class to show before title
|
||||
content, // dialog content element
|
||||
this
|
||||
); // send this so we can attach close functions
|
||||
|
||||
$el("br", {}, []),
|
||||
close_button,
|
||||
]
|
||||
);
|
||||
|
||||
content.style.width = '100%';
|
||||
content.style.height = '100%';
|
||||
|
||||
this.element = $el("div.comfy-modal", { id:'cm-manager-dialog', parent: document.body }, [ content ]);
|
||||
this.element = frame;
|
||||
}
|
||||
|
||||
get isVisible() {
|
||||
@ -1281,7 +1276,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
||||
}
|
||||
|
||||
show() {
|
||||
this.element.style.display = "block";
|
||||
this.element.style.display = "flex";
|
||||
}
|
||||
|
||||
toggleVisibility() {
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
.cn-manager {
|
||||
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||
z-index: 1099;
|
||||
width: 80%;
|
||||
height: 80%;
|
||||
width: 80vw;
|
||||
height: 75vh;
|
||||
min-height: 30em;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
@ -10,6 +11,7 @@
|
||||
font-family: arial, sans-serif;
|
||||
text-underline-offset: 3px;
|
||||
outline: none;
|
||||
margin: calc(var(--spacing)*2);
|
||||
}
|
||||
|
||||
.cn-manager .cn-flex-auto {
|
||||
@ -17,17 +19,22 @@
|
||||
}
|
||||
|
||||
.cn-manager button {
|
||||
width: auto;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
font-size: 16px;
|
||||
color: var(--input-text);
|
||||
background-color: var(--comfy-input-bg);
|
||||
border-radius: 8px;
|
||||
border-color: var(--border-color);
|
||||
border-style: solid;
|
||||
margin: 0;
|
||||
padding: 4px 8px;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
.cn-manager button:hover {
|
||||
filter: brightness(125%);
|
||||
}
|
||||
|
||||
.cn-manager button:disabled,
|
||||
.cn-manager input:disabled,
|
||||
.cn-manager select:disabled {
|
||||
@ -40,8 +47,13 @@
|
||||
|
||||
.cn-manager .cn-manager-restart {
|
||||
display: none;
|
||||
background-color: #500000;
|
||||
color: white;
|
||||
background-color: #500000 !important;
|
||||
border-color: #88181b !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
.cn-manager .cn-manager-restart:hover {
|
||||
background-color: #88181b !important;
|
||||
}
|
||||
|
||||
.cn-manager .cn-manager-stop {
|
||||
@ -79,7 +91,6 @@
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.cn-manager-header label {
|
||||
@ -91,16 +102,32 @@
|
||||
.cn-manager-filter {
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
|
||||
cursor: pointer;
|
||||
padding: 0.5em 0.5em;
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 6px;
|
||||
background: var(--comfy-input-bg);
|
||||
}
|
||||
|
||||
.cn-manager-filter:hover {
|
||||
filter: brightness(125%);
|
||||
}
|
||||
|
||||
.cn-manager-keywords {
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
padding: 0 5px 0 26px;
|
||||
background: var(--comfy-input-bg);
|
||||
background-size: 16px;
|
||||
background-position: 5px center;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20viewBox%3D%220%200%2024%2024%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20pointer-events%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23888%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22m21%2021-4.486-4.494M19%2010.5a8.5%208.5%200%201%201-17%200%208.5%208.5%200%200%201%2017%200%22%2F%3E%3C%2Fsvg%3E");
|
||||
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 6px;
|
||||
|
||||
outline-color: transparent;
|
||||
}
|
||||
|
||||
.cn-manager-status {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { app } from "../../scripts/app.js";
|
||||
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
||||
import { api } from "../../scripts/api.js";
|
||||
import { buildGuiFrameCustomHeader, createSettingsCombo } from "./comfyui-gui-builder.js";
|
||||
|
||||
import {
|
||||
manager_instance, rebootAPI, install_via_git_url,
|
||||
@ -18,32 +19,19 @@ loadCss("./custom-nodes-manager.css");
|
||||
const gridId = "node";
|
||||
|
||||
const pageHtml = `
|
||||
<div class="cn-manager-header">
|
||||
<label>Filter
|
||||
<select class="cn-manager-filter"></select>
|
||||
</label>
|
||||
<input class="cn-manager-keywords" type="search" placeholder="Search" />
|
||||
<div class="cn-manager-status"></div>
|
||||
<div class="cn-flex-auto"></div>
|
||||
<div class="cn-manager-channel"></div>
|
||||
</div>
|
||||
<div class="cn-manager-grid"></div>
|
||||
<div class="cn-manager-selection"></div>
|
||||
<div class="cn-manager-message"></div>
|
||||
<div class="cn-manager-footer">
|
||||
<button class="cn-manager-back">
|
||||
<svg class="arrow-icon" width="14" height="14" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M2 8H18M2 8L8 2M2 8L8 14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
Back
|
||||
</button>
|
||||
<button class="cn-manager-restart">Restart</button>
|
||||
<button class="cn-manager-stop">Stop</button>
|
||||
<div class="cn-flex-auto"></div>
|
||||
<button class="cn-manager-used-in-workflow">Used In Workflow</button>
|
||||
<button class="cn-manager-check-update">Check Update</button>
|
||||
<button class="cn-manager-check-missing">Check Missing</button>
|
||||
<button class="cn-manager-install-url">Install via Git URL</button>
|
||||
<div class="cn-manager cn-manager-dark">
|
||||
<div class="cn-manager-grid"></div>
|
||||
<div class="cn-manager-selection"></div>
|
||||
<div class="cn-manager-message"></div>
|
||||
<div class="cn-manager-footer">
|
||||
<button class="cn-manager-restart p-button p-component">Restart</button>
|
||||
<button class="cn-manager-stop p-button p-component">Stop</button>
|
||||
<div class="cn-flex-auto"></div>
|
||||
<button class="cn-manager-used-in-workflow p-button p-component">Used In Workflow</button>
|
||||
<button class="cn-manager-check-update p-button p-component">Check Update</button>
|
||||
<button class="cn-manager-check-missing p-button p-component">Check Missing</button>
|
||||
<button class="cn-manager-install-url p-button p-component">Install via Git URL</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
@ -89,11 +77,26 @@ export class CustomNodesManager {
|
||||
}
|
||||
|
||||
init() {
|
||||
this.element = $el("div", {
|
||||
parent: document.body,
|
||||
className: "comfy-modal cn-manager"
|
||||
});
|
||||
this.element.innerHTML = pageHtml;
|
||||
const header = $el("div.cn-manager-header.px-2", {}, [
|
||||
// $el("label", {}, [
|
||||
// $el("span", { textContent: "Filter" }),
|
||||
// $el("select.cn-manager-filter")
|
||||
// ]),
|
||||
createSettingsCombo("Filter", $el("select.cn-manager-filter")),
|
||||
$el("input.cn-manager-keywords.p-inputtext.p-component", { type: "search", placeholder: "Search" }),
|
||||
$el("div.cn-manager-status"),
|
||||
$el("div.cn-flex-auto"),
|
||||
$el("div.cn-manager-channel")
|
||||
]);
|
||||
|
||||
const frame = buildGuiFrameCustomHeader(
|
||||
'cn-manager-dialog', // dialog id
|
||||
header, // custom header element
|
||||
pageHtml, // dialog content element
|
||||
this
|
||||
); // send this so we can attach close functions
|
||||
|
||||
this.element = frame;
|
||||
this.element.setAttribute("tabindex", 0);
|
||||
this.element.focus();
|
||||
|
||||
@ -372,7 +375,7 @@ export class CustomNodesManager {
|
||||
|
||||
return list.map(id => {
|
||||
const bt = buttons[id];
|
||||
return `<button class="cn-btn-${id}" group="${action}" mode="${bt.mode}">${bt.label}</button>`;
|
||||
return `<button class="cn-btn-${id} p-button p-component" group="${action}" mode="${bt.mode}">${bt.label}</button>`;
|
||||
}).join("");
|
||||
}
|
||||
|
||||
@ -655,7 +658,6 @@ export class CustomNodesManager {
|
||||
}
|
||||
|
||||
renderGrid() {
|
||||
|
||||
// update theme
|
||||
const globalStyle = window.getComputedStyle(document.body);
|
||||
this.colorVars = {
|
||||
|
||||
@ -82,7 +82,7 @@ def validate_required_fields(entry: Dict, entry_index: int, required_fields: Lis
|
||||
elif isinstance(entry[field], str) and not entry[field].strip():
|
||||
errors.append(f"Field '{field}' is empty")
|
||||
elif field == 'files' and not entry[field]: # Empty array
|
||||
errors.append(f"Field 'files' is empty array")
|
||||
errors.append("Field 'files' is empty array")
|
||||
|
||||
return errors
|
||||
|
||||
|
||||
@ -1,5 +1,105 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "Nynxz",
|
||||
"title": "ComfyUI_DiffsynthPause",
|
||||
"reference": "https://github.com/Nynxz/ComfyUI_DiffsynthPause",
|
||||
"files": [
|
||||
"https://github.com/Nynxz/ComfyUI_DiffsynthPause"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node for controlling Diffsynth checkpoint pausing behavior during image generation workflows. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "binarystatic",
|
||||
"title": "ComfyUI-BinarystaticMasterSeed",
|
||||
"reference": "https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed",
|
||||
"files": [
|
||||
"https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "BinarystaticMasterSeed node for ComfyUI. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "Aruntd008",
|
||||
"title": "[WIP] ComfyUI_SeamlessPattern",
|
||||
"reference": "https://github.com/Aruntd008/ComfyUI_SeamlessPattern",
|
||||
"files": [
|
||||
"https://github.com/Aruntd008/ComfyUI_SeamlessPattern"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "SeamlessPatternNode for ComfyUI. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "SilentLuxRay",
|
||||
"title": "[WIP] ComfyUI-Furrey-Super-Prompt",
|
||||
"reference": "https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt",
|
||||
"files": [
|
||||
"https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A personalized all-in-one node for ComfyUI that simplifies prompt management and LoRA handling with automatic translation to English. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "Rayen21",
|
||||
"title": "[WIP] ComfyUI-PromptLinePlus",
|
||||
"reference": "https://github.com/Rayen21/ComfyUI-PromptLinePlus",
|
||||
"files": [
|
||||
"https://github.com/Rayen21/ComfyUI-PromptLinePlus"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node that splits multi-line prompts by line, enabling batch image generation with each line triggering one execution and supporting custom prompt boxes. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||
},
|
||||
{
|
||||
"author": "ashtar1984",
|
||||
"title": "comfyui-switch-bypass-mute-by-group",
|
||||
"reference": "https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group",
|
||||
"files": [
|
||||
"https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom node for group-based node switching, bypassing, and muting control. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "rookiestar28",
|
||||
"title": "ComfyUI_Security_Audit",
|
||||
"reference": "https://github.com/rookiestar28/ComfyUI_Security_Audit",
|
||||
"files": [
|
||||
"https://github.com/rookiestar28/ComfyUI_Security_Audit"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A lightweight, dual-layer security extension for ComfyUI using AST-based static analysis and runtime monitoring to detect malicious code in custom nodes."
|
||||
},
|
||||
{
|
||||
"author": "c1660181647-hash",
|
||||
"title": "ComfyUI-MM-Visual-Encryption",
|
||||
"reference": "https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption",
|
||||
"files": [
|
||||
"https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A visual noise encryption custom node for ComfyUI, supporting Image and Video privacy protection."
|
||||
},
|
||||
{
|
||||
"author": "charlierz",
|
||||
"title": "comfyui-charlierz",
|
||||
"reference": "https://github.com/charlierz/comfyui-charlierz",
|
||||
"files": [
|
||||
"https://github.com/charlierz/comfyui-charlierz"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "NODES: BackgroundColor, ScaleDimensions"
|
||||
},
|
||||
{
|
||||
"author": "lrzjason",
|
||||
"title": "Comfyui-DiffusersUtils [WIP]",
|
||||
"reference": "https://github.com/lrzjason/Comfyui-DiffusersUtils",
|
||||
"files": [
|
||||
"https://github.com/lrzjason/Comfyui-DiffusersUtils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of nodes which provide flexible inference using diffusers in comfyui env. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "anilstream",
|
||||
"title": "ComfyUI-NanoBananaPro",
|
||||
|
||||
@ -985,6 +985,14 @@
|
||||
"title_aux": "comfyui-face-remap [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Aruntd008/ComfyUI_SeamlessPattern": [
|
||||
[
|
||||
"SeamlessPatternNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "[WIP] ComfyUI_SeamlessPattern"
|
||||
}
|
||||
],
|
||||
"https://github.com/Aruntd008/ComfyUI_blender_render": [
|
||||
[
|
||||
"Blender Render Node",
|
||||
@ -3438,6 +3446,14 @@
|
||||
"title_aux": "ComfyUI-NVVS [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Nynxz/ComfyUI_DiffsynthPause": [
|
||||
[
|
||||
"nynxz.Patch.ZImageDiffsynthControlnetPause"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_DiffsynthPause"
|
||||
}
|
||||
],
|
||||
"https://github.com/OSAnimate/ComfyUI-SpriteSheetMaker": [
|
||||
[
|
||||
"ImageGridNode",
|
||||
@ -3848,6 +3864,14 @@
|
||||
"title_aux": "Comfyui-Koi-Toolkit"
|
||||
}
|
||||
],
|
||||
"https://github.com/Rayen21/ComfyUI-PromptLinePlus": [
|
||||
[
|
||||
"PromptLinePlus"
|
||||
],
|
||||
{
|
||||
"title_aux": "[WIP] ComfyUI-PromptLinePlus"
|
||||
}
|
||||
],
|
||||
"https://github.com/RicherdLee/comfyui-oss-image-save": [
|
||||
[
|
||||
"SaveImageOSS"
|
||||
@ -4117,6 +4141,14 @@
|
||||
"title_aux": "ComfyUI-Shinsplat [UNSAFE]"
|
||||
}
|
||||
],
|
||||
"https://github.com/SilentLuxRay/ComfyUI-Furrey-Super-Prompt": [
|
||||
[
|
||||
"FurreySuperPrompt"
|
||||
],
|
||||
{
|
||||
"title_aux": "[WIP] ComfyUI-Furrey-Super-Prompt"
|
||||
}
|
||||
],
|
||||
"https://github.com/SirVeggie/comfyui-sv-nodes": [
|
||||
[
|
||||
"SV-AccumulateNode",
|
||||
@ -5681,6 +5713,14 @@
|
||||
"title_aux": "ComfyUI_MoreComfy"
|
||||
}
|
||||
],
|
||||
"https://github.com/ashtar1984/comfyui-switch-bypass-mute-by-group": [
|
||||
[
|
||||
"SwitchBypassMute"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-switch-bypass-mute-by-group"
|
||||
}
|
||||
],
|
||||
"https://github.com/avocadori/ComfyUI-AudioAmplitudeConverter": [
|
||||
[
|
||||
"NormalizeAmpToFloatNode"
|
||||
@ -5849,6 +5889,14 @@
|
||||
"title_aux": "Comfyui_AudioRecoder"
|
||||
}
|
||||
],
|
||||
"https://github.com/binarystatic/ComfyUI-BinarystaticMasterSeed": [
|
||||
[
|
||||
"BinarystaticMasterSeed"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-BinarystaticMasterSeed"
|
||||
}
|
||||
],
|
||||
"https://github.com/birnam/ComfyUI-GenData-Pack": [
|
||||
[
|
||||
"Checkpoint From String \ud83d\udc69\u200d\ud83d\udcbb",
|
||||
@ -6168,6 +6216,17 @@
|
||||
"title_aux": "ComfyUI_FMJ [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/c1660181647-hash/ComfyUI-MM-Visual-Encryption": [
|
||||
[
|
||||
"MM_Image_Decrypt",
|
||||
"MM_Image_Encrypt",
|
||||
"MM_Video_Decrypt",
|
||||
"MM_Video_Encrypt"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-MM-Visual-Encryption"
|
||||
}
|
||||
],
|
||||
"https://github.com/casterpollux/ComfyUI-USO": [
|
||||
[
|
||||
"USOImageEncoder",
|
||||
@ -6260,6 +6319,15 @@
|
||||
"title_aux": "ComfyUI-mobvoi-openapi"
|
||||
}
|
||||
],
|
||||
"https://github.com/charlierz/comfyui-charlierz": [
|
||||
[
|
||||
"BackgroundColor",
|
||||
"ScaleDimensions"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-charlierz"
|
||||
}
|
||||
],
|
||||
"https://github.com/chengzeyi/Comfy-WaveSpeed": [
|
||||
[
|
||||
"ApplyFBCacheOnModel",
|
||||
@ -6501,6 +6569,7 @@
|
||||
"GeminiImageNode",
|
||||
"GeminiInputFiles",
|
||||
"GeminiNode",
|
||||
"GenerateTracks",
|
||||
"GetImageSize",
|
||||
"GetVideoComponents",
|
||||
"GrowMask",
|
||||
@ -6556,6 +6625,7 @@
|
||||
"KlingDualCharacterVideoEffectNode",
|
||||
"KlingImage2VideoNode",
|
||||
"KlingImageGenerationNode",
|
||||
"KlingImageToVideoWithAudio",
|
||||
"KlingLipSyncAudioToVideoNode",
|
||||
"KlingLipSyncTextToVideoNode",
|
||||
"KlingOmniProEditVideoNode",
|
||||
@ -6567,6 +6637,7 @@
|
||||
"KlingSingleImageVideoEffectNode",
|
||||
"KlingStartEndFrameNode",
|
||||
"KlingTextToVideoNode",
|
||||
"KlingTextToVideoWithAudio",
|
||||
"KlingVideoExtendNode",
|
||||
"KlingVirtualTryOnNode",
|
||||
"LTXVAddGuide",
|
||||
@ -6927,6 +6998,10 @@
|
||||
"WanImageToImageApi",
|
||||
"WanImageToVideo",
|
||||
"WanImageToVideoApi",
|
||||
"WanMoveConcatTrack",
|
||||
"WanMoveTrackToVideo",
|
||||
"WanMoveTracksFromCoords",
|
||||
"WanMoveVisualizeTracks",
|
||||
"WanPhantomSubjectToVideo",
|
||||
"WanSoundImageToVideo",
|
||||
"WanSoundImageToVideoExtend",
|
||||
@ -8033,6 +8108,7 @@
|
||||
],
|
||||
"https://github.com/grokuku/ComfyUI-Holaf": [
|
||||
[
|
||||
"HolafBypasser",
|
||||
"HolafImageComparer",
|
||||
"HolafInstagramResize",
|
||||
"HolafKSampler",
|
||||
@ -8041,6 +8117,7 @@
|
||||
"HolafMaskToBoolean",
|
||||
"HolafOverlayNode",
|
||||
"HolafRatioCalculator",
|
||||
"HolafRemote",
|
||||
"HolafResolutionPreset",
|
||||
"HolafSaveImage",
|
||||
"HolafTiledKSampler",
|
||||
@ -8991,6 +9068,9 @@
|
||||
"AudioResampler",
|
||||
"CollectKeyedVideosNode",
|
||||
"CollectVideosNode",
|
||||
"ConformAudio",
|
||||
"ConformVideo",
|
||||
"ExtendVideoNearestFrame",
|
||||
"ImageDelay",
|
||||
"IntToString",
|
||||
"KlingVideoHandler",
|
||||
@ -9001,7 +9081,6 @@
|
||||
"StringSplitSelect",
|
||||
"Unbroken-Video-Handler",
|
||||
"VideoHandler",
|
||||
"VideoSanitizer",
|
||||
"WorkflowLoggerNode"
|
||||
],
|
||||
{
|
||||
@ -9726,6 +9805,27 @@
|
||||
"title_aux": "Comfyui-Condition-Utils [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/lrzjason/Comfyui-DiffusersUtils": [
|
||||
[
|
||||
"DiffusersImageEditGenerator",
|
||||
"DiffusersImageGenerator",
|
||||
"DiffusersLoraLoader",
|
||||
"DiffusersLoraUnloader",
|
||||
"DiffusersModelLoader",
|
||||
"DiffusersPipelineBuilder",
|
||||
"DiffusersPreprocessorLoader",
|
||||
"DiffusersTextEncoderLoader",
|
||||
"DiffusersTokenizerLoader",
|
||||
"DiffusersTransformerLoader",
|
||||
"DiffusersVAELoader",
|
||||
"TextEncodeDiffusersLongCat",
|
||||
"TextEncodeDiffusersLongCatCached",
|
||||
"TextEncodeDiffusersLongCatImageEdit"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-DiffusersUtils [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/ltdrdata/ComfyUI-Workflow-Component": [
|
||||
[
|
||||
"ComboToString",
|
||||
@ -11291,6 +11391,15 @@
|
||||
"title_aux": "comfyui-plus-integrations [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/rookiestar28/ComfyUI_Security_Audit": [
|
||||
[
|
||||
"ComfyUI_Node_Audit",
|
||||
"ComfyUI_Security_Audit"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Security_Audit"
|
||||
}
|
||||
],
|
||||
"https://github.com/rossturk/comfyui-primitive-mesh": [
|
||||
[
|
||||
"PrimitiveMeshNode"
|
||||
@ -11658,14 +11767,9 @@
|
||||
],
|
||||
"https://github.com/slezica/comfyui-personal": [
|
||||
[
|
||||
"CLIPTextEncodeVar",
|
||||
"FillMask",
|
||||
"GenerateImage",
|
||||
"MaskBatch",
|
||||
"OwlDetector",
|
||||
"RepeatMaskBatch",
|
||||
"SliceImageBatch",
|
||||
"SliceMaskBatch",
|
||||
"ScaleSigmas",
|
||||
"UpscaleImage",
|
||||
"UseCheckpoint",
|
||||
"UseControlNet",
|
||||
@ -11697,6 +11801,7 @@
|
||||
"DandyCss",
|
||||
"DandyCssLoader",
|
||||
"DandyEditorSettings",
|
||||
"DandyFloat",
|
||||
"DandyFloatCollector",
|
||||
"DandyFloatPreview",
|
||||
"DandyFloatSplitter",
|
||||
@ -11704,6 +11809,7 @@
|
||||
"DandyHtml",
|
||||
"DandyHtmlLoader",
|
||||
"DandyImageCollector",
|
||||
"DandyInt",
|
||||
"DandyIntCollector",
|
||||
"DandyIntPreview",
|
||||
"DandyIntSplitter",
|
||||
@ -12855,6 +12961,8 @@
|
||||
"XishenPromptEditNode",
|
||||
"XishenRandomIntegerNode",
|
||||
"XishenRemoveEmptyLinesNode",
|
||||
"XishenShutdownTimerAdvanced",
|
||||
"XishenShutdownTimerNode",
|
||||
"XishenSmartDisplayNode",
|
||||
"XishenThemePromptNode",
|
||||
"\ud83c\udf49Image-\u9897\u7c92\u8d28\u611f",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,15 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "cdanielp",
|
||||
"title": "COMFYUI_PROMPTMODELS [REMOVED]",
|
||||
"reference": "https://github.com/cdanielp/COMFYUI_PROMPTMODELS",
|
||||
"files": [
|
||||
"https://github.com/cdanielp/COMFYUI_PROMPTMODELS"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom nodes for ComfyUI by PROMPTMODELS."
|
||||
},
|
||||
{
|
||||
"author": "mcrataobrabo",
|
||||
"title": "comfyui-smart-lora-downloader - Automatically Fetch Missing LoRAs [REMOVED]",
|
||||
|
||||
@ -1,5 +1,198 @@
|
||||
{
|
||||
"custom_nodes": [
|
||||
{
|
||||
"author": "TuonoMindCode",
|
||||
"title": "ComfyUI-Resolution-Suggest-Downscale",
|
||||
"reference": "https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale",
|
||||
"files": [
|
||||
"https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Resolution suggestion and downscale helper node for ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "dcyd-lun",
|
||||
"title": "ComfyUI_text_diff",
|
||||
"reference": "https://github.com/dcyd-lun/ComfyUI_text_diff",
|
||||
"files": [
|
||||
"https://github.com/dcyd-lun/ComfyUI_text_diff"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Compare two texts with GitHub/GitLab-style diff highlighting in ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "SKFRMSEHF",
|
||||
"title": "SK-ComfyUI-FolderingLoader",
|
||||
"id": "skloader",
|
||||
"reference": "https://github.com/SKFRMSEHF/comfyui_SK_Loader",
|
||||
"files": [
|
||||
"https://github.com/SKFRMSEHF/comfyui_SK_Loader"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unified loader nodes with folder organization support for checkpoints, LoRA, VAE, and diffusion models"
|
||||
},
|
||||
{
|
||||
"author": "drawthingsai",
|
||||
"title": "draw-things-comfyui",
|
||||
"reference": "https://github.com/drawthingsai/draw-things-comfyui",
|
||||
"files": [
|
||||
"https://github.com/drawthingsai/draw-things-comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The official Draw Things extension for ComfyUI. Sends image-generation requests to Draw Things over gRPC. Supports Bridge Mode for DT+ cloud and local model execution."
|
||||
},
|
||||
{
|
||||
"author": "darrell-goh",
|
||||
"title": "ComfyUI-NanoBanana_node",
|
||||
"reference": "https://github.com/darrell-goh/ComfyUI-NanoBanana_node",
|
||||
"files": [
|
||||
"https://github.com/darrell-goh/ComfyUI-NanoBanana_node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI that allows you to interact with Nano Banana's Vertex API proxy, providing access to Gemini models with dynamic image inputs."
|
||||
},
|
||||
{
|
||||
"author": "This-is-Uncut",
|
||||
"title": "Custom-Node-ComfyUI-NBP-Uncut",
|
||||
"reference": "https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut",
|
||||
"files": [
|
||||
"https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Node to use NBP with custom API key to improve data privacy control."
|
||||
},
|
||||
{
|
||||
"author": "princepainter",
|
||||
"title": "Comfyui-PainterAudioLength",
|
||||
"reference": "https://github.com/princepainter/Comfyui-PainterAudioLength",
|
||||
"files": [
|
||||
"https://github.com/princepainter/Comfyui-PainterAudioLength"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A tool for calculating audio duration that takes audio input and outputs the audio length as a floating-point number. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "akaugun",
|
||||
"title": "comfyui-lora-hook-trigger",
|
||||
"reference": "https://github.com/akaugun/comfyui-lora-hook-trigger",
|
||||
"files": [
|
||||
"https://github.com/akaugun/comfyui-lora-hook-trigger"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A clean and simple ComfyUI custom node that creates a LoRA Hook and automatically finds and loads trigger TXT files placed in a folder named after the LoRA file."
|
||||
},
|
||||
{
|
||||
"author": "tumbowungus",
|
||||
"title": "MultiMaskCouple",
|
||||
"reference": "https://github.com/tumbowungus/MultiMaskCouple",
|
||||
"files": [
|
||||
"https://github.com/tumbowungus/MultiMaskCouple"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI which simplifies the process of masking multiple prompts, making it easier to manage scenes with multiple distinct characters."
|
||||
},
|
||||
{
|
||||
"author": "fudosanit",
|
||||
"title": "ComfyUI-Random-Resolution",
|
||||
"reference": "https://github.com/fudosanit/ComfyUI-Random-Resolution",
|
||||
"files": [
|
||||
"https://github.com/fudosanit/ComfyUI-Random-Resolution"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A custom node for ComfyUI. Based on the specified resolution, it randomly selects and outputs one of three patterns: original orientation, swapped width/height, or a square format. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "SuLU-K",
|
||||
"title": "comfyui-easy-sam3-tools",
|
||||
"reference": "https://github.com/SuLU-K/comfyui-easy-sam3-tools",
|
||||
"files": [
|
||||
"https://github.com/SuLU-K/comfyui-easy-sam3-tools"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom nodes for building SAM3-centric editing pipelines inside ComfyUI, featuring mask merging, bounding box rendering, and DOM-based interactive editing. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "EMkrtchyan",
|
||||
"title": "ComfyUI-NormalsToDepth",
|
||||
"reference": "https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth",
|
||||
"files": [
|
||||
"https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Converts normal maps to depth maps for use in ComfyUI. (Description by CC)"
|
||||
},
|
||||
|
||||
{
|
||||
"author": "jeankassio",
|
||||
"title": "JK AceStep Nodes",
|
||||
"id": "JK-AceStep-Nodes",
|
||||
"reference": "https://github.com/jeankassio/JK-AceStep-Nodes",
|
||||
"files": [
|
||||
"https://github.com/jeankassio/JK-AceStep-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced nodes optimized for ACE-Step audio generation in ComfyUI."
|
||||
},
|
||||
{
|
||||
"author": "a-und-b",
|
||||
"title": "ComfyUI_AB_Wildcard",
|
||||
"reference": "https://github.com/a-und-b/ComfyUI_AB_Wildcard",
|
||||
"files": [
|
||||
"https://github.com/a-und-b/ComfyUI_AB_Wildcard"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple node for advanced wildcard text processing. Supports variables, conditionals, tag aggregation, weighted selection, and deep nesting. Lightweight, fast, zero external dependencies."
|
||||
},
|
||||
{
|
||||
"author": "RamonGuthrie",
|
||||
"title": "ComfyUI-RBG-SmartSeedVariance",
|
||||
"reference": "https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance",
|
||||
"files": [
|
||||
"https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Advanced seed diversity enhancement for ComfyUI with intelligent noise injection and directional biasing."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-NvidiaCaptioner",
|
||||
"reference": "https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner",
|
||||
"files": [
|
||||
"https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A ComfyUI node for generating rich, detailed captions for images using NVIDIA's vision models. Supports batch processing, multiple captioning styles, and includes built-in caching for efficient workflows."
|
||||
},
|
||||
{
|
||||
"author": "theshubzworld",
|
||||
"title": "ComfyUI-Universal-Latent",
|
||||
"reference": "https://github.com/theshubzworld/ComfyUI-Universal-Latent",
|
||||
"files": [
|
||||
"https://github.com/theshubzworld/ComfyUI-Universal-Latent"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Enhanced empty latent node with extended aspect ratio support for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "lrzjason",
|
||||
"title": "Comfyui-LatentUtils",
|
||||
"reference": "https://github.com/lrzjason/Comfyui-LatentUtils",
|
||||
"files": [
|
||||
"https://github.com/lrzjason/Comfyui-LatentUtils"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Custom ComfyUI node performing selective latent denoising and detail enhancement using Fourier Transform (FFT) to separate and enhance image frequencies while suppressing noise. (Description by CC)"
|
||||
},
|
||||
{
|
||||
"author": "aTanguay",
|
||||
"title": "ComfyUI_Detonate",
|
||||
"reference": "https://github.com/aTanguay/ComfyUI_Detonate",
|
||||
"files": [
|
||||
"https://github.com/aTanguay/ComfyUI_Detonate"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Professional compositing nodes for ComfyUI - bringing Nuke and Fusion workflows to AI-powered image generation"
|
||||
},
|
||||
{
|
||||
"author": "huihuihuiz",
|
||||
"title": "LoRA Downloader for ComfyUI",
|
||||
@ -640,58 +833,6 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ShakaNodes: Utility tools for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "Matthew-X",
|
||||
"title": "Workflow Importer",
|
||||
"id": "comfyui-workflow_importer",
|
||||
"reference": "https://github.com/Matthew-X/comfyui-workflow_importer",
|
||||
"files": [
|
||||
"https://github.com/Matthew-X/comfyui-workflow_importer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"js_path": "workflow_importer",
|
||||
"description": "Import ComfyUI workflows from images with embedded metadata. Adds a toolbar Import button, drag-and-drop dialog and Ctrl+Shift+I shortcut. Supports legacy and new UIs, common image formats, opens each image in a new workflow tab."
|
||||
},
|
||||
{
|
||||
"author": "ameyukisora",
|
||||
"title": "ComfyUI Empty Latent Advanced",
|
||||
"reference": "https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced",
|
||||
"files": [
|
||||
"https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "An advanced Empty Latent selector with visual presets and foldable UI."
|
||||
},
|
||||
{
|
||||
"author": "KLL535",
|
||||
"title": "ComfyUI_Simple_Qwen3-VL-gguf",
|
||||
"reference": "https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf",
|
||||
"files": [
|
||||
"https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Simple Qwen3-VL gguf LLM model loader"
|
||||
},
|
||||
{
|
||||
"author": "sirouk",
|
||||
"title": "chutes-comfyui-node",
|
||||
"reference": "https://github.com/sirouk/chutes-comfyui-node",
|
||||
"files": [
|
||||
"https://github.com/sirouk/chutes-comfyui-node"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI custom nodes for Chutes.ai video generation API"
|
||||
},
|
||||
{
|
||||
"author": "1038lab",
|
||||
"title": "ComfyUI-QwenVL",
|
||||
"reference": "https://github.com/1038lab/ComfyUI-QwenVL",
|
||||
"files": [
|
||||
"https://github.com/1038lab/ComfyUI-QwenVL"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI-QwenVL custom node: Integrates the Qwen-VL series, including Qwen2.5-VL and the latest Qwen3-VL, to enable advanced multimodal AI for text generation, image understanding, and video analysis."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -238,7 +238,8 @@
|
||||
],
|
||||
"https://github.com/1038lab/ComfyUI-VoxCPMTTS": [
|
||||
[
|
||||
"AILab_VoxCPMTTS"
|
||||
"AILab_VoxCPMTTS",
|
||||
"AILab_VoxCPMTTS_Advanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-VoxCPMTTS"
|
||||
@ -3836,6 +3837,14 @@
|
||||
"title_aux": "FitDiT[official] - High-fidelity Virtual Try-on"
|
||||
}
|
||||
],
|
||||
"https://github.com/Braeden90000/comfyui-load-image-url": [
|
||||
[
|
||||
"LoadImageFileOrURL"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI Load Image URL"
|
||||
}
|
||||
],
|
||||
"https://github.com/Brekel/ComfyUI-Brekel": [
|
||||
[
|
||||
"BrekelAutoPromptGenerator",
|
||||
@ -6232,6 +6241,16 @@
|
||||
"title_aux": "Duanyll Nodepack"
|
||||
}
|
||||
],
|
||||
"https://github.com/EMkrtchyan/ComfyUI-NormalsToDepth": [
|
||||
[
|
||||
"DepthMathCombiner",
|
||||
"FrankotChellappa",
|
||||
"PoissonReconstruction"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NormalsToDepth"
|
||||
}
|
||||
],
|
||||
"https://github.com/Eagle-CN/ComfyUI-Addoor": [
|
||||
[
|
||||
"AD_AnyFileList",
|
||||
@ -7309,8 +7328,11 @@
|
||||
"https://github.com/FeiMao-326/Comfyui-General-API-Node": [
|
||||
[
|
||||
"FeiMao_326_GeneralAPINode",
|
||||
"FeiMao_326_GetListElement",
|
||||
"FeiMao_326_JsonParser",
|
||||
"FeiMao_326_TextBatchReplace",
|
||||
"FeiMao_326_TextIterator",
|
||||
"FeiMao_326_TextSplitByDelimiter",
|
||||
"ShowTextNode",
|
||||
"SimpleTextNode"
|
||||
],
|
||||
@ -10595,10 +10617,18 @@
|
||||
"JAX_EasyPrompt",
|
||||
"JAX_EasyPromptSimple",
|
||||
"JAX_ImageSizeMultiplier",
|
||||
"JAX_KritaCanvas",
|
||||
"JAX_KritaImageLayer",
|
||||
"JAX_KritaMaskLayer",
|
||||
"JAX_KritaOutput",
|
||||
"JAX_KritaPipeIn",
|
||||
"JAX_KritaResizeCanvas",
|
||||
"JAX_KritaSelection",
|
||||
"JAX_KritaSendText",
|
||||
"JAX_KritaStrength",
|
||||
"JAX_SamplerPipeOut"
|
||||
"JAX_KritaStyle",
|
||||
"JAX_Parameter",
|
||||
"JAX_SamplerPipeOut",
|
||||
"JAX_SendImageWebSocket"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Jax-Nodes"
|
||||
@ -13004,6 +13034,19 @@
|
||||
"title_aux": "ComfyUI-Lightx2vWrapper"
|
||||
}
|
||||
],
|
||||
"https://github.com/Moeblack/ComfyUI-SimpleChat": [
|
||||
[
|
||||
"GeminiImageEdit",
|
||||
"GeminiImageGen",
|
||||
"SimpleChatConfig",
|
||||
"SimpleChatImage",
|
||||
"SimpleChatNoASS",
|
||||
"SimpleChatText"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-SimpleChat"
|
||||
}
|
||||
],
|
||||
"https://github.com/MohammadAboulEla/ComfyUI-iTools": [
|
||||
[
|
||||
"iToolsAddOverlay",
|
||||
@ -13941,6 +13984,7 @@
|
||||
],
|
||||
"https://github.com/Nynxz/ComfyUI-NynxzNodes": [
|
||||
[
|
||||
"nynxz.CompareVideo.Options",
|
||||
"nynxz.Create.CompareVideo.Fade",
|
||||
"nynxz.Create.CompareVideo.Wipe",
|
||||
"nynxz.Parse.StringTemplate"
|
||||
@ -14900,6 +14944,14 @@
|
||||
"title_aux": "ComfyUI-RBG-ImageStitchPlus"
|
||||
}
|
||||
],
|
||||
"https://github.com/RamonGuthrie/ComfyUI-RBG-SmartSeedVariance": [
|
||||
[
|
||||
"RBG_Smart_Seed_Variance"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-RBG-SmartSeedVariance"
|
||||
}
|
||||
],
|
||||
"https://github.com/Randy420Marsh/civitai-api-url-resolver": [
|
||||
[
|
||||
"CivitaiShareToDirectURL"
|
||||
@ -15463,6 +15515,19 @@
|
||||
"title_aux": "ComfyUI SKBundle"
|
||||
}
|
||||
],
|
||||
"https://github.com/SKFRMSEHF/comfyui_SK_Loader": [
|
||||
[
|
||||
"SK_CheckpointLoader",
|
||||
"SK_CheckpointLoaderSimple",
|
||||
"SK_LoraLoader",
|
||||
"SK_UNETLoader",
|
||||
"SK_VAELoader",
|
||||
"SK_unCLIPCheckpointLoader"
|
||||
],
|
||||
{
|
||||
"title_aux": "SK-ComfyUI-FolderingLoader"
|
||||
}
|
||||
],
|
||||
"https://github.com/SLAPaper/ComfyUI-Image-Selector": [
|
||||
[
|
||||
"ImageDuplicator",
|
||||
@ -16279,10 +16344,12 @@
|
||||
"BboxSplit",
|
||||
"Cascade",
|
||||
"ImageFilters",
|
||||
"LMS_VisionController",
|
||||
"Luts",
|
||||
"LutsAdvanced",
|
||||
"RemoveAreaByMask",
|
||||
"RemoveBackground",
|
||||
"RemoveNoise",
|
||||
"SeedGenerator",
|
||||
"Waifu2x"
|
||||
],
|
||||
@ -16655,6 +16722,10 @@
|
||||
"https://github.com/ShootTheSound/comfyUI-Realtime-Lora": [
|
||||
[
|
||||
"ApplyTrainedLora",
|
||||
"MusubiQwenImageEditLoraTrainer",
|
||||
"MusubiQwenImageLoraTrainer",
|
||||
"MusubiWanLoraTrainer",
|
||||
"MusubiZImageLoraTrainer",
|
||||
"RealtimeLoraTrainer",
|
||||
"SD15LoraTrainer",
|
||||
"SDXLLoraTrainer"
|
||||
@ -17701,6 +17772,17 @@
|
||||
"title_aux": "ComfyUI DINO-X Detector Node"
|
||||
}
|
||||
],
|
||||
"https://github.com/SuLU-K/comfyui-easy-sam3-tools": [
|
||||
[
|
||||
"Sam3DrawBBox",
|
||||
"Sam3InteractiveBBoxEditor",
|
||||
"Sam3MaskRangeSelector",
|
||||
"SimpleMultiple"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-easy-sam3-tools"
|
||||
}
|
||||
],
|
||||
"https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": [
|
||||
[
|
||||
"Deflicker",
|
||||
@ -18570,6 +18652,14 @@
|
||||
"title_aux": "ComfyUI-Unprompted"
|
||||
}
|
||||
],
|
||||
"https://github.com/This-is-Uncut/Custom-Node-ComfyUI-NBP-Uncut": [
|
||||
[
|
||||
"NanoBananaProNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "Custom-Node-ComfyUI-NBP-Uncut"
|
||||
}
|
||||
],
|
||||
"https://github.com/ThunderBolt4931/comfyui_pixel_forge": [
|
||||
[
|
||||
"ConcatenateBatchHorizontally",
|
||||
@ -18923,6 +19013,14 @@
|
||||
"title_aux": "ComfyUI-MultiClip-Text-Script"
|
||||
}
|
||||
],
|
||||
"https://github.com/TuonoMindCode/ComfyUI-Resolution-Suggest-Downscale": [
|
||||
[
|
||||
"TuonoResolutionSuggestDownscale"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Resolution-Suggest-Downscale"
|
||||
}
|
||||
],
|
||||
"https://github.com/TuriSc/comfyui-text-line-selector": [
|
||||
[
|
||||
"TextLineSelectorNode"
|
||||
@ -20855,6 +20953,14 @@
|
||||
"title_aux": "Save Checkpoint with Metadata"
|
||||
}
|
||||
],
|
||||
"https://github.com/a-und-b/ComfyUI_AB_Wildcard": [
|
||||
[
|
||||
"ABWildcardNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_AB_Wildcard"
|
||||
}
|
||||
],
|
||||
"https://github.com/a-und-b/ComfyUI_Delay": [
|
||||
[
|
||||
"Add Delay"
|
||||
@ -20917,6 +21023,60 @@
|
||||
"title_aux": "ComfyUI-AudioScheduler"
|
||||
}
|
||||
],
|
||||
"https://github.com/aTanguay/ComfyUI_Detonate": [
|
||||
[
|
||||
"DetonateBlur",
|
||||
"DetonateChannelCopy",
|
||||
"DetonateChromaKeyer",
|
||||
"DetonateClamp",
|
||||
"DetonateColorCorrect",
|
||||
"DetonateColorCurves",
|
||||
"DetonateConstant",
|
||||
"DetonateCornerPin",
|
||||
"DetonateCrop",
|
||||
"DetonateCryptomatteExtract",
|
||||
"DetonateDefocus",
|
||||
"DetonateDenoise",
|
||||
"DetonateDilate",
|
||||
"DetonateDisplacementMap",
|
||||
"DetonateEdgeDefringe",
|
||||
"DetonateEdgeDetect",
|
||||
"DetonateErode",
|
||||
"DetonateExposure",
|
||||
"DetonateGlow",
|
||||
"DetonateGrade",
|
||||
"DetonateGrain",
|
||||
"DetonateGridWarp",
|
||||
"DetonateHueSatVal",
|
||||
"DetonateInvert",
|
||||
"DetonateLUT",
|
||||
"DetonateLoadEXR",
|
||||
"DetonateLumaKeyer",
|
||||
"DetonateLumaKeyerSimple",
|
||||
"DetonateMaskFromColor",
|
||||
"DetonateMaskSmoother",
|
||||
"DetonateMatteControl",
|
||||
"DetonateMerge",
|
||||
"DetonateNoise",
|
||||
"DetonatePremultiply",
|
||||
"DetonateRamp",
|
||||
"DetonateRotoBezier",
|
||||
"DetonateRotoBezierFromImage",
|
||||
"DetonateSaturation",
|
||||
"DetonateSeamBlender",
|
||||
"DetonateSharpen",
|
||||
"DetonateShuffle",
|
||||
"DetonateTransform",
|
||||
"DetonateTriMapGenerator",
|
||||
"DetonateUnpremultiply",
|
||||
"DetonateVignette",
|
||||
"DetonateZDefocus",
|
||||
"DetonateZMerge"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Detonate"
|
||||
}
|
||||
],
|
||||
"https://github.com/abdozmantar/ComfyUI-DeepExtract": [
|
||||
[
|
||||
"VocalAndSoundRemoverNode"
|
||||
@ -21780,6 +21940,14 @@
|
||||
"title_aux": "ComfyUI-X-Portrait-Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/akaugun/comfyui-lora-hook-trigger": [
|
||||
[
|
||||
"LoraTriggerWithExample"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-lora-hook-trigger"
|
||||
}
|
||||
],
|
||||
"https://github.com/akawana/ComfyUI-Folded-Prompts": [
|
||||
[
|
||||
"FPFoldedPrompts",
|
||||
@ -22492,6 +22660,7 @@
|
||||
"EdgeWearMaskGenerator",
|
||||
"EmbedAlpha",
|
||||
"EmissionMaskGenerator",
|
||||
"FrankenMapExtractor",
|
||||
"FrequencyRecombine",
|
||||
"FrequencySeparation",
|
||||
"GammaAdjust",
|
||||
@ -22511,6 +22680,7 @@
|
||||
"MultiTextureBlender",
|
||||
"NormalConverter",
|
||||
"NormalFormatAuto",
|
||||
"NormalFormatBruteForce",
|
||||
"NormalFormatValidator",
|
||||
"NormalIntensity",
|
||||
"NormalMapCombiner",
|
||||
@ -22550,6 +22720,8 @@
|
||||
"TranslucencyMapGenerator",
|
||||
"TriplanarProjection",
|
||||
"UVCheckerGenerator",
|
||||
"UpscaleCalculator",
|
||||
"UpscaleToResolution",
|
||||
"WearGenerator"
|
||||
],
|
||||
{
|
||||
@ -25290,25 +25462,6 @@
|
||||
"title_aux": "comfyui-azul-scripts"
|
||||
}
|
||||
],
|
||||
"https://github.com/cdanielp/COMFYUI_PROMPTMODELS": [
|
||||
[
|
||||
"ClearCacheNode",
|
||||
"GetFrameByIndex",
|
||||
"GetLastFrame",
|
||||
"GetNode",
|
||||
"ListCacheNode",
|
||||
"PromptInfo",
|
||||
"PromptModelLoader",
|
||||
"PromptRefiner",
|
||||
"SetNode",
|
||||
"SetNodeNamed",
|
||||
"UnetLoaderGGUF",
|
||||
"UnetLoaderGGUFAdvanced"
|
||||
],
|
||||
{
|
||||
"title_aux": "COMFYUI_PROMPTMODELS"
|
||||
}
|
||||
],
|
||||
"https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": [
|
||||
[
|
||||
"BOPBTL_BlendFaces",
|
||||
@ -27390,6 +27543,7 @@
|
||||
"GeminiImageNode",
|
||||
"GeminiInputFiles",
|
||||
"GeminiNode",
|
||||
"GenerateTracks",
|
||||
"GetImageSize",
|
||||
"GetVideoComponents",
|
||||
"GrowMask",
|
||||
@ -27445,6 +27599,7 @@
|
||||
"KlingDualCharacterVideoEffectNode",
|
||||
"KlingImage2VideoNode",
|
||||
"KlingImageGenerationNode",
|
||||
"KlingImageToVideoWithAudio",
|
||||
"KlingLipSyncAudioToVideoNode",
|
||||
"KlingLipSyncTextToVideoNode",
|
||||
"KlingOmniProEditVideoNode",
|
||||
@ -27456,6 +27611,7 @@
|
||||
"KlingSingleImageVideoEffectNode",
|
||||
"KlingStartEndFrameNode",
|
||||
"KlingTextToVideoNode",
|
||||
"KlingTextToVideoWithAudio",
|
||||
"KlingVideoExtendNode",
|
||||
"KlingVirtualTryOnNode",
|
||||
"LTXVAddGuide",
|
||||
@ -27816,6 +27972,10 @@
|
||||
"WanImageToImageApi",
|
||||
"WanImageToVideo",
|
||||
"WanImageToVideoApi",
|
||||
"WanMoveConcatTrack",
|
||||
"WanMoveTrackToVideo",
|
||||
"WanMoveTracksFromCoords",
|
||||
"WanMoveVisualizeTracks",
|
||||
"WanPhantomSubjectToVideo",
|
||||
"WanSoundImageToVideo",
|
||||
"WanSoundImageToVideoExtend",
|
||||
@ -28717,6 +28877,14 @@
|
||||
"title_aux": "DarkPrompts"
|
||||
}
|
||||
],
|
||||
"https://github.com/darrell-goh/ComfyUI-NanoBanana_node": [
|
||||
[
|
||||
"NanoBananaNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NanoBanana_node"
|
||||
}
|
||||
],
|
||||
"https://github.com/darth-veitcher/comfydv": [
|
||||
[
|
||||
"CircuitBreaker",
|
||||
@ -28962,6 +29130,14 @@
|
||||
"title_aux": "comfyui_facetools"
|
||||
}
|
||||
],
|
||||
"https://github.com/dcyd-lun/ComfyUI_text_diff": [
|
||||
[
|
||||
"TextDiff"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_text_diff"
|
||||
}
|
||||
],
|
||||
"https://github.com/denfrost/Den_ComfyUI_Workflow": [
|
||||
[
|
||||
"Den_CropImage_AS",
|
||||
@ -29452,6 +29628,22 @@
|
||||
"title_aux": "ComfyUI_Dragos_Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/drawthingsai/draw-things-comfyui": [
|
||||
[
|
||||
"DrawThingsControlNet",
|
||||
"DrawThingsHints",
|
||||
"DrawThingsLoRA",
|
||||
"DrawThingsNegative",
|
||||
"DrawThingsPositive",
|
||||
"DrawThingsPrompt",
|
||||
"DrawThingsRefiner",
|
||||
"DrawThingsSampler",
|
||||
"DrawThingsUpscaler"
|
||||
],
|
||||
{
|
||||
"title_aux": "draw-things-comfyui"
|
||||
}
|
||||
],
|
||||
"https://github.com/dreamhartley/ComfyUI_show_seed": [
|
||||
[
|
||||
"Show Seed"
|
||||
@ -30280,6 +30472,9 @@
|
||||
],
|
||||
"https://github.com/exedesign/Hunyuan-3D-v3": [
|
||||
[
|
||||
"Hunyuan3DPreview",
|
||||
"HunyuanBatchImageTo3D",
|
||||
"HunyuanBatchPreview",
|
||||
"HunyuanConfig",
|
||||
"HunyuanImageTo3D",
|
||||
"HunyuanTextTo3D"
|
||||
@ -31438,6 +31633,14 @@
|
||||
"title_aux": "ComfyUI_pose_inter"
|
||||
}
|
||||
],
|
||||
"https://github.com/fudosanit/ComfyUI-Random-Resolution": [
|
||||
[
|
||||
"RandomResolutionSelector"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Random-Resolution"
|
||||
}
|
||||
],
|
||||
"https://github.com/fuselayer/comfyui-lite-tracker": [
|
||||
[
|
||||
"LiteTracker_LoadModel",
|
||||
@ -31613,6 +31816,7 @@
|
||||
"JSONOutputList",
|
||||
"KSamplerImmediateSave",
|
||||
"NumberOutputList",
|
||||
"PickOutputLists",
|
||||
"StringOutputList"
|
||||
],
|
||||
{
|
||||
@ -33321,6 +33525,14 @@
|
||||
"title_aux": "fastgan-comfyui"
|
||||
}
|
||||
],
|
||||
"https://github.com/huihuihuiz/lora_downloader": [
|
||||
[
|
||||
"LoraDownloader"
|
||||
],
|
||||
{
|
||||
"title_aux": "LoRA Downloader for ComfyUI"
|
||||
}
|
||||
],
|
||||
"https://github.com/huixingyun/ComfyUI-HX-Captioner": [
|
||||
[
|
||||
"HXOllamaCaptioner"
|
||||
@ -33334,6 +33546,9 @@
|
||||
"ModelScopeImageCaptionNode",
|
||||
"ModelScopeImageEditNode",
|
||||
"ModelScopeImageNode",
|
||||
"ModelScopeLoraPresetNode",
|
||||
"ModelScopeMultiLoraLoaderNode",
|
||||
"ModelScopeSingleLoraLoaderNode",
|
||||
"ModelScopeTextNode",
|
||||
"ModelScopeVisionNode"
|
||||
],
|
||||
@ -34631,6 +34846,34 @@
|
||||
"title_aux": "ComfyUI_MusicTools"
|
||||
}
|
||||
],
|
||||
"https://github.com/jeankassio/JK-AceStep-Nodes": [
|
||||
[
|
||||
"AceStepClaude_Lyrics",
|
||||
"AceStepCohere_Lyrics",
|
||||
"AceStepCompileSettings",
|
||||
"AceStepFireworks_Lyrics",
|
||||
"AceStepGeminiLyrics",
|
||||
"AceStepGemini_Lyrics",
|
||||
"AceStepGroqLyrics",
|
||||
"AceStepGroq_Lyrics",
|
||||
"AceStepHuggingFace_Lyrics",
|
||||
"AceStepKSampler",
|
||||
"AceStepKSamplerAdvanced",
|
||||
"AceStepOpenAI_Lyrics",
|
||||
"AceStepPerplexity_Lyrics",
|
||||
"AceStepPostProcess",
|
||||
"AceStepPromptGen",
|
||||
"AceStepReplicate_Lyrics",
|
||||
"AceStepSaveText",
|
||||
"AceStepTogetherAI_Lyrics",
|
||||
"AceStepTorchCompile",
|
||||
"AceStepVocoderAdapter",
|
||||
"AudioQualityEvaluator"
|
||||
],
|
||||
{
|
||||
"title_aux": "JK AceStep Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/jeffrey2212/ComfyUI-PonyCharacterPrompt": [
|
||||
[
|
||||
"Pony Character Prompt Picker"
|
||||
@ -38890,6 +39133,15 @@
|
||||
"title_aux": "comfyui_wildcards"
|
||||
}
|
||||
],
|
||||
"https://github.com/lovelybbq/comfyui-custom-node-color": [
|
||||
[
|
||||
"ConvertHEXToRGB",
|
||||
"HexColorInput"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI Custom Node Color"
|
||||
}
|
||||
],
|
||||
"https://github.com/lovisdotio/ComfyUI-Replace-First-Frame-Last-Frame": [
|
||||
[
|
||||
"ReplaceFirstLastFrames"
|
||||
@ -38970,6 +39222,15 @@
|
||||
"title_aux": "Comfyui Kolors Utils"
|
||||
}
|
||||
],
|
||||
"https://github.com/lrzjason/Comfyui-LatentUtils": [
|
||||
[
|
||||
"HFEPostProcessor (lrzjason)",
|
||||
"LatentFrequencyEnhancer_lrzjason"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-LatentUtils"
|
||||
}
|
||||
],
|
||||
"https://github.com/lrzjason/Comfyui-LoraUtils": [
|
||||
[
|
||||
"ConvertLoraKeys",
|
||||
@ -40966,6 +41227,8 @@
|
||||
],
|
||||
"https://github.com/mittimi/ComfyUI_mittimiWidthHeight": [
|
||||
[
|
||||
"GoStopAnythingMittimi01",
|
||||
"OutputLongLengthMittimi01",
|
||||
"WidthHeightMittimi01"
|
||||
],
|
||||
{
|
||||
@ -43774,6 +44037,14 @@
|
||||
"title_aux": "Comfyui-PainterAudioCut"
|
||||
}
|
||||
],
|
||||
"https://github.com/princepainter/Comfyui-PainterAudioLength": [
|
||||
[
|
||||
"PainterAudioLength"
|
||||
],
|
||||
{
|
||||
"title_aux": "Comfyui-PainterAudioLength"
|
||||
}
|
||||
],
|
||||
"https://github.com/princepainter/Comfyui-PainterFLF2V": [
|
||||
[
|
||||
"PainterFLF2V"
|
||||
@ -46721,12 +46992,9 @@
|
||||
],
|
||||
"https://github.com/slahiri/ComfyUI-AI-Photography-Toolkit": [
|
||||
[
|
||||
"SID_Anthropic_LLM",
|
||||
"SID_GGUF_LLM",
|
||||
"SID_Grok_LLM",
|
||||
"SID_OpenAI_Compatible_LLM",
|
||||
"SID_ZImagePromptGenerator",
|
||||
"SID_ZImagePromptGenerator_Advanced_V2"
|
||||
"SID_LLM_API",
|
||||
"SID_LLM_Local",
|
||||
"SID_ZImagePromptGenerator"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-AI-Photography-Toolkit"
|
||||
@ -48657,6 +48925,14 @@
|
||||
"title_aux": "ComfyUI-FaceCalloutNode"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-NvidiaCaptioner": [
|
||||
[
|
||||
"NvidiaCaptionerNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NvidiaCaptioner"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-SD3.5-Latent-Size-Picker": [
|
||||
[
|
||||
"FluxEmptyLatent",
|
||||
@ -48677,6 +48953,14 @@
|
||||
"title_aux": "Together Vision Node"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-Universal-Latent": [
|
||||
[
|
||||
"UniversalLatent"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Universal-Latent"
|
||||
}
|
||||
],
|
||||
"https://github.com/theshubzworld/ComfyUI-ollama_killer": [
|
||||
[
|
||||
"OllamaKiller"
|
||||
@ -48881,7 +49165,8 @@
|
||||
"TALoadCheckpointModelWithName",
|
||||
"TALoadDiffusionModelWithName",
|
||||
"TALoadGGUFModelWithName",
|
||||
"TAPromptController"
|
||||
"TAPromptController",
|
||||
"ta_captioning"
|
||||
],
|
||||
{
|
||||
"title_aux": "TA-ComfyUI-Nodes-Pack"
|
||||
@ -49341,6 +49626,15 @@
|
||||
"title_aux": "comfyui-image-tiled-nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/tumbowungus/MultiMaskCouple": [
|
||||
[
|
||||
"MaskedRegionCond",
|
||||
"MultiMaskCouple"
|
||||
],
|
||||
{
|
||||
"title_aux": "MultiMaskCouple"
|
||||
}
|
||||
],
|
||||
"https://github.com/tungdop2/Comfyui_face_restorer": [
|
||||
[
|
||||
"FaceRestorer",
|
||||
@ -49639,7 +49933,8 @@
|
||||
"https://github.com/ussoewwin/ComfyUI-NunchakuFluxLoraStacker": [
|
||||
[
|
||||
"FastGroupsBypasserV2",
|
||||
"FluxLoraMultiLoader"
|
||||
"FluxLoraMultiLoader",
|
||||
"ModelPatchLoaderCustom"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-NunchakuFluxLoraStacker"
|
||||
@ -50079,6 +50374,7 @@
|
||||
"vsLinx_BooleanOrOperator",
|
||||
"vsLinx_BypassOnBool",
|
||||
"vsLinx_FitImageIntoBBoxMask",
|
||||
"vsLinx_ImpactMultilineWildcardText",
|
||||
"vsLinx_LoadSelectedImagesBatch",
|
||||
"vsLinx_LoadSelectedImagesList",
|
||||
"vsLinx_MuteOnBool"
|
||||
@ -50958,7 +51254,9 @@
|
||||
],
|
||||
"https://github.com/wouterverweirder/comfyui_sam3": [
|
||||
[
|
||||
"SAM3Segmentation"
|
||||
"MaskOutline",
|
||||
"SAM3Segmentation",
|
||||
"SEGSToRectangle"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI SAM3"
|
||||
@ -51470,6 +51768,8 @@
|
||||
"PreviewImageLam",
|
||||
"PromptTranslator",
|
||||
"QRCode",
|
||||
"QwenImageEditNode",
|
||||
"QwenImageNode",
|
||||
"SaveImageLam",
|
||||
"SaveImgOutputLam",
|
||||
"SectionEnd",
|
||||
|
||||
@ -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.38.1"
|
||||
version = "3.38.3"
|
||||
license = { file = "LICENSE.txt" }
|
||||
dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
|
||||
|
||||
|
||||
@ -377,7 +377,7 @@ def extract_nodes_from_repo(repo_path: Path, verbose: bool = False, force_rescan
|
||||
# Extract metadata from this file
|
||||
metadata = extract_metadata_only(str(py_file))
|
||||
all_metadata.update(metadata)
|
||||
except Exception as e:
|
||||
except Exception:
|
||||
# Silently skip files that can't be read
|
||||
continue
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user