Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa1b514440 | ||
|
|
1579c58876 | ||
|
|
153d044331 | ||
|
|
f2496f7054 | ||
|
|
99022f4f3d | ||
|
|
60a5e4f261 | ||
|
|
661586d3b6 | ||
|
|
abc26cf906 | ||
|
|
12351bada7 | ||
|
|
a6816d53d7 | ||
|
|
3b0709f5f2 | ||
|
|
d7af7e2917 | ||
|
|
6516e62d33 | ||
|
|
6b832edd2f | ||
|
|
eebace1652 | ||
|
|
6ff6e05408 | ||
|
|
aaf569ca8c | ||
|
|
31eef6222e | ||
|
|
9963afa558 |
24
cm-cli.py
24
cm-cli.py
@@ -31,8 +31,7 @@ if comfy_path is None:
|
|||||||
except:
|
except:
|
||||||
print("\n[bold yellow]WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.[/bold yellow]", file=sys.stderr)
|
print("\n[bold yellow]WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.[/bold yellow]", file=sys.stderr)
|
||||||
comfy_path = os.path.abspath(os.path.join(manager_util.comfyui_manager_path, '..', '..'))
|
comfy_path = os.path.abspath(os.path.join(manager_util.comfyui_manager_path, '..', '..'))
|
||||||
|
sys.path.append(comfy_path)
|
||||||
sys.path.append(comfy_path)
|
|
||||||
|
|
||||||
import utils.extra_config
|
import utils.extra_config
|
||||||
import cm_global
|
import cm_global
|
||||||
@@ -1012,17 +1011,32 @@ def save_snapshot(
|
|||||||
user_directory: str = typer.Option(
|
user_directory: str = typer.Option(
|
||||||
None,
|
None,
|
||||||
help="user directory"
|
help="user directory"
|
||||||
)
|
),
|
||||||
|
full_snapshot: Annotated[
|
||||||
|
bool,
|
||||||
|
typer.Option(
|
||||||
|
show_default=False, help="If the snapshot should include custom node, ComfyUI version and pip versions (default), or only custom node details"
|
||||||
|
),
|
||||||
|
] = True,
|
||||||
):
|
):
|
||||||
cmd_ctx.set_user_directory(user_directory)
|
cmd_ctx.set_user_directory(user_directory)
|
||||||
|
|
||||||
path = asyncio.run(core.save_snapshot_with_postfix('snapshot', output))
|
if(not output.endswith('.json') and not output.endswith('.yaml')):
|
||||||
|
print("ERROR: output path should be either '.json' or '.yaml' file.")
|
||||||
|
raise typer.Exit(code=1)
|
||||||
|
|
||||||
|
dir_path = os.path.dirname(output)
|
||||||
|
if(dir_path != '' and not os.path.exists(dir_path)):
|
||||||
|
print(f"ERROR: {output} path not exists.")
|
||||||
|
raise typer.Exit(code=1)
|
||||||
|
|
||||||
|
path = asyncio.run(core.save_snapshot_with_postfix('snapshot', output, not full_snapshot))
|
||||||
print(f"Current snapshot is saved as `{path}`")
|
print(f"Current snapshot is saved as `{path}`")
|
||||||
|
|
||||||
|
|
||||||
@app.command("restore-snapshot", help="Restore snapshot from snapshot file")
|
@app.command("restore-snapshot", help="Restore snapshot from snapshot file")
|
||||||
def restore_snapshot(
|
def restore_snapshot(
|
||||||
snapshot_name: str,
|
snapshot_name: str,
|
||||||
pip_non_url: Optional[bool] = typer.Option(
|
pip_non_url: Optional[bool] = typer.Option(
|
||||||
default=None,
|
default=None,
|
||||||
show_default=False,
|
show_default=False,
|
||||||
|
|||||||
@@ -3748,17 +3748,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes: Noxin Complete Chime, Noxin Scaled Resolutions, Load from Noxin Prompt Library, Save to Noxin Prompt Library"
|
"description": "Nodes: Noxin Complete Chime, Noxin Scaled Resolutions, Load from Noxin Prompt Library, Save to Noxin Prompt Library"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "apesplat",
|
|
||||||
"title": "ezXY scripts and nodes",
|
|
||||||
"id": "ezxy",
|
|
||||||
"reference": "https://github.com/GMapeSplat/ComfyUI_ezXY",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/GMapeSplat/ComfyUI_ezXY"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Extensions/Patches: Enables linking float and integer inputs and ouputs. Values are automatically cast to the correct type and clamped to the correct range. Works with both builtin and custom nodes.[w/NOTE: This repo patches ComfyUI's validate_inputs and map_node_over_list functions while running. May break depending on your version of ComfyUI. Can be deactivated in config.yaml.]Nodes: A collection of nodes for facilitating the generation of XY plots. Capable of plotting changes over most primitive values.[w/Does not work with current version of Comfyui]"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "kinfolk0117",
|
"author": "kinfolk0117",
|
||||||
"title": "SimpleTiles",
|
"title": "SimpleTiles",
|
||||||
@@ -8745,7 +8734,7 @@
|
|||||||
"https://github.com/olduvai-jp/ComfyUI-HfLoader"
|
"https://github.com/olduvai-jp/ComfyUI-HfLoader"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes:Lora Loader From HF"
|
"description": "A simple and easy to use Hugging Face model loader."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "AiMiDi",
|
"author": "AiMiDi",
|
||||||
@@ -13337,6 +13326,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This node for ComfyUI allows saving images with an optional alpha channel (transparency). It supports saving images in formats like PNG, JPEG, and WebP."
|
"description": "This node for ComfyUI allows saving images with an optional alpha channel (transparency). It supports saving images in formats like PNG, JPEG, and WebP."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "APZmedia",
|
||||||
|
"title": "APZmedia Together Image Generator for ComfyUI",
|
||||||
|
"reference": "https://github.com/APZmedia/APZmedia-comfy-together-lora",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/APZmedia/APZmedia-comfy-together-lora"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI node to implement Together AI API image generation"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "N3rd00d",
|
"author": "N3rd00d",
|
||||||
"title": "ComfyUI-Paint3D-Nodes",
|
"title": "ComfyUI-Paint3D-Nodes",
|
||||||
@@ -13895,6 +13894,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This node provides advanced text-to-speech functionality powered by KokoroTTS. Follow the instructions below to install, configure, and use the node within your portable ComfyUI installation."
|
"description": "This node provides advanced text-to-speech functionality powered by KokoroTTS. Follow the instructions below to install, configure, and use the node within your portable ComfyUI installation."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "MushroomFleet",
|
||||||
|
"title": "DJZ-Pedalboard",
|
||||||
|
"reference": "https://github.com/MushroomFleet/DJZ-Pedalboard",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MushroomFleet/DJZ-Pedalboard"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This project provides a collection of custom nodes designed for enhanced audio effects in ComfyUI. With an intuitive pedalboard interface, users can easily integrate and manipulate various audio effects within their workflows."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "var1ableX",
|
"author": "var1ableX",
|
||||||
"title": "ComfyUI_Accessories",
|
"title": "ComfyUI_Accessories",
|
||||||
@@ -14193,17 +14202,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "multiline text node that strips c-style comments (i.e.'//' and '/* ... */') before passing output string downstream"
|
"description": "multiline text node that strips c-style comments (i.e.'//' and '/* ... */') before passing output string downstream"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "noarche",
|
|
||||||
"title": "noarche/Color Enhance",
|
|
||||||
"id": "color-enhance",
|
|
||||||
"reference": "https://github.com/noarche/sd-webui-color-enhance",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/noarche/sd-webui-color-enhance"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Script for [a/AUTOMATIC1111/stable-diffusion-webui](https://github.com/AUTOMATIC1111/stable-diffusion-webui) and node for ComfyUI to enhance colors.\nThis is the same algorithm GIMP/GEGL uses for color enhancement. The gist of this implementation is that it converts the color space to [CIELCh(ab) and normalizes the chroma (or '[a/colorfulness](https://en.wikipedia.org/wiki/Colorfulness)') component. Original source can be found in the link below."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "emojiiii",
|
"author": "emojiiii",
|
||||||
"title": "ComfyUI_Emojiiii_Custom_Nodes",
|
"title": "ComfyUI_Emojiiii_Custom_Nodes",
|
||||||
@@ -16444,6 +16442,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "preprocessing images, presented in a visual way. It also calculates the corresponding image area."
|
"description": "preprocessing images, presented in a visual way. It also calculates the corresponding image area."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "SSsnap",
|
||||||
|
"title": "ComfyUI-LBW_flux",
|
||||||
|
"reference": "https://github.com/SS-snap/ComfyUI-LBW_flux",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/SS-snap/ComfyUI-LBW_flux"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Through this node, you can more easily test the impact of different blocks in flux_lora on the final result."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "RiceRound",
|
"author": "RiceRound",
|
||||||
"title": "ComfyUI Compression and Encryption Node",
|
"title": "ComfyUI Compression and Encryption Node",
|
||||||
@@ -20433,16 +20441,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI-SendToDiscord is a custom node for ComfyUI that simplifies sending preview images to Discord via webhooks. It supports both single-image uploads and batch mode, making it an efficient tool for sharing your generated images directly with your Discord server."
|
"description": "ComfyUI-SendToDiscord is a custom node for ComfyUI that simplifies sending preview images to Discord via webhooks. It supports both single-image uploads and batch mode, making it an efficient tool for sharing your generated images directly with your Discord server."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "gmorks",
|
|
||||||
"title": "ComfyUI Animagine prompt",
|
|
||||||
"reference": "https://github.com/gmorks/ComfyUI-Animagine-Prompt",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/gmorks/ComfyUI-Animagine-Prompt"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Comfy UI node to prompt build for [a/https://huggingface.co/cagliostrolab/animagine-xl-4.0](https://huggingface.co/cagliostrolab/animagine-xl-4.0) model"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "jinanlongen",
|
"author": "jinanlongen",
|
||||||
"title": "ComfyUI Prompt Expander Node",
|
"title": "ComfyUI Prompt Expander Node",
|
||||||
@@ -20596,16 +20594,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A modular system that adds randomness to prompt generation"
|
"description": "A modular system that adds randomness to prompt generation"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "hdfhssg",
|
|
||||||
"title": "ComfyUI_pxtool",
|
|
||||||
"reference": "https://github.com/hdfhssg/ComfyUI_pxtool",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/hdfhssg/ComfyUI_pxtool"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This is a custom plugin node for ComfyUI that modifies and extends some features from existing projects. The main implementations include:\n* Reproducing some features of the [a/Stable-Diffusion-Webui-Civitai-Helper](https://github.com/zixaphir/Stable-Diffusion-Webui-Civitai-Helper) project within ComfyUI\n* Implementing a feature to randomly generate related prompt words by referencing the [a/noob-wiki dataset](https://huggingface.co/datasets/Laxhar/noob-wiki/tree/main)"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "martin-rizzo",
|
"author": "martin-rizzo",
|
||||||
"title": "ComfyUI-TinyBreaker",
|
"title": "ComfyUI-TinyBreaker",
|
||||||
@@ -20831,120 +20819,88 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Offering a series of utility nodes designed to simplify workflows and enhance efficiency"
|
"description": "Offering a series of utility nodes designed to simplify workflows and enhance efficiency"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "mie",
|
||||||
|
"title": "ComfyUI_CaptionThis",
|
||||||
|
"reference": "https://github.com/MieMieeeee/ComfyUI-CaptionThis",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MieMieeeee/ComfyUI-CaptionThis"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Describe a single image or all images in a directory using models such as Janus Pro, Florence2 (coming soon), or JoyCaption (coming soon), with a particular focus on building datasets for training LoRA."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "lum3on",
|
||||||
|
"title": "LLM Polymath Chat Node",
|
||||||
|
"id": "polymath",
|
||||||
|
"reference": "https://github.com/lum3on/comfyui_LLM_Polymath",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/lum3on/comfyui_LLM_Polymath"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Advanced LLM driven node with many custom instructions, including node finder, expert prompter and json converter."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "austinbrown34",
|
||||||
|
"title": "ComfyUI-IO-Helpers",
|
||||||
|
"reference": "https://github.com/austinbrown34/ComfyUI-IO-Helpers",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/austinbrown34/ComfyUI-IO-Helpers"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A custom nodes package for ComfyUI that enhances workflow flexibility by providing specialized nodes for saving and loading intermediate data (encoded prompts and sampled latents) in multiple formats. This package leverages helper classes for file I/O, supports gzip compression for efficient storage, and integrates progress feedback via a progress bar to improve user experience during long operations."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "HowToSD",
|
||||||
|
"title": "ComfyUI-Data-Analysis",
|
||||||
|
"reference": "https://github.com/HowToSD/ComfyUI-Data-Analysis",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/HowToSD/ComfyUI-Data-Analysis"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Data analysis custom modules for ComfyUI - Use Pandas & Matplotlib from within ComfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "dasilva333",
|
||||||
|
"title": "ComfyUI_ContrastingColor",
|
||||||
|
"reference": "https://github.com/dasilva333/ComfyUI_ContrastingColor",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/dasilva333/ComfyUI_ContrastingColor"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node calculates a contrasting complementary color based on an input RGB color. The goal is to ensure visibility and contrast when overlaying text, UI elements, or graphical components against a given background color."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "moon7star9",
|
||||||
|
"title": "ComfyUI_BiRefNet_Universal",
|
||||||
|
"reference": "https://github.com/moon7star9/ComfyUI_BiRefNet_Universal",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/moon7star9/ComfyUI_BiRefNet_Universal"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A comprehensive node package that seamlessly integrates all BiRefNet series models into ComfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "wirytiox",
|
||||||
|
"title": "ComfyUI-SelectStringFromListWithIndex",
|
||||||
|
"id": "ComfyUI-SelectStringFromListWithIndex",
|
||||||
|
"reference": "https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node is a node made by GMapeSplat/ComfyUI_ezXY that i copied while his node doesn't work"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "thanhduong0213929",
|
||||||
|
"title": "ComfyUI-DeepUnlock",
|
||||||
|
"reference": "https://github.com/thanhduong0213929/ComfyUI-DeepUnlock",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/thanhduong0213929/ComfyUI-DeepUnlock"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "DeepFuze is a state-of-the-art deep learning tool that seamlessly integrates with ComfyUI to revolutionize facial transformations, lipsyncing, video generation, voice cloning, face swapping, and lipsync translation. Leveraging advanced algorithms, DeepFuze enables users to combine audio and video with unparalleled realism, ensuring perfectly synchronized facial movements. This innovative solution is ideal for content creators, animators, developers, and anyone seeking to elevate their video editing projects with sophisticated AI-driven features."
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1114,6 +1114,15 @@
|
|||||||
"title_aux": "ComfyUI_yanc"
|
"title_aux": "ComfyUI_yanc"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/APZmedia/APZmedia-comfy-together-lora": [
|
||||||
|
[
|
||||||
|
"TogetherImageGenerator",
|
||||||
|
"TogetherImageGeneratorLoRA"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "APZmedia Together Image Generator for ComfyUI"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/APZmedia/APZmedia-comfyui-fast-image-save": [
|
"https://github.com/APZmedia/APZmedia-comfyui-fast-image-save": [
|
||||||
[
|
[
|
||||||
"APZmedia Fast image save"
|
"APZmedia Fast image save"
|
||||||
@@ -1907,6 +1916,7 @@
|
|||||||
"ComfyUIDeployExternalAudio",
|
"ComfyUIDeployExternalAudio",
|
||||||
"ComfyUIDeployExternalBoolean",
|
"ComfyUIDeployExternalBoolean",
|
||||||
"ComfyUIDeployExternalCheckpoint",
|
"ComfyUIDeployExternalCheckpoint",
|
||||||
|
"ComfyUIDeployExternalEXR",
|
||||||
"ComfyUIDeployExternalFaceModel",
|
"ComfyUIDeployExternalFaceModel",
|
||||||
"ComfyUIDeployExternalImage",
|
"ComfyUIDeployExternalImage",
|
||||||
"ComfyUIDeployExternalImageAlpha",
|
"ComfyUIDeployExternalImageAlpha",
|
||||||
@@ -2389,6 +2399,7 @@
|
|||||||
"ClownSamplerAdvanced",
|
"ClownSamplerAdvanced",
|
||||||
"ClownsharKSampler",
|
"ClownsharKSampler",
|
||||||
"ClownsharKSamplerAutomation",
|
"ClownsharKSamplerAutomation",
|
||||||
|
"ClownsharKSamplerAutomation_Advanced",
|
||||||
"ClownsharKSamplerAutomation_Beta",
|
"ClownsharKSamplerAutomation_Beta",
|
||||||
"ClownsharKSamplerGuide",
|
"ClownsharKSamplerGuide",
|
||||||
"ClownsharKSamplerGuide_Beta",
|
"ClownsharKSamplerGuide_Beta",
|
||||||
@@ -2405,6 +2416,7 @@
|
|||||||
"ConditioningToBase64",
|
"ConditioningToBase64",
|
||||||
"ConditioningTruncate",
|
"ConditioningTruncate",
|
||||||
"ConditioningZeroAndTruncate",
|
"ConditioningZeroAndTruncate",
|
||||||
|
"Constant Scheduler",
|
||||||
"EmptyLatentImage64",
|
"EmptyLatentImage64",
|
||||||
"EmptyLatentImageCustom",
|
"EmptyLatentImageCustom",
|
||||||
"Film Grain",
|
"Film Grain",
|
||||||
@@ -2439,6 +2451,7 @@
|
|||||||
"Legacy_ClownsharKSampler",
|
"Legacy_ClownsharKSampler",
|
||||||
"Legacy_ClownsharKSamplerGuides",
|
"Legacy_ClownsharKSamplerGuides",
|
||||||
"Legacy_SharkSampler",
|
"Legacy_SharkSampler",
|
||||||
|
"Linear Quadratic Advanced",
|
||||||
"MaskToggle",
|
"MaskToggle",
|
||||||
"ModelSamplingAdvanced",
|
"ModelSamplingAdvanced",
|
||||||
"ModelSamplingAdvancedResolution",
|
"ModelSamplingAdvancedResolution",
|
||||||
@@ -3919,27 +3932,6 @@
|
|||||||
"title_aux": "ComfyUI-Counternodes"
|
"title_aux": "ComfyUI-Counternodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/GMapeSplat/ComfyUI_ezXY": [
|
|
||||||
[
|
|
||||||
"ConcatenateString",
|
|
||||||
"ItemFromDropdown",
|
|
||||||
"IterationDriver",
|
|
||||||
"JoinImages",
|
|
||||||
"LineToConsole",
|
|
||||||
"NumberFromList",
|
|
||||||
"NumbersToList",
|
|
||||||
"PlotImages",
|
|
||||||
"StringFromList",
|
|
||||||
"StringToLabel",
|
|
||||||
"StringsToList",
|
|
||||||
"ezMath",
|
|
||||||
"ezXY_AssemblePlot",
|
|
||||||
"ezXY_Driver"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ezXY scripts and nodes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [
|
"https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [
|
||||||
[
|
[
|
||||||
"Danbooru (ID)",
|
"Danbooru (ID)",
|
||||||
@@ -5070,6 +5062,7 @@
|
|||||||
"Simple Extract Lora From Text",
|
"Simple Extract Lora From Text",
|
||||||
"Simple Image Saver (as Forge)",
|
"Simple Image Saver (as Forge)",
|
||||||
"Simple Load Image With Metadata",
|
"Simple Load Image With Metadata",
|
||||||
|
"Simple Load Images from Dir",
|
||||||
"Simple Load Line From Text File",
|
"Simple Load Line From Text File",
|
||||||
"Simple Lora Loader"
|
"Simple Lora Loader"
|
||||||
],
|
],
|
||||||
@@ -6453,6 +6446,7 @@
|
|||||||
"BlackBarsV1",
|
"BlackBarsV1",
|
||||||
"BlackBarsV2",
|
"BlackBarsV2",
|
||||||
"BlackBarsV3",
|
"BlackBarsV3",
|
||||||
|
"BracketCleaner",
|
||||||
"CRT_Effect_v1",
|
"CRT_Effect_v1",
|
||||||
"CathodeRayEffect",
|
"CathodeRayEffect",
|
||||||
"ClassicFilmEffect",
|
"ClassicFilmEffect",
|
||||||
@@ -6505,6 +6499,7 @@
|
|||||||
"ParametricMeshGenV2",
|
"ParametricMeshGenV2",
|
||||||
"ProjectFilePathNode",
|
"ProjectFilePathNode",
|
||||||
"PromptCleaner",
|
"PromptCleaner",
|
||||||
|
"PromptCleanerV2",
|
||||||
"PromptDupeRemover",
|
"PromptDupeRemover",
|
||||||
"PromptDupeRemoverV2",
|
"PromptDupeRemoverV2",
|
||||||
"PromptInject",
|
"PromptInject",
|
||||||
@@ -6546,10 +6541,13 @@
|
|||||||
"VideoTrails",
|
"VideoTrails",
|
||||||
"VideoTrailsV2",
|
"VideoTrailsV2",
|
||||||
"VideoVignettingV1",
|
"VideoVignettingV1",
|
||||||
|
"VoiceEffects",
|
||||||
|
"VoiceEffects2",
|
||||||
"WaveletCompose",
|
"WaveletCompose",
|
||||||
"WaveletDecompose",
|
"WaveletDecompose",
|
||||||
"WinampViz",
|
"WinampViz",
|
||||||
"WinampVizV2",
|
"WinampVizV2",
|
||||||
|
"ZenkaiPoseMap",
|
||||||
"ZenkaiPrompt",
|
"ZenkaiPrompt",
|
||||||
"ZenkaiPromptV2",
|
"ZenkaiPromptV2",
|
||||||
"ZenkaiPromptV3",
|
"ZenkaiPromptV3",
|
||||||
@@ -6562,6 +6560,14 @@
|
|||||||
"title_aux": "DJZ-Nodes"
|
"title_aux": "DJZ-Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/MushroomFleet/DJZ-Pedalboard": [
|
||||||
|
[
|
||||||
|
"DJZ_Pedalboard"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "DJZ-Pedalboard"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/MuziekMagie/ComfyUI-Matchering": [
|
"https://github.com/MuziekMagie/ComfyUI-Matchering": [
|
||||||
[
|
[
|
||||||
"Matchering",
|
"Matchering",
|
||||||
@@ -6962,6 +6968,7 @@
|
|||||||
"SUPIR Sampler \ud83d\udcacED",
|
"SUPIR Sampler \ud83d\udcacED",
|
||||||
"Save Image \ud83d\udd14ED",
|
"Save Image \ud83d\udd14ED",
|
||||||
"Simple Text \ud83d\udcacED",
|
"Simple Text \ud83d\udcacED",
|
||||||
|
"TIPO Script \ud83d\udcacED",
|
||||||
"Ultimate SD Upscale \ud83d\udcacED",
|
"Ultimate SD Upscale \ud83d\udcacED",
|
||||||
"Wildcard Encode \ud83d\udcacED"
|
"Wildcard Encode \ud83d\udcacED"
|
||||||
],
|
],
|
||||||
@@ -7555,6 +7562,14 @@
|
|||||||
"title_aux": "ComfyUI-LexTools"
|
"title_aux": "ComfyUI-LexTools"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/SS-snap/ComfyUI-LBW_flux": [
|
||||||
|
[
|
||||||
|
"LoraBlockWeight_Flux"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-LBW_flux"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/SS-snap/ComfyUI-Snap_Processing": [
|
"https://github.com/SS-snap/ComfyUI-Snap_Processing": [
|
||||||
[
|
[
|
||||||
"AreaCalculator",
|
"AreaCalculator",
|
||||||
@@ -8532,6 +8547,7 @@
|
|||||||
"SDVN Easy IPAdapter weight",
|
"SDVN Easy IPAdapter weight",
|
||||||
"SDVN Exif check",
|
"SDVN Exif check",
|
||||||
"SDVN Filter List",
|
"SDVN Filter List",
|
||||||
|
"SDVN Flip Image",
|
||||||
"SDVN Google Imagen",
|
"SDVN Google Imagen",
|
||||||
"SDVN IC-Light v2",
|
"SDVN IC-Light v2",
|
||||||
"SDVN Image Adjust",
|
"SDVN Image Adjust",
|
||||||
@@ -9673,6 +9689,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Visionatrix/ComfyUI-Visionatrix": [
|
"https://github.com/Visionatrix/ComfyUI-Visionatrix": [
|
||||||
[
|
[
|
||||||
|
"StyleAlignedBatchAlign",
|
||||||
"VixCheckboxLogic",
|
"VixCheckboxLogic",
|
||||||
"VixDynamicLoraDefinition",
|
"VixDynamicLoraDefinition",
|
||||||
"VixUiAspectRatioSelector",
|
"VixUiAspectRatioSelector",
|
||||||
@@ -10307,6 +10324,7 @@
|
|||||||
"ConvertRasterToVectorBW",
|
"ConvertRasterToVectorBW",
|
||||||
"ConvertRasterToVectorColor",
|
"ConvertRasterToVectorColor",
|
||||||
"ConvertVectorToRaster",
|
"ConvertVectorToRaster",
|
||||||
|
"SVGPreview",
|
||||||
"SaveSVG"
|
"SaveSVG"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -11349,6 +11367,7 @@
|
|||||||
"Noise from Palette [Dream]",
|
"Noise from Palette [Dream]",
|
||||||
"Palette Color Align [Dream]",
|
"Palette Color Align [Dream]",
|
||||||
"Palette Color Shift [Dream]",
|
"Palette Color Shift [Dream]",
|
||||||
|
"Random Prompt Words [Dream]",
|
||||||
"Sample Image Area as Palette [Dream]",
|
"Sample Image Area as Palette [Dream]",
|
||||||
"Sample Image as Palette [Dream]",
|
"Sample Image as Palette [Dream]",
|
||||||
"Saw Curve [Dream]",
|
"Saw Curve [Dream]",
|
||||||
@@ -11464,6 +11483,7 @@
|
|||||||
"https://github.com/arcum42/ComfyUI_SageUtils": [
|
"https://github.com/arcum42/ComfyUI_SageUtils": [
|
||||||
[
|
[
|
||||||
"Sage_AdvSamplerInfo",
|
"Sage_AdvSamplerInfo",
|
||||||
|
"Sage_CLIPTextEncodeLumina2",
|
||||||
"Sage_CacheMaintenance",
|
"Sage_CacheMaintenance",
|
||||||
"Sage_CheckpointLoaderRecent",
|
"Sage_CheckpointLoaderRecent",
|
||||||
"Sage_CheckpointLoaderSimple",
|
"Sage_CheckpointLoaderSimple",
|
||||||
@@ -11475,6 +11495,7 @@
|
|||||||
"Sage_ConstructMetadata",
|
"Sage_ConstructMetadata",
|
||||||
"Sage_ConstructMetadataLite",
|
"Sage_ConstructMetadataLite",
|
||||||
"Sage_DualCLIPTextEncode",
|
"Sage_DualCLIPTextEncode",
|
||||||
|
"Sage_DualCLIPTextEncodeLumina2",
|
||||||
"Sage_EmptyLatentImagePassthrough",
|
"Sage_EmptyLatentImagePassthrough",
|
||||||
"Sage_GetFileHash",
|
"Sage_GetFileHash",
|
||||||
"Sage_JoinText",
|
"Sage_JoinText",
|
||||||
@@ -11640,6 +11661,18 @@
|
|||||||
"title_aux": "Save Image Extended for ComfyUI"
|
"title_aux": "Save Image Extended for ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/austinbrown34/ComfyUI-IO-Helpers": [
|
||||||
|
[
|
||||||
|
"EncodedPromptFromFile",
|
||||||
|
"EncodedPromptToFile",
|
||||||
|
"IO_LoadImage",
|
||||||
|
"SampledLatentsFromFile",
|
||||||
|
"SampledLatentsToFile"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-IO-Helpers"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/avatechai/avatar-graph-comfyui": [
|
"https://github.com/avatechai/avatar-graph-comfyui": [
|
||||||
[
|
[
|
||||||
"ApplyMeshTransformAsShapeKey",
|
"ApplyMeshTransformAsShapeKey",
|
||||||
@@ -11792,6 +11825,7 @@
|
|||||||
"SP_HiresGen_HiresCfg",
|
"SP_HiresGen_HiresCfg",
|
||||||
"SP_HiresGen_Sharpen",
|
"SP_HiresGen_Sharpen",
|
||||||
"SP_HunyuanLoader",
|
"SP_HunyuanLoader",
|
||||||
|
"SP_ImpactSwitchCombo",
|
||||||
"SP_KSampler",
|
"SP_KSampler",
|
||||||
"SP_KSamplerSelect",
|
"SP_KSamplerSelect",
|
||||||
"SP_KoboldCpp",
|
"SP_KoboldCpp",
|
||||||
@@ -12580,6 +12614,7 @@
|
|||||||
[
|
[
|
||||||
"ClipLoaderGGUF",
|
"ClipLoaderGGUF",
|
||||||
"DualClipLoaderGGUF",
|
"DualClipLoaderGGUF",
|
||||||
|
"GGUFRun",
|
||||||
"GGUFSave",
|
"GGUFSave",
|
||||||
"GGUFUndo",
|
"GGUFUndo",
|
||||||
"LoaderGGUF",
|
"LoaderGGUF",
|
||||||
@@ -13416,6 +13451,7 @@
|
|||||||
"LayerUtility: NumberCalculatorV2",
|
"LayerUtility: NumberCalculatorV2",
|
||||||
"LayerUtility: PrintInfo",
|
"LayerUtility: PrintInfo",
|
||||||
"LayerUtility: PurgeVRAM",
|
"LayerUtility: PurgeVRAM",
|
||||||
|
"LayerUtility: PurgeVRAM V2",
|
||||||
"LayerUtility: QueueStop",
|
"LayerUtility: QueueStop",
|
||||||
"LayerUtility: RGB Value",
|
"LayerUtility: RGB Value",
|
||||||
"LayerUtility: RandomGenerator",
|
"LayerUtility: RandomGenerator",
|
||||||
@@ -13477,6 +13513,7 @@
|
|||||||
"LayerMask: TransparentBackgroundUltra",
|
"LayerMask: TransparentBackgroundUltra",
|
||||||
"LayerMask: YoloV8Detect",
|
"LayerMask: YoloV8Detect",
|
||||||
"LayerUtility: AddBlindWaterMark",
|
"LayerUtility: AddBlindWaterMark",
|
||||||
|
"LayerUtility: Collage",
|
||||||
"LayerUtility: CreateQRCode",
|
"LayerUtility: CreateQRCode",
|
||||||
"LayerUtility: DecodeQRCode",
|
"LayerUtility: DecodeQRCode",
|
||||||
"LayerUtility: DeepSeekAPI",
|
"LayerUtility: DeepSeekAPI",
|
||||||
@@ -14108,6 +14145,7 @@
|
|||||||
"Mahiro",
|
"Mahiro",
|
||||||
"MaskComposite",
|
"MaskComposite",
|
||||||
"MaskToImage",
|
"MaskToImage",
|
||||||
|
"ModelComputeDtype",
|
||||||
"ModelMergeAdd",
|
"ModelMergeAdd",
|
||||||
"ModelMergeAuraflow",
|
"ModelMergeAuraflow",
|
||||||
"ModelMergeBlocks",
|
"ModelMergeBlocks",
|
||||||
@@ -14876,6 +14914,14 @@
|
|||||||
"title_aux": "ComfyUI-LoadFiles"
|
"title_aux": "ComfyUI-LoadFiles"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/dasilva333/ComfyUI_ContrastingColor": [
|
||||||
|
[
|
||||||
|
"ContrastingComplementaryColor|pysssss"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_ContrastingColor"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/dave-palt/comfyui_DSP_imagehelpers": [
|
"https://github.com/dave-palt/comfyui_DSP_imagehelpers": [
|
||||||
[
|
[
|
||||||
"dsp-imagehelpers-concat"
|
"dsp-imagehelpers-concat"
|
||||||
@@ -15005,6 +15051,9 @@
|
|||||||
"DavchaCLIPTextEncode",
|
"DavchaCLIPTextEncode",
|
||||||
"DavchaConditioningConcat",
|
"DavchaConditioningConcat",
|
||||||
"DavchaEmptyLatentImage",
|
"DavchaEmptyLatentImage",
|
||||||
|
"DavchaLLM",
|
||||||
|
"DavchaLLMAdvanced",
|
||||||
|
"DavchaLoadLLM",
|
||||||
"DavchaLoadVideo",
|
"DavchaLoadVideo",
|
||||||
"DavchaMaskImage",
|
"DavchaMaskImage",
|
||||||
"DavchaModelMergeSD1",
|
"DavchaModelMergeSD1",
|
||||||
@@ -15404,9 +15453,12 @@
|
|||||||
"Qwen2AudioInstruct",
|
"Qwen2AudioInstruct",
|
||||||
"StringToDict",
|
"StringToDict",
|
||||||
"SwitchDuo",
|
"SwitchDuo",
|
||||||
|
"TextBoxStyle",
|
||||||
"TextLineSelect",
|
"TextLineSelect",
|
||||||
"TextLinesToList",
|
"TextLinesToList",
|
||||||
"TextPlusPlus"
|
"TextMargins",
|
||||||
|
"TextPlusPlus",
|
||||||
|
"TextShadow"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-dreambait-nodes"
|
"title_aux": "comfyui-dreambait-nodes"
|
||||||
@@ -16608,14 +16660,6 @@
|
|||||||
"title_aux": "String Converter"
|
"title_aux": "String Converter"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/gmorks/ComfyUI-Animagine-Prompt": [
|
|
||||||
[
|
|
||||||
"AnimaginePrompt"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI Animagine prompt"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/gmorks/ComfyUI-SendToDiscord": [
|
"https://github.com/gmorks/ComfyUI-SendToDiscord": [
|
||||||
[
|
[
|
||||||
"PreviewImageWithDiscord"
|
"PreviewImageWithDiscord"
|
||||||
@@ -17162,21 +17206,6 @@
|
|||||||
"title_aux": "ComfyUI-ToolBox"
|
"title_aux": "ComfyUI-ToolBox"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/hdfhssg/ComfyUI_pxtool": [
|
|
||||||
[
|
|
||||||
"CivitaiHelper",
|
|
||||||
"DanbooruCharacterTag",
|
|
||||||
"E621CharacterTag",
|
|
||||||
"NegativeTag",
|
|
||||||
"QualityTag",
|
|
||||||
"RandomArtists",
|
|
||||||
"RandomArtistsAdvanced",
|
|
||||||
"RandomTag"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI_pxtool"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/heshengtao/comfyui_LLM_party": [
|
"https://github.com/heshengtao/comfyui_LLM_party": [
|
||||||
[
|
[
|
||||||
"About_us",
|
"About_us",
|
||||||
@@ -17418,6 +17447,7 @@
|
|||||||
"WWAA_GBCamera",
|
"WWAA_GBCamera",
|
||||||
"WWAA_ImageLoader",
|
"WWAA_ImageLoader",
|
||||||
"WWAA_ImageToTextFile",
|
"WWAA_ImageToTextFile",
|
||||||
|
"WWAA_NestedLoopCounter",
|
||||||
"WWAA_PromptWriter"
|
"WWAA_PromptWriter"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -17538,12 +17568,11 @@
|
|||||||
"BiRefNet",
|
"BiRefNet",
|
||||||
"ControlImagePreprocessor",
|
"ControlImagePreprocessor",
|
||||||
"ControlNetModelLoader",
|
"ControlNetModelLoader",
|
||||||
|
"DiffusersMVModelMakeup",
|
||||||
|
"DiffusersMVPipelineLoader",
|
||||||
"DiffusersMVSampler",
|
"DiffusersMVSampler",
|
||||||
"DiffusersModelMakeup",
|
"DiffusersMVSchedulerLoader",
|
||||||
"DiffusersPipelineLoader",
|
"DiffusersMVVaeLoader",
|
||||||
"DiffusersSampler",
|
|
||||||
"DiffusersSchedulerLoader",
|
|
||||||
"DiffusersVaeLoader",
|
|
||||||
"ImagePreprocessor",
|
"ImagePreprocessor",
|
||||||
"LdmPipelineLoader",
|
"LdmPipelineLoader",
|
||||||
"LdmVaeLoader",
|
"LdmVaeLoader",
|
||||||
@@ -17861,7 +17890,8 @@
|
|||||||
[
|
[
|
||||||
"PROMPT_ENHANCER",
|
"PROMPT_ENHANCER",
|
||||||
"PROMPT_ENHANCER_CHAIN_CONTROL",
|
"PROMPT_ENHANCER_CHAIN_CONTROL",
|
||||||
"PROMPT_ENHANCER_CHAIN_RANDOM"
|
"PROMPT_ENHANCER_CHAIN_RANDOM",
|
||||||
|
"PROMPT_ENHANCER_REPROMPT"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-prompt-enhancer"
|
"title_aux": "comfyui-prompt-enhancer"
|
||||||
@@ -18876,6 +18906,15 @@
|
|||||||
"title_aux": "ComfyUI LayerDivider"
|
"title_aux": "ComfyUI LayerDivider"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/juehackr/comfyui_fk_server": [
|
||||||
|
[
|
||||||
|
"FK_Node",
|
||||||
|
"FK_ShowBaseNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui_fk_server"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": [
|
"https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": [
|
||||||
[
|
[
|
||||||
"JurdnsGroqAPIPromptEnhancer"
|
"JurdnsGroqAPIPromptEnhancer"
|
||||||
@@ -19679,6 +19718,7 @@
|
|||||||
"InjectNoiseToLatent",
|
"InjectNoiseToLatent",
|
||||||
"InsertImageBatchByIndexes",
|
"InsertImageBatchByIndexes",
|
||||||
"InsertImagesToBatchIndexed",
|
"InsertImagesToBatchIndexed",
|
||||||
|
"InsertLatentToIndexed",
|
||||||
"InterpolateCoords",
|
"InterpolateCoords",
|
||||||
"Intrinsic_lora_sampling",
|
"Intrinsic_lora_sampling",
|
||||||
"JoinStringMulti",
|
"JoinStringMulti",
|
||||||
@@ -19710,6 +19750,7 @@
|
|||||||
"SV3D_BatchSchedule",
|
"SV3D_BatchSchedule",
|
||||||
"SaveImageKJ",
|
"SaveImageKJ",
|
||||||
"SaveImageWithAlpha",
|
"SaveImageWithAlpha",
|
||||||
|
"SaveStringKJ",
|
||||||
"ScaleBatchPromptSchedule",
|
"ScaleBatchPromptSchedule",
|
||||||
"Screencap_mss",
|
"Screencap_mss",
|
||||||
"SeparateMasks",
|
"SeparateMasks",
|
||||||
@@ -19732,6 +19773,7 @@
|
|||||||
"TorchCompileCosmosModel",
|
"TorchCompileCosmosModel",
|
||||||
"TorchCompileLTXModel",
|
"TorchCompileLTXModel",
|
||||||
"TorchCompileModelFluxAdvanced",
|
"TorchCompileModelFluxAdvanced",
|
||||||
|
"TorchCompileModelHyVideo",
|
||||||
"TorchCompileVAE",
|
"TorchCompileVAE",
|
||||||
"TransitionImagesInBatch",
|
"TransitionImagesInBatch",
|
||||||
"TransitionImagesMulti",
|
"TransitionImagesMulti",
|
||||||
@@ -21727,6 +21769,16 @@
|
|||||||
"title_aux": "ComfyUI-CatvtonFluxWrapper"
|
"title_aux": "ComfyUI-CatvtonFluxWrapper"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/lum3on/comfyui_LLM_Polymath": [
|
||||||
|
[
|
||||||
|
"polymath_SaveAbsolute",
|
||||||
|
"polymath_chat",
|
||||||
|
"polymath_scraper"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "LLM Polymath Chat Node"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/lumalabs/ComfyUI-LumaAI-API": [
|
"https://github.com/lumalabs/ComfyUI-LumaAI-API": [
|
||||||
[
|
[
|
||||||
"CharacterReference",
|
"CharacterReference",
|
||||||
@@ -22465,6 +22517,15 @@
|
|||||||
"title_aux": "Preset Dimensions"
|
"title_aux": "Preset Dimensions"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/moon7star9/ComfyUI_BiRefNet_Universal": [
|
||||||
|
[
|
||||||
|
"BiRefNet_Loader",
|
||||||
|
"BiRefNet_Remove_Background"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_BiRefNet_Universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/morino-kumasan/comfyui-toml-prompt": [
|
"https://github.com/morino-kumasan/comfyui-toml-prompt": [
|
||||||
[
|
[
|
||||||
"IntSelector",
|
"IntSelector",
|
||||||
@@ -23240,6 +23301,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/olduvai-jp/ComfyUI-HfLoader": [
|
"https://github.com/olduvai-jp/ComfyUI-HfLoader": [
|
||||||
[
|
[
|
||||||
|
"ControlNet Loader From HF",
|
||||||
"Lora Loader From HF"
|
"Lora Loader From HF"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -24486,22 +24548,26 @@
|
|||||||
"https://github.com/ryanontheinside/ComfyUI_RealtimeNodes": [
|
"https://github.com/ryanontheinside/ComfyUI_RealtimeNodes": [
|
||||||
[
|
[
|
||||||
"DTypeConverter",
|
"DTypeConverter",
|
||||||
"DeltaControl",
|
|
||||||
"FPSMonitor",
|
"FPSMonitor",
|
||||||
"FastWebcamCapture",
|
"FastWebcamCapture",
|
||||||
"FloatControl",
|
"FloatControl",
|
||||||
"FloatSequence",
|
"FloatSequence",
|
||||||
|
"HandMaskNode",
|
||||||
|
"HandTrackingNode",
|
||||||
"IntControl",
|
"IntControl",
|
||||||
"IntSequence",
|
"IntSequence",
|
||||||
"IntegerMotionController",
|
"IntegerMotionController",
|
||||||
"IntervalControl",
|
|
||||||
"LazyCondition",
|
"LazyCondition",
|
||||||
"LoadImageFromPath_",
|
"LoadImageFromPath_",
|
||||||
"MotionController",
|
"MotionController",
|
||||||
"MultilineText",
|
"MultilineText",
|
||||||
"QuickShapeMask",
|
"QuickShapeMask",
|
||||||
"ROINode",
|
"ROINode",
|
||||||
|
"RepulsiveMaskNode",
|
||||||
|
"ResizeMaskNode",
|
||||||
"SimilarityFilter",
|
"SimilarityFilter",
|
||||||
|
"StateResetNode",
|
||||||
|
"StateTestNode",
|
||||||
"StringControl",
|
"StringControl",
|
||||||
"StringSequence",
|
"StringSequence",
|
||||||
"TextRenderer",
|
"TextRenderer",
|
||||||
@@ -24730,6 +24796,7 @@
|
|||||||
"FlipStreamSwitchLatent",
|
"FlipStreamSwitchLatent",
|
||||||
"FlipStreamTextBox",
|
"FlipStreamTextBox",
|
||||||
"FlipStreamTextReplace",
|
"FlipStreamTextReplace",
|
||||||
|
"FlipStreamVideoInput",
|
||||||
"FlipStreamViewer"
|
"FlipStreamViewer"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -25328,7 +25395,9 @@
|
|||||||
"SmartFormatString",
|
"SmartFormatString",
|
||||||
"SmartFormatString10",
|
"SmartFormatString10",
|
||||||
"SmartHVLoraSelect",
|
"SmartHVLoraSelect",
|
||||||
"SmartHVLoraStack"
|
"SmartHVLoraStack",
|
||||||
|
"SmartRemoveComments",
|
||||||
|
"SmartSaveText"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI Smart Helper Nodes"
|
"title_aux": "ComfyUI Smart Helper Nodes"
|
||||||
@@ -26397,6 +26466,20 @@
|
|||||||
"title_aux": "ComfyUI-Helper-Nodes"
|
"title_aux": "ComfyUI-Helper-Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/thanhduong0213929/ComfyUI-DeepUnlock": [
|
||||||
|
[
|
||||||
|
"DeepFuze Save",
|
||||||
|
"DeepFuzeAdavance",
|
||||||
|
"DeepFuzeFaceSwap",
|
||||||
|
"DeepfuzePreview",
|
||||||
|
"LLM_node",
|
||||||
|
"PlayBackAudio",
|
||||||
|
"TTS_generation"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-DeepUnlock"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/theAdamColton/ComfyUI-texflow-extension": [
|
"https://github.com/theAdamColton/ComfyUI-texflow-extension": [
|
||||||
[
|
[
|
||||||
"Load Texflow Depth Image",
|
"Load Texflow Depth Image",
|
||||||
@@ -27358,6 +27441,14 @@
|
|||||||
"title_aux": "zsq_prompt"
|
"title_aux": "zsq_prompt"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex": [
|
||||||
|
[
|
||||||
|
"StringFromList"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-SelectStringFromListWithIndex"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/wjl0313/ComfyUI_KimNodes": [
|
"https://github.com/wjl0313/ComfyUI_KimNodes": [
|
||||||
[
|
[
|
||||||
"Add_ImageMetadata",
|
"Add_ImageMetadata",
|
||||||
@@ -27866,7 +27957,9 @@
|
|||||||
"MaskSmartValleySplit",
|
"MaskSmartValleySplit",
|
||||||
"MaskSplitFilter",
|
"MaskSplitFilter",
|
||||||
"MaskTopNFilter",
|
"MaskTopNFilter",
|
||||||
"TextBeforeKeyword"
|
"TextBeforeKeyword",
|
||||||
|
"YC Extract Number",
|
||||||
|
"YC Text Index Switch"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-YCNodes"
|
"title_aux": "ComfyUI-YCNodes"
|
||||||
@@ -28504,6 +28597,7 @@
|
|||||||
"https://github.com/zentrocdot/ComfyUI-Simple_Image_To_Prompt": [
|
"https://github.com/zentrocdot/ComfyUI-Simple_Image_To_Prompt": [
|
||||||
[
|
[
|
||||||
"\ud83d\udc41\ufe0f Image To Prompt",
|
"\ud83d\udc41\ufe0f Image To Prompt",
|
||||||
|
"\ud83d\udc41\ufe0f Image To Prompt (NO UPDATE)",
|
||||||
"\ud83e\uddf3 Show Data"
|
"\ud83e\uddf3 Show Data"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -389,12 +389,13 @@ def apply_snapshot(path):
|
|||||||
git_custom_node_infos = info['git_custom_nodes']
|
git_custom_node_infos = info['git_custom_nodes']
|
||||||
file_custom_node_infos = info['file_custom_nodes']
|
file_custom_node_infos = info['file_custom_nodes']
|
||||||
|
|
||||||
checkout_comfyui_hash(comfyui_hash)
|
if comfyui_hash:
|
||||||
|
checkout_comfyui_hash(comfyui_hash)
|
||||||
checkout_custom_node_hash(git_custom_node_infos)
|
checkout_custom_node_hash(git_custom_node_infos)
|
||||||
invalidate_custom_node_file(file_custom_node_infos)
|
invalidate_custom_node_file(file_custom_node_infos)
|
||||||
|
|
||||||
print("APPLY SNAPSHOT: True")
|
print("APPLY SNAPSHOT: True")
|
||||||
if 'pips' in info:
|
if 'pips' in info and info['pips']:
|
||||||
return info['pips']
|
return info['pips']
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|||||||
5184
github-stats.json
5184
github-stats.json
File diff suppressed because it is too large
Load Diff
@@ -173,7 +173,10 @@ def read_cnr_info(fullpath):
|
|||||||
|
|
||||||
project = data.get('project', {})
|
project = data.get('project', {})
|
||||||
name = project.get('name').strip().lower()
|
name = project.get('name').strip().lower()
|
||||||
version = project.get('version')
|
|
||||||
|
# normalize version
|
||||||
|
# for example: 2.5 -> 2.5.0
|
||||||
|
version = str(manager_util.StrictVersion(project.get('version')))
|
||||||
|
|
||||||
urls = project.get('urls', {})
|
urls = project.get('urls', {})
|
||||||
repository = urls.get('Repository')
|
repository = urls.get('Repository')
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ import manager_downloader
|
|||||||
from node_package import InstalledNodePackage
|
from node_package import InstalledNodePackage
|
||||||
|
|
||||||
|
|
||||||
version_code = [3, 19]
|
version_code = [3, 22]
|
||||||
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
|
||||||
|
|
||||||
|
|
||||||
@@ -345,6 +345,7 @@ class ManagedResult:
|
|||||||
self.msg = None
|
self.msg = None
|
||||||
self.target = None
|
self.target = None
|
||||||
self.postinstall = lambda: True
|
self.postinstall = lambda: True
|
||||||
|
self.ver = None
|
||||||
|
|
||||||
def append(self, item):
|
def append(self, item):
|
||||||
self.items.append(item)
|
self.items.append(item)
|
||||||
@@ -366,6 +367,10 @@ class ManagedResult:
|
|||||||
self.postinstall = postinstall
|
self.postinstall = postinstall
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def with_ver(self, ver):
|
||||||
|
self.ver = ver
|
||||||
|
return self
|
||||||
|
|
||||||
|
|
||||||
class UnifiedManager:
|
class UnifiedManager:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -513,7 +518,10 @@ class UnifiedManager:
|
|||||||
if info:
|
if info:
|
||||||
cnr = self.cnr_map.get(info['id'])
|
cnr = self.cnr_map.get(info['id'])
|
||||||
if cnr:
|
if cnr:
|
||||||
return {'id': cnr['id'], 'cnr': cnr, 'ver': info['version']}
|
# normalize version
|
||||||
|
# for example: 2.5 -> 2.5.0
|
||||||
|
ver = str(manager_util.StrictVersion(info['version']))
|
||||||
|
return {'id': cnr['id'], 'cnr': cnr, 'ver': ver}
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
@@ -786,6 +794,7 @@ class UnifiedManager:
|
|||||||
node_id = v['id']
|
node_id = v['id']
|
||||||
else:
|
else:
|
||||||
node_id = v['files'][0].split('/')[-1]
|
node_id = v['files'][0].split('/')[-1]
|
||||||
|
v['repository'] = v['files'][0]
|
||||||
res[node_id] = v
|
res[node_id] = v
|
||||||
elif len(v['files']) > 1:
|
elif len(v['files']) > 1:
|
||||||
res[v['files'][0]] = v # A custom node composed of multiple url is treated as a single repository with one representative path
|
res[v['files'][0]] = v # A custom node composed of multiple url is treated as a single repository with one representative path
|
||||||
@@ -812,14 +821,14 @@ class UnifiedManager:
|
|||||||
print("Install: pip packages")
|
print("Install: pip packages")
|
||||||
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages())
|
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages())
|
||||||
res = True
|
res = True
|
||||||
with open(requirements_path, "r") as requirements_file:
|
lines = manager_util.robust_readlines(requirements_path)
|
||||||
for line in requirements_file:
|
for line in lines:
|
||||||
package_name = remap_pip_package(line.strip())
|
package_name = remap_pip_package(line.strip())
|
||||||
if package_name and not package_name.startswith('#') and package_name not in self.processed_install:
|
if package_name and not package_name.startswith('#') and package_name not in self.processed_install:
|
||||||
self.processed_install.add(package_name)
|
self.processed_install.add(package_name)
|
||||||
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
||||||
if package_name.strip() != "" and not package_name.startswith('#'):
|
if package_name.strip() != "" and not package_name.startswith('#'):
|
||||||
res = res and try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
res = res and try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
|
||||||
|
|
||||||
pip_fixer.fix_broken()
|
pip_fixer.fix_broken()
|
||||||
return res
|
return res
|
||||||
@@ -1249,7 +1258,8 @@ class UnifiedManager:
|
|||||||
return result.fail(f"Failed to execute install script: {url}")
|
return result.fail(f"Failed to execute install script: {url}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return result.fail(f"Install(git-clone) error: {url} / {e}")
|
traceback.print_exc()
|
||||||
|
return result.fail(f"Install(git-clone) error[2]: {url} / {e}")
|
||||||
|
|
||||||
print("Installation was successful.")
|
print("Installation was successful.")
|
||||||
return result
|
return result
|
||||||
@@ -1330,14 +1340,14 @@ class UnifiedManager:
|
|||||||
version_spec = self.resolve_unspecified_version(node_id, guess_mode='active')
|
version_spec = self.resolve_unspecified_version(node_id, guess_mode='active')
|
||||||
|
|
||||||
if version_spec is None:
|
if version_spec is None:
|
||||||
return ManagedResult('update').fail(f'Update not available: {node_id}@{version_spec}')
|
return ManagedResult('update').fail(f'Update not available: {node_id}@{version_spec}').with_ver(version_spec)
|
||||||
|
|
||||||
if version_spec == 'nightly':
|
if version_spec == 'nightly':
|
||||||
return self.repo_update(self.active_nodes[node_id][1], instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_target('nightly')
|
return self.repo_update(self.active_nodes[node_id][1], instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_target('nightly').with_ver('nightly')
|
||||||
elif version_spec == 'unknown':
|
elif version_spec == 'unknown':
|
||||||
return self.repo_update(self.unknown_active_nodes[node_id][1], instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_target('unknown')
|
return self.repo_update(self.unknown_active_nodes[node_id][1], instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_target('unknown').with_ver('unknown')
|
||||||
else:
|
else:
|
||||||
return self.cnr_switch_version(node_id, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall)
|
return self.cnr_switch_version(node_id, instant_execution=instant_execution, no_deps=no_deps, return_postinstall=return_postinstall).with_ver('cnr')
|
||||||
|
|
||||||
async def install_by_id(self, node_id, version_spec=None, channel=None, mode=None, instant_execution=False, no_deps=False, return_postinstall=False):
|
async def install_by_id(self, node_id, version_spec=None, channel=None, mode=None, instant_execution=False, no_deps=False, return_postinstall=False):
|
||||||
"""
|
"""
|
||||||
@@ -1583,16 +1593,6 @@ def read_config():
|
|||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
config.read(manager_config_path)
|
config.read(manager_config_path)
|
||||||
default_conf = config['default']
|
default_conf = config['default']
|
||||||
|
|
||||||
# policy migration: disable_unsecure_features -> security_level
|
|
||||||
if 'disable_unsecure_features' in default_conf:
|
|
||||||
if default_conf['disable_unsecure_features'].lower() == 'true':
|
|
||||||
security_level = 'strong'
|
|
||||||
else:
|
|
||||||
security_level = 'normal'
|
|
||||||
else:
|
|
||||||
security_level = default_conf['security_level'] if 'security_level' in default_conf else 'normal'
|
|
||||||
|
|
||||||
manager_util.use_uv = default_conf['use_uv'].lower() == 'true' if 'use_uv' in default_conf else False
|
manager_util.use_uv = default_conf['use_uv'].lower() == 'true' if 'use_uv' in default_conf else False
|
||||||
|
|
||||||
def get_bool(key, default_value):
|
def get_bool(key, default_value):
|
||||||
@@ -1600,26 +1600,25 @@ def read_config():
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
'http_channel_enabled': get_bool('http_channel_enabled', False),
|
'http_channel_enabled': get_bool('http_channel_enabled', False),
|
||||||
'preview_method': default_conf.get('preview_method', manager_funcs.get_current_preview_method()),
|
'preview_method': default_conf.get('preview_method', manager_funcs.get_current_preview_method()).lower(),
|
||||||
'git_exe': default_conf.get('git_exe', ''),
|
'git_exe': default_conf.get('git_exe', ''),
|
||||||
'use_uv': get_bool('use_uv', False),
|
'use_uv': get_bool('use_uv', False),
|
||||||
'channel_url': default_conf.get('channel_url', DEFAULT_CHANNEL),
|
'channel_url': default_conf.get('channel_url', DEFAULT_CHANNEL),
|
||||||
'default_cache_as_channel_url': get_bool('default_cache_as_channel_url', False),
|
'default_cache_as_channel_url': get_bool('default_cache_as_channel_url', False),
|
||||||
'share_option': default_conf.get('share_option', 'all'),
|
'share_option': default_conf.get('share_option', 'all').lower(),
|
||||||
'bypass_ssl': get_bool('bypass_ssl', False),
|
'bypass_ssl': get_bool('bypass_ssl', False),
|
||||||
'file_logging': get_bool('file_logging', True),
|
'file_logging': get_bool('file_logging', True),
|
||||||
'component_policy': default_conf.get('component_policy', 'workflow'),
|
'component_policy': default_conf.get('component_policy', 'workflow').lower(),
|
||||||
'windows_selector_event_loop_policy': get_bool('windows_selector_event_loop_policy', False),
|
'windows_selector_event_loop_policy': get_bool('windows_selector_event_loop_policy', False),
|
||||||
'model_download_by_agent': get_bool('model_download_by_agent', False),
|
'model_download_by_agent': get_bool('model_download_by_agent', False),
|
||||||
'downgrade_blacklist': default_conf.get('downgrade_blacklist', ''),
|
'downgrade_blacklist': default_conf.get('downgrade_blacklist', '').lower(),
|
||||||
'skip_migration_check': get_bool('skip_migration_check', False),
|
'skip_migration_check': get_bool('skip_migration_check', False),
|
||||||
'always_lazy_install': get_bool('always_lazy_install', False),
|
'always_lazy_install': get_bool('always_lazy_install', False),
|
||||||
'network_mode': default_conf.get('network_mode', 'public'),
|
'network_mode': default_conf.get('network_mode', 'public').lower(),
|
||||||
'security_level': security_level,
|
'security_level': default_conf.get('security_level', 'normal').lower(),
|
||||||
}
|
}
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
traceback.print_exc()
|
|
||||||
manager_util.use_uv = False
|
manager_util.use_uv = False
|
||||||
return {
|
return {
|
||||||
'http_channel_enabled': False,
|
'http_channel_enabled': False,
|
||||||
@@ -2056,8 +2055,8 @@ async def gitclone_install(url, instant_execution=False, msg_prefix='', no_deps=
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr)
|
print(f"Install(git-clone) error[1]: {url} / {e}", file=sys.stderr)
|
||||||
return result.fail(f"Install(git-clone) error: {url} / {e}")
|
return result.fail(f"Install(git-clone)[1] error: {url} / {e}")
|
||||||
|
|
||||||
|
|
||||||
def git_pull(path):
|
def git_pull(path):
|
||||||
@@ -2156,7 +2155,7 @@ def gitclone_fix(files, instant_execution=False, no_deps=False):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr)
|
print(f"Fix(git-clone) error: {url} / {e}", file=sys.stderr)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
print(f"Attempt to fixing '{files}' is done.")
|
print(f"Attempt to fixing '{files}' is done.")
|
||||||
@@ -2478,7 +2477,7 @@ def get_installed_pip_packages():
|
|||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
async def get_current_snapshot():
|
async def get_current_snapshot(custom_nodes_only = False):
|
||||||
await unified_manager.reload('cache')
|
await unified_manager.reload('cache')
|
||||||
await unified_manager.get_custom_nodes('default', 'cache')
|
await unified_manager.get_custom_nodes('default', 'cache')
|
||||||
|
|
||||||
@@ -2489,8 +2488,10 @@ async def get_current_snapshot():
|
|||||||
print("ComfyUI update fail: The installed ComfyUI does not have a Git repository.")
|
print("ComfyUI update fail: The installed ComfyUI does not have a Git repository.")
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
repo = git.Repo(repo_path)
|
comfyui_commit_hash = None
|
||||||
comfyui_commit_hash = repo.head.commit.hexsha
|
if not custom_nodes_only:
|
||||||
|
repo = git.Repo(repo_path)
|
||||||
|
comfyui_commit_hash = repo.head.commit.hexsha
|
||||||
|
|
||||||
git_custom_nodes = {}
|
git_custom_nodes = {}
|
||||||
cnr_custom_nodes = {}
|
cnr_custom_nodes = {}
|
||||||
@@ -2556,7 +2557,7 @@ async def get_current_snapshot():
|
|||||||
|
|
||||||
file_custom_nodes.append(item)
|
file_custom_nodes.append(item)
|
||||||
|
|
||||||
pip_packages = get_installed_pip_packages()
|
pip_packages = None if custom_nodes_only else get_installed_pip_packages()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'comfyui': comfyui_commit_hash,
|
'comfyui': comfyui_commit_hash,
|
||||||
@@ -2567,7 +2568,7 @@ async def get_current_snapshot():
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def save_snapshot_with_postfix(postfix, path=None):
|
async def save_snapshot_with_postfix(postfix, path=None, custom_nodes_only = False):
|
||||||
if path is None:
|
if path is None:
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
|
|
||||||
@@ -2579,7 +2580,7 @@ async def save_snapshot_with_postfix(postfix, path=None):
|
|||||||
file_name = path.replace('\\', '/').split('/')[-1]
|
file_name = path.replace('\\', '/').split('/')[-1]
|
||||||
file_name = file_name.split('.')[-2]
|
file_name = file_name.split('.')[-2]
|
||||||
|
|
||||||
snapshot = await get_current_snapshot()
|
snapshot = await get_current_snapshot(custom_nodes_only)
|
||||||
if path.endswith('.json'):
|
if path.endswith('.json'):
|
||||||
with open(path, "w") as json_file:
|
with open(path, "w") as json_file:
|
||||||
json.dump(snapshot, json_file, indent=4)
|
json.dump(snapshot, json_file, indent=4)
|
||||||
|
|||||||
@@ -55,8 +55,14 @@ def handle_stream(stream, prefix):
|
|||||||
from comfy.cli_args import args
|
from comfy.cli_args import args
|
||||||
import latent_preview
|
import latent_preview
|
||||||
|
|
||||||
|
def is_loopback(address):
|
||||||
|
import ipaddress
|
||||||
|
try:
|
||||||
|
return ipaddress.ip_address(address).is_loopback
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
is_local_mode = args.listen.startswith('127.') or args.listen.startswith('local.')
|
is_local_mode = is_loopback(args.listen)
|
||||||
|
|
||||||
|
|
||||||
model_dir_name_map = {
|
model_dir_name_map = {
|
||||||
@@ -85,11 +91,11 @@ def is_allowed_security_level(level):
|
|||||||
return False
|
return False
|
||||||
elif level == 'high':
|
elif level == 'high':
|
||||||
if is_local_mode:
|
if is_local_mode:
|
||||||
return core.get_config()['security_level'].lower() in ['weak', 'normal-']
|
return core.get_config()['security_level'] in ['weak', 'normal-']
|
||||||
else:
|
else:
|
||||||
return core.get_config()['security_level'].lower() == 'weak'
|
return core.get_config()['security_level'] == 'weak'
|
||||||
elif level == 'middle':
|
elif level == 'middle':
|
||||||
return core.get_config()['security_level'].lower() in ['weak', 'normal', 'normal-']
|
return core.get_config()['security_level'] in ['weak', 'normal', 'normal-']
|
||||||
else:
|
else:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -410,22 +416,60 @@ async def task_worker():
|
|||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
return f"Installation failed:\n{node_spec_str}"
|
return f"Installation failed:\n{node_spec_str}"
|
||||||
|
|
||||||
async def do_update(item) -> str:
|
async def do_update(item):
|
||||||
ui_id, node_name, node_ver = item
|
ui_id, node_name, node_ver = item
|
||||||
|
|
||||||
try:
|
try:
|
||||||
res = core.unified_manager.unified_update(node_name, node_ver)
|
res = core.unified_manager.unified_update(node_name, node_ver)
|
||||||
|
|
||||||
|
if res.ver == 'unknown':
|
||||||
|
url = core.unified_manager.unknown_active_nodes[node_name][0]
|
||||||
|
title = os.path.basename(url)
|
||||||
|
else:
|
||||||
|
url = core.unified_manager.cnr_map[node_name].get('repository')
|
||||||
|
title = core.unified_manager.cnr_map[node_name]['name']
|
||||||
|
|
||||||
manager_util.clear_pip_cache()
|
manager_util.clear_pip_cache()
|
||||||
|
|
||||||
if res.result:
|
if url is not None:
|
||||||
return 'success'
|
base_res = {'url': url, 'title': title}
|
||||||
|
else:
|
||||||
|
base_res = {'title': title}
|
||||||
|
|
||||||
|
if res.result:
|
||||||
|
if res.action == 'skip':
|
||||||
|
base_res['msg'] = 'skip'
|
||||||
|
return base_res
|
||||||
|
else:
|
||||||
|
base_res['msg'] = 'success'
|
||||||
|
return base_res
|
||||||
|
|
||||||
|
base_res['msg'] = f"An error occurred while updating '{node_name}'."
|
||||||
logging.error(f"\nERROR: An error occurred while updating '{node_name}'.")
|
logging.error(f"\nERROR: An error occurred while updating '{node_name}'.")
|
||||||
|
return base_res
|
||||||
except Exception:
|
except Exception:
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
return f"An error occurred while updating '{node_name}'."
|
return {'msg':f"An error occurred while updating '{node_name}'."}
|
||||||
|
|
||||||
|
async def do_update_comfyui() -> str:
|
||||||
|
try:
|
||||||
|
repo_path = os.path.dirname(folder_paths.__file__)
|
||||||
|
res = core.update_path(repo_path)
|
||||||
|
|
||||||
|
if res == "fail":
|
||||||
|
logging.error("ComfyUI update fail: The installed ComfyUI does not have a Git repository.")
|
||||||
|
return "The installed ComfyUI does not have a Git repository."
|
||||||
|
elif res == "updated":
|
||||||
|
logging.info("ComfyUI is updated.")
|
||||||
|
return "success"
|
||||||
|
else: # skipped
|
||||||
|
logging.info("ComfyUI is up-to-date.")
|
||||||
|
return "skip"
|
||||||
|
except Exception:
|
||||||
|
traceback.print_exc()
|
||||||
|
|
||||||
|
return "An error occurred while updating 'comfyui'."
|
||||||
|
|
||||||
async def do_fix(item) -> str:
|
async def do_fix(item) -> str:
|
||||||
ui_id, node_name, node_ver = item
|
ui_id, node_name, node_ver = item
|
||||||
@@ -550,6 +594,10 @@ async def task_worker():
|
|||||||
msg = await do_install_model(item)
|
msg = await do_install_model(item)
|
||||||
elif kind == 'update':
|
elif kind == 'update':
|
||||||
msg = await do_update(item)
|
msg = await do_update(item)
|
||||||
|
elif kind == 'update-main':
|
||||||
|
msg = await do_update(item)
|
||||||
|
elif kind == 'update-comfyui':
|
||||||
|
msg = await do_update_comfyui()
|
||||||
elif kind == 'fix':
|
elif kind == 'fix':
|
||||||
msg = await do_fix(item)
|
msg = await do_fix(item)
|
||||||
elif kind == 'uninstall':
|
elif kind == 'uninstall':
|
||||||
@@ -569,6 +617,15 @@ async def task_worker():
|
|||||||
if kind == 'install-model':
|
if kind == 'install-model':
|
||||||
model_result[ui_id] = msg
|
model_result[ui_id] = msg
|
||||||
ui_target = "model_manager"
|
ui_target = "model_manager"
|
||||||
|
elif kind == 'update-main':
|
||||||
|
nodepack_result[ui_id] = msg
|
||||||
|
ui_target = "main"
|
||||||
|
elif kind == 'update-comfyui':
|
||||||
|
nodepack_result['comfyui'] = msg
|
||||||
|
ui_target = "main"
|
||||||
|
elif kind == 'update':
|
||||||
|
nodepack_result[ui_id] = msg['msg']
|
||||||
|
ui_target = "nodepack_manager"
|
||||||
else:
|
else:
|
||||||
nodepack_result[ui_id] = msg
|
nodepack_result[ui_id] = msg
|
||||||
ui_target = "nodepack_manager"
|
ui_target = "nodepack_manager"
|
||||||
@@ -643,49 +700,46 @@ async def fetch_updates(request):
|
|||||||
return web.Response(status=400)
|
return web.Response(status=400)
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/customnode/update_all")
|
@routes.get("/manager/queue/update_all")
|
||||||
async def update_all(request):
|
async def update_all(request):
|
||||||
if not is_allowed_security_level('middle'):
|
if not is_allowed_security_level('middle'):
|
||||||
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
|
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
|
||||||
return web.Response(status=403)
|
return web.Response(status=403)
|
||||||
|
|
||||||
try:
|
with task_worker_lock:
|
||||||
await core.save_snapshot_with_postfix('autosave')
|
is_processing = task_worker_thread is not None and task_worker_thread.is_alive()
|
||||||
|
if is_processing:
|
||||||
|
return web.Response(status=401)
|
||||||
|
|
||||||
|
await core.save_snapshot_with_postfix('autosave')
|
||||||
|
|
||||||
if request.rel_url.query["mode"] == "local":
|
if request.rel_url.query["mode"] == "local":
|
||||||
channel = 'local'
|
channel = 'local'
|
||||||
else:
|
else:
|
||||||
channel = core.get_config()['channel_url']
|
channel = core.get_config()['channel_url']
|
||||||
|
|
||||||
await core.unified_manager.reload(request.rel_url.query["mode"])
|
await core.unified_manager.reload(request.rel_url.query["mode"])
|
||||||
await core.unified_manager.get_custom_nodes(channel, request.rel_url.query["mode"])
|
await core.unified_manager.get_custom_nodes(channel, request.rel_url.query["mode"])
|
||||||
|
|
||||||
updated_cnr = []
|
for k, v in core.unified_manager.active_nodes.items():
|
||||||
for k, v in core.unified_manager.active_nodes.items():
|
if k == 'comfyui-manager':
|
||||||
if v[0] != 'nightly':
|
# skip updating comfyui-manager if desktop version
|
||||||
res = core.unified_manager.unified_update(k, v[0])
|
if os.environ.get('__COMFYUI_DESKTOP_VERSION__'):
|
||||||
if res.action == 'switch-cnr' and res:
|
continue
|
||||||
updated_cnr.append(k)
|
|
||||||
|
|
||||||
res = core.unified_manager.fetch_or_pull_git_repo(is_pull=True)
|
update_item = k, k, v[0]
|
||||||
|
task_queue.put(("update-main", update_item))
|
||||||
|
|
||||||
res['updated'] += updated_cnr
|
for k, v in core.unified_manager.unknown_active_nodes.items():
|
||||||
|
if k == 'comfyui-manager':
|
||||||
|
# skip updating comfyui-manager if desktop version
|
||||||
|
if os.environ.get('__COMFYUI_DESKTOP_VERSION__'):
|
||||||
|
continue
|
||||||
|
|
||||||
for x in res['failed']:
|
update_item = k, k, 'unknown'
|
||||||
logging.error(f"PULL FAILED: {x}")
|
task_queue.put(("update-main", update_item))
|
||||||
|
|
||||||
if len(res['updated']) == 0 and len(res['failed']) == 0:
|
return web.Response(status=200)
|
||||||
status = 200
|
|
||||||
else:
|
|
||||||
status = 201
|
|
||||||
|
|
||||||
logging.info("\nDone.")
|
|
||||||
return web.json_response(res, status=status, content_type='application/json')
|
|
||||||
except:
|
|
||||||
traceback.print_exc()
|
|
||||||
return web.Response(status=400)
|
|
||||||
finally:
|
|
||||||
manager_util.clear_pip_cache()
|
|
||||||
|
|
||||||
|
|
||||||
def convert_markdown_to_html(input_text):
|
def convert_markdown_to_html(input_text):
|
||||||
@@ -1281,26 +1335,10 @@ async def update_custom_node(request):
|
|||||||
return web.Response(status=200)
|
return web.Response(status=200)
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/comfyui_manager/update_comfyui")
|
@routes.get("/manager/queue/update_comfyui")
|
||||||
async def update_comfyui(request):
|
async def update_comfyui(request):
|
||||||
logging.info("Update ComfyUI")
|
task_queue.put(("update-comfyui", ('comfyui',)))
|
||||||
|
return web.Response(status=200)
|
||||||
try:
|
|
||||||
repo_path = os.path.dirname(folder_paths.__file__)
|
|
||||||
res = core.update_path(repo_path)
|
|
||||||
if res == "fail":
|
|
||||||
logging.error("ComfyUI update fail: The installed ComfyUI does not have a Git repository.")
|
|
||||||
return web.Response(status=400)
|
|
||||||
elif res == "updated":
|
|
||||||
logging.info("ComfyUI is updated.")
|
|
||||||
return web.Response(status=201)
|
|
||||||
else: # skipped
|
|
||||||
logging.info("ComfyUI is up-to-date.")
|
|
||||||
return web.Response(status=200)
|
|
||||||
except Exception as e:
|
|
||||||
logging.error(f"ComfyUI update fail: {e}", file=sys.stderr)
|
|
||||||
|
|
||||||
return web.Response(status=400)
|
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/comfyui_manager/comfyui_versions")
|
@routes.get("/comfyui_manager/comfyui_versions")
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
|
import chardet
|
||||||
|
|
||||||
|
|
||||||
cache_lock = threading.Lock()
|
cache_lock = threading.Lock()
|
||||||
@@ -373,3 +374,22 @@ def sanitize(data):
|
|||||||
def sanitize_filename(input_string):
|
def sanitize_filename(input_string):
|
||||||
result_string = re.sub(r'[^a-zA-Z0-9_]', '_', input_string)
|
result_string = re.sub(r'[^a-zA-Z0-9_]', '_', input_string)
|
||||||
return result_string
|
return result_string
|
||||||
|
|
||||||
|
|
||||||
|
def robust_readlines(fullpath):
|
||||||
|
try:
|
||||||
|
with open(fullpath, "r") as f:
|
||||||
|
return f.readlines()
|
||||||
|
except:
|
||||||
|
encoding = None
|
||||||
|
with open(fullpath, "rb") as f:
|
||||||
|
raw_data = f.read()
|
||||||
|
result = chardet.detect(raw_data)
|
||||||
|
encoding = result['encoding']
|
||||||
|
|
||||||
|
if encoding is not None:
|
||||||
|
with open(fullpath, "r", encoding=encoding) as f:
|
||||||
|
return f.readlines()
|
||||||
|
|
||||||
|
print(f"[ComfyUI-Manager] Failed to recognize encoding for: {fullpath}")
|
||||||
|
return []
|
||||||
|
|||||||
@@ -13,7 +13,9 @@ import {
|
|||||||
import { OpenArtShareDialog } from "./comfyui-share-openart.js";
|
import { OpenArtShareDialog } from "./comfyui-share-openart.js";
|
||||||
import {
|
import {
|
||||||
free_models, install_pip, install_via_git_url, manager_instance,
|
free_models, install_pip, install_via_git_url, manager_instance,
|
||||||
rebootAPI, migrateAPI, setManagerInstance, show_message, customAlert, customPrompt } from "./common.js";
|
rebootAPI, migrateAPI, setManagerInstance, show_message, customAlert, customPrompt,
|
||||||
|
infoToast, showTerminal, setNeedRestart
|
||||||
|
} from "./common.js";
|
||||||
import { ComponentBuilderDialog, getPureName, load_components, set_component_policy } from "./components-manager.js";
|
import { ComponentBuilderDialog, getPureName, load_components, set_component_policy } from "./components-manager.js";
|
||||||
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
||||||
import { ModelManager } from "./model-manager.js";
|
import { ModelManager } from "./model-manager.js";
|
||||||
@@ -225,7 +227,11 @@ var update_comfyui_button = null;
|
|||||||
var switch_comfyui_button = null;
|
var switch_comfyui_button = null;
|
||||||
var fetch_updates_button = null;
|
var fetch_updates_button = null;
|
||||||
var update_all_button = null;
|
var update_all_button = null;
|
||||||
|
var restart_stop_button = null;
|
||||||
|
|
||||||
let share_option = 'all';
|
let share_option = 'all';
|
||||||
|
var is_updating_all = false;
|
||||||
|
|
||||||
|
|
||||||
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
|
// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts
|
||||||
const style = `
|
const style = `
|
||||||
@@ -424,102 +430,54 @@ async function init_notice(notice) {
|
|||||||
|
|
||||||
await init_share_option();
|
await init_share_option();
|
||||||
|
|
||||||
async function fetchNicknames() {
|
|
||||||
const response1 = await api.fetchApi(`/customnode/getmappings?mode=nickname`);
|
|
||||||
const mappings = await response1.json();
|
|
||||||
|
|
||||||
let result = {};
|
async function set_inprogress_mode() {
|
||||||
let nickname_patterns = [];
|
update_comfyui_button.disabled = true;
|
||||||
|
update_comfyui_button.style.backgroundColor = "gray";
|
||||||
|
|
||||||
for (let i in mappings) {
|
update_all_button.disabled = true;
|
||||||
let item = mappings[i];
|
update_all_button.style.backgroundColor = "gray";
|
||||||
var nickname;
|
|
||||||
if (item[1].nickname) {
|
|
||||||
nickname = item[1].nickname;
|
|
||||||
}
|
|
||||||
else if (item[1].title) {
|
|
||||||
nickname = item[1].title;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nickname = item[1].title_aux;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let j in item[0]) {
|
switch_comfyui_button.disabled = true;
|
||||||
result[item[0][j]] = nickname;
|
switch_comfyui_button.style.backgroundColor = "gray";
|
||||||
}
|
|
||||||
|
|
||||||
if(item[1].nodename_pattern) {
|
restart_stop_button.innerText = 'Stop';
|
||||||
nickname_patterns.push([item[1].nodename_pattern, nickname]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return [result, nickname_patterns];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const [nicknames, nickname_patterns] = await fetchNicknames();
|
|
||||||
|
|
||||||
function getNickname(node, nodename) {
|
async function reset_action_buttons() {
|
||||||
if(node.nickname) {
|
const isElectron = 'electronAPI' in window;
|
||||||
return node.nickname;
|
|
||||||
|
if(isElectron) {
|
||||||
|
update_all_button.innerText = "Update All Custom Nodes";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (nicknames[nodename]) {
|
update_all_button.innerText = "Update All";
|
||||||
node.nickname = nicknames[nodename];
|
|
||||||
}
|
|
||||||
else if(node.getInnerNodes) {
|
|
||||||
let pure_name = getPureName(node);
|
|
||||||
let groupNode = app.graph.extra?.groupNodes?.[pure_name];
|
|
||||||
if(groupNode) {
|
|
||||||
let packname = groupNode.packname;
|
|
||||||
node.nickname = packname;
|
|
||||||
}
|
|
||||||
return node.nickname;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for(let i in nickname_patterns) {
|
|
||||||
let item = nickname_patterns[i];
|
|
||||||
if(nodename.match(item[0])) {
|
|
||||||
node.nickname = item[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return node.nickname;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_comfyui_button.innerText = "Update ComfyUI";
|
||||||
|
switch_comfyui_button.innerText = "Switch ComfyUI";
|
||||||
|
restart_stop_button.innerText = 'Restart';
|
||||||
|
|
||||||
|
update_comfyui_button.disabled = false;
|
||||||
|
update_all_button.disabled = false;
|
||||||
|
switch_comfyui_button.disabled = false;
|
||||||
|
|
||||||
|
update_comfyui_button.style.backgroundColor = "";
|
||||||
|
update_all_button.style.backgroundColor = "";
|
||||||
|
switch_comfyui_button.style.backgroundColor = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateComfyUI() {
|
async function updateComfyUI() {
|
||||||
let prev_text = update_comfyui_button.innerText;
|
let prev_text = update_comfyui_button.innerText;
|
||||||
update_comfyui_button.innerText = "Updating ComfyUI...";
|
update_comfyui_button.innerText = "Updating ComfyUI...";
|
||||||
update_comfyui_button.disabled = true;
|
|
||||||
update_comfyui_button.style.backgroundColor = "gray";
|
|
||||||
|
|
||||||
try {
|
set_inprogress_mode();
|
||||||
const response = await api.fetchApi('/comfyui_manager/update_comfyui');
|
|
||||||
|
|
||||||
if (response.status == 400) {
|
const response = await api.fetchApi('/manager/queue/update_comfyui');
|
||||||
show_message('Failed to update ComfyUI.');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response.status == 201) {
|
showTerminal();
|
||||||
show_message('ComfyUI has been successfully updated.');
|
await api.fetchApi('/manager/queue/start');
|
||||||
}
|
|
||||||
else {
|
|
||||||
show_message('ComfyUI is already up to date with the latest version.');
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (exception) {
|
|
||||||
show_message(`Failed to update ComfyUI / ${exception}`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
update_comfyui_button.disabled = false;
|
|
||||||
update_comfyui_button.innerText = prev_text;
|
|
||||||
update_comfyui_button.style.backgroundColor = "";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function showVersionSelectorDialog(versions, current, onSelect) {
|
function showVersionSelectorDialog(versions, current, onSelect) {
|
||||||
@@ -647,26 +605,32 @@ function showVersionSelectorDialog(versions, current, onSelect) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function switchComfyUI() {
|
async function switchComfyUI() {
|
||||||
let res = await api.fetchApi(`/comfyui_manager/comfyui_versions`, { cache: "no-store" });
|
let res = await api.fetchApi(`/comfyui_manager/comfyui_versions`, { cache: "no-store" });
|
||||||
|
|
||||||
if(res.status == 200) {
|
if(res.status == 200) {
|
||||||
let obj = await res.json();
|
let obj = await res.json();
|
||||||
|
|
||||||
let versions = [];
|
let versions = [];
|
||||||
let default_version;
|
let default_version;
|
||||||
|
|
||||||
for(let v of obj.versions) {
|
for(let v of obj.versions) {
|
||||||
default_version = v;
|
default_version = v;
|
||||||
versions.push(v);
|
versions.push(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
showVersionSelectorDialog(versions, obj.current, (selected_version) => {
|
showVersionSelectorDialog(versions, obj.current, async (selected_version) => {
|
||||||
api.fetchApi(`/comfyui_manager/comfyui_switch_version?ver=${selected_version}`, { cache: "no-store" });
|
let response = await api.fetchApi(`/comfyui_manager/comfyui_switch_version?ver=${selected_version}`, { cache: "no-store" });
|
||||||
});
|
if (response.status == 200) {
|
||||||
}
|
infoToast(`ComfyUI version is switched to ${selected_version}`);
|
||||||
else {
|
}
|
||||||
show_message('Failed to fetch ComfyUI versions.');
|
else {
|
||||||
}
|
customAlert('Failed to switch ComfyUI version.');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
customAlert('Failed to fetch ComfyUI versions.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -720,70 +684,135 @@ async function fetchUpdates(update_check_checkbox) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function updateAll(update_check_checkbox, manager_dialog) {
|
async function onQueueStatus(event) {
|
||||||
let prev_text = update_all_button.innerText;
|
const isElectron = 'electronAPI' in window;
|
||||||
update_all_button.innerText = "Updating all...(ComfyUI)";
|
|
||||||
update_all_button.disabled = true;
|
|
||||||
update_all_button.style.backgroundColor = "gray";
|
|
||||||
|
|
||||||
try {
|
if(event.detail.status == 'in_progress') {
|
||||||
var mode = manager_instance.datasrc_combo.value;
|
set_inprogress_mode();
|
||||||
|
update_all_button.innerText = `in progress.. (${event.detail.done_count}/${event.detail.total_count})`;
|
||||||
|
}
|
||||||
|
else if(event.detail.status == 'done') {
|
||||||
|
reset_action_buttons();
|
||||||
|
|
||||||
update_all_button.innerText = "Updating all...";
|
if(!is_updating_all) {
|
||||||
const response1 = await api.fetchApi('/comfyui_manager/update_comfyui');
|
return;
|
||||||
const response2 = await api.fetchApi(`/customnode/update_all?mode=${mode}`);
|
|
||||||
|
|
||||||
if (response2.status == 403) {
|
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response1.status == 400 || response2.status == 400) {
|
is_updating_all = false;
|
||||||
show_message('Failed to update ComfyUI or several extensions.<BR><BR>See terminal log.<BR>');
|
|
||||||
return false;
|
let success_list = [];
|
||||||
|
let failed_list = [];
|
||||||
|
let comfyui_state = null;
|
||||||
|
|
||||||
|
for(let k in event.detail.nodepack_result){
|
||||||
|
let v = event.detail.nodepack_result[k];
|
||||||
|
|
||||||
|
if(k == 'comfyui') {
|
||||||
|
comfyui_state = v;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(v.msg == 'success') {
|
||||||
|
success_list.push(k);
|
||||||
|
}
|
||||||
|
else if(v.msg != 'skip')
|
||||||
|
failed_list.push(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(response1.status == 201 || response2.status == 201) {
|
let msg = "";
|
||||||
const update_info = await response2.json();
|
|
||||||
|
if(success_list.length == 0 && comfyui_state != 'success') {
|
||||||
let failed_list = "";
|
if(failed_list.length == 0) {
|
||||||
if(update_info.failed.length > 0) {
|
msg += "All custom nodes are already up to date.";
|
||||||
failed_list = "<BR>FAILED: "+update_info.failed.join(", ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let updated_list = "";
|
|
||||||
if(update_info.updated.length > 0) {
|
|
||||||
updated_list = "<BR>UPDATED: "+update_info.updated.join(", ");
|
|
||||||
}
|
|
||||||
|
|
||||||
show_message(
|
|
||||||
"ComfyUI and all extensions have been updated to the latest version.<BR>To apply the updated custom node, please <button class='cm-small-button' id='cm-reboot-button5'>RESTART</button> ComfyUI. And refresh browser.<BR>"
|
|
||||||
+failed_list
|
|
||||||
+updated_list
|
|
||||||
);
|
|
||||||
|
|
||||||
const rebootButton = document.getElementById('cm-reboot-button5');
|
|
||||||
rebootButton.addEventListener("click",
|
|
||||||
function() {
|
|
||||||
if(rebootAPI()) {
|
|
||||||
manager_dialog.close();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
show_message('ComfyUI and all extensions are already up-to-date with the latest versions.');
|
msg = "To apply the updates, you need to <button class='cm-small-button' id='cm-reboot-button5'>RESTART</button> ComfyUI.<hr>";
|
||||||
|
|
||||||
|
if(comfyui_state == 'success') {
|
||||||
|
msg += "ComfyUI is updated.<BR><BR>";
|
||||||
|
}
|
||||||
|
else if(comfyui_state == 'skip') {
|
||||||
|
msg += "ComfyUI is already up-to-date.<BR><BR>"
|
||||||
|
}
|
||||||
|
else if(comfyui_state != null) {
|
||||||
|
msg += "Failed to update ComfyUI.<BR><BR>"
|
||||||
|
}
|
||||||
|
|
||||||
|
if(success_list.length > 0) {
|
||||||
|
msg += "The following custom nodes have been updated:<ul>";
|
||||||
|
for(let x in success_list) {
|
||||||
|
let k = success_list[x];
|
||||||
|
let url = event.detail.nodepack_result[k].url;
|
||||||
|
let title = event.detail.nodepack_result[k].title;
|
||||||
|
if(url) {
|
||||||
|
msg += `<li><a href='${url}' target='_blank'>${title}</a></li>`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg += `<li>${k}</li>`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg += "</ul>";
|
||||||
|
}
|
||||||
|
|
||||||
|
setNeedRestart(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(failed_list.length > 0) {
|
||||||
|
msg += '<br>The update for the following custom nodes has failed:<ul>';
|
||||||
|
for(let x in failed_list) {
|
||||||
|
let k = failed_list[x];
|
||||||
|
let url = event.detail.nodepack_result[k].url;
|
||||||
|
let title = event.detail.nodepack_result[k].title;
|
||||||
|
if(url) {
|
||||||
|
msg += `<li><a href='${url}' target='_blank'>${title}</a></li>`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg += `<li>${k}</li>`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
msg += '</ul>'
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
show_message(msg);
|
||||||
|
|
||||||
|
const rebootButton = document.getElementById('cm-reboot-button5');
|
||||||
|
rebootButton?.addEventListener("click",
|
||||||
|
function() {
|
||||||
|
if(rebootAPI()) {
|
||||||
|
manager_dialog.close();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
catch (exception) {
|
}
|
||||||
show_message(`Failed to update ComfyUI or several extensions / ${exception}`);
|
|
||||||
return false;
|
api.addEventListener("cm-queue-status", onQueueStatus);
|
||||||
|
|
||||||
|
|
||||||
|
async function updateAll(update_comfyui, manager_dialog) {
|
||||||
|
let prev_text = update_all_button.innerText;
|
||||||
|
update_all_button.innerText = "Updating...";
|
||||||
|
|
||||||
|
set_inprogress_mode();
|
||||||
|
|
||||||
|
var mode = manager_instance.datasrc_combo.value;
|
||||||
|
|
||||||
|
showTerminal();
|
||||||
|
|
||||||
|
if(update_comfyui) {
|
||||||
|
update_all_button.innerText = "Updating ComfyUI...";
|
||||||
|
await api.fetchApi('/manager/queue/update_comfyui');
|
||||||
}
|
}
|
||||||
finally {
|
|
||||||
update_all_button.disabled = false;
|
const response = await api.fetchApi(`/manager/queue/update_all?mode=${mode}`);
|
||||||
update_all_button.innerText = prev_text;
|
|
||||||
update_all_button.style.backgroundColor = "";
|
if (response.status == 401) {
|
||||||
|
customAlert('Another task is already in progress. Please stop the ongoing task first.');
|
||||||
|
}
|
||||||
|
else if(response.status == 200) {
|
||||||
|
is_updating_all = true;
|
||||||
|
await api.fetchApi('/manager/queue/start');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,12 +836,22 @@ const isOutputNode = (node) => {
|
|||||||
return SUPPORTED_OUTPUT_NODE_TYPES.includes(node.type);
|
return SUPPORTED_OUTPUT_NODE_TYPES.includes(node.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function restartOrStop() {
|
||||||
|
if(restart_stop_button.innerText == 'Restart'){
|
||||||
|
rebootAPI();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
api.fetchApi('/manager/queue/reset');
|
||||||
|
infoToast('Cancel', 'Remaining tasks will stop after completing the current task.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -----------
|
// -----------
|
||||||
class ManagerMenuDialog extends ComfyDialog {
|
class ManagerMenuDialog extends ComfyDialog {
|
||||||
createControlsMid() {
|
createControlsMid() {
|
||||||
let self = this;
|
let self = this;
|
||||||
const isElectron = 'electronAPI' in window;
|
const isElectron = 'electronAPI' in window;
|
||||||
|
|
||||||
update_comfyui_button =
|
update_comfyui_button =
|
||||||
$el("button.cm-button", {
|
$el("button.cm-button", {
|
||||||
type: "button",
|
type: "button",
|
||||||
@@ -843,14 +882,32 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
() => fetchUpdates(this.update_check_checkbox)
|
() => fetchUpdates(this.update_check_checkbox)
|
||||||
});
|
});
|
||||||
|
|
||||||
update_all_button =
|
restart_stop_button =
|
||||||
$el("button.cm-button", {
|
$el("button.cm-button-red", {
|
||||||
type: "button",
|
type: "button",
|
||||||
textContent: "Update All",
|
textContent: "Restart",
|
||||||
onclick:
|
onclick: () => restartOrStop()
|
||||||
() => updateAll(this.update_check_checkbox, self)
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if(isElectron) {
|
||||||
|
update_all_button =
|
||||||
|
$el("button.cm-button", {
|
||||||
|
type: "button",
|
||||||
|
textContent: "Update All Custom Nodes",
|
||||||
|
onclick:
|
||||||
|
() => updateAll(false, self)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
update_all_button =
|
||||||
|
$el("button.cm-button", {
|
||||||
|
type: "button",
|
||||||
|
textContent: "Update All",
|
||||||
|
onclick:
|
||||||
|
() => updateAll(true, self)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const res =
|
const res =
|
||||||
[
|
[
|
||||||
$el("button.cm-button", {
|
$el("button.cm-button", {
|
||||||
@@ -909,11 +966,7 @@ class ManagerMenuDialog extends ComfyDialog {
|
|||||||
fetch_updates_button,
|
fetch_updates_button,
|
||||||
|
|
||||||
$el("br", {}, []),
|
$el("br", {}, []),
|
||||||
$el("button.cm-button-red", {
|
restart_stop_button,
|
||||||
type: "button",
|
|
||||||
textContent: "Restart",
|
|
||||||
onclick: () => rebootAPI()
|
|
||||||
}),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
let migration_btn =
|
let migration_btn =
|
||||||
|
|||||||
73
js/common.js
73
js/common.js
@@ -431,4 +431,75 @@ export function showTerminal() {
|
|||||||
catch(exception) {
|
catch(exception) {
|
||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let need_restart = false;
|
||||||
|
|
||||||
|
export function setNeedRestart(value) {
|
||||||
|
need_restart = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function onReconnected(event) {
|
||||||
|
if(need_restart) {
|
||||||
|
setNeedRestart(false);
|
||||||
|
|
||||||
|
const confirmed = await customConfirm("To apply the changes to the node pack's installation status, you need to refresh the browser. Would you like to refresh?");
|
||||||
|
if (!confirmed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.location.reload(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api.addEventListener('reconnected', onReconnected);
|
||||||
|
|
||||||
|
const storeId = "comfyui-manager-grid";
|
||||||
|
let timeId;
|
||||||
|
export function storeColumnWidth(gridId, columnItem) {
|
||||||
|
clearTimeout(timeId);
|
||||||
|
timeId = setTimeout(() => {
|
||||||
|
let data = {};
|
||||||
|
const dataStr = localStorage.getItem(storeId);
|
||||||
|
if (dataStr) {
|
||||||
|
try {
|
||||||
|
data = JSON.parse(dataStr);
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!data[gridId]) {
|
||||||
|
data[gridId] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
data[gridId][columnItem.id] = columnItem.width;
|
||||||
|
|
||||||
|
localStorage.setItem(storeId, JSON.stringify(data));
|
||||||
|
|
||||||
|
}, 200)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function restoreColumnWidth(gridId, columns) {
|
||||||
|
const dataStr = localStorage.getItem(storeId);
|
||||||
|
if (!dataStr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let data;
|
||||||
|
try {
|
||||||
|
data = JSON.parse(dataStr);
|
||||||
|
} catch (e) {}
|
||||||
|
if(!data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const widthMap = data[gridId];
|
||||||
|
if (!widthMap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
columns.forEach(columnItem => {
|
||||||
|
const w = widthMap[columnItem.id];
|
||||||
|
if (w) {
|
||||||
|
columnItem.width = w;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,12 +5,15 @@ import { api } from "../../scripts/api.js";
|
|||||||
import {
|
import {
|
||||||
manager_instance, rebootAPI, install_via_git_url,
|
manager_instance, rebootAPI, install_via_git_url,
|
||||||
fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt,
|
fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt,
|
||||||
sanitizeHTML, infoToast, showTerminal
|
sanitizeHTML, infoToast, showTerminal, setNeedRestart,
|
||||||
|
storeColumnWidth, restoreColumnWidth
|
||||||
} from "./common.js";
|
} from "./common.js";
|
||||||
|
|
||||||
// https://cenfun.github.io/turbogrid/api.html
|
// https://cenfun.github.io/turbogrid/api.html
|
||||||
import TG from "./turbogrid.esm.js";
|
import TG from "./turbogrid.esm.js";
|
||||||
|
|
||||||
|
const gridId = "node";
|
||||||
|
|
||||||
const pageCss = `
|
const pageCss = `
|
||||||
.cn-manager {
|
.cn-manager {
|
||||||
--grid-font: -apple-system, BlinkMacSystemFont, "Segue UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
--grid-font: -apple-system, BlinkMacSystemFont, "Segue UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
@@ -401,7 +404,6 @@ export class CustomNodesManager {
|
|||||||
this.init();
|
this.init();
|
||||||
|
|
||||||
api.addEventListener("cm-queue-status", this.onQueueStatus);
|
api.addEventListener("cm-queue-status", this.onQueueStatus);
|
||||||
api.addEventListener('reconnected', this.onReconnected);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
@@ -833,6 +835,10 @@ export class CustomNodesManager {
|
|||||||
this.renderSelected();
|
this.renderSelected();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
grid.bind("onColumnWidthChanged", (e, columnItem) => {
|
||||||
|
storeColumnWidth(gridId, columnItem)
|
||||||
|
});
|
||||||
|
|
||||||
grid.bind('onClick', (e, d) => {
|
grid.bind('onClick', (e, d) => {
|
||||||
const btn = this.getButton(d.e.target);
|
const btn = this.getButton(d.e.target);
|
||||||
if (btn) {
|
if (btn) {
|
||||||
@@ -1160,6 +1166,8 @@ export class CustomNodesManager {
|
|||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
restoreColumnWidth(gridId, columns);
|
||||||
|
|
||||||
this.grid.setData({
|
this.grid.setData({
|
||||||
options: options,
|
options: options,
|
||||||
rows: rows_values,
|
rows: rows_values,
|
||||||
@@ -1403,21 +1411,6 @@ export class CustomNodesManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async onReconnected(event) {
|
|
||||||
let self = CustomNodesManager.instance;
|
|
||||||
|
|
||||||
if(self.need_restart) {
|
|
||||||
self.need_restart = false;
|
|
||||||
|
|
||||||
const confirmed = await customConfirm("To apply the changes to the node pack's installation status, you need to refresh the browser. Would you like to refresh?");
|
|
||||||
if (!confirmed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
window.location.reload(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async onQueueStatus(event) {
|
async onQueueStatus(event) {
|
||||||
let self = CustomNodesManager.instance;
|
let self = CustomNodesManager.instance;
|
||||||
if(event.detail.status == 'in_progress' && event.detail.ui_target == 'nodepack_manager') {
|
if(event.detail.status == 'in_progress' && event.detail.ui_target == 'nodepack_manager') {
|
||||||
@@ -1457,7 +1450,7 @@ export class CustomNodesManager {
|
|||||||
for(let hash in result){
|
for(let hash in result){
|
||||||
let v = result[hash];
|
let v = result[hash];
|
||||||
|
|
||||||
if(v != 'success')
|
if(v != 'success' && v != 'skip')
|
||||||
errorMsg += v+'\n';
|
errorMsg += v+'\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1672,6 +1665,8 @@ export class CustomNodesManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async loadData(show_mode = ShowMode.NORMAL) {
|
async loadData(show_mode = ShowMode.NORMAL) {
|
||||||
|
const isElectron = 'electronAPI' in window;
|
||||||
|
|
||||||
this.show_mode = show_mode;
|
this.show_mode = show_mode;
|
||||||
console.log("Show mode:", show_mode);
|
console.log("Show mode:", show_mode);
|
||||||
|
|
||||||
@@ -1691,6 +1686,11 @@ export class CustomNodesManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { channel, node_packs } = res.data;
|
const { channel, node_packs } = res.data;
|
||||||
|
|
||||||
|
if(isElectron) {
|
||||||
|
delete node_packs['comfyui-manager'];
|
||||||
|
}
|
||||||
|
|
||||||
this.channel = channel;
|
this.channel = channel;
|
||||||
this.mode = mode;
|
this.mode = mode;
|
||||||
this.custom_nodes = node_packs;
|
this.custom_nodes = node_packs;
|
||||||
@@ -1891,7 +1891,7 @@ export class CustomNodesManager {
|
|||||||
|
|
||||||
showRestart() {
|
showRestart() {
|
||||||
this.element.querySelector(".cn-manager-restart").style.display = "block";
|
this.element.querySelector(".cn-manager-restart").style.display = "block";
|
||||||
this.need_restart = true;
|
setNeedRestart(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
showStop() {
|
showStop() {
|
||||||
|
|||||||
@@ -2,13 +2,16 @@ import { app } from "../../scripts/app.js";
|
|||||||
import { $el } from "../../scripts/ui.js";
|
import { $el } from "../../scripts/ui.js";
|
||||||
import {
|
import {
|
||||||
manager_instance, rebootAPI,
|
manager_instance, rebootAPI,
|
||||||
fetchData, md5, icons, show_message, customAlert, infoToast, showTerminal
|
fetchData, md5, icons, show_message, customAlert, infoToast, showTerminal,
|
||||||
|
storeColumnWidth, restoreColumnWidth
|
||||||
} from "./common.js";
|
} from "./common.js";
|
||||||
import { api } from "../../scripts/api.js";
|
import { api } from "../../scripts/api.js";
|
||||||
|
|
||||||
// https://cenfun.github.io/turbogrid/api.html
|
// https://cenfun.github.io/turbogrid/api.html
|
||||||
import TG from "./turbogrid.esm.js";
|
import TG from "./turbogrid.esm.js";
|
||||||
|
|
||||||
|
const gridId = "model";
|
||||||
|
|
||||||
const pageCss = `
|
const pageCss = `
|
||||||
.cmm-manager {
|
.cmm-manager {
|
||||||
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
--grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
|
||||||
@@ -438,6 +441,10 @@ export class ModelManager {
|
|||||||
this.renderSelected();
|
this.renderSelected();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
grid.bind("onColumnWidthChanged", (e, columnItem) => {
|
||||||
|
storeColumnWidth(gridId, columnItem)
|
||||||
|
});
|
||||||
|
|
||||||
grid.bind('onClick', (e, d) => {
|
grid.bind('onClick', (e, d) => {
|
||||||
const { rowItem } = d;
|
const { rowItem } = d;
|
||||||
const target = d.e.target;
|
const target = d.e.target;
|
||||||
@@ -589,6 +596,8 @@ export class ModelManager {
|
|||||||
width: 200
|
width: 200
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
restoreColumnWidth(gridId, columns);
|
||||||
|
|
||||||
this.grid.setData({
|
this.grid.setData({
|
||||||
options,
|
options,
|
||||||
rows,
|
rows,
|
||||||
|
|||||||
@@ -12,6 +12,77 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "D1-3105",
|
||||||
|
"title": "ComfyUI-VideoStream",
|
||||||
|
"reference": "https://github.com/D1-3105/ComfyUI-VideoStream",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/D1-3105/ComfyUI-VideoStream"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "NODES: FloWWeaverExportSingleFrameGRPC"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "gmorks",
|
||||||
|
"title": "ComfyUI Animagine prompt [WIP]",
|
||||||
|
"reference": "https://github.com/gmorks/ComfyUI-Animagine-Prompt",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/gmorks/ComfyUI-Animagine-Prompt"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Comfy UI node to prompt build for [a/https://huggingface.co/cagliostrolab/animagine-xl-4.0](https://huggingface.co/cagliostrolab/animagine-xl-4.0) model\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "wirytiox",
|
||||||
|
"title": "ComfyUI-Qwen [CONFLICT]",
|
||||||
|
"reference": "https://github.com/mr-krak3n/ComfyUI-Qwen",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/mr-krak3n/ComfyUI-Qwen"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This repository contains custom nodes for ComfyUI, designed to facilitate working with language models such as Qwen2.5 and DeepSeek. [w/This node pack is causing a name conflict with https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "hiusdev",
|
||||||
|
"title": "ComfyUI_Lah_Toffee",
|
||||||
|
"reference": "https://github.com/hiusdev/ComfyUI_Lah_Toffee",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/hiusdev/ComfyUI_Lah_Toffee"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "NODES: Lah LoadVideoRandom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "hdfhssg",
|
||||||
|
"title": "ComfyUI_pxtool [WIP]",
|
||||||
|
"reference": "https://github.com/hdfhssg/ComfyUI_pxtool",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/hdfhssg/ComfyUI_pxtool"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a custom plugin node for ComfyUI that modifies and extends some features from existing projects. The main implementations include:\n* Reproducing some features of the [a/Stable-Diffusion-Webui-Civitai-Helper](https://github.com/zixaphir/Stable-Diffusion-Webui-Civitai-Helper) project within ComfyUI\n* Implementing a feature to randomly generate related prompt words by referencing the [a/noob-wiki dataset](https://huggingface.co/datasets/Laxhar/noob-wiki/tree/main)\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "dasilva333",
|
||||||
|
"title": "ComfyUI_MarkdownImage [WIP]",
|
||||||
|
"reference": "https://github.com/dasilva333/ComfyUI_MarkdownImage",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/dasilva333/ComfyUI_MarkdownImage"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Create an image using html and markdown in ComfyUI\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "franky519",
|
||||||
|
"title": "comfyui-redux-style",
|
||||||
|
"reference": "https://github.com/franky519/comfyui-redux-style",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/franky519/comfyui-redux-style"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "NODES: Style Model Grid, Style Model Apply, Style Model Advanced"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "rishipandey125",
|
"author": "rishipandey125",
|
||||||
"title": "ComfyUI-FramePacking [WIP]",
|
"title": "ComfyUI-FramePacking [WIP]",
|
||||||
@@ -543,16 +614,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Tools for creating voxel based videos"
|
"description": "Tools for creating voxel based videos"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "Njbx",
|
|
||||||
"title": "ComfyUI-blockswap",
|
|
||||||
"reference": "https://github.com/Njbx/ComfyUI-blockswap",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Njbx/ComfyUI-blockswap"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "NODES: Block Swap"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "PATATAJEC",
|
"author": "PATATAJEC",
|
||||||
"title": "Patatajec-Nodes [WIP]",
|
"title": "Patatajec-Nodes [WIP]",
|
||||||
|
|||||||
@@ -178,10 +178,17 @@
|
|||||||
"https://github.com/807502278/ComfyUI_TensorRT_Merge": [
|
"https://github.com/807502278/ComfyUI_TensorRT_Merge": [
|
||||||
[
|
[
|
||||||
"BiRefNet2_tensort",
|
"BiRefNet2_tensort",
|
||||||
|
"BiRefNet_TRT",
|
||||||
|
"Building_TRT",
|
||||||
|
"Custom_Building_TRT",
|
||||||
"DepthAnything_Tensorrt",
|
"DepthAnything_Tensorrt",
|
||||||
"Dwpose_Tensorrt",
|
"Dwpose_Tensorrt",
|
||||||
"building_tensorrt_engine",
|
"FaceRestoreTensorrt",
|
||||||
"load_BiRefNet2_General",
|
"RifeTensorrt",
|
||||||
|
"UpscalerTensorrt",
|
||||||
|
"YoloNasPoseTensorrt",
|
||||||
|
"load_BiRefNet2_tensort",
|
||||||
|
"load_BiRefNet_TRT",
|
||||||
"load_DepthAnything_Tensorrt",
|
"load_DepthAnything_Tensorrt",
|
||||||
"load_Dwpos_Tensorrt"
|
"load_Dwpos_Tensorrt"
|
||||||
],
|
],
|
||||||
@@ -651,6 +658,14 @@
|
|||||||
"title_aux": "ComfyUI OpenAI Nodes"
|
"title_aux": "ComfyUI OpenAI Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/D1-3105/ComfyUI-VideoStream": [
|
||||||
|
[
|
||||||
|
"FloWWeaverExportSingleFrameGRPC"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-VideoStream"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/DataCTE/ComfyUI-DataVoid-nodes": [
|
"https://github.com/DataCTE/ComfyUI-DataVoid-nodes": [
|
||||||
[
|
[
|
||||||
"IPAAdapterFaceIDBatch",
|
"IPAAdapterFaceIDBatch",
|
||||||
@@ -933,9 +948,11 @@
|
|||||||
"DeepSeekImageGeneration",
|
"DeepSeekImageGeneration",
|
||||||
"DeepSeekImageUnderstanding",
|
"DeepSeekImageUnderstanding",
|
||||||
"DeepSeekModelLoader",
|
"DeepSeekModelLoader",
|
||||||
|
"GoogleDriveUpload",
|
||||||
"ImagePreprocessor",
|
"ImagePreprocessor",
|
||||||
"LLM_Loader",
|
"LLM_Loader",
|
||||||
"OpenAICompatibleLoader"
|
"OpenAICompatibleLoader",
|
||||||
|
"VideoFileUploader"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-DeepSeek_Toolkit [WIP]"
|
"title_aux": "ComfyUI-DeepSeek_Toolkit [WIP]"
|
||||||
@@ -1255,7 +1272,8 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/M4lF3s/comfy-tif-support": [
|
"https://github.com/M4lF3s/comfy-tif-support": [
|
||||||
[
|
[
|
||||||
"Load TIFF"
|
"Load TIFF",
|
||||||
|
"Save TIFF"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfy-tif-support"
|
"title_aux": "comfy-tif-support"
|
||||||
@@ -1308,14 +1326,6 @@
|
|||||||
"title_aux": "ComfyUI-APG_ImYourCFGNow"
|
"title_aux": "ComfyUI-APG_ImYourCFGNow"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Njbx/ComfyUI-blockswap": [
|
|
||||||
[
|
|
||||||
"BlockSwap"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-blockswap"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/Northerner1/ComfyUI_North_Noise": [
|
"https://github.com/Northerner1/ComfyUI_North_Noise": [
|
||||||
[
|
[
|
||||||
"North_Unsampler"
|
"North_Unsampler"
|
||||||
@@ -1426,7 +1436,9 @@
|
|||||||
"https://github.com/RobeSantoro/ComfyUI-RobeNodes": [
|
"https://github.com/RobeSantoro/ComfyUI-RobeNodes": [
|
||||||
[
|
[
|
||||||
"List Image Path \ud83d\udc24",
|
"List Image Path \ud83d\udc24",
|
||||||
"List Video Path \ud83d\udc24"
|
"List Model Path \ud83d\udc24",
|
||||||
|
"List Video Path \ud83d\udc24",
|
||||||
|
"Peaks Weights Generator \ud83d\udc24"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Comfy UI Robe Nodes [UNSAFE]"
|
"title_aux": "Comfy UI Robe Nodes [UNSAFE]"
|
||||||
@@ -2462,6 +2474,7 @@
|
|||||||
"Mahiro",
|
"Mahiro",
|
||||||
"MaskComposite",
|
"MaskComposite",
|
||||||
"MaskToImage",
|
"MaskToImage",
|
||||||
|
"ModelComputeDtype",
|
||||||
"ModelMergeAdd",
|
"ModelMergeAdd",
|
||||||
"ModelMergeAuraflow",
|
"ModelMergeAuraflow",
|
||||||
"ModelMergeBlocks",
|
"ModelMergeBlocks",
|
||||||
@@ -2669,6 +2682,15 @@
|
|||||||
"title_aux": "VoidCustomNodes"
|
"title_aux": "VoidCustomNodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/dasilva333/ComfyUI_MarkdownImage": [
|
||||||
|
[
|
||||||
|
"CreateDialogImage",
|
||||||
|
"CreateMarkdownImage"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_MarkdownImage [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/denislov/Comfyui_AutoSurvey": [
|
"https://github.com/denislov/Comfyui_AutoSurvey": [
|
||||||
[
|
[
|
||||||
"AddDoc2Knowledge",
|
"AddDoc2Knowledge",
|
||||||
@@ -2906,6 +2928,17 @@
|
|||||||
"title_aux": "comfyui-cem-tools"
|
"title_aux": "comfyui-cem-tools"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/franky519/comfyui-redux-style": [
|
||||||
|
[
|
||||||
|
"StyleModelAdvanced",
|
||||||
|
"StyleModelApplySimple",
|
||||||
|
"StyleModelConditioner",
|
||||||
|
"StyleModelGridVisualizer"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui-redux-style"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/fritzprix/ComfyUI-LLM-Utils": [
|
"https://github.com/fritzprix/ComfyUI-LLM-Utils": [
|
||||||
[
|
[
|
||||||
"WeightedDict",
|
"WeightedDict",
|
||||||
@@ -2951,6 +2984,14 @@
|
|||||||
"title_aux": "comfyui_median_filter"
|
"title_aux": "comfyui_median_filter"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/gmorks/ComfyUI-Animagine-Prompt": [
|
||||||
|
[
|
||||||
|
"AnimaginePrompt"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI Animagine prompt [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine": [
|
"https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine": [
|
||||||
[
|
[
|
||||||
"Tools:CopyFile",
|
"Tools:CopyFile",
|
||||||
@@ -2980,7 +3021,8 @@
|
|||||||
"https://github.com/greengerong/ComfyUI-Lumina-Video": [
|
"https://github.com/greengerong/ComfyUI-Lumina-Video": [
|
||||||
[
|
[
|
||||||
"LuminaVideoModelLoader",
|
"LuminaVideoModelLoader",
|
||||||
"LuminaVideoSampler"
|
"LuminaVideoSampler",
|
||||||
|
"LuminaVideoVAEDecode"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-Lumina-Video [WIP]"
|
"title_aux": "ComfyUI-Lumina-Video [WIP]"
|
||||||
@@ -3068,6 +3110,30 @@
|
|||||||
"title_aux": "ComfyUI AceNodes [UNSAFE]"
|
"title_aux": "ComfyUI AceNodes [UNSAFE]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/hdfhssg/ComfyUI_pxtool": [
|
||||||
|
[
|
||||||
|
"CivitaiHelper",
|
||||||
|
"DanbooruCharacterTag",
|
||||||
|
"E621CharacterTag",
|
||||||
|
"NegativeTag",
|
||||||
|
"PX_Seed",
|
||||||
|
"QualityTag",
|
||||||
|
"RandomArtists",
|
||||||
|
"RandomArtistsAdvanced",
|
||||||
|
"RandomTag"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_pxtool [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://github.com/hiusdev/ComfyUI_Lah_Toffee": [
|
||||||
|
[
|
||||||
|
"LoadVideoRandom"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_Lah_Toffee"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/horidream/ComfyUI-Horidream": [
|
"https://github.com/horidream/ComfyUI-Horidream": [
|
||||||
[
|
[
|
||||||
"PassThroughWithSound"
|
"PassThroughWithSound"
|
||||||
@@ -3991,6 +4057,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/lum3on/comfyui_LLM_Polymath": [
|
"https://github.com/lum3on/comfyui_LLM_Polymath": [
|
||||||
[
|
[
|
||||||
|
"polymath_SaveAbsolute",
|
||||||
"polymath_chat",
|
"polymath_chat",
|
||||||
"polymath_scraper"
|
"polymath_scraper"
|
||||||
],
|
],
|
||||||
@@ -4199,6 +4266,16 @@
|
|||||||
"title_aux": "ComfyUI-Simple-Image-Tools [WIP]"
|
"title_aux": "ComfyUI-Simple-Image-Tools [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/mr-krak3n/ComfyUI-Qwen": [
|
||||||
|
[
|
||||||
|
"DeepSeekResponseParser",
|
||||||
|
"QwenLoader",
|
||||||
|
"QwenSampler"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Qwen [CONFLICT]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/mut-ex/comfyui-gligengui-node": [
|
"https://github.com/mut-ex/comfyui-gligengui-node": [
|
||||||
[
|
[
|
||||||
"GLIGEN_GUI"
|
"GLIGEN_GUI"
|
||||||
@@ -4391,7 +4468,8 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/osuiso-depot/comfyui-keshigom_custom": [
|
"https://github.com/osuiso-depot/comfyui-keshigom_custom": [
|
||||||
[
|
[
|
||||||
"KANI_Checkpoint_Loader_Simple",
|
"KANI_Checkpoint_Loader_From_String",
|
||||||
|
"KANI_MathExpression",
|
||||||
"KANI_Multiplexer",
|
"KANI_Multiplexer",
|
||||||
"KANI_ShowAnything",
|
"KANI_ShowAnything",
|
||||||
"KANI_TextFind",
|
"KANI_TextFind",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -10,6 +10,38 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "apesplat",
|
||||||
|
"title": "ezXY scripts and nodes [NOT MAINTAINED]",
|
||||||
|
"id": "ezxy",
|
||||||
|
"reference": "https://github.com/GMapeSplat/ComfyUI_ezXY",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/GMapeSplat/ComfyUI_ezXY"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Extensions/Patches: Enables linking float and integer inputs and ouputs. Values are automatically cast to the correct type and clamped to the correct range. Works with both builtin and custom nodes.[w/NOTE: This repo patches ComfyUI's validate_inputs and map_node_over_list functions while running. May break depending on your version of ComfyUI. Can be deactivated in config.yaml.]Nodes: A collection of nodes for facilitating the generation of XY plots. Capable of plotting changes over most primitive values.[w/Does not work with current version of Comfyui]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "mie",
|
||||||
|
"title": "ComfyUI_JanusProCaption [REMOVED]",
|
||||||
|
"reference": "https://github.com/MieMieeeee/ComfyUI-JanusProCaption",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MieMieeeee/ComfyUI-JanusProCaption"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Describe image or create caption files using Janus Pro Model"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Njbx",
|
||||||
|
"title": "ComfyUI-blockswap [REMOVED]",
|
||||||
|
"reference": "https://github.com/Njbx/ComfyUI-blockswap",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Njbx/ComfyUI-blockswap"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "NODES: Block Swap"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "T8star1984",
|
"author": "T8star1984",
|
||||||
"title": "comfyui-purgevram [REMOVED]",
|
"title": "comfyui-purgevram [REMOVED]",
|
||||||
|
|||||||
@@ -11,6 +11,107 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "SSsnap",
|
||||||
|
"title": "ComfyUI-LBW_flux",
|
||||||
|
"reference": "https://github.com/SS-snap/ComfyUI-LBW_flux",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/SS-snap/ComfyUI-LBW_flux"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Through this node, you can more easily test the impact of different blocks in flux_lora on the final result."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "thanhduong0213929",
|
||||||
|
"title": "ComfyUI-DeepUnlock",
|
||||||
|
"reference": "https://github.com/thanhduong0213929/ComfyUI-DeepUnlock",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/thanhduong0213929/ComfyUI-DeepUnlock"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "DeepFuze is a state-of-the-art deep learning tool that seamlessly integrates with ComfyUI to revolutionize facial transformations, lipsyncing, video generation, voice cloning, face swapping, and lipsync translation. Leveraging advanced algorithms, DeepFuze enables users to combine audio and video with unparalleled realism, ensuring perfectly synchronized facial movements. This innovative solution is ideal for content creators, animators, developers, and anyone seeking to elevate their video editing projects with sophisticated AI-driven features."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "MushroomFleet",
|
||||||
|
"title": "DJZ-Pedalboard",
|
||||||
|
"reference": "https://github.com/MushroomFleet/DJZ-Pedalboard",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MushroomFleet/DJZ-Pedalboard"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This project provides a collection of custom nodes designed for enhanced audio effects in ComfyUI. With an intuitive pedalboard interface, users can easily integrate and manipulate various audio effects within their workflows."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "mie",
|
||||||
|
"title": "ComfyUI_CaptionThis",
|
||||||
|
"reference": "https://github.com/MieMieeeee/ComfyUI-CaptionThis",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MieMieeeee/ComfyUI-CaptionThis"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Describe a single image or all images in a directory using models such as Janus Pro, Florence2 (coming soon), or JoyCaption (coming soon), with a particular focus on building datasets for training LoRA."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "APZmedia",
|
||||||
|
"title": "APZmedia Together Image Generator for ComfyUI",
|
||||||
|
"reference": "https://github.com/APZmedia/APZmedia-comfy-together-lora",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/APZmedia/APZmedia-comfy-together-lora"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI node to implement Together AI API image generation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "lum3on",
|
||||||
|
"title": "LLM Polymath Chat Node",
|
||||||
|
"id": "polymath",
|
||||||
|
"reference": "https://github.com/lum3on/comfyui_LLM_Polymath",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/lum3on/comfyui_LLM_Polymath"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Advanced LLM driven node with many custom instructions, including node finder, expert prompter and json converter."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "austinbrown34",
|
||||||
|
"title": "ComfyUI-IO-Helpers",
|
||||||
|
"reference": "https://github.com/austinbrown34/ComfyUI-IO-Helpers",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/austinbrown34/ComfyUI-IO-Helpers"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A custom nodes package for ComfyUI that enhances workflow flexibility by providing specialized nodes for saving and loading intermediate data (encoded prompts and sampled latents) in multiple formats. This package leverages helper classes for file I/O, supports gzip compression for efficient storage, and integrates progress feedback via a progress bar to improve user experience during long operations."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "HowToSD",
|
||||||
|
"title": "ComfyUI-Data-Analysis",
|
||||||
|
"reference": "https://github.com/HowToSD/ComfyUI-Data-Analysis",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/HowToSD/ComfyUI-Data-Analysis"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Data analysis custom modules for ComfyUI - Use Pandas & Matplotlib from within ComfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "dasilva333",
|
||||||
|
"title": "ComfyUI_ContrastingColor",
|
||||||
|
"reference": "https://github.com/dasilva333/ComfyUI_ContrastingColor",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/dasilva333/ComfyUI_ContrastingColor"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This node calculates a contrasting complementary color based on an input RGB color. The goal is to ensure visibility and contrast when overlaying text, UI elements, or graphical components against a given background color."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "moon7star9",
|
||||||
|
"title": "ComfyUI_BiRefNet_Universal",
|
||||||
|
"reference": "https://github.com/moon7star9/ComfyUI_BiRefNet_Universal",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/moon7star9/ComfyUI_BiRefNet_Universal"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A comprehensive node package that seamlessly integrates all BiRefNet series models into ComfyUI"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "ShunL12324",
|
"author": "ShunL12324",
|
||||||
"title": "comfy-portal-endpoint",
|
"title": "comfy-portal-endpoint",
|
||||||
@@ -520,16 +621,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This node group contains a series of ComfyUI nodes with built-in counters and specific output results based on the counter's output, aimed at implementing folder traversal functionality in the ComfyUI frontend. For specific examples, please refer to the sample workflow. Of course, you can also use your imagination to create other interesting things."
|
"description": "This node group contains a series of ComfyUI nodes with built-in counters and specific output results based on the counter's output, aimed at implementing folder traversal functionality in the ComfyUI frontend. For specific examples, please refer to the sample workflow. Of course, you can also use your imagination to create other interesting things."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "gmorks",
|
|
||||||
"title": "ComfyUI Animagine prompt",
|
|
||||||
"reference": "https://github.com/gmorks/ComfyUI-Animagine-Prompt",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/gmorks/ComfyUI-Animagine-Prompt"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Comfy UI node to prompt build for [a/https://huggingface.co/cagliostrolab/animagine-xl-4.0](https://huggingface.co/cagliostrolab/animagine-xl-4.0) model"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "Kayarte",
|
"author": "Kayarte",
|
||||||
"title": "GeoNodes",
|
"title": "GeoNodes",
|
||||||
@@ -602,99 +693,6 @@
|
|||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "About DeepSeek Chat API\nGo here to register and get the api-key [a/https://platform.deepseek.com/](https://platform.deepseek.com/) Then enter api_key in config.json"
|
"description": "About DeepSeek Chat API\nGo here to register and get the api-key [a/https://platform.deepseek.com/](https://platform.deepseek.com/) Then enter api_key in config.json"
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "chflame163",
|
|
||||||
"title": "ComfyUI_Janus_Wrapper",
|
|
||||||
"reference": "https://github.com/chflame163/ComfyUI_Janus_Wrapper",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/chflame163/ComfyUI_Janus_Wrapper"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Unofficial implementation of [a/deepseek-ai/Janus](https://github.com/deepseek-ai/Janus) in ComfyUI."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "ReBeating",
|
|
||||||
"title": "ComfyUI-Artist-Selector",
|
|
||||||
"reference": "https://github.com/ReBeating/ComfyUI-Artist-Selector",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/ReBeating/ComfyUI-Artist-Selector"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A useful comfyui node named LoadArtistTag for selecting artist tags, including 1000+ single-artist tags and 300 mixed-artists tags."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "852wa",
|
|
||||||
"title": "ComfyUI-ColorshiftColor",
|
|
||||||
"reference": "https://github.com/852wa/ComfyUI-ColorshiftColor",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/852wa/ComfyUI-ColorshiftColor"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This is a custom node for ComfyUI.\nIt reduces colors based on a specified number and allows for adjustments to hue, saturation, and brightness.\nFeatures:Each parameter can be set to random, You can toggle masking (not changing colors) using color numbers, Mask inversion can also be toggled on or off."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "852wa",
|
|
||||||
"title": "ComfyUI-AdvancedAlphaProcessor",
|
|
||||||
"reference": "https://github.com/852wa/ComfyUI-AAP",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/852wa/ComfyUI-AAP"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This is a custom node for ComfyUI.\nFeatures:Removes white areas in the input image by making them transparent based on brightness, Outputs in black and transparent, Outputs in gray and transparent.\nThis is a simple node with the above functionalities implemented. It also supports sequential processing."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "jinanlongen",
|
|
||||||
"title": "ComfyUI Prompt Expander Node",
|
|
||||||
"reference": "https://github.com/jinanlongen/ComfyUI-Prompt-Expander",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/jinanlongen/ComfyUI-Prompt-Expander"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A custom node for ComfyUI that expands text prompts using the SuperPrompt-v1 T5 model. This node helps generate more detailed and descriptive prompts from simple input text, which can be particularly useful for image generation workflows."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Style-Mosaic",
|
|
||||||
"title": "ComfyUI DINO-X Detector Node",
|
|
||||||
"reference": "https://github.com/Style-Mosaic/dino-x-comfyui-node",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Style-Mosaic/dino-x-comfyui-node"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A ComfyUI node that integrates DINO-X API for object detection and segmentation. This node allows you to detect and segment objects in images using text prompts."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "gmorks",
|
|
||||||
"title": "ComfyUI-SendToDiscord",
|
|
||||||
"reference": "https://github.com/gmorks/ComfyUI-SendToDiscord",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/gmorks/ComfyUI-SendToDiscord"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI-SendToDiscord is a custom node for ComfyUI that simplifies sending preview images to Discord via webhooks. It supports both single-image uploads and batch mode, making it an efficient tool for sharing your generated images directly with your Discord server."
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"author": "CY-CHENYUE",
|
|
||||||
"title": "ComfyUI-Janus-Pro",
|
|
||||||
"id": "ComfyUI-Janus-Pro",
|
|
||||||
"reference": "https://github.com/CY-CHENYUE/ComfyUI-Janus-Pro",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/CY-CHENYUE/ComfyUI-Janus-Pro"
|
|
||||||
],
|
|
||||||
"description": "ComfyUI nodes for Janus-Pro, a unified multimodal understanding and generation framework.",
|
|
||||||
"install_type": "git-clone"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "burnsbert",
|
|
||||||
"title": "EBU LMStudio LLM Integration",
|
|
||||||
"id": "ebu-lmstudio",
|
|
||||||
"reference": "https://github.com/burnsbert/ComfyUI-EBU-LMStudio",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/burnsbert/ComfyUI-EBU-LMStudio"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Custom nodes for integrating LM Studio's LLM functionality into ComfyUI. Includes EBU-LMStudio-Load, EBU-LMStudio-Unload, and EBU-LMStudio-Request."
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1114,6 +1114,15 @@
|
|||||||
"title_aux": "ComfyUI_yanc"
|
"title_aux": "ComfyUI_yanc"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/APZmedia/APZmedia-comfy-together-lora": [
|
||||||
|
[
|
||||||
|
"TogetherImageGenerator",
|
||||||
|
"TogetherImageGeneratorLoRA"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "APZmedia Together Image Generator for ComfyUI"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/APZmedia/APZmedia-comfyui-fast-image-save": [
|
"https://github.com/APZmedia/APZmedia-comfyui-fast-image-save": [
|
||||||
[
|
[
|
||||||
"APZmedia Fast image save"
|
"APZmedia Fast image save"
|
||||||
@@ -1907,6 +1916,7 @@
|
|||||||
"ComfyUIDeployExternalAudio",
|
"ComfyUIDeployExternalAudio",
|
||||||
"ComfyUIDeployExternalBoolean",
|
"ComfyUIDeployExternalBoolean",
|
||||||
"ComfyUIDeployExternalCheckpoint",
|
"ComfyUIDeployExternalCheckpoint",
|
||||||
|
"ComfyUIDeployExternalEXR",
|
||||||
"ComfyUIDeployExternalFaceModel",
|
"ComfyUIDeployExternalFaceModel",
|
||||||
"ComfyUIDeployExternalImage",
|
"ComfyUIDeployExternalImage",
|
||||||
"ComfyUIDeployExternalImageAlpha",
|
"ComfyUIDeployExternalImageAlpha",
|
||||||
@@ -2389,6 +2399,7 @@
|
|||||||
"ClownSamplerAdvanced",
|
"ClownSamplerAdvanced",
|
||||||
"ClownsharKSampler",
|
"ClownsharKSampler",
|
||||||
"ClownsharKSamplerAutomation",
|
"ClownsharKSamplerAutomation",
|
||||||
|
"ClownsharKSamplerAutomation_Advanced",
|
||||||
"ClownsharKSamplerAutomation_Beta",
|
"ClownsharKSamplerAutomation_Beta",
|
||||||
"ClownsharKSamplerGuide",
|
"ClownsharKSamplerGuide",
|
||||||
"ClownsharKSamplerGuide_Beta",
|
"ClownsharKSamplerGuide_Beta",
|
||||||
@@ -2405,6 +2416,7 @@
|
|||||||
"ConditioningToBase64",
|
"ConditioningToBase64",
|
||||||
"ConditioningTruncate",
|
"ConditioningTruncate",
|
||||||
"ConditioningZeroAndTruncate",
|
"ConditioningZeroAndTruncate",
|
||||||
|
"Constant Scheduler",
|
||||||
"EmptyLatentImage64",
|
"EmptyLatentImage64",
|
||||||
"EmptyLatentImageCustom",
|
"EmptyLatentImageCustom",
|
||||||
"Film Grain",
|
"Film Grain",
|
||||||
@@ -2439,6 +2451,7 @@
|
|||||||
"Legacy_ClownsharKSampler",
|
"Legacy_ClownsharKSampler",
|
||||||
"Legacy_ClownsharKSamplerGuides",
|
"Legacy_ClownsharKSamplerGuides",
|
||||||
"Legacy_SharkSampler",
|
"Legacy_SharkSampler",
|
||||||
|
"Linear Quadratic Advanced",
|
||||||
"MaskToggle",
|
"MaskToggle",
|
||||||
"ModelSamplingAdvanced",
|
"ModelSamplingAdvanced",
|
||||||
"ModelSamplingAdvancedResolution",
|
"ModelSamplingAdvancedResolution",
|
||||||
@@ -3919,27 +3932,6 @@
|
|||||||
"title_aux": "ComfyUI-Counternodes"
|
"title_aux": "ComfyUI-Counternodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/GMapeSplat/ComfyUI_ezXY": [
|
|
||||||
[
|
|
||||||
"ConcatenateString",
|
|
||||||
"ItemFromDropdown",
|
|
||||||
"IterationDriver",
|
|
||||||
"JoinImages",
|
|
||||||
"LineToConsole",
|
|
||||||
"NumberFromList",
|
|
||||||
"NumbersToList",
|
|
||||||
"PlotImages",
|
|
||||||
"StringFromList",
|
|
||||||
"StringToLabel",
|
|
||||||
"StringsToList",
|
|
||||||
"ezMath",
|
|
||||||
"ezXY_AssemblePlot",
|
|
||||||
"ezXY_Driver"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ezXY scripts and nodes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [
|
"https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [
|
||||||
[
|
[
|
||||||
"Danbooru (ID)",
|
"Danbooru (ID)",
|
||||||
@@ -5070,6 +5062,7 @@
|
|||||||
"Simple Extract Lora From Text",
|
"Simple Extract Lora From Text",
|
||||||
"Simple Image Saver (as Forge)",
|
"Simple Image Saver (as Forge)",
|
||||||
"Simple Load Image With Metadata",
|
"Simple Load Image With Metadata",
|
||||||
|
"Simple Load Images from Dir",
|
||||||
"Simple Load Line From Text File",
|
"Simple Load Line From Text File",
|
||||||
"Simple Lora Loader"
|
"Simple Lora Loader"
|
||||||
],
|
],
|
||||||
@@ -6453,6 +6446,7 @@
|
|||||||
"BlackBarsV1",
|
"BlackBarsV1",
|
||||||
"BlackBarsV2",
|
"BlackBarsV2",
|
||||||
"BlackBarsV3",
|
"BlackBarsV3",
|
||||||
|
"BracketCleaner",
|
||||||
"CRT_Effect_v1",
|
"CRT_Effect_v1",
|
||||||
"CathodeRayEffect",
|
"CathodeRayEffect",
|
||||||
"ClassicFilmEffect",
|
"ClassicFilmEffect",
|
||||||
@@ -6505,6 +6499,7 @@
|
|||||||
"ParametricMeshGenV2",
|
"ParametricMeshGenV2",
|
||||||
"ProjectFilePathNode",
|
"ProjectFilePathNode",
|
||||||
"PromptCleaner",
|
"PromptCleaner",
|
||||||
|
"PromptCleanerV2",
|
||||||
"PromptDupeRemover",
|
"PromptDupeRemover",
|
||||||
"PromptDupeRemoverV2",
|
"PromptDupeRemoverV2",
|
||||||
"PromptInject",
|
"PromptInject",
|
||||||
@@ -6546,10 +6541,13 @@
|
|||||||
"VideoTrails",
|
"VideoTrails",
|
||||||
"VideoTrailsV2",
|
"VideoTrailsV2",
|
||||||
"VideoVignettingV1",
|
"VideoVignettingV1",
|
||||||
|
"VoiceEffects",
|
||||||
|
"VoiceEffects2",
|
||||||
"WaveletCompose",
|
"WaveletCompose",
|
||||||
"WaveletDecompose",
|
"WaveletDecompose",
|
||||||
"WinampViz",
|
"WinampViz",
|
||||||
"WinampVizV2",
|
"WinampVizV2",
|
||||||
|
"ZenkaiPoseMap",
|
||||||
"ZenkaiPrompt",
|
"ZenkaiPrompt",
|
||||||
"ZenkaiPromptV2",
|
"ZenkaiPromptV2",
|
||||||
"ZenkaiPromptV3",
|
"ZenkaiPromptV3",
|
||||||
@@ -6562,6 +6560,14 @@
|
|||||||
"title_aux": "DJZ-Nodes"
|
"title_aux": "DJZ-Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/MushroomFleet/DJZ-Pedalboard": [
|
||||||
|
[
|
||||||
|
"DJZ_Pedalboard"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "DJZ-Pedalboard"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/MuziekMagie/ComfyUI-Matchering": [
|
"https://github.com/MuziekMagie/ComfyUI-Matchering": [
|
||||||
[
|
[
|
||||||
"Matchering",
|
"Matchering",
|
||||||
@@ -6962,6 +6968,7 @@
|
|||||||
"SUPIR Sampler \ud83d\udcacED",
|
"SUPIR Sampler \ud83d\udcacED",
|
||||||
"Save Image \ud83d\udd14ED",
|
"Save Image \ud83d\udd14ED",
|
||||||
"Simple Text \ud83d\udcacED",
|
"Simple Text \ud83d\udcacED",
|
||||||
|
"TIPO Script \ud83d\udcacED",
|
||||||
"Ultimate SD Upscale \ud83d\udcacED",
|
"Ultimate SD Upscale \ud83d\udcacED",
|
||||||
"Wildcard Encode \ud83d\udcacED"
|
"Wildcard Encode \ud83d\udcacED"
|
||||||
],
|
],
|
||||||
@@ -7555,6 +7562,14 @@
|
|||||||
"title_aux": "ComfyUI-LexTools"
|
"title_aux": "ComfyUI-LexTools"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/SS-snap/ComfyUI-LBW_flux": [
|
||||||
|
[
|
||||||
|
"LoraBlockWeight_Flux"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-LBW_flux"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/SS-snap/ComfyUI-Snap_Processing": [
|
"https://github.com/SS-snap/ComfyUI-Snap_Processing": [
|
||||||
[
|
[
|
||||||
"AreaCalculator",
|
"AreaCalculator",
|
||||||
@@ -8532,6 +8547,7 @@
|
|||||||
"SDVN Easy IPAdapter weight",
|
"SDVN Easy IPAdapter weight",
|
||||||
"SDVN Exif check",
|
"SDVN Exif check",
|
||||||
"SDVN Filter List",
|
"SDVN Filter List",
|
||||||
|
"SDVN Flip Image",
|
||||||
"SDVN Google Imagen",
|
"SDVN Google Imagen",
|
||||||
"SDVN IC-Light v2",
|
"SDVN IC-Light v2",
|
||||||
"SDVN Image Adjust",
|
"SDVN Image Adjust",
|
||||||
@@ -9673,6 +9689,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Visionatrix/ComfyUI-Visionatrix": [
|
"https://github.com/Visionatrix/ComfyUI-Visionatrix": [
|
||||||
[
|
[
|
||||||
|
"StyleAlignedBatchAlign",
|
||||||
"VixCheckboxLogic",
|
"VixCheckboxLogic",
|
||||||
"VixDynamicLoraDefinition",
|
"VixDynamicLoraDefinition",
|
||||||
"VixUiAspectRatioSelector",
|
"VixUiAspectRatioSelector",
|
||||||
@@ -10307,6 +10324,7 @@
|
|||||||
"ConvertRasterToVectorBW",
|
"ConvertRasterToVectorBW",
|
||||||
"ConvertRasterToVectorColor",
|
"ConvertRasterToVectorColor",
|
||||||
"ConvertVectorToRaster",
|
"ConvertVectorToRaster",
|
||||||
|
"SVGPreview",
|
||||||
"SaveSVG"
|
"SaveSVG"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -11349,6 +11367,7 @@
|
|||||||
"Noise from Palette [Dream]",
|
"Noise from Palette [Dream]",
|
||||||
"Palette Color Align [Dream]",
|
"Palette Color Align [Dream]",
|
||||||
"Palette Color Shift [Dream]",
|
"Palette Color Shift [Dream]",
|
||||||
|
"Random Prompt Words [Dream]",
|
||||||
"Sample Image Area as Palette [Dream]",
|
"Sample Image Area as Palette [Dream]",
|
||||||
"Sample Image as Palette [Dream]",
|
"Sample Image as Palette [Dream]",
|
||||||
"Saw Curve [Dream]",
|
"Saw Curve [Dream]",
|
||||||
@@ -11464,6 +11483,7 @@
|
|||||||
"https://github.com/arcum42/ComfyUI_SageUtils": [
|
"https://github.com/arcum42/ComfyUI_SageUtils": [
|
||||||
[
|
[
|
||||||
"Sage_AdvSamplerInfo",
|
"Sage_AdvSamplerInfo",
|
||||||
|
"Sage_CLIPTextEncodeLumina2",
|
||||||
"Sage_CacheMaintenance",
|
"Sage_CacheMaintenance",
|
||||||
"Sage_CheckpointLoaderRecent",
|
"Sage_CheckpointLoaderRecent",
|
||||||
"Sage_CheckpointLoaderSimple",
|
"Sage_CheckpointLoaderSimple",
|
||||||
@@ -11475,6 +11495,7 @@
|
|||||||
"Sage_ConstructMetadata",
|
"Sage_ConstructMetadata",
|
||||||
"Sage_ConstructMetadataLite",
|
"Sage_ConstructMetadataLite",
|
||||||
"Sage_DualCLIPTextEncode",
|
"Sage_DualCLIPTextEncode",
|
||||||
|
"Sage_DualCLIPTextEncodeLumina2",
|
||||||
"Sage_EmptyLatentImagePassthrough",
|
"Sage_EmptyLatentImagePassthrough",
|
||||||
"Sage_GetFileHash",
|
"Sage_GetFileHash",
|
||||||
"Sage_JoinText",
|
"Sage_JoinText",
|
||||||
@@ -11640,6 +11661,18 @@
|
|||||||
"title_aux": "Save Image Extended for ComfyUI"
|
"title_aux": "Save Image Extended for ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/austinbrown34/ComfyUI-IO-Helpers": [
|
||||||
|
[
|
||||||
|
"EncodedPromptFromFile",
|
||||||
|
"EncodedPromptToFile",
|
||||||
|
"IO_LoadImage",
|
||||||
|
"SampledLatentsFromFile",
|
||||||
|
"SampledLatentsToFile"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-IO-Helpers"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/avatechai/avatar-graph-comfyui": [
|
"https://github.com/avatechai/avatar-graph-comfyui": [
|
||||||
[
|
[
|
||||||
"ApplyMeshTransformAsShapeKey",
|
"ApplyMeshTransformAsShapeKey",
|
||||||
@@ -11792,6 +11825,7 @@
|
|||||||
"SP_HiresGen_HiresCfg",
|
"SP_HiresGen_HiresCfg",
|
||||||
"SP_HiresGen_Sharpen",
|
"SP_HiresGen_Sharpen",
|
||||||
"SP_HunyuanLoader",
|
"SP_HunyuanLoader",
|
||||||
|
"SP_ImpactSwitchCombo",
|
||||||
"SP_KSampler",
|
"SP_KSampler",
|
||||||
"SP_KSamplerSelect",
|
"SP_KSamplerSelect",
|
||||||
"SP_KoboldCpp",
|
"SP_KoboldCpp",
|
||||||
@@ -12580,6 +12614,7 @@
|
|||||||
[
|
[
|
||||||
"ClipLoaderGGUF",
|
"ClipLoaderGGUF",
|
||||||
"DualClipLoaderGGUF",
|
"DualClipLoaderGGUF",
|
||||||
|
"GGUFRun",
|
||||||
"GGUFSave",
|
"GGUFSave",
|
||||||
"GGUFUndo",
|
"GGUFUndo",
|
||||||
"LoaderGGUF",
|
"LoaderGGUF",
|
||||||
@@ -13416,6 +13451,7 @@
|
|||||||
"LayerUtility: NumberCalculatorV2",
|
"LayerUtility: NumberCalculatorV2",
|
||||||
"LayerUtility: PrintInfo",
|
"LayerUtility: PrintInfo",
|
||||||
"LayerUtility: PurgeVRAM",
|
"LayerUtility: PurgeVRAM",
|
||||||
|
"LayerUtility: PurgeVRAM V2",
|
||||||
"LayerUtility: QueueStop",
|
"LayerUtility: QueueStop",
|
||||||
"LayerUtility: RGB Value",
|
"LayerUtility: RGB Value",
|
||||||
"LayerUtility: RandomGenerator",
|
"LayerUtility: RandomGenerator",
|
||||||
@@ -13477,6 +13513,7 @@
|
|||||||
"LayerMask: TransparentBackgroundUltra",
|
"LayerMask: TransparentBackgroundUltra",
|
||||||
"LayerMask: YoloV8Detect",
|
"LayerMask: YoloV8Detect",
|
||||||
"LayerUtility: AddBlindWaterMark",
|
"LayerUtility: AddBlindWaterMark",
|
||||||
|
"LayerUtility: Collage",
|
||||||
"LayerUtility: CreateQRCode",
|
"LayerUtility: CreateQRCode",
|
||||||
"LayerUtility: DecodeQRCode",
|
"LayerUtility: DecodeQRCode",
|
||||||
"LayerUtility: DeepSeekAPI",
|
"LayerUtility: DeepSeekAPI",
|
||||||
@@ -14108,6 +14145,7 @@
|
|||||||
"Mahiro",
|
"Mahiro",
|
||||||
"MaskComposite",
|
"MaskComposite",
|
||||||
"MaskToImage",
|
"MaskToImage",
|
||||||
|
"ModelComputeDtype",
|
||||||
"ModelMergeAdd",
|
"ModelMergeAdd",
|
||||||
"ModelMergeAuraflow",
|
"ModelMergeAuraflow",
|
||||||
"ModelMergeBlocks",
|
"ModelMergeBlocks",
|
||||||
@@ -14876,6 +14914,14 @@
|
|||||||
"title_aux": "ComfyUI-LoadFiles"
|
"title_aux": "ComfyUI-LoadFiles"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/dasilva333/ComfyUI_ContrastingColor": [
|
||||||
|
[
|
||||||
|
"ContrastingComplementaryColor|pysssss"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_ContrastingColor"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/dave-palt/comfyui_DSP_imagehelpers": [
|
"https://github.com/dave-palt/comfyui_DSP_imagehelpers": [
|
||||||
[
|
[
|
||||||
"dsp-imagehelpers-concat"
|
"dsp-imagehelpers-concat"
|
||||||
@@ -15005,6 +15051,9 @@
|
|||||||
"DavchaCLIPTextEncode",
|
"DavchaCLIPTextEncode",
|
||||||
"DavchaConditioningConcat",
|
"DavchaConditioningConcat",
|
||||||
"DavchaEmptyLatentImage",
|
"DavchaEmptyLatentImage",
|
||||||
|
"DavchaLLM",
|
||||||
|
"DavchaLLMAdvanced",
|
||||||
|
"DavchaLoadLLM",
|
||||||
"DavchaLoadVideo",
|
"DavchaLoadVideo",
|
||||||
"DavchaMaskImage",
|
"DavchaMaskImage",
|
||||||
"DavchaModelMergeSD1",
|
"DavchaModelMergeSD1",
|
||||||
@@ -15404,9 +15453,12 @@
|
|||||||
"Qwen2AudioInstruct",
|
"Qwen2AudioInstruct",
|
||||||
"StringToDict",
|
"StringToDict",
|
||||||
"SwitchDuo",
|
"SwitchDuo",
|
||||||
|
"TextBoxStyle",
|
||||||
"TextLineSelect",
|
"TextLineSelect",
|
||||||
"TextLinesToList",
|
"TextLinesToList",
|
||||||
"TextPlusPlus"
|
"TextMargins",
|
||||||
|
"TextPlusPlus",
|
||||||
|
"TextShadow"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-dreambait-nodes"
|
"title_aux": "comfyui-dreambait-nodes"
|
||||||
@@ -16608,14 +16660,6 @@
|
|||||||
"title_aux": "String Converter"
|
"title_aux": "String Converter"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/gmorks/ComfyUI-Animagine-Prompt": [
|
|
||||||
[
|
|
||||||
"AnimaginePrompt"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI Animagine prompt"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/gmorks/ComfyUI-SendToDiscord": [
|
"https://github.com/gmorks/ComfyUI-SendToDiscord": [
|
||||||
[
|
[
|
||||||
"PreviewImageWithDiscord"
|
"PreviewImageWithDiscord"
|
||||||
@@ -17162,21 +17206,6 @@
|
|||||||
"title_aux": "ComfyUI-ToolBox"
|
"title_aux": "ComfyUI-ToolBox"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/hdfhssg/ComfyUI_pxtool": [
|
|
||||||
[
|
|
||||||
"CivitaiHelper",
|
|
||||||
"DanbooruCharacterTag",
|
|
||||||
"E621CharacterTag",
|
|
||||||
"NegativeTag",
|
|
||||||
"QualityTag",
|
|
||||||
"RandomArtists",
|
|
||||||
"RandomArtistsAdvanced",
|
|
||||||
"RandomTag"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI_pxtool"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/heshengtao/comfyui_LLM_party": [
|
"https://github.com/heshengtao/comfyui_LLM_party": [
|
||||||
[
|
[
|
||||||
"About_us",
|
"About_us",
|
||||||
@@ -17418,6 +17447,7 @@
|
|||||||
"WWAA_GBCamera",
|
"WWAA_GBCamera",
|
||||||
"WWAA_ImageLoader",
|
"WWAA_ImageLoader",
|
||||||
"WWAA_ImageToTextFile",
|
"WWAA_ImageToTextFile",
|
||||||
|
"WWAA_NestedLoopCounter",
|
||||||
"WWAA_PromptWriter"
|
"WWAA_PromptWriter"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -17538,12 +17568,11 @@
|
|||||||
"BiRefNet",
|
"BiRefNet",
|
||||||
"ControlImagePreprocessor",
|
"ControlImagePreprocessor",
|
||||||
"ControlNetModelLoader",
|
"ControlNetModelLoader",
|
||||||
|
"DiffusersMVModelMakeup",
|
||||||
|
"DiffusersMVPipelineLoader",
|
||||||
"DiffusersMVSampler",
|
"DiffusersMVSampler",
|
||||||
"DiffusersModelMakeup",
|
"DiffusersMVSchedulerLoader",
|
||||||
"DiffusersPipelineLoader",
|
"DiffusersMVVaeLoader",
|
||||||
"DiffusersSampler",
|
|
||||||
"DiffusersSchedulerLoader",
|
|
||||||
"DiffusersVaeLoader",
|
|
||||||
"ImagePreprocessor",
|
"ImagePreprocessor",
|
||||||
"LdmPipelineLoader",
|
"LdmPipelineLoader",
|
||||||
"LdmVaeLoader",
|
"LdmVaeLoader",
|
||||||
@@ -17861,7 +17890,8 @@
|
|||||||
[
|
[
|
||||||
"PROMPT_ENHANCER",
|
"PROMPT_ENHANCER",
|
||||||
"PROMPT_ENHANCER_CHAIN_CONTROL",
|
"PROMPT_ENHANCER_CHAIN_CONTROL",
|
||||||
"PROMPT_ENHANCER_CHAIN_RANDOM"
|
"PROMPT_ENHANCER_CHAIN_RANDOM",
|
||||||
|
"PROMPT_ENHANCER_REPROMPT"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-prompt-enhancer"
|
"title_aux": "comfyui-prompt-enhancer"
|
||||||
@@ -18876,6 +18906,15 @@
|
|||||||
"title_aux": "ComfyUI LayerDivider"
|
"title_aux": "ComfyUI LayerDivider"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/juehackr/comfyui_fk_server": [
|
||||||
|
[
|
||||||
|
"FK_Node",
|
||||||
|
"FK_ShowBaseNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui_fk_server"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": [
|
"https://github.com/jurdnisglobby/ComfyUI-Jurdns-Groq-Node": [
|
||||||
[
|
[
|
||||||
"JurdnsGroqAPIPromptEnhancer"
|
"JurdnsGroqAPIPromptEnhancer"
|
||||||
@@ -19679,6 +19718,7 @@
|
|||||||
"InjectNoiseToLatent",
|
"InjectNoiseToLatent",
|
||||||
"InsertImageBatchByIndexes",
|
"InsertImageBatchByIndexes",
|
||||||
"InsertImagesToBatchIndexed",
|
"InsertImagesToBatchIndexed",
|
||||||
|
"InsertLatentToIndexed",
|
||||||
"InterpolateCoords",
|
"InterpolateCoords",
|
||||||
"Intrinsic_lora_sampling",
|
"Intrinsic_lora_sampling",
|
||||||
"JoinStringMulti",
|
"JoinStringMulti",
|
||||||
@@ -19710,6 +19750,7 @@
|
|||||||
"SV3D_BatchSchedule",
|
"SV3D_BatchSchedule",
|
||||||
"SaveImageKJ",
|
"SaveImageKJ",
|
||||||
"SaveImageWithAlpha",
|
"SaveImageWithAlpha",
|
||||||
|
"SaveStringKJ",
|
||||||
"ScaleBatchPromptSchedule",
|
"ScaleBatchPromptSchedule",
|
||||||
"Screencap_mss",
|
"Screencap_mss",
|
||||||
"SeparateMasks",
|
"SeparateMasks",
|
||||||
@@ -19732,6 +19773,7 @@
|
|||||||
"TorchCompileCosmosModel",
|
"TorchCompileCosmosModel",
|
||||||
"TorchCompileLTXModel",
|
"TorchCompileLTXModel",
|
||||||
"TorchCompileModelFluxAdvanced",
|
"TorchCompileModelFluxAdvanced",
|
||||||
|
"TorchCompileModelHyVideo",
|
||||||
"TorchCompileVAE",
|
"TorchCompileVAE",
|
||||||
"TransitionImagesInBatch",
|
"TransitionImagesInBatch",
|
||||||
"TransitionImagesMulti",
|
"TransitionImagesMulti",
|
||||||
@@ -21727,6 +21769,16 @@
|
|||||||
"title_aux": "ComfyUI-CatvtonFluxWrapper"
|
"title_aux": "ComfyUI-CatvtonFluxWrapper"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/lum3on/comfyui_LLM_Polymath": [
|
||||||
|
[
|
||||||
|
"polymath_SaveAbsolute",
|
||||||
|
"polymath_chat",
|
||||||
|
"polymath_scraper"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "LLM Polymath Chat Node"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/lumalabs/ComfyUI-LumaAI-API": [
|
"https://github.com/lumalabs/ComfyUI-LumaAI-API": [
|
||||||
[
|
[
|
||||||
"CharacterReference",
|
"CharacterReference",
|
||||||
@@ -22465,6 +22517,15 @@
|
|||||||
"title_aux": "Preset Dimensions"
|
"title_aux": "Preset Dimensions"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/moon7star9/ComfyUI_BiRefNet_Universal": [
|
||||||
|
[
|
||||||
|
"BiRefNet_Loader",
|
||||||
|
"BiRefNet_Remove_Background"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_BiRefNet_Universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/morino-kumasan/comfyui-toml-prompt": [
|
"https://github.com/morino-kumasan/comfyui-toml-prompt": [
|
||||||
[
|
[
|
||||||
"IntSelector",
|
"IntSelector",
|
||||||
@@ -23240,6 +23301,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/olduvai-jp/ComfyUI-HfLoader": [
|
"https://github.com/olduvai-jp/ComfyUI-HfLoader": [
|
||||||
[
|
[
|
||||||
|
"ControlNet Loader From HF",
|
||||||
"Lora Loader From HF"
|
"Lora Loader From HF"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -24486,22 +24548,26 @@
|
|||||||
"https://github.com/ryanontheinside/ComfyUI_RealtimeNodes": [
|
"https://github.com/ryanontheinside/ComfyUI_RealtimeNodes": [
|
||||||
[
|
[
|
||||||
"DTypeConverter",
|
"DTypeConverter",
|
||||||
"DeltaControl",
|
|
||||||
"FPSMonitor",
|
"FPSMonitor",
|
||||||
"FastWebcamCapture",
|
"FastWebcamCapture",
|
||||||
"FloatControl",
|
"FloatControl",
|
||||||
"FloatSequence",
|
"FloatSequence",
|
||||||
|
"HandMaskNode",
|
||||||
|
"HandTrackingNode",
|
||||||
"IntControl",
|
"IntControl",
|
||||||
"IntSequence",
|
"IntSequence",
|
||||||
"IntegerMotionController",
|
"IntegerMotionController",
|
||||||
"IntervalControl",
|
|
||||||
"LazyCondition",
|
"LazyCondition",
|
||||||
"LoadImageFromPath_",
|
"LoadImageFromPath_",
|
||||||
"MotionController",
|
"MotionController",
|
||||||
"MultilineText",
|
"MultilineText",
|
||||||
"QuickShapeMask",
|
"QuickShapeMask",
|
||||||
"ROINode",
|
"ROINode",
|
||||||
|
"RepulsiveMaskNode",
|
||||||
|
"ResizeMaskNode",
|
||||||
"SimilarityFilter",
|
"SimilarityFilter",
|
||||||
|
"StateResetNode",
|
||||||
|
"StateTestNode",
|
||||||
"StringControl",
|
"StringControl",
|
||||||
"StringSequence",
|
"StringSequence",
|
||||||
"TextRenderer",
|
"TextRenderer",
|
||||||
@@ -24730,6 +24796,7 @@
|
|||||||
"FlipStreamSwitchLatent",
|
"FlipStreamSwitchLatent",
|
||||||
"FlipStreamTextBox",
|
"FlipStreamTextBox",
|
||||||
"FlipStreamTextReplace",
|
"FlipStreamTextReplace",
|
||||||
|
"FlipStreamVideoInput",
|
||||||
"FlipStreamViewer"
|
"FlipStreamViewer"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -25328,7 +25395,9 @@
|
|||||||
"SmartFormatString",
|
"SmartFormatString",
|
||||||
"SmartFormatString10",
|
"SmartFormatString10",
|
||||||
"SmartHVLoraSelect",
|
"SmartHVLoraSelect",
|
||||||
"SmartHVLoraStack"
|
"SmartHVLoraStack",
|
||||||
|
"SmartRemoveComments",
|
||||||
|
"SmartSaveText"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI Smart Helper Nodes"
|
"title_aux": "ComfyUI Smart Helper Nodes"
|
||||||
@@ -26397,6 +26466,20 @@
|
|||||||
"title_aux": "ComfyUI-Helper-Nodes"
|
"title_aux": "ComfyUI-Helper-Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/thanhduong0213929/ComfyUI-DeepUnlock": [
|
||||||
|
[
|
||||||
|
"DeepFuze Save",
|
||||||
|
"DeepFuzeAdavance",
|
||||||
|
"DeepFuzeFaceSwap",
|
||||||
|
"DeepfuzePreview",
|
||||||
|
"LLM_node",
|
||||||
|
"PlayBackAudio",
|
||||||
|
"TTS_generation"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-DeepUnlock"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/theAdamColton/ComfyUI-texflow-extension": [
|
"https://github.com/theAdamColton/ComfyUI-texflow-extension": [
|
||||||
[
|
[
|
||||||
"Load Texflow Depth Image",
|
"Load Texflow Depth Image",
|
||||||
@@ -27358,6 +27441,14 @@
|
|||||||
"title_aux": "zsq_prompt"
|
"title_aux": "zsq_prompt"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex": [
|
||||||
|
[
|
||||||
|
"StringFromList"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-SelectStringFromListWithIndex"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/wjl0313/ComfyUI_KimNodes": [
|
"https://github.com/wjl0313/ComfyUI_KimNodes": [
|
||||||
[
|
[
|
||||||
"Add_ImageMetadata",
|
"Add_ImageMetadata",
|
||||||
@@ -27866,7 +27957,9 @@
|
|||||||
"MaskSmartValleySplit",
|
"MaskSmartValleySplit",
|
||||||
"MaskSplitFilter",
|
"MaskSplitFilter",
|
||||||
"MaskTopNFilter",
|
"MaskTopNFilter",
|
||||||
"TextBeforeKeyword"
|
"TextBeforeKeyword",
|
||||||
|
"YC Extract Number",
|
||||||
|
"YC Text Index Switch"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-YCNodes"
|
"title_aux": "ComfyUI-YCNodes"
|
||||||
@@ -28504,6 +28597,7 @@
|
|||||||
"https://github.com/zentrocdot/ComfyUI-Simple_Image_To_Prompt": [
|
"https://github.com/zentrocdot/ComfyUI-Simple_Image_To_Prompt": [
|
||||||
[
|
[
|
||||||
"\ud83d\udc41\ufe0f Image To Prompt",
|
"\ud83d\udc41\ufe0f Image To Prompt",
|
||||||
|
"\ud83d\udc41\ufe0f Image To Prompt (NO UPDATE)",
|
||||||
"\ud83e\uddf3 Show Data"
|
"\ud83e\uddf3 Show Data"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -291,6 +291,16 @@
|
|||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Example of using ComfyUI Toolbar to Toggle ComfyUI links on/off"
|
"description": "Example of using ComfyUI Toolbar to Toggle ComfyUI links on/off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "xhiroga",
|
||||||
|
"title": "ComfyUI-TypeScript-CustomNode",
|
||||||
|
"reference": "https://github.com/xhiroga/ComfyUI-TypeScript-CustomNode",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/xhiroga/ComfyUI-TypeScript-CustomNode"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This project is generated from xhiroga/ComfyUI-TypeScript-CustomNode"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -421,29 +421,33 @@ except Exception as e:
|
|||||||
print(f"[ComfyUI-Manager] Logging failed: {e}")
|
print(f"[ComfyUI-Manager] Logging failed: {e}")
|
||||||
|
|
||||||
|
|
||||||
try:
|
def ensure_dependencies():
|
||||||
import git # noqa: F401
|
|
||||||
import toml # noqa: F401
|
|
||||||
import rich # noqa: F401
|
|
||||||
except ModuleNotFoundError:
|
|
||||||
my_path = os.path.dirname(__file__)
|
|
||||||
requirements_path = os.path.join(my_path, "requirements.txt")
|
|
||||||
|
|
||||||
print("## ComfyUI-Manager: installing dependencies. (GitPython)")
|
|
||||||
try:
|
try:
|
||||||
result = subprocess.check_output(manager_util.make_pip_cmd(['install', '-r', requirements_path]))
|
import git # noqa: F401
|
||||||
except subprocess.CalledProcessError:
|
import toml # noqa: F401
|
||||||
print("## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.")
|
import rich # noqa: F401
|
||||||
try:
|
import chardet # noqa: F401
|
||||||
result = subprocess.check_output(manager_util.make_pip_cmd(['install', '--user', '-r', requirements_path]))
|
except ModuleNotFoundError:
|
||||||
except subprocess.CalledProcessError:
|
my_path = os.path.dirname(__file__)
|
||||||
print("## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)")
|
requirements_path = os.path.join(my_path, "requirements.txt")
|
||||||
|
|
||||||
try:
|
print("## ComfyUI-Manager: installing dependencies. (GitPython)")
|
||||||
print("## ComfyUI-Manager: installing dependencies done.")
|
try:
|
||||||
except:
|
result = subprocess.check_output(manager_util.make_pip_cmd(['install', '-r', requirements_path]))
|
||||||
# maybe we should sys.exit() here? there is at least two screens worth of error messages still being pumped after our error messages
|
except subprocess.CalledProcessError:
|
||||||
print("## [ERROR] ComfyUI-Manager: GitPython package seems to be installed, but failed to load somehow. Make sure you have a working git client installed")
|
print("## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.")
|
||||||
|
try:
|
||||||
|
result = subprocess.check_output(manager_util.make_pip_cmd(['install', '--user', '-r', requirements_path]))
|
||||||
|
except subprocess.CalledProcessError:
|
||||||
|
print("## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)")
|
||||||
|
|
||||||
|
try:
|
||||||
|
print("## ComfyUI-Manager: installing dependencies done.")
|
||||||
|
except:
|
||||||
|
# maybe we should sys.exit() here? there is at least two screens worth of error messages still being pumped after our error messages
|
||||||
|
print("## [ERROR] ComfyUI-Manager: GitPython package seems to be installed, but failed to load somehow. Make sure you have a working git client installed")
|
||||||
|
|
||||||
|
ensure_dependencies()
|
||||||
|
|
||||||
|
|
||||||
print("** ComfyUI startup time:", current_timestamp())
|
print("** ComfyUI startup time:", current_timestamp())
|
||||||
@@ -598,17 +602,18 @@ def execute_lazy_install_script(repo_path, executable):
|
|||||||
|
|
||||||
if os.path.exists(requirements_path):
|
if os.path.exists(requirements_path):
|
||||||
print(f"Install: pip packages for '{repo_path}'")
|
print(f"Install: pip packages for '{repo_path}'")
|
||||||
with open(requirements_path, "r") as requirements_file:
|
|
||||||
for line in requirements_file:
|
|
||||||
package_name = remap_pip_package(line.strip())
|
|
||||||
if package_name and not is_installed(package_name):
|
|
||||||
if '--index-url' in package_name:
|
|
||||||
s = package_name.split('--index-url')
|
|
||||||
install_cmd = manager_util.make_pip_cmd(["install", s[0].strip(), '--index-url', s[1].strip()])
|
|
||||||
else:
|
|
||||||
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
|
||||||
|
|
||||||
process_wrap(install_cmd, repo_path)
|
lines = manager_util.robust_readlines(requirements_path)
|
||||||
|
for line in lines:
|
||||||
|
package_name = remap_pip_package(line.strip())
|
||||||
|
if package_name and not is_installed(package_name):
|
||||||
|
if '--index-url' in package_name:
|
||||||
|
s = package_name.split('--index-url')
|
||||||
|
install_cmd = manager_util.make_pip_cmd(["install", s[0].strip(), '--index-url', s[1].strip()])
|
||||||
|
else:
|
||||||
|
install_cmd = manager_util.make_pip_cmd(["install", package_name])
|
||||||
|
|
||||||
|
process_wrap(install_cmd, repo_path)
|
||||||
|
|
||||||
if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install:
|
if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install:
|
||||||
processed_install.add(f'{repo_path}/install.py')
|
processed_install.add(f'{repo_path}/install.py')
|
||||||
@@ -679,6 +684,7 @@ def execute_migration(moves):
|
|||||||
shutil.move(x[0], x[1])
|
shutil.move(x[0], x[1])
|
||||||
print(f"[ComfyUI-Manager] MIGRATION: '{x[0]}' -> '{x[1]}'")
|
print(f"[ComfyUI-Manager] MIGRATION: '{x[0]}' -> '{x[1]}'")
|
||||||
|
|
||||||
|
script_executed = False
|
||||||
|
|
||||||
# Check if script_list_path exists
|
# Check if script_list_path exists
|
||||||
if os.path.exists(script_list_path):
|
if os.path.exists(script_list_path):
|
||||||
@@ -733,6 +739,7 @@ if os.path.exists(script_list_path):
|
|||||||
|
|
||||||
# Remove the script_list_path file
|
# Remove the script_list_path file
|
||||||
if os.path.exists(script_list_path):
|
if os.path.exists(script_list_path):
|
||||||
|
script_executed = True
|
||||||
os.remove(script_list_path)
|
os.remove(script_list_path)
|
||||||
|
|
||||||
print("\n[ComfyUI-Manager] Startup script completed.")
|
print("\n[ComfyUI-Manager] Startup script completed.")
|
||||||
@@ -744,6 +751,29 @@ del processed_install
|
|||||||
del pip_fixer
|
del pip_fixer
|
||||||
manager_util.clear_pip_cache()
|
manager_util.clear_pip_cache()
|
||||||
|
|
||||||
|
if script_executed:
|
||||||
|
# Restart
|
||||||
|
print("[ComfyUI-Manager] Restarting to reapply dependency installation.")
|
||||||
|
|
||||||
|
if '__COMFY_CLI_SESSION__' in os.environ:
|
||||||
|
with open(os.path.join(os.environ['__COMFY_CLI_SESSION__'] + '.reboot'), 'w'):
|
||||||
|
pass
|
||||||
|
|
||||||
|
print("--------------------------------------------------------------------------\n")
|
||||||
|
exit(0)
|
||||||
|
else:
|
||||||
|
sys_argv = sys.argv.copy()
|
||||||
|
|
||||||
|
if sys.platform.startswith('win32'):
|
||||||
|
cmds = ['"' + sys.executable + '"', '"' + sys_argv[0] + '"'] + sys_argv[1:]
|
||||||
|
else:
|
||||||
|
cmds = [sys.executable] + sys_argv
|
||||||
|
|
||||||
|
print(f"Command: {cmds}", flush=True)
|
||||||
|
print("--------------------------------------------------------------------------\n")
|
||||||
|
|
||||||
|
os.execv(sys.executable, cmds)
|
||||||
|
|
||||||
|
|
||||||
def check_windows_event_loop_policy():
|
def check_windows_event_loop_policy():
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "comfyui-manager"
|
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."
|
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||||
version = "3.19"
|
version = "3.22"
|
||||||
license = { file = "LICENSE.txt" }
|
license = { file = "LICENSE.txt" }
|
||||||
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]
|
||||||
|
|
||||||
|
|||||||
@@ -8,3 +8,4 @@ rich
|
|||||||
typing-extensions
|
typing-extensions
|
||||||
toml
|
toml
|
||||||
uv
|
uv
|
||||||
|
chardet
|
||||||
|
|||||||
Reference in New Issue
Block a user