Compare commits
32 Commits
feat/add-t
...
feat/compl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
49549ddcb8 | ||
|
|
35eddc2965 | ||
|
|
798b203274 | ||
|
|
9d2034bd4f | ||
|
|
6233fabe02 | ||
|
|
48ba2f4b4c | ||
|
|
3799af0017 | ||
|
|
403947a5d1 | ||
|
|
276ccca4f6 | ||
|
|
31de92a7ef | ||
|
|
3ae4aecd84 | ||
|
|
7896949719 | ||
|
|
86c7482048 | ||
|
|
0146655f0f | ||
|
|
89bb61fb05 | ||
|
|
dfd9a3ec7b | ||
|
|
985c987603 | ||
|
|
1ce35679b1 | ||
|
|
6e1c906aff | ||
|
|
cd8e87a3fb | ||
|
|
8b9420731a | ||
|
|
d9918cf773 | ||
|
|
163782e445 | ||
|
|
ad14e1ed13 | ||
|
|
b4392293fa | ||
|
|
e8ff505ebf | ||
|
|
8a5226b1d4 | ||
|
|
422af67217 | ||
|
|
5c300f75e7 | ||
|
|
5ea7bf3683 | ||
|
|
34efbe9262 | ||
|
|
9d24038a7d |
70
.github/workflows/ci.yml
vendored
70
.github/workflows/ci.yml
vendored
@@ -1,70 +0,0 @@
|
|||||||
name: CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main, feat/*, fix/* ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main ]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
validate-openapi:
|
|
||||||
name: Validate OpenAPI Specification
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Check if OpenAPI changed
|
|
||||||
id: openapi-changed
|
|
||||||
uses: tj-actions/changed-files@v44
|
|
||||||
with:
|
|
||||||
files: openapi.yaml
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
if: steps.openapi-changed.outputs.any_changed == 'true'
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '18'
|
|
||||||
|
|
||||||
- name: Install Redoc CLI
|
|
||||||
if: steps.openapi-changed.outputs.any_changed == 'true'
|
|
||||||
run: |
|
|
||||||
npm install -g @redocly/cli
|
|
||||||
|
|
||||||
- name: Validate OpenAPI specification
|
|
||||||
if: steps.openapi-changed.outputs.any_changed == 'true'
|
|
||||||
run: |
|
|
||||||
redocly lint openapi.yaml
|
|
||||||
|
|
||||||
code-quality:
|
|
||||||
name: Code Quality Checks
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0 # Fetch all history for proper diff
|
|
||||||
|
|
||||||
- name: Get changed Python files
|
|
||||||
id: changed-py-files
|
|
||||||
uses: tj-actions/changed-files@v44
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
**/*.py
|
|
||||||
files_ignore: |
|
|
||||||
comfyui_manager/legacy/**
|
|
||||||
|
|
||||||
- name: Setup Python
|
|
||||||
if: steps.changed-py-files.outputs.any_changed == 'true'
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.9'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
if: steps.changed-py-files.outputs.any_changed == 'true'
|
|
||||||
run: |
|
|
||||||
pip install ruff
|
|
||||||
|
|
||||||
- name: Run ruff linting on changed files
|
|
||||||
if: steps.changed-py-files.outputs.any_changed == 'true'
|
|
||||||
run: |
|
|
||||||
echo "Changed files: ${{ steps.changed-py-files.outputs.all_changed_files }}"
|
|
||||||
echo "${{ steps.changed-py-files.outputs.all_changed_files }}" | xargs -r ruff check
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -19,6 +19,5 @@ pip_overrides.json
|
|||||||
check2.sh
|
check2.sh
|
||||||
/venv/
|
/venv/
|
||||||
build
|
build
|
||||||
dist
|
|
||||||
*.egg-info
|
*.egg-info
|
||||||
.env
|
.env
|
||||||
@@ -676,7 +676,7 @@ def install(
|
|||||||
cmd_ctx.set_channel_mode(channel, mode)
|
cmd_ctx.set_channel_mode(channel, mode)
|
||||||
cmd_ctx.set_no_deps(no_deps)
|
cmd_ctx.set_no_deps(no_deps)
|
||||||
|
|
||||||
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, context.manager_files_path)
|
pip_fixer = manager_util.PIPFixer(manager_util.get_installed_packages(), comfy_path, core.manager_files_path)
|
||||||
for_each_nodes(nodes, act=install_node, exit_on_fail=exit_on_fail)
|
for_each_nodes(nodes, act=install_node, exit_on_fail=exit_on_fail)
|
||||||
pip_fixer.fix_broken()
|
pip_fixer.fix_broken()
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
# ComfyUI-Manager: Core Backend (glob)
|
|
||||||
|
|
||||||
This directory contains the Python backend modules that power ComfyUI-Manager, handling the core functionality of node management, downloading, security, and server operations.
|
|
||||||
|
|
||||||
## Core Modules
|
|
||||||
|
|
||||||
- **manager_downloader.py**: Handles downloading operations for models, extensions, and other resources.
|
|
||||||
- **manager_util.py**: Provides utility functions used throughout the system.
|
|
||||||
|
|
||||||
## Specialized Modules
|
|
||||||
|
|
||||||
- **cm_global.py**: Maintains global variables and state management across the system.
|
|
||||||
- **cnr_utils.py**: Helper utilities for interacting with the custom node registry (CNR).
|
|
||||||
- **git_utils.py**: Git-specific utilities for repository operations.
|
|
||||||
- **node_package.py**: Handles the packaging and installation of node extensions.
|
|
||||||
- **security_check.py**: Implements the multi-level security system for installation safety.
|
|
||||||
@@ -46,8 +46,6 @@ def git_url(fullpath):
|
|||||||
|
|
||||||
for k, v in config.items():
|
for k, v in config.items():
|
||||||
if k.startswith('remote ') and 'url' in v:
|
if k.startswith('remote ') and 'url' in v:
|
||||||
if 'Comfy-Org/ComfyUI-Manager' in v['url']:
|
|
||||||
return "https://github.com/ltdrdata/ComfyUI-Manager"
|
|
||||||
return v['url']
|
return v['url']
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|||||||
@@ -42,13 +42,7 @@ from .generated_models import (
|
|||||||
ManagerPackInstallType,
|
ManagerPackInstallType,
|
||||||
ManagerPack,
|
ManagerPack,
|
||||||
InstallPackParams,
|
InstallPackParams,
|
||||||
UpdatePackParams,
|
|
||||||
UpdateAllPacksParams,
|
UpdateAllPacksParams,
|
||||||
UpdateComfyUIParams,
|
|
||||||
FixPackParams,
|
|
||||||
UninstallPackParams,
|
|
||||||
DisablePackParams,
|
|
||||||
EnablePackParams,
|
|
||||||
QueueStatus,
|
QueueStatus,
|
||||||
ManagerMappings,
|
ManagerMappings,
|
||||||
ModelMetadata,
|
ModelMetadata,
|
||||||
@@ -97,13 +91,7 @@ __all__ = [
|
|||||||
"ManagerPackInstallType",
|
"ManagerPackInstallType",
|
||||||
"ManagerPack",
|
"ManagerPack",
|
||||||
"InstallPackParams",
|
"InstallPackParams",
|
||||||
"UpdatePackParams",
|
|
||||||
"UpdateAllPacksParams",
|
"UpdateAllPacksParams",
|
||||||
"UpdateComfyUIParams",
|
|
||||||
"FixPackParams",
|
|
||||||
"UninstallPackParams",
|
|
||||||
"DisablePackParams",
|
|
||||||
"EnablePackParams",
|
|
||||||
"QueueStatus",
|
"QueueStatus",
|
||||||
"ManagerMappings",
|
"ManagerMappings",
|
||||||
"ModelMetadata",
|
"ModelMetadata",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# generated by datamodel-codegen:
|
# generated by datamodel-codegen:
|
||||||
# filename: openapi.yaml
|
# filename: openapi.yaml
|
||||||
# timestamp: 2025-06-14T01:44:21+00:00
|
# timestamp: 2025-06-08T08:07:38+00:00
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
@@ -23,6 +23,12 @@ class Kind(str, Enum):
|
|||||||
install_model = 'install-model'
|
install_model = 'install-model'
|
||||||
|
|
||||||
|
|
||||||
|
class QueueTaskItem(BaseModel):
|
||||||
|
ui_id: str = Field(..., description='Unique identifier for the task')
|
||||||
|
client_id: str = Field(..., description='Client identifier that initiated the task')
|
||||||
|
kind: Kind = Field(..., description='Type of task being performed')
|
||||||
|
|
||||||
|
|
||||||
class StatusStr(str, Enum):
|
class StatusStr(str, Enum):
|
||||||
success = 'success'
|
success = 'success'
|
||||||
error = 'error'
|
error = 'error'
|
||||||
@@ -99,7 +105,7 @@ class ManagerPackInstallType(str, Enum):
|
|||||||
cnr = 'cnr'
|
cnr = 'cnr'
|
||||||
|
|
||||||
|
|
||||||
class UpdateState(Enum):
|
class UpdateState(str, Enum):
|
||||||
false = 'false'
|
false = 'false'
|
||||||
true = 'true'
|
true = 'true'
|
||||||
|
|
||||||
@@ -148,49 +154,6 @@ class UpdateAllPacksParams(BaseModel):
|
|||||||
ui_id: Optional[str] = Field(None, description='Task ID - generated internally')
|
ui_id: Optional[str] = Field(None, description='Task ID - generated internally')
|
||||||
|
|
||||||
|
|
||||||
class UpdatePackParams(BaseModel):
|
|
||||||
node_name: str = Field(..., description='Name of the node package to update')
|
|
||||||
node_ver: Optional[str] = Field(
|
|
||||||
None, description='Current version of the node package'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class UpdateComfyUIParams(BaseModel):
|
|
||||||
is_stable: Optional[bool] = Field(
|
|
||||||
True,
|
|
||||||
description='Whether to update to stable version (true) or nightly (false)',
|
|
||||||
)
|
|
||||||
target_version: Optional[str] = Field(
|
|
||||||
None,
|
|
||||||
description='Specific version to switch to (for version switching operations)',
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class FixPackParams(BaseModel):
|
|
||||||
node_name: str = Field(..., description='Name of the node package to fix')
|
|
||||||
node_ver: str = Field(..., description='Version of the node package')
|
|
||||||
|
|
||||||
|
|
||||||
class UninstallPackParams(BaseModel):
|
|
||||||
node_name: str = Field(..., description='Name of the node package to uninstall')
|
|
||||||
is_unknown: Optional[bool] = Field(
|
|
||||||
False, description='Whether this is an unknown/unregistered package'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class DisablePackParams(BaseModel):
|
|
||||||
node_name: str = Field(..., description='Name of the node package to disable')
|
|
||||||
is_unknown: Optional[bool] = Field(
|
|
||||||
False, description='Whether this is an unknown/unregistered package'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class EnablePackParams(BaseModel):
|
|
||||||
cnr_id: str = Field(
|
|
||||||
..., description='ComfyUI Node Registry ID of the package to enable'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class QueueStatus(BaseModel):
|
class QueueStatus(BaseModel):
|
||||||
total_count: int = Field(
|
total_count: int = Field(
|
||||||
..., description='Total number of tasks (pending + running)'
|
..., description='Total number of tasks (pending + running)'
|
||||||
@@ -206,16 +169,14 @@ class QueueStatus(BaseModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class ManagerMappings1(BaseModel):
|
class ManagerMapping(BaseModel):
|
||||||
title_aux: Optional[str] = Field(None, description='The display name of the pack')
|
title_aux: Optional[str] = Field(None, description='The display name of the pack')
|
||||||
|
|
||||||
|
|
||||||
class ManagerMappings(
|
class ManagerMappings(
|
||||||
RootModel[Optional[Dict[str, List[Union[List[str], ManagerMappings1]]]]]
|
RootModel[Optional[Dict[str, List[Union[List[str], ManagerMapping]]]]]
|
||||||
):
|
):
|
||||||
root: Optional[Dict[str, List[Union[List[str], ManagerMappings1]]]] = Field(
|
root: Optional[Dict[str, List[Union[List[str], ManagerMapping]]]] = None
|
||||||
None, description='Tuple of [node_names, metadata]'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class ModelMetadata(BaseModel):
|
class ModelMetadata(BaseModel):
|
||||||
@@ -397,23 +358,6 @@ class BatchExecutionRecord(BaseModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class QueueTaskItem(BaseModel):
|
|
||||||
ui_id: str = Field(..., description='Unique identifier for the task')
|
|
||||||
client_id: str = Field(..., description='Client identifier that initiated the task')
|
|
||||||
kind: Kind = Field(..., description='Type of task being performed')
|
|
||||||
params: Union[
|
|
||||||
InstallPackParams,
|
|
||||||
UpdatePackParams,
|
|
||||||
UpdateAllPacksParams,
|
|
||||||
UpdateComfyUIParams,
|
|
||||||
FixPackParams,
|
|
||||||
UninstallPackParams,
|
|
||||||
DisablePackParams,
|
|
||||||
EnablePackParams,
|
|
||||||
ModelMetadata,
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class TaskHistoryItem(BaseModel):
|
class TaskHistoryItem(BaseModel):
|
||||||
ui_id: str = Field(..., description='Unique identifier for the task')
|
ui_id: str = Field(..., description='Unique identifier for the task')
|
||||||
client_id: str = Field(..., description='Client identifier that initiated the task')
|
client_id: str = Field(..., description='Client identifier that initiated the task')
|
||||||
@@ -433,9 +377,6 @@ class TaskStateMessage(BaseModel):
|
|||||||
pending_queue: List[QueueTaskItem] = Field(
|
pending_queue: List[QueueTaskItem] = Field(
|
||||||
..., description='Tasks waiting to be executed'
|
..., description='Tasks waiting to be executed'
|
||||||
)
|
)
|
||||||
installed_packs: Dict[str, ManagerPackInstalled] = Field(
|
|
||||||
..., description='Map of currently installed node packages by name'
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class MessageTaskDone(BaseModel):
|
class MessageTaskDone(BaseModel):
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
- Anytime you make a change to the data being sent or received, you should follow this process:
|
|
||||||
1. Adjust the openapi.yaml file first
|
|
||||||
2. Verify the syntax of the openapi.yaml file using `yaml.safe_load`
|
|
||||||
3. Regenerate the types following the instructions in the `data_models/README.md` file
|
|
||||||
4. Verify the new data model is generated
|
|
||||||
5. Verify the syntax of the generated types files
|
|
||||||
6. Run formatting and linting on the generated types files
|
|
||||||
7. Adjust the `__init__.py` files in the `data_models` directory to match/export the new data model
|
|
||||||
8. Only then, make the changes to the rest of the codebase
|
|
||||||
9. Run the CI tests to verify that the changes are working
|
|
||||||
@@ -2,16 +2,20 @@
|
|||||||
|
|
||||||
This directory contains the Python backend modules that power ComfyUI-Manager, handling the core functionality of node management, downloading, security, and server operations.
|
This directory contains the Python backend modules that power ComfyUI-Manager, handling the core functionality of node management, downloading, security, and server operations.
|
||||||
|
|
||||||
## Directory Structure
|
|
||||||
- **glob/** - code for new cacheless ComfyUI-Manager
|
|
||||||
- **legacy/** - code for legacy ComfyUI-Manager
|
|
||||||
|
|
||||||
## Core Modules
|
## Core Modules
|
||||||
|
|
||||||
- **manager_core.py**: The central implementation of management functions, handling configuration, installation, updates, and node management.
|
- **manager_core.py**: The central implementation of management functions, handling configuration, installation, updates, and node management.
|
||||||
- **manager_server.py**: Implements server functionality and API endpoints for the web interface to interact with the backend.
|
- **manager_server.py**: Implements server functionality and API endpoints for the web interface to interact with the backend.
|
||||||
|
- **manager_downloader.py**: Handles downloading operations for models, extensions, and other resources.
|
||||||
|
- **manager_util.py**: Provides utility functions used throughout the system.
|
||||||
|
|
||||||
## Specialized Modules
|
## Specialized Modules
|
||||||
|
|
||||||
|
- **cm_global.py**: Maintains global variables and state management across the system.
|
||||||
|
- **cnr_utils.py**: Helper utilities for interacting with the custom node registry (CNR).
|
||||||
|
- **git_utils.py**: Git-specific utilities for repository operations.
|
||||||
|
- **node_package.py**: Handles the packaging and installation of node extensions.
|
||||||
|
- **security_check.py**: Implements the multi-level security system for installation safety.
|
||||||
- **share_3rdparty.py**: Manages integration with third-party sharing platforms.
|
- **share_3rdparty.py**: Manages integration with third-party sharing platforms.
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
@@ -150,6 +150,82 @@ def check_invalid_nodes():
|
|||||||
print("\n---------------------------------------------------------------------------\n")
|
print("\n---------------------------------------------------------------------------\n")
|
||||||
|
|
||||||
|
|
||||||
|
# read env vars
|
||||||
|
comfy_path: str = os.environ.get('COMFYUI_PATH')
|
||||||
|
comfy_base_path = os.environ.get('COMFYUI_FOLDERS_BASE_PATH')
|
||||||
|
|
||||||
|
if comfy_path is None:
|
||||||
|
try:
|
||||||
|
comfy_path = os.path.abspath(os.path.dirname(sys.modules['__main__'].__file__))
|
||||||
|
os.environ['COMFYUI_PATH'] = comfy_path
|
||||||
|
except:
|
||||||
|
logging.error("[ComfyUI-Manager] environment variable 'COMFYUI_PATH' is not specified.")
|
||||||
|
exit(-1)
|
||||||
|
|
||||||
|
if comfy_base_path is None:
|
||||||
|
comfy_base_path = comfy_path
|
||||||
|
|
||||||
|
|
||||||
|
channel_list_template_path = os.path.join(manager_util.comfyui_manager_path, 'channels.list.template')
|
||||||
|
git_script_path = os.path.join(manager_util.comfyui_manager_path, "git_helper.py")
|
||||||
|
|
||||||
|
manager_files_path = None
|
||||||
|
manager_config_path = None
|
||||||
|
manager_channel_list_path = None
|
||||||
|
manager_startup_script_path:str = None
|
||||||
|
manager_snapshot_path = None
|
||||||
|
manager_pip_overrides_path = None
|
||||||
|
manager_pip_blacklist_path = None
|
||||||
|
manager_components_path = None
|
||||||
|
manager_batch_history_path = None
|
||||||
|
|
||||||
|
def update_user_directory(user_dir):
|
||||||
|
global manager_files_path
|
||||||
|
global manager_config_path
|
||||||
|
global manager_channel_list_path
|
||||||
|
global manager_startup_script_path
|
||||||
|
global manager_snapshot_path
|
||||||
|
global manager_pip_overrides_path
|
||||||
|
global manager_pip_blacklist_path
|
||||||
|
global manager_components_path
|
||||||
|
global manager_batch_history_path
|
||||||
|
|
||||||
|
manager_files_path = os.path.abspath(os.path.join(user_dir, 'default', 'ComfyUI-Manager'))
|
||||||
|
if not os.path.exists(manager_files_path):
|
||||||
|
os.makedirs(manager_files_path)
|
||||||
|
|
||||||
|
manager_snapshot_path = os.path.join(manager_files_path, "snapshots")
|
||||||
|
if not os.path.exists(manager_snapshot_path):
|
||||||
|
os.makedirs(manager_snapshot_path)
|
||||||
|
|
||||||
|
manager_startup_script_path = os.path.join(manager_files_path, "startup-scripts")
|
||||||
|
if not os.path.exists(manager_startup_script_path):
|
||||||
|
os.makedirs(manager_startup_script_path)
|
||||||
|
|
||||||
|
manager_config_path = os.path.join(manager_files_path, 'config.ini')
|
||||||
|
manager_channel_list_path = os.path.join(manager_files_path, 'channels.list')
|
||||||
|
manager_pip_overrides_path = os.path.join(manager_files_path, "pip_overrides.json")
|
||||||
|
manager_pip_blacklist_path = os.path.join(manager_files_path, "pip_blacklist.list")
|
||||||
|
manager_components_path = os.path.join(manager_files_path, "components")
|
||||||
|
manager_util.cache_dir = os.path.join(manager_files_path, "cache")
|
||||||
|
manager_batch_history_path = os.path.join(manager_files_path, "batch_history")
|
||||||
|
|
||||||
|
if not os.path.exists(manager_util.cache_dir):
|
||||||
|
os.makedirs(manager_util.cache_dir)
|
||||||
|
|
||||||
|
if not os.path.exists(manager_batch_history_path):
|
||||||
|
os.makedirs(manager_batch_history_path)
|
||||||
|
|
||||||
|
try:
|
||||||
|
import folder_paths
|
||||||
|
update_user_directory(folder_paths.get_user_directory())
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
# fallback:
|
||||||
|
# This case is only possible when running with cm-cli, and in practice, this case is not actually used.
|
||||||
|
update_user_directory(os.path.abspath(manager_util.comfyui_manager_path))
|
||||||
|
|
||||||
|
|
||||||
cached_config = None
|
cached_config = None
|
||||||
js_path = None
|
js_path = None
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ import git
|
|||||||
import logging
|
import logging
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from comfyui_manager.common import context
|
from comfyui_manager.common import context, manager_util
|
||||||
import folder_paths
|
import folder_paths
|
||||||
from comfy.cli_args import args
|
from comfy.cli_args import args
|
||||||
import latent_preview
|
import latent_preview
|
||||||
@@ -125,18 +125,17 @@ def initialize_environment():
|
|||||||
context.comfy_path = os.path.dirname(folder_paths.__file__)
|
context.comfy_path = os.path.dirname(folder_paths.__file__)
|
||||||
core.js_path = os.path.join(context.comfy_path, "web", "extensions")
|
core.js_path = os.path.join(context.comfy_path, "web", "extensions")
|
||||||
|
|
||||||
# Legacy database paths - kept for potential future use
|
local_db_model = os.path.join(manager_util.comfyui_manager_path, "model-list.json")
|
||||||
# local_db_model = os.path.join(manager_util.comfyui_manager_path, "model-list.json")
|
local_db_alter = os.path.join(manager_util.comfyui_manager_path, "alter-list.json")
|
||||||
# local_db_alter = os.path.join(manager_util.comfyui_manager_path, "alter-list.json")
|
local_db_custom_node_list = os.path.join(
|
||||||
# local_db_custom_node_list = os.path.join(
|
manager_util.comfyui_manager_path, "custom-node-list.json"
|
||||||
# manager_util.comfyui_manager_path, "custom-node-list.json"
|
)
|
||||||
# )
|
local_db_extension_node_mappings = os.path.join(
|
||||||
# local_db_extension_node_mappings = os.path.join(
|
manager_util.comfyui_manager_path, "extension-node-map.json"
|
||||||
# manager_util.comfyui_manager_path, "extension-node-map.json"
|
)
|
||||||
# )
|
|
||||||
|
|
||||||
set_preview_method(core.get_config()["preview_method"])
|
set_preview_method(core.get_config()["preview_method"])
|
||||||
print_comfyui_version()
|
environment_utils.print_comfyui_version()
|
||||||
setup_environment()
|
setup_environment()
|
||||||
|
|
||||||
core.check_invalid_nodes()
|
core.check_invalid_nodes()
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import locale
|
import locale
|
||||||
import sys
|
import sys
|
||||||
import re
|
|
||||||
|
|
||||||
|
|
||||||
def handle_stream(stream, prefix):
|
def handle_stream(stream, prefix):
|
||||||
@@ -20,41 +19,3 @@ def handle_stream(stream, prefix):
|
|||||||
print(prefix, msg, end="", file=sys.stderr)
|
print(prefix, msg, end="", file=sys.stderr)
|
||||||
else:
|
else:
|
||||||
print(prefix, msg, end="")
|
print(prefix, msg, end="")
|
||||||
|
|
||||||
|
|
||||||
def convert_markdown_to_html(input_text):
|
|
||||||
pattern_a = re.compile(r"\[a/([^]]+)]\(([^)]+)\)")
|
|
||||||
pattern_w = re.compile(r"\[w/([^]]+)]")
|
|
||||||
pattern_i = re.compile(r"\[i/([^]]+)]")
|
|
||||||
pattern_bold = re.compile(r"\*\*([^*]+)\*\*")
|
|
||||||
pattern_white = re.compile(r"%%([^*]+)%%")
|
|
||||||
|
|
||||||
def replace_a(match):
|
|
||||||
return f"<a href='{match.group(2)}' target='blank'>{match.group(1)}</a>"
|
|
||||||
|
|
||||||
def replace_w(match):
|
|
||||||
return f"<p class='cm-warn-note'>{match.group(1)}</p>"
|
|
||||||
|
|
||||||
def replace_i(match):
|
|
||||||
return f"<p class='cm-info-note'>{match.group(1)}</p>"
|
|
||||||
|
|
||||||
def replace_bold(match):
|
|
||||||
return f"<B>{match.group(1)}</B>"
|
|
||||||
|
|
||||||
def replace_white(match):
|
|
||||||
return f"<font color='white'>{match.group(1)}</font>"
|
|
||||||
|
|
||||||
input_text = (
|
|
||||||
input_text.replace("\\[", "[")
|
|
||||||
.replace("\\]", "]")
|
|
||||||
.replace("<", "<")
|
|
||||||
.replace(">", ">")
|
|
||||||
)
|
|
||||||
|
|
||||||
result_text = re.sub(pattern_a, replace_a, input_text)
|
|
||||||
result_text = re.sub(pattern_w, replace_w, result_text)
|
|
||||||
result_text = re.sub(pattern_i, replace_i, result_text)
|
|
||||||
result_text = re.sub(pattern_bold, replace_bold, result_text)
|
|
||||||
result_text = re.sub(pattern_white, replace_white, result_text)
|
|
||||||
|
|
||||||
return result_text.replace("\n", "<BR>")
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import logging
|
|||||||
import folder_paths
|
import folder_paths
|
||||||
|
|
||||||
from comfyui_manager.glob import manager_core as core
|
from comfyui_manager.glob import manager_core as core
|
||||||
from comfyui_manager.glob.constants import model_dir_name_map
|
|
||||||
|
|
||||||
|
|
||||||
def get_model_dir(data, show_log=False):
|
def get_model_dir(data, show_log=False):
|
||||||
|
|||||||
@@ -1,18 +1,7 @@
|
|||||||
from comfyui_manager.glob import manager_core as core
|
from comfyui_manager.glob import manager_core as core
|
||||||
from comfy.cli_args import args
|
|
||||||
|
|
||||||
|
|
||||||
def is_loopback(address):
|
|
||||||
import ipaddress
|
|
||||||
try:
|
|
||||||
return ipaddress.ip_address(address).is_loopback
|
|
||||||
except ValueError:
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def is_allowed_security_level(level):
|
def is_allowed_security_level(level):
|
||||||
is_local_mode = is_loopback(args.listen)
|
|
||||||
|
|
||||||
if level == "block":
|
if level == "block":
|
||||||
return False
|
return False
|
||||||
elif level == "high":
|
elif level == "high":
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ function isBeforeFrontendVersion(compareVersion) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const is_legacy_front = () => isBeforeFrontendVersion('1.2.49');
|
const is_legacy_front = () => isBeforeFrontendVersion('1.2.49');
|
||||||
const isNotNewManagerUI = () => isBeforeFrontendVersion('1.16.4');
|
const isNewManagerUI = () => isBeforeFrontendVersion('1.16.4');
|
||||||
|
|
||||||
document.head.appendChild(docStyle);
|
document.head.appendChild(docStyle);
|
||||||
|
|
||||||
@@ -478,9 +478,9 @@ async function updateComfyUI() {
|
|||||||
|
|
||||||
// set_inprogress_mode();
|
// set_inprogress_mode();
|
||||||
showTerminal();
|
showTerminal();
|
||||||
|
|
||||||
batch_id = generateUUID();
|
batch_id = generateUUID();
|
||||||
|
|
||||||
let batch = {};
|
let batch = {};
|
||||||
batch['batch_id'] = batch_id;
|
batch['batch_id'] = batch_id;
|
||||||
batch['update_comfyui'] = true;
|
batch['update_comfyui'] = true;
|
||||||
@@ -667,13 +667,13 @@ async function onQueueStatus(event) {
|
|||||||
update_all_button.innerText = `in progress.. (${event.detail.done_count}/${event.detail.total_count})`;
|
update_all_button.innerText = `in progress.. (${event.detail.done_count}/${event.detail.total_count})`;
|
||||||
}
|
}
|
||||||
else if(event.detail.status == 'all-done') {
|
else if(event.detail.status == 'all-done') {
|
||||||
reset_action_buttons();
|
// reset_action_buttons();
|
||||||
}
|
}
|
||||||
else if(event.detail.status == 'batch-done') {
|
else if(event.detail.status == 'batch-done') {
|
||||||
if(batch_id != event.detail.batch_id) {
|
if(batch_id != event.detail.batch_id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let success_list = [];
|
let success_list = [];
|
||||||
let failed_list = [];
|
let failed_list = [];
|
||||||
let comfyui_state = null;
|
let comfyui_state = null;
|
||||||
@@ -780,7 +780,7 @@ async function updateAll(update_comfyui) {
|
|||||||
showTerminal();
|
showTerminal();
|
||||||
|
|
||||||
batch_id = generateUUID();
|
batch_id = generateUUID();
|
||||||
|
|
||||||
let batch = {};
|
let batch = {};
|
||||||
if(update_comfyui) {
|
if(update_comfyui) {
|
||||||
update_all_button.innerText = "Updating ComfyUI...";
|
update_all_button.innerText = "Updating ComfyUI...";
|
||||||
@@ -1518,7 +1518,7 @@ app.registerExtension({
|
|||||||
}).element
|
}).element
|
||||||
);
|
);
|
||||||
|
|
||||||
const shouldShowLegacyMenuItems = isNotNewManagerUI();
|
const shouldShowLegacyMenuItems = !isNewManagerUI();
|
||||||
if (shouldShowLegacyMenuItems) {
|
if (shouldShowLegacyMenuItems) {
|
||||||
app.menu?.settingsGroup.element.before(cmGroup.element);
|
app.menu?.settingsGroup.element.before(cmGroup.element);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1534,7 +1534,7 @@ export class CustomNodesManager {
|
|||||||
else {
|
else {
|
||||||
this.batch_id = generateUUID();
|
this.batch_id = generateUUID();
|
||||||
batch['batch_id'] = this.batch_id;
|
batch['batch_id'] = this.batch_id;
|
||||||
|
|
||||||
const res = await api.fetchApi(`/v2/manager/queue/batch`, {
|
const res = await api.fetchApi(`/v2/manager/queue/batch`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: JSON.stringify(batch)
|
body: JSON.stringify(batch)
|
||||||
@@ -1549,7 +1549,7 @@ export class CustomNodesManager {
|
|||||||
errorMsg = `[FAIL] ${item.title}`;
|
errorMsg = `[FAIL] ${item.title}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.showStop();
|
this.showStop();
|
||||||
showTerminal();
|
showTerminal();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,17 +113,11 @@ read_config()
|
|||||||
read_uv_mode()
|
read_uv_mode()
|
||||||
check_file_logging()
|
check_file_logging()
|
||||||
|
|
||||||
if sys.version_info < (3, 13):
|
cm_global.pip_overrides = {'numpy': 'numpy<2'}
|
||||||
cm_global.pip_overrides = {'numpy': 'numpy<2'}
|
|
||||||
else:
|
|
||||||
cm_global.pip_overrides = {}
|
|
||||||
|
|
||||||
if os.path.exists(manager_pip_overrides_path):
|
if os.path.exists(manager_pip_overrides_path):
|
||||||
with open(manager_pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
|
with open(manager_pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
|
||||||
cm_global.pip_overrides = json.load(json_file)
|
cm_global.pip_overrides = json.load(json_file)
|
||||||
|
cm_global.pip_overrides['numpy'] = 'numpy<2'
|
||||||
if sys.version_info < (3, 13):
|
|
||||||
cm_global.pip_overrides['numpy'] = 'numpy<2'
|
|
||||||
|
|
||||||
|
|
||||||
if os.path.exists(manager_pip_blacklist_path):
|
if os.path.exists(manager_pip_blacklist_path):
|
||||||
@@ -336,12 +330,7 @@ try:
|
|||||||
log_file.write(message)
|
log_file.write(message)
|
||||||
else:
|
else:
|
||||||
log_file.write(f"[{timestamp}] {message}")
|
log_file.write(f"[{timestamp}] {message}")
|
||||||
|
log_file.flush()
|
||||||
try:
|
|
||||||
log_file.flush()
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
self.last_char = message if message == '' else message[-1]
|
self.last_char = message if message == '' else message[-1]
|
||||||
|
|
||||||
if not file_only:
|
if not file_only:
|
||||||
@@ -354,10 +343,7 @@ try:
|
|||||||
original_stderr.flush()
|
original_stderr.flush()
|
||||||
|
|
||||||
def flush(self):
|
def flush(self):
|
||||||
try:
|
log_file.flush()
|
||||||
log_file.flush()
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
with std_log_lock:
|
with std_log_lock:
|
||||||
if self.is_stdout:
|
if self.is_stdout:
|
||||||
|
|||||||
@@ -2578,17 +2578,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Nodes: OTX Multiple Values, OTX KSampler Feeder. This extension provides custom nodes for ComfyUI created for personal projects. Made available for reference. Nodes may be updated or changed intermittently or not at all. Review & test before use."
|
"description": "Nodes: OTX Multiple Values, OTX KSampler Feeder. This extension provides custom nodes for ComfyUI created for personal projects. Made available for reference. Nodes may be updated or changed intermittently or not at all. Review & test before use."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "budihartono",
|
|
||||||
"title": "CAS Aspect Ratio Presets Node for ComfyUI",
|
|
||||||
"id": "comfyui-aspect-ratio-presets",
|
|
||||||
"reference": "https://github.com/budihartono/comfyui-aspect-ratio-presets",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/budihartono/comfyui-aspect-ratio-presets"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Quickly create empty latents in common resolutions and aspect ratios for SD 1.5, SDXL, Flux, Chroma, and HiDream. Choose from curated presets or generate by axis and aspect ratio. Appears in the 'latent' node group."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "ramyma",
|
"author": "ramyma",
|
||||||
"title": "A8R8 ComfyUI Nodes",
|
"title": "A8R8 ComfyUI Nodes",
|
||||||
@@ -3607,7 +3596,6 @@
|
|||||||
"title": "comfyui-mixlab-nodes",
|
"title": "comfyui-mixlab-nodes",
|
||||||
"id": "mixlab",
|
"id": "mixlab",
|
||||||
"reference": "https://github.com/shadowcz007/comfyui-mixlab-nodes",
|
"reference": "https://github.com/shadowcz007/comfyui-mixlab-nodes",
|
||||||
"reference2": "https://github.com/MixLabPro/comfyui-mixlab-nodes",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/shadowcz007/comfyui-mixlab-nodes"
|
"https://github.com/shadowcz007/comfyui-mixlab-nodes"
|
||||||
],
|
],
|
||||||
@@ -3651,7 +3639,6 @@
|
|||||||
"title": "comfyui-sound-lab",
|
"title": "comfyui-sound-lab",
|
||||||
"id": "soundlab",
|
"id": "soundlab",
|
||||||
"reference": "https://github.com/shadowcz007/comfyui-sound-lab",
|
"reference": "https://github.com/shadowcz007/comfyui-sound-lab",
|
||||||
"reference2": "https://github.com/MixLabPro/comfyui-sound-lab",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/shadowcz007/comfyui-sound-lab"
|
"https://github.com/shadowcz007/comfyui-sound-lab"
|
||||||
],
|
],
|
||||||
@@ -3674,7 +3661,6 @@
|
|||||||
"title": "comfyui-liveportrait",
|
"title": "comfyui-liveportrait",
|
||||||
"id": "liveportrait",
|
"id": "liveportrait",
|
||||||
"reference": "https://github.com/shadowcz007/comfyui-liveportrait",
|
"reference": "https://github.com/shadowcz007/comfyui-liveportrait",
|
||||||
"reference2": "https://github.com/MixLabPro/comfyui-liveportrait",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/shadowcz007/comfyui-liveportrait"
|
"https://github.com/shadowcz007/comfyui-liveportrait"
|
||||||
],
|
],
|
||||||
@@ -3995,16 +3981,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A matting toolkit based on ComfyUI, supporting multiple matting models and detail processing methods."
|
"description": "A matting toolkit based on ComfyUI, supporting multiple matting models and detail processing methods."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "whmc76",
|
|
||||||
"title": "ComfyUI-UniversalToolkit",
|
|
||||||
"reference": "https://github.com/whmc76/ComfyUI-UniversalToolkit",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/whmc76/ComfyUI-UniversalToolkit"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This plugin provides general-purpose utility nodes for ComfyUI. Currently, it implements a 'Blank Cell Generator' node, which can batch-generate images, masks, and latents with specified resolution and color."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "martijnat",
|
"author": "martijnat",
|
||||||
"title": "comfyui-previewlatent",
|
"title": "comfyui-previewlatent",
|
||||||
@@ -8369,7 +8345,6 @@
|
|||||||
"author": "kuschanow",
|
"author": "kuschanow",
|
||||||
"title": "Advanced Latent Control",
|
"title": "Advanced Latent Control",
|
||||||
"reference": "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control",
|
"reference": "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control",
|
||||||
"reference2": "https://github.com/kuschanow/ComfyUI-Advanced-Latent-Control",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control"
|
"https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control"
|
||||||
],
|
],
|
||||||
@@ -11272,7 +11247,6 @@
|
|||||||
"title": "comfyui_tag_filter",
|
"title": "comfyui_tag_filter",
|
||||||
"id": "tag-filter",
|
"id": "tag-filter",
|
||||||
"reference": "https://github.com/sugarkwork/comfyui_tag_fillter",
|
"reference": "https://github.com/sugarkwork/comfyui_tag_fillter",
|
||||||
"reference2": "https://github.com/sugarkwork/comfyui_tag_filter",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/sugarkwork/comfyui_tag_fillter"
|
"https://github.com/sugarkwork/comfyui_tag_fillter"
|
||||||
],
|
],
|
||||||
@@ -11911,7 +11885,6 @@
|
|||||||
"title": "ComfyUI-Embeddings-Tools",
|
"title": "ComfyUI-Embeddings-Tools",
|
||||||
"id": "embeddings-tools",
|
"id": "embeddings-tools",
|
||||||
"reference": "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools",
|
"reference": "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools",
|
||||||
"reference2": "https://github.com/ZDAVanO/ComfyUI-Embeddings-Tools",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools"
|
"https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools"
|
||||||
],
|
],
|
||||||
@@ -13172,7 +13145,6 @@
|
|||||||
"title": "LNL Frame Selector",
|
"title": "LNL Frame Selector",
|
||||||
"id": "lnlframeselector",
|
"id": "lnlframeselector",
|
||||||
"reference": "https://github.com/latenightlabs/ComfyUI-LNL",
|
"reference": "https://github.com/latenightlabs/ComfyUI-LNL",
|
||||||
"reference2": "https://github.com/asteriafilmco/ComfyUI-LNL",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/latenightlabs/ComfyUI-LNL"
|
"https://github.com/latenightlabs/ComfyUI-LNL"
|
||||||
],
|
],
|
||||||
@@ -13606,7 +13578,6 @@
|
|||||||
"title": "ComfyUI SaveAS",
|
"title": "ComfyUI SaveAS",
|
||||||
"id": "saveas",
|
"id": "saveas",
|
||||||
"reference": "https://github.com/SEkINVR/ComfyUI-SaveAs",
|
"reference": "https://github.com/SEkINVR/ComfyUI-SaveAs",
|
||||||
"reference2": "https://github.com/AnimationOverhual/ComfyUI-SaveAs",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/SEkINVR/ComfyUI-SaveAs"
|
"https://github.com/SEkINVR/ComfyUI-SaveAs"
|
||||||
],
|
],
|
||||||
@@ -13751,12 +13722,11 @@
|
|||||||
"author": "wTechArtist",
|
"author": "wTechArtist",
|
||||||
"title": "ComfyUI-StableDelight-weiweiliang",
|
"title": "ComfyUI-StableDelight-weiweiliang",
|
||||||
"reference": "https://github.com/wTechArtist/ComfyUI-StableDelight-weiweiliang",
|
"reference": "https://github.com/wTechArtist/ComfyUI-StableDelight-weiweiliang",
|
||||||
"reference2": "https://github.com/wTechArtist/ComfyUI-WWL-StableDelight",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/wTechArtist/ComfyUI-StableDelight-weiweiliang"
|
"https://github.com/wTechArtist/ComfyUI-StableDelight-weiweiliang"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "NODES: WWL_StableDelight"
|
"description": "Nodes:StableDelight-weiweiliang"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "wTechArtist",
|
"author": "wTechArtist",
|
||||||
@@ -14371,7 +14341,6 @@
|
|||||||
"title": "ComfyUI-RK-Sampler",
|
"title": "ComfyUI-RK-Sampler",
|
||||||
"id": "rk_sampler",
|
"id": "rk_sampler",
|
||||||
"reference": "https://github.com/wootwootwootwoot/ComfyUI-RK-Sampler",
|
"reference": "https://github.com/wootwootwootwoot/ComfyUI-RK-Sampler",
|
||||||
"reference2": "https://github.com/memmaptensor/ComfyUI-RK-Sampler",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/wootwootwootwoot/ComfyUI-RK-Sampler"
|
"https://github.com/wootwootwootwoot/ComfyUI-RK-Sampler"
|
||||||
],
|
],
|
||||||
@@ -15345,9 +15314,9 @@
|
|||||||
{
|
{
|
||||||
"author": "Cyber-Blacat",
|
"author": "Cyber-Blacat",
|
||||||
"title": "ComfyUI-Yuan",
|
"title": "ComfyUI-Yuan",
|
||||||
"reference": "https://github.com/Cyber-BlackCat/ComfyUI-MoneyMaker",
|
"reference": "https://github.com/Cyber-Blacat/ComfyUI-Yuan",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI-MoneyMaker"
|
"https://github.com/Cyber-Blacat/ComfyUI-Yuan"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Some simple&practical ComfyUI image processing nodes."
|
"description": "Some simple&practical ComfyUI image processing nodes."
|
||||||
@@ -15397,7 +15366,6 @@
|
|||||||
"title": "LatentGC Aggressive",
|
"title": "LatentGC Aggressive",
|
||||||
"id": "latentgcaggressive",
|
"id": "latentgcaggressive",
|
||||||
"reference": "https://github.com/Raapys/ComfyUI-LatentGC_Aggressive",
|
"reference": "https://github.com/Raapys/ComfyUI-LatentGC_Aggressive",
|
||||||
"reference2": "https://github.com/0000111100001111/ComfyUI-LatentGC_Aggressive",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/Raapys/ComfyUI-LatentGC_Aggressive"
|
"https://github.com/Raapys/ComfyUI-LatentGC_Aggressive"
|
||||||
],
|
],
|
||||||
@@ -17095,7 +17063,6 @@
|
|||||||
"title": "CRT-Nodes",
|
"title": "CRT-Nodes",
|
||||||
"id": "crt-nodes",
|
"id": "crt-nodes",
|
||||||
"reference": "https://github.com/plugcrypt/CRT-Nodes",
|
"reference": "https://github.com/plugcrypt/CRT-Nodes",
|
||||||
"reference2": "https://github.com/PGCRT/CRT-Nodes",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/plugcrypt/CRT-Nodes"
|
"https://github.com/plugcrypt/CRT-Nodes"
|
||||||
],
|
],
|
||||||
@@ -17908,7 +17875,6 @@
|
|||||||
"author": "taches-ai",
|
"author": "taches-ai",
|
||||||
"title": "ComfyUI Scene Composer",
|
"title": "ComfyUI Scene Composer",
|
||||||
"reference": "https://github.com/taches-ai/comfyui-scene-composer",
|
"reference": "https://github.com/taches-ai/comfyui-scene-composer",
|
||||||
"reference2": "https://github.com/mus-taches/comfyui-scene-composer",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/taches-ai/comfyui-scene-composer"
|
"https://github.com/taches-ai/comfyui-scene-composer"
|
||||||
],
|
],
|
||||||
@@ -18199,13 +18165,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "theshubzworld",
|
"author": "theshubzworld",
|
||||||
"title": "ComfyUI-ollama_killer",
|
"title": "OllamaKiller Node for ComfyUI",
|
||||||
"reference": "https://github.com/theshubzworld/ComfyUI-ollama_killer",
|
"reference": "https://github.com/theshubzworld/ComfyUI-ollama_killer",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/theshubzworld/ComfyUI-ollama_killer"
|
"https://github.com/theshubzworld/ComfyUI-ollama_killer"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "OllamaKiller is a cross-platform utility node for ComfyUI that automatically manages Ollama processes (`ollama.exe` on Windows, `ollama` on macOS/Linux). It helps free up VRAM by terminating Ollama processes after model execution, improving workflow performance and memory management. Features include graceful process termination, detailed status reporting, and seamless text passthrough."
|
"description": "OllamaKiller is a utility node for ComfyUI designed to manage VRAM usage more efficiently by automatically terminating the ollama_llama_server.exe process. This is particularly useful for users with limited VRAM, allowing them to clear up memory after running models and improve workflow performance."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "theshubzworld",
|
"author": "theshubzworld",
|
||||||
@@ -19226,7 +19192,6 @@
|
|||||||
"author": "Black-Lioness",
|
"author": "Black-Lioness",
|
||||||
"title": "ComfyUI-PromptUtils",
|
"title": "ComfyUI-PromptUtils",
|
||||||
"reference": "https://github.com/Black-Lioness/ComfyUI-PromptUtils",
|
"reference": "https://github.com/Black-Lioness/ComfyUI-PromptUtils",
|
||||||
"reference2": "https://github.com/RunningOverGlowies/ComfyUI-PromptUtils",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/Black-Lioness/ComfyUI-PromptUtils"
|
"https://github.com/Black-Lioness/ComfyUI-PromptUtils"
|
||||||
],
|
],
|
||||||
@@ -19908,7 +19873,6 @@
|
|||||||
"author": "sourceful-official",
|
"author": "sourceful-official",
|
||||||
"title": "LoadLoraModelOnlyWithUrl",
|
"title": "LoadLoraModelOnlyWithUrl",
|
||||||
"reference": "https://github.com/sourceful-official/LoadLoraModelOnlyWithUrl",
|
"reference": "https://github.com/sourceful-official/LoadLoraModelOnlyWithUrl",
|
||||||
"reference2": "https://github.com/sourceful-official/ComfyUI_LoadLoraModelOnlyWithUrl",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/sourceful-official/LoadLoraModelOnlyWithUrl"
|
"https://github.com/sourceful-official/LoadLoraModelOnlyWithUrl"
|
||||||
],
|
],
|
||||||
@@ -20376,12 +20340,12 @@
|
|||||||
"author": "AEmotionStudio",
|
"author": "AEmotionStudio",
|
||||||
"title": "ComfyUI-EnhancedLinksandNodes 🎨✨",
|
"title": "ComfyUI-EnhancedLinksandNodes 🎨✨",
|
||||||
"reference": "https://github.com/AEmotionStudio/ComfyUI-EnhancedLinksandNodes",
|
"reference": "https://github.com/AEmotionStudio/ComfyUI-EnhancedLinksandNodes",
|
||||||
"reference2": "https://github.com/AEmotionStudio/ComfyUI-Enhanced",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/AEmotionStudio/ComfyUI-EnhancedLinksandNodes"
|
"https://github.com/AEmotionStudio/ComfyUI-EnhancedLinksandNodes"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A visually stunning extension for ComfyUI that adds beautiful, customizable animations to both links and nodes in your workflow, with a focus on performance and customization. Includes an end-of-render animation and a text visibility tool for nodes. No extra packages are required, works with the latest version of ComfyUI, and should be compatible with most workflows. Larger workflows may experience performance issues, especially if you have a lot of nodes and are using a lower end system."
|
"description": "A visually stunning extension for ComfyUI that adds beautiful, customizable animations to both links and nodes in your workflow, with a focus on performance and customization. Includes an end-of-render animation and a text visibility tool for nodes. No extra packages are required, works with the latest version of ComfyUI, and should be compatible with most workflows. Larger workflows may experience performance issues, especially if you have a lot of nodes and are using a lower end system.",
|
||||||
|
"reference2": "https://github.com/AEmotionStudio/ComfyUI-Enhanced"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "AEmotionStudio",
|
"author": "AEmotionStudio",
|
||||||
@@ -21574,13 +21538,13 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "meanin2",
|
"author": "meanin2",
|
||||||
"title": "comfyui-MGnodes",
|
"title": "ComfyUI Watermark Image Node",
|
||||||
"reference": "https://github.com/meanin2/comfyui-MGnodes",
|
"reference": "https://github.com/meanin2/comfyui-watermarking",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/meanin2/comfyui-MGnodes"
|
"https://github.com/meanin2/comfyui-watermarking"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Assorted custom nodes with a focus on simplicity and usability including watermark node and others focused on customizing my comfy experience."
|
"description": "This custom node allows you to overlay a watermark image onto an existing image within ComfyUI."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "Kurdknight",
|
"author": "Kurdknight",
|
||||||
@@ -21789,7 +21753,6 @@
|
|||||||
"author": "Burgstall-labs",
|
"author": "Burgstall-labs",
|
||||||
"title": "ComfyUI-BETA-Cropnodes",
|
"title": "ComfyUI-BETA-Cropnodes",
|
||||||
"reference": "https://github.com/Burgstall-labs/ComfyUI-BETA-Cropnodes",
|
"reference": "https://github.com/Burgstall-labs/ComfyUI-BETA-Cropnodes",
|
||||||
"reference2": "https://github.com/Burgstall-labs/ComfyUI-BETA-Helpernodes",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/Burgstall-labs/ComfyUI-BETA-Cropnodes"
|
"https://github.com/Burgstall-labs/ComfyUI-BETA-Cropnodes"
|
||||||
],
|
],
|
||||||
@@ -21909,6 +21872,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "🥭 Mango Random Nodes - A collection of random file nodes for ComfyUI"
|
"description": "🥭 Mango Random Nodes - A collection of random file nodes for ComfyUI"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "meanin2",
|
||||||
|
"title": "ComfyUI Image Watermarking Node",
|
||||||
|
"reference": "https://github.com/meanin2/comfyui-MGnodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/meanin2/comfyui-MGnodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A custom node for ComfyUI that allows you to add image watermarks with advanced controls for transparency, positioning, and color manipulation."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "WUYUDING2583",
|
"author": "WUYUDING2583",
|
||||||
"title": "Save Image With Callback",
|
"title": "Save Image With Callback",
|
||||||
@@ -22135,17 +22108,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Custom nodes for integrating LM Studio's LLM functionality into ComfyUI. Includes EBU-LMStudio-Load, EBU-LMStudio-Unload, and EBU-LMStudio-Request."
|
"description": "Custom nodes for integrating LM Studio's LLM functionality into ComfyUI. Includes EBU-LMStudio-Load, EBU-LMStudio-Unload, and EBU-LMStudio-Request."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "burnsbert",
|
|
||||||
"title": "EBU Workflow",
|
|
||||||
"id": "ebu-workflow",
|
|
||||||
"reference": "https://github.com/burnsbert/ComfyUI-EBU-Workflow",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/burnsbert/ComfyUI-EBU-Workflow"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Custom nodes for general workflow quality of life including resolutions sorted by aspect ratio, upscaling helps, and unique file names"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "SykkoAtHome",
|
"author": "SykkoAtHome",
|
||||||
"title": "Face Processor for ComfyUI",
|
"title": "Face Processor for ComfyUI",
|
||||||
@@ -22260,7 +22222,6 @@
|
|||||||
"author": "jinanlongen",
|
"author": "jinanlongen",
|
||||||
"title": "ComfyUI Prompt Expander Node",
|
"title": "ComfyUI Prompt Expander Node",
|
||||||
"reference": "https://github.com/jinanlongen/ComfyUI-Prompt-Expander",
|
"reference": "https://github.com/jinanlongen/ComfyUI-Prompt-Expander",
|
||||||
"reference2": "https://github.com/derekluo/ComfyUI-Prompt-Expander",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/jinanlongen/ComfyUI-Prompt-Expander"
|
"https://github.com/jinanlongen/ComfyUI-Prompt-Expander"
|
||||||
],
|
],
|
||||||
@@ -22782,7 +22743,6 @@
|
|||||||
"title": "ComfyUI-SelectStringFromListWithIndex",
|
"title": "ComfyUI-SelectStringFromListWithIndex",
|
||||||
"id": "ComfyUI-SelectStringFromListWithIndex",
|
"id": "ComfyUI-SelectStringFromListWithIndex",
|
||||||
"reference": "https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex",
|
"reference": "https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex",
|
||||||
"reference2": "https://github.com/mr-pepe69/ComfyUI-SelectStringFromListWithIndex",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex"
|
"https://github.com/wirytiox/ComfyUI-SelectStringFromListWithIndex"
|
||||||
],
|
],
|
||||||
@@ -23046,9 +23006,9 @@
|
|||||||
{
|
{
|
||||||
"author": "crave33",
|
"author": "crave33",
|
||||||
"title": "RenesStuffDanboruTagGet",
|
"title": "RenesStuffDanboruTagGet",
|
||||||
"reference": "https://github.com/crave33/RenesStuffDanbooruTagGet",
|
"reference": "https://github.com/crave33/RenesStuffDanboruTagGet",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/crave33/RenesStuffDanbooruTagGet"
|
"https://github.com/crave33/RenesStuffDanboruTagGet"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "generate tags / prompt from danboru image_id input"
|
"description": "generate tags / prompt from danboru image_id input"
|
||||||
@@ -24349,11 +24309,20 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Utility nodes for some randomness in your workflows, like random latent sizes. A few modifications to a few existing nodes, includes nodes for sampler and model parameters. Also includes two schedulers and four samplers that can be used with any KSampler node."
|
"description": "Utility nodes for some randomness in your workflows, like random latent sizes. A few modifications to a few existing nodes, includes nodes for sampler and model parameters. Also includes two schedulers and four samplers that can be used with any KSampler node."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "dream-computing",
|
||||||
|
"title": "SyntaxNodes - Image Processing Effects for ComfyUI",
|
||||||
|
"reference": "https://github.com/dream-computing/syntax-nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/dream-computing/syntax-nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of custom nodes for ComfyUI designed to apply various image processing effects, stylizations, and analyses."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "Ky11le",
|
"author": "Ky11le",
|
||||||
"title": "ygo_tools",
|
"title": "ygo_tools",
|
||||||
"reference": "https://github.com/Ky11le/ygo_tools",
|
"reference": "https://github.com/Ky11le/ygo_tools",
|
||||||
"reference2": "https://github.com/Ky11le/draw_tools",
|
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/Ky11le/ygo_tools"
|
"https://github.com/Ky11le/ygo_tools"
|
||||||
],
|
],
|
||||||
@@ -24944,16 +24913,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "LatentSync 1.5 wrapper for ComfyUI"
|
"description": "LatentSync 1.5 wrapper for ComfyUI"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "avenstack",
|
|
||||||
"title": "ComfyUI-AV-FunASR",
|
|
||||||
"reference": "https://github.com/avenstack/ComfyUI-AV-FunASR",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/avenstack/ComfyUI-AV-FunASR"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "FunASR wrapper for ComfyUI"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "WarpedAnimation",
|
"author": "WarpedAnimation",
|
||||||
"title": "ComfyUI-WarpedToolset",
|
"title": "ComfyUI-WarpedToolset",
|
||||||
@@ -25024,16 +24983,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This project provides a node for ComfyUI to use the JoyCaption-Beta model in GGUF format for image captioning."
|
"description": "This project provides a node for ComfyUI to use the JoyCaption-Beta model in GGUF format for image captioning."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "judian17",
|
|
||||||
"title": "ComfyUI-UniWorld-jd17",
|
|
||||||
"reference": "https://github.com/judian17/ComfyUI-UniWorld-jd17",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/judian17/ComfyUI-UniWorld-jd17"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Unofficial ComfyUI implementation of [a/UniWorld-V1](https://github.com/PKU-YuanGroup/UniWorld-V1)."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "AngelCookies",
|
"author": "AngelCookies",
|
||||||
"title": "ComfyUI-Seed-Tracker",
|
"title": "ComfyUI-Seed-Tracker",
|
||||||
@@ -25576,6 +25525,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This custom node for ComfyUI enables detailed segmentation of colored mask images into specific anatomical regions for male and female bodies."
|
"description": "This custom node for ComfyUI enables detailed segmentation of colored mask images into specific anatomical regions for male and female bodies."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "kambara",
|
||||||
|
"title": "ComfyUI-PromptCheckList",
|
||||||
|
"reference": "https://github.com/kambara/ComfyUI-PromptCheckList",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/kambara/ComfyUI-PromptCheckList"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a text editing extension for ComfyUI. It allows you to easily switch phrases for prompts using only the mouse."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "kambara",
|
"author": "kambara",
|
||||||
"title": "ComfyUI-PromptPalette",
|
"title": "ComfyUI-PromptPalette",
|
||||||
@@ -26023,7 +25982,7 @@
|
|||||||
"https://github.com/vladpro3/ComfyUI_BishaNodes"
|
"https://github.com/vladpro3/ComfyUI_BishaNodes"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Custom nodes for ComfyUI to improve promts and image settings"
|
"description": "Custom nodes for ComfyUI to generate images in multiple resolutions (including ultra-wide formats)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "otacoo",
|
"author": "otacoo",
|
||||||
@@ -26981,16 +26940,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "This node uses the Translators library for translation."
|
"description": "This node uses the Translators library for translation."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "pictorialink",
|
|
||||||
"title": "ComfyUI-Custom-Node-Config",
|
|
||||||
"reference": "https://github.com/pictorialink/ComfyUI-Custom-Node-Config",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/pictorialink/ComfyUI-Custom-Node-Config"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This project is a custom node plugin for ComfyUI that provides a form node for configuring and saving parameters related to LLMs (such as OpenAI, Kimi, DeepSeek). Users can input information such as API Key, Base, Version, and Model through the node. The node will automatically save the configuration to a local file and set it as environment variables, making it convenient for subsequent use."
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "mo230761",
|
"author": "mo230761",
|
||||||
"title": "ComfyUI-Text-Translation",
|
"title": "ComfyUI-Text-Translation",
|
||||||
@@ -27011,16 +26960,6 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "comfy extension for lumina2 TeaCache"
|
"description": "comfy extension for lumina2 TeaCache"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "spawner",
|
|
||||||
"title": "comfyui-aichat",
|
|
||||||
"reference": "https://github.com/spawner1145/comfyui-aichat",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/spawner1145/comfyui-aichat"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "gemini and openai in comfyui"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "PenguinTeo",
|
"author": "PenguinTeo",
|
||||||
"title": "Comfyui-TextEditor-Penguin",
|
"title": "Comfyui-TextEditor-Penguin",
|
||||||
@@ -27131,67 +27070,7 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Drop-in TorchCompile node that preserves LoRA patches."
|
"description": "Drop-in TorchCompile node that preserves LoRA patches."
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "Pigidiy",
|
|
||||||
"title": "ComfyUI-LikeSpiderAI-UI",
|
|
||||||
"id": "like_spider_ui",
|
|
||||||
"reference": "https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Declarative UI Framework for ComfyUI Nodes. Minimalistic base class for creating UI-based audio/text/image nodes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "hexxacubic",
|
|
||||||
"title": "ComfyUI-Prompt_Library",
|
|
||||||
"reference": "https://github.com/hexxacubic/ComfyUI-Prompt_Library",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/hexxacubic/ComfyUI-Prompt_Library"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A ComfyUI Node to save and load prompts from a library."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "MicheleGuidi",
|
|
||||||
"title": "ComfyUI-Computer-Vision",
|
|
||||||
"reference": "https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Extension nodes for ComfyUI that improves automatic segmentation using bounding boxes generated by Florence 2 and segmentation from Segment Anything 2 (SAM2). Currently just an enhancement of nodes from [a/Kijai](https://github.com/kijai/ComfyUI-segment-anything-2)."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "swhsiang",
|
|
||||||
"title": "comfyui-3d-gs-renderer",
|
|
||||||
"reference": "https://github.com/swhsiang/comfyui-3d-gs-renderer",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/swhsiang/comfyui-3d-gs-renderer"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI custom node to support 3D GS rendering"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "jasonjgardner",
|
|
||||||
"title": "ComfyUI Substance Designer Integration Plugin",
|
|
||||||
"reference": "https://github.com/jasonjgardner/comfui-substance-designer-integration",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/jasonjgardner/comfui-substance-designer-integration"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A comprehensive ComfyUI plugin that enables seamless integration with Substance 3D Designer workflows through command line automation. This plugin provides custom nodes for cooking .sbs files, rendering .sbsar archives, controlling material parameters, and batch processing Substance materials within ComfyUI workflows."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "sLKbabawhsiang",
|
|
||||||
"title": "ComfyUI-TuZi-Flux-Kontext",
|
|
||||||
"reference": "https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": " Powerful Flux-Kontext image generation custom node for ComfyUI, using the official RabbitAI API. Supports text-to-image, image-to-image, and multi-image-to-image generation. Supports concurrent generation."
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -27561,16 +27440,6 @@
|
|||||||
"install_type": "copy",
|
"install_type": "copy",
|
||||||
"description": "Extremely inspired and forked from: [a/https://github.com/klimaleksus/stable-diffusion-webui-embedding-merge](https://github.com/klimaleksus/stable-diffusion-webui-embedding-merge)"
|
"description": "Extremely inspired and forked from: [a/https://github.com/klimaleksus/stable-diffusion-webui-embedding-merge](https://github.com/klimaleksus/stable-diffusion-webui-embedding-merge)"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"author": "vladpro3",
|
|
||||||
"title": "ComfyUI_BishaNodes",
|
|
||||||
"reference": "https://github.com/vladpro3/ComfyUI_BishaNodes",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/vladpro3/ComfyUI_BishaNodes"
|
|
||||||
],
|
|
||||||
"install_type": "copy",
|
|
||||||
"description": "Custom Nodes for ComfyUI to Simplify Multi-Resolution and Prompt Workflows"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"author": "Kayarte",
|
"author": "Kayarte",
|
||||||
"title": "GeoNodes",
|
"title": "GeoNodes",
|
||||||
|
|||||||
@@ -256,12 +256,10 @@
|
|||||||
"ALLty",
|
"ALLty",
|
||||||
"EGRWGL",
|
"EGRWGL",
|
||||||
"EGRYDZQHNode",
|
"EGRYDZQHNode",
|
||||||
"EGSEED",
|
|
||||||
"GroupSwitchNode",
|
"GroupSwitchNode",
|
||||||
"GroupSwitchNodee",
|
"GroupSwitchNodee",
|
||||||
"GroupSwitchNodeee",
|
"GroupSwitchNodeee",
|
||||||
"GroupSwitchNodeeee",
|
"GroupSwitchNodeeee",
|
||||||
"GroupSwitchNodi",
|
|
||||||
"hulue",
|
"hulue",
|
||||||
"jinyong"
|
"jinyong"
|
||||||
],
|
],
|
||||||
@@ -332,21 +330,10 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/2frames/ComfyUI-AQnodes": [
|
"https://github.com/2frames/ComfyUI-AQnodes": [
|
||||||
[
|
[
|
||||||
"AQ_BatchAverageImage",
|
|
||||||
"AQ_BlendImages",
|
|
||||||
"AQ_CLIPSetLastLayer",
|
|
||||||
"AQ_ColorMatchImage",
|
|
||||||
"AQ_Gemini",
|
"AQ_Gemini",
|
||||||
"AQ_ImageMaskSwitch",
|
|
||||||
"AQ_Image_DetailTransfer",
|
|
||||||
"AQ_Image_Pad",
|
|
||||||
"AQ_Increment",
|
|
||||||
"AQ_LoadImageBase64",
|
|
||||||
"AQ_MasksAndImagesAsList",
|
"AQ_MasksAndImagesAsList",
|
||||||
"AQ_Qwen",
|
"AQ_Qwen",
|
||||||
"AQ_QwenLoader",
|
"AQ_QwenLoader",
|
||||||
"AQ_Random",
|
|
||||||
"AQ_SaveImageWebpReturnBase64",
|
|
||||||
"AQ_SendImageToAPI",
|
"AQ_SendImageToAPI",
|
||||||
"AQ_multiface_ApplyPulidFlux"
|
"AQ_multiface_ApplyPulidFlux"
|
||||||
],
|
],
|
||||||
@@ -3485,7 +3472,6 @@
|
|||||||
"Categorizer",
|
"Categorizer",
|
||||||
"CollectAndDistributeText",
|
"CollectAndDistributeText",
|
||||||
"Coloring",
|
"Coloring",
|
||||||
"ConditionalLoRAApplierCreepybits",
|
|
||||||
"CustomNodeManager",
|
"CustomNodeManager",
|
||||||
"DelayNode",
|
"DelayNode",
|
||||||
"DelayTextNode",
|
"DelayTextNode",
|
||||||
@@ -3551,15 +3537,7 @@
|
|||||||
"title_aux": "ComfyUi Random Manage Cyan"
|
"title_aux": "ComfyUi Random Manage Cyan"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI-Image-Vector": [
|
"https://github.com/Cyber-Blacat/ComfyUI-Yuan": [
|
||||||
[
|
|
||||||
"Vector"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "Cyber-BlackCat"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI-MoneyMaker": [
|
|
||||||
[
|
[
|
||||||
", and the value is the function name in the right of the",
|
", and the value is the function name in the right of the",
|
||||||
"Black and white",
|
"Black and white",
|
||||||
@@ -3579,6 +3557,14 @@
|
|||||||
"title_aux": "ComfyUI-Yuan"
|
"title_aux": "ComfyUI-Yuan"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Cyber-BlackCat/ComfyUI-Image-Vector": [
|
||||||
|
[
|
||||||
|
"Vector"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "Cyber-BlackCat"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI_Auto_Caption": [
|
"https://github.com/Cyber-BlackCat/ComfyUI_Auto_Caption": [
|
||||||
[
|
[
|
||||||
"Auto Caption",
|
"Auto Caption",
|
||||||
@@ -5474,8 +5460,6 @@
|
|||||||
"Integer to Float",
|
"Integer to Float",
|
||||||
"Integer to String",
|
"Integer to String",
|
||||||
"Latent Switch",
|
"Latent Switch",
|
||||||
"Load Image",
|
|
||||||
"Logic Compare",
|
|
||||||
"Math Operation",
|
"Math Operation",
|
||||||
"Model Switch",
|
"Model Switch",
|
||||||
"Prompt Combiner",
|
"Prompt Combiner",
|
||||||
@@ -7029,7 +7013,6 @@
|
|||||||
"ImageSizeAdjustment",
|
"ImageSizeAdjustment",
|
||||||
"InspyrenetRembgLoader",
|
"InspyrenetRembgLoader",
|
||||||
"InspyrenetRembgProcess",
|
"InspyrenetRembgProcess",
|
||||||
"LG_LatentBatchToList",
|
|
||||||
"LG_LoadImage",
|
"LG_LoadImage",
|
||||||
"LG_Noise",
|
"LG_Noise",
|
||||||
"LazySwitch1way",
|
"LazySwitch1way",
|
||||||
@@ -7052,16 +7035,6 @@
|
|||||||
"title_aux": "ImagesGrid"
|
"title_aux": "ImagesGrid"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext": [
|
|
||||||
[
|
|
||||||
"FluxKontext_ImageToImage",
|
|
||||||
"FluxKontext_MultiImageToImage",
|
|
||||||
"FluxKontext_TextToImage"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-TuZi-Flux-Kontext"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/LamEmil/ComfyUI_ASCIIArtNode": [
|
"https://github.com/LamEmil/ComfyUI_ASCIIArtNode": [
|
||||||
[
|
[
|
||||||
"ASCIIAnimationGenerator",
|
"ASCIIAnimationGenerator",
|
||||||
@@ -7174,7 +7147,6 @@
|
|||||||
"BoolToString|LP",
|
"BoolToString|LP",
|
||||||
"CLIP Text Encode Translate [LP]",
|
"CLIP Text Encode Translate [LP]",
|
||||||
"CLIPTextEncodeTranslate|LP",
|
"CLIPTextEncodeTranslate|LP",
|
||||||
"Calculate Target Size By Mask [LP]",
|
|
||||||
"CalculateTargetSizeByMask|LP",
|
"CalculateTargetSizeByMask|LP",
|
||||||
"Convert Bool To Int [LP]",
|
"Convert Bool To Int [LP]",
|
||||||
"Convert Bool To String [LP]",
|
"Convert Bool To String [LP]",
|
||||||
@@ -7190,17 +7162,12 @@
|
|||||||
"Convert String To Number [LP]",
|
"Convert String To Number [LP]",
|
||||||
"Count Objects [LP]",
|
"Count Objects [LP]",
|
||||||
"CountObjects|LP",
|
"CountObjects|LP",
|
||||||
"Cropped Aspect Size Parameters [LP]",
|
|
||||||
"Cropped Forsed Size Parameters [LP]",
|
|
||||||
"Cropped Free Size Parameters [LP]",
|
|
||||||
"Cropped Ranged Size Parameters [LP]",
|
|
||||||
"CroppedAspectSizeParameters|LP",
|
"CroppedAspectSizeParameters|LP",
|
||||||
"CroppedForsedSizeParameters|LP",
|
"CroppedForsedSizeParameters|LP",
|
||||||
"CroppedFreeSizeParameters|LP",
|
"CroppedFreeSizeParameters|LP",
|
||||||
"CroppedRangedSizeParameters|LP",
|
"CroppedRangedSizeParameters|LP",
|
||||||
"Delay [LP]",
|
"Delay [LP]",
|
||||||
"Delay|LP",
|
"Delay|LP",
|
||||||
"Extend Factor Parameters [LP]",
|
|
||||||
"ExtendFactorParameters|LP",
|
"ExtendFactorParameters|LP",
|
||||||
"Fast Checker Pattern [LP]",
|
"Fast Checker Pattern [LP]",
|
||||||
"FastCheckerPattern|LP",
|
"FastCheckerPattern|LP",
|
||||||
@@ -7217,8 +7184,6 @@
|
|||||||
"Image Overlay [LP]",
|
"Image Overlay [LP]",
|
||||||
"ImageLoaderFromPath|LP",
|
"ImageLoaderFromPath|LP",
|
||||||
"ImageOverlay|LP",
|
"ImageOverlay|LP",
|
||||||
"Inpaint Crop [LP]",
|
|
||||||
"Inpaint Stitch [LP]",
|
|
||||||
"InpaintCrop|LP",
|
"InpaintCrop|LP",
|
||||||
"InpaintStitch|LP",
|
"InpaintStitch|LP",
|
||||||
"IntToBool|LP",
|
"IntToBool|LP",
|
||||||
@@ -7252,8 +7217,6 @@
|
|||||||
"RemoveBannedTagsFromTags|LP",
|
"RemoveBannedTagsFromTags|LP",
|
||||||
"RemoveBannedTagsFromText|LP",
|
"RemoveBannedTagsFromText|LP",
|
||||||
"RemoveDuplicateTags|LP",
|
"RemoveDuplicateTags|LP",
|
||||||
"Resize Image To Target Size [LP]",
|
|
||||||
"Resize Image and Masks [LP]",
|
|
||||||
"ResizeImageAndMasks|LP",
|
"ResizeImageAndMasks|LP",
|
||||||
"ResizeImageToTargetSize|LP",
|
"ResizeImageToTargetSize|LP",
|
||||||
"Resorting Tags [LP]",
|
"Resorting Tags [LP]",
|
||||||
@@ -7700,13 +7663,8 @@
|
|||||||
"LoraTagLoader",
|
"LoraTagLoader",
|
||||||
"ResolutionSelector",
|
"ResolutionSelector",
|
||||||
"StringCleaning",
|
"StringCleaning",
|
||||||
"StringTextExtractor",
|
|
||||||
"StringTextSplitter",
|
|
||||||
"TiktokenTokenizer",
|
"TiktokenTokenizer",
|
||||||
"WildcardProcessor",
|
|
||||||
"\u26d4 Generate Negative Prompt",
|
"\u26d4 Generate Negative Prompt",
|
||||||
"\u2702\ufe0f String Text Extractor",
|
|
||||||
"\u2702\ufe0f String Text Splitter",
|
|
||||||
"\u2728\ud83c\udf10 Groq ALM API - Translate [EN only]",
|
"\u2728\ud83c\udf10 Groq ALM API - Translate [EN only]",
|
||||||
"\u2728\ud83d\udcac Groq LLM API",
|
"\u2728\ud83d\udcac Groq LLM API",
|
||||||
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
||||||
@@ -7715,7 +7673,6 @@
|
|||||||
"\ud83d\udcbe Save Text File With Path",
|
"\ud83d\udcbe Save Text File With Path",
|
||||||
"\ud83d\udcc1 Get File Path",
|
"\ud83d\udcc1 Get File Path",
|
||||||
"\ud83d\udcd0 Resolution Image Size Selector",
|
"\ud83d\udcd0 Resolution Image Size Selector",
|
||||||
"\ud83d\udcdd Wildcard Processor",
|
|
||||||
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
||||||
"\ud83d\uddbc\ufe0f Download Image from URL",
|
"\ud83d\uddbc\ufe0f Download Image from URL",
|
||||||
"\ud83e\uddf9 String Cleaning"
|
"\ud83e\uddf9 String Cleaning"
|
||||||
@@ -7982,15 +7939,6 @@
|
|||||||
"title_aux": "ComfyUI ZhipuAI Platform"
|
"title_aux": "ComfyUI ZhipuAI Platform"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2": [
|
|
||||||
[
|
|
||||||
"Sam2ContextSegmentation",
|
|
||||||
"Sam2TiledSegmentation"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-Computer-Vision"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/MiddleKD/ComfyUI-denoise-mask-scheduler": [
|
"https://github.com/MiddleKD/ComfyUI-denoise-mask-scheduler": [
|
||||||
[
|
[
|
||||||
"ApplyDenoiseMaskSchedulerWithSigma",
|
"ApplyDenoiseMaskSchedulerWithSigma",
|
||||||
@@ -9185,14 +9133,6 @@
|
|||||||
"title_aux": "ComfyUI-LikeSpiderAI-SaveMP3"
|
"title_aux": "ComfyUI-LikeSpiderAI-SaveMP3"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI": [
|
|
||||||
[
|
|
||||||
"AudioExport"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-LikeSpiderAI-UI"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/PixelFunAI/ComfyUI_PixelFun": [
|
"https://github.com/PixelFunAI/ComfyUI_PixelFun": [
|
||||||
[
|
[
|
||||||
"HunyuanLoadAndEditLoraBlocks",
|
"HunyuanLoadAndEditLoraBlocks",
|
||||||
@@ -9955,8 +9895,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Santodan/santodan-custom-nodes-comfyui": [
|
"https://github.com/Santodan/santodan-custom-nodes-comfyui": [
|
||||||
[
|
[
|
||||||
"RandomLoRACustom",
|
"RandomLoRACustom"
|
||||||
"RandomLoRAFolder"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Santodan Random LoRA Node"
|
"title_aux": "Santodan Random LoRA Node"
|
||||||
@@ -11348,7 +11287,6 @@
|
|||||||
"Basic data handling: PathListDir",
|
"Basic data handling: PathListDir",
|
||||||
"Basic data handling: PathNormalize",
|
"Basic data handling: PathNormalize",
|
||||||
"Basic data handling: PathRelative",
|
"Basic data handling: PathRelative",
|
||||||
"Basic data handling: PathSetExtension",
|
|
||||||
"Basic data handling: PathSplit",
|
"Basic data handling: PathSplit",
|
||||||
"Basic data handling: PathSplitExt",
|
"Basic data handling: PathSplitExt",
|
||||||
"Basic data handling: RegexFindallDataList",
|
"Basic data handling: RegexFindallDataList",
|
||||||
@@ -11482,9 +11420,7 @@
|
|||||||
"StarGridImageBatcher",
|
"StarGridImageBatcher",
|
||||||
"StarImageSwitch",
|
"StarImageSwitch",
|
||||||
"StarImageSwitch2",
|
"StarImageSwitch2",
|
||||||
"StarInfiniteYouAdvancedPatchMaker",
|
|
||||||
"StarInfiniteYouApply",
|
"StarInfiniteYouApply",
|
||||||
"StarInfiniteYouFaceSwapMod",
|
|
||||||
"StarInfiniteYouPatch",
|
"StarInfiniteYouPatch",
|
||||||
"StarInfiniteYouPatchCombine",
|
"StarInfiniteYouPatchCombine",
|
||||||
"StarInfiniteYouSaver",
|
"StarInfiniteYouSaver",
|
||||||
@@ -11493,12 +11429,10 @@
|
|||||||
"StarNewsScraper",
|
"StarNewsScraper",
|
||||||
"StarPSDSaver",
|
"StarPSDSaver",
|
||||||
"StarPSDSaver2",
|
"StarPSDSaver2",
|
||||||
"StarPaletteExtractor",
|
|
||||||
"StarSaveSamplerSettings",
|
"StarSaveSamplerSettings",
|
||||||
"StarTextFilter",
|
"StarTextFilter",
|
||||||
"StarTextInput",
|
"StarTextInput",
|
||||||
"StarWildcardsAdvanced",
|
"StarWildcardsAdvanced",
|
||||||
"Star_Image2Latent",
|
|
||||||
"Starnodes_Aspect_Ratio",
|
"Starnodes_Aspect_Ratio",
|
||||||
"Starnodes_Aspect_Ratio_Advanced",
|
"Starnodes_Aspect_Ratio_Advanced",
|
||||||
"Starupscale"
|
"Starupscale"
|
||||||
@@ -13244,13 +13178,10 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/XieJunchen/comfyUI_LLM": [
|
"https://github.com/XieJunchen/comfyUI_LLM": [
|
||||||
[
|
[
|
||||||
"CloudImageUploadNode",
|
|
||||||
"CloudImagesToVideoAndUpload",
|
|
||||||
"CloudVideoUploadNode",
|
|
||||||
"ComfyUI_LLM_Ollama",
|
"ComfyUI_LLM_Ollama",
|
||||||
"DeepSeek_Online",
|
"DeepSeek_Online",
|
||||||
"LoadGifFromLocal",
|
"QiniuImageUploadNode",
|
||||||
"LoadImgFromUrl",
|
"QiniuVideoUploadNode",
|
||||||
"StringArrayFormatter",
|
"StringArrayFormatter",
|
||||||
"StringArrayIndexer"
|
"StringArrayIndexer"
|
||||||
],
|
],
|
||||||
@@ -15268,17 +15199,6 @@
|
|||||||
"title_aux": "Avatar Graph"
|
"title_aux": "Avatar Graph"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/avenstack/ComfyUI-AV-FunASR": [
|
|
||||||
[
|
|
||||||
"AVASRTimestamp",
|
|
||||||
"AVFormat2Subtitle",
|
|
||||||
"AVSaveSubtitles",
|
|
||||||
"AVSpeechTimestamp"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-AV-FunASR"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/avenstack/ComfyUI-AV-LatentSync": [
|
"https://github.com/avenstack/ComfyUI-AV-LatentSync": [
|
||||||
[
|
[
|
||||||
"AVLatentSync",
|
"AVLatentSync",
|
||||||
@@ -16425,15 +16345,6 @@
|
|||||||
"title_aux": "ComfyUI Sequential Image Loader"
|
"title_aux": "ComfyUI Sequential Image Loader"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/budihartono/comfyui-aspect-ratio-presets": [
|
|
||||||
[
|
|
||||||
"CAS Empty Latent Aspect Ratio by Axis",
|
|
||||||
"CAS Empty Latent Aspect Ratio from Preset"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "CAS Aspect Ratio Presets Node for ComfyUI"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/budihartono/comfyui_otonx_nodes": [
|
"https://github.com/budihartono/comfyui_otonx_nodes": [
|
||||||
[
|
[
|
||||||
"OTX Integer Multiple Inputs 4",
|
"OTX Integer Multiple Inputs 4",
|
||||||
@@ -16518,17 +16429,6 @@
|
|||||||
"title_aux": "EBU PromptHelper"
|
"title_aux": "EBU PromptHelper"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/burnsbert/ComfyUI-EBU-Workflow": [
|
|
||||||
[
|
|
||||||
"EbuGetImageAspectRatio",
|
|
||||||
"EbuScalingResolution",
|
|
||||||
"EbuScalingTile",
|
|
||||||
"EbuUniqueFileName"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "EBU Workflow"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/bvhari/ComfyUI_CFGStar": [
|
"https://github.com/bvhari/ComfyUI_CFGStar": [
|
||||||
[
|
[
|
||||||
"CFGStar"
|
"CFGStar"
|
||||||
@@ -19110,7 +19010,7 @@
|
|||||||
"title_aux": "ComfyUI Anime Segmentation Nodes v1.1.0"
|
"title_aux": "ComfyUI Anime Segmentation Nodes v1.1.0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/crave33/RenesStuffDanbooruTagGet": [
|
"https://github.com/crave33/RenesStuffDanboruTagGet": [
|
||||||
[
|
[
|
||||||
"DanbooruTagFetcher"
|
"DanbooruTagFetcher"
|
||||||
],
|
],
|
||||||
@@ -20264,6 +20164,32 @@
|
|||||||
"title_aux": "ComfyUI_Dragos_Nodes"
|
"title_aux": "ComfyUI_Dragos_Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/dream-computing/syntax-nodes": [
|
||||||
|
[
|
||||||
|
"CyberpunkMagnifyNode",
|
||||||
|
"CyberpunkWindowNode",
|
||||||
|
"DepthToLidarEffectNode",
|
||||||
|
"EdgeMeasurementOverlayNode",
|
||||||
|
"EdgeTracingNode",
|
||||||
|
"FrequencyBeatSyncNode",
|
||||||
|
"FrequencyBeatSyncNodeAdvanced",
|
||||||
|
"GhostingNode",
|
||||||
|
"ImageBatchToImageList",
|
||||||
|
"ImageListToImageBatch",
|
||||||
|
"JigsawPuzzleNode",
|
||||||
|
"LowPolyNode",
|
||||||
|
"LuminanceParticleNode",
|
||||||
|
"PaperCraftNode",
|
||||||
|
"PointillismNode",
|
||||||
|
"RGBStreakNode",
|
||||||
|
"RegionBoundaryNode",
|
||||||
|
"VariableLineWidthEffectNode",
|
||||||
|
"VoxelNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "SyntaxNodes - Image Processing Effects for ComfyUI"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/dreamhartley/ComfyUI_show_seed": [
|
"https://github.com/dreamhartley/ComfyUI_show_seed": [
|
||||||
[
|
[
|
||||||
"Show Seed"
|
"Show Seed"
|
||||||
@@ -21550,27 +21476,17 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/gelasdev/ComfyUI-FLUX-BFL-API": [
|
"https://github.com/gelasdev/ComfyUI-FLUX-BFL-API": [
|
||||||
[
|
[
|
||||||
"FluxDeleteFinetune_BFL",
|
|
||||||
"FluxDevRedux_BFL",
|
"FluxDevRedux_BFL",
|
||||||
"FluxDev_BFL",
|
"FluxDev_BFL",
|
||||||
"FluxFinetuneDetails_BFL",
|
|
||||||
"FluxFinetuneStatus_BFL",
|
|
||||||
"FluxFinetune_BFL",
|
|
||||||
"FluxKontextMax_BFL",
|
"FluxKontextMax_BFL",
|
||||||
"FluxKontextPro_BFL",
|
"FluxKontextPro_BFL",
|
||||||
"FluxMyFinetunes_BFL",
|
|
||||||
"FluxPro11Redux_BFL",
|
"FluxPro11Redux_BFL",
|
||||||
"FluxPro11UltraFinetune_BFL",
|
|
||||||
"FluxPro11UltraRedux_BFL",
|
"FluxPro11UltraRedux_BFL",
|
||||||
"FluxPro11Ultra_BFL",
|
"FluxPro11Ultra_BFL",
|
||||||
"FluxPro11_BFL",
|
"FluxPro11_BFL",
|
||||||
"FluxProCannyFinetune_BFL",
|
|
||||||
"FluxProCanny_BFL",
|
"FluxProCanny_BFL",
|
||||||
"FluxProDepthFinetune_BFL",
|
|
||||||
"FluxProDepth_BFL",
|
"FluxProDepth_BFL",
|
||||||
"FluxProFillFinetune_BFL",
|
|
||||||
"FluxProFill_BFL",
|
"FluxProFill_BFL",
|
||||||
"FluxProFinetune_BFL",
|
|
||||||
"FluxPro_BFL"
|
"FluxPro_BFL"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -22676,16 +22592,6 @@
|
|||||||
"title_aux": "comfyui_LLM_schools"
|
"title_aux": "comfyui_LLM_schools"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/hexxacubic/ComfyUI-Prompt_Library": [
|
|
||||||
[
|
|
||||||
"Prompt_Library",
|
|
||||||
"Random_Project",
|
|
||||||
"Simple_Prompt_Library"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-Prompt_Library"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/hgabha/WWAA-CustomNodes": [
|
"https://github.com/hgabha/WWAA-CustomNodes": [
|
||||||
[
|
[
|
||||||
"WWAA-BuildString",
|
"WWAA-BuildString",
|
||||||
@@ -23957,18 +23863,6 @@
|
|||||||
"title_aux": "Painting Coder Utils"
|
"title_aux": "Painting Coder Utils"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/jasonjgardner/comfui-substance-designer-integration": [
|
|
||||||
[
|
|
||||||
"SubstanceBatchProcessor",
|
|
||||||
"SubstanceCooker",
|
|
||||||
"SubstanceInfoExtractor",
|
|
||||||
"SubstanceParameterController",
|
|
||||||
"SubstanceRenderer"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI Substance Designer Integration Plugin"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/jax-explorer/ComfyUI-InstantCharacter": [
|
"https://github.com/jax-explorer/ComfyUI-InstantCharacter": [
|
||||||
[
|
[
|
||||||
"InstantCharacterGenerate",
|
"InstantCharacterGenerate",
|
||||||
@@ -24346,7 +24240,6 @@
|
|||||||
"ai4artsed_random_artform_generator",
|
"ai4artsed_random_artform_generator",
|
||||||
"ai4artsed_random_instruction_generator",
|
"ai4artsed_random_instruction_generator",
|
||||||
"ai4artsed_random_language_selector",
|
"ai4artsed_random_language_selector",
|
||||||
"ai4artsed_stabilitai_key",
|
|
||||||
"ai4artsed_t5_clip_fusion",
|
"ai4artsed_t5_clip_fusion",
|
||||||
"ai4artsed_text_remix"
|
"ai4artsed_text_remix"
|
||||||
],
|
],
|
||||||
@@ -24469,17 +24362,6 @@
|
|||||||
"title_aux": "ComfyUI-Extract_Flux_Lora"
|
"title_aux": "ComfyUI-Extract_Flux_Lora"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/judian17/ComfyUI-UniWorld-jd17": [
|
|
||||||
[
|
|
||||||
"UniWorldEncoderNode",
|
|
||||||
"UniWorldScheduler",
|
|
||||||
"UniWorldSiglipEncoder",
|
|
||||||
"UniWorld_T5_CLIP_Encoder"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-UniWorld-jd17"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/judian17/ComfyUI-joycaption-beta-one-GGUF": [
|
"https://github.com/judian17/ComfyUI-joycaption-beta-one-GGUF": [
|
||||||
[
|
[
|
||||||
"JJC_JoyCaption_Custom_GGUF",
|
"JJC_JoyCaption_Custom_GGUF",
|
||||||
@@ -24592,7 +24474,6 @@
|
|||||||
"Bjornulf_ImageMaskCutter",
|
"Bjornulf_ImageMaskCutter",
|
||||||
"Bjornulf_ImageNote",
|
"Bjornulf_ImageNote",
|
||||||
"Bjornulf_ImageNoteLoadImage",
|
"Bjornulf_ImageNoteLoadImage",
|
||||||
"Bjornulf_ImageUpscaleWithModelTransparency",
|
|
||||||
"Bjornulf_ImagesListToVideo",
|
"Bjornulf_ImagesListToVideo",
|
||||||
"Bjornulf_JSONImagePromptExtractor",
|
"Bjornulf_JSONImagePromptExtractor",
|
||||||
"Bjornulf_KokoroTTS",
|
"Bjornulf_KokoroTTS",
|
||||||
@@ -24724,7 +24605,6 @@
|
|||||||
"Bjornulf_WriteTextPickMeGlobal",
|
"Bjornulf_WriteTextPickMeGlobal",
|
||||||
"Bjornulf_XTTSConfig",
|
"Bjornulf_XTTSConfig",
|
||||||
"Bjornulf_imagesToVideo",
|
"Bjornulf_imagesToVideo",
|
||||||
"Bjornulf_loadImageBase64Transparency",
|
|
||||||
"Bjornulf_ollamaLoader"
|
"Bjornulf_ollamaLoader"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -24925,6 +24805,14 @@
|
|||||||
"title_aux": "ComfyUI-text-file-util"
|
"title_aux": "ComfyUI-text-file-util"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/kambara/ComfyUI-PromptCheckList": [
|
||||||
|
[
|
||||||
|
"PromptPalette"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-PromptCheckList"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/kambara/ComfyUI-PromptPalette": [
|
"https://github.com/kambara/ComfyUI-PromptPalette": [
|
||||||
[
|
[
|
||||||
"PromptPalette"
|
"PromptPalette"
|
||||||
@@ -26109,7 +25997,6 @@
|
|||||||
"https://github.com/laksjdjf/ComfyUI-Imatrix": [
|
"https://github.com/laksjdjf/ComfyUI-Imatrix": [
|
||||||
[
|
[
|
||||||
"ImatrixUNETLoader",
|
"ImatrixUNETLoader",
|
||||||
"LoRAdiff",
|
|
||||||
"SaveImatrix"
|
"SaveImatrix"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -27682,7 +27569,6 @@
|
|||||||
"ScheduledCFGGuider //Inspire",
|
"ScheduledCFGGuider //Inspire",
|
||||||
"ScheduledPerpNegCFGGuider //Inspire",
|
"ScheduledPerpNegCFGGuider //Inspire",
|
||||||
"SeedExplorer //Inspire",
|
"SeedExplorer //Inspire",
|
||||||
"SeedLogger //Inspire",
|
|
||||||
"SelectNthMask //Inspire",
|
"SelectNthMask //Inspire",
|
||||||
"ShowCachedInfo //Inspire",
|
"ShowCachedInfo //Inspire",
|
||||||
"StableCascade_CheckpointLoader //Inspire",
|
"StableCascade_CheckpointLoader //Inspire",
|
||||||
@@ -28355,7 +28241,16 @@
|
|||||||
"TextExtractorNode"
|
"TextExtractorNode"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-MGnodes"
|
"title_aux": "ComfyUI Image Watermarking Node"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://github.com/meanin2/comfyui-watermarking": [
|
||||||
|
[
|
||||||
|
"ImageWatermarkNode",
|
||||||
|
"TextExtractorNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI Watermark Image Node"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/meap158/ComfyUI-Background-Replacement": [
|
"https://github.com/meap158/ComfyUI-Background-Replacement": [
|
||||||
@@ -28834,8 +28729,14 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/mit-han-lab/ComfyUI-nunchaku": [
|
"https://github.com/mit-han-lab/ComfyUI-nunchaku": [
|
||||||
[
|
[
|
||||||
|
"NunchakuDepthPreprocessor",
|
||||||
"NunchakuFluxDiTLoader",
|
"NunchakuFluxDiTLoader",
|
||||||
"NunchakuFluxLoraLoader"
|
"NunchakuFluxLoraLoader",
|
||||||
|
"NunchakuModelMerger",
|
||||||
|
"NunchakuPulidApply",
|
||||||
|
"NunchakuPulidLoader",
|
||||||
|
"NunchakuTextEncoderLoader",
|
||||||
|
"NunchakuTextEncoderLoaderV2"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-nunchaku"
|
"title_aux": "ComfyUI-nunchaku"
|
||||||
@@ -30394,14 +30295,6 @@
|
|||||||
"title_aux": "paint-by-example @ ComfyUI"
|
"title_aux": "paint-by-example @ ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/pictorialink/ComfyUI-Custom-Node-Config": [
|
|
||||||
[
|
|
||||||
"FormSubmitNode"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-Custom-Node-Config"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/pictorialink/ComfyUI-Text-Translation": [
|
"https://github.com/pictorialink/ComfyUI-Text-Translation": [
|
||||||
[
|
[
|
||||||
"Get_Translator",
|
"Get_Translator",
|
||||||
@@ -31350,8 +31243,7 @@
|
|||||||
"PrimitiveText",
|
"PrimitiveText",
|
||||||
"UtilityExpression",
|
"UtilityExpression",
|
||||||
"UtilityImageDimensions",
|
"UtilityImageDimensions",
|
||||||
"UtilitySwitch",
|
"UtilitySwitch"
|
||||||
"rookiepsi_ConstructMask"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI Extended"
|
"title_aux": "ComfyUI Extended"
|
||||||
@@ -31811,10 +31703,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/s9roll7/comfyui_cotracker_node": [
|
"https://github.com/s9roll7/comfyui_cotracker_node": [
|
||||||
[
|
[
|
||||||
"CoTrackerNode",
|
"CoTrackerNode"
|
||||||
"GridPointGeneratorNode",
|
|
||||||
"PerlinCoordinateRandomizerNode",
|
|
||||||
"XYMotionAmplifierNode"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Comfyui CoTracker Node"
|
"title_aux": "Comfyui CoTracker Node"
|
||||||
@@ -33335,34 +33224,12 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/spawner1145/CUI-Lumina2-TeaCache": [
|
"https://github.com/spawner1145/CUI-Lumina2-TeaCache": [
|
||||||
[
|
[
|
||||||
"LPIPS_Model_Loader",
|
"TeaCache_Lumina2"
|
||||||
"Store_Baseline_Image",
|
|
||||||
"TeaCache_LPIPS_Evaluator",
|
|
||||||
"TeaCache_Lumina2",
|
|
||||||
"TeaCache_Patcher",
|
|
||||||
"TeaCache_Result_Collector"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "CUI-Lumina2-TeaCache"
|
"title_aux": "CUI-Lumina2-TeaCache"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/spawner1145/comfyui-aichat": [
|
|
||||||
[
|
|
||||||
"GeminiApiLoader_Zho",
|
|
||||||
"GeminiChat_Zho",
|
|
||||||
"GeminiFileUploader_Zho",
|
|
||||||
"GeminiImageEncoder_Zho",
|
|
||||||
"GeminiTextBlock_Zho",
|
|
||||||
"OpenAIApiLoader_Zho",
|
|
||||||
"OpenAIChat_Zho",
|
|
||||||
"OpenAIFileUploader_Zho",
|
|
||||||
"OpenAIImageEncoder_Zho",
|
|
||||||
"OpenAITextBlock_Zho"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "comfyui-aichat"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/spinagon/ComfyUI-seam-carving": [
|
"https://github.com/spinagon/ComfyUI-seam-carving": [
|
||||||
[
|
[
|
||||||
"SeamCarving"
|
"SeamCarving"
|
||||||
@@ -34014,7 +33881,7 @@
|
|||||||
"OllamaKiller"
|
"OllamaKiller"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-ollama_killer"
|
"title_aux": "OllamaKiller Node for ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/thezveroboy/ComfyUI-CSM-Nodes": [
|
"https://github.com/thezveroboy/ComfyUI-CSM-Nodes": [
|
||||||
@@ -34793,10 +34660,7 @@
|
|||||||
[
|
[
|
||||||
"CreatePromptsWithTextFromFile",
|
"CreatePromptsWithTextFromFile",
|
||||||
"EmptyLatentSizePicker",
|
"EmptyLatentSizePicker",
|
||||||
"LoadDataFromFiles",
|
"SimpleSizePicker"
|
||||||
"SimpleSizePicker",
|
|
||||||
"WildcardReplace",
|
|
||||||
"WildcardReplaceFromFile"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI_BishaNodes"
|
"title_aux": "ComfyUI_BishaNodes"
|
||||||
@@ -35031,20 +34895,6 @@
|
|||||||
"title_aux": "ComfyUI-RemoveBackgroundSuite"
|
"title_aux": "ComfyUI-RemoveBackgroundSuite"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/whmc76/ComfyUI-UniversalToolkit": [
|
|
||||||
[
|
|
||||||
"EmptyUnitGenerator_UTK",
|
|
||||||
"ImageRatioDetector_UTK",
|
|
||||||
"PreviewMask_UTK",
|
|
||||||
"ShowFloat_UTK",
|
|
||||||
"ShowInt_UTK",
|
|
||||||
"ShowList_UTK",
|
|
||||||
"ShowText_UTK"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-UniversalToolkit"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/wildminder/ComfyUI-Chatterbox": [
|
"https://github.com/wildminder/ComfyUI-Chatterbox": [
|
||||||
[
|
[
|
||||||
"ChatterboxTTS",
|
"ChatterboxTTS",
|
||||||
@@ -35497,8 +35347,8 @@
|
|||||||
"LTLatentOp",
|
"LTLatentOp",
|
||||||
"LTLatentToShape",
|
"LTLatentToShape",
|
||||||
"LTLatentsConcatenate",
|
"LTLatentsConcatenate",
|
||||||
"LTNumberRangeGaussian",
|
"LTParamRandomizerGaussian",
|
||||||
"LTNumberRangeUniform",
|
"LTParamRandomizerRange",
|
||||||
"LTPreviewLatent",
|
"LTPreviewLatent",
|
||||||
"LTReshapeLatent",
|
"LTReshapeLatent",
|
||||||
"LTUniformLatent"
|
"LTUniformLatent"
|
||||||
@@ -35841,21 +35691,18 @@
|
|||||||
"MaskSmartValleySplit",
|
"MaskSmartValleySplit",
|
||||||
"MaskSplitFilter",
|
"MaskSplitFilter",
|
||||||
"MaskTopNFilter",
|
"MaskTopNFilter",
|
||||||
"TextKeyword",
|
"TextBeforeKeyword",
|
||||||
"YC Extract Number",
|
"YC Extract Number",
|
||||||
"YC Mask Condition Switch",
|
"YC Mask Condition Switch",
|
||||||
"YC Seed List",
|
|
||||||
"YC Super Selector",
|
"YC Super Selector",
|
||||||
"YC Text Condition Switch",
|
"YC Text Condition Switch",
|
||||||
"YC Text Index Switch",
|
"YC Text Index Switch",
|
||||||
"YC Universal Gate",
|
"YC Universal Gate",
|
||||||
"YCMaskComposite",
|
"YCMaskComposite",
|
||||||
|
"YCPromptReplace",
|
||||||
"YCRemapMaskRange",
|
"YCRemapMaskRange",
|
||||||
"YCTextImageGenerator",
|
"YCTextImageGenerator",
|
||||||
"YC_FiveTextCombineNode",
|
"YC_Image_Save"
|
||||||
"YC_Image_Save",
|
|
||||||
"YC_SingleTextNode",
|
|
||||||
"YC_textReplaceNode"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-YCNodes"
|
"title_aux": "ComfyUI-YCNodes"
|
||||||
@@ -36536,6 +36383,7 @@
|
|||||||
"DCI_BinaryFileLoader",
|
"DCI_BinaryFileLoader",
|
||||||
"DCI_BinaryFileSaver",
|
"DCI_BinaryFileSaver",
|
||||||
"DCI_BinaryFileUploader",
|
"DCI_BinaryFileUploader",
|
||||||
|
"DCI_FileLoader",
|
||||||
"DCI_FileNode",
|
"DCI_FileNode",
|
||||||
"DCI_Image",
|
"DCI_Image",
|
||||||
"DCI_ImageExporter",
|
"DCI_ImageExporter",
|
||||||
|
|||||||
6227
github-stats.json
6227
github-stats.json
File diff suppressed because it is too large
Load Diff
@@ -1,55 +1,23 @@
|
|||||||
{
|
{
|
||||||
"custom_nodes": [
|
"custom_nodes": [
|
||||||
{
|
{
|
||||||
"author": "cesilk10",
|
"author": "#NOTICE_1.13",
|
||||||
"title": "cesilk-comfyui-nodes",
|
"title": "NOTICE: This channel is not the default channel.",
|
||||||
"reference": "https://github.com/cesilk10/cesilk-comfyui-nodes",
|
"reference": "https://github.com/ltdrdata/ComfyUI-Manager",
|
||||||
"files": [
|
"files": [],
|
||||||
"https://github.com/cesilk10/cesilk-comfyui-nodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "NODES: Save and Upload to S3, SDXL Image Sizes"
|
"description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel."
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "COcisuts",
|
|
||||||
"title": "CObot-ComfyUI-WhisperToTranscription [WIP]",
|
|
||||||
"reference": "https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "CObot-ComfyUI-WhisperToTranscription\nNOTE: missing requirements.txt"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "xuhuan2048",
|
|
||||||
"title": "ExtractStoryboards [WIP]",
|
|
||||||
"reference": "https://github.com/gitadmini/comfyui_extractstoryboards",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/gitadmini/comfyui_extractstoryboards"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A tool for decomposing video storyboards, which can obtain storyboards and keyframes"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "jinchanz",
|
|
||||||
"title": "ComfyUI-AliCloud-Bailian [WIP]",
|
|
||||||
"reference": "https://github.com/jinchanz/ComfyUI-AliCloud-Bailian",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/jinchanz/ComfyUI-AliCloud-Bailian"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This is a collection of custom nodes for invoking Alibaba Cloud's DashScope API within ComfyUI.\nNOTE: The files in the repo are not organized."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Yukinoshita-Yukinoe",
|
|
||||||
"title": "ComfyUI-KontextOfficialNode",
|
|
||||||
"reference": "https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "NODES: Kontext Text-to-Image (Official Max), Kontext Image Editing (Official Max)"
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"author": "takoyaki1118",
|
"author": "takoyaki1118",
|
||||||
"title": "ComfyUI_PromptExtractor",
|
"title": "ComfyUI_PromptExtractor",
|
||||||
@@ -980,6 +948,16 @@
|
|||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "ComfyUI implementation of the partfield nvidea segmentation models\nNOTE: The files in the repo are not organized."
|
"description": "ComfyUI implementation of the partfield nvidea segmentation models\nNOTE: The files in the repo are not organized."
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"author": "MicheleGuidi",
|
||||||
|
"title": "ComfyUI-Computer-Vision [WIP]",
|
||||||
|
"reference": "https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MicheleGuidi/comfyui-computer-vision"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Extension nodes for ComfyUI that improves automatic segmentation using bounding boxes generated by Florence 2 and segmentation from Segment Anything 2 (SAM2). Currently just an enhancement of nodes from [a/Kijai](https://github.com/kijai/ComfyUI-segment-anything-2).\nNOTE: The files in the repo are not organized."
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"author": "shinich39",
|
"author": "shinich39",
|
||||||
"title": "comfyui-textarea-is-shit",
|
"title": "comfyui-textarea-is-shit",
|
||||||
@@ -1042,10 +1020,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"author": "ftechmax",
|
"author": "ftechmax",
|
||||||
"title": "ComfyUI-NovaKit-Pack",
|
"title": "ComfyUI-FTM-Pack",
|
||||||
"reference": "https://github.com/ftechmax/ComfyUI-NovaKit-Pack",
|
"reference": "https://github.com/ftechmax/ComfyUI-FTM-Pack",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/ftechmax/ComfyUI-NovaKit-Pack"
|
"https://github.com/ftechmax/ComfyUI-FTM-Pack"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "NODES: Count Tokens"
|
"description": "NODES: Count Tokens"
|
||||||
@@ -1055,7 +1033,7 @@
|
|||||||
"title": "ComfyUI DiaTest TTS Node [WIP]",
|
"title": "ComfyUI DiaTest TTS Node [WIP]",
|
||||||
"reference": "https://github.com/BobRandomNumber/ComfyUI-DiaTTS",
|
"reference": "https://github.com/BobRandomNumber/ComfyUI-DiaTTS",
|
||||||
"files": [
|
"files": [
|
||||||
"https://github.com/BobRandomNumber/ComfyUI-DiaTTS"
|
"https://github.com/BobRandomNumber/ComfyUI-DiaTest"
|
||||||
],
|
],
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "Partial ComfyUI Dia implementation"
|
"description": "Partial ComfyUI Dia implementation"
|
||||||
|
|||||||
@@ -599,7 +599,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Alazuaka/comfyui-lora-stack-node": [
|
"https://github.com/Alazuaka/comfyui-lora-stack-node": [
|
||||||
[
|
[
|
||||||
"AlazukaCheckpoint",
|
"EsCheckpointSet",
|
||||||
"EsLoraSet"
|
"EsLoraSet"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -876,7 +876,7 @@
|
|||||||
"title_aux": "ComfyUI-BDXNodes [WIP]"
|
"title_aux": "ComfyUI-BDXNodes [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/BobRandomNumber/ComfyUI-DiaTTS": [
|
"https://github.com/BobRandomNumber/ComfyUI-DiaTest": [
|
||||||
[
|
[
|
||||||
"DiaGenerate",
|
"DiaGenerate",
|
||||||
"DiaLoader"
|
"DiaLoader"
|
||||||
@@ -920,14 +920,6 @@
|
|||||||
"title_aux": "ComfyUI-BS_FalAi-API-Video [WIP]"
|
"title_aux": "ComfyUI-BS_FalAi-API-Video [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/COcisuts/CObot-ComfyUI-WhisperToTranscription": [
|
|
||||||
[
|
|
||||||
"CobotWhisperToTransciption"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "CObot-ComfyUI-WhisperToTranscription [WIP]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/CY-CHENYUE/ComfyUI-FramePack-HY": [
|
"https://github.com/CY-CHENYUE/ComfyUI-FramePack-HY": [
|
||||||
[
|
[
|
||||||
"CreateKeyframes_HY",
|
"CreateKeyframes_HY",
|
||||||
@@ -950,7 +942,6 @@
|
|||||||
"https://github.com/Chargeuk/ComfyUI-vts-nodes": [
|
"https://github.com/Chargeuk/ComfyUI-vts-nodes": [
|
||||||
[
|
[
|
||||||
"VTS Clean Text",
|
"VTS Clean Text",
|
||||||
"VTS Clean Text List",
|
|
||||||
"VTS Clear Ram",
|
"VTS Clear Ram",
|
||||||
"VTS Clip Text Encode",
|
"VTS Clip Text Encode",
|
||||||
"VTS Color Mask To Mask",
|
"VTS Color Mask To Mask",
|
||||||
@@ -961,11 +952,8 @@
|
|||||||
"VTS Images Scale",
|
"VTS Images Scale",
|
||||||
"VTS Images Scale To Min",
|
"VTS Images Scale To Min",
|
||||||
"VTS Merge Delimited Text",
|
"VTS Merge Delimited Text",
|
||||||
"VTS Merge Text Lists",
|
|
||||||
"VTS Reduce Batch Size",
|
"VTS Reduce Batch Size",
|
||||||
"VTS Render People Kps",
|
"VTS Render People Kps",
|
||||||
"VTS Repeat Text As List",
|
|
||||||
"VTS Replace Text In List",
|
|
||||||
"VTS To Text",
|
"VTS To Text",
|
||||||
"VTS_Load_Pose_Keypoints",
|
"VTS_Load_Pose_Keypoints",
|
||||||
"Vts Text To Batch Prompt"
|
"Vts Text To Batch Prompt"
|
||||||
@@ -1198,6 +1186,8 @@
|
|||||||
"DonutApplyLoRAStack",
|
"DonutApplyLoRAStack",
|
||||||
"DonutClipEncode",
|
"DonutClipEncode",
|
||||||
"DonutLoRAStack",
|
"DonutLoRAStack",
|
||||||
|
"DonutLoadCLIPModels",
|
||||||
|
"DonutLoadUNetModels",
|
||||||
"DonutWidenMergeCLIP",
|
"DonutWidenMergeCLIP",
|
||||||
"DonutWidenMergeUNet",
|
"DonutWidenMergeUNet",
|
||||||
"DualCFGGuider",
|
"DualCFGGuider",
|
||||||
@@ -2277,8 +2267,6 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/MakkiShizu/ComfyUI-MakkiTools": [
|
"https://github.com/MakkiShizu/ComfyUI-MakkiTools": [
|
||||||
[
|
[
|
||||||
"AutoLoop_create_pseudo_loop_video",
|
|
||||||
"Environment_INFO",
|
|
||||||
"GetImageNthCount",
|
"GetImageNthCount",
|
||||||
"ImageChannelSeparate",
|
"ImageChannelSeparate",
|
||||||
"ImageCountConcatenate",
|
"ImageCountConcatenate",
|
||||||
@@ -2349,6 +2337,15 @@
|
|||||||
"title_aux": "comfyui-yaml-prompt"
|
"title_aux": "comfyui-yaml-prompt"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/MicheleGuidi/comfyui-computer-vision": [
|
||||||
|
[
|
||||||
|
"Sam2ContextSegmentation",
|
||||||
|
"Sam2TiledSegmentation"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-Computer-Vision [WIP]"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/MickeyJ/ComfyUI_mickster_nodes": [
|
"https://github.com/MickeyJ/ComfyUI_mickster_nodes": [
|
||||||
[
|
[
|
||||||
"Image Size Scaled",
|
"Image Size Scaled",
|
||||||
@@ -2576,7 +2573,6 @@
|
|||||||
"FRED_AutoCropImage_Native_Ratio_v5",
|
"FRED_AutoCropImage_Native_Ratio_v5",
|
||||||
"FRED_AutoCropImage_SDXL_Ratio_V3",
|
"FRED_AutoCropImage_SDXL_Ratio_V3",
|
||||||
"FRED_AutoCropImage_SDXL_Ratio_V4",
|
"FRED_AutoCropImage_SDXL_Ratio_V4",
|
||||||
"FRED_AutoImageTile_from_Mask_v1",
|
|
||||||
"FRED_CropFace",
|
"FRED_CropFace",
|
||||||
"FRED_FolderSelector",
|
"FRED_FolderSelector",
|
||||||
"FRED_ImageBrowser_Dress",
|
"FRED_ImageBrowser_Dress",
|
||||||
@@ -3332,15 +3328,6 @@
|
|||||||
"title_aux": "ComfyUI_LLM_Are_You_Listening [WIP]"
|
"title_aux": "ComfyUI_LLM_Are_You_Listening [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Yukinoshita-Yukinoe/ComfyUI-KontextOfficialNode": [
|
|
||||||
[
|
|
||||||
"KontextImageEditingOfficialAPI_Max",
|
|
||||||
"KontextTextToImageOfficialAPI_Max"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-KontextOfficialNode"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO": [
|
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AuraSR-ZHO": [
|
||||||
[
|
[
|
||||||
"AuraSR_Lterative_Zho",
|
"AuraSR_Lterative_Zho",
|
||||||
@@ -3451,17 +3438,12 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/aa-parky/pipemind-comfyui": [
|
"https://github.com/aa-parky/pipemind-comfyui": [
|
||||||
[
|
[
|
||||||
"BatchImageLoad",
|
|
||||||
"BooleanSwitchAny",
|
"BooleanSwitchAny",
|
||||||
"KeywordPromptComposer",
|
"KeywordPromptComposer",
|
||||||
"PipemindDisplayAny",
|
|
||||||
"PipemindFlux2MAspectRatio",
|
"PipemindFlux2MAspectRatio",
|
||||||
"PipemindLoraLoader",
|
|
||||||
"PipemindMultilineTextInput",
|
"PipemindMultilineTextInput",
|
||||||
|
"PipemindRoomNode",
|
||||||
"PipemindSDXL15AspectRatio",
|
"PipemindSDXL15AspectRatio",
|
||||||
"PipemindSaveImageWTxt",
|
|
||||||
"PipemindShowText",
|
|
||||||
"PipemindTokenCounter",
|
|
||||||
"RandomLineFromDropdown",
|
"RandomLineFromDropdown",
|
||||||
"SelectLineFromDropdown",
|
"SelectLineFromDropdown",
|
||||||
"SimplePromptCombiner"
|
"SimplePromptCombiner"
|
||||||
@@ -4115,15 +4097,6 @@
|
|||||||
"title_aux": "cel_sampler [WIP]"
|
"title_aux": "cel_sampler [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/cesilk10/cesilk-comfyui-nodes": [
|
|
||||||
[
|
|
||||||
"SaveAndUploadToS3",
|
|
||||||
"SdxlImageSizes"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "cesilk-comfyui-nodes"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/chaojie/ComfyUI-DynamiCrafter": [
|
"https://github.com/chaojie/ComfyUI-DynamiCrafter": [
|
||||||
[
|
[
|
||||||
"DynamiCrafter Simple",
|
"DynamiCrafter Simple",
|
||||||
@@ -5101,12 +5074,12 @@
|
|||||||
"title_aux": "ComfyUI-LLM-Utils [WIP]"
|
"title_aux": "ComfyUI-LLM-Utils [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/ftechmax/ComfyUI-NovaKit-Pack": [
|
"https://github.com/ftechmax/ComfyUI-FTM-Pack": [
|
||||||
[
|
[
|
||||||
"CountTokens"
|
"CountTokens"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-NovaKit-Pack"
|
"title_aux": "ComfyUI-FTM-Pack"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/gabe-init/ComfyUI-LM-Studio": [
|
"https://github.com/gabe-init/ComfyUI-LM-Studio": [
|
||||||
@@ -5189,17 +5162,6 @@
|
|||||||
"title_aux": "ComfyUI-N_SwapInput [UNSAFE]"
|
"title_aux": "ComfyUI-N_SwapInput [UNSAFE]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/gitadmini/comfyui_extractstoryboards": [
|
|
||||||
[
|
|
||||||
"Example",
|
|
||||||
"ExtractStoryboards_xuhuan1024",
|
|
||||||
"IntBatchSize_xuhuan1024",
|
|
||||||
"IntBatch_xuhuan1024"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ExtractStoryboards [WIP]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/githubYiheng/comfyui_median_filter": [
|
"https://github.com/githubYiheng/comfyui_median_filter": [
|
||||||
[
|
[
|
||||||
"ImageMedianFilter"
|
"ImageMedianFilter"
|
||||||
@@ -5349,15 +5311,9 @@
|
|||||||
"HolafBenchmarkLoader",
|
"HolafBenchmarkLoader",
|
||||||
"HolafBenchmarkPlotter",
|
"HolafBenchmarkPlotter",
|
||||||
"HolafBenchmarkRunner",
|
"HolafBenchmarkRunner",
|
||||||
"HolafColorMatcher",
|
|
||||||
"HolafImageComparer",
|
"HolafImageComparer",
|
||||||
"HolafInstagramResize",
|
"HolafInstagramResize",
|
||||||
"HolafInteractiveImageEditor",
|
|
||||||
"HolafKSampler",
|
"HolafKSampler",
|
||||||
"HolafLutApplier",
|
|
||||||
"HolafLutGenerator",
|
|
||||||
"HolafLutLoader",
|
|
||||||
"HolafLutSaver",
|
|
||||||
"HolafNeurogridOverload",
|
"HolafNeurogridOverload",
|
||||||
"HolafOverlayNode",
|
"HolafOverlayNode",
|
||||||
"HolafResolutionPreset",
|
"HolafResolutionPreset",
|
||||||
@@ -5827,18 +5783,6 @@
|
|||||||
"title_aux": "Jim's ComfyUI Nodes [WIP]"
|
"title_aux": "Jim's ComfyUI Nodes [WIP]"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/jinchanz/ComfyUI-AliCloud-Bailian": [
|
|
||||||
[
|
|
||||||
"BailianAPI",
|
|
||||||
"BailianAPIPoll",
|
|
||||||
"BailianAPISubmit",
|
|
||||||
"MaletteJSONExtractor",
|
|
||||||
"MaletteJSONModifier"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-AliCloud-Bailian [WIP]"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/jn-jairo/jn_node_suite_comfyui": [
|
"https://github.com/jn-jairo/jn_node_suite_comfyui": [
|
||||||
[
|
[
|
||||||
"JN_AreaInfo",
|
"JN_AreaInfo",
|
||||||
@@ -7562,7 +7506,6 @@
|
|||||||
"RunPython",
|
"RunPython",
|
||||||
"SaveSpiderData",
|
"SaveSpiderData",
|
||||||
"SpiderCrawl",
|
"SpiderCrawl",
|
||||||
"SpiderSplit",
|
|
||||||
"String2Json",
|
"String2Json",
|
||||||
"String_Attachment"
|
"String_Attachment"
|
||||||
],
|
],
|
||||||
@@ -8479,7 +8422,6 @@
|
|||||||
"https://github.com/wTechArtist/ComfyUI_VVL_SAM2": [
|
"https://github.com/wTechArtist/ComfyUI_VVL_SAM2": [
|
||||||
[
|
[
|
||||||
"SAM1AutoEverything",
|
"SAM1AutoEverything",
|
||||||
"VVL_DetectionScaler",
|
|
||||||
"VVL_Florence2SAM2",
|
"VVL_Florence2SAM2",
|
||||||
"VVL_GroundingDinoSAM2",
|
"VVL_GroundingDinoSAM2",
|
||||||
"VVL_MaskCleaner",
|
"VVL_MaskCleaner",
|
||||||
@@ -8691,7 +8633,6 @@
|
|||||||
"RegionalPromptSamplerX",
|
"RegionalPromptSamplerX",
|
||||||
"RelightX",
|
"RelightX",
|
||||||
"RemoveBackgroundX",
|
"RemoveBackgroundX",
|
||||||
"SamplersTestX",
|
|
||||||
"SaveImageX",
|
"SaveImageX",
|
||||||
"SelectiveDepthLoraBlocksX",
|
"SelectiveDepthLoraBlocksX",
|
||||||
"SimpleBlockerX",
|
"SimpleBlockerX",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,15 +1,16 @@
|
|||||||
{
|
{
|
||||||
"custom_nodes": [
|
"custom_nodes": [
|
||||||
{
|
{
|
||||||
"author": "dream-computing",
|
"author": "#NOTICE_1.13",
|
||||||
"title": "SyntaxNodes - Image Processing Effects for ComfyUI [REMOVED]",
|
"title": "NOTICE: This channel is not the default channel.",
|
||||||
"reference": "https://github.com/dream-computing/syntax-nodes",
|
"reference": "https://github.com/ltdrdata/ComfyUI-Manager",
|
||||||
"files": [
|
"files": [],
|
||||||
"https://github.com/dream-computing/syntax-nodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "A collection of custom nodes for ComfyUI designed to apply various image processing effects, stylizations, and analyses."
|
"description": "If you see this message, your ComfyUI-Manager is outdated.\nLegacy channel provides only the list of the deprecated nodes. If you want to find the complete node list, please go to the Default channel."
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"author": "UD1sto",
|
"author": "UD1sto",
|
||||||
"title": "plugin-utils-nodes [DEPRECATED]",
|
"title": "plugin-utils-nodes [DEPRECATED]",
|
||||||
|
|||||||
@@ -1,138 +1,16 @@
|
|||||||
{
|
{
|
||||||
"custom_nodes": [
|
"custom_nodes": [
|
||||||
{
|
{
|
||||||
"author": "avenstack",
|
"author": "#NOTICE_1.13",
|
||||||
"title": "ComfyUI-AV-FunASR",
|
"title": "NOTICE: This channel is not the default channel.",
|
||||||
"reference": "https://github.com/avenstack/ComfyUI-AV-FunASR",
|
"reference": "https://github.com/ltdrdata/ComfyUI-Manager","files": [],
|
||||||
"files": [
|
|
||||||
"https://github.com/avenstack/ComfyUI-AV-FunASR"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
"install_type": "git-clone",
|
||||||
"description": "FunASR wrapper for ComfyUI"
|
"description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!"
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "burnsbert",
|
|
||||||
"title": "EBU Workflow",
|
|
||||||
"id": "ebu-workflow",
|
|
||||||
"reference": "https://github.com/burnsbert/ComfyUI-EBU-Workflow",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/burnsbert/ComfyUI-EBU-Workflow"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Custom nodes for general workflow quality of life including resolutions sorted by aspect ratio, upscaling helps, and unique file names"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "vladpro3",
|
|
||||||
"title": "ComfyUI_BishaNodes",
|
|
||||||
"reference": "https://github.com/vladpro3/ComfyUI_BishaNodes",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/vladpro3/ComfyUI_BishaNodes"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Custom nodes for ComfyUI to improve promts and image settings"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "jasonjgardner",
|
|
||||||
"title": "ComfyUI Substance Designer Integration Plugin",
|
|
||||||
"reference": "https://github.com/jasonjgardner/comfui-substance-designer-integration",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/jasonjgardner/comfui-substance-designer-integration"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A comprehensive ComfyUI plugin that enables seamless integration with Substance 3D Designer workflows through command line automation. This plugin provides custom nodes for cooking .sbs files, rendering .sbsar archives, controlling material parameters, and batch processing Substance materials within ComfyUI workflows."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "budihartono",
|
|
||||||
"title": "CAS Aspect Ratio Presets Node for ComfyUI",
|
|
||||||
"id": "comfyui-aspect-ratio-presets",
|
|
||||||
"reference": "https://github.com/budihartono/comfyui-aspect-ratio-presets",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/budihartono/comfyui-aspect-ratio-presets"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Quickly create empty latents in common resolutions and aspect ratios for SD 1.5, SDXL, Flux, Chroma, and HiDream. Choose from curated presets or generate by axis and aspect ratio. Appears in the 'latent' node group."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "spawner",
|
|
||||||
"title": "comfyui-aichat",
|
|
||||||
"reference": "https://github.com/spawner1145/comfyui-aichat",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/spawner1145/comfyui-aichat"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "gemini and openai in comfyui"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "swhsiang",
|
|
||||||
"title": "comfyui-3d-gs-renderer",
|
|
||||||
"reference": "https://github.com/swhsiang/comfyui-3d-gs-renderer",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/swhsiang/comfyui-3d-gs-renderer"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "ComfyUI custom node to support 3D GS rendering"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "sLKbabawhsiang",
|
|
||||||
"title": "ComfyUI-TuZi-Flux-Kontext",
|
|
||||||
"reference": "https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": " Powerful Flux-Kontext image generation custom node for ComfyUI, using the official RabbitAI API. Supports text-to-image, image-to-image, and multi-image-to-image generation. Supports concurrent generation."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "MicheleGuidi",
|
|
||||||
"title": "ComfyUI-Computer-Vision",
|
|
||||||
"reference": "https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Extension nodes for ComfyUI that improves automatic segmentation using bounding boxes generated by Florence 2 and segmentation from Segment Anything 2 (SAM2). Currently just an enhancement of nodes from [a/Kijai](https://github.com/kijai/ComfyUI-segment-anything-2)."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "Pigidiy",
|
|
||||||
"title": "ComfyUI-LikeSpiderAI-UI",
|
|
||||||
"id": "like_spider_ui",
|
|
||||||
"reference": "https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Declarative UI Framework for ComfyUI Nodes. Minimalistic base class for creating UI-based audio/text/image nodes."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "hexxacubic",
|
|
||||||
"title": "ComfyUI-Prompt_Library",
|
|
||||||
"reference": "https://github.com/hexxacubic/ComfyUI-Prompt_Library",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/hexxacubic/ComfyUI-Prompt_Library"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "A ComfyUI Node to save and load prompts from a library."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "judian17",
|
|
||||||
"title": "ComfyUI-UniWorld-jd17",
|
|
||||||
"reference": "https://github.com/judian17/ComfyUI-UniWorld-jd17",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/judian17/ComfyUI-UniWorld-jd17"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "Unofficial ComfyUI implementation of [a/UniWorld-V1](https://github.com/PKU-YuanGroup/UniWorld-V1)."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"author": "whmc76",
|
|
||||||
"title": "ComfyUI-UniversalToolkit",
|
|
||||||
"reference": "https://github.com/whmc76/ComfyUI-UniversalToolkit",
|
|
||||||
"files": [
|
|
||||||
"https://github.com/whmc76/ComfyUI-UniversalToolkit"
|
|
||||||
],
|
|
||||||
"install_type": "git-clone",
|
|
||||||
"description": "This plugin provides general-purpose utility nodes for ComfyUI. Currently, it implements a 'Blank Cell Generator' node, which can batch-generate images, masks, and latents with specified resolution and color."
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"author": "xmarre",
|
"author": "xmarre",
|
||||||
"title": "LoRA-Safe TorchCompile",
|
"title": "LoRA-Safe TorchCompile",
|
||||||
@@ -690,6 +568,136 @@
|
|||||||
],
|
],
|
||||||
"description": "Merge up to 4 LoRA models with balanced, order-independent logic. Inspired by WebUI SuperMerger.",
|
"description": "Merge up to 4 LoRA models with balanced, order-independent logic. Inspired by WebUI SuperMerger.",
|
||||||
"install_type": "git-clone"
|
"install_type": "git-clone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "whmc76",
|
||||||
|
"title": "ComfyUI-RemoveBackgroundSuite",
|
||||||
|
"reference": "https://github.com/whmc76/ComfyUI-RemoveBackgroundSuite",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/whmc76/ComfyUI-RemoveBackgroundSuite"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A matting toolkit based on ComfyUI, supporting multiple matting models and detail processing methods."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "mrcuddle",
|
||||||
|
"title": "Underage Filter",
|
||||||
|
"reference": "https://github.com/T-Ph525/ComfyUI-Underage-Filter",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/T-Ph525/ComfyUI-Underage-Filter"
|
||||||
|
],
|
||||||
|
"description": "An implementation to detect underage subjects in images for ComfyUI.",
|
||||||
|
"install_type": "git-clone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "ToTheBeginning",
|
||||||
|
"title": "DreamO Comfyui",
|
||||||
|
"reference": "https://github.com/ToTheBeginning/ComfyUI-DreamO",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/ToTheBeginning/ComfyUI-DreamO"
|
||||||
|
],
|
||||||
|
"description": "[a/DreamO](https://github.com/bytedance/DreamO) ComfyUI native implementation.",
|
||||||
|
"install_type": "git-clone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "SanDiegoDude",
|
||||||
|
"title": "ComfyUI-Kontext-API",
|
||||||
|
"reference": "https://github.com/SanDiegoDude/ComfyUI-Kontext-API",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/SanDiegoDude/ComfyUI-Kontext-API"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A custom ComfyUI node for integrating with the Fal Kontext API for advanced image editing and generation."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "juntaosun",
|
||||||
|
"title": "ComfyUI_open_nodes",
|
||||||
|
"reference": "https://github.com/juntaosun/ComfyUI_open_nodes",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/juntaosun/ComfyUI_open_nodes"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI open nodes by juntaosun."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "angree",
|
||||||
|
"title": "Q Find Mask Size",
|
||||||
|
"reference": "https://github.com/angree/ComfyUI-Q_find-mask-size",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/angree/ComfyUI-Q_find-mask-size"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI custom node for finding and analyzing mask sizes in images"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "Yuan-ManX",
|
||||||
|
"title": "ComfyUI-HunyuanVideo-Avatar",
|
||||||
|
"reference": "https://github.com/Yuan-ManX/ComfyUI-HunyuanVideo-Avatar",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/Yuan-ManX/ComfyUI-HunyuanVideo-Avatar"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "ComfyUI-HunyuanVideo-Avatar is now available in ComfyUI, HunyuanVideo-Avatar is a multimodal diffusion transformer (MM-DiT)-based model capable of simultaneously generating dynamic, emotion-controllable, and multi-character dialogue videos."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "DragonDiffusionbyBoyo",
|
||||||
|
"title": "BoyoSupercoolWrapper",
|
||||||
|
"reference": "https://github.com/DragonDiffusionbyBoyo/BoyoSupercoolWrapper",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/DragonDiffusionbyBoyo/BoyoSupercoolWrapper"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "This is a ComfyUI wrapper for Andrew DalPino's SuperCool upscaler, enabling its use directly within ComfyUI's node workflow. No extra dependencies required—just drop in the models and go."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "filliptm",
|
||||||
|
"title": "ComfyUI_Fill-ChatterBox",
|
||||||
|
"reference": "https://github.com/filliptm/ComfyUI_Fill-ChatterBox",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/filliptm/ComfyUI_Fill-ChatterBox"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Voice Clone and TTS model."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "MijnSpam",
|
||||||
|
"title": "Comfy swap and scale",
|
||||||
|
"reference": "https://github.com/MijnSpam/ComfyUI_SwapAndScale",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/MijnSpam/ComfyUI_SwapAndScale"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "Do you want to easily swap width and heigth? Than this is for you. From portrait to Landscape. Is you images model trained on 1MP pictures, then you can easily scale those down. For best pictures width and heigth should be a factor of 32, say no more..."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "narusas",
|
||||||
|
"title": "ComfyUI Logic Support",
|
||||||
|
"reference": "https://github.com/narusas/Comfyui-Logic-Support",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/narusas/Comfyui-Logic-Support"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A collection of logic and utility nodes for ComfyUI to enhance workflow capabilities."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "wTechArtist",
|
||||||
|
"title": "ComfyUI VVL Video Camera Advanced",
|
||||||
|
"reference": "https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera_Advanced",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/wTechArtist/ComfyUI_VVL_VideoCamera_Advanced"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "A professional video camera parameter estimation toolkit based on the VGGT model."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"author": "niknah",
|
||||||
|
"title": "Audio General",
|
||||||
|
"reference": "https://github.com/niknah/audio-general-ComfyUI",
|
||||||
|
"files": [
|
||||||
|
"https://github.com/niknah/audio-general-ComfyUI"
|
||||||
|
],
|
||||||
|
"install_type": "git-clone",
|
||||||
|
"description": "General audio nodes. Mix, Bass/Treble, Concatenate, Pitch, Add/remove silence, Speed"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -256,12 +256,10 @@
|
|||||||
"ALLty",
|
"ALLty",
|
||||||
"EGRWGL",
|
"EGRWGL",
|
||||||
"EGRYDZQHNode",
|
"EGRYDZQHNode",
|
||||||
"EGSEED",
|
|
||||||
"GroupSwitchNode",
|
"GroupSwitchNode",
|
||||||
"GroupSwitchNodee",
|
"GroupSwitchNodee",
|
||||||
"GroupSwitchNodeee",
|
"GroupSwitchNodeee",
|
||||||
"GroupSwitchNodeeee",
|
"GroupSwitchNodeeee",
|
||||||
"GroupSwitchNodi",
|
|
||||||
"hulue",
|
"hulue",
|
||||||
"jinyong"
|
"jinyong"
|
||||||
],
|
],
|
||||||
@@ -332,21 +330,10 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/2frames/ComfyUI-AQnodes": [
|
"https://github.com/2frames/ComfyUI-AQnodes": [
|
||||||
[
|
[
|
||||||
"AQ_BatchAverageImage",
|
|
||||||
"AQ_BlendImages",
|
|
||||||
"AQ_CLIPSetLastLayer",
|
|
||||||
"AQ_ColorMatchImage",
|
|
||||||
"AQ_Gemini",
|
"AQ_Gemini",
|
||||||
"AQ_ImageMaskSwitch",
|
|
||||||
"AQ_Image_DetailTransfer",
|
|
||||||
"AQ_Image_Pad",
|
|
||||||
"AQ_Increment",
|
|
||||||
"AQ_LoadImageBase64",
|
|
||||||
"AQ_MasksAndImagesAsList",
|
"AQ_MasksAndImagesAsList",
|
||||||
"AQ_Qwen",
|
"AQ_Qwen",
|
||||||
"AQ_QwenLoader",
|
"AQ_QwenLoader",
|
||||||
"AQ_Random",
|
|
||||||
"AQ_SaveImageWebpReturnBase64",
|
|
||||||
"AQ_SendImageToAPI",
|
"AQ_SendImageToAPI",
|
||||||
"AQ_multiface_ApplyPulidFlux"
|
"AQ_multiface_ApplyPulidFlux"
|
||||||
],
|
],
|
||||||
@@ -3485,7 +3472,6 @@
|
|||||||
"Categorizer",
|
"Categorizer",
|
||||||
"CollectAndDistributeText",
|
"CollectAndDistributeText",
|
||||||
"Coloring",
|
"Coloring",
|
||||||
"ConditionalLoRAApplierCreepybits",
|
|
||||||
"CustomNodeManager",
|
"CustomNodeManager",
|
||||||
"DelayNode",
|
"DelayNode",
|
||||||
"DelayTextNode",
|
"DelayTextNode",
|
||||||
@@ -3551,15 +3537,7 @@
|
|||||||
"title_aux": "ComfyUi Random Manage Cyan"
|
"title_aux": "ComfyUi Random Manage Cyan"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI-Image-Vector": [
|
"https://github.com/Cyber-Blacat/ComfyUI-Yuan": [
|
||||||
[
|
|
||||||
"Vector"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "Cyber-BlackCat"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI-MoneyMaker": [
|
|
||||||
[
|
[
|
||||||
", and the value is the function name in the right of the",
|
", and the value is the function name in the right of the",
|
||||||
"Black and white",
|
"Black and white",
|
||||||
@@ -3579,6 +3557,14 @@
|
|||||||
"title_aux": "ComfyUI-Yuan"
|
"title_aux": "ComfyUI-Yuan"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/Cyber-BlackCat/ComfyUI-Image-Vector": [
|
||||||
|
[
|
||||||
|
"Vector"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "Cyber-BlackCat"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/Cyber-BlackCat/ComfyUI_Auto_Caption": [
|
"https://github.com/Cyber-BlackCat/ComfyUI_Auto_Caption": [
|
||||||
[
|
[
|
||||||
"Auto Caption",
|
"Auto Caption",
|
||||||
@@ -5474,8 +5460,6 @@
|
|||||||
"Integer to Float",
|
"Integer to Float",
|
||||||
"Integer to String",
|
"Integer to String",
|
||||||
"Latent Switch",
|
"Latent Switch",
|
||||||
"Load Image",
|
|
||||||
"Logic Compare",
|
|
||||||
"Math Operation",
|
"Math Operation",
|
||||||
"Model Switch",
|
"Model Switch",
|
||||||
"Prompt Combiner",
|
"Prompt Combiner",
|
||||||
@@ -7029,7 +7013,6 @@
|
|||||||
"ImageSizeAdjustment",
|
"ImageSizeAdjustment",
|
||||||
"InspyrenetRembgLoader",
|
"InspyrenetRembgLoader",
|
||||||
"InspyrenetRembgProcess",
|
"InspyrenetRembgProcess",
|
||||||
"LG_LatentBatchToList",
|
|
||||||
"LG_LoadImage",
|
"LG_LoadImage",
|
||||||
"LG_Noise",
|
"LG_Noise",
|
||||||
"LazySwitch1way",
|
"LazySwitch1way",
|
||||||
@@ -7052,16 +7035,6 @@
|
|||||||
"title_aux": "ImagesGrid"
|
"title_aux": "ImagesGrid"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/LKbaba/ComfyUI-TuZi-Flux-Kontext": [
|
|
||||||
[
|
|
||||||
"FluxKontext_ImageToImage",
|
|
||||||
"FluxKontext_MultiImageToImage",
|
|
||||||
"FluxKontext_TextToImage"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-TuZi-Flux-Kontext"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/LamEmil/ComfyUI_ASCIIArtNode": [
|
"https://github.com/LamEmil/ComfyUI_ASCIIArtNode": [
|
||||||
[
|
[
|
||||||
"ASCIIAnimationGenerator",
|
"ASCIIAnimationGenerator",
|
||||||
@@ -7174,7 +7147,6 @@
|
|||||||
"BoolToString|LP",
|
"BoolToString|LP",
|
||||||
"CLIP Text Encode Translate [LP]",
|
"CLIP Text Encode Translate [LP]",
|
||||||
"CLIPTextEncodeTranslate|LP",
|
"CLIPTextEncodeTranslate|LP",
|
||||||
"Calculate Target Size By Mask [LP]",
|
|
||||||
"CalculateTargetSizeByMask|LP",
|
"CalculateTargetSizeByMask|LP",
|
||||||
"Convert Bool To Int [LP]",
|
"Convert Bool To Int [LP]",
|
||||||
"Convert Bool To String [LP]",
|
"Convert Bool To String [LP]",
|
||||||
@@ -7190,17 +7162,12 @@
|
|||||||
"Convert String To Number [LP]",
|
"Convert String To Number [LP]",
|
||||||
"Count Objects [LP]",
|
"Count Objects [LP]",
|
||||||
"CountObjects|LP",
|
"CountObjects|LP",
|
||||||
"Cropped Aspect Size Parameters [LP]",
|
|
||||||
"Cropped Forsed Size Parameters [LP]",
|
|
||||||
"Cropped Free Size Parameters [LP]",
|
|
||||||
"Cropped Ranged Size Parameters [LP]",
|
|
||||||
"CroppedAspectSizeParameters|LP",
|
"CroppedAspectSizeParameters|LP",
|
||||||
"CroppedForsedSizeParameters|LP",
|
"CroppedForsedSizeParameters|LP",
|
||||||
"CroppedFreeSizeParameters|LP",
|
"CroppedFreeSizeParameters|LP",
|
||||||
"CroppedRangedSizeParameters|LP",
|
"CroppedRangedSizeParameters|LP",
|
||||||
"Delay [LP]",
|
"Delay [LP]",
|
||||||
"Delay|LP",
|
"Delay|LP",
|
||||||
"Extend Factor Parameters [LP]",
|
|
||||||
"ExtendFactorParameters|LP",
|
"ExtendFactorParameters|LP",
|
||||||
"Fast Checker Pattern [LP]",
|
"Fast Checker Pattern [LP]",
|
||||||
"FastCheckerPattern|LP",
|
"FastCheckerPattern|LP",
|
||||||
@@ -7217,8 +7184,6 @@
|
|||||||
"Image Overlay [LP]",
|
"Image Overlay [LP]",
|
||||||
"ImageLoaderFromPath|LP",
|
"ImageLoaderFromPath|LP",
|
||||||
"ImageOverlay|LP",
|
"ImageOverlay|LP",
|
||||||
"Inpaint Crop [LP]",
|
|
||||||
"Inpaint Stitch [LP]",
|
|
||||||
"InpaintCrop|LP",
|
"InpaintCrop|LP",
|
||||||
"InpaintStitch|LP",
|
"InpaintStitch|LP",
|
||||||
"IntToBool|LP",
|
"IntToBool|LP",
|
||||||
@@ -7252,8 +7217,6 @@
|
|||||||
"RemoveBannedTagsFromTags|LP",
|
"RemoveBannedTagsFromTags|LP",
|
||||||
"RemoveBannedTagsFromText|LP",
|
"RemoveBannedTagsFromText|LP",
|
||||||
"RemoveDuplicateTags|LP",
|
"RemoveDuplicateTags|LP",
|
||||||
"Resize Image To Target Size [LP]",
|
|
||||||
"Resize Image and Masks [LP]",
|
|
||||||
"ResizeImageAndMasks|LP",
|
"ResizeImageAndMasks|LP",
|
||||||
"ResizeImageToTargetSize|LP",
|
"ResizeImageToTargetSize|LP",
|
||||||
"Resorting Tags [LP]",
|
"Resorting Tags [LP]",
|
||||||
@@ -7700,13 +7663,8 @@
|
|||||||
"LoraTagLoader",
|
"LoraTagLoader",
|
||||||
"ResolutionSelector",
|
"ResolutionSelector",
|
||||||
"StringCleaning",
|
"StringCleaning",
|
||||||
"StringTextExtractor",
|
|
||||||
"StringTextSplitter",
|
|
||||||
"TiktokenTokenizer",
|
"TiktokenTokenizer",
|
||||||
"WildcardProcessor",
|
|
||||||
"\u26d4 Generate Negative Prompt",
|
"\u26d4 Generate Negative Prompt",
|
||||||
"\u2702\ufe0f String Text Extractor",
|
|
||||||
"\u2702\ufe0f String Text Splitter",
|
|
||||||
"\u2728\ud83c\udf10 Groq ALM API - Translate [EN only]",
|
"\u2728\ud83c\udf10 Groq ALM API - Translate [EN only]",
|
||||||
"\u2728\ud83d\udcac Groq LLM API",
|
"\u2728\ud83d\udcac Groq LLM API",
|
||||||
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
"\u2728\ud83d\udcdd Groq ALM API - Transcribe",
|
||||||
@@ -7715,7 +7673,6 @@
|
|||||||
"\ud83d\udcbe Save Text File With Path",
|
"\ud83d\udcbe Save Text File With Path",
|
||||||
"\ud83d\udcc1 Get File Path",
|
"\ud83d\udcc1 Get File Path",
|
||||||
"\ud83d\udcd0 Resolution Image Size Selector",
|
"\ud83d\udcd0 Resolution Image Size Selector",
|
||||||
"\ud83d\udcdd Wildcard Processor",
|
|
||||||
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
"\ud83d\udd20 Tiktoken Tokenizer Info",
|
||||||
"\ud83d\uddbc\ufe0f Download Image from URL",
|
"\ud83d\uddbc\ufe0f Download Image from URL",
|
||||||
"\ud83e\uddf9 String Cleaning"
|
"\ud83e\uddf9 String Cleaning"
|
||||||
@@ -7982,15 +7939,6 @@
|
|||||||
"title_aux": "ComfyUI ZhipuAI Platform"
|
"title_aux": "ComfyUI ZhipuAI Platform"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/MicheleGuidi/ComfyUI-Contextual-SAM2": [
|
|
||||||
[
|
|
||||||
"Sam2ContextSegmentation",
|
|
||||||
"Sam2TiledSegmentation"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-Computer-Vision"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/MiddleKD/ComfyUI-denoise-mask-scheduler": [
|
"https://github.com/MiddleKD/ComfyUI-denoise-mask-scheduler": [
|
||||||
[
|
[
|
||||||
"ApplyDenoiseMaskSchedulerWithSigma",
|
"ApplyDenoiseMaskSchedulerWithSigma",
|
||||||
@@ -9185,14 +9133,6 @@
|
|||||||
"title_aux": "ComfyUI-LikeSpiderAI-SaveMP3"
|
"title_aux": "ComfyUI-LikeSpiderAI-SaveMP3"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/Pigidiy/ComfyUI-LikeSpiderAI-UI": [
|
|
||||||
[
|
|
||||||
"AudioExport"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-LikeSpiderAI-UI"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/PixelFunAI/ComfyUI_PixelFun": [
|
"https://github.com/PixelFunAI/ComfyUI_PixelFun": [
|
||||||
[
|
[
|
||||||
"HunyuanLoadAndEditLoraBlocks",
|
"HunyuanLoadAndEditLoraBlocks",
|
||||||
@@ -9955,8 +9895,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/Santodan/santodan-custom-nodes-comfyui": [
|
"https://github.com/Santodan/santodan-custom-nodes-comfyui": [
|
||||||
[
|
[
|
||||||
"RandomLoRACustom",
|
"RandomLoRACustom"
|
||||||
"RandomLoRAFolder"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Santodan Random LoRA Node"
|
"title_aux": "Santodan Random LoRA Node"
|
||||||
@@ -11348,7 +11287,6 @@
|
|||||||
"Basic data handling: PathListDir",
|
"Basic data handling: PathListDir",
|
||||||
"Basic data handling: PathNormalize",
|
"Basic data handling: PathNormalize",
|
||||||
"Basic data handling: PathRelative",
|
"Basic data handling: PathRelative",
|
||||||
"Basic data handling: PathSetExtension",
|
|
||||||
"Basic data handling: PathSplit",
|
"Basic data handling: PathSplit",
|
||||||
"Basic data handling: PathSplitExt",
|
"Basic data handling: PathSplitExt",
|
||||||
"Basic data handling: RegexFindallDataList",
|
"Basic data handling: RegexFindallDataList",
|
||||||
@@ -11482,9 +11420,7 @@
|
|||||||
"StarGridImageBatcher",
|
"StarGridImageBatcher",
|
||||||
"StarImageSwitch",
|
"StarImageSwitch",
|
||||||
"StarImageSwitch2",
|
"StarImageSwitch2",
|
||||||
"StarInfiniteYouAdvancedPatchMaker",
|
|
||||||
"StarInfiniteYouApply",
|
"StarInfiniteYouApply",
|
||||||
"StarInfiniteYouFaceSwapMod",
|
|
||||||
"StarInfiniteYouPatch",
|
"StarInfiniteYouPatch",
|
||||||
"StarInfiniteYouPatchCombine",
|
"StarInfiniteYouPatchCombine",
|
||||||
"StarInfiniteYouSaver",
|
"StarInfiniteYouSaver",
|
||||||
@@ -11493,12 +11429,10 @@
|
|||||||
"StarNewsScraper",
|
"StarNewsScraper",
|
||||||
"StarPSDSaver",
|
"StarPSDSaver",
|
||||||
"StarPSDSaver2",
|
"StarPSDSaver2",
|
||||||
"StarPaletteExtractor",
|
|
||||||
"StarSaveSamplerSettings",
|
"StarSaveSamplerSettings",
|
||||||
"StarTextFilter",
|
"StarTextFilter",
|
||||||
"StarTextInput",
|
"StarTextInput",
|
||||||
"StarWildcardsAdvanced",
|
"StarWildcardsAdvanced",
|
||||||
"Star_Image2Latent",
|
|
||||||
"Starnodes_Aspect_Ratio",
|
"Starnodes_Aspect_Ratio",
|
||||||
"Starnodes_Aspect_Ratio_Advanced",
|
"Starnodes_Aspect_Ratio_Advanced",
|
||||||
"Starupscale"
|
"Starupscale"
|
||||||
@@ -13244,13 +13178,10 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/XieJunchen/comfyUI_LLM": [
|
"https://github.com/XieJunchen/comfyUI_LLM": [
|
||||||
[
|
[
|
||||||
"CloudImageUploadNode",
|
|
||||||
"CloudImagesToVideoAndUpload",
|
|
||||||
"CloudVideoUploadNode",
|
|
||||||
"ComfyUI_LLM_Ollama",
|
"ComfyUI_LLM_Ollama",
|
||||||
"DeepSeek_Online",
|
"DeepSeek_Online",
|
||||||
"LoadGifFromLocal",
|
"QiniuImageUploadNode",
|
||||||
"LoadImgFromUrl",
|
"QiniuVideoUploadNode",
|
||||||
"StringArrayFormatter",
|
"StringArrayFormatter",
|
||||||
"StringArrayIndexer"
|
"StringArrayIndexer"
|
||||||
],
|
],
|
||||||
@@ -15268,17 +15199,6 @@
|
|||||||
"title_aux": "Avatar Graph"
|
"title_aux": "Avatar Graph"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/avenstack/ComfyUI-AV-FunASR": [
|
|
||||||
[
|
|
||||||
"AVASRTimestamp",
|
|
||||||
"AVFormat2Subtitle",
|
|
||||||
"AVSaveSubtitles",
|
|
||||||
"AVSpeechTimestamp"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-AV-FunASR"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/avenstack/ComfyUI-AV-LatentSync": [
|
"https://github.com/avenstack/ComfyUI-AV-LatentSync": [
|
||||||
[
|
[
|
||||||
"AVLatentSync",
|
"AVLatentSync",
|
||||||
@@ -16425,15 +16345,6 @@
|
|||||||
"title_aux": "ComfyUI Sequential Image Loader"
|
"title_aux": "ComfyUI Sequential Image Loader"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/budihartono/comfyui-aspect-ratio-presets": [
|
|
||||||
[
|
|
||||||
"CAS Empty Latent Aspect Ratio by Axis",
|
|
||||||
"CAS Empty Latent Aspect Ratio from Preset"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "CAS Aspect Ratio Presets Node for ComfyUI"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/budihartono/comfyui_otonx_nodes": [
|
"https://github.com/budihartono/comfyui_otonx_nodes": [
|
||||||
[
|
[
|
||||||
"OTX Integer Multiple Inputs 4",
|
"OTX Integer Multiple Inputs 4",
|
||||||
@@ -16518,17 +16429,6 @@
|
|||||||
"title_aux": "EBU PromptHelper"
|
"title_aux": "EBU PromptHelper"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/burnsbert/ComfyUI-EBU-Workflow": [
|
|
||||||
[
|
|
||||||
"EbuGetImageAspectRatio",
|
|
||||||
"EbuScalingResolution",
|
|
||||||
"EbuScalingTile",
|
|
||||||
"EbuUniqueFileName"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "EBU Workflow"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/bvhari/ComfyUI_CFGStar": [
|
"https://github.com/bvhari/ComfyUI_CFGStar": [
|
||||||
[
|
[
|
||||||
"CFGStar"
|
"CFGStar"
|
||||||
@@ -19110,7 +19010,7 @@
|
|||||||
"title_aux": "ComfyUI Anime Segmentation Nodes v1.1.0"
|
"title_aux": "ComfyUI Anime Segmentation Nodes v1.1.0"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/crave33/RenesStuffDanbooruTagGet": [
|
"https://github.com/crave33/RenesStuffDanboruTagGet": [
|
||||||
[
|
[
|
||||||
"DanbooruTagFetcher"
|
"DanbooruTagFetcher"
|
||||||
],
|
],
|
||||||
@@ -20264,6 +20164,32 @@
|
|||||||
"title_aux": "ComfyUI_Dragos_Nodes"
|
"title_aux": "ComfyUI_Dragos_Nodes"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/dream-computing/syntax-nodes": [
|
||||||
|
[
|
||||||
|
"CyberpunkMagnifyNode",
|
||||||
|
"CyberpunkWindowNode",
|
||||||
|
"DepthToLidarEffectNode",
|
||||||
|
"EdgeMeasurementOverlayNode",
|
||||||
|
"EdgeTracingNode",
|
||||||
|
"FrequencyBeatSyncNode",
|
||||||
|
"FrequencyBeatSyncNodeAdvanced",
|
||||||
|
"GhostingNode",
|
||||||
|
"ImageBatchToImageList",
|
||||||
|
"ImageListToImageBatch",
|
||||||
|
"JigsawPuzzleNode",
|
||||||
|
"LowPolyNode",
|
||||||
|
"LuminanceParticleNode",
|
||||||
|
"PaperCraftNode",
|
||||||
|
"PointillismNode",
|
||||||
|
"RGBStreakNode",
|
||||||
|
"RegionBoundaryNode",
|
||||||
|
"VariableLineWidthEffectNode",
|
||||||
|
"VoxelNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "SyntaxNodes - Image Processing Effects for ComfyUI"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/dreamhartley/ComfyUI_show_seed": [
|
"https://github.com/dreamhartley/ComfyUI_show_seed": [
|
||||||
[
|
[
|
||||||
"Show Seed"
|
"Show Seed"
|
||||||
@@ -21550,27 +21476,17 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/gelasdev/ComfyUI-FLUX-BFL-API": [
|
"https://github.com/gelasdev/ComfyUI-FLUX-BFL-API": [
|
||||||
[
|
[
|
||||||
"FluxDeleteFinetune_BFL",
|
|
||||||
"FluxDevRedux_BFL",
|
"FluxDevRedux_BFL",
|
||||||
"FluxDev_BFL",
|
"FluxDev_BFL",
|
||||||
"FluxFinetuneDetails_BFL",
|
|
||||||
"FluxFinetuneStatus_BFL",
|
|
||||||
"FluxFinetune_BFL",
|
|
||||||
"FluxKontextMax_BFL",
|
"FluxKontextMax_BFL",
|
||||||
"FluxKontextPro_BFL",
|
"FluxKontextPro_BFL",
|
||||||
"FluxMyFinetunes_BFL",
|
|
||||||
"FluxPro11Redux_BFL",
|
"FluxPro11Redux_BFL",
|
||||||
"FluxPro11UltraFinetune_BFL",
|
|
||||||
"FluxPro11UltraRedux_BFL",
|
"FluxPro11UltraRedux_BFL",
|
||||||
"FluxPro11Ultra_BFL",
|
"FluxPro11Ultra_BFL",
|
||||||
"FluxPro11_BFL",
|
"FluxPro11_BFL",
|
||||||
"FluxProCannyFinetune_BFL",
|
|
||||||
"FluxProCanny_BFL",
|
"FluxProCanny_BFL",
|
||||||
"FluxProDepthFinetune_BFL",
|
|
||||||
"FluxProDepth_BFL",
|
"FluxProDepth_BFL",
|
||||||
"FluxProFillFinetune_BFL",
|
|
||||||
"FluxProFill_BFL",
|
"FluxProFill_BFL",
|
||||||
"FluxProFinetune_BFL",
|
|
||||||
"FluxPro_BFL"
|
"FluxPro_BFL"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -22676,16 +22592,6 @@
|
|||||||
"title_aux": "comfyui_LLM_schools"
|
"title_aux": "comfyui_LLM_schools"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/hexxacubic/ComfyUI-Prompt_Library": [
|
|
||||||
[
|
|
||||||
"Prompt_Library",
|
|
||||||
"Random_Project",
|
|
||||||
"Simple_Prompt_Library"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-Prompt_Library"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/hgabha/WWAA-CustomNodes": [
|
"https://github.com/hgabha/WWAA-CustomNodes": [
|
||||||
[
|
[
|
||||||
"WWAA-BuildString",
|
"WWAA-BuildString",
|
||||||
@@ -23957,18 +23863,6 @@
|
|||||||
"title_aux": "Painting Coder Utils"
|
"title_aux": "Painting Coder Utils"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/jasonjgardner/comfui-substance-designer-integration": [
|
|
||||||
[
|
|
||||||
"SubstanceBatchProcessor",
|
|
||||||
"SubstanceCooker",
|
|
||||||
"SubstanceInfoExtractor",
|
|
||||||
"SubstanceParameterController",
|
|
||||||
"SubstanceRenderer"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI Substance Designer Integration Plugin"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/jax-explorer/ComfyUI-InstantCharacter": [
|
"https://github.com/jax-explorer/ComfyUI-InstantCharacter": [
|
||||||
[
|
[
|
||||||
"InstantCharacterGenerate",
|
"InstantCharacterGenerate",
|
||||||
@@ -24346,7 +24240,6 @@
|
|||||||
"ai4artsed_random_artform_generator",
|
"ai4artsed_random_artform_generator",
|
||||||
"ai4artsed_random_instruction_generator",
|
"ai4artsed_random_instruction_generator",
|
||||||
"ai4artsed_random_language_selector",
|
"ai4artsed_random_language_selector",
|
||||||
"ai4artsed_stabilitai_key",
|
|
||||||
"ai4artsed_t5_clip_fusion",
|
"ai4artsed_t5_clip_fusion",
|
||||||
"ai4artsed_text_remix"
|
"ai4artsed_text_remix"
|
||||||
],
|
],
|
||||||
@@ -24469,17 +24362,6 @@
|
|||||||
"title_aux": "ComfyUI-Extract_Flux_Lora"
|
"title_aux": "ComfyUI-Extract_Flux_Lora"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/judian17/ComfyUI-UniWorld-jd17": [
|
|
||||||
[
|
|
||||||
"UniWorldEncoderNode",
|
|
||||||
"UniWorldScheduler",
|
|
||||||
"UniWorldSiglipEncoder",
|
|
||||||
"UniWorld_T5_CLIP_Encoder"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-UniWorld-jd17"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/judian17/ComfyUI-joycaption-beta-one-GGUF": [
|
"https://github.com/judian17/ComfyUI-joycaption-beta-one-GGUF": [
|
||||||
[
|
[
|
||||||
"JJC_JoyCaption_Custom_GGUF",
|
"JJC_JoyCaption_Custom_GGUF",
|
||||||
@@ -24592,7 +24474,6 @@
|
|||||||
"Bjornulf_ImageMaskCutter",
|
"Bjornulf_ImageMaskCutter",
|
||||||
"Bjornulf_ImageNote",
|
"Bjornulf_ImageNote",
|
||||||
"Bjornulf_ImageNoteLoadImage",
|
"Bjornulf_ImageNoteLoadImage",
|
||||||
"Bjornulf_ImageUpscaleWithModelTransparency",
|
|
||||||
"Bjornulf_ImagesListToVideo",
|
"Bjornulf_ImagesListToVideo",
|
||||||
"Bjornulf_JSONImagePromptExtractor",
|
"Bjornulf_JSONImagePromptExtractor",
|
||||||
"Bjornulf_KokoroTTS",
|
"Bjornulf_KokoroTTS",
|
||||||
@@ -24724,7 +24605,6 @@
|
|||||||
"Bjornulf_WriteTextPickMeGlobal",
|
"Bjornulf_WriteTextPickMeGlobal",
|
||||||
"Bjornulf_XTTSConfig",
|
"Bjornulf_XTTSConfig",
|
||||||
"Bjornulf_imagesToVideo",
|
"Bjornulf_imagesToVideo",
|
||||||
"Bjornulf_loadImageBase64Transparency",
|
|
||||||
"Bjornulf_ollamaLoader"
|
"Bjornulf_ollamaLoader"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -24925,6 +24805,14 @@
|
|||||||
"title_aux": "ComfyUI-text-file-util"
|
"title_aux": "ComfyUI-text-file-util"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"https://github.com/kambara/ComfyUI-PromptCheckList": [
|
||||||
|
[
|
||||||
|
"PromptPalette"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI-PromptCheckList"
|
||||||
|
}
|
||||||
|
],
|
||||||
"https://github.com/kambara/ComfyUI-PromptPalette": [
|
"https://github.com/kambara/ComfyUI-PromptPalette": [
|
||||||
[
|
[
|
||||||
"PromptPalette"
|
"PromptPalette"
|
||||||
@@ -26109,7 +25997,6 @@
|
|||||||
"https://github.com/laksjdjf/ComfyUI-Imatrix": [
|
"https://github.com/laksjdjf/ComfyUI-Imatrix": [
|
||||||
[
|
[
|
||||||
"ImatrixUNETLoader",
|
"ImatrixUNETLoader",
|
||||||
"LoRAdiff",
|
|
||||||
"SaveImatrix"
|
"SaveImatrix"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
@@ -27682,7 +27569,6 @@
|
|||||||
"ScheduledCFGGuider //Inspire",
|
"ScheduledCFGGuider //Inspire",
|
||||||
"ScheduledPerpNegCFGGuider //Inspire",
|
"ScheduledPerpNegCFGGuider //Inspire",
|
||||||
"SeedExplorer //Inspire",
|
"SeedExplorer //Inspire",
|
||||||
"SeedLogger //Inspire",
|
|
||||||
"SelectNthMask //Inspire",
|
"SelectNthMask //Inspire",
|
||||||
"ShowCachedInfo //Inspire",
|
"ShowCachedInfo //Inspire",
|
||||||
"StableCascade_CheckpointLoader //Inspire",
|
"StableCascade_CheckpointLoader //Inspire",
|
||||||
@@ -28355,7 +28241,16 @@
|
|||||||
"TextExtractorNode"
|
"TextExtractorNode"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "comfyui-MGnodes"
|
"title_aux": "ComfyUI Image Watermarking Node"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"https://github.com/meanin2/comfyui-watermarking": [
|
||||||
|
[
|
||||||
|
"ImageWatermarkNode",
|
||||||
|
"TextExtractorNode"
|
||||||
|
],
|
||||||
|
{
|
||||||
|
"title_aux": "ComfyUI Watermark Image Node"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/meap158/ComfyUI-Background-Replacement": [
|
"https://github.com/meap158/ComfyUI-Background-Replacement": [
|
||||||
@@ -28834,8 +28729,14 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/mit-han-lab/ComfyUI-nunchaku": [
|
"https://github.com/mit-han-lab/ComfyUI-nunchaku": [
|
||||||
[
|
[
|
||||||
|
"NunchakuDepthPreprocessor",
|
||||||
"NunchakuFluxDiTLoader",
|
"NunchakuFluxDiTLoader",
|
||||||
"NunchakuFluxLoraLoader"
|
"NunchakuFluxLoraLoader",
|
||||||
|
"NunchakuModelMerger",
|
||||||
|
"NunchakuPulidApply",
|
||||||
|
"NunchakuPulidLoader",
|
||||||
|
"NunchakuTextEncoderLoader",
|
||||||
|
"NunchakuTextEncoderLoaderV2"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-nunchaku"
|
"title_aux": "ComfyUI-nunchaku"
|
||||||
@@ -30394,14 +30295,6 @@
|
|||||||
"title_aux": "paint-by-example @ ComfyUI"
|
"title_aux": "paint-by-example @ ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/pictorialink/ComfyUI-Custom-Node-Config": [
|
|
||||||
[
|
|
||||||
"FormSubmitNode"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-Custom-Node-Config"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/pictorialink/ComfyUI-Text-Translation": [
|
"https://github.com/pictorialink/ComfyUI-Text-Translation": [
|
||||||
[
|
[
|
||||||
"Get_Translator",
|
"Get_Translator",
|
||||||
@@ -31350,8 +31243,7 @@
|
|||||||
"PrimitiveText",
|
"PrimitiveText",
|
||||||
"UtilityExpression",
|
"UtilityExpression",
|
||||||
"UtilityImageDimensions",
|
"UtilityImageDimensions",
|
||||||
"UtilitySwitch",
|
"UtilitySwitch"
|
||||||
"rookiepsi_ConstructMask"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI Extended"
|
"title_aux": "ComfyUI Extended"
|
||||||
@@ -31811,10 +31703,7 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/s9roll7/comfyui_cotracker_node": [
|
"https://github.com/s9roll7/comfyui_cotracker_node": [
|
||||||
[
|
[
|
||||||
"CoTrackerNode",
|
"CoTrackerNode"
|
||||||
"GridPointGeneratorNode",
|
|
||||||
"PerlinCoordinateRandomizerNode",
|
|
||||||
"XYMotionAmplifierNode"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "Comfyui CoTracker Node"
|
"title_aux": "Comfyui CoTracker Node"
|
||||||
@@ -33335,34 +33224,12 @@
|
|||||||
],
|
],
|
||||||
"https://github.com/spawner1145/CUI-Lumina2-TeaCache": [
|
"https://github.com/spawner1145/CUI-Lumina2-TeaCache": [
|
||||||
[
|
[
|
||||||
"LPIPS_Model_Loader",
|
"TeaCache_Lumina2"
|
||||||
"Store_Baseline_Image",
|
|
||||||
"TeaCache_LPIPS_Evaluator",
|
|
||||||
"TeaCache_Lumina2",
|
|
||||||
"TeaCache_Patcher",
|
|
||||||
"TeaCache_Result_Collector"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "CUI-Lumina2-TeaCache"
|
"title_aux": "CUI-Lumina2-TeaCache"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/spawner1145/comfyui-aichat": [
|
|
||||||
[
|
|
||||||
"GeminiApiLoader_Zho",
|
|
||||||
"GeminiChat_Zho",
|
|
||||||
"GeminiFileUploader_Zho",
|
|
||||||
"GeminiImageEncoder_Zho",
|
|
||||||
"GeminiTextBlock_Zho",
|
|
||||||
"OpenAIApiLoader_Zho",
|
|
||||||
"OpenAIChat_Zho",
|
|
||||||
"OpenAIFileUploader_Zho",
|
|
||||||
"OpenAIImageEncoder_Zho",
|
|
||||||
"OpenAITextBlock_Zho"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "comfyui-aichat"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/spinagon/ComfyUI-seam-carving": [
|
"https://github.com/spinagon/ComfyUI-seam-carving": [
|
||||||
[
|
[
|
||||||
"SeamCarving"
|
"SeamCarving"
|
||||||
@@ -34014,7 +33881,7 @@
|
|||||||
"OllamaKiller"
|
"OllamaKiller"
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-ollama_killer"
|
"title_aux": "OllamaKiller Node for ComfyUI"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/thezveroboy/ComfyUI-CSM-Nodes": [
|
"https://github.com/thezveroboy/ComfyUI-CSM-Nodes": [
|
||||||
@@ -34793,10 +34660,7 @@
|
|||||||
[
|
[
|
||||||
"CreatePromptsWithTextFromFile",
|
"CreatePromptsWithTextFromFile",
|
||||||
"EmptyLatentSizePicker",
|
"EmptyLatentSizePicker",
|
||||||
"LoadDataFromFiles",
|
"SimpleSizePicker"
|
||||||
"SimpleSizePicker",
|
|
||||||
"WildcardReplace",
|
|
||||||
"WildcardReplaceFromFile"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI_BishaNodes"
|
"title_aux": "ComfyUI_BishaNodes"
|
||||||
@@ -35031,20 +34895,6 @@
|
|||||||
"title_aux": "ComfyUI-RemoveBackgroundSuite"
|
"title_aux": "ComfyUI-RemoveBackgroundSuite"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"https://github.com/whmc76/ComfyUI-UniversalToolkit": [
|
|
||||||
[
|
|
||||||
"EmptyUnitGenerator_UTK",
|
|
||||||
"ImageRatioDetector_UTK",
|
|
||||||
"PreviewMask_UTK",
|
|
||||||
"ShowFloat_UTK",
|
|
||||||
"ShowInt_UTK",
|
|
||||||
"ShowList_UTK",
|
|
||||||
"ShowText_UTK"
|
|
||||||
],
|
|
||||||
{
|
|
||||||
"title_aux": "ComfyUI-UniversalToolkit"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"https://github.com/wildminder/ComfyUI-Chatterbox": [
|
"https://github.com/wildminder/ComfyUI-Chatterbox": [
|
||||||
[
|
[
|
||||||
"ChatterboxTTS",
|
"ChatterboxTTS",
|
||||||
@@ -35497,8 +35347,8 @@
|
|||||||
"LTLatentOp",
|
"LTLatentOp",
|
||||||
"LTLatentToShape",
|
"LTLatentToShape",
|
||||||
"LTLatentsConcatenate",
|
"LTLatentsConcatenate",
|
||||||
"LTNumberRangeGaussian",
|
"LTParamRandomizerGaussian",
|
||||||
"LTNumberRangeUniform",
|
"LTParamRandomizerRange",
|
||||||
"LTPreviewLatent",
|
"LTPreviewLatent",
|
||||||
"LTReshapeLatent",
|
"LTReshapeLatent",
|
||||||
"LTUniformLatent"
|
"LTUniformLatent"
|
||||||
@@ -35841,21 +35691,18 @@
|
|||||||
"MaskSmartValleySplit",
|
"MaskSmartValleySplit",
|
||||||
"MaskSplitFilter",
|
"MaskSplitFilter",
|
||||||
"MaskTopNFilter",
|
"MaskTopNFilter",
|
||||||
"TextKeyword",
|
"TextBeforeKeyword",
|
||||||
"YC Extract Number",
|
"YC Extract Number",
|
||||||
"YC Mask Condition Switch",
|
"YC Mask Condition Switch",
|
||||||
"YC Seed List",
|
|
||||||
"YC Super Selector",
|
"YC Super Selector",
|
||||||
"YC Text Condition Switch",
|
"YC Text Condition Switch",
|
||||||
"YC Text Index Switch",
|
"YC Text Index Switch",
|
||||||
"YC Universal Gate",
|
"YC Universal Gate",
|
||||||
"YCMaskComposite",
|
"YCMaskComposite",
|
||||||
|
"YCPromptReplace",
|
||||||
"YCRemapMaskRange",
|
"YCRemapMaskRange",
|
||||||
"YCTextImageGenerator",
|
"YCTextImageGenerator",
|
||||||
"YC_FiveTextCombineNode",
|
"YC_Image_Save"
|
||||||
"YC_Image_Save",
|
|
||||||
"YC_SingleTextNode",
|
|
||||||
"YC_textReplaceNode"
|
|
||||||
],
|
],
|
||||||
{
|
{
|
||||||
"title_aux": "ComfyUI-YCNodes"
|
"title_aux": "ComfyUI-YCNodes"
|
||||||
@@ -36536,6 +36383,7 @@
|
|||||||
"DCI_BinaryFileLoader",
|
"DCI_BinaryFileLoader",
|
||||||
"DCI_BinaryFileSaver",
|
"DCI_BinaryFileSaver",
|
||||||
"DCI_BinaryFileUploader",
|
"DCI_BinaryFileUploader",
|
||||||
|
"DCI_FileLoader",
|
||||||
"DCI_FileNode",
|
"DCI_FileNode",
|
||||||
"DCI_Image",
|
"DCI_Image",
|
||||||
"DCI_ImageExporter",
|
"DCI_ImageExporter",
|
||||||
|
|||||||
422
openapi.yaml
422
openapi.yaml
@@ -11,9 +11,6 @@ info:
|
|||||||
servers:
|
servers:
|
||||||
- url: '/'
|
- url: '/'
|
||||||
description: Default ComfyUI server
|
description: Default ComfyUI server
|
||||||
|
|
||||||
# Default security - can be overridden per operation
|
|
||||||
security: []
|
|
||||||
|
|
||||||
# Common API components
|
# Common API components
|
||||||
components:
|
components:
|
||||||
@@ -32,18 +29,8 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Type of task being performed
|
description: Type of task being performed
|
||||||
enum: [install, uninstall, update, update-all, update-comfyui, fix, disable, enable, install-model]
|
enum: [install, uninstall, update, update-all, update-comfyui, fix, disable, enable, install-model]
|
||||||
params:
|
required: [ui_id, client_id, kind]
|
||||||
oneOf:
|
|
||||||
- $ref: '#/components/schemas/InstallPackParams'
|
|
||||||
- $ref: '#/components/schemas/UpdatePackParams'
|
|
||||||
- $ref: '#/components/schemas/UpdateAllPacksParams'
|
|
||||||
- $ref: '#/components/schemas/UpdateComfyUIParams'
|
|
||||||
- $ref: '#/components/schemas/FixPackParams'
|
|
||||||
- $ref: '#/components/schemas/UninstallPackParams'
|
|
||||||
- $ref: '#/components/schemas/DisablePackParams'
|
|
||||||
- $ref: '#/components/schemas/EnablePackParams'
|
|
||||||
- $ref: '#/components/schemas/ModelMetadata'
|
|
||||||
required: [ui_id, client_id, kind, params]
|
|
||||||
TaskHistoryItem:
|
TaskHistoryItem:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -66,6 +53,7 @@ components:
|
|||||||
status:
|
status:
|
||||||
$ref: '#/components/schemas/TaskExecutionStatus'
|
$ref: '#/components/schemas/TaskExecutionStatus'
|
||||||
required: [ui_id, client_id, kind, timestamp, result]
|
required: [ui_id, client_id, kind, timestamp, result]
|
||||||
|
|
||||||
TaskExecutionStatus:
|
TaskExecutionStatus:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -82,6 +70,7 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Additional status messages
|
description: Additional status messages
|
||||||
required: [status_str, completed, messages]
|
required: [status_str, completed, messages]
|
||||||
|
|
||||||
TaskStateMessage:
|
TaskStateMessage:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -100,17 +89,14 @@ components:
|
|||||||
items:
|
items:
|
||||||
$ref: '#/components/schemas/QueueTaskItem'
|
$ref: '#/components/schemas/QueueTaskItem'
|
||||||
description: Tasks waiting to be executed
|
description: Tasks waiting to be executed
|
||||||
installed_packs:
|
required: [history, running_queue, pending_queue]
|
||||||
type: object
|
|
||||||
additionalProperties:
|
|
||||||
$ref: '#/components/schemas/ManagerPackInstalled'
|
|
||||||
description: Map of currently installed node packages by name
|
|
||||||
required: [history, running_queue, pending_queue, installed_packs]
|
|
||||||
# WebSocket Message Models
|
# WebSocket Message Models
|
||||||
ManagerMessageName:
|
ManagerMessageName:
|
||||||
type: string
|
type: string
|
||||||
enum: [cm-task-completed, cm-task-started, cm-queue-status]
|
enum: [cm-task-completed, cm-task-started, cm-queue-status]
|
||||||
description: WebSocket message type constants for manager events
|
description: WebSocket message type constants for manager events
|
||||||
|
|
||||||
MessageTaskDone:
|
MessageTaskDone:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -132,6 +118,7 @@ components:
|
|||||||
state:
|
state:
|
||||||
$ref: '#/components/schemas/TaskStateMessage'
|
$ref: '#/components/schemas/TaskStateMessage'
|
||||||
required: [ui_id, result, kind, timestamp, state]
|
required: [ui_id, result, kind, timestamp, state]
|
||||||
|
|
||||||
MessageTaskStarted:
|
MessageTaskStarted:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -148,6 +135,7 @@ components:
|
|||||||
state:
|
state:
|
||||||
$ref: '#/components/schemas/TaskStateMessage'
|
$ref: '#/components/schemas/TaskStateMessage'
|
||||||
required: [ui_id, kind, timestamp, state]
|
required: [ui_id, kind, timestamp, state]
|
||||||
|
|
||||||
MessageTaskFailed:
|
MessageTaskFailed:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -167,12 +155,14 @@ components:
|
|||||||
state:
|
state:
|
||||||
$ref: '#/components/schemas/TaskStateMessage'
|
$ref: '#/components/schemas/TaskStateMessage'
|
||||||
required: [ui_id, error, kind, timestamp, state]
|
required: [ui_id, error, kind, timestamp, state]
|
||||||
|
|
||||||
MessageUpdate:
|
MessageUpdate:
|
||||||
oneOf:
|
oneOf:
|
||||||
- $ref: '#/components/schemas/MessageTaskDone'
|
- $ref: '#/components/schemas/MessageTaskDone'
|
||||||
- $ref: '#/components/schemas/MessageTaskStarted'
|
- $ref: '#/components/schemas/MessageTaskStarted'
|
||||||
- $ref: '#/components/schemas/MessageTaskFailed'
|
- $ref: '#/components/schemas/MessageTaskFailed'
|
||||||
description: Union type for all possible WebSocket message updates
|
description: Union type for all possible WebSocket message updates
|
||||||
|
|
||||||
# Manager Package Models
|
# Manager Package Models
|
||||||
ManagerPackInfo:
|
ManagerPackInfo:
|
||||||
type: object
|
type: object
|
||||||
@@ -187,6 +177,7 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Task ID - generated internally
|
description: Task ID - generated internally
|
||||||
required: [id, version]
|
required: [id, version]
|
||||||
|
|
||||||
ManagerPackInstalled:
|
ManagerPackInstalled:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -194,35 +185,43 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: The version of the pack that is installed (Git commit hash or semantic version)
|
description: The version of the pack that is installed (Git commit hash or semantic version)
|
||||||
cnr_id:
|
cnr_id:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: The name of the pack if installed from the registry
|
description: The name of the pack if installed from the registry
|
||||||
aux_id:
|
aux_id:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: The name of the pack if installed from github (author/repo-name format)
|
description: The name of the pack if installed from github (author/repo-name format)
|
||||||
enabled:
|
enabled:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Whether the pack is enabled
|
description: Whether the pack is enabled
|
||||||
required: [ver, enabled]
|
required: [ver, enabled]
|
||||||
|
|
||||||
SelectedVersion:
|
SelectedVersion:
|
||||||
type: string
|
type: string
|
||||||
enum: [latest, nightly]
|
enum: [latest, nightly]
|
||||||
description: Version selection for pack installation
|
description: Version selection for pack installation
|
||||||
|
|
||||||
ManagerChannel:
|
ManagerChannel:
|
||||||
type: string
|
type: string
|
||||||
enum: [default, recent, legacy, forked, dev, tutorial]
|
enum: [default, recent, legacy, forked, dev, tutorial]
|
||||||
description: Channel for pack sources
|
description: Channel for pack sources
|
||||||
|
|
||||||
ManagerDatabaseSource:
|
ManagerDatabaseSource:
|
||||||
type: string
|
type: string
|
||||||
enum: [remote, local, cache]
|
enum: [remote, local, cache]
|
||||||
description: Source for pack information
|
description: Source for pack information
|
||||||
|
|
||||||
ManagerPackState:
|
ManagerPackState:
|
||||||
type: string
|
type: string
|
||||||
enum: [installed, disabled, not_installed, import_failed, needs_update]
|
enum: [installed, disabled, not_installed, import_failed, needs_update]
|
||||||
description: Current state of a pack
|
description: Current state of a pack
|
||||||
|
|
||||||
ManagerPackInstallType:
|
ManagerPackInstallType:
|
||||||
type: string
|
type: string
|
||||||
enum: [git-clone, copy, cnr]
|
enum: [git-clone, copy, cnr]
|
||||||
description: Type of installation used for the pack
|
description: Type of installation used for the pack
|
||||||
|
|
||||||
ManagerPack:
|
ManagerPack:
|
||||||
allOf:
|
allOf:
|
||||||
- $ref: '#/components/schemas/ManagerPackInfo'
|
- $ref: '#/components/schemas/ManagerPackInfo'
|
||||||
@@ -250,8 +249,9 @@ components:
|
|||||||
state:
|
state:
|
||||||
$ref: '#/components/schemas/ManagerPackState'
|
$ref: '#/components/schemas/ManagerPackState'
|
||||||
update-state:
|
update-state:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
enum: ['false', 'true']
|
enum: ['false', 'true']
|
||||||
|
nullable: true
|
||||||
description: Update availability status
|
description: Update availability status
|
||||||
stars:
|
stars:
|
||||||
type: integer
|
type: integer
|
||||||
@@ -271,6 +271,7 @@ components:
|
|||||||
description: Whether the pack is trusted
|
description: Whether the pack is trusted
|
||||||
install_type:
|
install_type:
|
||||||
$ref: '#/components/schemas/ManagerPackInstallType'
|
$ref: '#/components/schemas/ManagerPackInstallType'
|
||||||
|
|
||||||
# Installation Parameters
|
# Installation Parameters
|
||||||
InstallPackParams:
|
InstallPackParams:
|
||||||
allOf:
|
allOf:
|
||||||
@@ -298,6 +299,7 @@ components:
|
|||||||
type: boolean
|
type: boolean
|
||||||
description: Whether to skip post-installation steps
|
description: Whether to skip post-installation steps
|
||||||
required: [selected_version, mode, channel]
|
required: [selected_version, mode, channel]
|
||||||
|
|
||||||
UpdateAllPacksParams:
|
UpdateAllPacksParams:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -306,66 +308,7 @@ components:
|
|||||||
ui_id:
|
ui_id:
|
||||||
type: string
|
type: string
|
||||||
description: Task ID - generated internally
|
description: Task ID - generated internally
|
||||||
UpdatePackParams:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
node_name:
|
|
||||||
type: string
|
|
||||||
description: Name of the node package to update
|
|
||||||
node_ver:
|
|
||||||
type: [string, 'null']
|
|
||||||
description: Current version of the node package
|
|
||||||
required: [node_name]
|
|
||||||
UpdateComfyUIParams:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
is_stable:
|
|
||||||
type: boolean
|
|
||||||
description: Whether to update to stable version (true) or nightly (false)
|
|
||||||
default: true
|
|
||||||
target_version:
|
|
||||||
type: [string, 'null']
|
|
||||||
description: Specific version to switch to (for version switching operations)
|
|
||||||
required: []
|
|
||||||
FixPackParams:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
node_name:
|
|
||||||
type: string
|
|
||||||
description: Name of the node package to fix
|
|
||||||
node_ver:
|
|
||||||
type: string
|
|
||||||
description: Version of the node package
|
|
||||||
required: [node_name, node_ver]
|
|
||||||
UninstallPackParams:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
node_name:
|
|
||||||
type: string
|
|
||||||
description: Name of the node package to uninstall
|
|
||||||
is_unknown:
|
|
||||||
type: boolean
|
|
||||||
description: Whether this is an unknown/unregistered package
|
|
||||||
default: false
|
|
||||||
required: [node_name]
|
|
||||||
DisablePackParams:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
node_name:
|
|
||||||
type: string
|
|
||||||
description: Name of the node package to disable
|
|
||||||
is_unknown:
|
|
||||||
type: boolean
|
|
||||||
description: Whether this is an unknown/unregistered package
|
|
||||||
default: false
|
|
||||||
required: [node_name]
|
|
||||||
EnablePackParams:
|
|
||||||
type: object
|
|
||||||
properties:
|
|
||||||
cnr_id:
|
|
||||||
type: string
|
|
||||||
description: ComfyUI Node Registry ID of the package to enable
|
|
||||||
required: [cnr_id]
|
|
||||||
# Queue Status Models
|
# Queue Status Models
|
||||||
QueueStatus:
|
QueueStatus:
|
||||||
type: object
|
type: object
|
||||||
@@ -389,23 +332,23 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Client ID (when filtered by client)
|
description: Client ID (when filtered by client)
|
||||||
required: [total_count, done_count, in_progress_count, is_processing]
|
required: [total_count, done_count, in_progress_count, is_processing]
|
||||||
|
|
||||||
# Mappings Model
|
# Mappings Model
|
||||||
ManagerMappings:
|
ManagerMappings:
|
||||||
type: object
|
type: object
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
type: array
|
type: array
|
||||||
description: Tuple of [node_names, metadata]
|
|
||||||
items:
|
items:
|
||||||
oneOf:
|
- type: array
|
||||||
- type: array
|
items:
|
||||||
items:
|
type: string
|
||||||
|
description: List of ComfyNode names included in the pack
|
||||||
|
- type: object
|
||||||
|
properties:
|
||||||
|
title_aux:
|
||||||
type: string
|
type: string
|
||||||
description: List of ComfyNode names included in the pack
|
description: The display name of the pack
|
||||||
- type: object
|
|
||||||
properties:
|
|
||||||
title_aux:
|
|
||||||
type: string
|
|
||||||
description: The display name of the pack
|
|
||||||
# Model Management
|
# Model Management
|
||||||
ModelMetadata:
|
ModelMetadata:
|
||||||
type: object
|
type: object
|
||||||
@@ -432,6 +375,7 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: ID for UI reference
|
description: ID for UI reference
|
||||||
required: [name, type, url, filename]
|
required: [name, type, url, filename]
|
||||||
|
|
||||||
# Legacy Node Package Model (for backward compatibility)
|
# Legacy Node Package Model (for backward compatibility)
|
||||||
NodePackageMetadata:
|
NodePackageMetadata:
|
||||||
type: object
|
type: object
|
||||||
@@ -469,10 +413,12 @@ components:
|
|||||||
mode:
|
mode:
|
||||||
type: string
|
type: string
|
||||||
description: Source mode
|
description: Source mode
|
||||||
|
|
||||||
# Snapshot Models
|
# Snapshot Models
|
||||||
SnapshotItem:
|
SnapshotItem:
|
||||||
type: string
|
type: string
|
||||||
description: Name of the snapshot
|
description: Name of the snapshot
|
||||||
|
|
||||||
# Error Models
|
# Error Models
|
||||||
Error:
|
Error:
|
||||||
type: object
|
type: object
|
||||||
@@ -481,12 +427,14 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Error message
|
description: Error message
|
||||||
required: [error]
|
required: [error]
|
||||||
|
|
||||||
# Response Models
|
# Response Models
|
||||||
InstalledPacksResponse:
|
InstalledPacksResponse:
|
||||||
type: object
|
type: object
|
||||||
additionalProperties:
|
additionalProperties:
|
||||||
$ref: '#/components/schemas/ManagerPackInstalled'
|
$ref: '#/components/schemas/ManagerPackInstalled'
|
||||||
description: Map of pack names to their installation info
|
description: Map of pack names to their installation info
|
||||||
|
|
||||||
HistoryResponse:
|
HistoryResponse:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -495,6 +443,7 @@ components:
|
|||||||
additionalProperties:
|
additionalProperties:
|
||||||
$ref: '#/components/schemas/TaskHistoryItem'
|
$ref: '#/components/schemas/TaskHistoryItem'
|
||||||
description: Map of task IDs to their history items
|
description: Map of task IDs to their history items
|
||||||
|
|
||||||
HistoryListResponse:
|
HistoryListResponse:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -503,6 +452,7 @@ components:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
description: List of available batch history IDs
|
description: List of available batch history IDs
|
||||||
|
|
||||||
# State Management Models
|
# State Management Models
|
||||||
InstalledNodeInfo:
|
InstalledNodeInfo:
|
||||||
type: object
|
type: object
|
||||||
@@ -514,7 +464,8 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Installed version
|
description: Installed version
|
||||||
repository_url:
|
repository_url:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Git repository URL
|
description: Git repository URL
|
||||||
install_method:
|
install_method:
|
||||||
type: string
|
type: string
|
||||||
@@ -524,10 +475,12 @@ components:
|
|||||||
description: Whether the node is currently enabled
|
description: Whether the node is currently enabled
|
||||||
default: true
|
default: true
|
||||||
install_date:
|
install_date:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
|
nullable: true
|
||||||
description: ISO timestamp of installation
|
description: ISO timestamp of installation
|
||||||
required: [name, version, install_method]
|
required: [name, version, install_method]
|
||||||
|
|
||||||
InstalledModelInfo:
|
InstalledModelInfo:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -541,17 +494,21 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Model type (checkpoint, lora, vae, etc.)
|
description: Model type (checkpoint, lora, vae, etc.)
|
||||||
size_bytes:
|
size_bytes:
|
||||||
type: [integer, 'null']
|
type: integer
|
||||||
|
nullable: true
|
||||||
description: File size in bytes
|
description: File size in bytes
|
||||||
minimum: 0
|
minimum: 0
|
||||||
hash:
|
hash:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Model file hash for verification
|
description: Model file hash for verification
|
||||||
install_date:
|
install_date:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
|
nullable: true
|
||||||
description: ISO timestamp when added
|
description: ISO timestamp when added
|
||||||
required: [name, path, type]
|
required: [name, path, type]
|
||||||
|
|
||||||
ComfyUIVersionInfo:
|
ComfyUIVersionInfo:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -559,20 +516,24 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: ComfyUI version string
|
description: ComfyUI version string
|
||||||
commit_hash:
|
commit_hash:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Git commit hash
|
description: Git commit hash
|
||||||
branch:
|
branch:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Git branch name
|
description: Git branch name
|
||||||
is_stable:
|
is_stable:
|
||||||
type: boolean
|
type: boolean
|
||||||
description: Whether this is a stable release
|
description: Whether this is a stable release
|
||||||
default: false
|
default: false
|
||||||
last_updated:
|
last_updated:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
|
nullable: true
|
||||||
description: ISO timestamp of last update
|
description: ISO timestamp of last update
|
||||||
required: [version]
|
required: [version]
|
||||||
|
|
||||||
BatchOperation:
|
BatchOperation:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -587,27 +548,32 @@ components:
|
|||||||
type: string
|
type: string
|
||||||
description: Target of the operation (node name, model name, etc.)
|
description: Target of the operation (node name, model name, etc.)
|
||||||
target_version:
|
target_version:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Target version for the operation
|
description: Target version for the operation
|
||||||
result:
|
result:
|
||||||
type: string
|
type: string
|
||||||
description: Operation result
|
description: Operation result
|
||||||
enum: [success, failed, skipped]
|
enum: [success, failed, skipped]
|
||||||
error_message:
|
error_message:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Error message if operation failed
|
description: Error message if operation failed
|
||||||
start_time:
|
start_time:
|
||||||
type: string
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
description: ISO timestamp when operation started
|
description: ISO timestamp when operation started
|
||||||
end_time:
|
end_time:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
|
nullable: true
|
||||||
description: ISO timestamp when operation completed
|
description: ISO timestamp when operation completed
|
||||||
client_id:
|
client_id:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: Client that initiated the operation
|
description: Client that initiated the operation
|
||||||
required: [operation_id, operation_type, target, result, start_time]
|
required: [operation_id, operation_type, target, result, start_time]
|
||||||
|
|
||||||
ComfyUISystemState:
|
ComfyUISystemState:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -618,7 +584,8 @@ components:
|
|||||||
comfyui_version:
|
comfyui_version:
|
||||||
$ref: '#/components/schemas/ComfyUIVersionInfo'
|
$ref: '#/components/schemas/ComfyUIVersionInfo'
|
||||||
frontend_version:
|
frontend_version:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
|
nullable: true
|
||||||
description: ComfyUI frontend version if available
|
description: ComfyUI frontend version if available
|
||||||
python_version:
|
python_version:
|
||||||
type: string
|
type: string
|
||||||
@@ -641,6 +608,7 @@ components:
|
|||||||
additionalProperties: true
|
additionalProperties: true
|
||||||
description: ComfyUI Manager configuration settings
|
description: ComfyUI Manager configuration settings
|
||||||
required: [snapshot_time, comfyui_version, python_version, platform_info]
|
required: [snapshot_time, comfyui_version, python_version, platform_info]
|
||||||
|
|
||||||
BatchExecutionRecord:
|
BatchExecutionRecord:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
@@ -652,15 +620,15 @@ components:
|
|||||||
format: date-time
|
format: date-time
|
||||||
description: ISO timestamp when batch started
|
description: ISO timestamp when batch started
|
||||||
end_time:
|
end_time:
|
||||||
type: [string, 'null']
|
type: string
|
||||||
format: date-time
|
format: date-time
|
||||||
|
nullable: true
|
||||||
description: ISO timestamp when batch completed
|
description: ISO timestamp when batch completed
|
||||||
state_before:
|
state_before:
|
||||||
$ref: '#/components/schemas/ComfyUISystemState'
|
$ref: '#/components/schemas/ComfyUISystemState'
|
||||||
state_after:
|
state_after:
|
||||||
type: ['null']
|
$ref: '#/components/schemas/ComfyUISystemState'
|
||||||
allOf:
|
nullable: true
|
||||||
- $ref: '#/components/schemas/ComfyUISystemState'
|
|
||||||
description: System state after batch execution
|
description: System state after batch execution
|
||||||
operations:
|
operations:
|
||||||
type: array
|
type: array
|
||||||
@@ -688,12 +656,14 @@ components:
|
|||||||
minimum: 0
|
minimum: 0
|
||||||
default: 0
|
default: 0
|
||||||
required: [batch_id, start_time, state_before]
|
required: [batch_id, start_time, state_before]
|
||||||
|
|
||||||
securitySchemes:
|
securitySchemes:
|
||||||
securityLevel:
|
securityLevel:
|
||||||
type: apiKey
|
type: apiKey
|
||||||
in: header
|
in: header
|
||||||
name: Security-Level
|
name: Security-Level
|
||||||
description: Security level for sensitive operations
|
description: Security level for sensitive operations
|
||||||
|
|
||||||
parameters:
|
parameters:
|
||||||
modeParam:
|
modeParam:
|
||||||
name: mode
|
name: mode
|
||||||
@@ -717,32 +687,21 @@ components:
|
|||||||
required: true
|
required: true
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
clientIdParam:
|
clientIdParam:
|
||||||
name: client_id
|
name: client_id
|
||||||
in: query
|
in: query
|
||||||
description: Client ID for filtering tasks
|
description: Client ID for filtering tasks
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
uiIdParam:
|
uiIdParam:
|
||||||
name: ui_id
|
name: ui_id
|
||||||
in: query
|
in: query
|
||||||
description: Specific task ID to retrieve
|
description: Specific task ID to retrieve
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
clientIdRequiredParam:
|
|
||||||
name: client_id
|
|
||||||
in: query
|
|
||||||
required: true
|
|
||||||
description: Required client ID that initiated the request
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
uiIdRequiredParam:
|
|
||||||
name: ui_id
|
|
||||||
in: query
|
|
||||||
required: true
|
|
||||||
description: Required unique task identifier
|
|
||||||
schema:
|
|
||||||
type: string
|
|
||||||
maxItemsParam:
|
maxItemsParam:
|
||||||
name: max_items
|
name: max_items
|
||||||
in: query
|
in: query
|
||||||
@@ -750,6 +709,7 @@ components:
|
|||||||
schema:
|
schema:
|
||||||
type: integer
|
type: integer
|
||||||
minimum: 1
|
minimum: 1
|
||||||
|
|
||||||
offsetParam:
|
offsetParam:
|
||||||
name: offset
|
name: offset
|
||||||
in: query
|
in: query
|
||||||
@@ -757,6 +717,7 @@ components:
|
|||||||
schema:
|
schema:
|
||||||
type: integer
|
type: integer
|
||||||
minimum: 0
|
minimum: 0
|
||||||
|
|
||||||
# API Paths
|
# API Paths
|
||||||
paths:
|
paths:
|
||||||
# Task Queue Management (v2 endpoints)
|
# Task Queue Management (v2 endpoints)
|
||||||
@@ -770,99 +731,10 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/QueueTaskItem'
|
$ref: '#/components/schemas/QueueTaskItem'
|
||||||
examples:
|
|
||||||
install:
|
|
||||||
summary: Install a custom node
|
|
||||||
value:
|
|
||||||
ui_id: "task_123"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "install"
|
|
||||||
params:
|
|
||||||
id: "pythongosssss/ComfyUI-Custom-Scripts"
|
|
||||||
version: "latest"
|
|
||||||
selected_version: "latest"
|
|
||||||
mode: "remote"
|
|
||||||
channel: "default"
|
|
||||||
update:
|
|
||||||
summary: Update a custom node
|
|
||||||
value:
|
|
||||||
ui_id: "task_124"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "update"
|
|
||||||
params:
|
|
||||||
node_name: "ComfyUI-Custom-Scripts"
|
|
||||||
node_ver: "1.0.0"
|
|
||||||
update-all:
|
|
||||||
summary: Update all custom nodes
|
|
||||||
value:
|
|
||||||
ui_id: "task_125"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "update-all"
|
|
||||||
params:
|
|
||||||
mode: "remote"
|
|
||||||
update-comfyui:
|
|
||||||
summary: Update ComfyUI itself
|
|
||||||
value:
|
|
||||||
ui_id: "task_126"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "update-comfyui"
|
|
||||||
params:
|
|
||||||
is_stable: true
|
|
||||||
fix:
|
|
||||||
summary: Fix a custom node
|
|
||||||
value:
|
|
||||||
ui_id: "task_127"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "fix"
|
|
||||||
params:
|
|
||||||
node_name: "ComfyUI-Impact-Pack"
|
|
||||||
node_ver: "2.0.0"
|
|
||||||
uninstall:
|
|
||||||
summary: Uninstall a custom node
|
|
||||||
value:
|
|
||||||
ui_id: "task_128"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "uninstall"
|
|
||||||
params:
|
|
||||||
node_name: "ComfyUI-AnimateDiff-Evolved"
|
|
||||||
is_unknown: false
|
|
||||||
disable:
|
|
||||||
summary: Disable a custom node
|
|
||||||
value:
|
|
||||||
ui_id: "task_129"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "disable"
|
|
||||||
params:
|
|
||||||
node_name: "ComfyUI-Manager"
|
|
||||||
is_unknown: false
|
|
||||||
enable:
|
|
||||||
summary: Enable a custom node
|
|
||||||
value:
|
|
||||||
ui_id: "task_130"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "enable"
|
|
||||||
params:
|
|
||||||
cnr_id: "comfyui-manager"
|
|
||||||
install-model:
|
|
||||||
summary: Install a model
|
|
||||||
value:
|
|
||||||
ui_id: "task_131"
|
|
||||||
client_id: "client_abc"
|
|
||||||
kind: "install-model"
|
|
||||||
params:
|
|
||||||
name: "SD 1.5 Base Model"
|
|
||||||
type: "checkpoint"
|
|
||||||
base: "SD1.x"
|
|
||||||
save_path: "default"
|
|
||||||
url: "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned.safetensors"
|
|
||||||
filename: "v1-5-pruned.safetensors"
|
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Task queued successfully
|
description: Task queued successfully
|
||||||
'400':
|
|
||||||
description: Invalid task data
|
|
||||||
'500':
|
|
||||||
description: Internal server error
|
|
||||||
/v2/manager/queue/status:
|
/v2/manager/queue/status:
|
||||||
get:
|
get:
|
||||||
summary: Get queue status
|
summary: Get queue status
|
||||||
@@ -876,6 +748,7 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/QueueStatus'
|
$ref: '#/components/schemas/QueueStatus'
|
||||||
|
|
||||||
/v2/manager/queue/history:
|
/v2/manager/queue/history:
|
||||||
get:
|
get:
|
||||||
summary: Get task history
|
summary: Get task history
|
||||||
@@ -901,6 +774,7 @@ paths:
|
|||||||
- type: object # File-based batch history
|
- type: object # File-based batch history
|
||||||
'400':
|
'400':
|
||||||
description: Error retrieving history
|
description: Error retrieving history
|
||||||
|
|
||||||
/v2/manager/queue/history_list:
|
/v2/manager/queue/history_list:
|
||||||
get:
|
get:
|
||||||
summary: Get available batch history files
|
summary: Get available batch history files
|
||||||
@@ -914,6 +788,30 @@ paths:
|
|||||||
$ref: '#/components/schemas/HistoryListResponse'
|
$ref: '#/components/schemas/HistoryListResponse'
|
||||||
'400':
|
'400':
|
||||||
description: Error retrieving history list
|
description: Error retrieving history list
|
||||||
|
|
||||||
|
/v2/manager/queue/batch/{batch_id}:
|
||||||
|
get:
|
||||||
|
summary: Get batch execution record
|
||||||
|
description: Returns detailed execution record for a specific batch including before/after state snapshots and all operations performed
|
||||||
|
parameters:
|
||||||
|
- name: batch_id
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
description: Unique batch identifier
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Batch record retrieved successfully
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/BatchExecutionRecord'
|
||||||
|
'404':
|
||||||
|
description: Batch not found
|
||||||
|
'400':
|
||||||
|
description: Error retrieving batch record
|
||||||
|
|
||||||
/v2/manager/queue/start:
|
/v2/manager/queue/start:
|
||||||
get:
|
get:
|
||||||
summary: Start queue processing
|
summary: Start queue processing
|
||||||
@@ -923,6 +821,7 @@ paths:
|
|||||||
description: Processing started
|
description: Processing started
|
||||||
'201':
|
'201':
|
||||||
description: Processing already in progress
|
description: Processing already in progress
|
||||||
|
|
||||||
/v2/manager/queue/reset:
|
/v2/manager/queue/reset:
|
||||||
get:
|
get:
|
||||||
summary: Reset queue
|
summary: Reset queue
|
||||||
@@ -930,6 +829,7 @@ paths:
|
|||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Queue reset successfully
|
description: Queue reset successfully
|
||||||
|
|
||||||
/v2/manager/queue/update_all:
|
/v2/manager/queue/update_all:
|
||||||
get:
|
get:
|
||||||
summary: Update all custom nodes
|
summary: Update all custom nodes
|
||||||
@@ -938,29 +838,22 @@ paths:
|
|||||||
- securityLevel: []
|
- securityLevel: []
|
||||||
parameters:
|
parameters:
|
||||||
- $ref: '#/components/parameters/modeParam'
|
- $ref: '#/components/parameters/modeParam'
|
||||||
- $ref: '#/components/parameters/clientIdRequiredParam'
|
|
||||||
- $ref: '#/components/parameters/uiIdRequiredParam'
|
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Update queued successfully
|
description: Update queued successfully
|
||||||
'400':
|
|
||||||
description: Missing required parameters
|
|
||||||
'401':
|
'401':
|
||||||
description: Processing already in progress
|
description: Processing already in progress
|
||||||
'403':
|
'403':
|
||||||
description: Security policy violation
|
description: Security policy violation
|
||||||
|
|
||||||
/v2/manager/queue/update_comfyui:
|
/v2/manager/queue/update_comfyui:
|
||||||
get:
|
get:
|
||||||
summary: Update ComfyUI
|
summary: Update ComfyUI
|
||||||
description: Queues an update operation for ComfyUI itself
|
description: Queues an update operation for ComfyUI itself
|
||||||
parameters:
|
|
||||||
- $ref: '#/components/parameters/clientIdRequiredParam'
|
|
||||||
- $ref: '#/components/parameters/uiIdRequiredParam'
|
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Update queued successfully
|
description: Update queued successfully
|
||||||
'400':
|
|
||||||
description: Missing required parameters
|
|
||||||
/v2/manager/queue/install_model:
|
/v2/manager/queue/install_model:
|
||||||
post:
|
post:
|
||||||
summary: Install model
|
summary: Install model
|
||||||
@@ -980,6 +873,7 @@ paths:
|
|||||||
description: Invalid model request
|
description: Invalid model request
|
||||||
'403':
|
'403':
|
||||||
description: Security policy violation
|
description: Security policy violation
|
||||||
|
|
||||||
# Custom Nodes Endpoints (v2)
|
# Custom Nodes Endpoints (v2)
|
||||||
/v2/customnode/getmappings:
|
/v2/customnode/getmappings:
|
||||||
get:
|
get:
|
||||||
@@ -994,6 +888,7 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/ManagerMappings'
|
$ref: '#/components/schemas/ManagerMappings'
|
||||||
|
|
||||||
/v2/customnode/fetch_updates:
|
/v2/customnode/fetch_updates:
|
||||||
get:
|
get:
|
||||||
summary: Check for updates
|
summary: Check for updates
|
||||||
@@ -1026,6 +921,7 @@ paths:
|
|||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/InstalledPacksResponse'
|
$ref: '#/components/schemas/InstalledPacksResponse'
|
||||||
|
|
||||||
/v2/customnode/import_fail_info:
|
/v2/customnode/import_fail_info:
|
||||||
post:
|
post:
|
||||||
summary: Get import failure information
|
summary: Get import failure information
|
||||||
@@ -1046,6 +942,45 @@ paths:
|
|||||||
description: Successful operation
|
description: Successful operation
|
||||||
'400':
|
'400':
|
||||||
description: No information available
|
description: No information available
|
||||||
|
|
||||||
|
/v2/customnode/install/git_url:
|
||||||
|
post:
|
||||||
|
summary: Install custom node via Git URL
|
||||||
|
description: Installs a custom node from a Git repository URL
|
||||||
|
security:
|
||||||
|
- securityLevel: []
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
text/plain:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Installation successful or already installed
|
||||||
|
'400':
|
||||||
|
description: Installation failed
|
||||||
|
'403':
|
||||||
|
description: Security policy violation
|
||||||
|
|
||||||
|
/v2/customnode/install/pip:
|
||||||
|
post:
|
||||||
|
summary: Install custom node dependencies via pip
|
||||||
|
description: Installs Python package dependencies for custom nodes
|
||||||
|
security:
|
||||||
|
- securityLevel: []
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
text/plain:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Installation successful
|
||||||
|
'403':
|
||||||
|
description: Security policy violation
|
||||||
|
|
||||||
# Snapshot Management Endpoints (v2)
|
# Snapshot Management Endpoints (v2)
|
||||||
/v2/snapshot/getlist:
|
/v2/snapshot/getlist:
|
||||||
get:
|
get:
|
||||||
@@ -1063,6 +998,7 @@ paths:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
$ref: '#/components/schemas/SnapshotItem'
|
$ref: '#/components/schemas/SnapshotItem'
|
||||||
|
|
||||||
/v2/snapshot/remove:
|
/v2/snapshot/remove:
|
||||||
get:
|
get:
|
||||||
summary: Remove snapshot
|
summary: Remove snapshot
|
||||||
@@ -1078,6 +1014,7 @@ paths:
|
|||||||
description: Error removing snapshot
|
description: Error removing snapshot
|
||||||
'403':
|
'403':
|
||||||
description: Security policy violation
|
description: Security policy violation
|
||||||
|
|
||||||
/v2/snapshot/restore:
|
/v2/snapshot/restore:
|
||||||
get:
|
get:
|
||||||
summary: Restore snapshot
|
summary: Restore snapshot
|
||||||
@@ -1093,6 +1030,7 @@ paths:
|
|||||||
description: Error restoring snapshot
|
description: Error restoring snapshot
|
||||||
'403':
|
'403':
|
||||||
description: Security policy violation
|
description: Security policy violation
|
||||||
|
|
||||||
/v2/snapshot/get_current:
|
/v2/snapshot/get_current:
|
||||||
get:
|
get:
|
||||||
summary: Get current snapshot
|
summary: Get current snapshot
|
||||||
@@ -1106,6 +1044,7 @@ paths:
|
|||||||
type: object
|
type: object
|
||||||
'400':
|
'400':
|
||||||
description: Error creating snapshot
|
description: Error creating snapshot
|
||||||
|
|
||||||
/v2/snapshot/save:
|
/v2/snapshot/save:
|
||||||
get:
|
get:
|
||||||
summary: Save snapshot
|
summary: Save snapshot
|
||||||
@@ -1115,6 +1054,7 @@ paths:
|
|||||||
description: Snapshot saved successfully
|
description: Snapshot saved successfully
|
||||||
'400':
|
'400':
|
||||||
description: Error saving snapshot
|
description: Error saving snapshot
|
||||||
|
|
||||||
# ComfyUI Management Endpoints (v2)
|
# ComfyUI Management Endpoints (v2)
|
||||||
/v2/comfyui_manager/comfyui_versions:
|
/v2/comfyui_manager/comfyui_versions:
|
||||||
get:
|
get:
|
||||||
@@ -1136,6 +1076,7 @@ paths:
|
|||||||
type: string
|
type: string
|
||||||
'400':
|
'400':
|
||||||
description: Error retrieving versions
|
description: Error retrieving versions
|
||||||
|
|
||||||
/v2/comfyui_manager/comfyui_switch_version:
|
/v2/comfyui_manager/comfyui_switch_version:
|
||||||
get:
|
get:
|
||||||
summary: Switch ComfyUI version
|
summary: Switch ComfyUI version
|
||||||
@@ -1143,18 +1084,36 @@ paths:
|
|||||||
parameters:
|
parameters:
|
||||||
- name: ver
|
- name: ver
|
||||||
in: query
|
in: query
|
||||||
required: true
|
|
||||||
description: Target version
|
description: Target version
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
- $ref: '#/components/parameters/clientIdRequiredParam'
|
|
||||||
- $ref: '#/components/parameters/uiIdRequiredParam'
|
|
||||||
responses:
|
responses:
|
||||||
'200':
|
'200':
|
||||||
description: Version switch queued successfully
|
description: Version switch successful
|
||||||
'400':
|
'400':
|
||||||
description: Missing required parameters or error switching version
|
description: Error switching version
|
||||||
|
|
||||||
# Configuration Endpoints (v2)
|
# Configuration Endpoints (v2)
|
||||||
|
/v2/manager/preview_method:
|
||||||
|
get:
|
||||||
|
summary: Get or set preview method
|
||||||
|
description: Gets or sets the latent preview method
|
||||||
|
parameters:
|
||||||
|
- name: value
|
||||||
|
in: query
|
||||||
|
required: false
|
||||||
|
description: New preview method
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
enum: [auto, latent2rgb, taesd, none]
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Setting updated or current value returned
|
||||||
|
content:
|
||||||
|
text/plain:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
|
||||||
/v2/manager/db_mode:
|
/v2/manager/db_mode:
|
||||||
get:
|
get:
|
||||||
summary: Get or set database mode
|
summary: Get or set database mode
|
||||||
@@ -1174,6 +1133,7 @@ paths:
|
|||||||
text/plain:
|
text/plain:
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
/v2/manager/policy/update:
|
/v2/manager/policy/update:
|
||||||
get:
|
get:
|
||||||
summary: Get or set update policy
|
summary: Get or set update policy
|
||||||
@@ -1193,6 +1153,7 @@ paths:
|
|||||||
text/plain:
|
text/plain:
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
/v2/manager/channel_url_list:
|
/v2/manager/channel_url_list:
|
||||||
get:
|
get:
|
||||||
summary: Get or set channel URL
|
summary: Get or set channel URL
|
||||||
@@ -1223,6 +1184,7 @@ paths:
|
|||||||
type: string
|
type: string
|
||||||
url:
|
url:
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
/v2/manager/reboot:
|
/v2/manager/reboot:
|
||||||
get:
|
get:
|
||||||
summary: Reboot ComfyUI
|
summary: Reboot ComfyUI
|
||||||
@@ -1234,6 +1196,7 @@ paths:
|
|||||||
description: Reboot initiated
|
description: Reboot initiated
|
||||||
'403':
|
'403':
|
||||||
description: Security policy violation
|
description: Security policy violation
|
||||||
|
|
||||||
/v2/manager/version:
|
/v2/manager/version:
|
||||||
get:
|
get:
|
||||||
summary: Get manager version
|
summary: Get manager version
|
||||||
@@ -1245,6 +1208,7 @@ paths:
|
|||||||
text/plain:
|
text/plain:
|
||||||
schema:
|
schema:
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
/v2/manager/is_legacy_manager_ui:
|
/v2/manager/is_legacy_manager_ui:
|
||||||
get:
|
get:
|
||||||
summary: Check if legacy manager UI is enabled
|
summary: Check if legacy manager UI is enabled
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ keywords = ["comfyui", "comfyui-manager"]
|
|||||||
|
|
||||||
maintainers = [
|
maintainers = [
|
||||||
{ name = "Dr.Lt.Data", email = "dr.lt.data@gmail.com" },
|
{ name = "Dr.Lt.Data", email = "dr.lt.data@gmail.com" },
|
||||||
{ name = "Yoland Yan", email = "yoland@comfy.org" },
|
{ name = "Yoland Yan", email = "yoland@drip.art" },
|
||||||
{ name = "James Kwon", email = "hongilkwon316@gmail.com" },
|
{ name = "James Kwon", email = "hongilkwon316@gmail.com" },
|
||||||
{ name = "Robin Huang", email = "robin@comfy.org" },
|
{ name = "Robin Huang", email = "robin@drip.art" },
|
||||||
]
|
]
|
||||||
|
|
||||||
classifiers = [
|
classifiers = [
|
||||||
@@ -25,16 +25,16 @@ classifiers = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"GitPython",
|
"GitPython",
|
||||||
"PyGithub",
|
"PyGithub",
|
||||||
"matrix-client==0.4.0",
|
"matrix-client==0.4.0",
|
||||||
"transformers",
|
"transformers",
|
||||||
"huggingface-hub>0.20",
|
"huggingface-hub>0.20",
|
||||||
"typer",
|
"typer",
|
||||||
"rich",
|
"rich",
|
||||||
"typing-extensions",
|
"typing-extensions",
|
||||||
"toml",
|
"toml",
|
||||||
"uv",
|
"uv",
|
||||||
"chardet"
|
"chardet"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
13
pytest.ini
13
pytest.ini
@@ -1,13 +0,0 @@
|
|||||||
[tool:pytest]
|
|
||||||
testpaths = tests
|
|
||||||
python_files = test_*.py
|
|
||||||
python_classes = Test*
|
|
||||||
python_functions = test_*
|
|
||||||
addopts =
|
|
||||||
-v
|
|
||||||
--tb=short
|
|
||||||
--strict-markers
|
|
||||||
--disable-warnings
|
|
||||||
markers =
|
|
||||||
slow: marks tests as slow (deselect with '-m "not slow"')
|
|
||||||
integration: marks tests as integration tests
|
|
||||||
42
run_tests.py
42
run_tests.py
@@ -1,42 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
"""
|
|
||||||
Simple test runner for ComfyUI-Manager tests.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
python run_tests.py # Run all tests
|
|
||||||
python run_tests.py -k test_task_queue # Run specific tests
|
|
||||||
python run_tests.py --cov # Run with coverage
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys
|
|
||||||
import subprocess
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
def main():
|
|
||||||
"""Run pytest with appropriate arguments"""
|
|
||||||
# Ensure we're in the project directory
|
|
||||||
project_root = Path(__file__).parent
|
|
||||||
|
|
||||||
# Base pytest command
|
|
||||||
cmd = [sys.executable, "-m", "pytest"]
|
|
||||||
|
|
||||||
# Add any command line arguments passed to this script
|
|
||||||
cmd.extend(sys.argv[1:])
|
|
||||||
|
|
||||||
# Add default arguments if none provided
|
|
||||||
if len(sys.argv) == 1:
|
|
||||||
cmd.extend([
|
|
||||||
"tests/",
|
|
||||||
"-v",
|
|
||||||
"--tb=short"
|
|
||||||
])
|
|
||||||
|
|
||||||
print(f"Running: {' '.join(cmd)}")
|
|
||||||
print(f"Working directory: {project_root}")
|
|
||||||
|
|
||||||
# Run pytest
|
|
||||||
result = subprocess.run(cmd, cwd=project_root)
|
|
||||||
sys.exit(result.returncode)
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
# ComfyUI-Manager Tests
|
|
||||||
|
|
||||||
This directory contains unit tests for ComfyUI-Manager components.
|
|
||||||
|
|
||||||
## Running Tests
|
|
||||||
|
|
||||||
### Using the Virtual Environment
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# From the project root
|
|
||||||
/path/to/comfyui/.venv/bin/python -m pytest tests/ -v
|
|
||||||
```
|
|
||||||
|
|
||||||
### Using the Test Runner
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Run all tests
|
|
||||||
python run_tests.py
|
|
||||||
|
|
||||||
# Run specific tests
|
|
||||||
python run_tests.py -k test_task_queue
|
|
||||||
|
|
||||||
# Run with coverage
|
|
||||||
python run_tests.py --cov
|
|
||||||
```
|
|
||||||
|
|
||||||
## Test Structure
|
|
||||||
|
|
||||||
### test_task_queue.py
|
|
||||||
|
|
||||||
Comprehensive tests for the TaskQueue functionality including:
|
|
||||||
|
|
||||||
- **Basic Operations**: Initialization, adding/removing tasks, state management
|
|
||||||
- **Batch Tracking**: Automatic batch creation, history saving, finalization
|
|
||||||
- **Thread Safety**: Concurrent access, worker lifecycle management
|
|
||||||
- **Integration Testing**: Full task processing workflow
|
|
||||||
- **Edge Cases**: Empty queues, invalid data, exception handling
|
|
||||||
|
|
||||||
**Key Features Tested:**
|
|
||||||
- ✅ Task queueing with Pydantic model validation
|
|
||||||
- ✅ Batch history tracking and persistence
|
|
||||||
- ✅ Thread-safe concurrent operations
|
|
||||||
- ✅ Worker thread lifecycle management
|
|
||||||
- ✅ WebSocket message tracking
|
|
||||||
- ✅ State snapshots and transitions
|
|
||||||
|
|
||||||
### MockTaskQueue
|
|
||||||
|
|
||||||
The tests use a `MockTaskQueue` class that:
|
|
||||||
- Isolates testing from global state and external dependencies
|
|
||||||
- Provides dependency injection for mocking external services
|
|
||||||
- Maintains the same API as the real TaskQueue
|
|
||||||
- Supports both synchronous and asynchronous testing patterns
|
|
||||||
|
|
||||||
## Test Categories
|
|
||||||
|
|
||||||
- **Unit Tests**: Individual method testing with mocked dependencies
|
|
||||||
- **Integration Tests**: Full workflow testing with real threading
|
|
||||||
- **Concurrency Tests**: Multi-threaded access verification
|
|
||||||
- **Edge Case Tests**: Error conditions and boundary cases
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
|
|
||||||
Tests require:
|
|
||||||
- `pytest` - Test framework
|
|
||||||
- `pytest-asyncio` - Async test support
|
|
||||||
- `pydantic` - Data model validation
|
|
||||||
|
|
||||||
Install with: `pip install -e ".[dev]"`
|
|
||||||
|
|
||||||
## Design Notes
|
|
||||||
|
|
||||||
### Handling Singleton Pattern
|
|
||||||
|
|
||||||
The real TaskQueue uses a singleton pattern which makes testing challenging. The MockTaskQueue avoids this by:
|
|
||||||
- Not setting global instance variables
|
|
||||||
- Creating fresh instances per test
|
|
||||||
- Providing controlled dependency injection
|
|
||||||
|
|
||||||
### Thread Management
|
|
||||||
|
|
||||||
Tests handle threading complexities by:
|
|
||||||
- Using controlled mock workers for predictable behavior
|
|
||||||
- Providing synchronization primitives for timing-sensitive tests
|
|
||||||
- Testing both successful workflows and exception scenarios
|
|
||||||
|
|
||||||
### Heapq Compatibility
|
|
||||||
|
|
||||||
The original TaskQueue uses `heapq` with Pydantic models, which don't support comparison by default. Tests solve this by wrapping items in comparable tuples with priority values, maintaining FIFO order while enabling heap operations.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
"""Test suite for ComfyUI-Manager"""
|
|
||||||
@@ -1,510 +0,0 @@
|
|||||||
"""
|
|
||||||
Tests for TaskQueue functionality.
|
|
||||||
|
|
||||||
This module tests the core TaskQueue operations including:
|
|
||||||
- Task queueing and processing
|
|
||||||
- Batch tracking
|
|
||||||
- Thread lifecycle management
|
|
||||||
- State management
|
|
||||||
- WebSocket message delivery
|
|
||||||
"""
|
|
||||||
|
|
||||||
import asyncio
|
|
||||||
import json
|
|
||||||
import threading
|
|
||||||
import time
|
|
||||||
import uuid
|
|
||||||
from datetime import datetime
|
|
||||||
from pathlib import Path
|
|
||||||
from unittest.mock import AsyncMock, MagicMock, Mock, patch
|
|
||||||
from typing import Any, Dict, Optional
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
|
|
||||||
from comfyui_manager.data_models import (
|
|
||||||
QueueTaskItem,
|
|
||||||
TaskExecutionStatus,
|
|
||||||
TaskStateMessage,
|
|
||||||
InstallPackParams,
|
|
||||||
ManagerDatabaseSource,
|
|
||||||
ManagerChannel,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class MockTaskQueue:
|
|
||||||
"""
|
|
||||||
A testable version of TaskQueue that allows for dependency injection
|
|
||||||
and isolated testing without global state.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, history_dir: Optional[Path] = None):
|
|
||||||
# Don't set the global instance for testing
|
|
||||||
self.mutex = threading.RLock()
|
|
||||||
self.not_empty = threading.Condition(self.mutex)
|
|
||||||
self.current_index = 0
|
|
||||||
self.pending_tasks = []
|
|
||||||
self.running_tasks = {}
|
|
||||||
self.history_tasks = {}
|
|
||||||
self.task_counter = 0
|
|
||||||
self.batch_id = None
|
|
||||||
self.batch_start_time = None
|
|
||||||
self.batch_state_before = None
|
|
||||||
self._worker_task = None
|
|
||||||
self._history_dir = history_dir
|
|
||||||
|
|
||||||
# Mock external dependencies
|
|
||||||
self.mock_core = MagicMock()
|
|
||||||
self.mock_prompt_server = MagicMock()
|
|
||||||
|
|
||||||
def is_processing(self) -> bool:
|
|
||||||
"""Check if the queue is currently processing tasks"""
|
|
||||||
return (
|
|
||||||
self._worker_task is not None
|
|
||||||
and self._worker_task.is_alive()
|
|
||||||
)
|
|
||||||
|
|
||||||
def start_worker(self, mock_task_worker=None) -> bool:
|
|
||||||
"""Start the task worker. Can inject a mock worker for testing."""
|
|
||||||
if self._worker_task is not None and self._worker_task.is_alive():
|
|
||||||
return False # Already running
|
|
||||||
|
|
||||||
if mock_task_worker:
|
|
||||||
self._worker_task = threading.Thread(target=mock_task_worker)
|
|
||||||
else:
|
|
||||||
# Use a simple test worker that processes one task then stops
|
|
||||||
self._worker_task = threading.Thread(target=self._test_worker)
|
|
||||||
self._worker_task.start()
|
|
||||||
return True
|
|
||||||
|
|
||||||
def _test_worker(self):
|
|
||||||
"""Simple test worker that processes tasks without external dependencies"""
|
|
||||||
while True:
|
|
||||||
task = self.get(timeout=1.0) # Short timeout for tests
|
|
||||||
if task is None:
|
|
||||||
if self.total_count() == 0:
|
|
||||||
break
|
|
||||||
continue
|
|
||||||
|
|
||||||
item, task_index = task
|
|
||||||
|
|
||||||
# Simulate task processing
|
|
||||||
self.running_tasks[task_index] = item
|
|
||||||
|
|
||||||
# Simulate work
|
|
||||||
time.sleep(0.1)
|
|
||||||
|
|
||||||
# Mark as completed
|
|
||||||
status = TaskExecutionStatus(
|
|
||||||
status_str="success",
|
|
||||||
completed=True,
|
|
||||||
messages=["Test task completed"]
|
|
||||||
)
|
|
||||||
|
|
||||||
self.mark_done(task_index, item, status, "Test result")
|
|
||||||
|
|
||||||
# Clean up
|
|
||||||
if task_index in self.running_tasks:
|
|
||||||
del self.running_tasks[task_index]
|
|
||||||
|
|
||||||
def get_current_state(self) -> TaskStateMessage:
|
|
||||||
"""Get current queue state with mocked dependencies"""
|
|
||||||
return TaskStateMessage(
|
|
||||||
history=self.get_history(),
|
|
||||||
running_queue=self.get_current_queue()[0],
|
|
||||||
pending_queue=self.get_current_queue()[1],
|
|
||||||
installed_packs={} # Mocked empty
|
|
||||||
)
|
|
||||||
|
|
||||||
def send_queue_state_update(self, msg: str, update, client_id: Optional[str] = None):
|
|
||||||
"""Mock implementation that tracks calls instead of sending WebSocket messages"""
|
|
||||||
if not hasattr(self, '_sent_updates'):
|
|
||||||
self._sent_updates = []
|
|
||||||
self._sent_updates.append({
|
|
||||||
'msg': msg,
|
|
||||||
'update': update,
|
|
||||||
'client_id': client_id
|
|
||||||
})
|
|
||||||
|
|
||||||
# Copy the essential methods from the real TaskQueue
|
|
||||||
def put(self, item) -> None:
|
|
||||||
"""Add a task to the queue. Item can be a dict or QueueTaskItem model."""
|
|
||||||
with self.mutex:
|
|
||||||
# Start a new batch if this is the first task after queue was empty
|
|
||||||
if (
|
|
||||||
self.batch_id is None
|
|
||||||
and len(self.pending_tasks) == 0
|
|
||||||
and len(self.running_tasks) == 0
|
|
||||||
):
|
|
||||||
self._start_new_batch()
|
|
||||||
|
|
||||||
# Convert to Pydantic model if it's a dict
|
|
||||||
if isinstance(item, dict):
|
|
||||||
item = QueueTaskItem(**item)
|
|
||||||
|
|
||||||
import heapq
|
|
||||||
# Wrap in tuple with priority to make it comparable
|
|
||||||
# Use task_counter as priority to maintain FIFO order
|
|
||||||
priority_item = (self.task_counter, item)
|
|
||||||
heapq.heappush(self.pending_tasks, priority_item)
|
|
||||||
self.task_counter += 1
|
|
||||||
self.not_empty.notify()
|
|
||||||
|
|
||||||
def _start_new_batch(self) -> None:
|
|
||||||
"""Start a new batch session for tracking operations."""
|
|
||||||
self.batch_id = (
|
|
||||||
f"test_batch_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{uuid.uuid4().hex[:8]}"
|
|
||||||
)
|
|
||||||
self.batch_start_time = datetime.now().isoformat()
|
|
||||||
self.batch_state_before = {"test": "state"} # Simplified for testing
|
|
||||||
|
|
||||||
def get(self, timeout: Optional[float] = None):
|
|
||||||
"""Get next task from queue"""
|
|
||||||
with self.not_empty:
|
|
||||||
while len(self.pending_tasks) == 0:
|
|
||||||
self.not_empty.wait(timeout=timeout)
|
|
||||||
if timeout is not None and len(self.pending_tasks) == 0:
|
|
||||||
return None
|
|
||||||
import heapq
|
|
||||||
priority_item = heapq.heappop(self.pending_tasks)
|
|
||||||
task_index, item = priority_item # Unwrap the tuple
|
|
||||||
return item, task_index
|
|
||||||
|
|
||||||
def total_count(self) -> int:
|
|
||||||
"""Get total number of tasks (pending + running)"""
|
|
||||||
return len(self.pending_tasks) + len(self.running_tasks)
|
|
||||||
|
|
||||||
def done_count(self) -> int:
|
|
||||||
"""Get number of completed tasks"""
|
|
||||||
return len(self.history_tasks)
|
|
||||||
|
|
||||||
def get_current_queue(self):
|
|
||||||
"""Get current running and pending queues"""
|
|
||||||
running = list(self.running_tasks.values())
|
|
||||||
# Extract items from the priority tuples
|
|
||||||
pending = [item for priority, item in self.pending_tasks]
|
|
||||||
return running, pending
|
|
||||||
|
|
||||||
def get_history(self):
|
|
||||||
"""Get task history"""
|
|
||||||
return self.history_tasks
|
|
||||||
|
|
||||||
def mark_done(self, task_index: int, item: QueueTaskItem, status: TaskExecutionStatus, result: str):
|
|
||||||
"""Mark a task as completed"""
|
|
||||||
from comfyui_manager.data_models import TaskHistoryItem
|
|
||||||
|
|
||||||
history_item = TaskHistoryItem(
|
|
||||||
ui_id=item.ui_id,
|
|
||||||
client_id=item.client_id,
|
|
||||||
kind=item.kind.value if hasattr(item.kind, 'value') else str(item.kind),
|
|
||||||
timestamp=datetime.now().isoformat(),
|
|
||||||
result=result,
|
|
||||||
status=status
|
|
||||||
)
|
|
||||||
|
|
||||||
self.history_tasks[item.ui_id] = history_item
|
|
||||||
|
|
||||||
def finalize(self):
|
|
||||||
"""Finalize batch (simplified for testing)"""
|
|
||||||
if self._history_dir and self.batch_id:
|
|
||||||
batch_file = self._history_dir / f"{self.batch_id}.json"
|
|
||||||
batch_record = {
|
|
||||||
"batch_id": self.batch_id,
|
|
||||||
"start_time": self.batch_start_time,
|
|
||||||
"state_before": self.batch_state_before,
|
|
||||||
"operations": [] # Simplified
|
|
||||||
}
|
|
||||||
with open(batch_file, 'w') as f:
|
|
||||||
json.dump(batch_record, f, indent=2)
|
|
||||||
|
|
||||||
|
|
||||||
class TestTaskQueue:
|
|
||||||
"""Test suite for TaskQueue functionality"""
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def task_queue(self, tmp_path):
|
|
||||||
"""Create a clean TaskQueue instance for each test"""
|
|
||||||
return MockTaskQueue(history_dir=tmp_path)
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def sample_task(self):
|
|
||||||
"""Create a sample task for testing"""
|
|
||||||
return QueueTaskItem(
|
|
||||||
ui_id=str(uuid.uuid4()),
|
|
||||||
client_id="test_client",
|
|
||||||
kind="install",
|
|
||||||
params=InstallPackParams(
|
|
||||||
id="test-node",
|
|
||||||
version="1.0.0",
|
|
||||||
selected_version="1.0.0",
|
|
||||||
mode=ManagerDatabaseSource.cache,
|
|
||||||
channel=ManagerChannel.dev
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_task_queue_initialization(self, task_queue):
|
|
||||||
"""Test TaskQueue initializes with correct default state"""
|
|
||||||
assert task_queue.total_count() == 0
|
|
||||||
assert task_queue.done_count() == 0
|
|
||||||
assert not task_queue.is_processing()
|
|
||||||
assert task_queue.batch_id is None
|
|
||||||
assert len(task_queue.pending_tasks) == 0
|
|
||||||
assert len(task_queue.running_tasks) == 0
|
|
||||||
assert len(task_queue.history_tasks) == 0
|
|
||||||
|
|
||||||
def test_put_task_starts_batch(self, task_queue, sample_task):
|
|
||||||
"""Test that adding first task starts a new batch"""
|
|
||||||
assert task_queue.batch_id is None
|
|
||||||
|
|
||||||
task_queue.put(sample_task)
|
|
||||||
|
|
||||||
assert task_queue.batch_id is not None
|
|
||||||
assert task_queue.batch_id.startswith("test_batch_")
|
|
||||||
assert task_queue.batch_start_time is not None
|
|
||||||
assert task_queue.total_count() == 1
|
|
||||||
|
|
||||||
def test_put_multiple_tasks(self, task_queue, sample_task):
|
|
||||||
"""Test adding multiple tasks to queue"""
|
|
||||||
task_queue.put(sample_task)
|
|
||||||
|
|
||||||
# Create second task
|
|
||||||
task2 = QueueTaskItem(
|
|
||||||
ui_id=str(uuid.uuid4()),
|
|
||||||
client_id="test_client_2",
|
|
||||||
kind="install",
|
|
||||||
params=sample_task.params
|
|
||||||
)
|
|
||||||
task_queue.put(task2)
|
|
||||||
|
|
||||||
assert task_queue.total_count() == 2
|
|
||||||
assert len(task_queue.pending_tasks) == 2
|
|
||||||
|
|
||||||
def test_put_task_with_dict(self, task_queue):
|
|
||||||
"""Test adding task as dictionary gets converted to QueueTaskItem"""
|
|
||||||
task_dict = {
|
|
||||||
"ui_id": str(uuid.uuid4()),
|
|
||||||
"client_id": "test_client",
|
|
||||||
"kind": "install",
|
|
||||||
"params": {
|
|
||||||
"id": "test-node",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"selected_version": "1.0.0",
|
|
||||||
"mode": "cache",
|
|
||||||
"channel": "dev"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task_queue.put(task_dict)
|
|
||||||
|
|
||||||
assert task_queue.total_count() == 1
|
|
||||||
# Verify it was converted to QueueTaskItem
|
|
||||||
item, _ = task_queue.get(timeout=0.1)
|
|
||||||
assert isinstance(item, QueueTaskItem)
|
|
||||||
assert item.ui_id == task_dict["ui_id"]
|
|
||||||
|
|
||||||
def test_get_task_from_queue(self, task_queue, sample_task):
|
|
||||||
"""Test retrieving task from queue"""
|
|
||||||
task_queue.put(sample_task)
|
|
||||||
|
|
||||||
item, task_index = task_queue.get(timeout=0.1)
|
|
||||||
|
|
||||||
assert item == sample_task
|
|
||||||
assert isinstance(task_index, int)
|
|
||||||
assert task_queue.total_count() == 0 # Should be removed from pending
|
|
||||||
|
|
||||||
def test_get_task_timeout(self, task_queue):
|
|
||||||
"""Test get with timeout on empty queue returns None"""
|
|
||||||
result = task_queue.get(timeout=0.1)
|
|
||||||
assert result is None
|
|
||||||
|
|
||||||
def test_start_stop_worker(self, task_queue):
|
|
||||||
"""Test worker thread lifecycle"""
|
|
||||||
assert not task_queue.is_processing()
|
|
||||||
|
|
||||||
# Mock worker that stops immediately
|
|
||||||
stop_event = threading.Event()
|
|
||||||
def mock_worker():
|
|
||||||
stop_event.wait(0.1) # Brief delay then stop
|
|
||||||
|
|
||||||
started = task_queue.start_worker(mock_worker)
|
|
||||||
assert started is True
|
|
||||||
assert task_queue.is_processing()
|
|
||||||
|
|
||||||
# Try to start again - should return False
|
|
||||||
started_again = task_queue.start_worker(mock_worker)
|
|
||||||
assert started_again is False
|
|
||||||
|
|
||||||
# Wait for worker to finish
|
|
||||||
stop_event.set()
|
|
||||||
task_queue._worker_task.join(timeout=1.0)
|
|
||||||
assert not task_queue.is_processing()
|
|
||||||
|
|
||||||
def test_task_processing_integration(self, task_queue, sample_task):
|
|
||||||
"""Test full task processing workflow"""
|
|
||||||
# Add task to queue
|
|
||||||
task_queue.put(sample_task)
|
|
||||||
assert task_queue.total_count() == 1
|
|
||||||
|
|
||||||
# Start worker
|
|
||||||
started = task_queue.start_worker()
|
|
||||||
assert started is True
|
|
||||||
|
|
||||||
# Wait for processing to complete
|
|
||||||
for _ in range(50): # Max 5 seconds
|
|
||||||
if task_queue.done_count() > 0:
|
|
||||||
break
|
|
||||||
time.sleep(0.1)
|
|
||||||
|
|
||||||
# Verify task was processed
|
|
||||||
assert task_queue.done_count() == 1
|
|
||||||
assert task_queue.total_count() == 0
|
|
||||||
assert sample_task.ui_id in task_queue.history_tasks
|
|
||||||
|
|
||||||
# Stop worker
|
|
||||||
task_queue._worker_task.join(timeout=1.0)
|
|
||||||
|
|
||||||
def test_get_current_state(self, task_queue, sample_task):
|
|
||||||
"""Test getting current queue state"""
|
|
||||||
task_queue.put(sample_task)
|
|
||||||
|
|
||||||
state = task_queue.get_current_state()
|
|
||||||
|
|
||||||
assert isinstance(state, TaskStateMessage)
|
|
||||||
assert len(state.pending_queue) == 1
|
|
||||||
assert len(state.running_queue) == 0
|
|
||||||
assert state.pending_queue[0] == sample_task
|
|
||||||
|
|
||||||
def test_batch_finalization(self, task_queue, tmp_path):
|
|
||||||
"""Test batch history is saved correctly"""
|
|
||||||
task_queue.put(QueueTaskItem(
|
|
||||||
ui_id=str(uuid.uuid4()),
|
|
||||||
client_id="test_client",
|
|
||||||
kind="install",
|
|
||||||
params=InstallPackParams(
|
|
||||||
id="test-node",
|
|
||||||
version="1.0.0",
|
|
||||||
selected_version="1.0.0",
|
|
||||||
mode=ManagerDatabaseSource.cache,
|
|
||||||
channel=ManagerChannel.dev
|
|
||||||
)
|
|
||||||
))
|
|
||||||
|
|
||||||
batch_id = task_queue.batch_id
|
|
||||||
task_queue.finalize()
|
|
||||||
|
|
||||||
# Check batch file was created
|
|
||||||
batch_file = tmp_path / f"{batch_id}.json"
|
|
||||||
assert batch_file.exists()
|
|
||||||
|
|
||||||
# Verify content
|
|
||||||
with open(batch_file) as f:
|
|
||||||
batch_data = json.load(f)
|
|
||||||
|
|
||||||
assert batch_data["batch_id"] == batch_id
|
|
||||||
assert "start_time" in batch_data
|
|
||||||
assert "state_before" in batch_data
|
|
||||||
|
|
||||||
def test_concurrent_access(self, task_queue):
|
|
||||||
"""Test thread-safe concurrent access to queue"""
|
|
||||||
num_tasks = 10
|
|
||||||
added_tasks = []
|
|
||||||
|
|
||||||
def add_tasks():
|
|
||||||
for i in range(num_tasks):
|
|
||||||
task = QueueTaskItem(
|
|
||||||
ui_id=f"task_{i}",
|
|
||||||
client_id=f"client_{i}",
|
|
||||||
kind="install",
|
|
||||||
params=InstallPackParams(
|
|
||||||
id=f"node_{i}",
|
|
||||||
version="1.0.0",
|
|
||||||
selected_version="1.0.0",
|
|
||||||
mode=ManagerDatabaseSource.cache,
|
|
||||||
channel=ManagerChannel.dev
|
|
||||||
)
|
|
||||||
)
|
|
||||||
task_queue.put(task)
|
|
||||||
added_tasks.append(task)
|
|
||||||
|
|
||||||
# Start multiple threads adding tasks
|
|
||||||
threads = []
|
|
||||||
for _ in range(3):
|
|
||||||
thread = threading.Thread(target=add_tasks)
|
|
||||||
threads.append(thread)
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
# Wait for all threads to complete
|
|
||||||
for thread in threads:
|
|
||||||
thread.join()
|
|
||||||
|
|
||||||
# Verify all tasks were added
|
|
||||||
assert task_queue.total_count() == num_tasks * 3
|
|
||||||
assert len(added_tasks) == num_tasks * 3
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
|
||||||
async def test_queue_state_updates_tracking(self, task_queue, sample_task):
|
|
||||||
"""Test that queue state updates are tracked properly"""
|
|
||||||
# Mock the update tracking
|
|
||||||
task_queue.send_queue_state_update("test-message", {"test": "data"}, "client1")
|
|
||||||
|
|
||||||
# Verify update was tracked
|
|
||||||
assert hasattr(task_queue, '_sent_updates')
|
|
||||||
assert len(task_queue._sent_updates) == 1
|
|
||||||
|
|
||||||
update = task_queue._sent_updates[0]
|
|
||||||
assert update['msg'] == "test-message"
|
|
||||||
assert update['update'] == {"test": "data"}
|
|
||||||
assert update['client_id'] == "client1"
|
|
||||||
|
|
||||||
|
|
||||||
class TestTaskQueueEdgeCases:
|
|
||||||
"""Test edge cases and error conditions"""
|
|
||||||
|
|
||||||
@pytest.fixture
|
|
||||||
def task_queue(self):
|
|
||||||
return MockTaskQueue()
|
|
||||||
|
|
||||||
def test_empty_queue_operations(self, task_queue):
|
|
||||||
"""Test operations on empty queue"""
|
|
||||||
assert task_queue.total_count() == 0
|
|
||||||
assert task_queue.done_count() == 0
|
|
||||||
|
|
||||||
# Getting from empty queue should timeout
|
|
||||||
result = task_queue.get(timeout=0.1)
|
|
||||||
assert result is None
|
|
||||||
|
|
||||||
# State should be empty
|
|
||||||
state = task_queue.get_current_state()
|
|
||||||
assert len(state.pending_queue) == 0
|
|
||||||
assert len(state.running_queue) == 0
|
|
||||||
|
|
||||||
def test_invalid_task_data(self, task_queue):
|
|
||||||
"""Test handling of invalid task data"""
|
|
||||||
# This should raise ValidationError due to missing required fields
|
|
||||||
with pytest.raises(Exception): # ValidationError from Pydantic
|
|
||||||
task_queue.put({
|
|
||||||
"ui_id": "test",
|
|
||||||
# Missing required fields
|
|
||||||
})
|
|
||||||
|
|
||||||
def test_worker_cleanup_on_exception(self, task_queue):
|
|
||||||
"""Test worker cleanup when worker function raises exception"""
|
|
||||||
exception_raised = threading.Event()
|
|
||||||
|
|
||||||
def failing_worker():
|
|
||||||
exception_raised.set()
|
|
||||||
raise RuntimeError("Test exception")
|
|
||||||
|
|
||||||
started = task_queue.start_worker(failing_worker)
|
|
||||||
assert started is True
|
|
||||||
|
|
||||||
# Wait for exception to be raised
|
|
||||||
exception_raised.wait(timeout=1.0)
|
|
||||||
|
|
||||||
# Worker should eventually stop
|
|
||||||
task_queue._worker_task.join(timeout=1.0)
|
|
||||||
assert not task_queue.is_processing()
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
# Allow running tests directly
|
|
||||||
pytest.main([__file__])
|
|
||||||
Reference in New Issue
Block a user