mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2025-12-16 01:57:04 +08:00
Merge branch 'main' into feat/cnr
This commit is contained in:
commit
a6d20b0865
1
.gitignore
vendored
1
.gitignore
vendored
@ -15,3 +15,4 @@ channels.list
|
||||
comfyworkflows_sharekey
|
||||
github-stats-cache.json
|
||||
pip_overrides.json
|
||||
*.json
|
||||
@ -4,6 +4,7 @@ cli_mode_flag = os.path.join(os.path.dirname(__file__), '.enable-cli-only-mode')
|
||||
|
||||
if not os.path.exists(cli_mode_flag):
|
||||
from .glob import manager_server
|
||||
from .glob import share_3rdparty
|
||||
WEB_DIRECTORY = "js"
|
||||
else:
|
||||
print(f"\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n")
|
||||
|
||||
@ -654,7 +654,7 @@
|
||||
"https://github.com/city96/ComfyUI-GGUF"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "GGUF Quantization support for native ComfyUI models\nThis is currently very much WIP. These custom nodes provide support for model files stored in the GGUF format popularized by llama.cpp.\nWhile quantization wasn't feasible for regular UNET models (conv2d), transformer/DiT models such as flux seem less affected by quantization. This allows running it in much lower bits per weight variable bitrate quants on low-end GPUs.\n[w/LoRA / Controlnet / etc are currently not supported due to the weights being quantized.]"
|
||||
"description": "GGUF Quantization support for native ComfyUI models\nThis is currently very much WIP. These custom nodes provide support for model files stored in the GGUF format popularized by llama.cpp.\nWhile quantization wasn't feasible for regular UNET models (conv2d), transformer/DiT models such as flux seem less affected by quantization. This allows running it in much lower bits per weight variable bitrate quants on low-end GPUs."
|
||||
},
|
||||
{
|
||||
"author": "SLAPaper",
|
||||
@ -1595,7 +1595,7 @@
|
||||
"https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes: VHS_VideoCombine. Nodes related to video workflows"
|
||||
"description": "Nodes related to video workflows"
|
||||
},
|
||||
{
|
||||
"author": "Gourieff",
|
||||
@ -1632,7 +1632,8 @@
|
||||
},
|
||||
{
|
||||
"author": "Chaoses-Ib",
|
||||
"title": "ComfyUI_Ib_CustomNodes","id": "ib-nodes",
|
||||
"title": "ComfyUI_Ib_CustomNodes",
|
||||
"id": "ib-nodes",
|
||||
"reference": "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes",
|
||||
"files": [
|
||||
"https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes"
|
||||
@ -5237,14 +5238,25 @@
|
||||
},
|
||||
{
|
||||
"author": "aiXander",
|
||||
"title": "Various custom nodes by Eden.art",
|
||||
"title": "Eden.art nodesuite",
|
||||
"id": "Eden",
|
||||
"reference": "https://github.com/edenartlab/eden_comfy_pipelines",
|
||||
"files": [
|
||||
"https://github.com/edenartlab/eden_comfy_pipelines"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A set of custom nodes for various purposed, maintained by Eden.art"
|
||||
"description": "Maintained by Eden.art, this is a growing suite of custom nodes for building advanced pipelines."
|
||||
},
|
||||
{
|
||||
"author": "aiXander",
|
||||
"title": "Eden.art LoRa Trainer",
|
||||
"id": "Eden",
|
||||
"reference": "https://github.com/edenartlab/sd-lora-trainer",
|
||||
"files": [
|
||||
"https://github.com/edenartlab/sd-lora-trainer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Maintained by Eden.art, this is a very fast, well tuned trainer for SDXL and SD15"
|
||||
},
|
||||
{
|
||||
"author": "pkpk",
|
||||
@ -5391,6 +5403,17 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "This is a set of custom nodes for ComfyUI. The nodes utilize the [a/face parsing model](https://huggingface.co/jonathandinu/face-parsing) to provide detailed segmantation of face. To improve face segmantation accuracy, [a/yolov8 face model](https://huggingface.co/Bingsu/adetailer/) is used to first extract face from an image. There are also auxiliary nodes for image and mask processing. A guided filter is also provided for skin smoothing."
|
||||
},
|
||||
{
|
||||
"author": "Ryuukeisyou",
|
||||
"title": "ComfyUI-SyncTalk",
|
||||
"id": "synctalk",
|
||||
"reference": "https://github.com/Ryuukeisyou/ComfyUI-SyncTalk",
|
||||
"files": [
|
||||
"https://github.com/Ryuukeisyou/ComfyUI-SyncTalk"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI implemntation for [a/SyncTalk](https://github.com/ZiqiaoPeng/SyncTalk)"
|
||||
},
|
||||
{
|
||||
"author": "tocubed",
|
||||
"title": "ComfyUI-AudioReactor",
|
||||
@ -8271,6 +8294,36 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Move canvas to target on dragging connection."
|
||||
},
|
||||
{
|
||||
"author": "shinich39",
|
||||
"title": "comfyui-group-selection",
|
||||
"reference": "https://github.com/shinich39/comfyui-group-selection",
|
||||
"files": [
|
||||
"https://github.com/shinich39/comfyui-group-selection"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Create a new group of nodes."
|
||||
},
|
||||
{
|
||||
"author": "shinich39",
|
||||
"title": "comfyui-group-selection",
|
||||
"reference": "https://github.com/shinich39/comfyui-group-selection",
|
||||
"files": [
|
||||
"https://github.com/shinich39/comfyui-group-selection"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Create a new group of nodes."
|
||||
},
|
||||
{
|
||||
"author": "shinich39",
|
||||
"title": "comfyui-textarea-keybindings",
|
||||
"reference": "https://github.com/shinich39/comfyui-textarea-keybindings",
|
||||
"files": [
|
||||
"https://github.com/shinich39/comfyui-textarea-keybindings"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add keybindings to textarea."
|
||||
},
|
||||
{
|
||||
"author": "wei30172",
|
||||
"title": "comfygen",
|
||||
@ -10949,6 +11002,16 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:commonly_node."
|
||||
},
|
||||
{
|
||||
"author": "hben35096",
|
||||
"title": "ComfyUI-ReplenishNodes",
|
||||
"reference": "https://github.com/hben35096/ComfyUI-ReplenishNodes",
|
||||
"files": [
|
||||
"https://github.com/hben35096/ComfyUI-ReplenishNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This repository contains two custom nodes for ComfyUI that utilize the [a/CLIPSeg model](https://huggingface.co/docs/transformers/main/en/model_doc/clipseg) to generate masks for image inpainting tasks based on text prompts."
|
||||
},
|
||||
{
|
||||
"author": "tiankuan93",
|
||||
"title": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation",
|
||||
@ -11235,6 +11298,17 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "A prompt generator and CLIP encoder using AI provided by Ollama."
|
||||
},
|
||||
{
|
||||
"author": "NvidiaGameWorksAdmin",
|
||||
"title": "ComfyUI-RTX-Remix",
|
||||
"id": "comfyui-rtx-remix",
|
||||
"reference": "https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix",
|
||||
"files": [
|
||||
"https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Use ComfyUI with RTX Remix to remaster classic games [a/https://github.com/NVIDIAGameWorks/rtx-remix](https://github.com/NVIDIAGameWorks/rtx-remix)"
|
||||
},
|
||||
{
|
||||
"author": "toxicwind",
|
||||
"title": "TTools for ComfyUI",
|
||||
@ -12052,7 +12126,7 @@
|
||||
"https://github.com/john-mnz/ComfyUI-Inspyrenet-Rembg"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI node for background removal implementing [a/InSPyReNet](https://github.com/plemeri/InSPyReNet)"
|
||||
"description": "ComfyUI node for background removal, implementing [a/InSPyReNet](https://github.com/plemeri/InSPyReNet)"
|
||||
},
|
||||
{
|
||||
"author": "Koushakur",
|
||||
@ -12741,6 +12815,26 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:Load Video to Images, Image to Canny, ControlNet Model Loader, VEDit Model Loader, VEdit Sampler. [a/https://github.com/SingleZombie/DiffusersExample/tree/main/ReplaceAttn](https://github.com/SingleZombie/DiffusersExample/tree/main/ReplaceAttn)"
|
||||
},
|
||||
{
|
||||
"author": "leeguandong",
|
||||
"title": "ComfyUI nodes to use CrossImageAttention",
|
||||
"reference": "https://github.com/leeguandong/ComfyUI_CrossImageAttention",
|
||||
"files": [
|
||||
"https://github.com/leeguandong/ComfyUI_CrossImageAttention"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI for [a/CrossImageAttention](https://github.com/garibida/cross-image-attention)"
|
||||
},
|
||||
{
|
||||
"author": "leeguandong",
|
||||
"title": "ComfyUI nodes to use Style-Aligned",
|
||||
"reference": "https://github.com/leeguandong/ComfyUI_Style_Aligned",
|
||||
"files": [
|
||||
"https://github.com/leeguandong/ComfyUI_Style_Aligned"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI for [a/style-aligned](https://github.com/google/style-aligned)"
|
||||
},
|
||||
{
|
||||
"author": "lenskikh",
|
||||
"title": "Propmt Worker",
|
||||
@ -13039,18 +13133,83 @@
|
||||
"https://github.com/fairy-root/comfyui-ollama-llms"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The PonySwitch node is a custom node for ComfyUI that modifies prompts based on a toggle switch and adds configurable pony tags."
|
||||
"description": "Ollama and Llava vision integration for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "fairy-root",
|
||||
"title": "Flux Prompt Generator for ComfyUI",
|
||||
"reference": "https://github.com/fairy-root/Flux-Prompt-Generator",
|
||||
"files": [
|
||||
"https://github.com/fairy-root/Flux-Prompt-Generator"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A flexible and customizable prompt generator for generating detailed and creative prompts for image generation models for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "ryanontheinside",
|
||||
"title": "ComfyUI_RyanOnTheInside",
|
||||
"title": "RyanOnTheInside",
|
||||
"reference": "https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside",
|
||||
"files": [
|
||||
"https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "RyanOnTheInside node pack introduces the following (so far): Particle Systems, Optical Flow, Temporal Masks."
|
||||
"description": "Custom nodes introducing particle simulations, optical flow, and temporal masks"
|
||||
},
|
||||
{
|
||||
"author": "ControlAltAI",
|
||||
"title": "ControlAltAI Nodes",
|
||||
"id": "controlaltai",
|
||||
"reference": "https://github.com/gseth/ControlAltAI-Nodes",
|
||||
"files":
|
||||
[
|
||||
"https://github.com/gseth/ControlAltAI-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Quality of Life ComfyUI nodes starting with Flux Resolution Calculator and Flux Sampler."
|
||||
},
|
||||
{
|
||||
"author": "OliverCrosby",
|
||||
"title": "ComfyUI Minimap",
|
||||
"id": "minimap",
|
||||
"reference": "https://github.com/OliverCrosby/Comfyui-Minimap",
|
||||
"files": [
|
||||
"https://github.com/OliverCrosby/Comfyui-Minimap"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A simple minimap in the bottom-right of the window showing the full workflow, left click to navigate"
|
||||
},
|
||||
{
|
||||
"author": "doomy23",
|
||||
"title": "ComfyUI-D00MYsNodes",
|
||||
"reference": "https://github.com/doomy23/ComfyUI-D00MYsNodes",
|
||||
"files": [
|
||||
"https://github.com/doomy23/ComfyUI-D00MYsNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:ImagesToPNG. A set of custom nodes for ComfyUI I needed for myself but I'm sharing with the public."
|
||||
},
|
||||
{
|
||||
"author": "Sieyalixnet",
|
||||
"title": "ComfyUI_Textarea_Loaders",
|
||||
"reference": "https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders",
|
||||
"files": [
|
||||
"https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "An easy custom node that makes the some loaders' input as Text instead of file selector.\nFor example, there are many characters in different loras respectively. If you want to generate different characters' pictures, you have to select corresponding lora, and then edit the prompt. It may cost much time.\nTo solve this problem, You can use it with a chrome extension https://github.com/Sieyalixnet/ComfyUI-Prompt-Formatter-Extension that makes the queue prompt easier when you dealing with massive loras and prompt."
|
||||
},
|
||||
{
|
||||
"author": "markuryy",
|
||||
"title": "ComfyUI Flux Prompt Saver",
|
||||
"reference": "https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver",
|
||||
"files": [
|
||||
"https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The Flux Prompt Saver is a custom node for ComfyUI that works in conjunction with the Flux Sampler Parameters node from the ComfyUI Essentials package. This node allows you to save images with metadata that includes information from the Flux Sampler Parameters pipeline."
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -907,9 +907,9 @@
|
||||
],
|
||||
"https://github.com/Anibaaal/ComfyUI-UX-Nodes": [
|
||||
[
|
||||
"DenoiseCalculator",
|
||||
"EasyResolutionPicker",
|
||||
"StepCalculator"
|
||||
"SmoothCurveMerger",
|
||||
"UNETSave"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI UX Nodes"
|
||||
@ -2070,6 +2070,7 @@
|
||||
"BinaryPreprocessor",
|
||||
"CannyEdgePreprocessor",
|
||||
"ColorPreprocessor",
|
||||
"ControlNetAuxSimpleAddText",
|
||||
"ControlNetPreprocessorSelector",
|
||||
"DSINE-NormalMapPreprocessor",
|
||||
"DWPreprocessor",
|
||||
@ -2077,6 +2078,7 @@
|
||||
"DepthAnythingPreprocessor",
|
||||
"DepthAnythingV2Preprocessor",
|
||||
"DiffusionEdge_Preprocessor",
|
||||
"ExecuteAllControlNetPreprocessors",
|
||||
"FacialPartColoringFromPoseKps",
|
||||
"FakeScribblePreprocessor",
|
||||
"HEDPreprocessor",
|
||||
@ -2790,6 +2792,8 @@
|
||||
"DisplayText",
|
||||
"LoadVideo",
|
||||
"MiniCPM_VQA",
|
||||
"MiniCPM_VQA_Polished",
|
||||
"MultipleImagesInput",
|
||||
"PreViewVideo"
|
||||
],
|
||||
{
|
||||
@ -3779,6 +3783,7 @@
|
||||
],
|
||||
"https://github.com/MohammadAboulEla/ComfyUI-iTools": [
|
||||
[
|
||||
"iToolsAddOverlay",
|
||||
"iToolsLoadImagePlus",
|
||||
"iToolsPromptLoader",
|
||||
"iToolsPromptSaver"
|
||||
@ -3937,6 +3942,38 @@
|
||||
"title_aux": "Image Captioning and Tagging Assistor Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix": [
|
||||
[
|
||||
"RTXRemixCreateLayer",
|
||||
"RTXRemixDefineLayerId",
|
||||
"RTXRemixDeleteFile",
|
||||
"RTXRemixEndContext",
|
||||
"RTXRemixGetEditTarget",
|
||||
"RTXRemixGetLayers",
|
||||
"RTXRemixGetTextures",
|
||||
"RTXRemixIngestTexture",
|
||||
"RTXRemixInvertBool",
|
||||
"RTXRemixLayerType",
|
||||
"RTXRemixLayerTypes",
|
||||
"RTXRemixMuteLayer",
|
||||
"RTXRemixRemoveLayer",
|
||||
"RTXRemixRestAPIDetails",
|
||||
"RTXRemixSaveLayer",
|
||||
"RTXRemixSetEditTarget",
|
||||
"RTXRemixSetTexture",
|
||||
"RTXRemixStartContext",
|
||||
"RTXRemixStrToList",
|
||||
"RTXRemixStringConcatenate",
|
||||
"RTXRemixStringConstant",
|
||||
"RTXRemixSwitch",
|
||||
"RTXRemixTextureTypeToUSDAttribute",
|
||||
"RTXRemixTexturesType",
|
||||
"RTXRemixTexturesTypes"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-RTX-Remix"
|
||||
}
|
||||
],
|
||||
"https://github.com/NeuralSamurAI/ComfyUI-Dimensional-Latent-Perlin": [
|
||||
[
|
||||
"NoisyLatentPerlinD"
|
||||
@ -4979,6 +5016,15 @@
|
||||
"title_aux": "Lazy Pony Prompter"
|
||||
}
|
||||
],
|
||||
"https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders": [
|
||||
[
|
||||
"CheckPointLoader_Text",
|
||||
"LoRALoader_Text"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Textarea_Loaders"
|
||||
}
|
||||
],
|
||||
"https://github.com/Smirnov75/ComfyUI-mxToolkit": [
|
||||
[
|
||||
"mxSeed",
|
||||
@ -9165,8 +9211,42 @@
|
||||
"StableCascade_SuperResolutionControlnet",
|
||||
"StableZero123_Conditioning",
|
||||
"StableZero123_Conditioning_Batched",
|
||||
"StubFloat",
|
||||
"StubImage",
|
||||
"StubInt",
|
||||
"StubMask",
|
||||
"StyleModelApply",
|
||||
"StyleModelLoader",
|
||||
"TestAccumulateNode",
|
||||
"TestAccumulationGetItemNode",
|
||||
"TestAccumulationGetLengthNode",
|
||||
"TestAccumulationHeadNode",
|
||||
"TestAccumulationSetItemNode",
|
||||
"TestAccumulationTailNode",
|
||||
"TestAccumulationToListNode",
|
||||
"TestBoolOperationNode",
|
||||
"TestCustomIsChanged",
|
||||
"TestCustomValidation1",
|
||||
"TestCustomValidation2",
|
||||
"TestCustomValidation3",
|
||||
"TestCustomValidation4",
|
||||
"TestCustomValidation5",
|
||||
"TestDynamicDependencyCycle",
|
||||
"TestExecutionBlocker",
|
||||
"TestFloatConditions",
|
||||
"TestForLoopClose",
|
||||
"TestForLoopOpen",
|
||||
"TestIntConditions",
|
||||
"TestIntMathOperation",
|
||||
"TestLazyMixImages",
|
||||
"TestListToAccumulationNode",
|
||||
"TestMakeListNode",
|
||||
"TestMixedExpansionReturns",
|
||||
"TestStringConditions",
|
||||
"TestToBoolNode",
|
||||
"TestVariadicAverage",
|
||||
"TestWhileLoopClose",
|
||||
"TestWhileLoopOpen",
|
||||
"ThresholdMask",
|
||||
"TomePatchModel",
|
||||
"TripleCLIPLoader",
|
||||
@ -9594,14 +9674,16 @@
|
||||
"CFGSkimming",
|
||||
"CustomPromptLoader",
|
||||
"DynamicStringCombinerNode",
|
||||
"FileReaderNode",
|
||||
"FlexibleStringMergerNode",
|
||||
"GPT4MiniNode",
|
||||
"GPT4VisionNode",
|
||||
"Gpt4CustomVision",
|
||||
"Gpt4VisionCloner",
|
||||
"MergedOllamaNode",
|
||||
"MedianOppositeColorNode",
|
||||
"OllamaNode",
|
||||
"PGSD3LatentGenerator",
|
||||
"ProminentOppositeColorNode",
|
||||
"PromptGenerator",
|
||||
"RandomIntegerNode",
|
||||
"SentenceMixerNode",
|
||||
@ -10054,6 +10136,15 @@
|
||||
"title_aux": "ComfyUI-Keyframed"
|
||||
}
|
||||
],
|
||||
"https://github.com/doomy23/ComfyUI-D00MYsNodes": [
|
||||
[
|
||||
"Images_Converter|D00MYs",
|
||||
"Show_Text|D00MYs"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-D00MYsNodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/drago87/ComfyUI_Dragos_Nodes": [
|
||||
[
|
||||
"file_padding",
|
||||
@ -10146,7 +10237,15 @@
|
||||
"WidthHeightPicker"
|
||||
],
|
||||
{
|
||||
"title_aux": "Various custom nodes by Eden.art"
|
||||
"title_aux": "Eden.art nodesuite"
|
||||
}
|
||||
],
|
||||
"https://github.com/edenartlab/sd-lora-trainer": [
|
||||
[
|
||||
"Eden_LoRa_trainer"
|
||||
],
|
||||
{
|
||||
"title_aux": "Eden.art LoRa Trainer"
|
||||
}
|
||||
],
|
||||
"https://github.com/emojiiii/ComfyUI_Emojiiii_Custom_Nodes": [
|
||||
@ -10243,6 +10342,14 @@
|
||||
"title_aux": "ComfyUI-Showrunner-Utils"
|
||||
}
|
||||
],
|
||||
"https://github.com/fairy-root/Flux-Prompt-Generator": [
|
||||
[
|
||||
"FluxPromptGenerator"
|
||||
],
|
||||
{
|
||||
"title_aux": "Flux Prompt Generator for ComfyUI"
|
||||
}
|
||||
],
|
||||
"https://github.com/fairy-root/comfyui-ollama-llms": [
|
||||
[
|
||||
"ConcatenateText",
|
||||
@ -10400,7 +10507,6 @@
|
||||
"FL_Shadertoy",
|
||||
"FL_SimpleGPTVision",
|
||||
"FL_SystemCheck",
|
||||
"FL_TD_Sampler",
|
||||
"FL_TetrisGame",
|
||||
"FL_TimeLine",
|
||||
"FL_UpscaleModel",
|
||||
@ -11166,6 +11272,15 @@
|
||||
"title_aux": "ComfyUI Griptape Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/gseth/ControlAltAI-Nodes": [
|
||||
[
|
||||
"FluxResolutionNode",
|
||||
"FluxSampler"
|
||||
],
|
||||
{
|
||||
"title_aux": "ControlAltAI Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/guill/abracadabra-comfyui": [
|
||||
[
|
||||
"AbracadabraNode",
|
||||
@ -11280,6 +11395,15 @@
|
||||
"title_aux": "ComfyUI OpenVoice"
|
||||
}
|
||||
],
|
||||
"https://github.com/hben35096/ComfyUI-ReplenishNodes": [
|
||||
[
|
||||
"CLIPSegToMask",
|
||||
"CombineSegMasks"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-ReplenishNodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/hben35096/ComfyUI-ToolBox": [
|
||||
[
|
||||
"AutoDLDownload",
|
||||
@ -11336,6 +11460,7 @@
|
||||
"classify_function_plus",
|
||||
"classify_persona",
|
||||
"classify_persona_plus",
|
||||
"clear_file",
|
||||
"clear_model",
|
||||
"custom_persona",
|
||||
"discord_bot",
|
||||
@ -12236,6 +12361,7 @@
|
||||
"JN_AudioSetChannels",
|
||||
"JN_AudioSlice",
|
||||
"JN_AudioSpeed",
|
||||
"JN_AudioSplitChannels",
|
||||
"JN_AudioStackChannels",
|
||||
"JN_AudioTempo",
|
||||
"JN_AudioTrimSilence",
|
||||
@ -12289,6 +12415,9 @@
|
||||
"JN_MaskToImage",
|
||||
"JN_MathOperation",
|
||||
"JN_MathOperationArray",
|
||||
"JN_MeowHrtfAudio3d",
|
||||
"JN_MeowHrtfModel",
|
||||
"JN_MeowHrtfPosition",
|
||||
"JN_MeowLoadVoice",
|
||||
"JN_MeowSaveVoice",
|
||||
"JN_MeowSentenceSplit",
|
||||
@ -12952,6 +13081,7 @@
|
||||
"JoinStringMulti",
|
||||
"JoinStrings",
|
||||
"LoadAndResizeImage",
|
||||
"LoadImagesFromFolderKJ",
|
||||
"LoadResAdapterNormalization",
|
||||
"MaskBatchMulti",
|
||||
"MaskOrImageToWeight",
|
||||
@ -13369,6 +13499,18 @@
|
||||
"title_aux": "LNL Frame Selector"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_CrossImageAttention": [
|
||||
[
|
||||
"AppearanceTransferInference",
|
||||
"AppearanceTransferModelModelLoader",
|
||||
"CIAConfig",
|
||||
"LoadImagePath",
|
||||
"LoadLatents"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI nodes to use CrossImageAttention"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_InternVL2": [
|
||||
[
|
||||
"DynamicPreprocess",
|
||||
@ -13399,6 +13541,22 @@
|
||||
"title_aux": "ComfyUI_M3Net"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_Style_Aligned": [
|
||||
[
|
||||
"SAControlnet_ModelLoader",
|
||||
"SADepth",
|
||||
"SAHandler",
|
||||
"SAInversion",
|
||||
"SASDXLControlnetKsampler",
|
||||
"SASDXLKampler",
|
||||
"SASDXLTransferKsampler",
|
||||
"SASDXL_ModelLoader",
|
||||
"SchedulerLoader"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI nodes to use Style-Aligned"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_VideoEditing": [
|
||||
[
|
||||
"LoadVideo2Images",
|
||||
@ -14206,6 +14364,14 @@
|
||||
"title_aux": "Recommended Resolution Calculator"
|
||||
}
|
||||
],
|
||||
"https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver": [
|
||||
[
|
||||
"FluxPromptSaver"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI Flux Prompt Saver"
|
||||
}
|
||||
],
|
||||
"https://github.com/martijnat/comfyui-previewlatent": [
|
||||
[
|
||||
"PreviewLatent",
|
||||
@ -14542,10 +14708,8 @@
|
||||
"CanvasCreatorSimple",
|
||||
"CircleCreator",
|
||||
"CirclesGenerator",
|
||||
"CreateCircleMask",
|
||||
"CreateMaskWithCanvas",
|
||||
"CreateNestedPNGMask",
|
||||
"CreatePolygonPNGMask",
|
||||
"CreateSimpleMask",
|
||||
"CreateTillingPNGMask",
|
||||
"CreateWatermarkRemovalMask",
|
||||
@ -14563,6 +14727,7 @@
|
||||
"IntMultiplication",
|
||||
"IntSubtraction",
|
||||
"IntToFloatMultiplication",
|
||||
"LoRALoaderWithNameStacker",
|
||||
"LogicNot",
|
||||
"NoneToZero",
|
||||
"NumeralToString",
|
||||
@ -15739,12 +15904,14 @@
|
||||
"ParticleEmissionMask",
|
||||
"ParticleEmitter",
|
||||
"PulsatingParticleSystemMask",
|
||||
"SpringJointSetting",
|
||||
"StaticBody",
|
||||
"TextMaskNode",
|
||||
"Vortex",
|
||||
"_mfc"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_RyanOnTheInside"
|
||||
"title_aux": "RyanOnTheInside"
|
||||
}
|
||||
],
|
||||
"https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [
|
||||
@ -16948,6 +17115,7 @@
|
||||
"Compare-\ud83d\udd2c",
|
||||
"DebugPrint-\ud83d\udd2c",
|
||||
"Float-\ud83d\udd2c",
|
||||
"If ANY execute A else B-\ud83d\udd2c",
|
||||
"If ANY return A else B-\ud83d\udd2c",
|
||||
"Int-\ud83d\udd2c",
|
||||
"String-\ud83d\udd2c"
|
||||
@ -18223,6 +18391,7 @@
|
||||
"CheckpointLoaderSimpleWithSwitch",
|
||||
"ColorCorrectOfUtils",
|
||||
"ConcatTextOfUtils",
|
||||
"GenderControlOutput",
|
||||
"ImageBatchOneOrMore",
|
||||
"ImageCompositeMaskedWithSwitch",
|
||||
"ImageConcanateOfUtils",
|
||||
|
||||
3250
github-stats.json
3250
github-stats.json
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,7 @@ import cnr_utils
|
||||
from manager_util import *
|
||||
|
||||
|
||||
version_code = [2, 49]
|
||||
version_code = [3, 0]
|
||||
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||
|
||||
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
import mimetypes
|
||||
import traceback
|
||||
|
||||
import folder_paths
|
||||
@ -6,7 +5,6 @@ import locale
|
||||
import subprocess # don't remove this
|
||||
import concurrent
|
||||
import nodes
|
||||
import hashlib
|
||||
import os
|
||||
import sys
|
||||
import threading
|
||||
@ -1301,128 +1299,6 @@ async def load_components(request):
|
||||
return web.Response(status=400)
|
||||
|
||||
|
||||
@routes.get("/manager/share_option")
|
||||
async def share_option(request):
|
||||
if "value" in request.rel_url.query:
|
||||
core.get_config()['share_option'] = request.rel_url.query['value']
|
||||
core.write_config()
|
||||
else:
|
||||
return web.Response(text=core.get_config()['share_option'], status=200)
|
||||
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
def get_openart_auth():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".openart_key")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "r") as f:
|
||||
openart_key = f.read().strip()
|
||||
return openart_key if openart_key else None
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def get_matrix_auth():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, "matrix_auth")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "r") as f:
|
||||
matrix_auth = f.read()
|
||||
homeserver, username, password = matrix_auth.strip().split("\n")
|
||||
if not homeserver or not username or not password:
|
||||
return None
|
||||
return {
|
||||
"homeserver": homeserver,
|
||||
"username": username,
|
||||
"password": password,
|
||||
}
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def get_comfyworkflows_auth():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "r") as f:
|
||||
share_key = f.read()
|
||||
if not share_key.strip():
|
||||
return None
|
||||
return share_key
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def get_youml_settings():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".youml")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, ".youml"), "r") as f:
|
||||
youml_settings = f.read().strip()
|
||||
return youml_settings if youml_settings else None
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def set_youml_settings(settings):
|
||||
with open(os.path.join(core.comfyui_manager_path, ".youml"), "w") as f:
|
||||
f.write(settings)
|
||||
|
||||
|
||||
@routes.get("/manager/get_openart_auth")
|
||||
async def api_get_openart_auth(request):
|
||||
# print("Getting stored Matrix credentials...")
|
||||
openart_key = get_openart_auth()
|
||||
if not openart_key:
|
||||
return web.Response(status=404)
|
||||
return web.json_response({"openart_key": openart_key})
|
||||
|
||||
|
||||
@routes.post("/manager/set_openart_auth")
|
||||
async def api_set_openart_auth(request):
|
||||
json_data = await request.json()
|
||||
openart_key = json_data['openart_key']
|
||||
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "w") as f:
|
||||
f.write(openart_key)
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@routes.get("/manager/get_matrix_auth")
|
||||
async def api_get_matrix_auth(request):
|
||||
# print("Getting stored Matrix credentials...")
|
||||
matrix_auth = get_matrix_auth()
|
||||
if not matrix_auth:
|
||||
return web.Response(status=404)
|
||||
return web.json_response(matrix_auth)
|
||||
|
||||
|
||||
@routes.get("/manager/youml/settings")
|
||||
async def api_get_youml_settings(request):
|
||||
youml_settings = get_youml_settings()
|
||||
if not youml_settings:
|
||||
return web.Response(status=404)
|
||||
return web.json_response(json.loads(youml_settings))
|
||||
|
||||
|
||||
@routes.post("/manager/youml/settings")
|
||||
async def api_set_youml_settings(request):
|
||||
json_data = await request.json()
|
||||
set_youml_settings(json.dumps(json_data))
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@routes.get("/manager/get_comfyworkflows_auth")
|
||||
async def api_get_comfyworkflows_auth(request):
|
||||
# Check if the user has provided Matrix credentials in a file called 'matrix_accesstoken'
|
||||
# in the same directory as the ComfyUI base folder
|
||||
# print("Getting stored Comfyworkflows.com auth...")
|
||||
comfyworkflows_auth = get_comfyworkflows_auth()
|
||||
if not comfyworkflows_auth:
|
||||
return web.Response(status=404)
|
||||
return web.json_response({"comfyworkflows_sharekey": comfyworkflows_auth})
|
||||
|
||||
|
||||
args.enable_cors_header = "*"
|
||||
if hasattr(PromptServer.instance, "app"):
|
||||
app = PromptServer.instance.app
|
||||
@ -1430,258 +1306,8 @@ if hasattr(PromptServer.instance, "app"):
|
||||
app.middlewares.append(cors_middleware)
|
||||
|
||||
|
||||
@routes.post("/manager/set_esheep_workflow_and_images")
|
||||
async def set_esheep_workflow_and_images(request):
|
||||
json_data = await request.json()
|
||||
current_workflow = json_data['workflow']
|
||||
images = json_data['images']
|
||||
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), "w", encoding='utf-8') as file:
|
||||
json.dump(json_data, file, indent=4)
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@routes.get("/manager/get_esheep_workflow_and_images")
|
||||
async def get_esheep_workflow_and_images(request):
|
||||
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), 'r', encoding='utf-8') as file:
|
||||
data = json.load(file)
|
||||
return web.Response(status=200, text=json.dumps(data))
|
||||
|
||||
|
||||
def set_matrix_auth(json_data):
|
||||
homeserver = json_data['homeserver']
|
||||
username = json_data['username']
|
||||
password = json_data['password']
|
||||
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "w") as f:
|
||||
f.write("\n".join([homeserver, username, password]))
|
||||
|
||||
|
||||
def set_comfyworkflows_auth(comfyworkflows_sharekey):
|
||||
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "w") as f:
|
||||
f.write(comfyworkflows_sharekey)
|
||||
|
||||
|
||||
def has_provided_matrix_auth(matrix_auth):
|
||||
return matrix_auth['homeserver'].strip() and matrix_auth['username'].strip() and matrix_auth['password'].strip()
|
||||
|
||||
|
||||
def has_provided_comfyworkflows_auth(comfyworkflows_sharekey):
|
||||
return comfyworkflows_sharekey.strip()
|
||||
|
||||
|
||||
def extract_model_file_names(json_data):
|
||||
"""Extract unique file names from the input JSON data."""
|
||||
file_names = set()
|
||||
model_filename_extensions = {'.safetensors', '.ckpt', '.pt', '.pth', '.bin'}
|
||||
|
||||
# Recursively search for file names in the JSON data
|
||||
def recursive_search(data):
|
||||
if isinstance(data, dict):
|
||||
for value in data.values():
|
||||
recursive_search(value)
|
||||
elif isinstance(data, list):
|
||||
for item in data:
|
||||
recursive_search(item)
|
||||
elif isinstance(data, str) and '.' in data:
|
||||
file_names.add(os.path.basename(data)) # file_names.add(data)
|
||||
|
||||
recursive_search(json_data)
|
||||
return [f for f in list(file_names) if os.path.splitext(f)[1] in model_filename_extensions]
|
||||
|
||||
|
||||
def find_file_paths(base_dir, file_names):
|
||||
"""Find the paths of the files in the base directory."""
|
||||
file_paths = {}
|
||||
|
||||
for root, dirs, files in os.walk(base_dir):
|
||||
# Exclude certain directories
|
||||
dirs[:] = [d for d in dirs if d not in ['.git']]
|
||||
|
||||
for file in files:
|
||||
if file in file_names:
|
||||
file_paths[file] = os.path.join(root, file)
|
||||
return file_paths
|
||||
|
||||
|
||||
def compute_sha256_checksum(filepath):
|
||||
"""Compute the SHA256 checksum of a file, in chunks"""
|
||||
sha256 = hashlib.sha256()
|
||||
with open(filepath, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(4096), b''):
|
||||
sha256.update(chunk)
|
||||
return sha256.hexdigest()
|
||||
|
||||
|
||||
@routes.post("/manager/share")
|
||||
async def share_art(request):
|
||||
# get json data
|
||||
json_data = await request.json()
|
||||
|
||||
matrix_auth = json_data['matrix_auth']
|
||||
comfyworkflows_sharekey = json_data['cw_auth']['cw_sharekey']
|
||||
|
||||
set_matrix_auth(matrix_auth)
|
||||
set_comfyworkflows_auth(comfyworkflows_sharekey)
|
||||
|
||||
share_destinations = json_data['share_destinations']
|
||||
credits = json_data['credits']
|
||||
title = json_data['title']
|
||||
description = json_data['description']
|
||||
is_nsfw = json_data['is_nsfw']
|
||||
prompt = json_data['prompt']
|
||||
potential_outputs = json_data['potential_outputs']
|
||||
selected_output_index = json_data['selected_output_index']
|
||||
|
||||
try:
|
||||
output_to_share = potential_outputs[int(selected_output_index)]
|
||||
except:
|
||||
# for now, pick the first output
|
||||
output_to_share = potential_outputs[0]
|
||||
|
||||
assert output_to_share['type'] in ('image', 'output')
|
||||
output_dir = folder_paths.get_output_directory()
|
||||
|
||||
if output_to_share['type'] == 'image':
|
||||
asset_filename = output_to_share['image']['filename']
|
||||
asset_subfolder = output_to_share['image']['subfolder']
|
||||
|
||||
if output_to_share['image']['type'] == 'temp':
|
||||
output_dir = folder_paths.get_temp_directory()
|
||||
else:
|
||||
asset_filename = output_to_share['output']['filename']
|
||||
asset_subfolder = output_to_share['output']['subfolder']
|
||||
|
||||
if asset_subfolder:
|
||||
asset_filepath = os.path.join(output_dir, asset_subfolder, asset_filename)
|
||||
else:
|
||||
asset_filepath = os.path.join(output_dir, asset_filename)
|
||||
|
||||
# get the mime type of the asset
|
||||
assetFileType = mimetypes.guess_type(asset_filepath)[0]
|
||||
|
||||
share_website_host = "UNKNOWN"
|
||||
if "comfyworkflows" in share_destinations:
|
||||
share_website_host = "https://comfyworkflows.com"
|
||||
share_endpoint = f"{share_website_host}/api"
|
||||
|
||||
# get presigned urls
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
async with session.post(
|
||||
f"{share_endpoint}/get_presigned_urls",
|
||||
json={
|
||||
"assetFileName": asset_filename,
|
||||
"assetFileType": assetFileType,
|
||||
"workflowJsonFileName": 'workflow.json',
|
||||
"workflowJsonFileType": 'application/json',
|
||||
},
|
||||
) as resp:
|
||||
assert resp.status == 200
|
||||
presigned_urls_json = await resp.json()
|
||||
assetFilePresignedUrl = presigned_urls_json["assetFilePresignedUrl"]
|
||||
assetFileKey = presigned_urls_json["assetFileKey"]
|
||||
workflowJsonFilePresignedUrl = presigned_urls_json["workflowJsonFilePresignedUrl"]
|
||||
workflowJsonFileKey = presigned_urls_json["workflowJsonFileKey"]
|
||||
|
||||
# upload asset
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
async with session.put(assetFilePresignedUrl, data=open(asset_filepath, "rb")) as resp:
|
||||
assert resp.status == 200
|
||||
|
||||
# upload workflow json
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
async with session.put(workflowJsonFilePresignedUrl, data=json.dumps(prompt['workflow']).encode('utf-8')) as resp:
|
||||
assert resp.status == 200
|
||||
|
||||
model_filenames = extract_model_file_names(prompt['workflow'])
|
||||
model_file_paths = find_file_paths(folder_paths.base_path, model_filenames)
|
||||
|
||||
models_info = {}
|
||||
for filename, filepath in model_file_paths.items():
|
||||
models_info[filename] = {
|
||||
"filename": filename,
|
||||
"sha256_checksum": compute_sha256_checksum(filepath),
|
||||
"relative_path": os.path.relpath(filepath, folder_paths.base_path),
|
||||
}
|
||||
|
||||
# make a POST request to /api/upload_workflow with form data key values
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
form = aiohttp.FormData()
|
||||
if comfyworkflows_sharekey:
|
||||
form.add_field("shareKey", comfyworkflows_sharekey)
|
||||
form.add_field("source", "comfyui_manager")
|
||||
form.add_field("assetFileKey", assetFileKey)
|
||||
form.add_field("assetFileType", assetFileType)
|
||||
form.add_field("workflowJsonFileKey", workflowJsonFileKey)
|
||||
form.add_field("sharedWorkflowWorkflowJsonString", json.dumps(prompt['workflow']))
|
||||
form.add_field("sharedWorkflowPromptJsonString", json.dumps(prompt['output']))
|
||||
form.add_field("shareWorkflowCredits", credits)
|
||||
form.add_field("shareWorkflowTitle", title)
|
||||
form.add_field("shareWorkflowDescription", description)
|
||||
form.add_field("shareWorkflowIsNSFW", str(is_nsfw).lower())
|
||||
form.add_field("currentSnapshot", json.dumps(core.get_current_snapshot()))
|
||||
form.add_field("modelsInfo", json.dumps(models_info))
|
||||
|
||||
async with session.post(
|
||||
f"{share_endpoint}/upload_workflow",
|
||||
data=form,
|
||||
) as resp:
|
||||
assert resp.status == 200
|
||||
upload_workflow_json = await resp.json()
|
||||
workflowId = upload_workflow_json["workflowId"]
|
||||
|
||||
# check if the user has provided Matrix credentials
|
||||
if "matrix" in share_destinations:
|
||||
comfyui_share_room_id = '!LGYSoacpJPhIfBqVfb:matrix.org'
|
||||
filename = os.path.basename(asset_filepath)
|
||||
content_type = assetFileType
|
||||
|
||||
try:
|
||||
from matrix_client.api import MatrixHttpApi
|
||||
from matrix_client.client import MatrixClient
|
||||
|
||||
homeserver = 'matrix.org'
|
||||
if matrix_auth:
|
||||
homeserver = matrix_auth.get('homeserver', 'matrix.org')
|
||||
homeserver = homeserver.replace("http://", "https://")
|
||||
if not homeserver.startswith("https://"):
|
||||
homeserver = "https://" + homeserver
|
||||
|
||||
client = MatrixClient(homeserver)
|
||||
try:
|
||||
token = client.login(username=matrix_auth['username'], password=matrix_auth['password'])
|
||||
if not token:
|
||||
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
|
||||
except:
|
||||
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
|
||||
|
||||
matrix = MatrixHttpApi(homeserver, token=token)
|
||||
with open(asset_filepath, 'rb') as f:
|
||||
mxc_url = matrix.media_upload(f.read(), content_type, filename=filename)['content_uri']
|
||||
|
||||
workflow_json_mxc_url = matrix.media_upload(prompt['workflow'], 'application/json', filename='workflow.json')['content_uri']
|
||||
|
||||
text_content = ""
|
||||
if title:
|
||||
text_content += f"{title}\n"
|
||||
if description:
|
||||
text_content += f"{description}\n"
|
||||
if credits:
|
||||
text_content += f"\ncredits: {credits}\n"
|
||||
response = matrix.send_message(comfyui_share_room_id, text_content)
|
||||
response = matrix.send_content(comfyui_share_room_id, mxc_url, filename, 'm.image')
|
||||
response = matrix.send_content(comfyui_share_room_id, workflow_json_mxc_url, 'workflow.json', 'm.file')
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return web.json_response({"error": "An error occurred when sharing your art to Matrix."}, content_type='application/json', status=500)
|
||||
|
||||
return web.json_response({
|
||||
"comfyworkflows": {
|
||||
"url": None if "comfyworkflows" not in share_destinations else f"{share_website_host}/workflows/{workflowId}",
|
||||
},
|
||||
"matrix": {
|
||||
"success": None if "matrix" not in share_destinations else True
|
||||
}
|
||||
}, content_type='application/json', status=200)
|
||||
def sanitize(data):
|
||||
return data.replace("<", "<").replace(">", ">")
|
||||
|
||||
|
||||
async def _confirm_try_install(sender, custom_node_url, msg):
|
||||
|
||||
386
glob/share_3rdparty.py
Normal file
386
glob/share_3rdparty.py
Normal file
@ -0,0 +1,386 @@
|
||||
import mimetypes
|
||||
import manager_core as core
|
||||
import os
|
||||
from aiohttp import web
|
||||
import aiohttp
|
||||
import json
|
||||
import hashlib
|
||||
|
||||
import folder_paths
|
||||
from server import PromptServer
|
||||
|
||||
|
||||
def extract_model_file_names(json_data):
|
||||
"""Extract unique file names from the input JSON data."""
|
||||
file_names = set()
|
||||
model_filename_extensions = {'.safetensors', '.ckpt', '.pt', '.pth', '.bin'}
|
||||
|
||||
# Recursively search for file names in the JSON data
|
||||
def recursive_search(data):
|
||||
if isinstance(data, dict):
|
||||
for value in data.values():
|
||||
recursive_search(value)
|
||||
elif isinstance(data, list):
|
||||
for item in data:
|
||||
recursive_search(item)
|
||||
elif isinstance(data, str) and '.' in data:
|
||||
file_names.add(os.path.basename(data)) # file_names.add(data)
|
||||
|
||||
recursive_search(json_data)
|
||||
return [f for f in list(file_names) if os.path.splitext(f)[1] in model_filename_extensions]
|
||||
|
||||
|
||||
def find_file_paths(base_dir, file_names):
|
||||
"""Find the paths of the files in the base directory."""
|
||||
file_paths = {}
|
||||
|
||||
for root, dirs, files in os.walk(base_dir):
|
||||
# Exclude certain directories
|
||||
dirs[:] = [d for d in dirs if d not in ['.git']]
|
||||
|
||||
for file in files:
|
||||
if file in file_names:
|
||||
file_paths[file] = os.path.join(root, file)
|
||||
return file_paths
|
||||
|
||||
|
||||
def compute_sha256_checksum(filepath):
|
||||
"""Compute the SHA256 checksum of a file, in chunks"""
|
||||
sha256 = hashlib.sha256()
|
||||
with open(filepath, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(4096), b''):
|
||||
sha256.update(chunk)
|
||||
return sha256.hexdigest()
|
||||
|
||||
|
||||
@PromptServer.instance.routes.get("/manager/share_option")
|
||||
async def share_option(request):
|
||||
if "value" in request.rel_url.query:
|
||||
core.get_config()['share_option'] = request.rel_url.query['value']
|
||||
core.write_config()
|
||||
else:
|
||||
return web.Response(text=core.get_config()['share_option'], status=200)
|
||||
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
def get_openart_auth():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".openart_key")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "r") as f:
|
||||
openart_key = f.read().strip()
|
||||
return openart_key if openart_key else None
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def get_matrix_auth():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, "matrix_auth")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "r") as f:
|
||||
matrix_auth = f.read()
|
||||
homeserver, username, password = matrix_auth.strip().split("\n")
|
||||
if not homeserver or not username or not password:
|
||||
return None
|
||||
return {
|
||||
"homeserver": homeserver,
|
||||
"username": username,
|
||||
"password": password,
|
||||
}
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def get_comfyworkflows_auth():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "r") as f:
|
||||
share_key = f.read()
|
||||
if not share_key.strip():
|
||||
return None
|
||||
return share_key
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def get_youml_settings():
|
||||
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".youml")):
|
||||
return None
|
||||
try:
|
||||
with open(os.path.join(core.comfyui_manager_path, ".youml"), "r") as f:
|
||||
youml_settings = f.read().strip()
|
||||
return youml_settings if youml_settings else None
|
||||
except:
|
||||
return None
|
||||
|
||||
|
||||
def set_youml_settings(settings):
|
||||
with open(os.path.join(core.comfyui_manager_path, ".youml"), "w") as f:
|
||||
f.write(settings)
|
||||
|
||||
|
||||
@PromptServer.instance.routes.get("/manager/get_openart_auth")
|
||||
async def api_get_openart_auth(request):
|
||||
# print("Getting stored Matrix credentials...")
|
||||
openart_key = get_openart_auth()
|
||||
if not openart_key:
|
||||
return web.Response(status=404)
|
||||
return web.json_response({"openart_key": openart_key})
|
||||
|
||||
|
||||
@PromptServer.instance.routes.post("/manager/set_openart_auth")
|
||||
async def api_set_openart_auth(request):
|
||||
json_data = await request.json()
|
||||
openart_key = json_data['openart_key']
|
||||
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "w") as f:
|
||||
f.write(openart_key)
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@PromptServer.instance.routes.get("/manager/get_matrix_auth")
|
||||
async def api_get_matrix_auth(request):
|
||||
# print("Getting stored Matrix credentials...")
|
||||
matrix_auth = get_matrix_auth()
|
||||
if not matrix_auth:
|
||||
return web.Response(status=404)
|
||||
return web.json_response(matrix_auth)
|
||||
|
||||
|
||||
@PromptServer.instance.routes.get("/manager/youml/settings")
|
||||
async def api_get_youml_settings(request):
|
||||
youml_settings = get_youml_settings()
|
||||
if not youml_settings:
|
||||
return web.Response(status=404)
|
||||
return web.json_response(json.loads(youml_settings))
|
||||
|
||||
|
||||
@PromptServer.instance.routes.post("/manager/youml/settings")
|
||||
async def api_set_youml_settings(request):
|
||||
json_data = await request.json()
|
||||
set_youml_settings(json.dumps(json_data))
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@PromptServer.instance.routes.get("/manager/get_comfyworkflows_auth")
|
||||
async def api_get_comfyworkflows_auth(request):
|
||||
# Check if the user has provided Matrix credentials in a file called 'matrix_accesstoken'
|
||||
# in the same directory as the ComfyUI base folder
|
||||
# print("Getting stored Comfyworkflows.com auth...")
|
||||
comfyworkflows_auth = get_comfyworkflows_auth()
|
||||
if not comfyworkflows_auth:
|
||||
return web.Response(status=404)
|
||||
return web.json_response({"comfyworkflows_sharekey": comfyworkflows_auth})
|
||||
|
||||
|
||||
@PromptServer.instance.routes.post("/manager/set_esheep_workflow_and_images")
|
||||
async def set_esheep_workflow_and_images(request):
|
||||
json_data = await request.json()
|
||||
current_workflow = json_data['workflow']
|
||||
images = json_data['images']
|
||||
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), "w", encoding='utf-8') as file:
|
||||
json.dump(json_data, file, indent=4)
|
||||
return web.Response(status=200)
|
||||
|
||||
|
||||
@PromptServer.instance.routes.get("/manager/get_esheep_workflow_and_images")
|
||||
async def get_esheep_workflow_and_images(request):
|
||||
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), 'r', encoding='utf-8') as file:
|
||||
data = json.load(file)
|
||||
return web.Response(status=200, text=json.dumps(data))
|
||||
|
||||
|
||||
def set_matrix_auth(json_data):
|
||||
homeserver = json_data['homeserver']
|
||||
username = json_data['username']
|
||||
password = json_data['password']
|
||||
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "w") as f:
|
||||
f.write("\n".join([homeserver, username, password]))
|
||||
|
||||
|
||||
def set_comfyworkflows_auth(comfyworkflows_sharekey):
|
||||
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "w") as f:
|
||||
f.write(comfyworkflows_sharekey)
|
||||
|
||||
|
||||
def has_provided_matrix_auth(matrix_auth):
|
||||
return matrix_auth['homeserver'].strip() and matrix_auth['username'].strip() and matrix_auth['password'].strip()
|
||||
|
||||
|
||||
def has_provided_comfyworkflows_auth(comfyworkflows_sharekey):
|
||||
return comfyworkflows_sharekey.strip()
|
||||
|
||||
|
||||
@PromptServer.instance.routes.post("/manager/share")
|
||||
async def share_art(request):
|
||||
# get json data
|
||||
json_data = await request.json()
|
||||
|
||||
matrix_auth = json_data['matrix_auth']
|
||||
comfyworkflows_sharekey = json_data['cw_auth']['cw_sharekey']
|
||||
|
||||
set_matrix_auth(matrix_auth)
|
||||
set_comfyworkflows_auth(comfyworkflows_sharekey)
|
||||
|
||||
share_destinations = json_data['share_destinations']
|
||||
credits = json_data['credits']
|
||||
title = json_data['title']
|
||||
description = json_data['description']
|
||||
is_nsfw = json_data['is_nsfw']
|
||||
prompt = json_data['prompt']
|
||||
potential_outputs = json_data['potential_outputs']
|
||||
selected_output_index = json_data['selected_output_index']
|
||||
|
||||
try:
|
||||
output_to_share = potential_outputs[int(selected_output_index)]
|
||||
except:
|
||||
# for now, pick the first output
|
||||
output_to_share = potential_outputs[0]
|
||||
|
||||
assert output_to_share['type'] in ('image', 'output')
|
||||
output_dir = folder_paths.get_output_directory()
|
||||
|
||||
if output_to_share['type'] == 'image':
|
||||
asset_filename = output_to_share['image']['filename']
|
||||
asset_subfolder = output_to_share['image']['subfolder']
|
||||
|
||||
if output_to_share['image']['type'] == 'temp':
|
||||
output_dir = folder_paths.get_temp_directory()
|
||||
else:
|
||||
asset_filename = output_to_share['output']['filename']
|
||||
asset_subfolder = output_to_share['output']['subfolder']
|
||||
|
||||
if asset_subfolder:
|
||||
asset_filepath = os.path.join(output_dir, asset_subfolder, asset_filename)
|
||||
else:
|
||||
asset_filepath = os.path.join(output_dir, asset_filename)
|
||||
|
||||
# get the mime type of the asset
|
||||
assetFileType = mimetypes.guess_type(asset_filepath)[0]
|
||||
|
||||
share_website_host = "UNKNOWN"
|
||||
if "comfyworkflows" in share_destinations:
|
||||
share_website_host = "https://comfyworkflows.com"
|
||||
share_endpoint = f"{share_website_host}/api"
|
||||
|
||||
# get presigned urls
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
async with session.post(
|
||||
f"{share_endpoint}/get_presigned_urls",
|
||||
json={
|
||||
"assetFileName": asset_filename,
|
||||
"assetFileType": assetFileType,
|
||||
"workflowJsonFileName": 'workflow.json',
|
||||
"workflowJsonFileType": 'application/json',
|
||||
},
|
||||
) as resp:
|
||||
assert resp.status == 200
|
||||
presigned_urls_json = await resp.json()
|
||||
assetFilePresignedUrl = presigned_urls_json["assetFilePresignedUrl"]
|
||||
assetFileKey = presigned_urls_json["assetFileKey"]
|
||||
workflowJsonFilePresignedUrl = presigned_urls_json["workflowJsonFilePresignedUrl"]
|
||||
workflowJsonFileKey = presigned_urls_json["workflowJsonFileKey"]
|
||||
|
||||
# upload asset
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
async with session.put(assetFilePresignedUrl, data=open(asset_filepath, "rb")) as resp:
|
||||
assert resp.status == 200
|
||||
|
||||
# upload workflow json
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
async with session.put(workflowJsonFilePresignedUrl, data=json.dumps(prompt['workflow']).encode('utf-8')) as resp:
|
||||
assert resp.status == 200
|
||||
|
||||
model_filenames = extract_model_file_names(prompt['workflow'])
|
||||
model_file_paths = find_file_paths(folder_paths.base_path, model_filenames)
|
||||
|
||||
models_info = {}
|
||||
for filename, filepath in model_file_paths.items():
|
||||
models_info[filename] = {
|
||||
"filename": filename,
|
||||
"sha256_checksum": compute_sha256_checksum(filepath),
|
||||
"relative_path": os.path.relpath(filepath, folder_paths.base_path),
|
||||
}
|
||||
|
||||
# make a POST request to /api/upload_workflow with form data key values
|
||||
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
|
||||
form = aiohttp.FormData()
|
||||
if comfyworkflows_sharekey:
|
||||
form.add_field("shareKey", comfyworkflows_sharekey)
|
||||
form.add_field("source", "comfyui_manager")
|
||||
form.add_field("assetFileKey", assetFileKey)
|
||||
form.add_field("assetFileType", assetFileType)
|
||||
form.add_field("workflowJsonFileKey", workflowJsonFileKey)
|
||||
form.add_field("sharedWorkflowWorkflowJsonString", json.dumps(prompt['workflow']))
|
||||
form.add_field("sharedWorkflowPromptJsonString", json.dumps(prompt['output']))
|
||||
form.add_field("shareWorkflowCredits", credits)
|
||||
form.add_field("shareWorkflowTitle", title)
|
||||
form.add_field("shareWorkflowDescription", description)
|
||||
form.add_field("shareWorkflowIsNSFW", str(is_nsfw).lower())
|
||||
form.add_field("currentSnapshot", json.dumps(core.get_current_snapshot()))
|
||||
form.add_field("modelsInfo", json.dumps(models_info))
|
||||
|
||||
async with session.post(
|
||||
f"{share_endpoint}/upload_workflow",
|
||||
data=form,
|
||||
) as resp:
|
||||
assert resp.status == 200
|
||||
upload_workflow_json = await resp.json()
|
||||
workflowId = upload_workflow_json["workflowId"]
|
||||
|
||||
# check if the user has provided Matrix credentials
|
||||
if "matrix" in share_destinations:
|
||||
comfyui_share_room_id = '!LGYSoacpJPhIfBqVfb:matrix.org'
|
||||
filename = os.path.basename(asset_filepath)
|
||||
content_type = assetFileType
|
||||
|
||||
try:
|
||||
from matrix_client.api import MatrixHttpApi
|
||||
from matrix_client.client import MatrixClient
|
||||
|
||||
homeserver = 'matrix.org'
|
||||
if matrix_auth:
|
||||
homeserver = matrix_auth.get('homeserver', 'matrix.org')
|
||||
homeserver = homeserver.replace("http://", "https://")
|
||||
if not homeserver.startswith("https://"):
|
||||
homeserver = "https://" + homeserver
|
||||
|
||||
client = MatrixClient(homeserver)
|
||||
try:
|
||||
token = client.login(username=matrix_auth['username'], password=matrix_auth['password'])
|
||||
if not token:
|
||||
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
|
||||
except:
|
||||
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
|
||||
|
||||
matrix = MatrixHttpApi(homeserver, token=token)
|
||||
with open(asset_filepath, 'rb') as f:
|
||||
mxc_url = matrix.media_upload(f.read(), content_type, filename=filename)['content_uri']
|
||||
|
||||
workflow_json_mxc_url = matrix.media_upload(prompt['workflow'], 'application/json', filename='workflow.json')['content_uri']
|
||||
|
||||
text_content = ""
|
||||
if title:
|
||||
text_content += f"{title}\n"
|
||||
if description:
|
||||
text_content += f"{description}\n"
|
||||
if credits:
|
||||
text_content += f"\ncredits: {credits}\n"
|
||||
response = matrix.send_message(comfyui_share_room_id, text_content)
|
||||
response = matrix.send_content(comfyui_share_room_id, mxc_url, filename, 'm.image')
|
||||
response = matrix.send_content(comfyui_share_room_id, workflow_json_mxc_url, 'workflow.json', 'm.file')
|
||||
except:
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return web.json_response({"error": "An error occurred when sharing your art to Matrix."}, content_type='application/json', status=500)
|
||||
|
||||
return web.json_response({
|
||||
"comfyworkflows": {
|
||||
"url": None if "comfyworkflows" not in share_destinations else f"{share_website_host}/workflows/{workflowId}",
|
||||
},
|
||||
"matrix": {
|
||||
"success": None if "matrix" not in share_destinations else True
|
||||
}
|
||||
}, content_type='application/json', status=200)
|
||||
@ -1,9 +1,31 @@
|
||||
{
|
||||
"models": [
|
||||
{
|
||||
"name": "TAEF1 Decoder",
|
||||
"type": "TAESD",
|
||||
"base": "FLUX.1",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(FLUX.1 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
"filename": "taef1_decoder.pth",
|
||||
"url": "https://github.com/madebyollin/taesd/raw/main/taef1_decoder.pth",
|
||||
"size": "4.71MB"
|
||||
},
|
||||
{
|
||||
"name": "TAEF1 Encoder",
|
||||
"type": "TAESD",
|
||||
"base": "FLUX.1",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(FLUX.1 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
"filename": "taef1_encoder.pth",
|
||||
"url": "https://github.com/madebyollin/taesd/raw/main/taef1_encoder.pth",
|
||||
"size": "4.71MB"
|
||||
},
|
||||
{
|
||||
"name": "TAESD3 Decoder",
|
||||
"type": "TAESD",
|
||||
"base": "SDXL",
|
||||
"base": "SD3",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
@ -14,7 +36,7 @@
|
||||
{
|
||||
"name": "TAESD3 Encoder",
|
||||
"type": "TAESD",
|
||||
"base": "SDXL",
|
||||
"base": "SD3",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
|
||||
@ -9,6 +9,18 @@
|
||||
"description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel."
|
||||
},
|
||||
|
||||
|
||||
|
||||
{
|
||||
"author": "sebord",
|
||||
"title": "ComfyUI-LMCQ [WIP]",
|
||||
"reference": "https://github.com/sebord/ComfyUI-LMCQ",
|
||||
"files": [
|
||||
"https://github.com/sebord/ComfyUI-LMCQ"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI small node toolkit, this toolkit is mainly to update some practical small nodes, to make a contribution to the comfyui ecosystem, PS: 'LMCQ' is the abbreviation of the team name"
|
||||
},
|
||||
{
|
||||
"author": "logtd",
|
||||
"title": "ComfyUI-Fluxtapoz [WIP]",
|
||||
@ -1749,16 +1761,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "This answers the itch for being able to easily paste [a/CivitAI.com](https://civitai.com/) generated data (or other simple metadata) into Comfy in a way that makes it easy to test with multiple checkpoints."
|
||||
},
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI-AnyText [WIP]",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/AnyText](https://github.com/tyxsspa/AnyText/tree/825bcc54687206b15bd7e28ba1a8b095989d58e3) for ComfyUI(EXP)"
|
||||
},
|
||||
{
|
||||
"author": "nidefawl",
|
||||
"title": "ComfyUI-nidefawl [UNSAFE]",
|
||||
|
||||
@ -353,8 +353,11 @@
|
||||
],
|
||||
"https://github.com/ChrisColeTech/ComfyUI-Get-Random-File": [
|
||||
[
|
||||
"GetImageFileByIndexNode",
|
||||
"GetVideoFileByIndexNode",
|
||||
"RandomFilePathNode",
|
||||
"RandomImagePathNode"
|
||||
"RandomImagePathNode",
|
||||
"RandomVideoPathNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-Get-Random-File [UNSAFE]"
|
||||
@ -492,6 +495,8 @@
|
||||
"DisplayText",
|
||||
"LoadVideo",
|
||||
"MiniCPM_VQA",
|
||||
"MiniCPM_VQA_Polished",
|
||||
"MultipleImagesInput",
|
||||
"PreViewVideo"
|
||||
],
|
||||
{
|
||||
@ -884,14 +889,6 @@
|
||||
"title_aux": "visuallabs_comfyui_nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": [
|
||||
[
|
||||
"AnyTextNode_Zho"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-AnyText [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO": [
|
||||
[
|
||||
"AuraSR_Lterative_Zho",
|
||||
@ -1293,8 +1290,42 @@
|
||||
"StableCascade_SuperResolutionControlnet",
|
||||
"StableZero123_Conditioning",
|
||||
"StableZero123_Conditioning_Batched",
|
||||
"StubFloat",
|
||||
"StubImage",
|
||||
"StubInt",
|
||||
"StubMask",
|
||||
"StyleModelApply",
|
||||
"StyleModelLoader",
|
||||
"TestAccumulateNode",
|
||||
"TestAccumulationGetItemNode",
|
||||
"TestAccumulationGetLengthNode",
|
||||
"TestAccumulationHeadNode",
|
||||
"TestAccumulationSetItemNode",
|
||||
"TestAccumulationTailNode",
|
||||
"TestAccumulationToListNode",
|
||||
"TestBoolOperationNode",
|
||||
"TestCustomIsChanged",
|
||||
"TestCustomValidation1",
|
||||
"TestCustomValidation2",
|
||||
"TestCustomValidation3",
|
||||
"TestCustomValidation4",
|
||||
"TestCustomValidation5",
|
||||
"TestDynamicDependencyCycle",
|
||||
"TestExecutionBlocker",
|
||||
"TestFloatConditions",
|
||||
"TestForLoopClose",
|
||||
"TestForLoopOpen",
|
||||
"TestIntConditions",
|
||||
"TestIntMathOperation",
|
||||
"TestLazyMixImages",
|
||||
"TestListToAccumulationNode",
|
||||
"TestMakeListNode",
|
||||
"TestMixedExpansionReturns",
|
||||
"TestStringConditions",
|
||||
"TestToBoolNode",
|
||||
"TestVariadicAverage",
|
||||
"TestWhileLoopClose",
|
||||
"TestWhileLoopOpen",
|
||||
"ThresholdMask",
|
||||
"TomePatchModel",
|
||||
"TripleCLIPLoader",
|
||||
@ -1701,7 +1732,12 @@
|
||||
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils": [
|
||||
[
|
||||
"JHK_Utils_ImageRemoveBackground",
|
||||
"JHK_Utils_LargestImageSelector",
|
||||
"JHK_Utils_LoadEmbed",
|
||||
"JHK_Utils_LoadImageFromPath",
|
||||
"JHK_Utils_RandomImageSelector",
|
||||
"JHK_Utils_SelectSingleImageFromPath",
|
||||
"JHK_Utils_string_filter",
|
||||
"JHK_Utils_string_merge"
|
||||
],
|
||||
{
|
||||
@ -2359,6 +2395,17 @@
|
||||
"title_aux": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration"
|
||||
}
|
||||
],
|
||||
"https://github.com/sebord/ComfyUI-LMCQ": [
|
||||
[
|
||||
"LmcqImageSaver",
|
||||
"LmcqImageSaverTransit",
|
||||
"LmcqImageSaverWeb",
|
||||
"LmcqLoadFluxNF4Checkpoint"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-LMCQ [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/shadowcz007/ComfyUI-PuLID-Test": [
|
||||
[
|
||||
"ApplyPulid",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -11,6 +11,16 @@
|
||||
|
||||
|
||||
|
||||
{
|
||||
"author": "ZHO-ZHO-ZHO",
|
||||
"title": "ComfyUI-AnyText [NOT MAINTAINED]",
|
||||
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText",
|
||||
"files": [
|
||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Unofficial implementation of [a/AnyText](https://github.com/tyxsspa/AnyText/tree/825bcc54687206b15bd7e28ba1a8b095989d58e3) for ComfyUI(EXP)"
|
||||
},
|
||||
{
|
||||
"author": "shinich39",
|
||||
"title": "comfyui-pkg39 [DEPRECATED]",
|
||||
|
||||
@ -8,17 +8,165 @@
|
||||
"description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!"
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
{
|
||||
"author": "hben35096",
|
||||
"title": "ComfyUI-ReplenishNodes",
|
||||
"reference": "https://github.com/hben35096/ComfyUI-ReplenishNodes",
|
||||
"files": [
|
||||
"https://github.com/hben35096/ComfyUI-ReplenishNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This repository contains two custom nodes for ComfyUI that utilize the [a/CLIPSeg model](https://huggingface.co/docs/transformers/main/en/model_doc/clipseg) to generate masks for image inpainting tasks based on text prompts."
|
||||
},
|
||||
{
|
||||
"author": "markuryy",
|
||||
"title": "ComfyUI Flux Prompt Saver",
|
||||
"reference": "https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver",
|
||||
"files": [
|
||||
"https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "The Flux Prompt Saver is a custom node for ComfyUI that works in conjunction with the Flux Sampler Parameters node from the ComfyUI Essentials package. This node allows you to save images with metadata that includes information from the Flux Sampler Parameters pipeline."
|
||||
},
|
||||
{
|
||||
"author": "shinich39",
|
||||
"title": "comfyui-textarea-keybindings",
|
||||
"reference": "https://github.com/shinich39/comfyui-textarea-keybindings",
|
||||
"files": [
|
||||
"https://github.com/shinich39/comfyui-textarea-keybindings"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Add keybindings to textarea."
|
||||
},
|
||||
{
|
||||
"author": "NvidiaGameWorksAdmin",
|
||||
"title": "ComfyUI-RTX-Remix",
|
||||
"id": "comfyui-rtx-remix",
|
||||
"reference": "https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix",
|
||||
"files": [
|
||||
"https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Use ComfyUI with RTX Remix to remaster classic games [a/https://github.com/NVIDIAGameWorks/rtx-remix](https://github.com/NVIDIAGameWorks/rtx-remix)"
|
||||
},
|
||||
{
|
||||
"author": "Ryuukeisyou",
|
||||
"title": "ComfyUI-SyncTalk",
|
||||
"id": "synctalk",
|
||||
"reference": "https://github.com/Ryuukeisyou/ComfyUI-SyncTalk",
|
||||
"files": [
|
||||
"https://github.com/Ryuukeisyou/ComfyUI-SyncTalk"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI implemntation for [a/SyncTalk](https://github.com/ZiqiaoPeng/SyncTalk)"
|
||||
},
|
||||
{
|
||||
"author": "aiXander",
|
||||
"title": "Eden.art LoRa Trainer",
|
||||
"id": "Eden",
|
||||
"reference": "https://github.com/edenartlab/sd-lora-trainer",
|
||||
"files": [
|
||||
"https://github.com/edenartlab/sd-lora-trainer"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Maintained by Eden.art, this is a very fast, well tuned trainer for SDXL and SD15"
|
||||
},
|
||||
{
|
||||
"author": "ControlAltAI",
|
||||
"title": "ControlAltAI Nodes",
|
||||
"id": "controlaltai",
|
||||
"reference": "https://github.com/gseth/ControlAltAI-Nodes",
|
||||
"files":
|
||||
[
|
||||
"https://github.com/gseth/ControlAltAI-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Quality of Life ComfyUI nodes starting with Flux Resolution Calculator and Flux Sampler."
|
||||
},
|
||||
{
|
||||
"author": "OliverCrosby",
|
||||
"title": "ComfyUI Minimap",
|
||||
"id": "minimap",
|
||||
"reference": "https://github.com/OliverCrosby/Comfyui-Minimap",
|
||||
"files": [
|
||||
"https://github.com/OliverCrosby/Comfyui-Minimap"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A simple minimap in the bottom-right of the window showing the full workflow, left click to navigate"
|
||||
},
|
||||
{
|
||||
"author": "leeguandong",
|
||||
"title": "ComfyUI nodes to use CrossImageAttention",
|
||||
"reference": "https://github.com/leeguandong/ComfyUI_CrossImageAttention",
|
||||
"files": [
|
||||
"https://github.com/leeguandong/ComfyUI_CrossImageAttention"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI for [a/CrossImageAttention](https://github.com/garibida/cross-image-attention)"
|
||||
},
|
||||
{
|
||||
"author": "leeguandong",
|
||||
"title": "ComfyUI nodes to use Style-Aligned",
|
||||
"reference": "https://github.com/leeguandong/ComfyUI_Style_Aligned",
|
||||
"files": [
|
||||
"https://github.com/leeguandong/ComfyUI_Style_Aligned"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI for [a/style-aligned](https://github.com/google/style-aligned)"
|
||||
},
|
||||
{
|
||||
"author": "fairy-root",
|
||||
"title": "Flux Prompt Generator for ComfyUI",
|
||||
"reference": "https://github.com/fairy-root/Flux-Prompt-Generator",
|
||||
"files": [
|
||||
"https://github.com/fairy-root/Flux-Prompt-Generator"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A flexible and customizable prompt generator for generating detailed and creative prompts for image generation models for ComfyUI"
|
||||
},
|
||||
{
|
||||
"author": "doomy23",
|
||||
"title": "ComfyUI-D00MYsNodes",
|
||||
"reference": "https://github.com/doomy23/ComfyUI-D00MYsNodes",
|
||||
"files":
|
||||
[
|
||||
"https://github.com/doomy23/ComfyUI-D00MYsNodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:ImagesToPNG. A set of custom nodes for ComfyUI I needed for myself but I'm sharing with the public."
|
||||
},
|
||||
{
|
||||
"author": "Sieyalixnet",
|
||||
"title": "ComfyUI_Textarea_Loaders",
|
||||
"reference": "https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders",
|
||||
"files":
|
||||
[
|
||||
"https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "An easy custom node that makes the some loaders' input as Text instead of file selector.\nFor example, there are many characters in different loras respectively. If you want to generate different characters' pictures, you have to select corresponding lora, and then edit the prompt. It may cost much time.\nTo solve this problem, You can use it with a chrome extension https://github.com/Sieyalixnet/ComfyUI-Prompt-Formatter-Extension that makes the queue prompt easier when you dealing with massive loras and prompt."
|
||||
},
|
||||
{
|
||||
"author": "shinich39",
|
||||
"title": "comfyui-group-selection",
|
||||
"reference": "https://github.com/shinich39/comfyui-group-selection",
|
||||
"files": [
|
||||
"https://github.com/shinich39/comfyui-group-selection"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Create a new group of nodes."
|
||||
},
|
||||
{
|
||||
"author": "ryanontheinside",
|
||||
"title": "ComfyUI_RyanOnTheInside",
|
||||
"title": "RyanOnTheInside",
|
||||
"reference": "https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside",
|
||||
"files": [
|
||||
"https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "RyanOnTheInside node pack introduces the following (so far): Particle Systems, Optical Flow, Temporal Masks."
|
||||
"description": "Custom nodes introducing particle simulations, optical flow, and temporal masks"
|
||||
},
|
||||
{
|
||||
"author": "city96",
|
||||
@ -29,7 +177,7 @@
|
||||
"https://github.com/city96/ComfyUI-GGUF"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "GGUF Quantization support for native ComfyUI models\nThis is currently very much WIP. These custom nodes provide support for model files stored in the GGUF format popularized by llama.cpp.\nWhile quantization wasn't feasible for regular UNET models (conv2d), transformer/DiT models such as flux seem less affected by quantization. This allows running it in much lower bits per weight variable bitrate quants on low-end GPUs.\n[w/LoRA / Controlnet / etc are currently not supported due to the weights being quantized.]"
|
||||
"description": "GGUF Quantization support for native ComfyUI models\nThis is currently very much WIP. These custom nodes provide support for model files stored in the GGUF format popularized by llama.cpp.\nWhile quantization wasn't feasible for regular UNET models (conv2d), transformer/DiT models such as flux seem less affected by quantization. This allows running it in much lower bits per weight variable bitrate quants on low-end GPUs."
|
||||
},
|
||||
{
|
||||
"author": "smthemex",
|
||||
@ -464,7 +612,6 @@
|
||||
"install_type": "git-clone",
|
||||
"description": "Nodes:NSFW Detector"
|
||||
},
|
||||
|
||||
{
|
||||
"author": "shiimizu",
|
||||
"title": "Semantic-aware Guidance (S-CFG)",
|
||||
@ -549,151 +696,6 @@
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI for [a/InternVL](https://github.com/OpenGVLab/InternVL)"
|
||||
},
|
||||
{
|
||||
"author": "SEkINVR",
|
||||
"title": "ComfyUI-Animator",
|
||||
"reference": "https://github.com/SEkINVR/ComfyUI-Animator",
|
||||
"files": [
|
||||
"https://github.com/SEkINVR/ComfyUI-Animator"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This custom node for ComfyUI provides full-body animation capabilities, including facial rigging, various lighting styles, and green screen output."
|
||||
},
|
||||
{
|
||||
"author": "NeuralSamurAI",
|
||||
"title": "PromptJSON Node for ComfyUI",
|
||||
"reference": "https://github.com/NeuralSamurAI/ComfyUI-PromptJSON",
|
||||
"files": [
|
||||
"https://github.com/NeuralSamurAI/ComfyUI-PromptJSON"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "PromptJSON is a custom node for ComfyUI that structures natural language prompts and generates prompts for external LLM nodes in image generation workflows. It aids in creating consistent, schema-based image descriptions."
|
||||
},
|
||||
{
|
||||
"author": "leeguandong",
|
||||
"title": "ComfyUI_M3Net",
|
||||
"reference": "https://github.com/leeguandong/ComfyUI_M3Net",
|
||||
"files": [
|
||||
"https://github.com/leeguandong/ComfyUI_M3Net"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "ComfyUI for [a/M3Net](https://github.com/I2-Multimedia-Lab/M3Net)"
|
||||
},
|
||||
{
|
||||
"author": "al-swaiti",
|
||||
"title": "GeminiOllama ComfyUI Extension",
|
||||
"reference": "https://github.com/al-swaiti/ComfyUI-OllamaGemini",
|
||||
"files": [
|
||||
"https://github.com/al-swaiti/ComfyUI-OllamaGemini"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This extension integrates Google's Gemini API and Ollama into ComfyUI, allowing users to leverage these powerful language models directly within their ComfyUI workflows."
|
||||
},
|
||||
{
|
||||
"author": "lenskikh",
|
||||
"title": "Propmt Worker",
|
||||
"reference": "https://github.com/lenskikh/ComfyUI-Prompt-Worker",
|
||||
"files": [
|
||||
"https://github.com/lenskikh/ComfyUI-Prompt-Worker"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Node:Prompt Worker. A text manipulation node for postprocessing of prompt."
|
||||
},
|
||||
{
|
||||
"author": "SeniorPioner",
|
||||
"title": "SP-Nodes",
|
||||
"id": "spnodes",
|
||||
"reference": "https://github.com/bananasss00/ComfyUI-SP-Nodes",
|
||||
"files": [
|
||||
"https://github.com/bananasss00/ComfyUI-SP-Nodes"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Node Pack: PromptChecker for token toggling, KoboldCPP API, ModelMerging, Telegram-Bot-API, and more"
|
||||
},
|
||||
{
|
||||
"author": "AIFSH",
|
||||
"title": "DHLive-ComfyUI",
|
||||
"id": "dhlive",
|
||||
"reference": "https://github.com/AIFSH/DHLive-ComfyUI",
|
||||
"files": [
|
||||
"https://github.com/AIFSH/DHLive-ComfyUI"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "a comfyui custom node for [a/DH_live](https://github.com/kleinlee/DH_live)"
|
||||
},
|
||||
{
|
||||
"author": "NeuralSamurAI",
|
||||
"title": "Dimensional Latent Perlin for ComfyUI",
|
||||
"reference": "https://github.com/NeuralSamurAI/ComfyUI-Dimensional-Latent-Perlin",
|
||||
"files": [
|
||||
"https://github.com/NeuralSamurAI/ComfyUI-Dimensional-Latent-Perlin"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Dimensional Latent Perlin is a custom node for ComfyUI that generates Perlin noise in the latent space. This node is designed to work seamlessly with various diffusion models and can be used as an alternative or complement to standard random noise generators in image generation pipelines."
|
||||
},
|
||||
{
|
||||
"author": "Dobidop",
|
||||
"title": "Dobidop ComfyStereo",
|
||||
"id": "simple-stereoscopic",
|
||||
"reference": "https://github.com/Dobidop/ComfyStereo",
|
||||
"files": [
|
||||
"https://github.com/Dobidop/ComfyStereo"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Two simple nodes for stereoscopic image generation. Nodes: Stereo Image Node - a basic port from the Automatic1111 stereo script in thygate/stable-diffusion-webui-depthmap-script, LazyStereo - a naïve stereo image generator"
|
||||
},
|
||||
{
|
||||
"author": "caleboleary",
|
||||
"title": "Arc2Face ComfyUI Node Library",
|
||||
"reference": "https://github.com/caleboleary/ComfyUI-Arc2Face",
|
||||
"files": [
|
||||
"https://github.com/caleboleary/ComfyUI-Arc2Face"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "This ComfyUI node library builds upon the work done to train the [a/Arc2Face](https://github.com/foivospar/Arc2Face) model by foivospar. It provides a set of nodes for ComfyUI that allow users to extract face embeddings, generate images based on these embeddings, and perform image-to-image transformations."
|
||||
},
|
||||
{
|
||||
"author": "NMWave",
|
||||
"title": "Image Captioning and Tagging Assistor Nodes",
|
||||
"id": "naderimagecaptionandtag",
|
||||
"reference": "https://github.com/NMWave/ComfyUI-Nader-Tagging",
|
||||
"files": [
|
||||
"https://github.com/NMWave/ComfyUI-Nader-Tagging"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "A small set of useful nodes which aid with the tagging process by splitting tags and strings, alternating tags from multiple sources and removing duplicates."
|
||||
},
|
||||
{
|
||||
"author": "alpertunga-bile",
|
||||
"title": "image-caption-comfyui",
|
||||
"reference": "https://github.com/alpertunga-bile/image-caption-comfyui",
|
||||
"files": [
|
||||
"https://github.com/alpertunga-bile/image-caption-comfyui"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "Image caption node for ComfyUI. You can load your image caption model and generate prompts with the given picture. Insert prompt node is added here to help the users to add their prompts easily."
|
||||
},
|
||||
{
|
||||
"author": "GeekyGhost",
|
||||
"title": "ComfyUI-GeekyRemB",
|
||||
"reference": "https://github.com/GeekyGhost/ComfyUI-GeekyRemB",
|
||||
"files": [
|
||||
"https://github.com/GeekyGhost/ComfyUI-GeekyRemB"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "GeekyRemB is a powerful and versatile image processing node for ComfyUI, designed to remove backgrounds from images with advanced customization options. This node leverages the rembg library and offers a wide range of features for fine-tuning the background removal process and enhancing the resulting images."
|
||||
},
|
||||
{
|
||||
"author": "AIFSH",
|
||||
"title": "AniTalker-ComfyUI",
|
||||
"id": "anitalker",
|
||||
"reference": "https://github.com/AIFSH/AniTalker-ComfyUI",
|
||||
"files": [
|
||||
"https://github.com/AIFSH/AniTalker-ComfyUI"
|
||||
],
|
||||
"install_type": "git-clone",
|
||||
"description": "a comfyui custom node for [a/AniTalker](https://github.com/X-LANCE/AniTalker)"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -907,9 +907,9 @@
|
||||
],
|
||||
"https://github.com/Anibaaal/ComfyUI-UX-Nodes": [
|
||||
[
|
||||
"DenoiseCalculator",
|
||||
"EasyResolutionPicker",
|
||||
"StepCalculator"
|
||||
"SmoothCurveMerger",
|
||||
"UNETSave"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI UX Nodes"
|
||||
@ -2070,6 +2070,7 @@
|
||||
"BinaryPreprocessor",
|
||||
"CannyEdgePreprocessor",
|
||||
"ColorPreprocessor",
|
||||
"ControlNetAuxSimpleAddText",
|
||||
"ControlNetPreprocessorSelector",
|
||||
"DSINE-NormalMapPreprocessor",
|
||||
"DWPreprocessor",
|
||||
@ -2077,6 +2078,7 @@
|
||||
"DepthAnythingPreprocessor",
|
||||
"DepthAnythingV2Preprocessor",
|
||||
"DiffusionEdge_Preprocessor",
|
||||
"ExecuteAllControlNetPreprocessors",
|
||||
"FacialPartColoringFromPoseKps",
|
||||
"FakeScribblePreprocessor",
|
||||
"HEDPreprocessor",
|
||||
@ -2790,6 +2792,8 @@
|
||||
"DisplayText",
|
||||
"LoadVideo",
|
||||
"MiniCPM_VQA",
|
||||
"MiniCPM_VQA_Polished",
|
||||
"MultipleImagesInput",
|
||||
"PreViewVideo"
|
||||
],
|
||||
{
|
||||
@ -3779,6 +3783,7 @@
|
||||
],
|
||||
"https://github.com/MohammadAboulEla/ComfyUI-iTools": [
|
||||
[
|
||||
"iToolsAddOverlay",
|
||||
"iToolsLoadImagePlus",
|
||||
"iToolsPromptLoader",
|
||||
"iToolsPromptSaver"
|
||||
@ -3937,6 +3942,38 @@
|
||||
"title_aux": "Image Captioning and Tagging Assistor Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/NVIDIAGameWorks/ComfyUI-RTX-Remix": [
|
||||
[
|
||||
"RTXRemixCreateLayer",
|
||||
"RTXRemixDefineLayerId",
|
||||
"RTXRemixDeleteFile",
|
||||
"RTXRemixEndContext",
|
||||
"RTXRemixGetEditTarget",
|
||||
"RTXRemixGetLayers",
|
||||
"RTXRemixGetTextures",
|
||||
"RTXRemixIngestTexture",
|
||||
"RTXRemixInvertBool",
|
||||
"RTXRemixLayerType",
|
||||
"RTXRemixLayerTypes",
|
||||
"RTXRemixMuteLayer",
|
||||
"RTXRemixRemoveLayer",
|
||||
"RTXRemixRestAPIDetails",
|
||||
"RTXRemixSaveLayer",
|
||||
"RTXRemixSetEditTarget",
|
||||
"RTXRemixSetTexture",
|
||||
"RTXRemixStartContext",
|
||||
"RTXRemixStrToList",
|
||||
"RTXRemixStringConcatenate",
|
||||
"RTXRemixStringConstant",
|
||||
"RTXRemixSwitch",
|
||||
"RTXRemixTextureTypeToUSDAttribute",
|
||||
"RTXRemixTexturesType",
|
||||
"RTXRemixTexturesTypes"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-RTX-Remix"
|
||||
}
|
||||
],
|
||||
"https://github.com/NeuralSamurAI/ComfyUI-Dimensional-Latent-Perlin": [
|
||||
[
|
||||
"NoisyLatentPerlinD"
|
||||
@ -4979,6 +5016,15 @@
|
||||
"title_aux": "Lazy Pony Prompter"
|
||||
}
|
||||
],
|
||||
"https://github.com/Sieyalixnet/ComfyUI_Textarea_Loaders": [
|
||||
[
|
||||
"CheckPointLoader_Text",
|
||||
"LoRALoader_Text"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_Textarea_Loaders"
|
||||
}
|
||||
],
|
||||
"https://github.com/Smirnov75/ComfyUI-mxToolkit": [
|
||||
[
|
||||
"mxSeed",
|
||||
@ -9165,8 +9211,42 @@
|
||||
"StableCascade_SuperResolutionControlnet",
|
||||
"StableZero123_Conditioning",
|
||||
"StableZero123_Conditioning_Batched",
|
||||
"StubFloat",
|
||||
"StubImage",
|
||||
"StubInt",
|
||||
"StubMask",
|
||||
"StyleModelApply",
|
||||
"StyleModelLoader",
|
||||
"TestAccumulateNode",
|
||||
"TestAccumulationGetItemNode",
|
||||
"TestAccumulationGetLengthNode",
|
||||
"TestAccumulationHeadNode",
|
||||
"TestAccumulationSetItemNode",
|
||||
"TestAccumulationTailNode",
|
||||
"TestAccumulationToListNode",
|
||||
"TestBoolOperationNode",
|
||||
"TestCustomIsChanged",
|
||||
"TestCustomValidation1",
|
||||
"TestCustomValidation2",
|
||||
"TestCustomValidation3",
|
||||
"TestCustomValidation4",
|
||||
"TestCustomValidation5",
|
||||
"TestDynamicDependencyCycle",
|
||||
"TestExecutionBlocker",
|
||||
"TestFloatConditions",
|
||||
"TestForLoopClose",
|
||||
"TestForLoopOpen",
|
||||
"TestIntConditions",
|
||||
"TestIntMathOperation",
|
||||
"TestLazyMixImages",
|
||||
"TestListToAccumulationNode",
|
||||
"TestMakeListNode",
|
||||
"TestMixedExpansionReturns",
|
||||
"TestStringConditions",
|
||||
"TestToBoolNode",
|
||||
"TestVariadicAverage",
|
||||
"TestWhileLoopClose",
|
||||
"TestWhileLoopOpen",
|
||||
"ThresholdMask",
|
||||
"TomePatchModel",
|
||||
"TripleCLIPLoader",
|
||||
@ -9594,14 +9674,16 @@
|
||||
"CFGSkimming",
|
||||
"CustomPromptLoader",
|
||||
"DynamicStringCombinerNode",
|
||||
"FileReaderNode",
|
||||
"FlexibleStringMergerNode",
|
||||
"GPT4MiniNode",
|
||||
"GPT4VisionNode",
|
||||
"Gpt4CustomVision",
|
||||
"Gpt4VisionCloner",
|
||||
"MergedOllamaNode",
|
||||
"MedianOppositeColorNode",
|
||||
"OllamaNode",
|
||||
"PGSD3LatentGenerator",
|
||||
"ProminentOppositeColorNode",
|
||||
"PromptGenerator",
|
||||
"RandomIntegerNode",
|
||||
"SentenceMixerNode",
|
||||
@ -10054,6 +10136,15 @@
|
||||
"title_aux": "ComfyUI-Keyframed"
|
||||
}
|
||||
],
|
||||
"https://github.com/doomy23/ComfyUI-D00MYsNodes": [
|
||||
[
|
||||
"Images_Converter|D00MYs",
|
||||
"Show_Text|D00MYs"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-D00MYsNodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/drago87/ComfyUI_Dragos_Nodes": [
|
||||
[
|
||||
"file_padding",
|
||||
@ -10146,7 +10237,15 @@
|
||||
"WidthHeightPicker"
|
||||
],
|
||||
{
|
||||
"title_aux": "Various custom nodes by Eden.art"
|
||||
"title_aux": "Eden.art nodesuite"
|
||||
}
|
||||
],
|
||||
"https://github.com/edenartlab/sd-lora-trainer": [
|
||||
[
|
||||
"Eden_LoRa_trainer"
|
||||
],
|
||||
{
|
||||
"title_aux": "Eden.art LoRa Trainer"
|
||||
}
|
||||
],
|
||||
"https://github.com/emojiiii/ComfyUI_Emojiiii_Custom_Nodes": [
|
||||
@ -10243,6 +10342,14 @@
|
||||
"title_aux": "ComfyUI-Showrunner-Utils"
|
||||
}
|
||||
],
|
||||
"https://github.com/fairy-root/Flux-Prompt-Generator": [
|
||||
[
|
||||
"FluxPromptGenerator"
|
||||
],
|
||||
{
|
||||
"title_aux": "Flux Prompt Generator for ComfyUI"
|
||||
}
|
||||
],
|
||||
"https://github.com/fairy-root/comfyui-ollama-llms": [
|
||||
[
|
||||
"ConcatenateText",
|
||||
@ -10400,7 +10507,6 @@
|
||||
"FL_Shadertoy",
|
||||
"FL_SimpleGPTVision",
|
||||
"FL_SystemCheck",
|
||||
"FL_TD_Sampler",
|
||||
"FL_TetrisGame",
|
||||
"FL_TimeLine",
|
||||
"FL_UpscaleModel",
|
||||
@ -11166,6 +11272,15 @@
|
||||
"title_aux": "ComfyUI Griptape Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/gseth/ControlAltAI-Nodes": [
|
||||
[
|
||||
"FluxResolutionNode",
|
||||
"FluxSampler"
|
||||
],
|
||||
{
|
||||
"title_aux": "ControlAltAI Nodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/guill/abracadabra-comfyui": [
|
||||
[
|
||||
"AbracadabraNode",
|
||||
@ -11280,6 +11395,15 @@
|
||||
"title_aux": "ComfyUI OpenVoice"
|
||||
}
|
||||
],
|
||||
"https://github.com/hben35096/ComfyUI-ReplenishNodes": [
|
||||
[
|
||||
"CLIPSegToMask",
|
||||
"CombineSegMasks"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-ReplenishNodes"
|
||||
}
|
||||
],
|
||||
"https://github.com/hben35096/ComfyUI-ToolBox": [
|
||||
[
|
||||
"AutoDLDownload",
|
||||
@ -11336,6 +11460,7 @@
|
||||
"classify_function_plus",
|
||||
"classify_persona",
|
||||
"classify_persona_plus",
|
||||
"clear_file",
|
||||
"clear_model",
|
||||
"custom_persona",
|
||||
"discord_bot",
|
||||
@ -12236,6 +12361,7 @@
|
||||
"JN_AudioSetChannels",
|
||||
"JN_AudioSlice",
|
||||
"JN_AudioSpeed",
|
||||
"JN_AudioSplitChannels",
|
||||
"JN_AudioStackChannels",
|
||||
"JN_AudioTempo",
|
||||
"JN_AudioTrimSilence",
|
||||
@ -12289,6 +12415,9 @@
|
||||
"JN_MaskToImage",
|
||||
"JN_MathOperation",
|
||||
"JN_MathOperationArray",
|
||||
"JN_MeowHrtfAudio3d",
|
||||
"JN_MeowHrtfModel",
|
||||
"JN_MeowHrtfPosition",
|
||||
"JN_MeowLoadVoice",
|
||||
"JN_MeowSaveVoice",
|
||||
"JN_MeowSentenceSplit",
|
||||
@ -12952,6 +13081,7 @@
|
||||
"JoinStringMulti",
|
||||
"JoinStrings",
|
||||
"LoadAndResizeImage",
|
||||
"LoadImagesFromFolderKJ",
|
||||
"LoadResAdapterNormalization",
|
||||
"MaskBatchMulti",
|
||||
"MaskOrImageToWeight",
|
||||
@ -13369,6 +13499,18 @@
|
||||
"title_aux": "LNL Frame Selector"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_CrossImageAttention": [
|
||||
[
|
||||
"AppearanceTransferInference",
|
||||
"AppearanceTransferModelModelLoader",
|
||||
"CIAConfig",
|
||||
"LoadImagePath",
|
||||
"LoadLatents"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI nodes to use CrossImageAttention"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_InternVL2": [
|
||||
[
|
||||
"DynamicPreprocess",
|
||||
@ -13399,6 +13541,22 @@
|
||||
"title_aux": "ComfyUI_M3Net"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_Style_Aligned": [
|
||||
[
|
||||
"SAControlnet_ModelLoader",
|
||||
"SADepth",
|
||||
"SAHandler",
|
||||
"SAInversion",
|
||||
"SASDXLControlnetKsampler",
|
||||
"SASDXLKampler",
|
||||
"SASDXLTransferKsampler",
|
||||
"SASDXL_ModelLoader",
|
||||
"SchedulerLoader"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI nodes to use Style-Aligned"
|
||||
}
|
||||
],
|
||||
"https://github.com/leeguandong/ComfyUI_VideoEditing": [
|
||||
[
|
||||
"LoadVideo2Images",
|
||||
@ -14206,6 +14364,14 @@
|
||||
"title_aux": "Recommended Resolution Calculator"
|
||||
}
|
||||
],
|
||||
"https://github.com/markuryy/ComfyUI-Flux-Prompt-Saver": [
|
||||
[
|
||||
"FluxPromptSaver"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI Flux Prompt Saver"
|
||||
}
|
||||
],
|
||||
"https://github.com/martijnat/comfyui-previewlatent": [
|
||||
[
|
||||
"PreviewLatent",
|
||||
@ -14542,10 +14708,8 @@
|
||||
"CanvasCreatorSimple",
|
||||
"CircleCreator",
|
||||
"CirclesGenerator",
|
||||
"CreateCircleMask",
|
||||
"CreateMaskWithCanvas",
|
||||
"CreateNestedPNGMask",
|
||||
"CreatePolygonPNGMask",
|
||||
"CreateSimpleMask",
|
||||
"CreateTillingPNGMask",
|
||||
"CreateWatermarkRemovalMask",
|
||||
@ -14563,6 +14727,7 @@
|
||||
"IntMultiplication",
|
||||
"IntSubtraction",
|
||||
"IntToFloatMultiplication",
|
||||
"LoRALoaderWithNameStacker",
|
||||
"LogicNot",
|
||||
"NoneToZero",
|
||||
"NumeralToString",
|
||||
@ -15739,12 +15904,14 @@
|
||||
"ParticleEmissionMask",
|
||||
"ParticleEmitter",
|
||||
"PulsatingParticleSystemMask",
|
||||
"SpringJointSetting",
|
||||
"StaticBody",
|
||||
"TextMaskNode",
|
||||
"Vortex",
|
||||
"_mfc"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI_RyanOnTheInside"
|
||||
"title_aux": "RyanOnTheInside"
|
||||
}
|
||||
],
|
||||
"https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [
|
||||
@ -16948,6 +17115,7 @@
|
||||
"Compare-\ud83d\udd2c",
|
||||
"DebugPrint-\ud83d\udd2c",
|
||||
"Float-\ud83d\udd2c",
|
||||
"If ANY execute A else B-\ud83d\udd2c",
|
||||
"If ANY return A else B-\ud83d\udd2c",
|
||||
"Int-\ud83d\udd2c",
|
||||
"String-\ud83d\udd2c"
|
||||
@ -18223,6 +18391,7 @@
|
||||
"CheckpointLoaderSimpleWithSwitch",
|
||||
"ColorCorrectOfUtils",
|
||||
"ConcatTextOfUtils",
|
||||
"GenderControlOutput",
|
||||
"ImageBatchOneOrMore",
|
||||
"ImageCompositeMaskedWithSwitch",
|
||||
"ImageConcanateOfUtils",
|
||||
|
||||
@ -1,5 +1,28 @@
|
||||
{
|
||||
"models": [
|
||||
{
|
||||
"name": "TAEF1 Decoder",
|
||||
"type": "TAESD",
|
||||
"base": "FLUX.1",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(FLUX.1 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
"filename": "taef1_decoder.pth",
|
||||
"url": "https://github.com/madebyollin/taesd/raw/main/taef1_decoder.pth",
|
||||
"size": "4.71MB"
|
||||
},
|
||||
{
|
||||
"name": "TAEF1 Encoder",
|
||||
"type": "TAESD",
|
||||
"base": "FLUX.1",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(FLUX.1 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
"filename": "taef1_encoder.pth",
|
||||
"url": "https://github.com/madebyollin/taesd/raw/main/taef1_encoder.pth",
|
||||
"size": "4.71MB"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "comfyanonymous/clip_l",
|
||||
"type": "clip",
|
||||
@ -257,7 +280,7 @@
|
||||
{
|
||||
"name": "TAESD3 Decoder",
|
||||
"type": "TAESD",
|
||||
"base": "SDXL",
|
||||
"base": "SD3",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
@ -268,7 +291,7 @@
|
||||
{
|
||||
"name": "TAESD3 Encoder",
|
||||
"type": "TAESD",
|
||||
"base": "SDXL",
|
||||
"base": "SD3",
|
||||
"save_path": "vae_approx",
|
||||
"description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.",
|
||||
"reference": "https://github.com/madebyollin/taesd",
|
||||
@ -670,52 +693,6 @@
|
||||
"filename": "model.safetensors",
|
||||
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors",
|
||||
"size": "2.53GB"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "IC-Light/fc",
|
||||
"type": "IC-Light",
|
||||
"base": "SD1.5",
|
||||
"save_path": "unet/IC-Light",
|
||||
"description": "The default relighting model, conditioned on text and foreground",
|
||||
"reference": "https://huggingface.co/lllyasviel/ic-light",
|
||||
"filename": "iclight_sd15_fc.safetensors",
|
||||
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors",
|
||||
"size": "1.72GB"
|
||||
},
|
||||
{
|
||||
"name": "IC-Light/fbc",
|
||||
"type": "IC-Light",
|
||||
"base": "SD1.5",
|
||||
"save_path": "unet/IC-Light",
|
||||
"description": "Relighting model conditioned with text, foreground, and background",
|
||||
"reference": "https://huggingface.co/lllyasviel/ic-light",
|
||||
"filename": "iclight_sd15_fbc.safetensors",
|
||||
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors",
|
||||
"size": "1.72GB"
|
||||
},
|
||||
{
|
||||
"name": "IC-Light/fcon",
|
||||
"type": "IC-Light",
|
||||
"base": "SD1.5",
|
||||
"save_path": "unet/IC-Light",
|
||||
"description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise",
|
||||
"reference": "https://huggingface.co/lllyasviel/ic-light",
|
||||
"filename": "iclight_sd15_fcon.safetensors",
|
||||
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors",
|
||||
"size": "1.72GB"
|
||||
},
|
||||
|
||||
{
|
||||
"name": "MonsterMMORPG/insightface (for InstantID)",
|
||||
"type": "insightface",
|
||||
"base": "SDXL",
|
||||
"save_path": "insightface/models",
|
||||
"description": "MonsterMMORPG insightface model for cubiq/InstantID",
|
||||
"reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main",
|
||||
"filename": "antelopev2.zip",
|
||||
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip",
|
||||
"size": "360.7MB"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@ -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 = "2.49"
|
||||
version = "2.50"
|
||||
license = { file = "LICENSE.txt" }
|
||||
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user