mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-02-22 11:57:37 +08:00
Compare commits
47 Commits
cceac927bb
...
ed1485cd7d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed1485cd7d | ||
|
|
de64af4a68 | ||
|
|
4a852ac8a8 | ||
|
|
6784bfb98c | ||
|
|
c8f246d344 | ||
|
|
8b3d31a936 | ||
|
|
5e88d6445b | ||
|
|
fd7dff88df | ||
|
|
8cfee1f483 | ||
|
|
cf4d8e6125 | ||
|
|
c0e8a41d2a | ||
|
|
a02c27b1af | ||
|
|
712e1bac0d | ||
|
|
513ea46cbe | ||
|
|
b1919b6f95 | ||
|
|
43561d209b | ||
|
|
16dcbc5412 | ||
|
|
c8dd2d5cad | ||
|
|
4b37777066 | ||
|
|
95ecd85a12 | ||
|
|
5c475e3c15 | ||
|
|
f705ee6863 | ||
|
|
1f67c18989 | ||
|
|
de6d451c5b | ||
|
|
580296d6f3 | ||
|
|
a9e28fbce3 | ||
|
|
311779cb20 | ||
|
|
d2f8a89e87 | ||
|
|
84c95bf322 | ||
|
|
f75c801955 | ||
|
|
faa2f54371 | ||
|
|
4249ac193a | ||
|
|
c709274a28 | ||
|
|
c8f05e79db | ||
|
|
4d2887e99f | ||
|
|
29256a5154 | ||
|
|
82d42e4094 | ||
|
|
53850fb627 | ||
|
|
34b4c8ce46 | ||
|
|
e944841054 | ||
|
|
f6a5ff5552 | ||
|
|
01763b59d4 | ||
|
|
044173b2a1 | ||
|
|
99e7a88dbd | ||
|
|
01cd9fbb0e | ||
|
|
aaed1dc3d5 | ||
|
|
e7d4ea76d7 |
32
README.md
32
README.md
@ -5,6 +5,7 @@
|
|||||||

|

|
||||||
|
|
||||||
## NOTICE
|
## NOTICE
|
||||||
|
* V3.38: **Security patch** - Manager data migrated to protected path. See [Migration Guide](docs/en/v3.38-userdata-security-migration.md).
|
||||||
* V3.16: Support for `uv` has been added. Set `use_uv` in `config.ini`.
|
* V3.16: Support for `uv` has been added. Set `use_uv` in `config.ini`.
|
||||||
* V3.10: `double-click feature` is removed
|
* V3.10: `double-click feature` is removed
|
||||||
* This feature has been moved to https://github.com/ltdrdata/comfyui-connection-helper
|
* This feature has been moved to https://github.com/ltdrdata/comfyui-connection-helper
|
||||||
@ -140,20 +141,27 @@ This repository provides Colab notebooks that allow you to install and use Comfy
|
|||||||
|
|
||||||
|
|
||||||
## Paths
|
## Paths
|
||||||
In `ComfyUI-Manager` V3.0 and later, configuration files and dynamically generated files are located under `<USER_DIRECTORY>/default/ComfyUI-Manager/`.
|
Starting from V3.38, Manager uses a protected system path for enhanced security.
|
||||||
|
|
||||||
* <USER_DIRECTORY>
|
* <USER_DIRECTORY>
|
||||||
* If executed without any options, the path defaults to ComfyUI/user.
|
* If executed without any options, the path defaults to ComfyUI/user.
|
||||||
* It can be set using --user-directory <USER_DIRECTORY>.
|
* It can be set using --user-directory <USER_DIRECTORY>.
|
||||||
|
|
||||||
* Basic config files: `<USER_DIRECTORY>/default/ComfyUI-Manager/config.ini`
|
| ComfyUI Version | Manager Path |
|
||||||
* Configurable channel lists: `<USER_DIRECTORY>/default/ComfyUI-Manager/channels.ini`
|
|-----------------|--------------|
|
||||||
* Configurable pip overrides: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_overrides.json`
|
| v0.3.76+ (with System User API) | `<USER_DIRECTORY>/__manager/` |
|
||||||
* Configurable pip blacklist: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_blacklist.list`
|
| Older versions | `<USER_DIRECTORY>/default/ComfyUI-Manager/` |
|
||||||
* Configurable pip auto fix: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_auto_fix.list`
|
|
||||||
* Saved snapshot files: `<USER_DIRECTORY>/default/ComfyUI-Manager/snapshots`
|
* Basic config files: `config.ini`
|
||||||
* Startup script files: `<USER_DIRECTORY>/default/ComfyUI-Manager/startup-scripts`
|
* Configurable channel lists: `channels.list`
|
||||||
* Component files: `<USER_DIRECTORY>/default/ComfyUI-Manager/components`
|
* Configurable pip overrides: `pip_overrides.json`
|
||||||
|
* Configurable pip blacklist: `pip_blacklist.list`
|
||||||
|
* Configurable pip auto fix: `pip_auto_fix.list`
|
||||||
|
* Saved snapshot files: `snapshots/`
|
||||||
|
* Startup script files: `startup-scripts/`
|
||||||
|
* Component files: `components/`
|
||||||
|
|
||||||
|
> **Note**: See [Migration Guide](docs/en/v3.38-userdata-security-migration.md) for upgrade details.
|
||||||
|
|
||||||
|
|
||||||
## `extra_model_paths.yaml` Configuration
|
## `extra_model_paths.yaml` Configuration
|
||||||
|
|||||||
@ -8284,6 +8284,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Powerful ComfyUI custom node built on the FlashVSR model, facilitating real-time diffusion-based video super-resolution for streaming applications."
|
"description": "Powerful ComfyUI custom node built on the FlashVSR model, facilitating real-time diffusion-based video super-resolution for streaming applications."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "1038lab",
|
||||||
|
"title": "ComfyUI-QwenVL",
|
||||||
|
"reference": "https://github.com/1038lab/ComfyUI-QwenVL",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/1038lab/ComfyUI-QwenVL"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-QwenVL custom node: Integrates the Qwen-VL series, including Qwen2.5-VL and the latest Qwen3-VL, to enable advanced multimodal AI for text generation, image understanding, and video analysis."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Klinter",
|
"author": "Klinter",
|
||||||
"title": "Klinter_nodes",
|
"title": "Klinter_nodes",
|
||||||
@ -9785,16 +9795,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Load new workflow after mask editing."
|
"description": "Load new workflow after mask editing."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "shinich39",
|
|
||||||
"title": "comfyui-no-one-above-me",
|
|
||||||
"reference": "https://github.com/shinich39/comfyui-no-one-above-me",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/shinich39/comfyui-no-one-above-me"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Fix node to top."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "shinich39",
|
"author": "shinich39",
|
||||||
"title": "comfyui-break-workflow",
|
"title": "comfyui-break-workflow",
|
||||||
@ -11389,6 +11389,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "DyPE: Dynamic Position Extrapolation for Ultra High Resolution Diffusion ,you can use a wrapper node it in comfyUI"
|
"description": "DyPE: Dynamic Position Extrapolation for Ultra High Resolution Diffusion ,you can use a wrapper node it in comfyUI"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "smthemex",
|
||||||
|
"title": "ComfyUI_GRAG_Image_Editing",
|
||||||
|
"reference": "https://github.com/smthemex/ComfyUI_GRAG_Image_Editing",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/smthemex/ComfyUI_GRAG_Image_Editing"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "GRAG-Image-Editing : Group-Relative Attention Guidance for Image Editing,you can try it in comfyUI"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "choey",
|
"author": "choey",
|
||||||
"title": "Comfy-Topaz",
|
"title": "Comfy-Topaz",
|
||||||
@ -16834,6 +16844,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Unofficial diffusers integration of the official SDNQ pipeline to run in ComfyUI. (Description by CC)"
|
"description": "Unofficial diffusers integration of the official SDNQ pipeline to run in ComfyUI. (Description by CC)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "erosDiffusion",
|
||||||
|
"title": "ComfyUI-EulerDiscreteScheduler",
|
||||||
|
"reference": "https://github.com/erosDiffusion/ComfyUI-EulerDiscreteScheduler",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/erosDiffusion/ComfyUI-EulerDiscreteScheduler"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Noise Free images with Euler Discrete Scheduler in ComfyUI with Z-Image or other models"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Steudio",
|
"author": "Steudio",
|
||||||
"title": "ComfyUI Steudio",
|
"title": "ComfyUI Steudio",
|
||||||
@ -20238,6 +20258,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A node for ComfyUI that provides a convenient way of resizing or cropping an image for diffusion tasks."
|
"description": "A node for ComfyUI that provides a convenient way of resizing or cropping an image for diffusion tasks."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "SparknightLLC",
|
||||||
|
"title": "ComfyUI-LatentOrientation",
|
||||||
|
"reference": "https://github.com/SparknightLLC/ComfyUI-LatentOrientation",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/SparknightLLC/ComfyUI-LatentOrientation"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A simple node for ComfyUI that rotates or resizes the input latent to common orientations."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "lightricks",
|
"author": "lightricks",
|
||||||
"title": "ComfyUI-LTXVideo",
|
"title": "ComfyUI-LTXVideo",
|
||||||
@ -22960,6 +22990,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A super simple node that outputs common video resolutions as 2 integers for Hunyuan and others!"
|
"description": "A super simple node that outputs common video resolutions as 2 integers for Hunyuan and others!"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "HellerCommaA",
|
||||||
|
"title": "ComfyUI-ZImageLatent",
|
||||||
|
"reference": "https://github.com/HellerCommaA/ComfyUI-ZImageLatent",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/HellerCommaA/ComfyUI-ZImageLatent"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A super simple node that outputs official zimage resolutions as a latent"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "benjiyaya",
|
"author": "benjiyaya",
|
||||||
"title": "ComfyUI-KokoroTTS",
|
"title": "ComfyUI-KokoroTTS",
|
||||||
@ -23145,6 +23185,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Frontend extension that adds a sidebar for easy viewing of PNG file metadata."
|
"description": "Frontend extension that adds a sidebar for easy viewing of PNG file metadata."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "KLL535",
|
||||||
|
"title": "ComfyUI_Simple_Qwen3-VL-gguf",
|
||||||
|
"reference": "https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/KLL535/ComfyUI_Simple_Qwen3-VL-gguf"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Simple Qwen3-VL gguf LLM model loader"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "mango125",
|
"author": "mango125",
|
||||||
"title": "ComfyUI-Mango-Random",
|
"title": "ComfyUI-Mango-Random",
|
||||||
@ -24796,6 +24846,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A ComfyUI custom node that provides dynamic text substitution using wildcards and CSV files. Perfect for creating varied prompts with consistent relationships between terms."
|
"description": "A ComfyUI custom node that provides dynamic text substitution using wildcards and CSV files. Perfect for creating varied prompts with consistent relationships between terms."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "illuminatianon",
|
||||||
|
"title": "comfyui-lumi-tools",
|
||||||
|
"reference": "https://github.com/illuminatianon/comfyui-lumi-tools",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/illuminatianon/comfyui-lumi-tools"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI custom node pack by Lumi."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "finegrain",
|
"author": "finegrain",
|
||||||
"title": "comfyui-finegrain",
|
"title": "comfyui-finegrain",
|
||||||
@ -25964,6 +26024,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "volcengine comfyui api"
|
"description": "volcengine comfyui api"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "synthetai",
|
||||||
|
"title": "ComfyUI-JM-Gemini-API",
|
||||||
|
"reference": "https://github.com/synthetai/ComfyUI-JM-Gemini-API",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/synthetai/ComfyUI-JM-Gemini-API"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A custom node for ComfyUI that generates images using Google's Gemini API, supporting both text-to-image and image-to-image generation."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "chou18194766xx",
|
"author": "chou18194766xx",
|
||||||
"title": "comfyui-EncryptSave",
|
"title": "comfyui-EncryptSave",
|
||||||
@ -30418,6 +30488,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI node for Flux Kontext Pro and Max models from Replicate"
|
"description": "ComfyUI node for Flux Kontext Pro and Max models from Replicate"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "Aryan185",
|
||||||
|
"title": "ComfyUI-VertexAPI",
|
||||||
|
"reference": "https://github.com/Aryan185/ComfyUI-VertexAPI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Aryan185/ComfyUI-VertexAPI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of powerful custom nodes for ComfyUI that connect your local workflows to closed-source AI models via their APIs, supporting Google Gemini, Imagen, Veo, OpenAI's GPT-Image-1, and FLUX models."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "iacoposk8",
|
"author": "iacoposk8",
|
||||||
"title": "ComfyUI Fooocus Inpaint Wrapper",
|
"title": "ComfyUI Fooocus Inpaint Wrapper",
|
||||||
@ -32506,6 +32586,17 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "High-utility nodes for ComfyUI with a focus on Flux 1 Dev workflows and Ultimate SD Upscale enhancement loops."
|
"description": "High-utility nodes for ComfyUI with a focus on Flux 1 Dev workflows and Ultimate SD Upscale enhancement loops."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "krakenunbound",
|
||||||
|
"title": "Kraken Discord Bot",
|
||||||
|
"id": "kraken-discord-bot",
|
||||||
|
"reference": "https://github.com/krakenunbound/kraken-discord-bot",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/krakenunbound/kraken-discord-bot"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "All-in-one Discord bot node for AI image generation. Simple setup - just add token, select model, and queue. Includes style presets, rate limiting, and queue management."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "joanna910225",
|
"author": "joanna910225",
|
||||||
"title": "HouseKeeper",
|
"title": "HouseKeeper",
|
||||||
@ -32859,6 +32950,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A comprehensive suite of custom nodes for building structured JSON prompts for FLUX.2 image generation with precision and control."
|
"description": "A comprehensive suite of custom nodes for building structured JSON prompts for FLUX.2 image generation with precision and control."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "MushroomFleet",
|
||||||
|
"title": "ComfyUI-Variationator",
|
||||||
|
"reference": "https://github.com/MushroomFleet/ComfyUI-Variationator",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MushroomFleet/ComfyUI-Variationator"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Advanced multi-dimensional prompt variation system for ComfyUI with 240 pre-defined modifiers and 19 custom nodes. (Description by CC)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Urabewe",
|
"author": "Urabewe",
|
||||||
"title": "ComfyUI Video Extend Counter",
|
"title": "ComfyUI Video Extend Counter",
|
||||||
@ -33594,6 +33695,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A ComfyUI custom node based on the Volcano Engine Doubao large model Seedream API, designed for high-quality image generation."
|
"description": "A ComfyUI custom node based on the Volcano Engine Doubao large model Seedream API, designed for high-quality image generation."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "dzy1128",
|
||||||
|
"title": "ComfyUI-VertexAI",
|
||||||
|
"reference": "https://github.com/dzy1128/ComfyUI-VertexAI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/dzy1128/ComfyUI-VertexAI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Google Gemini image generation node for ComfyUI supporting up to 6 input images with customizable prompts and parameters. (Description by CC)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "swfxliyiyu",
|
"author": "swfxliyiyu",
|
||||||
"title": "ComfyUI-FastVideo",
|
"title": "ComfyUI-FastVideo",
|
||||||
@ -33725,16 +33836,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A custom ComfyUI node for seamless image editing using fal.ai's NanoBanana and Seedream (v4) models. Edit images with AI-powered prompts, supporting multi-image batches, custom resolutions, and easy fal.ai API key integration directly in the node interface. "
|
"description": "A custom ComfyUI node for seamless image editing using fal.ai's NanoBanana and Seedream (v4) models. Edit images with AI-powered prompts, supporting multi-image batches, custom resolutions, and easy fal.ai API key integration directly in the node interface. "
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "comrender",
|
|
||||||
"title": "ComfyUI-gpt5_image_text",
|
|
||||||
"reference": "https://github.com/comrender/ComfyUI-gpt5_image_text",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/comrender/ComfyUI-gpt5_image_text"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A ComfyUI custom node for vision + text analysis using GPT-5 and GPT-4o with direct API key input, system prompt, temperature, max tokens, and multi-image support."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "comrender",
|
"author": "comrender",
|
||||||
"title": "ComfyUI-Topaz-Upscaler",
|
"title": "ComfyUI-Topaz-Upscaler",
|
||||||
@ -33745,26 +33846,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A custom node for ComfyUI that integrates the Topaz Labs API for AI-powered image upscaling and enhancement."
|
"description": "A custom node for ComfyUI that integrates the Topaz Labs API for AI-powered image upscaling and enhancement."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "comrender",
|
|
||||||
"title": "ComfyUI-Nano-Banana-Resizer",
|
|
||||||
"reference": "https://github.com/comrender/ComfyUI-Nano-Banana-Resizer",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/comrender/ComfyUI-Nano-Banana-Resizer"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A ComfyUI custom node that automatically calculates optimal output dimensions for Google's Nano Banana image editing model, supporting 22 aspect ratio buckets and ensuring pixel-perfect outputs without shifting or cropping."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "comrender",
|
|
||||||
"title": "ComfyUI-edge-match-checker",
|
|
||||||
"reference": "https://github.com/comrender/ComfyUI-edge-match-checker",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/comrender/ComfyUI-edge-match-checker"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Node comparing two image masks or images with adjustable overlap threshold (default 95%) for detecting minor shifts and mismatches in proportions, suitable for automated post-processing validation. (Description by CC)"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "DecartAI",
|
"author": "DecartAI",
|
||||||
"title": "Lucy-Edit-ComfyUI",
|
"title": "Lucy-Edit-ComfyUI",
|
||||||
@ -35617,16 +35698,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "NODES: TextEncodeQwenImageEditKrsSimple, TextEncodeQwenImageEditKrsAdvanced, QwenImageEditLatentKrs, ..."
|
"description": "NODES: TextEncodeQwenImageEditKrsSimple, TextEncodeQwenImageEditKrsAdvanced, QwenImageEditLatentKrs, ..."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "yemanou",
|
|
||||||
"title": "NABA Image (Gemini REST) Node",
|
|
||||||
"reference": "https://github.com/yemanou/ComfyUI-NABA",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/yemanou/ComfyUI-NABA"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Simplified Gemini 2.5 Flash Image Preview node for ComfyUI. REST-only for stability, two optional reference images, padded aspect ratio resizing (no stretching), and basic sampling controls. All extra debug layers, SDK path, multi-seed, and legacy compatibility code removed to avoid crashes."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "Blacksnowskill",
|
"author": "Blacksnowskill",
|
||||||
"title": "BSS WD14 Batch Tagger",
|
"title": "BSS WD14 Batch Tagger",
|
||||||
@ -35675,6 +35746,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI-Fossiel-QoL-Nodes is (what will hopefully become) a suite of custom nodes for ComfyUI to improve quality of life. These nodes have been developed for personal use but maybe you’ll find them useful as well."
|
"description": "ComfyUI-Fossiel-QoL-Nodes is (what will hopefully become) a suite of custom nodes for ComfyUI to improve quality of life. These nodes have been developed for personal use but maybe you’ll find them useful as well."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "Fossiel",
|
||||||
|
"title": "ComfyUI-Fossiel-WAN-Additional-Tilers",
|
||||||
|
"reference": "https://github.com/Fossiel/ComfyUI-Fossiel-WAN-Additional-Tilers",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Fossiel/ComfyUI-Fossiel-WAN-Additional-Tilers"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Suite of nodes providing VAE tiling functionality for WAN conditioners to reduce VRAM usage while maintaining generation quality. (Description by CC)"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "rsxdalv",
|
"author": "rsxdalv",
|
||||||
"title": "TTS WebUI API nodes for ComfyUI",
|
"title": "TTS WebUI API nodes for ComfyUI",
|
||||||
@ -36056,6 +36137,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Image labeler for ComyUI"
|
"description": "Image labeler for ComyUI"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "Seb-Lis",
|
||||||
|
"title": "ComfyUI_Node_Pack",
|
||||||
|
"reference": "https://github.com/Seb-Lis/ComfyUI_Node_Pack",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Seb-Lis/ComfyUI_Node_Pack"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of utility nodes for image processing, workflow management, and generation metadata tracking."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "gitcapoom",
|
"author": "gitcapoom",
|
||||||
"title": "ComfyUI FOV Estimator",
|
"title": "ComfyUI FOV Estimator",
|
||||||
@ -37051,7 +37142,18 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Utility tools. Index Multiple is used for expanding multiple values from a list, IsOneOfGroupsActive to identify groups state, RepeatGroupState group enable/disable like rg but without connection etc.",
|
"description": "Utility tools. Index Multiple is used for expanding multiple values from a list, IsOneOfGroupsActive to identify groups state, RepeatGroupState group enable/disable like rg but without connection etc.",
|
||||||
"tags": ["utility", "list", "batch"]
|
"tags": ["utility", "list", "batch"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "akawana",
|
||||||
|
"title": "RGBYP Mask Editor (RGB + YP)",
|
||||||
|
"reference": "https://github.com/akawana/ComfyUI-RGBYP-Mask-Editor",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/akawana/ComfyUI-RGBYP-Mask-Editor"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A JS editor for five-color masks (RGB + Yellow + Pink) that works with any nodes, with three helper nodes — RGBYPLoadImage, RGBYPMaskBridge, and RGBYPMaskToRegularMasks—for convenient RGBYP mask handling.",
|
||||||
|
"tags": ["utility", "mask", "rgb", "bridge"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "lovisdotio",
|
"author": "lovisdotio",
|
||||||
"title": "ComfyUI-Replace-First-Frame-Last-Frame",
|
"title": "ComfyUI-Replace-First-Frame-Last-Frame",
|
||||||
@ -37293,12 +37395,380 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI custom nodes for Bokeh Diffusion - Defocus Blur Control in Text-to-Image Diffusion Models."
|
"description": "ComfyUI custom nodes for Bokeh Diffusion - Defocus Blur Control in Text-to-Image Diffusion Models."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "HAL-XP",
|
||||||
|
"title": "HALXP-Comfy",
|
||||||
|
"reference": "https://github.com/HAL-XP/halxp-comfy",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/HAL-XP/halxp-comfy"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A UI suite for ComfyUI including Focus mode and layout enhancements."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "BuddyBytes",
|
||||||
|
"title": "Smart Resolution Toolkit",
|
||||||
|
"reference": "https://github.com/buddy-bytes/ComfyUI-SmartResolutionToolkit",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/buddy-bytes/ComfyUI-SmartResolutionToolkit"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Resolution picker and latent generator for ComfyUI. Select presets like HD, FullHD, 2K, 4K, 8K with aspect ratios (1:1, 9:16, 4:5, 21:9 etc.) via dropdowns. Automatically snaps width/height to latent-safe multiples of 64. Ideal for EmptyLatentImage, AnimateDiff, ControlNet, video formats, and KSampler workflows. Outputs clean INT values or ready-to-use LATENT tensor."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Bharanidharan",
|
||||||
|
"title": "iSeeBetter Node for ComfyUI",
|
||||||
|
"reference": "https://github.com/llikethat/ComfyUI-iseebetter",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/llikethat/ComfyUI-iseebetter"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom Node to implement iSeeBetter upscaling method."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Bharanidharan",
|
||||||
|
"title": "faceExtractor for ComfyUI",
|
||||||
|
"reference": "https://github.com/llikethat/ComfyUI-faceExtractor",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/llikethat/ComfyUI-faceExtractor"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom Node to detect face matching the input reference image."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Pondowner857",
|
||||||
|
"title": "ComfyUI Remote Workflow Executor",
|
||||||
|
"id": "comfy_Pond_Nodes_V2",
|
||||||
|
"reference": "https://github.com/Pondowner857/comfy_Pond_Nodes_V2",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Pondowner857/comfy_Pond_Nodes_V2"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Remote workflow executor node - Execute workflows on remote ComfyUI servers. Supports image/text/audio/video input and output."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "luxdelux7",
|
||||||
|
"title": "Forbidden Vision",
|
||||||
|
"reference": "https://github.com/luxdelux7/ComfyUI-Forbidden-Vision",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/luxdelux7/ComfyUI-Forbidden-Vision"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom face detection and segmentation for ComfyUI with automatic face fixing, intelligent color grading, and iterative refinement. Custom-trained models optimized for realistic, anime, and NSFW content.",
|
||||||
|
"nodename_pattern": "ForbiddenVision"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ah-kun",
|
||||||
|
"title": "ComfyUI-FailSafe-Translate-Node",
|
||||||
|
"reference": "https://github.com/ah-kun/ComfyUI-FailSafe-Translate-Node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ah-kun/ComfyUI-FailSafe-Translate-Node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Fail-safe Google Translate prompt node for ComfyUI (retry + caching)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Kazama-Suichiku",
|
||||||
|
"title": "ComfyUI-Meshy",
|
||||||
|
"id": "comfyui-meshy",
|
||||||
|
"reference": "https://github.com/Kazama-Suichiku/ComfyUI-Meshy",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Kazama-Suichiku/ComfyUI-Meshy"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-Meshy is a 3D generation extension based on Meshy AI API. It provides Text-to-3D and Image-to-3D capabilities within ComfyUI, allowing you to generate 3D models directly from text prompts or images. Supports multiple AI models (Meshy-4, Meshy-5, Meshy-6) with customizable topology, polygon count, and PBR settings."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Carasibana",
|
||||||
|
"title": "ComfyUI-PolyMask",
|
||||||
|
"reference": "https://github.com/Carasibana/ComfyUI-PolyMask",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Carasibana/ComfyUI-PolyMask"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI nodes for loading images and drawing polygon masks interactively on them"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "cdanielp",
|
||||||
|
"title": "COMFYUI_PROMPTMODELS",
|
||||||
|
"reference": "https://github.com/cdanielp/COMFYUI_PROMPTMODELS",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/cdanielp/COMFYUI_PROMPTMODELS"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom nodes for ComfyUI by PROMPTMODELS."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "supElement",
|
||||||
|
"title": "ComfyUI_Element_easy",
|
||||||
|
"reference": "https://github.com/supElement/ComfyUI_Element_easy",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/supElement/ComfyUI_Element_easy"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Three custom ComfyUI nodes: Empty Image RGB, Text Line Break, and Random Chars (Append) for convenient utilities. (Description by CC)"
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"author": "Zeknes",
|
||||||
|
"title": "Comfyui-Nanobanana-API",
|
||||||
|
"reference": "https://github.com/Zeknes/Comfyui-Nanobanana-API",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Zeknes/Comfyui-Nanobanana-API"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI custom node for Gemini image generation via OpenRouter API, supporting text prompts and multiple image inputs (up to 4 images) with automatic saving to output directory. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "xiaoshengyvlin",
|
||||||
|
"title": "ComfyUI-MetaData-ZaKo",
|
||||||
|
"reference": "https://github.com/xiaoshengyvlin/ComfyUI-MetaData-ZaKo",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/xiaoshengyvlin/ComfyUI-MetaData-ZaKo"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI extension for image metadata swapping and preservation in workflows. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "UndefinedUo",
|
||||||
|
"title": "DuoUmiWildcards",
|
||||||
|
"reference": "https://github.com/UndefinedUo/DuoUmiWildcards",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/UndefinedUo/DuoUmiWildcards"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom ComfyUI node supporting wildcard text processing from files with YAML tags, randomization, latent ratio selection and preset aspect ratios."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "bpmpnaito",
|
||||||
|
"title": "comfyui-imageviewer",
|
||||||
|
"reference": "https://github.com/bpmpnaito/comfyui-imageviewer",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/bpmpnaito/comfyui-imageviewer"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Image viewer node that displays preview of images directly in the node."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ChangeTheConstants",
|
||||||
|
"title": "SeedVarianceEnhancer",
|
||||||
|
"reference": "https://github.com/ChangeTheConstants/SeedVarianceEnhancer",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ChangeTheConstants/SeedVarianceEnhancer"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI custom node that adds diversity to Z-Image Turbo outputs by adding random noise to text prompt embeddings to compensate for low seed variance. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "SaTaNoob",
|
||||||
|
"title": "ComfyUI-Z-Image-Turbo-Resolutions",
|
||||||
|
"reference": "https://github.com/SaTaNoob/ComfyUI-Z-Image-Turbo-Resolutions",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/SaTaNoob/ComfyUI-Z-Image-Turbo-Resolutions"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI custom node that provides quick access to all image resolutions for the Z Image Turbo model, sourced from its official Hugging Face Space."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "CraftBlack",
|
||||||
|
"title": "ComfyUI-Resolution-Divider",
|
||||||
|
"reference": "https://github.com/CraftBlack/ComfyUI-Resolution-Divider",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/CraftBlack/ComfyUI-Resolution-Divider"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Utility node for ComfyUI that calculates downscaled resolutions while maintaining original aspect ratio, ideal for image-to-video workflows to prevent OOM errors. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Randy420Marsh",
|
||||||
|
"title": "ComfyUI-Civitai-API-Url-Resolver",
|
||||||
|
"reference": "https://github.com/Randy420Marsh/ComfyUI-Civitai-API-Url-Resolver",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Randy420Marsh/ComfyUI-Civitai-API-Url-Resolver"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI custom node that converts Civitai share/model page URLs into direct download URLs, making it easier to integrate Civitai models into your workflows."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "zn123",
|
||||||
|
"title": "ComfyUI-image-processor-zn123",
|
||||||
|
"reference": "https://github.com/zn123/ComfyUI-image-processor-zn123",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/zn123/ComfyUI-image-processor-zn123"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Comprehensive image processing plugin for ComfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Koko-boya",
|
||||||
|
"title": "Comfyui-Z-Image-Utilities",
|
||||||
|
"reference": "https://github.com/Koko-boya/Comfyui-Z-Image-Utilities",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Koko-boya/Comfyui-Z-Image-Utilities"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Collection of utility nodes for ComfyUI designed specifically for the Z-Image model with vision model support and LLM-powered prompt enhancement."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "fredlef",
|
||||||
|
"title": "ComfyUI FSL Nodes",
|
||||||
|
"reference": "https://github.com/fredlef/Comfyui_FSL_Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/fredlef/Comfyui_FSL_Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"tags": ["image", "chat", "gemini", "fsl"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "exedesign",
|
||||||
|
"title": "ComfyUI-Hunyuan3D-v3",
|
||||||
|
"id": "hunyuan3d-v3",
|
||||||
|
"reference": "https://github.com/exedesign/Hunyuan-3D-v3",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/exedesign/Hunyuan-3D-v3"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Text-to-3D and Image-to-3D generation using Tencent Cloud Hunyuan 3D Global API. Supports PBR materials, face count control (40K-1.5M faces), and multiple generation types (Normal/LowPoly/Geometry/Sketch). Outputs industry-standard GLB format. Requires Tencent Cloud account with API access.",
|
||||||
|
"nodename_pattern": "Hunyuan",
|
||||||
|
"tags": ["3D", "generation", "text-to-3d", "image-to-3d", "hunyuan", "tencent"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "btitkin",
|
||||||
|
"title": "Random Prompt Builder",
|
||||||
|
"id": "random-prompt-builder",
|
||||||
|
"reference": "https://github.com/btitkin/ComfyUI-RandomPromptBuilder",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/btitkin/ComfyUI-RandomPromptBuilder"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Advanced AI-powered prompt generation using local GGUF models. Generate detailed, structured prompts with character controls, style presets, and model-specific formatting for Pony, SDXL, Flux, and more. Supports GPU acceleration and runs completely offline."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "rjgoif",
|
||||||
|
"title": "Img Label Tools",
|
||||||
|
"id": "Img-Label-Tools",
|
||||||
|
"reference": "https://github.com/rjgoif/ComfyUI-Img-Label-Tools",
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Tools to help annotate images for sharing on Reddit, Discord, etc."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "mrf",
|
||||||
|
"title": "ComfyPoe",
|
||||||
|
"reference": "https://github.com/mrf/ComfyPoe",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/mrf/ComfyPoe"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI nodes for image generation via Poe API"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "sirouk",
|
||||||
|
"title": "chutes-comfyui-node",
|
||||||
|
"reference": "https://github.com/sirouk/chutes-comfyui-node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/sirouk/chutes-comfyui-node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI custom nodes for Chutes.ai video generation API"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Tinuva88",
|
||||||
|
"title": "Comfy-UmiAI",
|
||||||
|
"reference": "https://github.com/Tinuva88/Comfy-UmiAI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Tinuva88/Comfy-UmiAI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A logic engine for ComfyUI prompts that transforms static prompts into dynamic, context-aware workflows with persistent variables, conditional logic, native LoRA loading, and external data fetching. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Transhumai",
|
||||||
|
"title": "ComfyUI-LegionPower",
|
||||||
|
"reference": "https://github.com/Transhumai/ComfyUI-LegionPower",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Transhumai/ComfyUI-LegionPower"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Nodes to run ComfyUI workflows in isolated workers for optimal GPU and memory use."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "jeankassio",
|
||||||
|
"title": "ComfyUI_MusicTools",
|
||||||
|
"id": "ComfyUI_MusicTools",
|
||||||
|
"reference": "https://github.com/jeankassio/ComfyUI_MusicTools",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/jeankassio/ComfyUI_MusicTools"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Professional audio processing and mastering suite for ComfyUI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ameyukisora",
|
||||||
|
"title": "ComfyUI Empty Latent Advanced",
|
||||||
|
"reference": "https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ameyukisora/ComfyUI-Empty-Latent-Advanced"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "An advanced Empty Latent selector with visual presets and foldable UI."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Bomborant",
|
||||||
|
"title": "ShakaNodes",
|
||||||
|
"id": "shakanodes",
|
||||||
|
"reference": "https://github.com/bomborant/ComfyUI-ShakaNodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/bomborant/ComfyUI-ShakaNodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ShakaNodes: Utility tools for ComfyUI"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Matthew-X",
|
||||||
|
"title": "Workflow Importer",
|
||||||
|
"id": "comfyui-workflow_importer",
|
||||||
|
"reference": "https://github.com/Matthew-X/comfyui-workflow_importer",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Matthew-X/comfyui-workflow_importer"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"js_path": "workflow_importer",
|
||||||
|
"description": "Import ComfyUI workflows from images with embedded metadata. Adds a toolbar Import button, drag-and-drop dialog and Ctrl+Shift+I shortcut. Supports legacy and new UIs, common image formats, opens each image in a new workflow tab."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Dashuai",
|
||||||
|
"title": "ComfyUI DashuaiTools",
|
||||||
|
"id": "comfyui-dashuai-tools",
|
||||||
|
"reference": "https://github.com/Hasasasa/ComfyUI_DashuaiTools",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Hasasasa/ComfyUI_DashuaiTools"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A practical and lightweight collection of custom nodes for ComfyUI, providing utility tools and convenient workflow functions."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ShootTheSound",
|
||||||
|
"title": "Realtime LoRA Trainer",
|
||||||
|
"id": "comfyui-realtime-lora",
|
||||||
|
"reference": "https://github.com/ShootTheSound/comfyUI-Realtime-Lora",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ShootTheSound/comfyUI-Realtime-Lora"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Train LoRAs directly inside ComfyUI. Supports SDXL (via sd-scripts), FLUX, Z-Image Turbo, and Wan 2.2 (via AI-Toolkit)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "HackAfterDark",
|
||||||
|
"title": "AfterDark Film AR Selector",
|
||||||
|
"id": "ComfyUI-HackAfterDark-Nodes",
|
||||||
|
"reference": "https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/hackafterdark/ComfyUI-HackAfterDark-Nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of utility nodes for ComfyUI, including resolution presets for film and photography aspect ratios.",
|
||||||
|
"tags": ["utility", "presets", "aspect ratio", "film"]
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
230
docs/en/v3.38-userdata-security-migration.md
Normal file
230
docs/en/v3.38-userdata-security-migration.md
Normal file
@ -0,0 +1,230 @@
|
|||||||
|
# ComfyUI-Manager V3.38: Userdata Security Migration Guide
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
|
||||||
|
ComfyUI-Manager V3.38 introduces a **security patch** that migrates Manager's configuration and data to a protected system path. This change leverages ComfyUI's new System User Protection API (PR #10966) to provide enhanced security isolation.
|
||||||
|
|
||||||
|
This guide explains what happens during the migration and how to handle various situations.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## What Changed
|
||||||
|
|
||||||
|
### Finding Your Paths
|
||||||
|
|
||||||
|
When ComfyUI starts, it displays the full paths in the terminal:
|
||||||
|
|
||||||
|
```
|
||||||
|
** User directory: /path/to/ComfyUI/user
|
||||||
|
** ComfyUI-Manager config path: /path/to/ComfyUI/user/__manager/config.ini
|
||||||
|
```
|
||||||
|
|
||||||
|
Look for these lines in your startup log to find the exact location on your system. In this guide, paths are shown relative to the `user` directory.
|
||||||
|
|
||||||
|
### Path Migration
|
||||||
|
|
||||||
|
| Data | Legacy Path | New Path |
|
||||||
|
|------|-------------|----------|
|
||||||
|
| Configuration | `user/default/ComfyUI-Manager/` | `user/__manager/` |
|
||||||
|
| Snapshots | `user/default/ComfyUI-Manager/snapshots/` | `user/__manager/snapshots/` |
|
||||||
|
|
||||||
|
### Why This Change
|
||||||
|
|
||||||
|
In older ComfyUI versions, the `default/` directory was **unprotected** and accessible via web APIs. If you ran ComfyUI with `--listen 0.0.0.0` or similar options to allow external connections, this data **may have been tampered with** by malicious actors.
|
||||||
|
|
||||||
|
**Note:** If you only used ComfyUI locally (without `--listen` or with `--listen 127.0.0.1`), your data was not exposed to this vulnerability.
|
||||||
|
|
||||||
|
The new `__manager` path uses ComfyUI's protected system directory, which:
|
||||||
|
- **Cannot be accessed** from outside (protected by ComfyUI)
|
||||||
|
- Isolates system settings from user data
|
||||||
|
- Enables stricter security for remote access
|
||||||
|
|
||||||
|
**This is why only `config.ini` is automatically migrated** - other files (snapshots) may have been compromised and should be manually verified before copying.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Automatic Migration
|
||||||
|
|
||||||
|
When you start ComfyUI with the new System User Protection API, Manager automatically handles the migration:
|
||||||
|
|
||||||
|
### Step 1: Configuration Migration
|
||||||
|
|
||||||
|
Only `config.ini` is migrated automatically.
|
||||||
|
|
||||||
|
**Important**: Snapshots are **NOT** automatically migrated. You must copy them manually if needed.
|
||||||
|
|
||||||
|
### Step 2: Security Level Check
|
||||||
|
|
||||||
|
During migration, if your security level is below `normal` (i.e., `weak` or `normal-`), it will be automatically raised to `normal`. This is a safety measure because the security level setting itself may have been tampered with in the old version.
|
||||||
|
|
||||||
|
```
|
||||||
|
======================================================================
|
||||||
|
[ComfyUI-Manager] WARNING: Security level adjusted
|
||||||
|
- Previous: 'weak' → New: 'normal'
|
||||||
|
- Raised to prevent unauthorized remote access.
|
||||||
|
======================================================================
|
||||||
|
```
|
||||||
|
|
||||||
|
If you need a lower security level, you can manually edit the config after migration.
|
||||||
|
|
||||||
|
### Step 3: Legacy Backup
|
||||||
|
|
||||||
|
Your entire legacy directory is moved to a backup location:
|
||||||
|
```
|
||||||
|
user/__manager/.legacy-manager-backup/
|
||||||
|
```
|
||||||
|
|
||||||
|
This backup is preserved until you manually delete it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Persistent Backup Notification
|
||||||
|
|
||||||
|
As long as the backup exists, Manager will remind you on **every startup**:
|
||||||
|
|
||||||
|
```
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
[ComfyUI-Manager] NOTICE: Legacy backup exists
|
||||||
|
- Your old Manager data was backed up to:
|
||||||
|
/path/to/ComfyUI/user/__manager/.legacy-manager-backup
|
||||||
|
- Please verify and remove it when no longer needed.
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
```
|
||||||
|
|
||||||
|
**To stop this notification**: Delete the `.legacy-manager-backup` folder inside `user/__manager/` after confirming you don't need any data from it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Recovering Old Data
|
||||||
|
|
||||||
|
### Snapshots
|
||||||
|
|
||||||
|
If you need your old snapshots, copy the contents of `.legacy-manager-backup/snapshots/` to `user/__manager/snapshots/`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Outdated ComfyUI Warning
|
||||||
|
|
||||||
|
If you're running an older version of ComfyUI without the System User Protection API, Manager will:
|
||||||
|
|
||||||
|
1. **Force security level to `strong`** - All installations are blocked
|
||||||
|
2. **Display warning message**:
|
||||||
|
|
||||||
|
```
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
[ComfyUI-Manager] ERROR: ComfyUI version is outdated!
|
||||||
|
- Most operations are blocked for security.
|
||||||
|
- ComfyUI update is still allowed.
|
||||||
|
- Please update ComfyUI to use Manager normally.
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
```
|
||||||
|
|
||||||
|
**Solution**: Update ComfyUI to v0.3.76 or later.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Security Levels
|
||||||
|
|
||||||
|
| Level | What's Allowed |
|
||||||
|
|-------|----------------|
|
||||||
|
| `strong` | ComfyUI update only. All other installations blocked. |
|
||||||
|
| `normal` | Install/update/remove registered custom nodes and models. |
|
||||||
|
| `normal-` | Above + Install via Git URL or pip (localhost only). |
|
||||||
|
| `weak` | All operations allowed, including from remote connections. |
|
||||||
|
|
||||||
|
**Notes:**
|
||||||
|
- `strong` is forced on outdated ComfyUI versions.
|
||||||
|
- `normal` is the default and recommended for most users.
|
||||||
|
- `normal-` is for developers who need to install unregistered nodes locally.
|
||||||
|
- `weak` should only be used in isolated development environments.
|
||||||
|
|
||||||
|
### Changing Security Level
|
||||||
|
|
||||||
|
Edit `user/__manager/config.ini`:
|
||||||
|
```ini
|
||||||
|
[default]
|
||||||
|
security_level = normal
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Error Messages
|
||||||
|
|
||||||
|
### "comfyui_outdated" (HTTP 403)
|
||||||
|
|
||||||
|
This error appears when:
|
||||||
|
- Your ComfyUI doesn't have the System User Protection API
|
||||||
|
- All installations are blocked until you update ComfyUI
|
||||||
|
|
||||||
|
**Solution**: Update ComfyUI to the latest version.
|
||||||
|
|
||||||
|
### "security_level" (HTTP 403)
|
||||||
|
|
||||||
|
This error appears when:
|
||||||
|
- Your security level blocks the requested operation
|
||||||
|
- For example, `strong` level blocks all installations
|
||||||
|
|
||||||
|
**Solution**: Lower your security level in config.ini if appropriate for your use case.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Security Warning: Suspicious Path
|
||||||
|
|
||||||
|
If you see this error on an **older** ComfyUI:
|
||||||
|
|
||||||
|
```
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
[ComfyUI-Manager] ERROR: Suspicious path detected!
|
||||||
|
- '__manager' exists with low security level: 'weak'
|
||||||
|
- Please verify manually:
|
||||||
|
/path/to/ComfyUI/user/__manager/config.ini
|
||||||
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
```
|
||||||
|
|
||||||
|
On older ComfyUI versions, the `__manager` directory is not normally created. If this directory exists, it may have been created externally. For safety, manually verify the contents of this directory before updating ComfyUI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### All my installations are blocked
|
||||||
|
|
||||||
|
**Check 1**: Is your ComfyUI updated?
|
||||||
|
- Old ComfyUI forces `security_level = strong`
|
||||||
|
- Update ComfyUI to resolve
|
||||||
|
|
||||||
|
**Check 2**: What's your security level?
|
||||||
|
- Check `user/__manager/config.ini`
|
||||||
|
- `security_level = strong` blocks all installations
|
||||||
|
|
||||||
|
### My snapshots are missing
|
||||||
|
|
||||||
|
Snapshots are not automatically migrated. You need to manually copy the `snapshots` folder from inside `.legacy-manager-backup` to the `user/__manager/` directory.
|
||||||
|
|
||||||
|
### I keep seeing the backup notification
|
||||||
|
|
||||||
|
Delete the `.legacy-manager-backup` folder inside `user/__manager/` after confirming you don't need any data from it.
|
||||||
|
|
||||||
|
### Snapshot restore is blocked
|
||||||
|
|
||||||
|
On old ComfyUI (without System User API), snapshot restore is blocked because security is forced to `strong`. Update ComfyUI to enable snapshot restore.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Structure Reference
|
||||||
|
|
||||||
|
```
|
||||||
|
user/
|
||||||
|
└── __manager/
|
||||||
|
├── config.ini # Manager configuration
|
||||||
|
├── channels.list # Custom node channels
|
||||||
|
├── snapshots/ # Environment snapshots
|
||||||
|
└── .legacy-manager-backup/ # Backup of old Manager data (temporary)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- **ComfyUI**: v0.3.76 or later (with System User Protection API)
|
||||||
|
- **ComfyUI-Manager**: V3.38 or later
|
||||||
File diff suppressed because it is too large
Load Diff
9039
github-stats.json
9039
github-stats.json
File diff suppressed because it is too large
Load Diff
@ -40,10 +40,11 @@ import cnr_utils
|
|||||||
import manager_util
|
import manager_util
|
||||||
import git_utils
|
import git_utils
|
||||||
import manager_downloader
|
import manager_downloader
|
||||||
|
import manager_migration
|
||||||
from node_package import InstalledNodePackage
|
from node_package import InstalledNodePackage
|
||||||
|
|
||||||
|
|
||||||
version_code = [3, 37, 2]
|
version_code = [3, 38, 1]
|
||||||
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 '')
|
||||||
|
|
||||||
|
|
||||||
@ -214,9 +215,10 @@ def update_user_directory(user_dir):
|
|||||||
global manager_pip_blacklist_path
|
global manager_pip_blacklist_path
|
||||||
global manager_components_path
|
global manager_components_path
|
||||||
|
|
||||||
manager_files_path = os.path.abspath(os.path.join(user_dir, 'default', 'ComfyUI-Manager'))
|
manager_files_path = manager_migration.get_manager_path(user_dir)
|
||||||
if not os.path.exists(manager_files_path):
|
if not os.path.exists(manager_files_path):
|
||||||
os.makedirs(manager_files_path)
|
os.makedirs(manager_files_path)
|
||||||
|
manager_migration.run_migration_checks(user_dir, manager_files_path)
|
||||||
|
|
||||||
manager_snapshot_path = os.path.join(manager_files_path, "snapshots")
|
manager_snapshot_path = os.path.join(manager_files_path, "snapshots")
|
||||||
if not os.path.exists(manager_snapshot_path):
|
if not os.path.exists(manager_snapshot_path):
|
||||||
@ -1719,7 +1721,7 @@ def read_config():
|
|||||||
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
|
||||||
manager_util.bypass_ssl = get_bool('bypass_ssl', False)
|
manager_util.bypass_ssl = get_bool('bypass_ssl', False)
|
||||||
|
|
||||||
return {
|
result = {
|
||||||
'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()).lower(),
|
'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', ''),
|
||||||
@ -1739,6 +1741,8 @@ def read_config():
|
|||||||
'security_level': default_conf.get('security_level', 'normal').lower(),
|
'security_level': default_conf.get('security_level', 'normal').lower(),
|
||||||
'db_mode': default_conf.get('db_mode', 'cache').lower(),
|
'db_mode': default_conf.get('db_mode', 'cache').lower(),
|
||||||
}
|
}
|
||||||
|
manager_migration.force_security_level_if_needed(result)
|
||||||
|
return result
|
||||||
|
|
||||||
except Exception:
|
except Exception:
|
||||||
import importlib.util
|
import importlib.util
|
||||||
@ -1746,7 +1750,7 @@ def read_config():
|
|||||||
manager_util.use_uv = importlib.util.find_spec("uv") is not None and platform.system() != "Windows"
|
manager_util.use_uv = importlib.util.find_spec("uv") is not None and platform.system() != "Windows"
|
||||||
manager_util.bypass_ssl = False
|
manager_util.bypass_ssl = False
|
||||||
|
|
||||||
return {
|
result = {
|
||||||
'http_channel_enabled': False,
|
'http_channel_enabled': False,
|
||||||
'preview_method': manager_funcs.get_current_preview_method(),
|
'preview_method': manager_funcs.get_current_preview_method(),
|
||||||
'git_exe': '',
|
'git_exe': '',
|
||||||
@ -1766,6 +1770,8 @@ def read_config():
|
|||||||
'security_level': 'normal', # strong | normal | normal- | weak
|
'security_level': 'normal', # strong | normal | normal- | weak
|
||||||
'db_mode': 'cache', # local | cache | remote
|
'db_mode': 'cache', # local | cache | remote
|
||||||
}
|
}
|
||||||
|
manager_migration.force_security_level_if_needed(result)
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
def get_config():
|
def get_config():
|
||||||
@ -3360,8 +3366,8 @@ def get_comfyui_versions(repo=None):
|
|||||||
repo = git.Repo(comfy_path)
|
repo = git.Repo(comfy_path)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
remote = get_remote_name(repo)
|
remote = get_remote_name(repo)
|
||||||
repo.remotes[remote].fetch()
|
repo.remotes[remote].fetch()
|
||||||
except:
|
except:
|
||||||
logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI")
|
logging.error("[ComfyUI-Manager] Failed to fetch ComfyUI")
|
||||||
|
|
||||||
|
|||||||
356
glob/manager_migration.py
Normal file
356
glob/manager_migration.py
Normal file
@ -0,0 +1,356 @@
|
|||||||
|
"""
|
||||||
|
ComfyUI-Manager migration module.
|
||||||
|
Handles migration from legacy paths to new __manager path structure.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
import configparser
|
||||||
|
|
||||||
|
# Startup notices for notice board
|
||||||
|
startup_notices = [] # List of (message, level) tuples
|
||||||
|
|
||||||
|
|
||||||
|
def add_startup_notice(message, level='warning'):
|
||||||
|
"""Add a notice to be displayed on Manager notice board.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
message: HTML-formatted message string
|
||||||
|
level: 'warning', 'error', 'info'
|
||||||
|
"""
|
||||||
|
global startup_notices
|
||||||
|
startup_notices.append((message, level))
|
||||||
|
|
||||||
|
|
||||||
|
# Cache for API check (computed once per session)
|
||||||
|
_cached_has_system_user_api = None
|
||||||
|
|
||||||
|
|
||||||
|
def has_system_user_api():
|
||||||
|
"""Check if ComfyUI has the System User Protection API (PR #10966).
|
||||||
|
|
||||||
|
Result is cached for performance.
|
||||||
|
"""
|
||||||
|
global _cached_has_system_user_api
|
||||||
|
if _cached_has_system_user_api is None:
|
||||||
|
try:
|
||||||
|
import folder_paths
|
||||||
|
_cached_has_system_user_api = hasattr(folder_paths, 'get_system_user_directory')
|
||||||
|
except Exception:
|
||||||
|
_cached_has_system_user_api = False
|
||||||
|
return _cached_has_system_user_api
|
||||||
|
|
||||||
|
|
||||||
|
def get_manager_path(user_dir):
|
||||||
|
"""Get the appropriate manager files path based on ComfyUI version.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: manager_files_path
|
||||||
|
"""
|
||||||
|
if has_system_user_api():
|
||||||
|
return os.path.abspath(os.path.join(user_dir, '__manager'))
|
||||||
|
else:
|
||||||
|
return os.path.abspath(os.path.join(user_dir, 'default', 'ComfyUI-Manager'))
|
||||||
|
|
||||||
|
|
||||||
|
def run_migration_checks(user_dir, manager_files_path):
|
||||||
|
"""Run all migration and security checks.
|
||||||
|
|
||||||
|
Call this after get_manager_path() to handle:
|
||||||
|
- Legacy config migration (new ComfyUI)
|
||||||
|
- Legacy backup notification (every startup)
|
||||||
|
- Suspicious directory detection (old ComfyUI)
|
||||||
|
- Outdated ComfyUI warning (old ComfyUI)
|
||||||
|
"""
|
||||||
|
if has_system_user_api():
|
||||||
|
migrated = migrate_legacy_config(user_dir, manager_files_path)
|
||||||
|
# Only check for legacy backup if migration didn't just happen
|
||||||
|
# (migration already shows backup location in its message)
|
||||||
|
if not migrated:
|
||||||
|
check_legacy_backup(manager_files_path)
|
||||||
|
else:
|
||||||
|
check_suspicious_manager(user_dir)
|
||||||
|
warn_outdated_comfyui()
|
||||||
|
|
||||||
|
|
||||||
|
def check_legacy_backup(manager_files_path):
|
||||||
|
"""Check for legacy backup and notify user to verify and remove it.
|
||||||
|
|
||||||
|
This runs on every startup to remind users about pending legacy backup.
|
||||||
|
"""
|
||||||
|
backup_dir = os.path.join(manager_files_path, '.legacy-manager-backup')
|
||||||
|
if not os.path.exists(backup_dir):
|
||||||
|
return
|
||||||
|
|
||||||
|
# Terminal output
|
||||||
|
print("\n" + "-"*70)
|
||||||
|
print("[ComfyUI-Manager] NOTICE: Legacy backup exists")
|
||||||
|
print(" - Your old Manager data was backed up to:")
|
||||||
|
print(f" {backup_dir}")
|
||||||
|
print(" - Please verify and remove it when no longer needed.")
|
||||||
|
print("-"*70 + "\n")
|
||||||
|
|
||||||
|
# Notice board output
|
||||||
|
add_startup_notice(
|
||||||
|
"Legacy ComfyUI-Manager data backup exists. Please verify and remove when no longer needed. See terminal for details.",
|
||||||
|
level='info'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def check_suspicious_manager(user_dir):
|
||||||
|
"""Check for suspicious __manager directory on old ComfyUI.
|
||||||
|
|
||||||
|
On old ComfyUI without System User API, if __manager exists with low security,
|
||||||
|
warn the user to verify manually.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if suspicious setup detected
|
||||||
|
"""
|
||||||
|
if has_system_user_api():
|
||||||
|
return False # Not suspicious on new ComfyUI
|
||||||
|
|
||||||
|
suspicious_path = os.path.abspath(os.path.join(user_dir, '__manager'))
|
||||||
|
if not os.path.exists(suspicious_path):
|
||||||
|
return False
|
||||||
|
|
||||||
|
config_path = os.path.join(suspicious_path, 'config.ini')
|
||||||
|
if not os.path.exists(config_path):
|
||||||
|
return False
|
||||||
|
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
config.read(config_path)
|
||||||
|
sec_level = config.get('default', 'security_level', fallback='normal').lower()
|
||||||
|
|
||||||
|
if sec_level in ['weak', 'normal-']:
|
||||||
|
# Terminal output
|
||||||
|
print("\n" + "!"*70)
|
||||||
|
print("[ComfyUI-Manager] ERROR: Suspicious path detected!")
|
||||||
|
print(f" - '__manager' exists with low security level: '{sec_level}'")
|
||||||
|
print(" - Please verify manually:")
|
||||||
|
print(f" {config_path}")
|
||||||
|
print("!"*70 + "\n")
|
||||||
|
|
||||||
|
# Notice board output
|
||||||
|
add_startup_notice(
|
||||||
|
"[Security Alert] Suspicious path detected. See terminal log for details.",
|
||||||
|
level='error'
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def warn_outdated_comfyui():
|
||||||
|
"""Warn user about outdated ComfyUI without System User API."""
|
||||||
|
if has_system_user_api():
|
||||||
|
return
|
||||||
|
|
||||||
|
# Terminal output
|
||||||
|
print("\n" + "!"*70)
|
||||||
|
print("[ComfyUI-Manager] ERROR: ComfyUI version is outdated!")
|
||||||
|
print(" - Most operations are blocked for security.")
|
||||||
|
print(" - ComfyUI update is still allowed.")
|
||||||
|
print(" - Please update ComfyUI to use Manager normally.")
|
||||||
|
print("!"*70 + "\n")
|
||||||
|
|
||||||
|
# Notice board output
|
||||||
|
add_startup_notice(
|
||||||
|
"[Security Alert] ComfyUI outdated. Installations blocked (update allowed).<BR>"
|
||||||
|
"Update ComfyUI for normal operation.",
|
||||||
|
level='error'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def migrate_legacy_config(user_dir, manager_files_path):
|
||||||
|
"""Migrate ONLY config.ini to new __manager path if needed.
|
||||||
|
|
||||||
|
IMPORTANT: Only config.ini is migrated. Other files (snapshots, cache, etc.)
|
||||||
|
are NOT migrated - users must recreate them.
|
||||||
|
|
||||||
|
Scenarios:
|
||||||
|
1. Legacy exists, New doesn't exist → Migrate config.ini
|
||||||
|
2. Legacy exists, New exists → First update after upgrade
|
||||||
|
- Run ComfyUI dependency installation
|
||||||
|
- Rename legacy to .backup
|
||||||
|
3. Legacy doesn't exist → No migration needed
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if migration was performed
|
||||||
|
"""
|
||||||
|
if not has_system_user_api():
|
||||||
|
return False
|
||||||
|
|
||||||
|
legacy_dir = os.path.join(user_dir, 'default', 'ComfyUI-Manager')
|
||||||
|
legacy_config = os.path.join(legacy_dir, 'config.ini')
|
||||||
|
new_config = os.path.join(manager_files_path, 'config.ini')
|
||||||
|
|
||||||
|
if not os.path.exists(legacy_dir):
|
||||||
|
return False # No legacy directory, nothing to migrate
|
||||||
|
|
||||||
|
# IMPORTANT: Check for config.ini existence, not just directory
|
||||||
|
# (because makedirs() creates __manager before this function is called)
|
||||||
|
|
||||||
|
# Case: Both configs exist (first update after ComfyUI upgrade)
|
||||||
|
# This means user ran new ComfyUI at least once, creating __manager/config.ini
|
||||||
|
if os.path.exists(legacy_config) and os.path.exists(new_config):
|
||||||
|
_handle_first_update_migration(user_dir, legacy_dir, manager_files_path)
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Case: Legacy config exists but new config doesn't (normal migration)
|
||||||
|
# This is the first run after ComfyUI upgrade
|
||||||
|
if os.path.exists(legacy_config) and not os.path.exists(new_config):
|
||||||
|
pass # Continue with normal migration below
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Terminal output
|
||||||
|
print("\n" + "-"*70)
|
||||||
|
print("[ComfyUI-Manager] NOTICE: Legacy config.ini detected")
|
||||||
|
print(f" - Old: {legacy_config}")
|
||||||
|
print(f" - New: {new_config}")
|
||||||
|
print(" - Migrating config.ini only (other files are NOT migrated).")
|
||||||
|
print(" - Security level below 'normal' will be raised.")
|
||||||
|
print("-"*70 + "\n")
|
||||||
|
|
||||||
|
_migrate_config_with_security_check(legacy_config, new_config)
|
||||||
|
|
||||||
|
# Move legacy directory to backup
|
||||||
|
_move_legacy_to_backup(legacy_dir, manager_files_path)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def _handle_first_update_migration(user_dir, legacy_dir, manager_files_path):
|
||||||
|
"""Handle first ComfyUI update when both legacy and new directories exist.
|
||||||
|
|
||||||
|
This scenario happens when:
|
||||||
|
- User was on old ComfyUI (using default/ComfyUI-Manager)
|
||||||
|
- ComfyUI was updated (now has System User API)
|
||||||
|
- Manager already created __manager on first new run
|
||||||
|
- But legacy directory still exists
|
||||||
|
|
||||||
|
Actions:
|
||||||
|
1. Run ComfyUI dependency installation
|
||||||
|
2. Move legacy to __manager/.legacy-manager-backup
|
||||||
|
"""
|
||||||
|
# Terminal output
|
||||||
|
print("\n" + "-"*70)
|
||||||
|
print("[ComfyUI-Manager] NOTICE: First update after ComfyUI upgrade detected")
|
||||||
|
print(" - Both legacy and new directories exist.")
|
||||||
|
print(" - Running ComfyUI dependency installation...")
|
||||||
|
print("-"*70 + "\n")
|
||||||
|
|
||||||
|
# Run ComfyUI dependency installation
|
||||||
|
# Path: glob/manager_migration.py → glob → comfyui-manager → custom_nodes → ComfyUI
|
||||||
|
try:
|
||||||
|
comfyui_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
|
||||||
|
requirements_path = os.path.join(comfyui_path, 'requirements.txt')
|
||||||
|
if os.path.exists(requirements_path):
|
||||||
|
subprocess.run([sys.executable, '-m', 'pip', 'install', '-r', requirements_path],
|
||||||
|
capture_output=True, check=False)
|
||||||
|
print("[ComfyUI-Manager] ComfyUI dependencies installation completed.")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[ComfyUI-Manager] WARNING: Failed to install ComfyUI dependencies: {e}")
|
||||||
|
|
||||||
|
# Move legacy to backup inside __manager
|
||||||
|
_move_legacy_to_backup(legacy_dir, manager_files_path)
|
||||||
|
|
||||||
|
|
||||||
|
def _move_legacy_to_backup(legacy_dir, manager_files_path):
|
||||||
|
"""Move legacy directory to backup inside __manager.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str: Path to backup directory if successful, None if failed
|
||||||
|
"""
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
backup_dir = os.path.join(manager_files_path, '.legacy-manager-backup')
|
||||||
|
|
||||||
|
try:
|
||||||
|
if os.path.exists(backup_dir):
|
||||||
|
shutil.rmtree(backup_dir) # Remove old backup if exists
|
||||||
|
shutil.move(legacy_dir, backup_dir)
|
||||||
|
|
||||||
|
# Terminal output (full paths shown here only)
|
||||||
|
print("\n" + "-"*70)
|
||||||
|
print("[ComfyUI-Manager] NOTICE: Legacy settings migrated")
|
||||||
|
print(f" - Old location: {legacy_dir}")
|
||||||
|
print(f" - Backed up to: {backup_dir}")
|
||||||
|
print(" - Please verify and remove the backup when no longer needed.")
|
||||||
|
print("-"*70 + "\n")
|
||||||
|
|
||||||
|
# Notice board output (no full paths for security)
|
||||||
|
add_startup_notice(
|
||||||
|
"Legacy ComfyUI-Manager data migrated. See terminal for details.",
|
||||||
|
level='info'
|
||||||
|
)
|
||||||
|
return backup_dir
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[ComfyUI-Manager] WARNING: Failed to backup legacy directory: {e}")
|
||||||
|
add_startup_notice(
|
||||||
|
f"[MIGRATION] Failed to backup legacy directory: {e}",
|
||||||
|
level='warning'
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _migrate_config_with_security_check(legacy_path, new_path):
|
||||||
|
"""Migrate legacy config, raising security level only if below default."""
|
||||||
|
config = configparser.ConfigParser()
|
||||||
|
try:
|
||||||
|
config.read(legacy_path)
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[ComfyUI-Manager] WARNING: Failed to parse config.ini: {e}")
|
||||||
|
print(" - Creating fresh config with default settings.")
|
||||||
|
add_startup_notice(
|
||||||
|
"[MIGRATION] Failed to parse legacy config. Using defaults.",
|
||||||
|
level='warning'
|
||||||
|
)
|
||||||
|
return # Skip migration, let Manager create fresh config
|
||||||
|
|
||||||
|
# Security level hierarchy: strong > normal > normal- > weak
|
||||||
|
# Default is 'normal', only raise if below default
|
||||||
|
if 'default' in config:
|
||||||
|
current_level = config['default'].get('security_level', 'normal').lower()
|
||||||
|
below_default_levels = ['weak', 'normal-']
|
||||||
|
|
||||||
|
if current_level in below_default_levels:
|
||||||
|
config['default']['security_level'] = 'normal'
|
||||||
|
|
||||||
|
# Terminal output
|
||||||
|
print("\n" + "="*70)
|
||||||
|
print("[ComfyUI-Manager] WARNING: Security level adjusted")
|
||||||
|
print(f" - Previous: '{current_level}' → New: 'normal'")
|
||||||
|
print(" - Raised to prevent unauthorized remote access.")
|
||||||
|
print("="*70 + "\n")
|
||||||
|
|
||||||
|
# Notice board output
|
||||||
|
add_startup_notice(
|
||||||
|
f"[MIGRATION] Security level raised: '{current_level}' → 'normal'.<BR>"
|
||||||
|
"To prevent unauthorized remote access.",
|
||||||
|
level='warning'
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
print(f" - Security level: '{current_level}' (no change needed)")
|
||||||
|
|
||||||
|
# Ensure directory exists
|
||||||
|
os.makedirs(os.path.dirname(new_path), exist_ok=True)
|
||||||
|
|
||||||
|
with open(new_path, 'w') as f:
|
||||||
|
config.write(f)
|
||||||
|
|
||||||
|
|
||||||
|
def force_security_level_if_needed(config_dict):
|
||||||
|
"""Force security level to 'strong' if on old ComfyUI.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
config_dict: Configuration dictionary to modify in-place
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True if security level was forced
|
||||||
|
"""
|
||||||
|
if not has_system_user_api():
|
||||||
|
config_dict['security_level'] = 'strong'
|
||||||
|
return True
|
||||||
|
return False
|
||||||
@ -22,6 +22,7 @@ import asyncio
|
|||||||
import queue
|
import queue
|
||||||
|
|
||||||
import manager_downloader
|
import manager_downloader
|
||||||
|
import manager_migration
|
||||||
|
|
||||||
|
|
||||||
logging.info(f"### Loading: ComfyUI-Manager ({core.version_str})")
|
logging.info(f"### Loading: ComfyUI-Manager ({core.version_str})")
|
||||||
@ -276,6 +277,13 @@ import zipfile
|
|||||||
import urllib.request
|
import urllib.request
|
||||||
|
|
||||||
|
|
||||||
|
def security_403_response():
|
||||||
|
"""Return appropriate 403 response based on ComfyUI version."""
|
||||||
|
if not manager_migration.has_system_user_api():
|
||||||
|
return web.json_response({"error": "comfyui_outdated"}, status=403)
|
||||||
|
return web.json_response({"error": "security_level"}, status=403)
|
||||||
|
|
||||||
|
|
||||||
def get_model_dir(data, show_log=False):
|
def get_model_dir(data, show_log=False):
|
||||||
if 'download_model_base' in folder_paths.folder_names_and_paths:
|
if 'download_model_base' in folder_paths.folder_names_and_paths:
|
||||||
models_base = folder_paths.folder_names_and_paths['download_model_base'][0][0]
|
models_base = folder_paths.folder_names_and_paths['download_model_base'][0][0]
|
||||||
@ -732,7 +740,7 @@ async def fetch_updates(request):
|
|||||||
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 security_403_response()
|
||||||
|
|
||||||
with task_worker_lock:
|
with task_worker_lock:
|
||||||
is_processing = task_worker_thread is not None and task_worker_thread.is_alive()
|
is_processing = task_worker_thread is not None and task_worker_thread.is_alive()
|
||||||
@ -965,7 +973,7 @@ async def get_snapshot_list(request):
|
|||||||
async def remove_snapshot(request):
|
async def remove_snapshot(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 security_403_response()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
target = request.rel_url.query["target"]
|
target = request.rel_url.query["target"]
|
||||||
@ -983,7 +991,7 @@ async def remove_snapshot(request):
|
|||||||
async def restore_snapshot(request):
|
async def restore_snapshot(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 security_403_response()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
target = request.rel_url.query["target"]
|
target = request.rel_url.query["target"]
|
||||||
@ -1302,7 +1310,7 @@ async def fix_custom_node(request):
|
|||||||
async def install_custom_node_git_url(request):
|
async def install_custom_node_git_url(request):
|
||||||
if not is_allowed_security_level('high'):
|
if not is_allowed_security_level('high'):
|
||||||
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
|
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
|
||||||
return web.Response(status=403)
|
return security_403_response()
|
||||||
|
|
||||||
url = await request.text()
|
url = await request.text()
|
||||||
res = await core.gitclone_install(url)
|
res = await core.gitclone_install(url)
|
||||||
@ -1322,7 +1330,7 @@ async def install_custom_node_git_url(request):
|
|||||||
async def install_custom_node_pip(request):
|
async def install_custom_node_pip(request):
|
||||||
if not is_allowed_security_level('high'):
|
if not is_allowed_security_level('high'):
|
||||||
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
|
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
|
||||||
return web.Response(status=403)
|
return security_403_response()
|
||||||
|
|
||||||
packages = await request.text()
|
packages = await request.text()
|
||||||
core.pip_install(packages.split(' '))
|
core.pip_install(packages.split(' '))
|
||||||
@ -1594,6 +1602,16 @@ async def get_notice(request):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Prepend startup notices from manager_migration
|
||||||
|
for message, level in reversed(manager_migration.startup_notices):
|
||||||
|
if level == 'error':
|
||||||
|
style = 'color:red; background-color:white; font-weight:bold'
|
||||||
|
elif level == 'warning':
|
||||||
|
style = 'color:orange; background-color:white; font-weight:bold'
|
||||||
|
else:
|
||||||
|
style = 'color:blue; background-color:white'
|
||||||
|
markdown_content = f'<P style="{style}">{message}</P>' + markdown_content
|
||||||
|
|
||||||
return web.Response(text=markdown_content, status=200)
|
return web.Response(text=markdown_content, status=200)
|
||||||
else:
|
else:
|
||||||
return web.Response(text="Unable to retrieve Notice", status=200)
|
return web.Response(text="Unable to retrieve Notice", status=200)
|
||||||
@ -1601,11 +1619,35 @@ async def get_notice(request):
|
|||||||
return web.Response(text="Unable to retrieve Notice", status=200)
|
return web.Response(text="Unable to retrieve Notice", status=200)
|
||||||
|
|
||||||
|
|
||||||
|
@routes.get("/manager/startup_alerts")
|
||||||
|
async def get_startup_alerts(request):
|
||||||
|
"""Return startup alerts for customAlert display on page load.
|
||||||
|
|
||||||
|
Returns JSON array of alerts that should be shown to user immediately.
|
||||||
|
All startup notices (error, warning, info) are returned.
|
||||||
|
"""
|
||||||
|
alerts = []
|
||||||
|
|
||||||
|
# Return all startup notices for alert display
|
||||||
|
for message, level in manager_migration.startup_notices:
|
||||||
|
# Convert HTML BR to newlines for customAlert
|
||||||
|
text = message.replace('<BR>', '\n').replace('<br>', '\n')
|
||||||
|
# Add [ComfyUI-Manager] prefix for customAlert (notice board shows in Manager UI anyway)
|
||||||
|
text = text.replace('[Security Alert]', '[ComfyUI-Manager] Security Alert:')
|
||||||
|
text = text.replace('[MIGRATION]', '[ComfyUI-Manager] Migration:')
|
||||||
|
alerts.append({
|
||||||
|
'message': text,
|
||||||
|
'level': level
|
||||||
|
})
|
||||||
|
|
||||||
|
return web.json_response(alerts)
|
||||||
|
|
||||||
|
|
||||||
@routes.get("/manager/reboot")
|
@routes.get("/manager/reboot")
|
||||||
def restart(self):
|
def restart(self):
|
||||||
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 security_403_response()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
sys.stdout.close_log()
|
sys.stdout.close_log()
|
||||||
|
|||||||
@ -55,7 +55,7 @@ def get_pip_cmd(force_uv=False):
|
|||||||
subprocess.check_output(test_cmd, stderr=subprocess.DEVNULL, timeout=5)
|
subprocess.check_output(test_cmd, stderr=subprocess.DEVNULL, timeout=5)
|
||||||
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'pip']
|
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'pip']
|
||||||
except Exception:
|
except Exception:
|
||||||
logging.warning("[ComfyUI-Manager] python -m pip not available. Falling back to uv.")
|
logging.warning("[ComfyUI-Manager] `python -m pip` not available. Falling back to `uv`.")
|
||||||
|
|
||||||
# Try uv (either forced or pip failed)
|
# Try uv (either forced or pip failed)
|
||||||
import shutil
|
import shutil
|
||||||
@ -64,19 +64,19 @@ def get_pip_cmd(force_uv=False):
|
|||||||
try:
|
try:
|
||||||
test_cmd = [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', '--version']
|
test_cmd = [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', '--version']
|
||||||
subprocess.check_output(test_cmd, stderr=subprocess.DEVNULL, timeout=5)
|
subprocess.check_output(test_cmd, stderr=subprocess.DEVNULL, timeout=5)
|
||||||
logging.info("[ComfyUI-Manager] Using uv as Python module for pip operations.")
|
logging.info("[ComfyUI-Manager] Using `uv` as Python module for pip operations.")
|
||||||
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', 'pip']
|
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', 'pip']
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Try standalone uv
|
# Try standalone uv
|
||||||
if shutil.which('uv'):
|
if shutil.which('uv'):
|
||||||
logging.info("[ComfyUI-Manager] Using standalone uv for pip operations.")
|
logging.info("[ComfyUI-Manager] Using standalone `uv` for pip operations.")
|
||||||
return ['uv', 'pip']
|
return ['uv', 'pip']
|
||||||
|
|
||||||
# Nothing worked
|
# Nothing worked
|
||||||
logging.error("[ComfyUI-Manager] Neither python -m pip nor uv are available. Cannot proceed with package operations.")
|
logging.error("[ComfyUI-Manager] Neither `python -m pip` nor `uv` are available. Cannot proceed with package operations.")
|
||||||
raise Exception("Neither pip nor uv are available for package management")
|
raise Exception("Neither `pip` nor `uv` are available for package management")
|
||||||
|
|
||||||
|
|
||||||
def make_pip_cmd(cmd):
|
def make_pip_cmd(cmd):
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { api } from "../../scripts/api.js";
|
import { api } from "../../scripts/api.js";
|
||||||
import { app } from "../../scripts/app.js";
|
import { app } from "../../scripts/app.js";
|
||||||
import { sleep, customConfirm, customAlert } from "./common.js";
|
import { sleep, customConfirm, customAlert, handle403Response, show_message } from "./common.js";
|
||||||
|
|
||||||
async function tryInstallCustomNode(event) {
|
async function tryInstallCustomNode(event) {
|
||||||
let msg = '-= [ComfyUI Manager] extension installation request =-\n\n';
|
let msg = '-= [ComfyUI Manager] extension installation request =-\n\n';
|
||||||
@ -42,7 +42,7 @@ async function tryInstallCustomNode(event) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(response.status == 403) {
|
if(response.status == 403) {
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
await handle403Response(response);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if(response.status == 400) {
|
else if(response.status == 400) {
|
||||||
@ -54,7 +54,7 @@ async function tryInstallCustomNode(event) {
|
|||||||
|
|
||||||
let response = await api.fetchApi("/manager/reboot");
|
let response = await api.fetchApi("/manager/reboot");
|
||||||
if(response.status == 403) {
|
if(response.status == 403) {
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
await handle403Response(response);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -14,7 +14,7 @@ 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, setManagerInstance, show_message, customAlert, customPrompt,
|
rebootAPI, setManagerInstance, show_message, customAlert, customPrompt,
|
||||||
infoToast, showTerminal, setNeedRestart
|
infoToast, showTerminal, setNeedRestart, handle403Response
|
||||||
} from "./common.js";
|
} 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";
|
||||||
@ -753,9 +753,9 @@ async function onQueueStatus(event) {
|
|||||||
|
|
||||||
const rebootButton = document.getElementById('cm-reboot-button5');
|
const rebootButton = document.getElementById('cm-reboot-button5');
|
||||||
rebootButton?.addEventListener("click",
|
rebootButton?.addEventListener("click",
|
||||||
function() {
|
async function() {
|
||||||
if(rebootAPI()) {
|
if(await rebootAPI()) {
|
||||||
manager_dialog.close();
|
manager_instance.close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -780,8 +780,13 @@ async function updateAll(update_comfyui) {
|
|||||||
|
|
||||||
const response = await api.fetchApi(`/manager/queue/update_all?mode=${mode}`);
|
const response = await api.fetchApi(`/manager/queue/update_all?mode=${mode}`);
|
||||||
|
|
||||||
if (response.status == 401) {
|
if (response.status == 403) {
|
||||||
|
await handle403Response(response);
|
||||||
|
reset_action_buttons();
|
||||||
|
}
|
||||||
|
else if (response.status == 401) {
|
||||||
customAlert('Another task is already in progress. Please stop the ongoing task first.');
|
customAlert('Another task is already in progress. Please stop the ongoing task first.');
|
||||||
|
reset_action_buttons();
|
||||||
}
|
}
|
||||||
else if(response.status == 200) {
|
else if(response.status == 200) {
|
||||||
is_updating = true;
|
is_updating = true;
|
||||||
@ -1453,6 +1458,31 @@ app.registerExtension({
|
|||||||
|
|
||||||
load_components();
|
load_components();
|
||||||
|
|
||||||
|
// Fetch and show startup alerts (critical errors like outdated ComfyUI)
|
||||||
|
// Poll until extensionManager.toast is ready (set in Vue onMounted)
|
||||||
|
const showStartupAlerts = async () => {
|
||||||
|
let toastWaitCount = 0;
|
||||||
|
const waitForToast = () => {
|
||||||
|
if (window['app']?.extensionManager?.toast) {
|
||||||
|
fetch('/manager/startup_alerts')
|
||||||
|
.then(response => response.ok ? response.json() : [])
|
||||||
|
.then(alerts => {
|
||||||
|
for (const alert of alerts) {
|
||||||
|
customAlert(alert.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(e => console.warn('[ComfyUI-Manager] Failed to fetch startup alerts:', e));
|
||||||
|
} else if (toastWaitCount < 300) { // Max 30 seconds (300 * 100ms)
|
||||||
|
toastWaitCount++;
|
||||||
|
setTimeout(waitForToast, 100);
|
||||||
|
} else {
|
||||||
|
console.warn('[ComfyUI-Manager] Timeout waiting for toast. Startup alerts skipped.');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
waitForToast();
|
||||||
|
};
|
||||||
|
showStartupAlerts();
|
||||||
|
|
||||||
const menu = document.querySelector(".comfy-menu");
|
const menu = document.querySelector(".comfy-menu");
|
||||||
const separator = document.createElement("hr");
|
const separator = document.createElement("hr");
|
||||||
|
|
||||||
|
|||||||
40
js/common.js
40
js/common.js
@ -100,6 +100,19 @@ export function show_message(msg) {
|
|||||||
app.ui.dialog.element.style.zIndex = 1100;
|
app.ui.dialog.element.style.zIndex = 1100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function handle403Response(res, defaultMessage) {
|
||||||
|
try {
|
||||||
|
const data = await res.json();
|
||||||
|
if(data.error === 'comfyui_outdated') {
|
||||||
|
show_message('ComfyUI version is outdated.<BR>Please update ComfyUI to use Manager normally.');
|
||||||
|
} else {
|
||||||
|
show_message(defaultMessage || 'This action is not allowed with this security level configuration.');
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
show_message(defaultMessage || 'This action is not allowed with this security level configuration.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function sleep(ms) {
|
export async function sleep(ms) {
|
||||||
return new Promise(resolve => setTimeout(resolve, ms));
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
}
|
}
|
||||||
@ -163,20 +176,23 @@ export async function customPrompt(title, message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function rebootAPI() {
|
export async function rebootAPI() {
|
||||||
if ('electronAPI' in window) {
|
if ('electronAPI' in window) {
|
||||||
window.electronAPI.restartApp();
|
window.electronAPI.restartApp();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
customConfirm("Are you sure you'd like to reboot the server?").then((isConfirmed) => {
|
const isConfirmed = await customConfirm("Are you sure you'd like to reboot the server?");
|
||||||
if (isConfirmed) {
|
if (isConfirmed) {
|
||||||
try {
|
try {
|
||||||
api.fetchApi("/manager/reboot");
|
const response = await api.fetchApi("/manager/reboot");
|
||||||
|
if (response.status == 403) {
|
||||||
|
await handle403Response(response);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
catch(exception) {}
|
|
||||||
}
|
}
|
||||||
});
|
catch(exception) {}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -216,7 +232,7 @@ export async function install_pip(packages) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(res.status == 403) {
|
if(res.status == 403) {
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
await handle403Response(res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,7 +267,7 @@ export async function install_via_git_url(url, manager_dialog) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(res.status == 403) {
|
if(res.status == 403) {
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
await handle403Response(res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,9 +278,9 @@ export async function install_via_git_url(url, manager_dialog) {
|
|||||||
const self = this;
|
const self = this;
|
||||||
|
|
||||||
rebootButton.addEventListener("click",
|
rebootButton.addEventListener("click",
|
||||||
function() {
|
async function() {
|
||||||
if(rebootAPI()) {
|
if(await rebootAPI()) {
|
||||||
manager_dialog.close();
|
manager_instance.close();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import {
|
|||||||
fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt,
|
fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt,
|
||||||
sanitizeHTML, infoToast, showTerminal, setNeedRestart,
|
sanitizeHTML, infoToast, showTerminal, setNeedRestart,
|
||||||
storeColumnWidth, restoreColumnWidth, getTimeAgo, copyText, loadCss,
|
storeColumnWidth, restoreColumnWidth, getTimeAgo, copyText, loadCss,
|
||||||
showPopover, hidePopover
|
showPopover, hidePopover, handle403Response
|
||||||
} from "./common.js";
|
} from "./common.js";
|
||||||
|
|
||||||
// https://cenfun.github.io/turbogrid/api.html
|
// https://cenfun.github.io/turbogrid/api.html
|
||||||
@ -1528,7 +1528,16 @@ export class CustomNodesManager {
|
|||||||
errorMsg = `'${item.title}': `;
|
errorMsg = `'${item.title}': `;
|
||||||
|
|
||||||
if(res.status == 403) {
|
if(res.status == 403) {
|
||||||
errorMsg += `This action is not allowed with this security level configuration.\n`;
|
try {
|
||||||
|
const data = await res.json();
|
||||||
|
if(data.error === 'comfyui_outdated') {
|
||||||
|
errorMsg += `ComfyUI version is outdated. Please update ComfyUI to use Manager normally.\n`;
|
||||||
|
} else {
|
||||||
|
errorMsg += `This action is not allowed with this security level configuration.\n`;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
errorMsg += `This action is not allowed with this security level configuration.\n`;
|
||||||
|
}
|
||||||
} else if(res.status == 404) {
|
} else if(res.status == 404) {
|
||||||
errorMsg += `With the current security level configuration, only custom nodes from the <B>"default channel"</B> can be installed.\n`;
|
errorMsg += `With the current security level configuration, only custom nodes from the <B>"default channel"</B> can be installed.\n`;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { app } from "../../scripts/app.js";
|
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, loadCss
|
storeColumnWidth, restoreColumnWidth, loadCss, handle403Response
|
||||||
} from "./common.js";
|
} from "./common.js";
|
||||||
import { api } from "../../scripts/api.js";
|
import { api } from "../../scripts/api.js";
|
||||||
|
|
||||||
@ -477,7 +477,16 @@ export class ModelManager {
|
|||||||
errorMsg = `'${item.name}': `;
|
errorMsg = `'${item.name}': `;
|
||||||
|
|
||||||
if(res.status == 403) {
|
if(res.status == 403) {
|
||||||
errorMsg += `This action is not allowed with this security level configuration.\n`;
|
try {
|
||||||
|
const data = await res.json();
|
||||||
|
if(data.error === 'comfyui_outdated') {
|
||||||
|
errorMsg += `ComfyUI version is outdated. Please update ComfyUI to use Manager normally.\n`;
|
||||||
|
} else {
|
||||||
|
errorMsg += `This action is not allowed with this security level configuration.\n`;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
errorMsg += `This action is not allowed with this security level configuration.\n`;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
errorMsg += await res.text() + '\n';
|
errorMsg += await res.text() + '\n';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { app } from "../../scripts/app.js";
|
import { app } from "../../scripts/app.js";
|
||||||
import { api } from "../../scripts/api.js"
|
import { api } from "../../scripts/api.js"
|
||||||
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
||||||
import { manager_instance, rebootAPI, show_message } from "./common.js";
|
import { manager_instance, rebootAPI, show_message, handle403Response } from "./common.js";
|
||||||
|
|
||||||
|
|
||||||
async function restore_snapshot(target) {
|
async function restore_snapshot(target) {
|
||||||
@ -10,7 +10,7 @@ async function restore_snapshot(target) {
|
|||||||
const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" });
|
const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" });
|
||||||
|
|
||||||
if(response.status == 403) {
|
if(response.status == 403) {
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
await handle403Response(response);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ async function remove_snapshot(target) {
|
|||||||
const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" });
|
const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" });
|
||||||
|
|
||||||
if(response.status == 403) {
|
if(response.status == 403) {
|
||||||
show_message('This action is not allowed with this security level configuration.');
|
await handle403Response(response);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,8 +145,8 @@ export class SnapshotManager extends ComfyDialog {
|
|||||||
if(btn_id) {
|
if(btn_id) {
|
||||||
const rebootButton = document.getElementById(btn_id);
|
const rebootButton = document.getElementById(btn_id);
|
||||||
const self = this;
|
const self = this;
|
||||||
rebootButton.onclick = function() {
|
rebootButton.onclick = async function() {
|
||||||
if(rebootAPI()) {
|
if(await rebootAPI()) {
|
||||||
self.close();
|
self.close();
|
||||||
self.manager_dialog.close();
|
self.manager_dialog.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,126 @@
|
|||||||
{
|
{
|
||||||
"custom_nodes": [
|
"custom_nodes": [
|
||||||
|
{
|
||||||
|
"author": "krakenunbound",
|
||||||
|
"title": "Kraken Discord Bot",
|
||||||
|
"id": "kraken-discord-bot",
|
||||||
|
"reference": "https://github.com/krakenunbound/kraken-discord-bot",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/krakenunbound/kraken-discord-bot"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "All-in-one Discord bot node for AI image generation. Simple setup - just add token, select model, and queue. Includes style presets, rate limiting, and queue management."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "quinteroac",
|
||||||
|
"title": "comfyui_api_executor_nodes",
|
||||||
|
"reference": "https://github.com/quinteroac/comfyui_api_executor_nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/quinteroac/comfyui_api_executor_nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Custom nodes for ComfyUI that enable workflow execution via API (internal or external), as well as input/output handling and workflow selection."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Chang-Jin-Lee",
|
||||||
|
"title": "ComfyUI-PromptMixer-AI [WIP]",
|
||||||
|
"reference": "https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI custom node collection for unified control of checkpoints, steps, CFG, samplers, LoRA and prompt parameters with local LLM integration. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "leacvikas0",
|
||||||
|
"title": "ComfyUI-Presence [WIP]",
|
||||||
|
"reference": "https://github.com/leacvikas0/ComfyUI-Presence",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/leacvikas0/ComfyUI-Presence"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "NODES: BeautifulTextNode, FluxAdaptiveInjector, InspectNode, PresenceDirector, PresenceDirectorFireworks, PresenceDirectorVertex, PresenceSaver, UnaliverBundlePreview, UnaliverNode, UnaliverPlanner, UnaliverStepIterato, ...\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Kraven1109",
|
||||||
|
"title": "ComfyUI-Llama [NAME CONFLICT]",
|
||||||
|
"reference": "https://github.com/Kraven1109/ComfyUI-Llama",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Kraven1109/ComfyUI-Llama"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Lightweight ComfyUI plugin exposing llama.cpp-based one-shot Qwen VQA nodes."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "xiaoxidashen",
|
||||||
|
"title": "comfyui_my_utils",
|
||||||
|
"reference": "https://github.com/xiaoxidashen/comfyui_my_utils",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/xiaoxidashen/comfyui_my_utils"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Guide and utilities for creating ComfyUI custom nodes with image/video preview functionality. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "agavesunset",
|
||||||
|
"title": "ComfyUI_LoRA_Tracker",
|
||||||
|
"reference": "https://github.com/agavesunset/ComfyUI_LoRA_Tracker",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/agavesunset/ComfyUI_LoRA_Tracker"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI node for tracking and displaying LoRA parameters. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "anilsathyan7",
|
||||||
|
"title": "ComfyUI-Crystal-Upscaler",
|
||||||
|
"reference": "https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI custom node for image upscaling using crystal upscaling technology. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "SleazySleaze",
|
||||||
|
"title": "aesthetic-persona-comfyui-node",
|
||||||
|
"reference": "https://github.com/SleazySleaze/aesthetic-persona-comfyui-node",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/SleazySleaze/aesthetic-persona-comfyui-node"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Node providing aesthetic persona parsing capabilities for ComfyUI. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "xtanqn",
|
||||||
|
"title": "comfyui-xishen [WIP]",
|
||||||
|
"reference": "https://github.com/xtanqn/comfyui-xishen",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/xtanqn/comfyui-xishen"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A custom node for ComfyUI that generates random numbers as text output.\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "heyburns",
|
||||||
|
"title": "ComfyUI-Logic-Redux [WIP]",
|
||||||
|
"reference": "https://github.com/heyburns/ComfyUI-Logic-Redux",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/heyburns/ComfyUI-Logic-Redux"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Validation-friendly rewrite of ComfyUI Logic nodes with drop-in compatibility, featuring compare, int/float/bool/string pass-through, ternary logic, and debug nodes. (Description by CC)\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Mohamed-Sakr",
|
||||||
|
"title": "ComfyUI-SimpleMarkdown [UNSAFE]",
|
||||||
|
"reference": "https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A simple markdown node for ComfyUI[w/This nodepack has a frontend vulnerability.]"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "starsFriday",
|
"author": "starsFriday",
|
||||||
"title": "ComfyUI-Tracker-Person [WIP]",
|
"title": "ComfyUI-Tracker-Person [WIP]",
|
||||||
@ -1203,16 +1324,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "NODES: Image Size Input, Date/Time based output path"
|
"description": "NODES: Image Size Input, Date/Time based output path"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "octapus8085",
|
|
||||||
"title": "OpenAI-comfyui-O",
|
|
||||||
"reference": "https://github.com/Spicely/Comfyui-File-Utils",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Spicely/Comfyui-File-Utils"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This plugin provides multiple file-handling and utility nodes for ComfyUI, including: image saving, audio saving, video saving, video composition, audio-to-subtitle conversion, and random number generation nodes. These nodes not only process files but also return their absolute file paths.\nNOTE: The files in the repo are not organized.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "octapus8085",
|
"author": "octapus8085",
|
||||||
"title": "OpenAI-comfyui-O",
|
"title": "OpenAI-comfyui-O",
|
||||||
|
|||||||
@ -340,6 +340,8 @@
|
|||||||
"ImageBlendText",
|
"ImageBlendText",
|
||||||
"ImageBlendV1",
|
"ImageBlendV1",
|
||||||
"ImageRatioCrop",
|
"ImageRatioCrop",
|
||||||
|
"Load_Images_Advance",
|
||||||
|
"Load_Images_V1",
|
||||||
"PDEmptyRatioLatent",
|
"PDEmptyRatioLatent",
|
||||||
"PDIMAGE_ImageCombine",
|
"PDIMAGE_ImageCombine",
|
||||||
"PDIMAGE_LongerSize",
|
"PDIMAGE_LongerSize",
|
||||||
@ -349,18 +351,29 @@
|
|||||||
"PDImageResizeV2",
|
"PDImageResizeV2",
|
||||||
"PDImageResizeV3",
|
"PDImageResizeV3",
|
||||||
"PDImageToRatioV1",
|
"PDImageToRatioV1",
|
||||||
|
"PDJSON_BatchJsonIncremental",
|
||||||
|
"PDJSON_Group",
|
||||||
"PDStringConcate",
|
"PDStringConcate",
|
||||||
"PDStringInput",
|
"PDStringInput",
|
||||||
"PDTEXT_SAVE_PATH",
|
"PDTEXT_SAVE_PATH",
|
||||||
|
"PD_AitoolkitTrainingRedux",
|
||||||
"PD_BatchCropBlackBorder",
|
"PD_BatchCropBlackBorder",
|
||||||
|
"PD_CaptionJSONEditor",
|
||||||
|
"PD_CaptionJSONParser",
|
||||||
"PD_CropBorder",
|
"PD_CropBorder",
|
||||||
|
"PD_Extract_Image",
|
||||||
"PD_GetImageRatio",
|
"PD_GetImageRatio",
|
||||||
"PD_GetImageSize",
|
"PD_GetImageSize",
|
||||||
|
"PD_ImageFileTraining",
|
||||||
"PD_ImageListForSort",
|
"PD_ImageListForSort",
|
||||||
"PD_ImageListForSortWithMetadata",
|
"PD_ImageListForSortWithMetadata",
|
||||||
|
"PD_ImageSearch",
|
||||||
|
"PD_ImageSize34Compose",
|
||||||
"PD_Image_Crop_Location",
|
"PD_Image_Crop_Location",
|
||||||
"PD_Image_Rotate_v1",
|
"PD_Image_Rotate_v1",
|
||||||
"PD_Image_centerCrop",
|
"PD_Image_centerCrop",
|
||||||
|
"PD_JoinStringMultiLine",
|
||||||
|
"PD_LoadImageMetadata",
|
||||||
"PD_LoadImagesFromDir",
|
"PD_LoadImagesFromDir",
|
||||||
"PD_LoadImagesFromZip",
|
"PD_LoadImagesFromZip",
|
||||||
"PD_LoadTextsFromDir",
|
"PD_LoadTextsFromDir",
|
||||||
@ -370,15 +383,36 @@
|
|||||||
"PD_Mask Selector By Area Left",
|
"PD_Mask Selector By Area Left",
|
||||||
"PD_MaskFillHoles",
|
"PD_MaskFillHoles",
|
||||||
"PD_MaskRemoveSmallObjects",
|
"PD_MaskRemoveSmallObjects",
|
||||||
|
"PD_ModelLoraLoader",
|
||||||
"PD_RemoveBlackBackground",
|
"PD_RemoveBlackBackground",
|
||||||
"PD_RemoveColorWords",
|
"PD_RemoveColorWords",
|
||||||
"PD_RemoveWhiteBorder",
|
"PD_RemoveWhiteBorder",
|
||||||
|
"PD_RenameV2",
|
||||||
|
"PD_SAVE_PATH2",
|
||||||
|
"PD_SaveTextPathAndName",
|
||||||
"PD_ShowText",
|
"PD_ShowText",
|
||||||
|
"PD_StringLineCount",
|
||||||
|
"PD_StringToCaptionJSON",
|
||||||
|
"PD_TensorTraining",
|
||||||
"PD_Text Overlay Node",
|
"PD_Text Overlay Node",
|
||||||
|
"PD_TextListPack",
|
||||||
|
"PD_TextListSort",
|
||||||
|
"PD_TextListStringAddWord",
|
||||||
|
"PD_TextListUnpack",
|
||||||
|
"PD_TxtBatchRename",
|
||||||
|
"PD_Zip_Simple",
|
||||||
"PD_del_word",
|
"PD_del_word",
|
||||||
"PD_empty_word",
|
"PD_empty_word",
|
||||||
|
"PD_image_coversaver",
|
||||||
|
"PD_image_ratio_size",
|
||||||
"PD_image_to_text_v1",
|
"PD_image_to_text_v1",
|
||||||
|
"PD_imagesave_path",
|
||||||
|
"PD_load_image_v1",
|
||||||
|
"PD_name_replacewordorder",
|
||||||
|
"PD_number_star",
|
||||||
|
"PD_number_start",
|
||||||
"PD_random_prompt",
|
"PD_random_prompt",
|
||||||
|
"PD_rename_image",
|
||||||
"PDbananaImagesizeByRatio",
|
"PDbananaImagesizeByRatio",
|
||||||
"PDimage_corp_v1",
|
"PDimage_corp_v1",
|
||||||
"PDimage_corp_v2",
|
"PDimage_corp_v2",
|
||||||
@ -1219,6 +1253,17 @@
|
|||||||
"title_aux": "ComfyUi-Text-Tiler"
|
"title_aux": "ComfyUi-Text-Tiler"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Chang-Jin-Lee/ComfyUI-PromptMixer-AI": [
|
||||||
|
[
|
||||||
|
"FavoritePromptMixer",
|
||||||
|
"FreeAIPrompt",
|
||||||
|
"FreeAIPromptGenerate",
|
||||||
|
"Load_Text_Batch_Simple"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-PromptMixer-AI [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Chargeuk/ComfyUI-vts-nodes": [
|
"https://github.com/Chargeuk/ComfyUI-vts-nodes": [
|
||||||
[
|
[
|
||||||
"VTS Add Text To list",
|
"VTS Add Text To list",
|
||||||
@ -2327,6 +2372,22 @@
|
|||||||
"title_aux": "ComfyUI Dynamic Prompting Simplified [WIP]"
|
"title_aux": "ComfyUI Dynamic Prompting Simplified [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Kraven1109/ComfyUI-Llama": [
|
||||||
|
[
|
||||||
|
"ComfyLLama",
|
||||||
|
"ComfyLLamaPreviewText",
|
||||||
|
"ComfyLLamaPromptBuilder",
|
||||||
|
"ComfyLLamaSaveText",
|
||||||
|
"ComfyLLamaServer",
|
||||||
|
"ComfyLLamaTextConcat",
|
||||||
|
"ComfyLLamaTextInput",
|
||||||
|
"GGUFLoader",
|
||||||
|
"MediaPathsLoader"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Llama [NAME CONFLICT]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Krish-701/RK_Comfyui": [
|
"https://github.com/Krish-701/RK_Comfyui": [
|
||||||
[
|
[
|
||||||
"RK_Accumulate_Text_Multiline",
|
"RK_Accumulate_Text_Multiline",
|
||||||
@ -2440,61 +2501,36 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/LSDJesus/ComfyUI-Luna-Collection": [
|
"https://github.com/LSDJesus/ComfyUI-Luna-Collection": [
|
||||||
[
|
[
|
||||||
"LunaAssembler",
|
"LunaBatchPromptExtractor",
|
||||||
"LunaBasePrompt",
|
"LunaBatchPromptLoader",
|
||||||
"LunaCacheManager",
|
|
||||||
"LunaCheckpointLoader",
|
"LunaCheckpointLoader",
|
||||||
|
"LunaCheckpointTunnel",
|
||||||
"LunaCivitaiBatchScraper",
|
"LunaCivitaiBatchScraper",
|
||||||
"LunaCivitaiScraper",
|
"LunaCivitaiScraper",
|
||||||
"LunaConditionals",
|
"LunaConfigGateway",
|
||||||
"LunaConnectionEditor",
|
"LunaConnectionEditor",
|
||||||
"LunaConnectionMatcher",
|
"LunaConnectionMatcher",
|
||||||
"LunaConnectionStats",
|
"LunaConnectionStats",
|
||||||
"LunaDaemonConfig",
|
"LunaDaemonCLIPLoader",
|
||||||
"LunaDaemonConfigFromLoaders",
|
"LunaDaemonVAELoader",
|
||||||
"LunaDaemonModelSwitch",
|
"LunaDimensionScaler",
|
||||||
"LunaDaemonStatus",
|
"LunaDynamicModelLoader",
|
||||||
"LunaEmbeddingCache",
|
|
||||||
"LunaEmbeddingManager",
|
"LunaEmbeddingManager",
|
||||||
"LunaEmbeddingManagerRandom",
|
|
||||||
"LunaExpanders",
|
|
||||||
"LunaExpressionBatchSaver",
|
|
||||||
"LunaExpressionList",
|
|
||||||
"LunaExpressionPromptBuilder",
|
"LunaExpressionPromptBuilder",
|
||||||
"LunaExpressionSheetSlicer",
|
"LunaExpressionSlicerSaver",
|
||||||
"LunaListPreprocessedPrompts",
|
"LunaGGUFBatchConverter",
|
||||||
"LunaLoRALinker",
|
"LunaGGUFConverter",
|
||||||
"LunaLoRARandomizer",
|
"LunaLoRARandomizer",
|
||||||
"LunaLoRAStacker",
|
"LunaLoRAStacker",
|
||||||
"LunaLoRAStackerRandom",
|
"LunaLoRATriggerInjector",
|
||||||
"LunaLoadParameters",
|
"LunaLoRAValidator",
|
||||||
"LunaLoadPreprocessedPrompt",
|
|
||||||
"LunaLogicResolver",
|
|
||||||
"LunaModifiers",
|
|
||||||
"LunaModifyPreprocessedPrompt",
|
|
||||||
"LunaMultiSaver",
|
"LunaMultiSaver",
|
||||||
"LunaOptimizedPreprocessedLoader",
|
"LunaOptimizedWeightsManager",
|
||||||
"LunaParametersBridge",
|
"LunaPromptCraft",
|
||||||
"LunaPerformanceCondition",
|
"LunaPromptCraftDebug",
|
||||||
"LunaPerformanceDisplay",
|
|
||||||
"LunaPerformanceLogger",
|
|
||||||
"LunaPerformanceMonitor",
|
|
||||||
"LunaPerformanceStatsConcat",
|
|
||||||
"LunaPromptPreprocessor",
|
|
||||||
"LunaSampler",
|
|
||||||
"LunaSaveNegativePrompt",
|
|
||||||
"LunaSelectPromptFolder",
|
|
||||||
"LunaSharedCLIPEncode",
|
|
||||||
"LunaSharedCLIPEncodeDual",
|
|
||||||
"LunaSharedCLIPEncodeSDXL",
|
|
||||||
"LunaSharedVAEDecode",
|
|
||||||
"LunaSharedVAEEncode",
|
|
||||||
"LunaSinglePromptProcessor",
|
|
||||||
"LunaSmartLoRALinker",
|
"LunaSmartLoRALinker",
|
||||||
"LunaTextProcessor",
|
"LunaUNetTunnel",
|
||||||
"LunaUnifiedPromptProcessor",
|
|
||||||
"LunaWildcardBuilder",
|
"LunaWildcardBuilder",
|
||||||
"LunaWildcardPromptGenerator",
|
|
||||||
"LunaYAMLInjector",
|
"LunaYAMLInjector",
|
||||||
"LunaYAMLPathExplorer",
|
"LunaYAMLPathExplorer",
|
||||||
"LunaYAMLWildcard",
|
"LunaYAMLWildcard",
|
||||||
@ -2650,12 +2686,19 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/LvyuanW/ComfyUI-6yuan": [
|
"https://github.com/LvyuanW/ComfyUI-6yuan": [
|
||||||
[
|
[
|
||||||
|
"6yuan_DrawTextNode",
|
||||||
"ColorKMeans",
|
"ColorKMeans",
|
||||||
"CropAlpha",
|
"CropAlpha",
|
||||||
|
"PosterColorEngine",
|
||||||
|
"PosterLogoPlacer",
|
||||||
|
"PosterMaskGenerator",
|
||||||
|
"PosterTemplateLoader",
|
||||||
|
"PosterTextRenderer",
|
||||||
"RemoveBackground",
|
"RemoveBackground",
|
||||||
"RemoveBackgroundAdvanced",
|
"RemoveBackgroundAdvanced",
|
||||||
"ShapeLanguageSummary",
|
"ShapeLanguageSummary",
|
||||||
"ShrinkImage",
|
"ShrinkImage",
|
||||||
|
"SimpleTextLayout",
|
||||||
"StringPreview"
|
"StringPreview"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@ -2936,6 +2979,14 @@
|
|||||||
"title_aux": "ComfyUI_mickster_nodes [WIP]"
|
"title_aux": "ComfyUI_mickster_nodes [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown": [
|
||||||
|
[
|
||||||
|
"SimpleMarkdownPreview"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-SimpleMarkdown [UNSAFE]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/MrAdamBlack/CheckProgress": [
|
"https://github.com/MrAdamBlack/CheckProgress": [
|
||||||
[
|
[
|
||||||
"CHECK_PROGRESS"
|
"CHECK_PROGRESS"
|
||||||
@ -3435,31 +3486,76 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/PozzettiAndrea/ComfyUI-CADabra": [
|
"https://github.com/PozzettiAndrea/ComfyUI-CADabra": [
|
||||||
[
|
[
|
||||||
|
"BGPSegSegmentation",
|
||||||
"BrepGeneration",
|
"BrepGeneration",
|
||||||
|
"CADAnalysisViewer",
|
||||||
|
"CADCheckOverlappingFaces",
|
||||||
|
"CADConnectedComponents",
|
||||||
|
"CADCountFaces",
|
||||||
|
"CADDepthMapHybrid",
|
||||||
|
"CADEdgeAnalysis",
|
||||||
|
"CADEdgeDetailAnalyzer",
|
||||||
|
"CADEdgeViewer",
|
||||||
|
"CADEstimateGapTolerance",
|
||||||
|
"CADExtractFaces",
|
||||||
"CADFaceAnalysis",
|
"CADFaceAnalysis",
|
||||||
|
"CADFillMaskBiharmonic",
|
||||||
|
"CADFillMaskBiharmonicMask",
|
||||||
|
"CADFixDegenerateFaces",
|
||||||
|
"CADGetFaceInfo",
|
||||||
|
"CADGetFilename",
|
||||||
|
"CADGetMetadata",
|
||||||
|
"CADHealShape",
|
||||||
|
"CADMergeVertices",
|
||||||
|
"CADProjectFacesXY",
|
||||||
|
"CADROISelector",
|
||||||
|
"CADRaytracerBVH",
|
||||||
|
"CADRecodeInference",
|
||||||
|
"CADSave",
|
||||||
|
"CADSewFaces",
|
||||||
|
"CADSplitComponents",
|
||||||
"CAD_Convert_Format",
|
"CAD_Convert_Format",
|
||||||
|
"CAD_Load",
|
||||||
"CAD_Load_From_Folder",
|
"CAD_Load_From_Folder",
|
||||||
"CAD_Load_Gmsh",
|
|
||||||
"CAD_Mesh_Gmsh",
|
"CAD_Mesh_Gmsh",
|
||||||
"CAD_Mesh_Gmsh_Advanced",
|
"CAD_Mesh_Gmsh_Advanced",
|
||||||
"CAD_Quality_Metrics",
|
"CAD_Quality_Metrics",
|
||||||
"CAD_Remesh_OCC",
|
"CAD_Remesh_OCC",
|
||||||
|
"CAD_Remesh_OCC_Advanced",
|
||||||
|
"CadQueryExecute",
|
||||||
|
"CadrilleImageInference",
|
||||||
|
"CadrilleInference",
|
||||||
|
"CadrilleTextInference",
|
||||||
|
"LoadBGPSegModels",
|
||||||
|
"LoadCADRecodeModel",
|
||||||
|
"LoadCadrilleModel",
|
||||||
|
"LoadNeurCADReconModel",
|
||||||
"LoadPoint2CADModel",
|
"LoadPoint2CADModel",
|
||||||
"LoadPointCloudXYZ",
|
"LoadPointCloudXYZ",
|
||||||
|
"LoadSECADNetModel",
|
||||||
|
"LoadSurfaceParams",
|
||||||
"ML_FeatureDetection",
|
"ML_FeatureDetection",
|
||||||
"ML_SurfaceRecon",
|
"ML_SurfaceRecon",
|
||||||
"MeshFaceSegmentation",
|
"MeshFaceSegmentation",
|
||||||
"MeshSegmentToPointCloud",
|
"MeshSegmentToPointCloud",
|
||||||
|
"MeshToVoxel",
|
||||||
"Mesh_Optimize_Gmsh",
|
"Mesh_Optimize_Gmsh",
|
||||||
|
"NeurCADReconInference",
|
||||||
|
"NeurCADReconLoadCheckpoint",
|
||||||
|
"NeurCADReconTrain",
|
||||||
"Point2CADExportBrep",
|
"Point2CADExportBrep",
|
||||||
"Point2CADSegmentation",
|
"Point2CADSegmentation",
|
||||||
"Point2CADSurfaceFitting",
|
"Point2CADSurfaceFitting",
|
||||||
|
"Point2CADSurfaceFittingOCC",
|
||||||
"Point2CADTopologyExtraction",
|
"Point2CADTopologyExtraction",
|
||||||
"PointCloudSegmentation",
|
"PointCloudSegmentation",
|
||||||
"PreviewCADBatch",
|
"PreviewCADBatch",
|
||||||
"PreviewCADOCC",
|
"PreviewCADOCC",
|
||||||
"PrimitiveFitting",
|
"PrimitiveFitting",
|
||||||
"QuadRemesh"
|
"QuadRemesh",
|
||||||
|
"SECADNetFinetune",
|
||||||
|
"SECADNetInference",
|
||||||
|
"SaveSurfaceParams"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "CADabra [WIP]"
|
"title_aux": "CADabra [WIP]"
|
||||||
@ -3502,11 +3598,15 @@
|
|||||||
"LoadBVHFromFolder",
|
"LoadBVHFromFolder",
|
||||||
"LoadFBXCharacter",
|
"LoadFBXCharacter",
|
||||||
"LoadGVHMRModels",
|
"LoadGVHMRModels",
|
||||||
|
"LoadSAM3DBodyModels",
|
||||||
"LoadSMPL",
|
"LoadSMPL",
|
||||||
|
"MHRViewer",
|
||||||
|
"SAM3DVideoInference",
|
||||||
"SMPLRetargetToSMPL",
|
"SMPLRetargetToSMPL",
|
||||||
"SMPLToFBX",
|
"SMPLToFBX",
|
||||||
"SMPLViewer",
|
"SMPLViewer",
|
||||||
"SMPLtoBVH",
|
"SMPLtoBVH",
|
||||||
|
"SaveMHR",
|
||||||
"SaveSMPL"
|
"SaveSMPL"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@ -3675,8 +3775,10 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Rizzlord/ComfyUI-SeqTex": [
|
"https://github.com/Rizzlord/ComfyUI-SeqTex": [
|
||||||
[
|
[
|
||||||
|
"SeqTex_DisplaceMesh",
|
||||||
"SeqTex_Load_Mesh",
|
"SeqTex_Load_Mesh",
|
||||||
"SeqTex_Loader",
|
"SeqTex_Loader",
|
||||||
|
"SeqTex_ProjectTexture",
|
||||||
"SeqTex_Step1_ProcessMesh",
|
"SeqTex_Step1_ProcessMesh",
|
||||||
"SeqTex_Step2_GenerateCondition",
|
"SeqTex_Step2_GenerateCondition",
|
||||||
"SeqTex_Step3_GenerateTexture",
|
"SeqTex_Step3_GenerateTexture",
|
||||||
@ -3704,6 +3806,7 @@
|
|||||||
"List Image Path \ud83d\udc24",
|
"List Image Path \ud83d\udc24",
|
||||||
"List Model Path \ud83d\udc24",
|
"List Model Path \ud83d\udc24",
|
||||||
"List Video Path \ud83d\udc24",
|
"List Video Path \ud83d\udc24",
|
||||||
|
"Load Image Base64 \ud83d\udc24",
|
||||||
"Peaks Weights Generator \ud83d\udc24"
|
"Peaks Weights Generator \ud83d\udc24"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@ -3963,6 +4066,14 @@
|
|||||||
"title_aux": "multigpu_diffusion_comfyui"
|
"title_aux": "multigpu_diffusion_comfyui"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/SleazySleaze/aesthetic-persona-comfyui-node": [
|
||||||
|
[
|
||||||
|
"AestheticPersonaParser"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "aesthetic-persona-comfyui-node"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Slix-M-Lestragg/comfyui-enhanced": [
|
"https://github.com/Slix-M-Lestragg/comfyui-enhanced": [
|
||||||
[
|
[
|
||||||
"Range Iterator"
|
"Range Iterator"
|
||||||
@ -4034,19 +4145,6 @@
|
|||||||
"title_aux": "ComfyUI_Remaker_FaceSwap"
|
"title_aux": "ComfyUI_Remaker_FaceSwap"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Spicely/Comfyui-File-Utils": [
|
|
||||||
[
|
|
||||||
"AudioToSubtitle",
|
|
||||||
"RandomFloat",
|
|
||||||
"SaveAudioWithPath",
|
|
||||||
"SaveImageWithPath",
|
|
||||||
"SaveVideoWithPath",
|
|
||||||
"VideoCompose"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "OpenAI-comfyui-O"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/Stable-X/ComfyUI-Hi3DGen": [
|
"https://github.com/Stable-X/ComfyUI-Hi3DGen": [
|
||||||
[
|
[
|
||||||
"DifferenceExtractorNode",
|
"DifferenceExtractorNode",
|
||||||
@ -4940,6 +5038,14 @@
|
|||||||
"title_aux": "ComfyUI-OpenPoser [WIP]"
|
"title_aux": "ComfyUI-OpenPoser [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/agavesunset/ComfyUI_LoRA_Tracker": [
|
||||||
|
[
|
||||||
|
"LoRAParameterOverlay"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI_LoRA_Tracker"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/ahkimkoo/ComfyUI-OSS-Upload": [
|
"https://github.com/ahkimkoo/ComfyUI-OSS-Upload": [
|
||||||
[
|
[
|
||||||
"OSSAudioUploader",
|
"OSSAudioUploader",
|
||||||
@ -5193,6 +5299,14 @@
|
|||||||
"title_aux": "ComfyUI-Legendary-Nodes"
|
"title_aux": "ComfyUI-Legendary-Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/anilsathyan7/ComfyUI-Crystal-Upscaler": [
|
||||||
|
[
|
||||||
|
"CrystalUpscalerNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Crystal-Upscaler"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/animEEEmpire/ComfyUI-Animemory-Loader": [
|
"https://github.com/animEEEmpire/ComfyUI-Animemory-Loader": [
|
||||||
[
|
[
|
||||||
"AnimemoryNode"
|
"AnimemoryNode"
|
||||||
@ -5398,10 +5512,14 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/bakker/BK_Utils": [
|
"https://github.com/bakker/BK_Utils": [
|
||||||
[
|
[
|
||||||
|
"DynamicGroupSwitchMulti",
|
||||||
|
"FileNameDefinition",
|
||||||
"FluxPromptSaver",
|
"FluxPromptSaver",
|
||||||
"FluxTextSampler",
|
"FluxTextSampler",
|
||||||
|
"IsOneOfGroupsActive",
|
||||||
"ModelName",
|
"ModelName",
|
||||||
"SamePixelResolutionCalculator"
|
"SamePixelResolutionCalculator",
|
||||||
|
"ZImageTurboResolutions"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "BK_Utils [WIP]"
|
"title_aux": "BK_Utils [WIP]"
|
||||||
@ -6070,6 +6188,8 @@
|
|||||||
"AudioEncoderEncode",
|
"AudioEncoderEncode",
|
||||||
"AudioEncoderLoader",
|
"AudioEncoderLoader",
|
||||||
"AudioMerge",
|
"AudioMerge",
|
||||||
|
"AutogrowNamesTestNode",
|
||||||
|
"AutogrowPrefixTestNode",
|
||||||
"BasicGuider",
|
"BasicGuider",
|
||||||
"BasicScheduler",
|
"BasicScheduler",
|
||||||
"BetaSamplingScheduler",
|
"BetaSamplingScheduler",
|
||||||
@ -6095,6 +6215,7 @@
|
|||||||
"CLIPTextEncodeFlux",
|
"CLIPTextEncodeFlux",
|
||||||
"CLIPTextEncodeHiDream",
|
"CLIPTextEncodeHiDream",
|
||||||
"CLIPTextEncodeHunyuanDiT",
|
"CLIPTextEncodeHunyuanDiT",
|
||||||
|
"CLIPTextEncodeKandinsky5",
|
||||||
"CLIPTextEncodeLumina2",
|
"CLIPTextEncodeLumina2",
|
||||||
"CLIPTextEncodePixArtAlpha",
|
"CLIPTextEncodePixArtAlpha",
|
||||||
"CLIPTextEncodeSD3",
|
"CLIPTextEncodeSD3",
|
||||||
@ -6108,6 +6229,7 @@
|
|||||||
"CheckpointLoaderSimple",
|
"CheckpointLoaderSimple",
|
||||||
"CheckpointSave",
|
"CheckpointSave",
|
||||||
"ChromaRadianceOptions",
|
"ChromaRadianceOptions",
|
||||||
|
"ComfySwitchNode",
|
||||||
"ConditioningAverage",
|
"ConditioningAverage",
|
||||||
"ConditioningCombine",
|
"ConditioningCombine",
|
||||||
"ConditioningConcat",
|
"ConditioningConcat",
|
||||||
@ -6129,6 +6251,7 @@
|
|||||||
"CosmosPredict2ImageToVideoLatent",
|
"CosmosPredict2ImageToVideoLatent",
|
||||||
"CreateVideo",
|
"CreateVideo",
|
||||||
"CropMask",
|
"CropMask",
|
||||||
|
"DCTestNode",
|
||||||
"DiffControlNetLoader",
|
"DiffControlNetLoader",
|
||||||
"DifferentialDiffusion",
|
"DifferentialDiffusion",
|
||||||
"DiffusersLoader",
|
"DiffusersLoader",
|
||||||
@ -6221,6 +6344,7 @@
|
|||||||
"KSampler",
|
"KSampler",
|
||||||
"KSamplerAdvanced",
|
"KSamplerAdvanced",
|
||||||
"KSamplerSelect",
|
"KSamplerSelect",
|
||||||
|
"Kandinsky5ImageToVideo",
|
||||||
"KarrasScheduler",
|
"KarrasScheduler",
|
||||||
"KlingCameraControlI2VNode",
|
"KlingCameraControlI2VNode",
|
||||||
"KlingCameraControlT2VNode",
|
"KlingCameraControlT2VNode",
|
||||||
@ -6230,6 +6354,12 @@
|
|||||||
"KlingImageGenerationNode",
|
"KlingImageGenerationNode",
|
||||||
"KlingLipSyncAudioToVideoNode",
|
"KlingLipSyncAudioToVideoNode",
|
||||||
"KlingLipSyncTextToVideoNode",
|
"KlingLipSyncTextToVideoNode",
|
||||||
|
"KlingOmniProEditVideoNode",
|
||||||
|
"KlingOmniProFirstLastFrameNode",
|
||||||
|
"KlingOmniProImageNode",
|
||||||
|
"KlingOmniProImageToVideoNode",
|
||||||
|
"KlingOmniProTextToVideoNode",
|
||||||
|
"KlingOmniProVideoToVideoNode",
|
||||||
"KlingSingleImageVideoEffectNode",
|
"KlingSingleImageVideoEffectNode",
|
||||||
"KlingStartEndFrameNode",
|
"KlingStartEndFrameNode",
|
||||||
"KlingTextToVideoNode",
|
"KlingTextToVideoNode",
|
||||||
@ -6332,6 +6462,7 @@
|
|||||||
"MoonvalleyTxt2VideoNode",
|
"MoonvalleyTxt2VideoNode",
|
||||||
"MoonvalleyVideo2VideoNode",
|
"MoonvalleyVideo2VideoNode",
|
||||||
"Morphology",
|
"Morphology",
|
||||||
|
"NormalizeVideoLatentStart",
|
||||||
"OpenAIChatConfig",
|
"OpenAIChatConfig",
|
||||||
"OpenAIChatNode",
|
"OpenAIChatNode",
|
||||||
"OpenAIDalle2",
|
"OpenAIDalle2",
|
||||||
@ -6393,6 +6524,7 @@
|
|||||||
"RenormCFG",
|
"RenormCFG",
|
||||||
"RepeatImageBatch",
|
"RepeatImageBatch",
|
||||||
"RepeatLatentBatch",
|
"RepeatLatentBatch",
|
||||||
|
"ReplaceVideoLatentFrames",
|
||||||
"RescaleCFG",
|
"RescaleCFG",
|
||||||
"ResizeAndPadImage",
|
"ResizeAndPadImage",
|
||||||
"Rodin3D_Detail",
|
"Rodin3D_Detail",
|
||||||
@ -7356,6 +7488,7 @@
|
|||||||
"SceneSelect",
|
"SceneSelect",
|
||||||
"SceneUpdate",
|
"SceneUpdate",
|
||||||
"SceneView",
|
"SceneView",
|
||||||
|
"SceneWanVideoLoraMultiSave",
|
||||||
"SubdirLister",
|
"SubdirLister",
|
||||||
"TailEnhancePro",
|
"TailEnhancePro",
|
||||||
"TailSplit"
|
"TailSplit"
|
||||||
@ -7824,6 +7957,22 @@
|
|||||||
"title_aux": "ComfyUI-CC-ImageLoader [UNSAFE]"
|
"title_aux": "ComfyUI-CC-ImageLoader [UNSAFE]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/heyburns/ComfyUI-Logic-Redux": [
|
||||||
|
[
|
||||||
|
"Bool-\ud83d\udd2c",
|
||||||
|
"Compare-\ud83d\udd2c",
|
||||||
|
"DebugPrint-\ud83d\udd2c",
|
||||||
|
"Float-\ud83d\udd2c",
|
||||||
|
"If ANY execute A else B",
|
||||||
|
"If ANY execute A else B-\ud83d\udd2c",
|
||||||
|
"If ANY return A else B-\ud83d\udd2c",
|
||||||
|
"Int-\ud83d\udd2c",
|
||||||
|
"String-\ud83d\udd2c"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Logic-Redux [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/hhelloe/ComfyuiQuantizerToFp8": [
|
"https://github.com/hhelloe/ComfyuiQuantizerToFp8": [
|
||||||
[
|
[
|
||||||
"FP8QuantizeFormat",
|
"FP8QuantizeFormat",
|
||||||
@ -8068,6 +8217,7 @@
|
|||||||
"Alta:GetImageAndPath",
|
"Alta:GetImageAndPath",
|
||||||
"Alta:GetImageByIndex",
|
"Alta:GetImageByIndex",
|
||||||
"Alta:GetStringByIndex",
|
"Alta:GetStringByIndex",
|
||||||
|
"Alta:IfOnly(Logic)",
|
||||||
"Alta:Int2Str(Math)",
|
"Alta:Int2Str(Math)",
|
||||||
"Alta:JSONKeyExtractor(Util)",
|
"Alta:JSONKeyExtractor(Util)",
|
||||||
"Alta:ListAllFiles",
|
"Alta:ListAllFiles",
|
||||||
@ -8607,14 +8757,18 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/kaski23/Kaskis_Comfy_Nodes": [
|
"https://github.com/kaski23/Kaskis_Comfy_Nodes": [
|
||||||
[
|
[
|
||||||
"CollectVideoNode",
|
"CollectKeyedVideosNode",
|
||||||
|
"CollectVideosNode",
|
||||||
|
"ImageDelay",
|
||||||
"IntToString",
|
"IntToString",
|
||||||
|
"KlingVideoHandler",
|
||||||
"LoadImageWithFilename",
|
"LoadImageWithFilename",
|
||||||
"LoadVideoWithFilename",
|
"LoadVideoWithFilename",
|
||||||
"PairSwitchNode",
|
"PairSwitchNode",
|
||||||
"PreviewImageLimited",
|
"PreviewImageLimited",
|
||||||
"StringSplitSelect",
|
"StringSplitSelect",
|
||||||
"Unbroken-Video-Handler"
|
"Unbroken-Video-Handler",
|
||||||
|
"WorkflowLoggerNode"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Kaskis_Comfy_Nodes"
|
"title_aux": "Kaskis_Comfy_Nodes"
|
||||||
@ -9040,6 +9194,17 @@
|
|||||||
"title_aux": "ComfyUI_LBT [WIP]"
|
"title_aux": "ComfyUI_LBT [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/leacvikas0/ComfyUI-Presence": [
|
||||||
|
[
|
||||||
|
"FluxAdaptiveInjector",
|
||||||
|
"PresenceDirectorFireworks",
|
||||||
|
"PresenceDirectorVertex",
|
||||||
|
"PresenceSaver"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Presence [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/leadbreak/comfyui-faceaging": [
|
"https://github.com/leadbreak/comfyui-faceaging": [
|
||||||
[
|
[
|
||||||
"AgeTransformationNode"
|
"AgeTransformationNode"
|
||||||
@ -9100,7 +9265,9 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools": [
|
"https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools": [
|
||||||
[
|
[
|
||||||
|
"LGGCFX_ImagePreview",
|
||||||
"LGGCFX_audio",
|
"LGGCFX_audio",
|
||||||
|
"LGGCFX_prompt",
|
||||||
"LGGCFX_resolution",
|
"LGGCFX_resolution",
|
||||||
"LGGCFX_time_frame",
|
"LGGCFX_time_frame",
|
||||||
"VRAMReserver"
|
"VRAMReserver"
|
||||||
@ -9124,12 +9291,19 @@
|
|||||||
[
|
[
|
||||||
"CSVRandomPicker",
|
"CSVRandomPicker",
|
||||||
"CSVRandomPickerAdv",
|
"CSVRandomPickerAdv",
|
||||||
|
"ImageBatchtoImageList",
|
||||||
|
"ImageBatchtoImages",
|
||||||
"KSamplerConfig",
|
"KSamplerConfig",
|
||||||
"KSamplerSchedulerFallback",
|
"KSamplerSchedulerFallback",
|
||||||
|
"LoadImageBatch",
|
||||||
|
"LoadZipBatch",
|
||||||
"MaskToSAMCoords",
|
"MaskToSAMCoords",
|
||||||
"MaskToSAMCoordsV2",
|
"MaskToSAMCoordsV2",
|
||||||
"MorseCode",
|
"MorseCode",
|
||||||
"PoseReformer",
|
"PoseReformer",
|
||||||
|
"SaveITAsZip",
|
||||||
|
"SaveImageAsZip",
|
||||||
|
"SaveTextAsZip",
|
||||||
"StrFormat",
|
"StrFormat",
|
||||||
"StrFormatAdv",
|
"StrFormatAdv",
|
||||||
"YoloFaceReformer",
|
"YoloFaceReformer",
|
||||||
@ -9481,10 +9655,15 @@
|
|||||||
"https://github.com/lyra-ai/lyra-nodes": [
|
"https://github.com/lyra-ai/lyra-nodes": [
|
||||||
[
|
[
|
||||||
"LyraAudioVisualizer",
|
"LyraAudioVisualizer",
|
||||||
|
"LyraCdnUploader",
|
||||||
|
"LyraCollectOpenAIResponse",
|
||||||
|
"LyraCustomOpenAIRequest",
|
||||||
"LyraFilenameBuilder",
|
"LyraFilenameBuilder",
|
||||||
"LyraImageAudioFusion",
|
"LyraImageAudioFusion",
|
||||||
"LyraLoadAudioFromURL",
|
"LyraLoadAudioFromURL",
|
||||||
"LyraLoadImageFromURL"
|
"LyraLoadImageFromURL",
|
||||||
|
"LyraStringToTypes",
|
||||||
|
"LyraWebRequester"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "lyra-nodes"
|
"title_aux": "lyra-nodes"
|
||||||
@ -10054,10 +10233,11 @@
|
|||||||
"https://github.com/nobinBB/comfyui-samenodes": [
|
"https://github.com/nobinBB/comfyui-samenodes": [
|
||||||
[
|
[
|
||||||
"BatchImageProcessor",
|
"BatchImageProcessor",
|
||||||
|
"CivitaiBulkDownloader",
|
||||||
|
"ExtractPromptFromImage",
|
||||||
"FloatToString",
|
"FloatToString",
|
||||||
"FloatToStringWithPrefix",
|
"FloatToStringWithPrefix",
|
||||||
"LoraWildcardGenerator",
|
"LoraWildcardGenerator"
|
||||||
"UpscaleImageByUsingModelCustom"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-samenodes"
|
"title_aux": "comfyui-samenodes"
|
||||||
@ -10563,6 +10743,30 @@
|
|||||||
"title_aux": "ComfyUI-AI_Tools [UNSAFE]"
|
"title_aux": "ComfyUI-AI_Tools [UNSAFE]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/quinteroac/comfyui_api_executor_nodes": [
|
||||||
|
[
|
||||||
|
"AnyTo",
|
||||||
|
"ImageInputCombiner",
|
||||||
|
"ImageInputPair",
|
||||||
|
"IntInputCombiner",
|
||||||
|
"IntInputPair",
|
||||||
|
"RemoteWorkflowAPIExecutor",
|
||||||
|
"SimpleText",
|
||||||
|
"SimpleWorkflowAPIExecutor",
|
||||||
|
"TextImageToImageWorkflowSelector",
|
||||||
|
"TextImageToVideoWorkflowSelector",
|
||||||
|
"TextInputCombiner",
|
||||||
|
"TextInputPair",
|
||||||
|
"TextToImageWorkflowSelector",
|
||||||
|
"TextToVideoWorkflowSelector",
|
||||||
|
"VideoInputPair",
|
||||||
|
"WorkflowAPIExecutor",
|
||||||
|
"YandereRandomTags"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui_api_executor_nodes"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/rakete/comfyui-rakete": [
|
"https://github.com/rakete/comfyui-rakete": [
|
||||||
[
|
[
|
||||||
"rakete.BuildString",
|
"rakete.BuildString",
|
||||||
@ -11142,7 +11346,10 @@
|
|||||||
[
|
[
|
||||||
"GetJsonKeyValue",
|
"GetJsonKeyValue",
|
||||||
"Image_Color_Noise",
|
"Image_Color_Noise",
|
||||||
"SamplingParameters"
|
"ModifyMask",
|
||||||
|
"SamplingParameters",
|
||||||
|
"TextEncodeFlux2SystemPrompt",
|
||||||
|
"TextEncodeZITSystemPrompt"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Sampling Utility Toolkit"
|
"title_aux": "Sampling Utility Toolkit"
|
||||||
@ -12273,6 +12480,14 @@
|
|||||||
"title_aux": "ComfyUI_RasterCardMaker"
|
"title_aux": "ComfyUI_RasterCardMaker"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/xiaoxidashen/comfyui_my_utils": [
|
||||||
|
[
|
||||||
|
"VideoSplitCombine"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui_my_utils"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/xiaoyumu/ComfyUI-XYNodes": [
|
"https://github.com/xiaoyumu/ComfyUI-XYNodes": [
|
||||||
[
|
[
|
||||||
"AdjustImageColor",
|
"AdjustImageColor",
|
||||||
@ -12318,6 +12533,19 @@
|
|||||||
"title_aux": "ComfyUI-CombineVideoAndSubtitle"
|
"title_aux": "ComfyUI-CombineVideoAndSubtitle"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/xtanqn/comfyui-xishen": [
|
||||||
|
[
|
||||||
|
"XishenCommonPromptNode",
|
||||||
|
"XishenCommonResolutionNode",
|
||||||
|
"XishenPromptEditNode",
|
||||||
|
"XishenRandomIntegerNode",
|
||||||
|
"XishenRemoveEmptyLinesNode",
|
||||||
|
"XishenSmartDisplayNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "comfyui-xishen [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/xuchenxu168/ComfyUI-Gemini-3": [
|
"https://github.com/xuchenxu168/ComfyUI-Gemini-3": [
|
||||||
[
|
[
|
||||||
"Gemini3Chat",
|
"Gemini3Chat",
|
||||||
@ -12654,6 +12882,23 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/zhuanvi/ComfyUI-ZVNodes": [
|
"https://github.com/zhuanvi/ComfyUI-ZVNodes": [
|
||||||
[
|
[
|
||||||
|
"ApimartDownloadSavedTaskImageZV",
|
||||||
|
"ApimartDownloadSavedTaskVideoZV",
|
||||||
|
"ApimartImage2VideoSubmitZV",
|
||||||
|
"ApimartNanoBananaProImageSubmitZV",
|
||||||
|
"ApimartRemixByTaskIdSubmitZV",
|
||||||
|
"ApimartRemixVideoSubmitZV",
|
||||||
|
"ApimartSeedream40ImageSubmitZV",
|
||||||
|
"ApimartSeedream45ImageSubmitZV",
|
||||||
|
"ApimartText2VideoSubmitZV",
|
||||||
|
"BBOXFormatConverterZV",
|
||||||
|
"GrsaiLoadImageFromPathNodeZV",
|
||||||
|
"GrsaiNanoBananaGeminiNodeZV",
|
||||||
|
"GrsaiNanoBananaNodeZV",
|
||||||
|
"GrsaiResultNodeZV",
|
||||||
|
"GrsaiSoraCreateCharacterNodeZV",
|
||||||
|
"GrsaiSoraUploadCharacterNodeZV",
|
||||||
|
"GrsaiSoraVideoNodeZV",
|
||||||
"ImageCounterNodeZV",
|
"ImageCounterNodeZV",
|
||||||
"JoinListZV",
|
"JoinListZV",
|
||||||
"JsonListIndexerZV",
|
"JsonListIndexerZV",
|
||||||
@ -12667,6 +12912,7 @@
|
|||||||
"LoadImageFromDirZV",
|
"LoadImageFromDirZV",
|
||||||
"LoadImageFromUrlZV",
|
"LoadImageFromUrlZV",
|
||||||
"LoadTxtFromDirZV",
|
"LoadTxtFromDirZV",
|
||||||
|
"LoadVideoFromDirZV",
|
||||||
"MultiLineConditionalZV",
|
"MultiLineConditionalZV",
|
||||||
"MultiLineOperationZV",
|
"MultiLineOperationZV",
|
||||||
"PatternFillNodeZV",
|
"PatternFillNodeZV",
|
||||||
@ -12674,8 +12920,11 @@
|
|||||||
"RandomSelectListZV",
|
"RandomSelectListZV",
|
||||||
"SaveImageToPathZV",
|
"SaveImageToPathZV",
|
||||||
"SaveTxtToPathZV",
|
"SaveTxtToPathZV",
|
||||||
|
"StringToPathZV",
|
||||||
"TriangleCharacterLayoutZV",
|
"TriangleCharacterLayoutZV",
|
||||||
"TxtCounterNodeZV",
|
"TxtCounterNodeZV",
|
||||||
|
"UniversalBBOXToMaskZV",
|
||||||
|
"Veo31Image2VideoSubmitZV",
|
||||||
"VideoSceneDetectorZV",
|
"VideoSceneDetectorZV",
|
||||||
"VideoSpeedZV",
|
"VideoSpeedZV",
|
||||||
"doubaoI2INodeZV",
|
"doubaoI2INodeZV",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,65 @@
|
|||||||
{
|
{
|
||||||
"custom_nodes": [
|
"custom_nodes": [
|
||||||
|
{
|
||||||
|
"author": "shinich39",
|
||||||
|
"title": "comfyui-no-one-above-me [REMOVED]",
|
||||||
|
"reference": "https://github.com/shinich39/comfyui-no-one-above-me",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/shinich39/comfyui-no-one-above-me"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Fix node to top."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "octapus8085",
|
||||||
|
"title": "OpenAI-comfyui-O [REMOVED]",
|
||||||
|
"reference": "https://github.com/Spicely/Comfyui-File-Utils",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Spicely/Comfyui-File-Utils"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This plugin provides multiple file-handling and utility nodes for ComfyUI, including: image saving, audio saving, video saving, video composition, audio-to-subtitle conversion, and random number generation nodes. These nodes not only process files but also return their absolute file paths.\nNOTE: The files in the repo are not organized.[w/This nodepack contains a node that has a vulnerability allowing write to arbitrary file paths.]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "yemanou",
|
||||||
|
"title": "NABA Image (Gemini REST) Node [REMOVED]",
|
||||||
|
"reference": "https://github.com/yemanou/ComfyUI-NABA",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/yemanou/ComfyUI-NABA"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Simplified Gemini 2.5 Flash Image Preview node for ComfyUI. REST-only for stability, two optional reference images, padded aspect ratio resizing (no stretching), and basic sampling controls. All extra debug layers, SDK path, multi-seed, and legacy compatibility code removed to avoid crashes."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "comrender",
|
||||||
|
"title": "ComfyUI-Nano-Banana-Resizer [REMOVED]",
|
||||||
|
"reference": "https://github.com/comrender/ComfyUI-Nano-Banana-Resizer",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/comrender/ComfyUI-Nano-Banana-Resizer"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI custom node that automatically calculates optimal output dimensions for Google's Nano Banana image editing model, supporting 22 aspect ratio buckets and ensuring pixel-perfect outputs without shifting or cropping."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "comrender",
|
||||||
|
"title": "ComfyUI-edge-match-checker [REMOVED]",
|
||||||
|
"reference": "https://github.com/comrender/ComfyUI-edge-match-checker",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/comrender/ComfyUI-edge-match-checker"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Node comparing two image masks or images with adjustable overlap threshold (default 95%) for detecting minor shifts and mismatches in proportions, suitable for automated post-processing validation. (Description by CC)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "comrender",
|
||||||
|
"title": "ComfyUI-gpt5_image_text [REMOVED]",
|
||||||
|
"reference": "https://github.com/comrender/ComfyUI-gpt5_image_text",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/comrender/ComfyUI-gpt5_image_text"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A ComfyUI custom node for vision + text analysis using GPT-5 and GPT-4o with direct API key input, system prompt, temperature, max tokens, and multi-image support."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "PozzettiAndrea",
|
"author": "PozzettiAndrea",
|
||||||
"title": "ComfyUI-CameraAnalysis [REMOVED]",
|
"title": "ComfyUI-CameraAnalysis [REMOVED]",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -85,7 +85,15 @@ cm_global.register_api('cm.is_import_failed_extension', is_import_failed_extensi
|
|||||||
comfyui_manager_path = os.path.abspath(os.path.dirname(__file__))
|
comfyui_manager_path = os.path.abspath(os.path.dirname(__file__))
|
||||||
|
|
||||||
custom_nodes_base_path = folder_paths.get_folder_paths('custom_nodes')[0]
|
custom_nodes_base_path = folder_paths.get_folder_paths('custom_nodes')[0]
|
||||||
manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), 'default', 'ComfyUI-Manager'))
|
|
||||||
|
# Check for System User API availability (PR #10966)
|
||||||
|
_has_system_user_api = hasattr(folder_paths, 'get_system_user_directory')
|
||||||
|
|
||||||
|
if _has_system_user_api:
|
||||||
|
manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), '__manager'))
|
||||||
|
else:
|
||||||
|
manager_files_path = os.path.abspath(os.path.join(folder_paths.get_user_directory(), 'default', 'ComfyUI-Manager'))
|
||||||
|
|
||||||
manager_pip_overrides_path = os.path.join(manager_files_path, "pip_overrides.json")
|
manager_pip_overrides_path = os.path.join(manager_files_path, "pip_overrides.json")
|
||||||
manager_pip_blacklist_path = os.path.join(manager_files_path, "pip_blacklist.list")
|
manager_pip_blacklist_path = os.path.join(manager_files_path, "pip_blacklist.list")
|
||||||
restore_snapshot_path = os.path.join(manager_files_path, "startup-scripts", "restore-snapshot.json")
|
restore_snapshot_path = os.path.join(manager_files_path, "startup-scripts", "restore-snapshot.json")
|
||||||
@ -516,7 +524,8 @@ check_bypass_ssl()
|
|||||||
|
|
||||||
# Perform install
|
# Perform install
|
||||||
processed_install = set()
|
processed_install = set()
|
||||||
script_list_path = os.path.join(folder_paths.user_directory, "default", "ComfyUI-Manager", "startup-scripts", "install-scripts.txt")
|
# Use manager_files_path for consistency (fixes path inconsistency bug)
|
||||||
|
script_list_path = os.path.join(manager_files_path, "startup-scripts", "install-scripts.txt")
|
||||||
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, manager_files_path)
|
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, manager_files_path)
|
||||||
|
|
||||||
|
|
||||||
@ -793,7 +802,11 @@ def execute_startup_script():
|
|||||||
|
|
||||||
|
|
||||||
# Check if script_list_path exists
|
# Check if script_list_path exists
|
||||||
if os.path.exists(script_list_path):
|
# Block startup-scripts on old ComfyUI (security measure)
|
||||||
|
if not _has_system_user_api:
|
||||||
|
if os.path.exists(script_list_path):
|
||||||
|
print("[ComfyUI-Manager] Startup scripts blocked on old ComfyUI version.")
|
||||||
|
elif os.path.exists(script_list_path):
|
||||||
execute_startup_script()
|
execute_startup_script()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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.37.2"
|
version = "3.38.1"
|
||||||
license = { file = "LICENSE.txt" }
|
license = { file = "LICENSE.txt" }
|
||||||
dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
|
dependencies = ["GitPython", "PyGithub", "matrix-nio", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions", "toml", "uv", "chardet"]
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user