mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-01-23 04:20:18 +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
|
||||
* 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.10: `double-click feature` is removed
|
||||
* 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
|
||||
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>
|
||||
* If executed without any options, the path defaults to ComfyUI/user.
|
||||
* It can be set using --user-directory <USER_DIRECTORY>.
|
||||
* <USER_DIRECTORY>
|
||||
* If executed without any options, the path defaults to ComfyUI/user.
|
||||
* It can be set using --user-directory <USER_DIRECTORY>.
|
||||
|
||||
* Basic config files: `<USER_DIRECTORY>/default/ComfyUI-Manager/config.ini`
|
||||
* Configurable channel lists: `<USER_DIRECTORY>/default/ComfyUI-Manager/channels.ini`
|
||||
* Configurable pip overrides: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_overrides.json`
|
||||
* Configurable pip blacklist: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_blacklist.list`
|
||||
* Configurable pip auto fix: `<USER_DIRECTORY>/default/ComfyUI-Manager/pip_auto_fix.list`
|
||||
* Saved snapshot files: `<USER_DIRECTORY>/default/ComfyUI-Manager/snapshots`
|
||||
* Startup script files: `<USER_DIRECTORY>/default/ComfyUI-Manager/startup-scripts`
|
||||
* Component files: `<USER_DIRECTORY>/default/ComfyUI-Manager/components`
|
||||
| ComfyUI Version | Manager Path |
|
||||
|-----------------|--------------|
|
||||
| v0.3.76+ (with System User API) | `<USER_DIRECTORY>/__manager/` |
|
||||
| Older versions | `<USER_DIRECTORY>/default/ComfyUI-Manager/` |
|
||||
|
||||
* Basic config files: `config.ini`
|
||||
* Configurable channel lists: `channels.list`
|
||||
* 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
|
||||
|
||||
@ -8284,6 +8284,16 @@
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"title": "Klinter_nodes",
|
||||
@ -9785,16 +9795,6 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "comfyui-break-workflow",
|
||||
@ -11389,6 +11389,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "Comfy-Topaz",
|
||||
@ -16834,6 +16844,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "ComfyUI Steudio",
|
||||
@ -20238,6 +20258,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "ComfyUI-LTXVideo",
|
||||
@ -22960,6 +22990,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "ComfyUI-KokoroTTS",
|
||||
@ -23145,6 +23185,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "ComfyUI-Mango-Random",
|
||||
@ -24796,6 +24846,16 @@
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"title": "comfyui-finegrain",
|
||||
@ -25964,6 +26024,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "comfyui-EncryptSave",
|
||||
@ -30418,6 +30488,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "ComfyUI Fooocus Inpaint Wrapper",
|
||||
@ -32506,6 +32586,17 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "HouseKeeper",
|
||||
@ -32859,6 +32950,16 @@
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"title": "ComfyUI Video Extend Counter",
|
||||
@ -33594,6 +33695,16 @@
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"title": "ComfyUI-FastVideo",
|
||||
@ -33725,16 +33836,6 @@
|
||||
"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. "
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"title": "ComfyUI-Topaz-Upscaler",
|
||||
@ -33745,26 +33846,6 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "Lucy-Edit-ComfyUI",
|
||||
@ -35617,16 +35698,6 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "BSS WD14 Batch Tagger",
|
||||
@ -35675,6 +35746,16 @@
|
||||
"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."
|
||||
},
|
||||
{
|
||||
"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",
|
||||
"title": "TTS WebUI API nodes for ComfyUI",
|
||||
@ -36056,6 +36137,16 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "ComfyUI FOV Estimator",
|
||||
@ -37051,7 +37142,18 @@
|
||||
"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.",
|
||||
"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",
|
||||
"title": "ComfyUI-Replace-First-Frame-Last-Frame",
|
||||
@ -37293,12 +37395,380 @@
|
||||
"install_type": "git-clone",
|
||||
"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 git_utils
|
||||
import manager_downloader
|
||||
import manager_migration
|
||||
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 '')
|
||||
|
||||
|
||||
@ -214,9 +215,10 @@ def update_user_directory(user_dir):
|
||||
global manager_pip_blacklist_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):
|
||||
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")
|
||||
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.bypass_ssl = get_bool('bypass_ssl', False)
|
||||
|
||||
return {
|
||||
result = {
|
||||
'http_channel_enabled': get_bool('http_channel_enabled', False),
|
||||
'preview_method': default_conf.get('preview_method', manager_funcs.get_current_preview_method()).lower(),
|
||||
'git_exe': default_conf.get('git_exe', ''),
|
||||
@ -1739,6 +1741,8 @@ def read_config():
|
||||
'security_level': default_conf.get('security_level', 'normal').lower(),
|
||||
'db_mode': default_conf.get('db_mode', 'cache').lower(),
|
||||
}
|
||||
manager_migration.force_security_level_if_needed(result)
|
||||
return result
|
||||
|
||||
except Exception:
|
||||
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.bypass_ssl = False
|
||||
|
||||
return {
|
||||
result = {
|
||||
'http_channel_enabled': False,
|
||||
'preview_method': manager_funcs.get_current_preview_method(),
|
||||
'git_exe': '',
|
||||
@ -1766,6 +1770,8 @@ def read_config():
|
||||
'security_level': 'normal', # strong | normal | normal- | weak
|
||||
'db_mode': 'cache', # local | cache | remote
|
||||
}
|
||||
manager_migration.force_security_level_if_needed(result)
|
||||
return result
|
||||
|
||||
|
||||
def get_config():
|
||||
@ -3360,8 +3366,8 @@ def get_comfyui_versions(repo=None):
|
||||
repo = git.Repo(comfy_path)
|
||||
|
||||
try:
|
||||
remote = get_remote_name(repo)
|
||||
repo.remotes[remote].fetch()
|
||||
remote = get_remote_name(repo)
|
||||
repo.remotes[remote].fetch()
|
||||
except:
|
||||
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 manager_downloader
|
||||
import manager_migration
|
||||
|
||||
|
||||
logging.info(f"### Loading: ComfyUI-Manager ({core.version_str})")
|
||||
@ -276,6 +277,13 @@ import zipfile
|
||||
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):
|
||||
if 'download_model_base' in folder_paths.folder_names_and_paths:
|
||||
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):
|
||||
if not is_allowed_security_level('middle'):
|
||||
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
|
||||
return web.Response(status=403)
|
||||
return security_403_response()
|
||||
|
||||
with task_worker_lock:
|
||||
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):
|
||||
if not is_allowed_security_level('middle'):
|
||||
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
|
||||
return web.Response(status=403)
|
||||
return security_403_response()
|
||||
|
||||
try:
|
||||
target = request.rel_url.query["target"]
|
||||
@ -983,7 +991,7 @@ async def remove_snapshot(request):
|
||||
async def restore_snapshot(request):
|
||||
if not is_allowed_security_level('middle'):
|
||||
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
|
||||
return web.Response(status=403)
|
||||
return security_403_response()
|
||||
|
||||
try:
|
||||
target = request.rel_url.query["target"]
|
||||
@ -1302,7 +1310,7 @@ async def fix_custom_node(request):
|
||||
async def install_custom_node_git_url(request):
|
||||
if not is_allowed_security_level('high'):
|
||||
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
|
||||
return web.Response(status=403)
|
||||
return security_403_response()
|
||||
|
||||
url = await request.text()
|
||||
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):
|
||||
if not is_allowed_security_level('high'):
|
||||
logging.error(SECURITY_MESSAGE_NORMAL_MINUS)
|
||||
return web.Response(status=403)
|
||||
return security_403_response()
|
||||
|
||||
packages = await request.text()
|
||||
core.pip_install(packages.split(' '))
|
||||
@ -1594,6 +1602,16 @@ async def get_notice(request):
|
||||
except:
|
||||
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)
|
||||
else:
|
||||
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)
|
||||
|
||||
|
||||
@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")
|
||||
def restart(self):
|
||||
if not is_allowed_security_level('middle'):
|
||||
logging.error(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
|
||||
return web.Response(status=403)
|
||||
return security_403_response()
|
||||
|
||||
try:
|
||||
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)
|
||||
return [sys.executable] + (['-s'] if embedded else []) + ['-m', 'pip']
|
||||
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)
|
||||
import shutil
|
||||
@ -64,19 +64,19 @@ def get_pip_cmd(force_uv=False):
|
||||
try:
|
||||
test_cmd = [sys.executable] + (['-s'] if embedded else []) + ['-m', 'uv', '--version']
|
||||
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']
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Try standalone 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']
|
||||
|
||||
# Nothing worked
|
||||
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")
|
||||
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")
|
||||
|
||||
|
||||
def make_pip_cmd(cmd):
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { api } from "../../scripts/api.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) {
|
||||
let msg = '-= [ComfyUI Manager] extension installation request =-\n\n';
|
||||
@ -42,7 +42,7 @@ async function tryInstallCustomNode(event) {
|
||||
});
|
||||
|
||||
if(response.status == 403) {
|
||||
show_message('This action is not allowed with this security level configuration.');
|
||||
await handle403Response(response);
|
||||
return false;
|
||||
}
|
||||
else if(response.status == 400) {
|
||||
@ -54,7 +54,7 @@ async function tryInstallCustomNode(event) {
|
||||
|
||||
let response = await api.fetchApi("/manager/reboot");
|
||||
if(response.status == 403) {
|
||||
show_message('This action is not allowed with this security level configuration.');
|
||||
await handle403Response(response);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -14,7 +14,7 @@ import { OpenArtShareDialog } from "./comfyui-share-openart.js";
|
||||
import {
|
||||
free_models, install_pip, install_via_git_url, manager_instance,
|
||||
rebootAPI, setManagerInstance, show_message, customAlert, customPrompt,
|
||||
infoToast, showTerminal, setNeedRestart
|
||||
infoToast, showTerminal, setNeedRestart, handle403Response
|
||||
} from "./common.js";
|
||||
import { ComponentBuilderDialog, getPureName, load_components, set_component_policy } from "./components-manager.js";
|
||||
import { CustomNodesManager } from "./custom-nodes-manager.js";
|
||||
@ -753,9 +753,9 @@ async function onQueueStatus(event) {
|
||||
|
||||
const rebootButton = document.getElementById('cm-reboot-button5');
|
||||
rebootButton?.addEventListener("click",
|
||||
function() {
|
||||
if(rebootAPI()) {
|
||||
manager_dialog.close();
|
||||
async function() {
|
||||
if(await rebootAPI()) {
|
||||
manager_instance.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -780,8 +780,13 @@ async function updateAll(update_comfyui) {
|
||||
|
||||
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.');
|
||||
reset_action_buttons();
|
||||
}
|
||||
else if(response.status == 200) {
|
||||
is_updating = true;
|
||||
@ -1453,6 +1458,31 @@ app.registerExtension({
|
||||
|
||||
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 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;
|
||||
}
|
||||
|
||||
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) {
|
||||
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) {
|
||||
window.electronAPI.restartApp();
|
||||
return true;
|
||||
}
|
||||
|
||||
customConfirm("Are you sure you'd like to reboot the server?").then((isConfirmed) => {
|
||||
if (isConfirmed) {
|
||||
try {
|
||||
api.fetchApi("/manager/reboot");
|
||||
const isConfirmed = await customConfirm("Are you sure you'd like to reboot the server?");
|
||||
if (isConfirmed) {
|
||||
try {
|
||||
const response = await api.fetchApi("/manager/reboot");
|
||||
if (response.status == 403) {
|
||||
await handle403Response(response);
|
||||
return false;
|
||||
}
|
||||
catch(exception) {}
|
||||
}
|
||||
});
|
||||
catch(exception) {}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -216,7 +232,7 @@ export async function install_pip(packages) {
|
||||
});
|
||||
|
||||
if(res.status == 403) {
|
||||
show_message('This action is not allowed with this security level configuration.');
|
||||
await handle403Response(res);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -251,7 +267,7 @@ export async function install_via_git_url(url, manager_dialog) {
|
||||
});
|
||||
|
||||
if(res.status == 403) {
|
||||
show_message('This action is not allowed with this security level configuration.');
|
||||
await handle403Response(res);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -262,9 +278,9 @@ export async function install_via_git_url(url, manager_dialog) {
|
||||
const self = this;
|
||||
|
||||
rebootButton.addEventListener("click",
|
||||
function() {
|
||||
if(rebootAPI()) {
|
||||
manager_dialog.close();
|
||||
async function() {
|
||||
if(await rebootAPI()) {
|
||||
manager_instance.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -7,7 +7,7 @@ import {
|
||||
fetchData, md5, icons, show_message, customConfirm, customAlert, customPrompt,
|
||||
sanitizeHTML, infoToast, showTerminal, setNeedRestart,
|
||||
storeColumnWidth, restoreColumnWidth, getTimeAgo, copyText, loadCss,
|
||||
showPopover, hidePopover
|
||||
showPopover, hidePopover, handle403Response
|
||||
} from "./common.js";
|
||||
|
||||
// https://cenfun.github.io/turbogrid/api.html
|
||||
@ -1528,7 +1528,16 @@ export class CustomNodesManager {
|
||||
errorMsg = `'${item.title}': `;
|
||||
|
||||
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) {
|
||||
errorMsg += `With the current security level configuration, only custom nodes from the <B>"default channel"</B> can be installed.\n`;
|
||||
} else {
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
import { app } from "../../scripts/app.js";
|
||||
import { $el } from "../../scripts/ui.js";
|
||||
import {
|
||||
manager_instance, rebootAPI,
|
||||
import {
|
||||
manager_instance, rebootAPI,
|
||||
fetchData, md5, icons, show_message, customAlert, infoToast, showTerminal,
|
||||
storeColumnWidth, restoreColumnWidth, loadCss
|
||||
storeColumnWidth, restoreColumnWidth, loadCss, handle403Response
|
||||
} from "./common.js";
|
||||
import { api } from "../../scripts/api.js";
|
||||
|
||||
@ -477,7 +477,16 @@ export class ModelManager {
|
||||
errorMsg = `'${item.name}': `;
|
||||
|
||||
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 {
|
||||
errorMsg += await res.text() + '\n';
|
||||
}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { app } from "../../scripts/app.js";
|
||||
import { api } from "../../scripts/api.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) {
|
||||
@ -10,7 +10,7 @@ async function restore_snapshot(target) {
|
||||
const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" });
|
||||
|
||||
if(response.status == 403) {
|
||||
show_message('This action is not allowed with this security level configuration.');
|
||||
await handle403Response(response);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -38,7 +38,7 @@ async function remove_snapshot(target) {
|
||||
const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" });
|
||||
|
||||
if(response.status == 403) {
|
||||
show_message('This action is not allowed with this security level configuration.');
|
||||
await handle403Response(response);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -145,8 +145,8 @@ export class SnapshotManager extends ComfyDialog {
|
||||
if(btn_id) {
|
||||
const rebootButton = document.getElementById(btn_id);
|
||||
const self = this;
|
||||
rebootButton.onclick = function() {
|
||||
if(rebootAPI()) {
|
||||
rebootButton.onclick = async function() {
|
||||
if(await rebootAPI()) {
|
||||
self.close();
|
||||
self.manager_dialog.close();
|
||||
}
|
||||
|
||||
@ -1,5 +1,126 @@
|
||||
{
|
||||
"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",
|
||||
"title": "ComfyUI-Tracker-Person [WIP]",
|
||||
@ -1203,16 +1324,6 @@
|
||||
"install_type": "git-clone",
|
||||
"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",
|
||||
"title": "OpenAI-comfyui-O",
|
||||
|
||||
@ -340,6 +340,8 @@
|
||||
"ImageBlendText",
|
||||
"ImageBlendV1",
|
||||
"ImageRatioCrop",
|
||||
"Load_Images_Advance",
|
||||
"Load_Images_V1",
|
||||
"PDEmptyRatioLatent",
|
||||
"PDIMAGE_ImageCombine",
|
||||
"PDIMAGE_LongerSize",
|
||||
@ -349,18 +351,29 @@
|
||||
"PDImageResizeV2",
|
||||
"PDImageResizeV3",
|
||||
"PDImageToRatioV1",
|
||||
"PDJSON_BatchJsonIncremental",
|
||||
"PDJSON_Group",
|
||||
"PDStringConcate",
|
||||
"PDStringInput",
|
||||
"PDTEXT_SAVE_PATH",
|
||||
"PD_AitoolkitTrainingRedux",
|
||||
"PD_BatchCropBlackBorder",
|
||||
"PD_CaptionJSONEditor",
|
||||
"PD_CaptionJSONParser",
|
||||
"PD_CropBorder",
|
||||
"PD_Extract_Image",
|
||||
"PD_GetImageRatio",
|
||||
"PD_GetImageSize",
|
||||
"PD_ImageFileTraining",
|
||||
"PD_ImageListForSort",
|
||||
"PD_ImageListForSortWithMetadata",
|
||||
"PD_ImageSearch",
|
||||
"PD_ImageSize34Compose",
|
||||
"PD_Image_Crop_Location",
|
||||
"PD_Image_Rotate_v1",
|
||||
"PD_Image_centerCrop",
|
||||
"PD_JoinStringMultiLine",
|
||||
"PD_LoadImageMetadata",
|
||||
"PD_LoadImagesFromDir",
|
||||
"PD_LoadImagesFromZip",
|
||||
"PD_LoadTextsFromDir",
|
||||
@ -370,15 +383,36 @@
|
||||
"PD_Mask Selector By Area Left",
|
||||
"PD_MaskFillHoles",
|
||||
"PD_MaskRemoveSmallObjects",
|
||||
"PD_ModelLoraLoader",
|
||||
"PD_RemoveBlackBackground",
|
||||
"PD_RemoveColorWords",
|
||||
"PD_RemoveWhiteBorder",
|
||||
"PD_RenameV2",
|
||||
"PD_SAVE_PATH2",
|
||||
"PD_SaveTextPathAndName",
|
||||
"PD_ShowText",
|
||||
"PD_StringLineCount",
|
||||
"PD_StringToCaptionJSON",
|
||||
"PD_TensorTraining",
|
||||
"PD_Text Overlay Node",
|
||||
"PD_TextListPack",
|
||||
"PD_TextListSort",
|
||||
"PD_TextListStringAddWord",
|
||||
"PD_TextListUnpack",
|
||||
"PD_TxtBatchRename",
|
||||
"PD_Zip_Simple",
|
||||
"PD_del_word",
|
||||
"PD_empty_word",
|
||||
"PD_image_coversaver",
|
||||
"PD_image_ratio_size",
|
||||
"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_rename_image",
|
||||
"PDbananaImagesizeByRatio",
|
||||
"PDimage_corp_v1",
|
||||
"PDimage_corp_v2",
|
||||
@ -1219,6 +1253,17 @@
|
||||
"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": [
|
||||
[
|
||||
"VTS Add Text To list",
|
||||
@ -2327,6 +2372,22 @@
|
||||
"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": [
|
||||
[
|
||||
"RK_Accumulate_Text_Multiline",
|
||||
@ -2440,61 +2501,36 @@
|
||||
],
|
||||
"https://github.com/LSDJesus/ComfyUI-Luna-Collection": [
|
||||
[
|
||||
"LunaAssembler",
|
||||
"LunaBasePrompt",
|
||||
"LunaCacheManager",
|
||||
"LunaBatchPromptExtractor",
|
||||
"LunaBatchPromptLoader",
|
||||
"LunaCheckpointLoader",
|
||||
"LunaCheckpointTunnel",
|
||||
"LunaCivitaiBatchScraper",
|
||||
"LunaCivitaiScraper",
|
||||
"LunaConditionals",
|
||||
"LunaConfigGateway",
|
||||
"LunaConnectionEditor",
|
||||
"LunaConnectionMatcher",
|
||||
"LunaConnectionStats",
|
||||
"LunaDaemonConfig",
|
||||
"LunaDaemonConfigFromLoaders",
|
||||
"LunaDaemonModelSwitch",
|
||||
"LunaDaemonStatus",
|
||||
"LunaEmbeddingCache",
|
||||
"LunaDaemonCLIPLoader",
|
||||
"LunaDaemonVAELoader",
|
||||
"LunaDimensionScaler",
|
||||
"LunaDynamicModelLoader",
|
||||
"LunaEmbeddingManager",
|
||||
"LunaEmbeddingManagerRandom",
|
||||
"LunaExpanders",
|
||||
"LunaExpressionBatchSaver",
|
||||
"LunaExpressionList",
|
||||
"LunaExpressionPromptBuilder",
|
||||
"LunaExpressionSheetSlicer",
|
||||
"LunaListPreprocessedPrompts",
|
||||
"LunaLoRALinker",
|
||||
"LunaExpressionSlicerSaver",
|
||||
"LunaGGUFBatchConverter",
|
||||
"LunaGGUFConverter",
|
||||
"LunaLoRARandomizer",
|
||||
"LunaLoRAStacker",
|
||||
"LunaLoRAStackerRandom",
|
||||
"LunaLoadParameters",
|
||||
"LunaLoadPreprocessedPrompt",
|
||||
"LunaLogicResolver",
|
||||
"LunaModifiers",
|
||||
"LunaModifyPreprocessedPrompt",
|
||||
"LunaLoRATriggerInjector",
|
||||
"LunaLoRAValidator",
|
||||
"LunaMultiSaver",
|
||||
"LunaOptimizedPreprocessedLoader",
|
||||
"LunaParametersBridge",
|
||||
"LunaPerformanceCondition",
|
||||
"LunaPerformanceDisplay",
|
||||
"LunaPerformanceLogger",
|
||||
"LunaPerformanceMonitor",
|
||||
"LunaPerformanceStatsConcat",
|
||||
"LunaPromptPreprocessor",
|
||||
"LunaSampler",
|
||||
"LunaSaveNegativePrompt",
|
||||
"LunaSelectPromptFolder",
|
||||
"LunaSharedCLIPEncode",
|
||||
"LunaSharedCLIPEncodeDual",
|
||||
"LunaSharedCLIPEncodeSDXL",
|
||||
"LunaSharedVAEDecode",
|
||||
"LunaSharedVAEEncode",
|
||||
"LunaSinglePromptProcessor",
|
||||
"LunaOptimizedWeightsManager",
|
||||
"LunaPromptCraft",
|
||||
"LunaPromptCraftDebug",
|
||||
"LunaSmartLoRALinker",
|
||||
"LunaTextProcessor",
|
||||
"LunaUnifiedPromptProcessor",
|
||||
"LunaUNetTunnel",
|
||||
"LunaWildcardBuilder",
|
||||
"LunaWildcardPromptGenerator",
|
||||
"LunaYAMLInjector",
|
||||
"LunaYAMLPathExplorer",
|
||||
"LunaYAMLWildcard",
|
||||
@ -2650,12 +2686,19 @@
|
||||
],
|
||||
"https://github.com/LvyuanW/ComfyUI-6yuan": [
|
||||
[
|
||||
"6yuan_DrawTextNode",
|
||||
"ColorKMeans",
|
||||
"CropAlpha",
|
||||
"PosterColorEngine",
|
||||
"PosterLogoPlacer",
|
||||
"PosterMaskGenerator",
|
||||
"PosterTemplateLoader",
|
||||
"PosterTextRenderer",
|
||||
"RemoveBackground",
|
||||
"RemoveBackgroundAdvanced",
|
||||
"ShapeLanguageSummary",
|
||||
"ShrinkImage",
|
||||
"SimpleTextLayout",
|
||||
"StringPreview"
|
||||
],
|
||||
{
|
||||
@ -2936,6 +2979,14 @@
|
||||
"title_aux": "ComfyUI_mickster_nodes [WIP]"
|
||||
}
|
||||
],
|
||||
"https://github.com/Mohamed-Sakr/ComfyUI-SimpleMarkdown": [
|
||||
[
|
||||
"SimpleMarkdownPreview"
|
||||
],
|
||||
{
|
||||
"title_aux": "ComfyUI-SimpleMarkdown [UNSAFE]"
|
||||
}
|
||||
],
|
||||
"https://github.com/MrAdamBlack/CheckProgress": [
|
||||
[
|
||||
"CHECK_PROGRESS"
|
||||
@ -3435,31 +3486,76 @@
|
||||
],
|
||||
"https://github.com/PozzettiAndrea/ComfyUI-CADabra": [
|
||||
[
|
||||
"BGPSegSegmentation",
|
||||
"BrepGeneration",
|
||||
"CADAnalysisViewer",
|
||||
"CADCheckOverlappingFaces",
|
||||
"CADConnectedComponents",
|
||||
"CADCountFaces",
|
||||
"CADDepthMapHybrid",
|
||||
"CADEdgeAnalysis",
|
||||
"CADEdgeDetailAnalyzer",
|
||||
"CADEdgeViewer",
|
||||
"CADEstimateGapTolerance",
|
||||
"CADExtractFaces",
|
||||
"CADFaceAnalysis",
|
||||
"CADFillMaskBiharmonic",
|
||||
"CADFillMaskBiharmonicMask",
|
||||
"CADFixDegenerateFaces",
|
||||
"CADGetFaceInfo",
|
||||
"CADGetFilename",
|
||||
"CADGetMetadata",
|
||||
"CADHealShape",
|
||||
"CADMergeVertices",
|
||||
"CADProjectFacesXY",
|
||||
"CADROISelector",
|
||||
"CADRaytracerBVH",
|
||||
"CADRecodeInference",
|
||||
"CADSave",
|
||||
"CADSewFaces",
|
||||
"CADSplitComponents",
|
||||
"CAD_Convert_Format",
|
||||
"CAD_Load",
|
||||
"CAD_Load_From_Folder",
|
||||
"CAD_Load_Gmsh",
|
||||
"CAD_Mesh_Gmsh",
|
||||
"CAD_Mesh_Gmsh_Advanced",
|
||||
"CAD_Quality_Metrics",
|
||||
"CAD_Remesh_OCC",
|
||||
"CAD_Remesh_OCC_Advanced",
|
||||
"CadQueryExecute",
|
||||
"CadrilleImageInference",
|
||||
"CadrilleInference",
|
||||
"CadrilleTextInference",
|
||||
"LoadBGPSegModels",
|
||||
"LoadCADRecodeModel",
|
||||
"LoadCadrilleModel",
|
||||
"LoadNeurCADReconModel",
|
||||
"LoadPoint2CADModel",
|
||||
"LoadPointCloudXYZ",
|
||||
"LoadSECADNetModel",
|
||||
"LoadSurfaceParams",
|
||||
"ML_FeatureDetection",
|
||||
"ML_SurfaceRecon",
|
||||
"MeshFaceSegmentation",
|
||||
"MeshSegmentToPointCloud",
|
||||
"MeshToVoxel",
|
||||
"Mesh_Optimize_Gmsh",
|
||||
"NeurCADReconInference",
|
||||
"NeurCADReconLoadCheckpoint",
|
||||
"NeurCADReconTrain",
|
||||
"Point2CADExportBrep",
|
||||
"Point2CADSegmentation",
|
||||
"Point2CADSurfaceFitting",
|
||||
"Point2CADSurfaceFittingOCC",
|
||||
"Point2CADTopologyExtraction",
|
||||
"PointCloudSegmentation",
|
||||
"PreviewCADBatch",
|
||||
"PreviewCADOCC",
|
||||
"PrimitiveFitting",
|
||||
"QuadRemesh"
|
||||
"QuadRemesh",
|
||||
"SECADNetFinetune",
|
||||
"SECADNetInference",
|
||||
"SaveSurfaceParams"
|
||||
],
|
||||
{
|
||||
"title_aux": "CADabra [WIP]"
|
||||
@ -3502,11 +3598,15 @@
|
||||
"LoadBVHFromFolder",
|
||||
"LoadFBXCharacter",
|
||||
"LoadGVHMRModels",
|
||||
"LoadSAM3DBodyModels",
|
||||
"LoadSMPL",
|
||||
"MHRViewer",
|
||||
"SAM3DVideoInference",
|
||||
"SMPLRetargetToSMPL",
|
||||
"SMPLToFBX",
|
||||
"SMPLViewer",
|
||||
"SMPLtoBVH",
|
||||
"SaveMHR",
|
||||
"SaveSMPL"
|
||||
],
|
||||
{
|
||||
@ -3675,8 +3775,10 @@
|
||||
],
|
||||
"https://github.com/Rizzlord/ComfyUI-SeqTex": [
|
||||
[
|
||||
"SeqTex_DisplaceMesh",
|
||||
"SeqTex_Load_Mesh",
|
||||
"SeqTex_Loader",
|
||||
"SeqTex_ProjectTexture",
|
||||
"SeqTex_Step1_ProcessMesh",
|
||||
"SeqTex_Step2_GenerateCondition",
|
||||
"SeqTex_Step3_GenerateTexture",
|
||||
@ -3704,6 +3806,7 @@
|
||||
"List Image Path \ud83d\udc24",
|
||||
"List Model Path \ud83d\udc24",
|
||||
"List Video Path \ud83d\udc24",
|
||||
"Load Image Base64 \ud83d\udc24",
|
||||
"Peaks Weights Generator \ud83d\udc24"
|
||||
],
|
||||
{
|
||||
@ -3963,6 +4066,14 @@
|
||||
"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": [
|
||||
[
|
||||
"Range Iterator"
|
||||
@ -4034,19 +4145,6 @@
|
||||
"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": [
|
||||
[
|
||||
"DifferenceExtractorNode",
|
||||
@ -4940,6 +5038,14 @@
|
||||
"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": [
|
||||
[
|
||||
"OSSAudioUploader",
|
||||
@ -5193,6 +5299,14 @@
|
||||
"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": [
|
||||
[
|
||||
"AnimemoryNode"
|
||||
@ -5398,10 +5512,14 @@
|
||||
],
|
||||
"https://github.com/bakker/BK_Utils": [
|
||||
[
|
||||
"DynamicGroupSwitchMulti",
|
||||
"FileNameDefinition",
|
||||
"FluxPromptSaver",
|
||||
"FluxTextSampler",
|
||||
"IsOneOfGroupsActive",
|
||||
"ModelName",
|
||||
"SamePixelResolutionCalculator"
|
||||
"SamePixelResolutionCalculator",
|
||||
"ZImageTurboResolutions"
|
||||
],
|
||||
{
|
||||
"title_aux": "BK_Utils [WIP]"
|
||||
@ -6070,6 +6188,8 @@
|
||||
"AudioEncoderEncode",
|
||||
"AudioEncoderLoader",
|
||||
"AudioMerge",
|
||||
"AutogrowNamesTestNode",
|
||||
"AutogrowPrefixTestNode",
|
||||
"BasicGuider",
|
||||
"BasicScheduler",
|
||||
"BetaSamplingScheduler",
|
||||
@ -6095,6 +6215,7 @@
|
||||
"CLIPTextEncodeFlux",
|
||||
"CLIPTextEncodeHiDream",
|
||||
"CLIPTextEncodeHunyuanDiT",
|
||||
"CLIPTextEncodeKandinsky5",
|
||||
"CLIPTextEncodeLumina2",
|
||||
"CLIPTextEncodePixArtAlpha",
|
||||
"CLIPTextEncodeSD3",
|
||||
@ -6108,6 +6229,7 @@
|
||||
"CheckpointLoaderSimple",
|
||||
"CheckpointSave",
|
||||
"ChromaRadianceOptions",
|
||||
"ComfySwitchNode",
|
||||
"ConditioningAverage",
|
||||
"ConditioningCombine",
|
||||
"ConditioningConcat",
|
||||
@ -6129,6 +6251,7 @@
|
||||
"CosmosPredict2ImageToVideoLatent",
|
||||
"CreateVideo",
|
||||
"CropMask",
|
||||
"DCTestNode",
|
||||
"DiffControlNetLoader",
|
||||
"DifferentialDiffusion",
|
||||
"DiffusersLoader",
|
||||
@ -6221,6 +6344,7 @@
|
||||
"KSampler",
|
||||
"KSamplerAdvanced",
|
||||
"KSamplerSelect",
|
||||
"Kandinsky5ImageToVideo",
|
||||
"KarrasScheduler",
|
||||
"KlingCameraControlI2VNode",
|
||||
"KlingCameraControlT2VNode",
|
||||
@ -6230,6 +6354,12 @@
|
||||
"KlingImageGenerationNode",
|
||||
"KlingLipSyncAudioToVideoNode",
|
||||
"KlingLipSyncTextToVideoNode",
|
||||
"KlingOmniProEditVideoNode",
|
||||
"KlingOmniProFirstLastFrameNode",
|
||||
"KlingOmniProImageNode",
|
||||
"KlingOmniProImageToVideoNode",
|
||||
"KlingOmniProTextToVideoNode",
|
||||
"KlingOmniProVideoToVideoNode",
|
||||
"KlingSingleImageVideoEffectNode",
|
||||
"KlingStartEndFrameNode",
|
||||
"KlingTextToVideoNode",
|
||||
@ -6332,6 +6462,7 @@
|
||||
"MoonvalleyTxt2VideoNode",
|
||||
"MoonvalleyVideo2VideoNode",
|
||||
"Morphology",
|
||||
"NormalizeVideoLatentStart",
|
||||
"OpenAIChatConfig",
|
||||
"OpenAIChatNode",
|
||||
"OpenAIDalle2",
|
||||
@ -6393,6 +6524,7 @@
|
||||
"RenormCFG",
|
||||
"RepeatImageBatch",
|
||||
"RepeatLatentBatch",
|
||||
"ReplaceVideoLatentFrames",
|
||||
"RescaleCFG",
|
||||
"ResizeAndPadImage",
|
||||
"Rodin3D_Detail",
|
||||
@ -7356,6 +7488,7 @@
|
||||
"SceneSelect",
|
||||
"SceneUpdate",
|
||||
"SceneView",
|
||||
"SceneWanVideoLoraMultiSave",
|
||||
"SubdirLister",
|
||||
"TailEnhancePro",
|
||||
"TailSplit"
|
||||
@ -7824,6 +7957,22 @@
|
||||
"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": [
|
||||
[
|
||||
"FP8QuantizeFormat",
|
||||
@ -8068,6 +8217,7 @@
|
||||
"Alta:GetImageAndPath",
|
||||
"Alta:GetImageByIndex",
|
||||
"Alta:GetStringByIndex",
|
||||
"Alta:IfOnly(Logic)",
|
||||
"Alta:Int2Str(Math)",
|
||||
"Alta:JSONKeyExtractor(Util)",
|
||||
"Alta:ListAllFiles",
|
||||
@ -8607,14 +8757,18 @@
|
||||
],
|
||||
"https://github.com/kaski23/Kaskis_Comfy_Nodes": [
|
||||
[
|
||||
"CollectVideoNode",
|
||||
"CollectKeyedVideosNode",
|
||||
"CollectVideosNode",
|
||||
"ImageDelay",
|
||||
"IntToString",
|
||||
"KlingVideoHandler",
|
||||
"LoadImageWithFilename",
|
||||
"LoadVideoWithFilename",
|
||||
"PairSwitchNode",
|
||||
"PreviewImageLimited",
|
||||
"StringSplitSelect",
|
||||
"Unbroken-Video-Handler"
|
||||
"Unbroken-Video-Handler",
|
||||
"WorkflowLoggerNode"
|
||||
],
|
||||
{
|
||||
"title_aux": "Kaskis_Comfy_Nodes"
|
||||
@ -9040,6 +9194,17 @@
|
||||
"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": [
|
||||
[
|
||||
"AgeTransformationNode"
|
||||
@ -9100,7 +9265,9 @@
|
||||
],
|
||||
"https://github.com/lggcfx2020/ComfyUI-LGGCFX-Tools": [
|
||||
[
|
||||
"LGGCFX_ImagePreview",
|
||||
"LGGCFX_audio",
|
||||
"LGGCFX_prompt",
|
||||
"LGGCFX_resolution",
|
||||
"LGGCFX_time_frame",
|
||||
"VRAMReserver"
|
||||
@ -9124,12 +9291,19 @@
|
||||
[
|
||||
"CSVRandomPicker",
|
||||
"CSVRandomPickerAdv",
|
||||
"ImageBatchtoImageList",
|
||||
"ImageBatchtoImages",
|
||||
"KSamplerConfig",
|
||||
"KSamplerSchedulerFallback",
|
||||
"LoadImageBatch",
|
||||
"LoadZipBatch",
|
||||
"MaskToSAMCoords",
|
||||
"MaskToSAMCoordsV2",
|
||||
"MorseCode",
|
||||
"PoseReformer",
|
||||
"SaveITAsZip",
|
||||
"SaveImageAsZip",
|
||||
"SaveTextAsZip",
|
||||
"StrFormat",
|
||||
"StrFormatAdv",
|
||||
"YoloFaceReformer",
|
||||
@ -9481,10 +9655,15 @@
|
||||
"https://github.com/lyra-ai/lyra-nodes": [
|
||||
[
|
||||
"LyraAudioVisualizer",
|
||||
"LyraCdnUploader",
|
||||
"LyraCollectOpenAIResponse",
|
||||
"LyraCustomOpenAIRequest",
|
||||
"LyraFilenameBuilder",
|
||||
"LyraImageAudioFusion",
|
||||
"LyraLoadAudioFromURL",
|
||||
"LyraLoadImageFromURL"
|
||||
"LyraLoadImageFromURL",
|
||||
"LyraStringToTypes",
|
||||
"LyraWebRequester"
|
||||
],
|
||||
{
|
||||
"title_aux": "lyra-nodes"
|
||||
@ -10054,10 +10233,11 @@
|
||||
"https://github.com/nobinBB/comfyui-samenodes": [
|
||||
[
|
||||
"BatchImageProcessor",
|
||||
"CivitaiBulkDownloader",
|
||||
"ExtractPromptFromImage",
|
||||
"FloatToString",
|
||||
"FloatToStringWithPrefix",
|
||||
"LoraWildcardGenerator",
|
||||
"UpscaleImageByUsingModelCustom"
|
||||
"LoraWildcardGenerator"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui-samenodes"
|
||||
@ -10563,6 +10743,30 @@
|
||||
"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": [
|
||||
[
|
||||
"rakete.BuildString",
|
||||
@ -11142,7 +11346,10 @@
|
||||
[
|
||||
"GetJsonKeyValue",
|
||||
"Image_Color_Noise",
|
||||
"SamplingParameters"
|
||||
"ModifyMask",
|
||||
"SamplingParameters",
|
||||
"TextEncodeFlux2SystemPrompt",
|
||||
"TextEncodeZITSystemPrompt"
|
||||
],
|
||||
{
|
||||
"title_aux": "Sampling Utility Toolkit"
|
||||
@ -12273,6 +12480,14 @@
|
||||
"title_aux": "ComfyUI_RasterCardMaker"
|
||||
}
|
||||
],
|
||||
"https://github.com/xiaoxidashen/comfyui_my_utils": [
|
||||
[
|
||||
"VideoSplitCombine"
|
||||
],
|
||||
{
|
||||
"title_aux": "comfyui_my_utils"
|
||||
}
|
||||
],
|
||||
"https://github.com/xiaoyumu/ComfyUI-XYNodes": [
|
||||
[
|
||||
"AdjustImageColor",
|
||||
@ -12318,6 +12533,19 @@
|
||||
"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": [
|
||||
[
|
||||
"Gemini3Chat",
|
||||
@ -12654,6 +12882,23 @@
|
||||
],
|
||||
"https://github.com/zhuanvi/ComfyUI-ZVNodes": [
|
||||
[
|
||||
"ApimartDownloadSavedTaskImageZV",
|
||||
"ApimartDownloadSavedTaskVideoZV",
|
||||
"ApimartImage2VideoSubmitZV",
|
||||
"ApimartNanoBananaProImageSubmitZV",
|
||||
"ApimartRemixByTaskIdSubmitZV",
|
||||
"ApimartRemixVideoSubmitZV",
|
||||
"ApimartSeedream40ImageSubmitZV",
|
||||
"ApimartSeedream45ImageSubmitZV",
|
||||
"ApimartText2VideoSubmitZV",
|
||||
"BBOXFormatConverterZV",
|
||||
"GrsaiLoadImageFromPathNodeZV",
|
||||
"GrsaiNanoBananaGeminiNodeZV",
|
||||
"GrsaiNanoBananaNodeZV",
|
||||
"GrsaiResultNodeZV",
|
||||
"GrsaiSoraCreateCharacterNodeZV",
|
||||
"GrsaiSoraUploadCharacterNodeZV",
|
||||
"GrsaiSoraVideoNodeZV",
|
||||
"ImageCounterNodeZV",
|
||||
"JoinListZV",
|
||||
"JsonListIndexerZV",
|
||||
@ -12667,6 +12912,7 @@
|
||||
"LoadImageFromDirZV",
|
||||
"LoadImageFromUrlZV",
|
||||
"LoadTxtFromDirZV",
|
||||
"LoadVideoFromDirZV",
|
||||
"MultiLineConditionalZV",
|
||||
"MultiLineOperationZV",
|
||||
"PatternFillNodeZV",
|
||||
@ -12674,8 +12920,11 @@
|
||||
"RandomSelectListZV",
|
||||
"SaveImageToPathZV",
|
||||
"SaveTxtToPathZV",
|
||||
"StringToPathZV",
|
||||
"TriangleCharacterLayoutZV",
|
||||
"TxtCounterNodeZV",
|
||||
"UniversalBBOXToMaskZV",
|
||||
"Veo31Image2VideoSubmitZV",
|
||||
"VideoSceneDetectorZV",
|
||||
"VideoSpeedZV",
|
||||
"doubaoI2INodeZV",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,65 @@
|
||||
{
|
||||
"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",
|
||||
"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__))
|
||||
|
||||
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_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")
|
||||
@ -516,7 +524,8 @@ check_bypass_ssl()
|
||||
|
||||
# Perform install
|
||||
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)
|
||||
|
||||
|
||||
@ -793,7 +802,11 @@ def execute_startup_script():
|
||||
|
||||
|
||||
# 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()
|
||||
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
[project]
|
||||
name = "comfyui-manager"
|
||||
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
|
||||
version = "3.37.2"
|
||||
version = "3.38.1"
|
||||
license = { file = "LICENSE.txt" }
|
||||
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