Compare commits

..

7 Commits

Author SHA1 Message Date
Dr.Lt.Data ef368d15ca wip 7 months ago
Dr.Lt.Data f6640453a9 resolve_requirements.py - consider extras 7 months ago
Dr.Lt.Data 9d6098f198 Merge branch 'main' into feat/pkg_tree 7 months ago
Dr.Lt.Data e3779f8e03 wip 7 months ago
Dr.Lt.Data 4019db2861 Merge branch 'main' into feat/pkg_tree 7 months ago
Dr.Lt.Data 001f54665b update DB 7 months ago
Dr.Lt.Data c019768513 implement requirments resolver 7 months ago
  1. 1
      .gitignore
  2. 73
      README.md
  3. 2530
      __init__.py
  4. 10
      alter-list.json
  5. 1018
      cm-cli.py
  6. 2568
      custom-node-list.json
  7. 146
      docs/en/cm-cli.md
  8. 149
      docs/ko/cm-cli.md
  9. 2534
      extension-node-map.json
  10. 151
      git_helper.py
  11. 4654
      github-stats.json
  12. 1200
      glob/manager_core.py
  13. 1679
      glob/manager_server.py
  14. 2
      js/a1111-alter-downloader.js
  15. 11
      js/cm-api.js
  16. 49
      js/comfyui-manager.js
  17. 4
      js/comfyui-share-openart.js
  18. 71
      js/common.js
  19. 5
      js/model-downloader.js
  20. 29
      js/snapshot.js
  21. 252
      model-list.json
  22. 331
      node_db/dev/custom-node-list.json
  23. 537
      node_db/dev/extension-node-map.json
  24. 350
      node_db/dev/github-stats.json
  25. 40
      node_db/forked/custom-node-list.json
  26. 80
      node_db/legacy/custom-node-list.json
  27. 731
      node_db/new/custom-node-list.json
  28. 2534
      node_db/new/extension-node-map.json
  29. 358
      node_db/new/model-list.json
  30. 50
      node_db/tutorial/custom-node-list.json
  31. 28
      notebooks/comfyui_colab_with_manager.ipynb
  32. 21
      pip_overrides.json.template
  33. 110
      prestartup_script.py
  34. 5
      requirements.txt
  35. 101
      scanner.py
  36. 162
      tools/resolve_requirements.py
  37. 3
      tools/usage.md

1
.gitignore vendored

@ -12,4 +12,3 @@ matrix_auth
channels.list
comfyworkflows_sharekey
github-stats-cache.json
pip_overrides.json

73
README.md

@ -5,10 +5,10 @@
![menu](misc/menu.jpg)
## NOTICE
* V2.33 Security policy is applied.
* V2.21 [cm-cli](docs/en/cm-cli.md) tool is added.
* V2.18 to V2.18.3 is not functioning due to a severe bug. Users on these versions are advised to promptly update to V2.18.4. Please navigate to the `ComfyUI/custom_nodes/ComfyUI-Manager` directory and execute `git pull` to update.
* 🏆 Join us for the [ComfyUI Workflow Contest](https://contest.openart.ai/), hosted by OpenArt AI (11.27.2023 - 12.15.2023). Our esteemed judge panel includes Scott E. Detweiler, Olivio Sarikas, MERJIC麦橘, among others. We're also thrilled to have the authors of ComfyUI Manager and AnimateDiff as our special guests!
* If you wish to hide the "Share" button, click "Manager" and choose "Share: None" option.
* You can see whole nodes info on [ComfyUI Nodes Info](https://ltdrdata.github.io/) page.
* Versions prior to V0.22.2 will no longer detect missing nodes unless using a local database. Please update ComfyUI-Manager to the latest version.
## Installation
@ -32,32 +32,10 @@ To install ComfyUI-Manager in addition to an existing installation of ComfyUI, y
![portable-install](misc/portable-install.png)
### Installation[method3] (Installation through comfy-cli: install ComfyUI and ComfyUI-Manager at once.)
> RECOMMENDED: comfy-cli provides various features to manage ComfyUI from the CLI.
* **prerequisite: python 3, git**
Windows:
```commandline
python -m venv venv
venv\Scripts\activate
pip install comfy-cli
comfy install
```
Linux/OSX:
```commandline
python -m venv venv
. venv/bin/activate
pip install comfy-cli
comfy install
```
### Installation[method4] (Installation for linux+venv: ComfyUI + ComfyUI-Manager)
### Installation[method3] (Installation for linux+venv: ComfyUI + ComfyUI-Manager)
To install ComfyUI with ComfyUI-Manager on Linux using a venv environment, you can follow these steps:
* **prerequisite: python-is-python3, python3-venv, git**
prerequisite: python-is-python3, python3-venv
1. Download [scripts/install-comfyui-venv-linux.sh](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/install-comfyui-venv-linux.sh) into empty install directory
- ComfyUI will be installed in the subdirectory of the specified directory, and the directory will contain the generated executable script.
@ -85,7 +63,6 @@ This repository provides Colab notebooks that allow you to install and use Comfy
* Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks.
## Changes
* **2.21** [cm-cli](docs/en/cm-cli.md) tool is added.
* **2.4** Copy the connections of the nearest node by double-clicking.
* **2.2.3** Support Components System
* **0.29** Add `Update all` feature
@ -180,19 +157,12 @@ This repository provides Colab notebooks that allow you to install and use Comfy
![model-install-dialog](misc/snapshot.jpg)
## cm-cli: command line tools for power user
* A tool is provided that allows you to use the features of ComfyUI-Manager without running ComfyUI.
* For more details, please refer to the [cm-cli documentation](docs/en/cm-cli.md).
## How to register your custom node into ComfyUI-Manager
* Add an entry to `custom-node-list.json` located in the root of ComfyUI-Manager and submit a Pull Request.
* NOTE: Before submitting the PR after making changes, please check `Use local DB` and ensure that the extension list loads without any issues in the `Install custom nodes` dialog. Occasionally, missing or extra commas can lead to JSON syntax errors.
* The remaining JSON will be updated through scripts in the future, so you don't need to worry about it.
## Custom node support guide
* Currently, the system operates by cloning the git repository and sequentially installing the dependencies listed in requirements.txt using pip, followed by invoking the install.py script. In the future, we plan to discuss and determine the specifications for supporting custom nodes.
@ -309,11 +279,6 @@ NODE_CLASS_MAPPINGS.update({
downgrade_blacklist = diffusers, kornia
```
* Custom pip mapping
* When you create the `pip_overrides.json` file, it changes the installation of specific pip packages to installations defined by the user.
* Please refer to the `pip_overrides.json.template` file.
## Scanner
When you run the `scan.sh` script:
@ -340,31 +305,6 @@ When you run the `scan.sh` script:
* Edit `config.ini` file: add `windows_selector_event_loop_policy = True`
## Security policy
* Edit `config.ini` file: add `security_level = <LEVEL>`
* `strong`
* doesn't allow `high` and `middle` level risky feature
* `normal`
* doesn't allow `high` level risky feature if `--listen` is specified and not starts with `127.`
* `middle` level risky feature is available
* `weak`
* all feature is available
* `high` level risky features
* `Install via git url`, `pip install`
* Installation of custom nodes registered not in the `default channel`.
* Display terminal log
* `middle` level risky features
* Uninstall/Update/Fix custom nodes
* Installation of custom nodes registered in the `default channel`.
* Restore/Remove Snapshot
* Restart
* `low` level risky features
* Update ComfyUI
## TODO: Unconventional form of custom node list
* https://github.com/diontimmer/Sample-Diffusion-ComfyUI-Extension
@ -373,8 +313,7 @@ When you run the `scan.sh` script:
* https://github.com/StartHua/Comfyui_GPT_Story
* https://github.com/NielsGercama/comfyui_customsampling
* https://github.com/wrightdaniel2017/ComfyUI-VideoLipSync
* https://github.com/bxdsjs/ComfyUI-Image-preprocessing
* https://github.com/SMUELDigital/ComfyUI-ONSET
## Roadmap

2530
__init__.py

File diff suppressed because it is too large Load Diff

10
alter-list.json

@ -204,16 +204,6 @@
"id":"https://github.com/blepping/ComfyUI-sonar",
"tags":"sonar",
"description": "This extension provides some alternative functionalities of the [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) extension."
},
{
"id":"https://github.com/AIFSH/ComfyUI-RVC",
"tags":"sonar",
"description": "a comfyui custom node for [a/Retrieval-based-Voice-Conversion-WebUI](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git), you can Voice-Conversion in comfyui now!"
},
{
"id":"https://github.com/portu-sim/comfyui-bmab",
"tags":"bmab",
"description": "a comfyui custom node for [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab)"
}
]
}

1018
cm-cli.py

File diff suppressed because it is too large Load Diff

2568
custom-node-list.json

File diff suppressed because it is too large Load Diff

146
docs/en/cm-cli.md

@ -1,146 +0,0 @@
# `cm-cli`: ComfyUI-Manager CLI
`cm-cli` is a tool that allows you to use various functions of ComfyUI-Manager from the command line without launching ComfyUI.
```
-= ComfyUI-Manager CLI (V2.24) =-
python cm-cli.py [OPTIONS]
OPTIONS:
[install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel <channel name>] ?[--mode [remote|local|cache]]
[update|disable|enable|fix] all ?[--channel <channel name>] ?[--mode [remote|local|cache]]
[simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel <channel name>] ?[--mode [remote|local|cache]]
save-snapshot ?[--output <snapshot .json/.yaml>]
restore-snapshot <snapshot .json/.yaml> ?[--pip-non-url] ?[--pip-non-local-url] ?[--pip-local-url]
cli-only-mode [enable|disable]
restore-dependencies
clear
```
## How To Use?
* You can execute it via `python cm-cli.py`.
* For example, if you want to update all custom nodes:
* In the ComfyUI-Manager directory, you can execute the command `python cm-cli.py update all`.
* If running from the ComfyUI directory, you can specify the path to cm-cli.py like this: `python custom_nodes/ComfyUI-Manager/cm-cli.py update all`.
## Prerequisite
* It must be run in the same Python environment as the one running ComfyUI.
* If using a venv, you must run it with the venv activated.
* If using a portable version, and you are in the directory with the run_nvidia_gpu.bat file, you should execute the command as follows:
`.\python_embeded\python.exe ComfyUI\custom_nodes\ComfyUI-Manager\cm-cli.py update all`
* The path for ComfyUI can be set with the COMFYUI_PATH environment variable. If omitted, a warning message will appear, and the path will be set relative to the installed location of ComfyUI-Manager:
```
WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.
```
## Features
### 1. --channel, --mode
* For viewing information and managing custom nodes, you can set the information database through --channel and --mode.
* For instance, executing the command `python cm-cli.py update all --channel recent --mode remote` will operate based on the latest information from remote rather than local data embedded in the current ComfyUI-Manager repo and will only target the list in the recent channel.
* --channel, --mode are only available with the commands `simple-show, show, install, uninstall, update, disable, enable, fix`.
### 2. Viewing Management Information
`[simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel <channel name>] ?[--mode [remote|local|cache]]`
* `[show|simple-show]` - `show` provides detailed information, while `simple-show` displays information more simply.
Executing a command like `python cm-cli.py show installed` will display detailed information about the installed custom nodes.
```
-= ComfyUI-Manager CLI (V2.24) =-
FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
[ ENABLED ] ComfyUI-Manager (author: Dr.Lt.Data)
[ ENABLED ] ComfyUI-Impact-Pack (author: Dr.Lt.Data)
[ ENABLED ] ComfyUI-Inspire-Pack (author: Dr.Lt.Data)
[ ENABLED ] ComfyUI_experiments (author: comfyanonymous)
[ ENABLED ] ComfyUI-SAI_API (author: Stability-AI)
[ ENABLED ] stability-ComfyUI-nodes (author: Stability-AI)
[ ENABLED ] comfyui_controlnet_aux (author: Fannovel16)
[ ENABLED ] ComfyUI-Frame-Interpolation (author: Fannovel16)
[ DISABLED ] ComfyUI-Loopchain (author: Fannovel16)
```
Using a command like `python cm-cli.py simple-show installed` will simply display information about the installed custom nodes.
```
-= ComfyUI-Manager CLI (V2.24) =-
FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
ComfyUI-Manager
ComfyUI-Impact-Pack
ComfyUI-Inspire-Pack
ComfyUI_experiments
ComfyUI-SAI_API
stability-ComfyUI-nodes
comfyui_controlnet_aux
ComfyUI-Frame-Interpolation
ComfyUI-Loopchain
```
`[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]`
* `enabled`, `disabled`: Shows nodes that have been enabled or disabled among the installed custom nodes.
* `installed`: Shows all nodes that have been installed, regardless of whether they are enabled or disabled.
* `not-installed`: Shows a list of custom nodes that have not been installed.
* `all`: Shows a list of all custom nodes.
* `snapshot`: Displays snapshot information of the currently installed custom nodes. When viewed with `show`, it is displayed in JSON format, and with `simple-show`, it is displayed simply, along with the commit hash.
* `snapshot-list`: Shows a list of snapshot files stored in ComfyUI-Manager/snapshots.
### 3. Managing Custom Nodes
`[install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel <channel name>] ?[--mode [remote|local|cache]]`
* You can apply management functions by listing the names of custom nodes, such as `python cm-cli.py install ComfyUI-Impact-Pack ComfyUI-Inspire-Pack ComfyUI_experiments`.
* The names of the custom nodes are as shown by `show` and are the names of the git repositories.
(Plans are to update the use of nicknames in the future.)
`[update|disable|enable|fix] all ?[--channel <channel name>] ?[--mode [remote|local|cache]]`
* The `update, disable, enable, fix` functions can be specified for all.
* Detailed Operations
* `install`: Installs the specified custom nodes.
* `reinstall`: Removes and then reinstalls the specified custom nodes.
* `uninstall`: Uninstalls the specified custom nodes.
* `update`: Updates the specified custom nodes.
* `disable`: Disables the specified custom nodes.
* `enable`: Enables the specified custom nodes.
* `fix`: Attempts to fix dependencies for the specified custom nodes.
### 4. Snapshot Management
* `python cm-cli.py save-snapshot [--output <snapshot .json/.yaml>]`: Saves the current snapshot.
* With `--output`, you can save a file in .yaml format to any specified path.
* `python cm-cli.py restore-snapshot <snapshot .json/.yaml>`: Restores to the specified snapshot.
* If a file exists at the snapshot path, that snapshot is loaded.
* If no file exists at the snapshot path, it is implicitly assumed to be in ComfyUI-Manager/snapshots.
* `--pip-non-url`: Restore for pip packages registered on PyPI.
* `--pip-non-local-url`: Restore for pip packages registered at web URLs.
* `--pip-local-url`: Restore for pip packages specified by local paths.
### 5. CLI Only Mode
You can set whether to use ComfyUI-Manager solely via CLI.
`cli-only-mode [enable|disable]`
* This mode can be used if you want to restrict the use of ComfyUI-Manager through the GUI for security or policy reasons.
* When CLI only mode is enabled, ComfyUI-Manager is loaded in a very restricted state, the internal web API is disabled, and the Manager button is not displayed in the main menu.
### 6. Dependency Restoration
`restore-dependencies`
* This command can be used if custom nodes are installed under the `ComfyUI/custom_nodes` path but their dependencies are not installed.
* It is useful when starting a new cloud instance, like colab, where dependencies need to be reinstalled and installation scripts re-executed.
* It can also be utilized if ComfyUI is reinstalled and only the custom_nodes path has been backed up and restored.
### 7. Clear
In the GUI, installations, updates, or snapshot restorations are scheduled to execute the next time ComfyUI is launched. The `clear` command clears this scheduled state, ensuring no pre-execution actions are applied.

149
docs/ko/cm-cli.md

@ -1,149 +0,0 @@
# `cm-cli`: ComfyUI-Manager CLI
`cm-cli` 는 ComfyUI를 실행시키지 않고 command line에서 ComfyUI-Manager의 여러가지 기능을 사용할 수 있도록 도와주는 도구입니다.
```
-= ComfyUI-Manager CLI (V2.24) =-
python cm-cli.py [OPTIONS]
OPTIONS:
[install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel <channel name>] ?[--mode [remote|local|cache]]
[update|disable|enable|fix] all ?[--channel <channel name>] ?[--mode [remote|local|cache]]
[simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel <channel name>] ?[--mode [remote|local|cache]]
save-snapshot ?[--output <snapshot .json/.yaml>]
restore-snapshot <snapshot .json/.yaml> ?[--pip-non-url] ?[--pip-non-local-url] ?[--pip-local-url]
cli-only-mode [enable|disable]
restore-dependencies
clear
```
## How To Use?
* `python cm-cli.py` 를 통해서 실행 시킬 수 있습니다.
* 예를 들어 custom node를 모두 업데이트 하고 싶다면
* ComfyUI-Manager경로 에서 `python cm-cli.py update all` 를 command를 실행할 수 있습니다.
* ComfyUI 경로에서 실행한다면, `python custom_nodes/ComfyUI-Manager/cm-cli.py update all` 와 같이 cm-cli.py 의 경로를 지정할 수도 있습니다.
## Prerequisite
* ComfyUI 를 실행하는 python과 동일한 python 환경에서 실행해야 합니다.
* venv를 사용할 경우 해당 venv를 activate 한 상태에서 실행해야 합니다.
* portable 버전을 사용할 경우 run_nvidia_gpu.bat 파일이 있는 경로인 경우, 다음과 같은 방식으로 코맨드를 실행해야 합니다.
`.\python_embeded\python.exe ComfyUI\custom_nodes\ComfyUI-Manager\cm-cli.py update all`
* ComfyUI 의 경로는 COMFYUI_PATH 환경 변수로 설정할 수 있습니다. 만약 생략할 경우 다음과 같은 경고 메시지가 나타나며, ComfyUI-Manager가 설치된 경로를 기준으로 상대 경로로 설정됩니다.
```
WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.
```
## Features
### 1. --channel, --mode
* 정보 보기 기능과 커스텀 노드 관리 기능의 경우는 --channel과 --mode를 통해 정보 DB를 설정할 수 있습니다.
* 예들 들어 `python cm-cli.py update all --channel recent --mode remote`와 같은 command를 실행할 경우, 현재 ComfyUI-Manager repo에 내장된 로컬의 정보가 아닌 remote의 최신 정보를 기준으로 동작하며, recent channel에 있는 목록을 대상으로만 동작합니다.
* --channel, --mode 는 `simple-show, show, install, uninstall, update, disable, enable, fix` command에서만 사용 가능합니다.
### 2. 관리 정보 보기
`[simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel <channel name>] ?[--mode [remote|local|cache]]`
* `[show|simple-show]` - `show`는 상세하게 정보를 보여주며, `simple-show`는 간단하게 정보를 보여줍니다.
`python cm-cli.py show installed` 와 같은 코맨드를 실행하면 설치된 커스텀 노드의 정보를 상세하게 보여줍니다.
```
-= ComfyUI-Manager CLI (V2.24) =-
FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
[ ENABLED ] ComfyUI-Manager (author: Dr.Lt.Data)
[ ENABLED ] ComfyUI-Impact-Pack (author: Dr.Lt.Data)
[ ENABLED ] ComfyUI-Inspire-Pack (author: Dr.Lt.Data)
[ ENABLED ] ComfyUI_experiments (author: comfyanonymous)
[ ENABLED ] ComfyUI-SAI_API (author: Stability-AI)
[ ENABLED ] stability-ComfyUI-nodes (author: Stability-AI)
[ ENABLED ] comfyui_controlnet_aux (author: Fannovel16)
[ ENABLED ] ComfyUI-Frame-Interpolation (author: Fannovel16)
[ DISABLED ] ComfyUI-Loopchain (author: Fannovel16)
```
`python cm-cli.py simple-show installed` 와 같은 코맨드를 이용해서 설치된 커스텀 노드의 정보를 간단하게 보여줍니다.
```
-= ComfyUI-Manager CLI (V2.24) =-
FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
ComfyUI-Manager
ComfyUI-Impact-Pack
ComfyUI-Inspire-Pack
ComfyUI_experiments
ComfyUI-SAI_API
stability-ComfyUI-nodes
comfyui_controlnet_aux
ComfyUI-Frame-Interpolation
ComfyUI-Loopchain
```
* `[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]`
* `enabled`, `disabled`: 설치된 커스텀 노드들 중 enable 되었거나, disable된 노드들을 보여줍니다.
* `installed`: enable, disable 여부와 상관없이 설치된 모든 노드를 보여줍니다
* `not-installed`: 설치되지 않은 커스텀 노드의 목록을 보여줍니다.
* `all`: 모든 커스텀 노드의 목록을 보여줍니다.
* `snapshot`: 현재 설치된 커스텀 노드의 snapshot 정보를 보여줍니다. `show`롤 통해서 볼 경우는 json 출력 형태로 보여주며, `simple-show`를 통해서 볼 경우는 간단하게, 커밋 해시와 함께 보여줍니다.
* `snapshot-list`: ComfyUI-Manager/snapshots 에 저장된 snapshot 파일의 목록을 보여줍니다.
### 3. 커스텀 노드 관리 하기
`[install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel <channel name>] ?[--mode [remote|local|cache]]`
* `python cm-cli.py install ComfyUI-Impact-Pack ComfyUI-Inspire-Pack ComfyUI_experiments` 와 같이 커스텀 노드의 이름을 나열해서 관리 기능을 적용할 수 있습니다.
* 커스텀 노드의 이름은 `show`를 했을 때 보여주는 이름이며, git repository의 이름입니다.
(추후 nickname 을 사용가능하돌고 업데이트 할 예정입니다.)
`[update|disable|enable|fix] all ?[--channel <channel name>] ?[--mode [remote|local|cache]]`
* `update, disable, enable, fix` 기능은 all 로 지정 가능합니다.
* 세부 동작
* `install`: 지정된 커스텀 노드들을 설치합니다
* `reinstall`: 지정된 커스텀 노드를 삭제하고 재설치 합니다.
* `uninstall`: 지정된 커스텀 노드들을 삭제합니다.
* `update`: 지정된 커스텀 노드들을 업데이트합니다.
* `disable`: 지정된 커스텀 노드들을 비활성화합니다.
* `enable`: 지정된 커스텀 노드들을 활성화합니다.
* `fix`: 지정된 커스텀 노드의 의존성을 고치기 위한 시도를 합니다.
### 4. 스냅샷 관리 기능
* `python cm-cli.py save-snapshot ?[--output <snapshot .json/.yaml>]`: 현재의 snapshot을 저장합니다.
* --output 으로 임의의 경로에 .yaml 파일과 format으로 저장할 수 있습니다.
* `python cm-cli.py restore-snapshot <snapshot .json/.yaml>`: 지정된 snapshot으로 복구합니다.
* snapshot 경로에 파일이 존재하는 경우 해당 snapshot을 로드합니다.
* snapshot 경로에 파일이 존재하지 않는 경우 묵시적으로, ComfyUI-Manager/snapshots 에 있다고 가정합니다.
* `--pip-non-url`: PyPI 에 등록된 pip 패키지들에 대해서 복구를 수행
* `--pip-non-local-url`: web URL에 등록된 pip 패키지들에 대해서 복구를 수행
* `--pip-local-url`: local 경로를 지정하고 있는 pip 패키지들에 대해서 복구를 수행
### 5. CLI only mode
ComfyUI-Manager를 CLI로만 사용할 것인지를 설정할 수 있습니다.
`cli-only-mode [enable|disable]`
* security 혹은 policy 의 이유로 GUI 를 통한 ComfyUI-Manager 사용을 제한하고 싶은 경우 이 모드를 사용할 수 있습니다.
* CLI only mode를 적용할 경우 ComfyUI-Manager 가 매우 제한된 상태로 로드되어, 내부적으로 제공하는 web API가 비활성화 되며, 메인 메뉴에서도 Manager 버튼이 표시되지 않습니다.
### 6. 의존성 설치
`restore-dependencies`
* `ComfyUI/custom_nodes` 하위 경로에 커스텀 노드들이 설치되어 있긴 하지만, 의존성이 설치되지 않은 경우 사용할 수 있습니다.
* colab 과 같이 cloud instance를 새로 시작하는 경우 의존성 재설치 및 설치 스크립트가 재실행 되어야 하는 경우 사용합니다.
* ComfyUI을 재설치할 경우, custom_nodes 경로만 백업했다가 재설치 할 경우 활용 가능합니다.
### 7. clear
GUI에서 install, update를 하거나 snapshot 을 restore하는 경우 예약을 통해서 다음번 ComfyUI를 실행할 경우 실행되는 구조입니다. `clear` 는 이런 예약 상태를 clear해서, 아무런 사전 실행이 적용되지 않도록 합니다.

2534
extension-node-map.json

File diff suppressed because it is too large Load Diff

151
git_helper.py

@ -1,13 +1,9 @@
import subprocess
import sys
import os
import traceback
import git
import configparser
import re
import json
import yaml
from torchvision.datasets.utils import download_url
from tqdm.auto import tqdm
from git.remote import RemoteProgress
@ -16,12 +12,6 @@ config_path = os.path.join(os.path.dirname(__file__), "config.ini")
nodelist_path = os.path.join(os.path.dirname(__file__), "custom-node-list.json")
working_directory = os.getcwd()
if os.path.basename(working_directory) != 'custom_nodes':
print(f"WARN: This script should be executed in custom_nodes dir")
print(f"DBG: INFO {working_directory}")
print(f"DBG: INFO {sys.argv}")
# exit(-1)
class GitProgress(RemoteProgress):
def __init__(self):
@ -142,7 +132,7 @@ def gitpull(path):
def checkout_comfyui_hash(target_hash):
repo_path = os.path.abspath(os.path.join(working_directory, '..')) # ComfyUI dir
repo_path = os.path.join(working_directory, '..') # ComfyUI dir
repo = git.Repo(repo_path)
commit_hash = repo.head.commit.hexsha
@ -186,32 +176,24 @@ def checkout_custom_node_hash(git_custom_node_infos):
if repo_name.endswith('.disabled'):
repo_name = repo_name[:-9]
if repo_name not in repo_name_to_url:
if not is_disabled:
# should be disabled
print(f"DISABLE: {repo_name}")
new_path = fullpath + ".disabled"
os.rename(fullpath, new_path)
need_checkout = False
item = git_custom_node_infos[repo_name_to_url[repo_name]]
if item['disabled'] and is_disabled:
pass
elif item['disabled'] and not is_disabled:
# disable
print(f"DISABLE: {repo_name}")
new_path = fullpath + ".disabled"
os.rename(fullpath, new_path)
pass
elif not item['disabled'] and is_disabled:
# enable
print(f"ENABLE: {repo_name}")
new_path = fullpath[:-9]
os.rename(fullpath, new_path)
fullpath = new_path
need_checkout = True
else:
item = git_custom_node_infos[repo_name_to_url[repo_name]]
if item['disabled'] and is_disabled:
pass
elif item['disabled'] and not is_disabled:
# disable
print(f"DISABLE: {repo_name}")
new_path = fullpath + ".disabled"
os.rename(fullpath, new_path)
elif not item['disabled'] and is_disabled:
# enable
print(f"ENABLE: {repo_name}")
new_path = fullpath[:-9]
os.rename(fullpath, new_path)
fullpath = new_path
need_checkout = True
else:
need_checkout = True
need_checkout = True
if need_checkout:
repo = git.Repo(fullpath)
@ -220,7 +202,6 @@ def checkout_custom_node_hash(git_custom_node_infos):
if commit_hash != item['hash']:
print(f"CHECKOUT: {repo_name} [{item['hash']}]")
repo.git.checkout(item['hash'])
except Exception:
print(f"Failed to restore snapshots for the custom node '{path}'")
@ -288,21 +269,8 @@ def apply_snapshot(target):
try:
path = os.path.join(os.path.dirname(__file__), 'snapshots', f"{target}")
if os.path.exists(path):
if not target.endswith('.json') and not target.endswith('.yaml'):
print(f"Snapshot file not found: `{path}`")
print("APPLY SNAPSHOT: False")
return None
with open(path, 'r', encoding="UTF-8") as snapshot_file:
if target.endswith('.json'):
info = json.load(snapshot_file)
elif target.endswith('.yaml'):
info = yaml.load(snapshot_file, Loader=yaml.SafeLoader)
info = info['custom_nodes']
else:
# impossible case
print("APPLY SNAPSHOT: False")
return None
with open(path, 'r', encoding="UTF-8") as json_file:
info = json.load(json_file)
comfyui_hash = info['comfyui']
git_custom_node_infos = info['git_custom_nodes']
@ -313,81 +281,14 @@ def apply_snapshot(target):
invalidate_custom_node_file(file_custom_node_infos)
print("APPLY SNAPSHOT: True")
if 'pips' in info:
return info['pips']
else:
return None
return
print(f"Snapshot file not found: `{path}`")
print("APPLY SNAPSHOT: False")
return None
except Exception as e:
print(e)
traceback.print_exc()
print("APPLY SNAPSHOT: False")
return None
def restore_pip_snapshot(pips, options):
non_url = []
local_url = []
non_local_url = []
for k, v in pips.items():
if v == "":
non_url.append(k)
else:
if v.startswith('file:'):
local_url.append(v)
else:
non_local_url.append(v)
failed = []
if '--pip-non-url' in options:
# try all at once
res = 1
try:
res = subprocess.check_call([sys.executable, '-m', 'pip', 'install'] + non_url)
except:
pass
# fallback
if res != 0:
for x in non_url:
res = 1
try:
res = subprocess.check_call([sys.executable, '-m', 'pip', 'install', x])
except:
pass
if res != 0:
failed.append(x)
if '--pip-non-local-url' in options:
for x in non_local_url:
res = 1
try:
res = subprocess.check_call([sys.executable, '-m', 'pip', 'install', x])
except:
pass
if res != 0:
failed.append(x)
if '--pip-local-url' in options:
for x in local_url:
res = 1
try:
res = subprocess.check_call([sys.executable, '-m', 'pip', 'install', x])
except:
pass
if res != 0:
failed.append(x)
print(f"Installation failed for pip packages: {failed}")
def setup_environment():
config = configparser.ConfigParser()
@ -409,15 +310,7 @@ try:
elif sys.argv[1] == "--pull":
gitpull(sys.argv[2])
elif sys.argv[1] == "--apply-snapshot":
options = set()
for x in sys.argv:
if x in ['--pip-non-url', '--pip-local-url', '--pip-non-local-url']:
options.add(x)
pips = apply_snapshot(sys.argv[2])
if pips and len(options) > 0:
restore_pip_snapshot(pips, options)
apply_snapshot(sys.argv[2])
sys.exit(0)
except Exception as e:
print(e)

4654
github-stats.json

File diff suppressed because it is too large Load Diff

1200
glob/manager_core.py

File diff suppressed because it is too large Load Diff

1679
glob/manager_server.py

File diff suppressed because it is too large Load Diff

2
js/a1111-alter-downloader.js

@ -56,7 +56,7 @@ export class AlternativesInstaller extends ComfyDialog {
let data2 = data1.custom_node;
if(!data2)
continue;
continue;
let content = data1.tags.toLowerCase() + data1.description.toLowerCase() + data2.author.toLowerCase() + data2.description.toLowerCase() + data2.title.toLowerCase();

11
js/cm-api.js

@ -41,18 +41,9 @@ async function tryInstallCustomNode(event) {
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(event.detail.target)
});
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
return false;
}
}
let response = await api.fetchApi("/manager/reboot");
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
return false;
}
api.fetchApi("/manager/reboot");
await sleep(300);

49
js/comfyui-manager.js vendored

@ -15,7 +15,7 @@ import { CustomNodesInstaller } from "./custom-nodes-downloader.js";
import { AlternativesInstaller } from "./a1111-alter-downloader.js";
import { SnapshotManager } from "./snapshot.js";
import { ModelInstaller } from "./model-downloader.js";
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models, show_message } from "./common.js";
import { manager_instance, setManagerInstance, install_via_git_url, install_pip, rebootAPI, free_models } from "./common.js";
import { ComponentBuilderDialog, load_components, set_component_policy, getPureName } from "./components-manager.js";
import { set_double_click_policy } from "./node_fixer.js";
@ -520,21 +520,25 @@ async function updateComfyUI() {
const response = await api.fetchApi('/comfyui_manager/update_comfyui');
if (response.status == 400) {
show_message('Failed to update ComfyUI.');
app.ui.dialog.show('Failed to update ComfyUI.');
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
if (response.status == 201) {
show_message('ComfyUI has been successfully updated.');
app.ui.dialog.show('ComfyUI has been successfully updated.');
app.ui.dialog.element.style.zIndex = 10010;
}
else {
show_message('ComfyUI is already up to date with the latest version.');
app.ui.dialog.show('ComfyUI is already up to date with the latest version.');
app.ui.dialog.element.style.zIndex = 10010;
}
return true;
}
catch (exception) {
show_message(`Failed to update ComfyUI / ${exception}`);
app.ui.dialog.show(`Failed to update ComfyUI / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {
@ -556,12 +560,13 @@ async function fetchUpdates(update_check_checkbox) {
const response = await api.fetchApi(`/customnode/fetch_updates?mode=${mode}`);
if (response.status != 200 && response.status != 201) {
show_message('Failed to fetch updates.');
app.ui.dialog.show('Failed to fetch updates.');
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
if (response.status == 201) {
show_message("There is an updated extension available.<BR><BR><P><B>NOTE:<BR>Fetch Updates is not an update.<BR>Please update from <button id='cm-install-customnodes-button'>Install Custom Nodes</button> </B></P>");
app.ui.dialog.show("There is an updated extension available.<BR><BR><P><B>NOTE:<BR>Fetch Updates is not an update.<BR>Please update from <button id='cm-install-customnodes-button'>Install Custom Nodes</button> </B></P>");
const button = document.getElementById('cm-install-customnodes-button');
button.addEventListener("click",
@ -575,16 +580,19 @@ async function fetchUpdates(update_check_checkbox) {
}
);
app.ui.dialog.element.style.zIndex = 10010;
update_check_checkbox.checked = false;
}
else {
show_message('All extensions are already up-to-date with the latest versions.');
app.ui.dialog.show('All extensions are already up-to-date with the latest versions.');
app.ui.dialog.element.style.zIndex = 10010;
}
return true;
}
catch (exception) {
show_message(`Failed to update custom nodes / ${exception}`);
app.ui.dialog.show(`Failed to update custom nodes / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {
@ -607,16 +615,11 @@ async function updateAll(update_check_checkbox, manager_dialog) {
const response1 = await api.fetchApi('/comfyui_manager/update_comfyui');
const response2 = await api.fetchApi(`/customnode/update_all?mode=${mode}`);
if (response2.status == 403) {
show_message('This action is not allowed with this security level configuration.');
if (response1.status != 200 && response2.status != 201) {
app.ui.dialog.show('Failed to update ComfyUI or several extensions.<BR><BR>See terminal log.<BR>');
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
if (response1.status == 400 || response2.status == 400) {
show_message('Failed to update ComfyUI or several extensions.<BR><BR>See terminal log.<BR>');
return false;
}
if(response1.status == 201 || response2.status == 201) {
const update_info = await response2.json();
@ -630,7 +633,7 @@ async function updateAll(update_check_checkbox, manager_dialog) {
updated_list = "<BR>UPDATED: "+update_info.updated.join(", ");
}
show_message(
app.ui.dialog.show(
"ComfyUI and all extensions have been updated to the latest version.<BR>To apply the updated custom node, please <button class='cm-small-button' id='cm-reboot-button5'>RESTART</button> ComfyUI. And refresh browser.<BR>"
+failed_list
+updated_list
@ -643,15 +646,19 @@ async function updateAll(update_check_checkbox, manager_dialog) {
manager_dialog.close();
}
});
app.ui.dialog.element.style.zIndex = 10010;
}
else {
show_message('ComfyUI and all extensions are already up-to-date with the latest versions.');
app.ui.dialog.show('ComfyUI and all extensions are already up-to-date with the latest versions.');
app.ui.dialog.element.style.zIndex = 10010;
}
return true;
}
catch (exception) {
show_message(`Failed to update ComfyUI or several extensions / ${exception}`);
app.ui.dialog.show(`Failed to update ComfyUI or several extensions / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {
@ -918,7 +925,7 @@ class ManagerMenuDialog extends ComfyDialog {
});
let dbl_click_policy_combo = document.createElement("select");
dbl_click_policy_combo.setAttribute("title", "Sets the behavior when you double-click the title area of a node.");
dbl_click_policy_combo.setAttribute("title", "When loading the workflow, configure which version of the component to use.");
dbl_click_policy_combo.className = "cm-menu-combo";
dbl_click_policy_combo.appendChild($el('option', { value: 'none', text: 'Double-Click: None' }, []));
dbl_click_policy_combo.appendChild($el('option', { value: 'copy-all', text: 'Double-Click: Copy All Connections' }, []));

4
js/comfyui-share-openart.js vendored

@ -481,6 +481,10 @@ export class OpenArtShareDialog extends ComfyDialog {
if (this.uploadImagesInput.files.length === 0) {
throw new Error("No thumbnail uploaded");
}
if (this.uploadImagesInput.files.length === 0) {
throw new Error("No thumbnail uploaded");
}
}
}

71
js/common.js

@ -1,11 +1,6 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js";
export function show_message(msg) {
app.ui.dialog.show(msg);
app.ui.dialog.element.style.zIndex = 10010;
}
export async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
@ -52,20 +47,6 @@ export async function install_checked_custom_node(grid_rows, target_i, caller, m
body: JSON.stringify(target)
});
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
caller.updateMessage('');
await caller.invalidateControl();
return;
}
if(response.status == 404) {
show_message('With the current security level configuration, only custom nodes from the <B>"default channel"</B> can be installed.');
caller.updateMessage('');
await caller.invalidateControl();
return;
}
if(response.status == 400) {
show_message(`${mode} failed: ${target.title}`);
continue;
@ -108,26 +89,21 @@ export async function install_pip(packages) {
if(packages.includes('&'))
app.ui.dialog.show(`Invalid PIP package enumeration: '${packages}'`);
const res = await api.fetchApi("/customnode/install/pip", {
method: "POST",
body: packages,
});
if(res.status == 403) {
show_message('This action is not allowed with this security level configuration.');
return;
}
const res = await api.fetchApi(`/customnode/install/pip?packages=${packages}`);
if(res.status == 200) {
show_message(`PIP package installation is processed.<br>To apply the pip packages, please click the <button id='cm-reboot-button3'><font size='3px'>RESTART</font></button> button in ComfyUI.`);
app.ui.dialog.show(`PIP package installation is processed.<br>To apply the pip packages, please click the <button id='cm-reboot-button3'><font size='3px'>RESTART</font></button> button in ComfyUI.`);
const rebootButton = document.getElementById('cm-reboot-button3');
const self = this;
rebootButton.addEventListener("click", rebootAPI);
app.ui.dialog.element.style.zIndex = 10010;
}
else {
show_message(`Failed to install '${packages}'<BR>See terminal log.`);
app.ui.dialog.show(`Failed to install '${packages}'<BR>See terminal log.`);
app.ui.dialog.element.style.zIndex = 10010;
}
}
@ -137,24 +113,18 @@ export async function install_via_git_url(url, manager_dialog) {
}
if(!isValidURL(url)) {
show_message(`Invalid Git url '${url}'`);
app.ui.dialog.show(`Invalid Git url '${url}'`);
app.ui.dialog.element.style.zIndex = 10010;
return;
}
show_message(`Wait...<BR><BR>Installing '${url}'`);
const res = await api.fetchApi("/customnode/install/git_url", {
method: "POST",
body: url,
});
app.ui.dialog.show(`Wait...<BR><BR>Installing '${url}'`);
app.ui.dialog.element.style.zIndex = 10010;
if(res.status == 403) {
show_message('This action is not allowed with this security level configuration.');
return;
}
const res = await api.fetchApi(`/customnode/install/git_url?url=${url}`);
if(res.status == 200) {
show_message(`'${url}' is installed<BR>To apply the installed custom node, please <button id='cm-reboot-button4'><font size='3px'>RESTART</font></button> ComfyUI.`);
app.ui.dialog.show(`'${url}' is installed<BR>To apply the installed custom node, please <button id='cm-reboot-button4'><font size='3px'>RESTART</font></button> ComfyUI.`);
const rebootButton = document.getElementById('cm-reboot-button4');
const self = this;
@ -165,9 +135,12 @@ export async function install_via_git_url(url, manager_dialog) {
manager_dialog.close();
}
});
app.ui.dialog.element.style.zIndex = 10010;
}
else {
show_message(`Failed to install '${url}'<BR>See terminal log.`);
app.ui.dialog.show(`Failed to install '${url}'<BR>See terminal log.`);
app.ui.dialog.element.style.zIndex = 10010;
}
}
@ -175,13 +148,19 @@ export async function free_models() {
let res = await api.fetchApi(`/free`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: '{"unload_models": true}'
body: '{}'
});
if(res.status == 200) {
show_message('Models have been unloaded.')
app.ui.dialog.show('Models have been unloaded.')
}
else {
show_message('Unloading of models failed.<BR><BR>Installed ComfyUI may be an outdated version.')
app.ui.dialog.show('Unloading of models failed.<BR><BR>Installed ComfyUI may be an outdated version.')
}
app.ui.dialog.element.style.zIndex = 10010;
}
export function show_message(msg) {
app.ui.dialog.show(msg);
app.ui.dialog.element.style.zIndex = 10010;
}

5
js/model-downloader.js

@ -1,7 +1,7 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { install_checked_custom_node, manager_instance, rebootAPI, show_message } from "./common.js";
import { install_checked_custom_node, manager_instance, rebootAPI } from "./common.js";
async function install_model(target) {
if(ModelInstaller.instance) {
@ -20,7 +20,8 @@ async function install_model(target) {
return true;
}
catch(exception) {
show_message(`Install failed: ${target.title} / ${exception}`);
app.ui.dialog.show(`Install failed: ${target.title} / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {

29
js/snapshot.js

@ -1,28 +1,24 @@
import { app } from "../../scripts/app.js";
import { api } from "../../scripts/api.js"
import { ComfyDialog, $el } from "../../scripts/ui.js";
import { manager_instance, rebootAPI, show_message } from "./common.js";
import { manager_instance, rebootAPI } from "./common.js";
async function restore_snapshot(target) {
if(SnapshotManager.instance) {
try {
const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" });
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
return false;
}
if(response.status == 400) {
show_message(`Restore snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.show(`Restore snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
}
app.ui.dialog.close();
return true;
}
catch(exception) {
show_message(`Restore snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.show(`Restore snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {
@ -36,21 +32,17 @@ async function remove_snapshot(target) {
if(SnapshotManager.instance) {
try {
const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" });
if(response.status == 403) {
show_message('This action is not allowed with this security level configuration.');
return false;
}
if(response.status == 400) {
show_message(`Remove snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.show(`Remove snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
}
app.ui.dialog.close();
return true;
}
catch(exception) {
show_message(`Restore snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.show(`Restore snapshot failed: ${target.title} / ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {
@ -66,7 +58,8 @@ async function save_current_snapshot() {
return true;
}
catch(exception) {
show_message(`Backup snapshot failed: ${exception}`);
app.ui.dialog.show(`Backup snapshot failed: ${exception}`);
app.ui.dialog.element.style.zIndex = 10010;
return false;
}
finally {

252
model-list.json

@ -1778,24 +1778,24 @@
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15.safetensors"
},
{
"name": "ip-adapter_sd15_light_v11.bin",
"name": "ip-adapter_sd15_light.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15_light_v11.bin",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light_v11.bin"
"filename": "ip-adapter_sd15_light.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light.safetensors"
},
{
"name": "ip-adapter_sd15_light.safetensors [DEPRECATED]",
"name": "ip-adapter_sd15_vit-G.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15_light.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light.safetensors"
"filename": "ip-adapter_sd15_vit-G.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_vit-G.safetensors"
},
{
"name": "ip-adapter-plus_sd15.safetensors",
@ -1827,16 +1827,6 @@
"filename": "ip-adapter-full-face_sd15.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-full-face_sd15.safetensors"
},
{
"name": "ip-adapter_sd15_vit-G.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15_vit-G.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_vit-G.safetensors"
},
{
"name": "ip-adapter-faceid_sd15.bin",
"type": "IP-Adapter",
@ -1848,17 +1838,7 @@
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15.bin"
},
{
"name": "ip-adapter-faceid-plusv2_sd15.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Plus V2 Model (SD1.5) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-plusv2_sd15.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin"
},
{
"name": "ip-adapter-faceid-plus_sd15.bin [DEPRECATED]",
"name": "ip-adapter-faceid-plus_sd15.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
@ -1868,17 +1848,7 @@
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15.bin"
},
{
"name": "ip-adapter-faceid-portrait-v11_sd15.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Portrait V11 Model (SD1.5) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-portrait-v11_sd15.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait-v11_sd15.bin"
},
{
"name": "ip-adapter-faceid-portrait_sd15.bin [DEPRECATED]",
"name": "ip-adapter-faceid-portrait_sd15.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
@ -1907,26 +1877,6 @@
"filename": "ip-adapter-faceid-plusv2_sdxl.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl.bin"
},
{
"name": "ip-adapter-faceid-portrait_sdxl.bin",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Portrait Model (SDXL) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-portrait_sdxl.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl.bin"
},
{
"name": "ip-adapter-faceid-portrait_sdxl_unnorm.bin",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Portrait Model (SDXL/unnorm) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-portrait_sdxl_unnorm.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl_unnorm.bin"
},
{
"name": "ip-adapter-faceid_sd15_lora.safetensors",
"type": "lora",
@ -1938,7 +1888,7 @@
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15_lora.safetensors"
},
{
"name": "ip-adapter-faceid-plus_sd15_lora.safetensors [DEPRECATED]",
"name": "ip-adapter-faceid-plus_sd15_lora.safetensors",
"type": "lora",
"base": "SD1.5",
"save_path": "loras/ipadapter",
@ -1947,6 +1897,16 @@
"filename": "ip-adapter-faceid-plus_sd15_lora.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors"
},
{
"name": "ip-adapter-faceid-plusv2_sd15.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID-Plus V2 Model (SD1.5) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-plusv2_sd15.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin"
},
{
"name": "ip-adapter-faceid-plusv2_sd15_lora.safetensors",
"type": "lora",
@ -1977,7 +1937,6 @@
"filename": "ip-adapter-faceid-plusv2_sdxl_lora.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl_lora.safetensors"
},
{
"name": "ip-adapter_sdxl.safetensors",
"type": "IP-Adapter",
@ -2019,27 +1978,6 @@
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus-face_sdxl_vit-h.safetensors"
},
{
"name": "ip_plus_composition_sd15.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/ostris/ip-composition-adapter",
"filename": "ip_plus_composition_sd15.safetensors",
"url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sd15.safetensors"
},
{
"name": "ip_plus_composition_sdxl.safetensors",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/ostris/ip-composition-adapter",
"filename": "ip_plus_composition_sdxl.safetensors",
"url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sdxl.safetensors"
},
{
"name": "pfg-novel-n10.pt",
"type": "PFG",
@ -2462,26 +2400,6 @@
"filename": "SUPIR-v0Q.ckpt",
"url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0Q.ckpt"
},
{
"name": "Kijai/SUPIR-v0F_fp16.safetensors (pruned)",
"type": "checkpoints",
"base": "SUPIR",
"save_path": "checkpoints/SUPIR",
"description": "SUPIR checkpoint model",
"reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main",
"filename": "SUPIR-v0F_fp16.safetensors",
"url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0F_fp16.safetensors"
},
{
"name": "Kijai/SUPIR-v0Q_fp16.safetensors (pruned)",
"type": "checkpoints",
"base": "SUPIR",
"save_path": "checkpoints/SUPIR",
"description": "SUPIR checkpoint model",
"reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main",
"filename": "SUPIR-v0Q_fp16.safetensors",
"url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0Q_fp16.safetensors"
},
{
"name": "RAM",
"type": "RAM",
@ -2511,138 +2429,6 @@
"reference": "https://huggingface.co/xinyu1205/recognize_anything_model",
"filename": "tag2text_swin_14m.pth",
"url": "https://huggingface.co/xinyu1205/recognize_anything_model/resolve/main/tag2text_swin_14m.pth"
},
{
"name": "Zero123 3D object Model",
"type": "Zero123",
"base": "Zero123",
"save_path": "checkpoints/zero123",
"description": "model that been trained on 10M+ 3D objects from Objaverse-XL, used for generated rotated CamView",
"reference": "https://objaverse.allenai.org/docs/zero123-xl/",
"filename": "zero123-xl.ckpt",
"url": "https://huggingface.co/kealiu/zero123-xl/resolve/main/zero123-xl.ckpt"
},
{
"name": "Zero123 3D object Model",
"type": "Zero123",
"base": "Zero123",
"save_path": "checkpoints/zero123",
"description": "Stable Zero123 is a model for view-conditioned image generation based on [a/Zero123](https://github.com/cvlab-columbia/zero123).",
"reference": "https://huggingface.co/stabilityai/stable-zero123",
"filename": "stable_zero123.ckpt",
"url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt"
},
{
"name": "Zero123 3D object Model",
"type": "Zero123",
"base": "Zero123",
"save_path": "checkpoints/zero123",
"description": "Zero123 original checkpoints in 105000 steps.",
"reference": "https://huggingface.co/cvlab/zero123-weights",
"filename": "zero123-105000.ckpt",
"url": "https://huggingface.co/cvlab/zero123-weights/resolve/main/105000.ckpt"
},
{
"name": "Zero123 3D object Model",
"type": "Zero123",
"base": "Zero123",
"save_path": "checkpoints/zero123",
"description": "Zero123 original checkpoints in 165000 steps.",
"reference": "https://huggingface.co/cvlab/zero123-weights",
"filename": "zero123-165000.ckpt",
"url": "https://huggingface.co/cvlab/zero123-weights/resolve/main/165000.ckpt"
},
{
"name": "InstantID/ip-adapter",
"type": "instantid",
"base": "SDXL",
"save_path": "instantid/SDXL",
"description": "ip-adapter model for cubiq/InstantID",
"reference": "https://huggingface.co/InstantX/InstantID",
"filename": "ip-adapter.bin",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin"
},
{
"name": "InstantID/ControlNet",
"type": "controlnet",
"base": "SDXL",
"save_path": "controlnet/SDXL/instantid",
"description": "instantid controlnet model for cubiq/InstantID",
"reference": "https://huggingface.co/InstantX/InstantID",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors"
},
{
"name": "MonsterMMORPG/insightface (for InstantID)",
"type": "insightface",
"base": "SDXL",
"save_path": "insightface/models",
"description": "MonsterMMORPG insightface model for cubiq/InstantID",
"reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main",
"filename": "antelopev2.zip",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip"
},
{
"name": "IC-Light/fc",
"type": "IC-Light",
"base": "SD1.5",
"save_path": "unet/IC-Light",
"description": "The default relighting model, conditioned on text and foreground",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fc.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors"
},
{
"name": "IC-Light/fbc",
"type": "IC-Light",
"base": "SD1.5",
"save_path": "unet/IC-Light",
"description": "Relighting model conditioned with text, foreground, and background",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fbc.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors"
},
{
"name": "IC-Light/fcon",
"type": "IC-Light",
"base": "SD1.5",
"save_path": "unet/IC-Light",
"description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fcon.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors"
},
{
"name": "ID-Animator/animator.ckpt",
"type": "ID-Animator",
"base": "SD1.5",
"save_path": "custom_nodes/ComfyUI_ID_Animator/models",
"description": "ID-Animator checkpoint",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "animator.ckpt",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt"
},
{
"name": "ID-Animator/mm_sd_v15_v2.ckpt",
"type": "ID-Animator",
"base": "SD1.5",
"save_path": "custom_nodes/ComfyUI_ID_Animator/models/animatediff_models",
"description": "AnimateDiff checkpoint for ID-Animator",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "mm_sd_v15_v2.ckpt",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt"
},
{
"name": "ID-Animator/image_encoder",
"type": "ID-Animator",
"base": "SD1.5",
"save_path": "custom_nodes/ComfyUI_ID_Animator/models/image_encoder",
"description": "CLIP Image encoder for ID-Animator",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "model.safetensors",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors"
}
]
}

331
node_db/dev/custom-node-list.json

@ -8,294 +8,9 @@
"install_type": "git-clone",
"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": "Quasimondo",
"title": "ComfyUI-QuasimondoNodes [WIP]",
"id": "quasimondo-nodes",
"reference": "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes",
"files": [
"https://github.com/Quasimondo/ComfyUI-QuasimondoNodes"
],
"install_type": "git-clone",
"description": "Nodes:Custom Shader, Spring Mesh"
},
{
"author": "TSFSean",
"title": "ComfyUI-TSFNodes",
"id": "tsfnodes",
"reference": "https://github.com/TSFSean/ComfyUI-TSFNodes",
"files": [
"https://github.com/TSFSean/ComfyUI-TSFNodes"
],
"install_type": "git-clone",
"description": "Nodes:GyroOSC"
},
{
"author": "blib-la",
"title": "ComfyUI-Captain-Extensions",
"id": "captain",
"reference": "https://github.com/blib-la/ComfyUI-Captain-Extensions",
"files": [
"https://github.com/blib-la/ComfyUI-Captain-Extensions"
],
"install_type": "git-clone",
"description": "ComfyUI extensions for better [a/Captain](https://github.com/blib-la/captain) integration."
},
{
"author": "ejektaflex",
"title": "ComfyUI-Ty",
"reference": "https://github.com/ejektaflex/ComfyUI-Ty",
"files": [
"https://github.com/ejektaflex/ComfyUI-Ty"
],
"install_type": "git-clone",
"description": "Nodes:Lora Block Weight Regex Loader"
},
{
"author": "88IO",
"title": "ComfyUI Image Reordering Plugins [WIP]",
"reference": "https://github.com/88IO/ComfyUI-ImageReorder",
"files": [
"https://github.com/88IO/ComfyUI-ImageReorder"
],
"install_type": "git-clone",
"description": "A custom node reorder multiple image frames based on indexes or curves."
},
{
"author": "christian-byrne",
"title": "Python Interpreter ComfyUI Node [UNSAFE]",
"reference": "https://github.com/christian-byrne/python-interpreter-node",
"files": [
"https://github.com/christian-byrne/python-interpreter-node"
],
"install_type": "git-clone",
"description": "For debugging, parsing data, generating random values, converting types, testing custom nodes faster.\nReference and use variables in the code using the same names as the inputs in the UI\nWrapper class around tensors with operator overloading for doing common image manipulation tasks.I might remove this aspect\n[w/This extension allows you to run programs through Python code in your workflow, which may not be secure. Use with caution.]"
},
{
"author": "sofakid",
"title": "dandy [UNSAFE]",
"reference": "https://github.com/sofakid/dandy",
"files": [
"https://github.com/sofakid/dandy"
],
"install_type": "git-clone",
"description": "Dandy is a JavaScript bridge for ComfyUI. It includes everything you need to make JavaScript enabled extensions, or just load and code in little editor nodes right in ComfyUI.[w/This code can cause security issues because it allows for the execution of arbitrary JavaScript input.]"
},
{
"author": "tachyon-beep",
"title": "comfyui-simplefeed [UNSAFE]",
"reference": "https://github.com/tachyon-beep/comfyui-simplefeed",
"files": [
"https://github.com/tachyon-beep/comfyui-simplefeed"
],
"install_type": "git-clone",
"description": "A simple image feed for comfyUI which is easily configurable and easily extensible.\nUse the filter button to select which nodes write to the feed. Under settings, there are options that allow you: Position the feed. Set a max iamge count for the feed. Set oldest to newest or newest to oldest."
},
{
"author": "liusida",
"title": "ComfyUI-Sida-Remove-Image [UNSAFE]",
"reference": "https://github.com/liusida/ComfyUI-Sida-Remove-Image",
"files": [
"https://github.com/liusida/ComfyUI-Sida-Remove-Image"
],
"install_type": "git-clone",
"description": "Nodes: LoadImageWithPrivacy, RemoveImage.[w/This extension is not secure because it provides the capability to delete files from arbitrary paths.]"
},
{
"author": "shadowcz007",
"title": "ComfyUI-PuLID [TEST]",
"reference": "https://github.com/shadowcz007/ComfyUI-PuLID-Test",
"files": [
"https://github.com/shadowcz007/ComfyUI-PuLID-Test"
],
"install_type": "git-clone",
"description": "[a/PuLID](https://github.com/ToTheBeginning/PuLID) ComfyUI native implementation."
},
{
"author": "sangeet",
"title": "comfyui-testui [TEST]",
"reference": "https://github.com/sangeet/comfyui-testui",
"files": [
"https://github.com/sangeet/comfyui-testui"
],
"install_type": "git-clone",
"description": "Simple Frontend For ComfyUI workflow"
},
{
"author": "Elawphant",
"title": "ComfyUI-MusicGen [WIP]",
"id": "musicgen",
"reference": "https://github.com/Elawphant/ComfyUI-MusicGen",
"files": [
"https://github.com/Elawphant/ComfyUI-MusicGen"
],
"install_type": "git-clone",
"description": "ComfyUI for Meta MusicGen."
},
{
"author": "jtscmw01",
"title": "ComfyUI-DiffBIR",
"id": "diffbir",
"reference": "https://github.com/jtscmw01/ComfyUI-DiffBIR",
"files": [
"https://github.com/jtscmw01/ComfyUI-DiffBIR"
],
"install_type": "git-clone",
"description": "This extension provides [a/DiffBIR](https://github.com/XPixelGroup/DiffBIR) feature."
},
{
"author": "Levy1417",
"title": "Universal-Data-Processing-Kit [UNSAFE]",
"reference": "https://github.com/Levy1417/Universal-Data-Processing-Kit",
"files": [
"https://github.com/Levy1417/Universal-Data-Processing-Kit"
],
"install_type": "git-clone",
"description": "Nodes:DPK - Any Eval, DPK - Extract Array, DPK - Run External Program, DPK - Any Literals, DPK - Set Node States, DPK - Realtime Text Preview, DPK - Dynamic Action, DPK - Object To Json, DPK - Json To Object\n[w/This extension includes the ability to execute arbitrary code and programs.]"
},
{
"author": "runtime44",
"title": "Runtime44 ComfyUI Nodes",
"reference": "https://github.com/runtime44/comfyui_r44_nodes",
"files": [
"https://github.com/runtime44/comfyui_r44_nodes"
],
"install_type": "git-clone",
"description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance"
},
{
"author": "ericbeyer",
"title": "guidance_interval",
"reference": "https://github.com/ericbeyer/guidance_interval",
"files": [
"https://github.com/ericbeyer/guidance_interval"
],
"install_type": "git-clone",
"description": "Nodes:Guidance Interval\nNOTE: Because the sampling function is replaced, you must restart after executing this custom node to restore the original state."
},
{
"author": "GraftingRayman",
"title": "ComfyUI-GR",
"reference": "https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector",
"files": [
"https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector"
],
"install_type": "git-clone",
"description": "Nodes:GR Prompt Selector"
},
{
"author": "oztrkoguz",
"title": "Kosmos2_BBox_Cutter Models",
"reference": "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter",
"files": [
"https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter"
],
"install_type": "git-clone",
"description": "Nodes:KosmosLoader, Kosmos2SamplerSimple, Write"
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-PuLID-ZHO [WIP]",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/PuLID](https://github.com/ToTheBeginning/PuLID)(diffusers) for ComfyUI"
},
{
"author": "longgui0318",
"title": "comfyui-one-more-step [WIP]",
"reference": "https://github.com/longgui0318/comfyui-one-more-step",
"files": [
"https://github.com/longgui0318/comfyui-one-more-step"
],
"install_type": "git-clone",
"description": "[a/(OMS)mhh0318/OneMoreStep](https://github.com/mhh0318/OneMoreStep) comfyui support ."
},
{
"author": "unknown",
"title": "CLIPTextEncodeAndEnhancev4 (shirazdesigner)",
"reference": "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4",
"files": [
"https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4"
],
"install_type": "git-clone",
"description": "Nodes:CLIPTextEncodeAndEnhance.\nNOTE:Translation:This is a wrapper that simply makes it easy to install an existing node via git."
},
{
"author": "umisetokikaze",
"title": "comfyui_mergekit [WIP]",
"reference": "https://github.com/umisetokikaze/comfyui_mergekit",
"files": [
"https://github.com/umisetokikaze/comfyui_mergekit"
],
"install_type": "git-clone",
"description": "Nodes:DefineSaveName, SetModels, get_skip, LoadLR, LoadTarget, SetTokenizer, Merge, SetLayer, SetModels"
},
{
"author": "Video3DGenResearch",
"title": "ComfyUI Batch Input Node",
"reference": "https://github.com/Video3DGenResearch/comfyui-batch-input-node",
"files": [
"https://github.com/Video3DGenResearch/comfyui-batch-input-node"
],
"install_type": "git-clone",
"description": "Nodes:BatchInputText"
},
{
"author": "kijai",
"title": "ComfyUI nodes to use DeepSeek-VL",
"reference": "https://github.com/kijai/ComfyUI-DeepSeek-VL",
"files": [
"https://github.com/kijai/ComfyUI-DeepSeek-VL"
],
"install_type": "git-clone",
"description": "[a/https://huggingface.co/deepseek-ai](https://huggingface.co/deepseek-ai)"
},
{
"author": "GentlemanHu",
"title": "ComfyUI-Notifier",
"reference": "https://github.com/GentlemanHu/ComfyUI-Notifier",
"files": [
"https://github.com/GentlemanHu/ComfyUI-Notifier"
],
"install_type": "git-clone",
"description": "Nodes:GentlemanHu_Notifier"
},
{
"author": "nat-chan",
"title": "comfyui-in-memory-transceiver",
"reference": "https://github.com/nat-chan/comfyui-in-memory-transceiver",
"files": [
"https://github.com/nat-chan/comfyui-in-memory-transceiver"
],
"install_type": "git-clone",
"description": "Why? When processing a large number of requests, the SaveImage and LoadImage nodes may be IO-limited, and using shared memory improves performance by passing images only through memory access, not through IO."
},
{
"author": "DrMWeigand",
"title": "ComfyUI_LineBreakInserter",
"reference": "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter",
"files": [
"https://github.com/DrMWeigand/ComfyUI_LineBreakInserter"
],
"install_type": "git-clone",
"description": "Nodes:Line Break Inserter"
},
{
"author": "WilliamStanford",
"title": "visuallabs_comfyui_nodes",
"reference": "https://github.com/WilliamStanford/visuallabs_comfyui_nodes",
"files": [
"https://github.com/WilliamStanford/visuallabs_comfyui_nodes"
],
"install_type": "git-clone",
"description": "Nodes:PointStringFromFloatArray"
},
{
"author": "bruce007lee",
"title": "comfyui-cleaner",
@ -336,6 +51,16 @@
"install_type": "git-clone",
"description": "Nodes:sound voice, text concat, latent to list, movie generate, movie batch, hy save image, generate story"
},
{
"author": "liusida",
"title": "ComfyUI-Login",
"reference": "https://github.com/liusida/ComfyUI-Login",
"files": [
"https://github.com/liusida/ComfyUI-Login"
],
"install_type": "git-clone",
"description": "This custom node serves as a proof-of-concept to explore the implementation of basic login functionality for ComfyUI.\nNOTE:In the future, if proven useful, this feature might be directly integrated into either ComfyUI or ComfyUI-Manager."
},
{
"author": "gameltb",
"title": "io_comfyui",
@ -416,6 +141,16 @@
"install_type": "git-clone",
"description": "Nodes:Aspect Size. Drift Johnsons Custom nodes for ComfyUI"
},
{
"author": "birnam",
"title": "Gen Data Tester",
"reference": "https://github.com/birnam/ComfyUI-GenData-Pack",
"files": [
"https://github.com/birnam/ComfyUI-GenData-Pack"
],
"install_type": "git-clone",
"description": "This answers the itch for being able to easily paste CivitAI.com generated data (or other simple metadata) into Comfy in a way that makes it easy to test with multiple checkpoints."
},
{
"author": "stavsap",
"title": "ComfyUI Ollama [WIP]",
@ -636,6 +371,16 @@
"install_type": "git-clone",
"description": "Nodes:Musicgen"
},
{
"author": "Extraltodeus",
"title": "ComfyUI-variableCFGandAntiBurn [WIP]",
"reference": "https://github.com/Extraltodeus/ComfyUI-variableCFGandAntiBurn",
"files": [
"https://github.com/Extraltodeus/ComfyUI-variableCFGandAntiBurn"
],
"install_type": "git-clone",
"description": "Nodes:Continuous CFG rescaler (pre CFG), Intermediary latent merge (post CFG), Intensity/Brightness limiter (post CFG), Dynamic renoising (post CFG), Automatic CFG scale (pre/post CFG), CFG multiplier per channel (pre CFG), Self-Attention Guidance delayed activation mod (post CFG)"
},
{
"author": "shadowcz007",
"title": "comfyui-CLIPSeg",
@ -786,6 +531,16 @@
"install_type": "git-clone",
"description": "I was looking for a node to put in place to ensure my prompt etc where going as expected before the rest of the flow executed. To end the session, I just return the input image as None (see expected error). Recommend using it alongside PreviewImage, then output to the rest of the flow and Save Image."
},
{
"author": "11cafe",
"title": "11cafe/ComfyUI Model Manager [WIP]",
"reference": "https://github.com/11cafe/model-manager-comfyui",
"files": [
"https://github.com/11cafe/model-manager-comfyui"
],
"install_type": "git-clone",
"description": "This answers the itch for being able to easily paste [a/CivitAI.com](CivitAI.com) generated data (or other simple metadata) into Comfy in a way that makes it easy to test with multiple checkpoints."
},
{
"author": "birnam",
"title": "Gen Data Tester [WIP]",
@ -794,11 +549,11 @@
"https://github.com/birnam/ComfyUI-GenData-Pack"
],
"install_type": "git-clone",
"description": "This answers the itch for being able to easily paste [a/CivitAI.com](https://civitai.com/) generated data (or other simple metadata) into Comfy in a way that makes it easy to test with multiple checkpoints."
"description": "This answers the itch for being able to easily paste [a/CivitAI.com](CivitAI.com) generated data (or other simple metadata) into Comfy in a way that makes it easy to test with multiple checkpoints."
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-AnyText [WIP]",
"title": "ComfyUI-AnyText(WIP)",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText"

537
node_db/dev/extension-node-map.json

@ -146,49 +146,6 @@
"title_aux": "ComfyUI_Fooocus"
}
],
"https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": [
[
"\u2b1b(TODO)AC_Super_Come_Ckpt",
"\u2b1c(TODO)AC_Super_Come_Lora",
"\u2b55AC_FUN_SUPER_LARGE",
"\ud83c\ude35AC_Super_Checkpoint",
"\ud83c\ude35AC_Super_Loras",
"\ud83c\udfabAC_Super_PreviewImage",
"\ud83c\udfb0AC_Super_Controlnet",
"\ud83d\udcb6AC_Super_EmptLatent",
"\ud83d\udcbcAC_Super_Lora&LCM",
"\ud83d\udcbeAC_Super_SaveImage",
"\ud83d\udcc4AC_Super_CLIPEN",
"\ud83d\udcc8AC_Super_UpKSampler",
"\ud83d\udcdfAC_Super_CKPT&LCM",
"\ud83d\ude80AC_Super_KSampler"
],
{
"title_aux": "ComfyUI_AC_FUNV8Beta1"
}
],
"https://github.com/ALatentPlace/ComfyUI_yanc": [
[
"> Clear Text",
"> Float to Int",
"> Int",
"> Int to Text",
"> Load Image",
"> Load Image From Folder",
"> Resolution by Aspect Ratio",
"> Rotate Image",
"> Save Image",
"> Scale Image to Side",
"> Text",
"> Text Combine",
"> Text Pick Random Line",
"> Text Random Weights",
"> Text Replace"
],
{
"title_aux": "YANC- Yet Another Node Collection"
}
],
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui": [
[
"AccumulateNode",
@ -264,64 +221,6 @@
"title_aux": "ComfyUI_bd_customNodes"
}
],
"https://github.com/DeTK/ComfyUI-Switch": [
[
"NodeSwitch"
],
{
"title_aux": "ComfyUI Node Switcher"
}
],
"https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": [
[
"LineBreakInserter"
],
{
"title_aux": "ComfyUI_LineBreakInserter"
}
],
"https://github.com/ExponentialML/ComfyUI_LiveDirector": [
[
"LiveDirector"
],
{
"title_aux": "ComfyUI_LiveDirector (WIP)"
}
],
"https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": [
[
"Automatic wildcards",
"Conditioning (Cosine similarities)",
"Conditioning (Maximum absolute)",
"Conditioning (Maximum absolute) text inputs",
"Conditioning (Scale by absolute sum)",
"Conditioning merge clip g/l",
"Conditioning similar tokens recombine",
"Conditioning to text",
"Quick and dirty text encode",
"encode_all_tokens_SDXL"
],
{
"title_aux": "Conditioning-token-experiments-for-ComfyUI"
}
],
"https://github.com/GentlemanHu/ComfyUI-Notifier": [
[
"GentlemanHu_Notifier"
],
{
"title_aux": "ComfyUI-Notifier"
}
],
"https://github.com/GrindHouse66/ComfyUI-GH_Tools": [
[
"GHImg_Sizer",
"GHSimple_Scale"
],
{
"title_aux": "GH Tools for ComfyUI"
}
],
"https://github.com/IvanZhd/comfyui-codeformer": [
[
"RedBeanie_CustomImageInverter"
@ -338,14 +237,6 @@
"title_aux": "comfyui-terminal-command [UNSAFE]"
}
],
"https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": [
[
"SaveImagePlus"
],
{
"title_aux": "ComfyUI-SaveImagePlus"
}
],
"https://github.com/Jordach/comfy-consistency-vae": [
[
"Comfy_ConsistencyVAE"
@ -362,14 +253,6 @@
"title_aux": "ComfyUI-ModelUnloader"
}
],
"https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": [
[
"ChatGPTCompletion"
],
{
"title_aux": "ComfyUI simple ChatGPT completion [UNSAFE]"
}
],
"https://github.com/MrAdamBlack/CheckProgress": [
[
"CHECK_PROGRESS"
@ -378,14 +261,6 @@
"title_aux": "CheckProgress [WIP]"
}
],
"https://github.com/MushroomFleet/DJZ-Nodes": [
[
"AspectSize"
],
{
"title_aux": "DJZ-Nodes"
}
],
"https://github.com/PluMaZero/ComfyUI-SpaceFlower": [
[
"SpaceFlower_HangulPrompt",
@ -395,17 +270,6 @@
"title_aux": "ComfyUI-SpaceFlower"
}
],
"https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": [
[
"CLIPTextEncodePromptToPrompt",
"KSamplerPromptToPrompt",
"KSamplerPromptToPromptAttentionMapLogger",
"LocalBlendLayerPresetPromptToPrompt"
],
{
"title_aux": "ComfyUI Port for Google's Prompt-to-Prompt"
}
],
"https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": [
[
"FloatMath",
@ -421,25 +285,6 @@
"title_aux": "ComfyUI-MS-Nodes [WIP]"
}
],
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": [
[
"CheckpointLoaderSimpleShared //SeedV",
"Script"
],
{
"title_aux": "ComfyUI-SeedV-Nodes [UNSAFE]"
}
],
"https://github.com/Video3DGenResearch/comfyui-batch-input-node": [
[
"BatchImageAndPrompt",
"BatchInputCSV",
"BatchInputText"
],
{
"title_aux": "ComfyUI Batch Input Node"
}
],
"https://github.com/WSJUSA/Comfyui-StableSR": [
[
"ColorFix",
@ -453,23 +298,12 @@
"title_aux": "pre-comfyui-stablsr"
}
],
"https://github.com/WilliamStanford/visuallabs_comfyui_nodes": [
[
"CreateFadeMaskAdvancedVL",
"PointStringFromFloatArray",
"RescaleFloatArray",
"StringFromFloatArray"
],
{
"title_aux": "visuallabs_comfyui_nodes"
}
],
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": [
[
"AnyTextNode_Zho"
],
{
"title_aux": "ComfyUI-AnyText [WIP]"
"title_aux": "ComfyUI-AnyText\uff08WIP\uff09"
}
],
"https://github.com/alt-key-project/comfyui-dream-video-batches": [
@ -519,30 +353,14 @@
"Checkpoint Selector Stacker \ud83d\udc69\u200d\ud83d\udcbb",
"Checkpoint Selector \ud83d\udc69\u200d\ud83d\udcbb",
"Checkpoint to String \ud83d\udc69\u200d\ud83d\udcbb",
"Crop Recombine \ud83d\udc69\u200d\ud83d\udcbb",
"Crop|IP|Inpaint \ud83d\udc69\u200d\ud83d\udcbb",
"Crop|IP|Inpaint|SDXL \ud83d\udc69\u200d\ud83d\udcbb",
"Decode GenData \ud83d\udc69\u200d\ud83d\udcbb",
"Encode GenData \ud83d\udc69\u200d\ud83d\udcbb",
"GenData Stacker \ud83d\udc69\u200d\ud83d\udcbb",
"IPAdapterApply",
"IPAdapterApplyEncoded",
"IPAdapterApplyFaceID",
"IPAdapterBatchEmbeds",
"IPAdapterEncoder",
"IPAdapterLoadEmbeds",
"IPAdapterModelLoader",
"IPAdapterSaveEmbeds",
"IPAdapterTilesMasked",
"InsightFaceLoader",
"LoRA Stack to String \ud83d\udc69\u200d\ud83d\udcbb",
"LoRA Stacker From Prompt \ud83d\udc69\u200d\ud83d\udcbb",
"Load Checkpoints From File \ud83d\udc69\u200d\ud83d\udcbb",
"Load GenData From Dir \ud83d\udc69\u200d\ud83d\udcbb",
"Parse GenData \ud83d\udc69\u200d\ud83d\udcbb",
"PrepImageForClipVision",
"PrepImageForInsightFace",
"Provide GenData \ud83d\udc69\u200d\ud83d\udcbb",
"Save Image From GenData \ud83d\udc69\u200d\ud83d\udcbb",
"VAE From String \ud83d\udc69\u200d\ud83d\udcbb",
"VAE to String \ud83d\udc69\u200d\ud83d\udcbb",
@ -552,41 +370,23 @@
"title_aux": "Gen Data Tester [WIP]"
}
],
"https://github.com/bruce007lee/comfyui-cleaner": [
[
"cleaner"
],
{
"title_aux": "comfyui-cleaner"
}
],
"https://github.com/chaojie/ComfyUI-DynamiCrafter": [
"https://github.com/blepping/ComfyUI-sonar": [
[
"DynamiCrafter Simple",
"DynamiCrafterInterp Simple",
"DynamiCrafterInterpLoader",
"DynamiCrafterLoader"
"SamplerSonarEuler",
"SamplerSonarEulerA"
],
{
"title_aux": "ComfyUI DynamiCrafter"
"title_aux": "ComfyUI-sonar (WIP)"
}
],
"https://github.com/comfyanonymous/ComfyUI": [
[
"AddNoise",
"AlignYourStepsScheduler",
"BasicGuider",
"BasicScheduler",
"CFGGuider",
"CLIPAttentionMultiply",
"CLIPLoader",
"CLIPMergeAdd",
"CLIPMergeSimple",
"CLIPMergeSubtract",
"CLIPSave",
"CLIPSetLastLayer",
"CLIPTextEncode",
"CLIPTextEncodeControlnet",
"CLIPTextEncodeSDXL",
"CLIPTextEncodeSDXLRefiner",
"CLIPVisionEncode",
@ -609,10 +409,7 @@
"ControlNetLoader",
"CropMask",
"DiffControlNetLoader",
"DifferentialDiffusion",
"DiffusersLoader",
"DisableNoise",
"DualCFGGuider",
"DualCLIPLoader",
"EmptyImage",
"EmptyLatentImage",
@ -632,7 +429,6 @@
"ImageColorToMask",
"ImageCompositeMasked",
"ImageCrop",
"ImageFromBatch",
"ImageInvert",
"ImageOnlyCheckpointLoader",
"ImageOnlyCheckpointSave",
@ -645,7 +441,6 @@
"ImageToMask",
"ImageUpscaleWithModel",
"InpaintModelConditioning",
"InstructPixToPixConditioning",
"InvertMask",
"JoinImageWithAlpha",
"KSampler",
@ -676,25 +471,17 @@
"MaskToImage",
"ModelMergeAdd",
"ModelMergeBlocks",
"ModelMergeSD1",
"ModelMergeSD2",
"ModelMergeSDXL",
"ModelMergeSimple",
"ModelMergeSubtract",
"ModelSamplingContinuousEDM",
"ModelSamplingDiscrete",
"ModelSamplingStableCascade",
"Morphology",
"PatchModelAddDownscale",
"PerpNeg",
"PerpNegGuider",
"PerturbedAttentionGuidance",
"PhotoMakerEncode",
"PhotoMakerLoader",
"PolyexponentialScheduler",
"PorterDuffImageComposite",
"PreviewImage",
"RandomNoise",
"RebatchImages",
"RebatchLatents",
"RepeatImageBatch",
@ -702,40 +489,25 @@
"RescaleCFG",
"SDTurboScheduler",
"SD_4XUpscale_Conditioning",
"SV3D_Conditioning",
"SVD_img2vid_Conditioning",
"SamplerCustom",
"SamplerCustomAdvanced",
"SamplerDPMAdaptative",
"SamplerDPMPP_2M_SDE",
"SamplerDPMPP_3M_SDE",
"SamplerDPMPP_SDE",
"SamplerEulerAncestral",
"SamplerLMS",
"SaveAnimatedPNG",
"SaveAnimatedWEBP",
"SaveImage",
"SaveImageWebsocket",
"SaveLatent",
"SelfAttentionGuidance",
"SetLatentNoiseMask",
"SolidMask",
"SplitImageWithAlpha",
"SplitSigmas",
"StableCascade_EmptyLatentImage",
"StableCascade_StageB_Conditioning",
"StableCascade_StageC_VAEEncode",
"StableCascade_SuperResolutionControlnet",
"StableZero123_Conditioning",
"StableZero123_Conditioning_Batched",
"StyleModelApply",
"StyleModelLoader",
"ThresholdMask",
"TomePatchModel",
"UNETLoader",
"UNetCrossAttentionMultiply",
"UNetSelfAttentionMultiply",
"UNetTemporalAttentionMultiply",
"UpscaleModelLoader",
"VAEDecode",
"VAEDecodeTiled",
@ -746,7 +518,6 @@
"VAESave",
"VPScheduler",
"VideoLinearCFGGuidance",
"VideoTriangleCFGGuidance",
"unCLIPCheckpointLoader",
"unCLIPConditioning"
],
@ -754,62 +525,6 @@
"title_aux": "ComfyUI"
}
],
"https://github.com/dezi-ai/ComfyUI-AnimateLCM": [
[
"ADE_AdjustPEFullStretch",
"ADE_AdjustPEManual",
"ADE_AdjustPESweetspotStretch",
"ADE_AnimateDiffCombine",
"ADE_AnimateDiffKeyframe",
"ADE_AnimateDiffLoRALoader",
"ADE_AnimateDiffLoaderGen1",
"ADE_AnimateDiffLoaderV1Advanced",
"ADE_AnimateDiffLoaderWithContext",
"ADE_AnimateDiffModelSettings",
"ADE_AnimateDiffModelSettingsAdvancedAttnStrengths",
"ADE_AnimateDiffModelSettingsSimple",
"ADE_AnimateDiffModelSettings_Release",
"ADE_AnimateDiffSamplingSettings",
"ADE_AnimateDiffSettings",
"ADE_AnimateDiffUniformContextOptions",
"ADE_AnimateDiffUnload",
"ADE_ApplyAnimateDiffModel",
"ADE_ApplyAnimateDiffModelSimple",
"ADE_BatchedContextOptions",
"ADE_EmptyLatentImageLarge",
"ADE_IterationOptsDefault",
"ADE_IterationOptsFreeInit",
"ADE_LoadAnimateDiffModel",
"ADE_LoopedUniformContextOptions",
"ADE_LoopedUniformViewOptions",
"ADE_MaskedLoadLora",
"ADE_MultivalDynamic",
"ADE_MultivalScaledMask",
"ADE_NoiseLayerAdd",
"ADE_NoiseLayerAddWeighted",
"ADE_NoiseLayerReplace",
"ADE_StandardStaticContextOptions",
"ADE_StandardStaticViewOptions",
"ADE_StandardUniformContextOptions",
"ADE_StandardUniformViewOptions",
"ADE_UseEvolvedSampling",
"ADE_ViewsOnlyContextOptions",
"AnimateDiffLoaderV1",
"CheckpointLoaderSimpleWithNoiseSelect"
],
{
"title_aux": "ComfyUI Animate LCM"
}
],
"https://github.com/dfl/comfyui-stylegan": [
[
"StyleGAN Generator",
"StyleGAN ModelLoader"
],
{
"title_aux": "comfyui-stylegan"
}
],
"https://github.com/dnl13/ComfyUI-dnl13-seg": [
[
"Automatic Segmentation (dnl13)",
@ -840,41 +555,25 @@
[
"ApplyVoiceFixer",
"BatchAudio",
"BlendAudio",
"ClipAudioRegion",
"ClipAudio",
"CombineImageWithAudio",
"ConcatAudio",
"ConvertAudio",
"FilterAudio",
"FlattenAudioBatch",
"HifiGANApply",
"HifiGANLoader",
"HifiGANModelParams",
"InvertAudioPhase",
"LoadAudio",
"MusicgenGenerate",
"MusicgenHFGenerate",
"MusicgenHFLoader",
"MusicgenLoader",
"NormalizeAudio",
"PreviewAudio",
"ResampleAudio",
"SaveAudio",
"SpectrogramImage",
"Tacotron2Generate",
"Tacotron2Loader",
"ToMelSpectrogram",
"TortoiseTTSGenerate",
"TortoiseTTSLoader",
"TrimAudio",
"TrimAudioSamples",
"TrimSilence",
"VALLEXGenerator",
"VALLEXLoader",
"VALLEXVoicePromptFromAudio",
"VALLEXVoicePromptLoader",
"WaveGlowApply",
"WaveGlowLoader"
"VALLEXVoicePromptLoader"
],
{
"title_aux": "ComfyUI-audio"
@ -907,75 +606,9 @@
"title_aux": "ComfyUI_stable_fast"
}
],
"https://github.com/houdinii/comfy-magick": [
[
"AdaptiveBlur",
"AdaptiveSharpen",
"AddNoise",
"BlueShift",
"Blur",
"Charcoal",
"Colorize",
"CropByAspectRatio",
"Despeckle",
"Edge",
"Emboss",
"FX",
"GaussianBlur",
"Implode",
"Kuwahara",
"MotionBlur",
"RotationalBlur",
"SelectiveBlur",
"Sepia",
"Shade",
"Sharpen",
"Sketch",
"Solarize",
"Spread",
"Stereogram",
"Swirl",
"Tint",
"UnsharpMask",
"Vignette",
"WaveletDenoise"
],
{
"title_aux": "comfy-magick [WIP]"
}
],
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": [
[
"EasyBgRemover",
"EasyBgRemover_ModelLoader",
"EasyControlNetApply",
"EasyControlNetLoader",
"EasyEmptyLatentImage",
"EasyLatentToCondition",
"EasyLoadImage"
],
{
"title_aux": "ComfyUI_Easy_Nodes_hui"
}
],
"https://github.com/hy134300/comfyui-hb-node": [
[
"generate story",
"hy save image",
"latent to list",
"movie batch",
"movie generate",
"sound voice",
"text concat"
],
{
"title_aux": "comfyui-hb-node"
}
],
"https://github.com/ilovejohnwhite/UncleBillyGoncho": [
[
"CannyEdgePreprocessor",
"DiffusionEdge_Preprocessor",
"HintImageEnchance",
"ImageGenResolutionFromImage",
"ImageGenResolutionFromLatent",
@ -1069,18 +702,22 @@
"title_aux": "jn_node_suite_comfyui [WIP]"
}
],
"https://github.com/kadirnar/ComfyUI-Adapter": [
"https://github.com/kadirnar/ComfyUI-Transformers": [
[
"GarmentSegLoader"
"DepthEstimationPipeline"
],
{
"title_aux": "ComfyUI-Adapter [WIP]"
"title_aux": "ComfyUI-Transformers"
}
],
"https://github.com/kadirnar/comfyui_helpers": [
[
"CLIPSeg",
"CircularVAEDecode",
"CombineMasks",
"CustomKSamplerAdvancedTile",
"ImageLoaderAndProcessor",
"ImageToContrastMask",
"JDC_AutoContrast",
"JDC_BlendImages",
"JDC_BrownNoise",
@ -1108,23 +745,13 @@
],
"https://github.com/kappa54m/ComfyUI_Usability": [
[
"KLoadImageByPath",
"KLoadImageByPathAdvanced",
"KLoadImageDedup"
"LoadImageByPath",
"LoadImageDedup"
],
{
"title_aux": "ComfyUI_Usability (WIP)"
}
],
"https://github.com/kijai/ComfyUI-DeepSeek-VL": [
[
"deepseek_vl_inference",
"deepseek_vl_model_loader"
],
{
"title_aux": "ComfyUI nodes to use DeepSeek-VL"
}
],
"https://github.com/komojini/ComfyUI_Prompt_Template_CustomNodes/raw/main/prompt_with_template.py": [
[
"ObjectPromptWithTemplate",
@ -1142,16 +769,6 @@
"title_aux": "ssd-1b-comfyui"
}
],
"https://github.com/logtd/ComfyUI-MotionThiefExperiment": [
[
"ApplyRefMotionNode",
"MotionRefSettingsCustomNode",
"MotionRefSettingsDefaultNode"
],
{
"title_aux": "ComfyUI-MotionThiefExperiment"
}
],
"https://github.com/ltdrdata/ComfyUI-Workflow-Component": [
[
"ComboToString",
@ -1170,22 +787,6 @@
"title_aux": "ComfyUI-Workflow-Component [WIP]"
}
],
"https://github.com/marcueberall/ComfyUI-BuildPath": [
[
"Build Path Adv"
],
{
"title_aux": "ComfyUI-BuildPath"
}
],
"https://github.com/mut-ex/comfyui-gligengui-node": [
[
"GLIGEN_GUI"
],
{
"title_aux": "ComfyUI GLIGEN GUI Node"
}
],
"https://github.com/nidefawl/ComfyUI-nidefawl": [
[
"BlendImagesWithBoundedMasks",
@ -1219,9 +820,7 @@
"PromptUtilitiesFormatString",
"PromptUtilitiesJoinStringList",
"PromptUtilitiesLoadPreset",
"PromptUtilitiesLoadPresetAdvanced",
"PromptUtilitiesRandomPreset",
"PromptUtilitiesRandomPresetAdvanced"
"PromptUtilitiesLoadPresetAdvanced"
],
{
"title_aux": "ComfyUI-PromptUtilities"
@ -1269,108 +868,6 @@
"title_aux": "prism-tools"
}
],
"https://github.com/sdfxai/SDFXBridgeForComfyUI": [
[
"SDFXClipTextEncode"
],
{
"title_aux": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration"
}
],
"https://github.com/shadowcz007/comfyui-CLIPSeg": [
[
"CLIPSeg_",
"CombineMasks_"
],
{
"title_aux": "comfyui-CLIPSeg"
}
],
"https://github.com/shadowcz007/comfyui-musicgen": [
[
"Musicgen"
],
{
"title_aux": "comfyui-musicgen"
}
],
"https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": [
[
"CLIPTextEncodeAndEnhance"
],
{
"title_aux": "CLIPTextEncodeAndEnhancev4 (shirazdesigner)"
}
],
"https://github.com/stutya/ComfyUI-Terminal": [
[
"Terminal"
],
{
"title_aux": "ComfyUI-Terminal [UNSAFE]"
}
],
"https://github.com/sugarkwork/comfyui_psd": [
[
"SavePSD"
],
{
"title_aux": "comfyui_psd [WIP]"
}
],
"https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": [
[
"ImageSizer",
"KSamplerSDXLAdvanced"
],
{
"title_aux": "my-useful-comfyui-custom-nodes"
}
],
"https://github.com/tuckerdarby/ComfyUI-TDNodes": [
[
"HandTrackerNode",
"InstanceDiffusionLoader",
"InstanceTrackerPrompt",
"KSamplerBatchedNode",
"KSamplerRAVE",
"KSamplerTF",
"TemporalNetPreprocessor",
"TrackerNode",
"VideoTrackerPromptNode"
],
{
"title_aux": "ComfyUI-TDNodes [WIP]"
}
],
"https://github.com/umisetokikaze/comfyui_mergekit": [
[
"DefineSaveName",
"LoadLR",
"LoadTarget",
"Merge",
"SetLayer",
"SetModels",
"SetTokenizer",
"get_skip"
],
{
"title_aux": "comfyui_mergekit [WIP]"
}
],
"https://github.com/unanan/ComfyUI-Dist": [
[
"LoadCheckpointFromLAN",
"LoadCheckpointFromURL",
"LoadImageFromLAN",
"LoadImageFromURL",
"LoadWorkflowFromLAN",
"LoadWorkflowFromURL"
],
{
"title_aux": "ComfyUI-Dist [WIP]"
}
],
"https://github.com/unanan/ComfyUI-clip-interrogator": [
[
"ComfyUIClipInterrogator",

350
node_db/dev/github-stats.json

@ -1,350 +0,0 @@
{
"https://github.com/longgui0318/comfyui-one-more-step": {
"stars": 0,
"last_update": "2024-04-28 10:33:08"
},
"https://github.com/TemryL/ComfyUI-IDM-VTON": {
"stars": 11,
"last_update": "2024-04-28 23:39:01"
},
"https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": {
"stars": 0,
"last_update": "2024-04-27 13:25:08"
},
"https://github.com/umisetokikaze/comfyui_mergekit": {
"stars": 0,
"last_update": "2024-04-28 07:21:00"
},
"https://github.com/Video3DGenResearch/comfyui-batch-input-node": {
"stars": 1,
"last_update": "2024-04-28 15:21:17"
},
"https://github.com/kijai/ComfyUI-DeepSeek-VL": {
"stars": 12,
"last_update": "2024-04-23 18:10:42"
},
"https://github.com/GentlemanHu/ComfyUI-Notifier": {
"stars": 1,
"last_update": "2024-04-26 04:22:25"
},
"https://github.com/nat-chan/comfyui-in-memory-transceiver": {
"stars": 1,
"last_update": "2024-04-24 04:11:05"
},
"https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": {
"stars": 0,
"last_update": "2024-04-19 11:37:19"
},
"https://github.com/WilliamStanford/visuallabs_comfyui_nodes": {
"stars": 1,
"last_update": "2024-04-16 21:53:02"
},
"https://github.com/bruce007lee/comfyui-cleaner": {
"stars": 2,
"last_update": "2024-04-20 15:36:03"
},
"https://github.com/ExponentialML/ComfyUI_LiveDirector": {
"stars": 32,
"last_update": "2024-04-09 19:01:49"
},
"https://github.com/logtd/ComfyUI-MotionThiefExperiment": {
"stars": 34,
"last_update": "2024-04-09 01:00:51"
},
"https://github.com/hy134300/comfyui-hb-node": {
"stars": 0,
"last_update": "2024-04-09 09:56:22"
},
"https://github.com/gameltb/io_comfyui": {
"stars": 3,
"last_update": "2024-04-06 04:40:05"
},
"https://github.com/ALatentPlace/ComfyUI_yanc": {
"stars": 4,
"last_update": "2024-04-16 19:03:34"
},
"https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": {
"stars": 0,
"last_update": "2024-04-01 10:52:59"
},
"https://github.com/kadirnar/ComfyUI-Adapter": {
"stars": 3,
"last_update": "2024-04-03 12:05:39"
},
"https://github.com/Beinsezii/comfyui-amd-go-fast": {
"stars": 3,
"last_update": "2024-03-31 01:17:57"
},
"https://github.com/sugarkwork/comfyui_psd": {
"stars": 0,
"last_update": "2024-03-26 08:24:56"
},
"https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": {
"stars": 15,
"last_update": "2024-03-17 04:30:01"
},
"https://github.com/MushroomFleet/DJZ-Nodes": {
"stars": 3,
"last_update": "2024-03-18 11:18:42"
},
"https://github.com/stavsap/ComfyUI-React-SDK": {
"stars": 5,
"last_update": "2024-03-17 21:54:21"
},
"https://github.com/chaojie/ComfyUI-DynamiCrafter": {
"stars": 86,
"last_update": "2024-03-16 19:08:28"
},
"https://github.com/cubiq/Comfy_Dungeon": {
"stars": 134,
"last_update": "2024-04-26 11:00:58"
},
"https://github.com/dfl/comfyui-stylegan": {
"stars": 1,
"last_update": "2024-03-14 14:34:25"
},
"https://github.com/christian-byrne/elimination-nodes": {
"stars": 4,
"last_update": "2024-04-09 18:51:29"
},
"https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": {
"stars": 12,
"last_update": "2024-03-08 10:11:44"
},
"https://github.com/houdinii/comfy-magick": {
"stars": 4,
"last_update": "2024-03-11 06:40:54"
},
"https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": {
"stars": 0,
"last_update": "2024-03-05 13:31:31"
},
"https://github.com/DeTK/ComfyUI-Switch": {
"stars": 0,
"last_update": "2024-03-04 11:52:04"
},
"https://github.com/GrindHouse66/ComfyUI-GH_Tools": {
"stars": 0,
"last_update": "2024-03-10 13:27:14"
},
"https://github.com/sdfxai/SDFXBridgeForComfyUI": {
"stars": 2,
"last_update": "2024-04-12 14:09:45"
},
"https://github.com/SeedV/ComfyUI-SeedV-Nodes": {
"stars": 1,
"last_update": "2024-04-23 07:56:19"
},
"https://github.com/mut-ex/comfyui-gligengui-node": {
"stars": 24,
"last_update": "2024-02-28 02:46:05"
},
"https://github.com/unanan/ComfyUI-Dist": {
"stars": 4,
"last_update": "2024-02-28 10:03:50"
},
"https://github.com/NicholasKao1029/comfyui-hook": {
"stars": 0,
"last_update": "2024-03-07 05:50:56"
},
"https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": {
"stars": 13,
"last_update": "2024-03-10 01:04:02"
},
"https://github.com/shadowcz007/comfyui-llamafile": {
"stars": 10,
"last_update": "2024-04-29 08:35:31"
},
"https://github.com/gameltb/ComfyUI_paper_playground": {
"stars": 7,
"last_update": "2024-04-06 10:30:44"
},
"https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": {
"stars": 2,
"last_update": "2024-02-27 08:22:49"
},
"https://github.com/tuckerdarby/ComfyUI-TDNodes": {
"stars": 3,
"last_update": "2024-02-19 17:00:55"
},
"https://github.com/shadowcz007/comfyui-musicgen": {
"stars": 0,
"last_update": "2024-02-13 08:45:12"
},
"https://github.com/shadowcz007/comfyui-CLIPSeg": {
"stars": 0,
"last_update": "2024-02-08 02:16:24"
},
"https://github.com/dezi-ai/ComfyUI-AnimateLCM": {
"stars": 127,
"last_update": "2024-02-07 17:34:39"
},
"https://github.com/stutya/ComfyUI-Terminal": {
"stars": 0,
"last_update": "2024-02-05 16:47:28"
},
"https://github.com/marcueberall/ComfyUI-BuildPath": {
"stars": 0,
"last_update": "2024-02-06 07:57:33"
},
"https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": {
"stars": 0,
"last_update": "2024-02-04 21:15:22"
},
"https://github.com/kappa54m/ComfyUI_Usability": {
"stars": 0,
"last_update": "2024-02-05 14:49:45"
},
"https://github.com/17Retoucher/ComfyUI_Fooocus": {
"stars": 50,
"last_update": "2024-02-24 07:33:29"
},
"https://github.com/nkchocoai/ComfyUI-PromptUtilities": {
"stars": 6,
"last_update": "2024-02-21 14:47:42"
},
"https://github.com/BadCafeCode/execution-inversion-demo-comfyui": {
"stars": 3,
"last_update": "2024-03-23 23:53:13"
},
"https://github.com/unanan/ComfyUI-clip-interrogator": {
"stars": 18,
"last_update": "2024-02-01 09:46:57"
},
"https://github.com/prismwastaken/comfyui-tools": {
"stars": 0,
"last_update": "2024-03-05 14:34:56"
},
"https://github.com/poisenbery/NudeNet-Detector-Provider": {
"stars": 1,
"last_update": "2024-02-26 02:11:27"
},
"https://github.com/LarryJane491/ComfyUI-ModelUnloader": {
"stars": 1,
"last_update": "2024-01-14 08:22:39"
},
"https://github.com/AIGODLIKE/ComfyUI-Studio": {
"stars": 185,
"last_update": "2024-04-03 03:59:31"
},
"https://github.com/MrAdamBlack/CheckProgress": {
"stars": 1,
"last_update": "2024-01-10 08:02:18"
},
"https://github.com/birnam/ComfyUI-GenData-Pack": {
"stars": 0,
"last_update": "2024-03-25 01:25:23"
},
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": {
"stars": 38,
"last_update": "2024-01-07 11:48:05"
},
"https://github.com/nidefawl/ComfyUI-nidefawl": {
"stars": 0,
"last_update": "2024-01-16 18:16:41"
},
"https://github.com/kadirnar/comfyui_helpers": {
"stars": 2,
"last_update": "2024-03-04 16:25:30"
},
"https://github.com/foglerek/comfyui-cem-tools": {
"stars": 1,
"last_update": "2024-01-13 23:22:07"
},
"https://github.com/talesofai/comfyui-supersave": {
"stars": 1,
"last_update": "2023-12-27 02:05:53"
},
"https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": {
"stars": 2,
"last_update": "2024-02-22 08:34:44"
},
"https://github.com/eigenpunk/ComfyUI-audio": {
"stars": 44,
"last_update": "2024-03-03 21:14:14"
},
"https://github.com/Jaxkr/comfyui-terminal-command": {
"stars": 1,
"last_update": "2023-12-03 10:31:40"
},
"https://github.com/BlueDangerX/ComfyUI-BDXNodes": {
"stars": 1,
"last_update": "2023-12-10 04:01:19"
},
"https://github.com/ilovejohnwhite/UncleBillyGoncho": {
"stars": 0,
"last_update": "2024-02-29 00:16:42"
},
"https://github.com/IvanZhd/comfyui-codeformer": {
"stars": 0,
"last_update": "2023-12-02 20:51:52"
},
"https://github.com/alt-key-project/comfyui-dream-video-batches": {
"stars": 46,
"last_update": "2023-12-03 10:31:55"
},
"https://github.com/oyvindg/ComfyUI-TrollSuite": {
"stars": 0,
"last_update": "2023-11-21 01:46:07"
},
"https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes": {
"stars": 3,
"last_update": "2023-11-15 22:00:49"
},
"https://github.com/wormley/comfyui-wormley-nodes": {
"stars": 0,
"last_update": "2023-11-12 19:05:11"
},
"https://github.com/dnl13/ComfyUI-dnl13-seg": {
"stars": 17,
"last_update": "2024-01-08 10:52:13"
},
"https://github.com/phineas-pta/comfy-trt-test": {
"stars": 77,
"last_update": "2024-03-10 21:17:56"
},
"https://github.com/Brandelan/ComfyUI_bd_customNodes": {
"stars": 1,
"last_update": "2023-10-09 00:40:26"
},
"https://github.com/Jordach/comfy-consistency-vae": {
"stars": 68,
"last_update": "2023-11-06 20:50:40"
},
"https://github.com/gameltb/ComfyUI_stable_fast": {
"stars": 174,
"last_update": "2024-04-01 13:30:57"
},
"https://github.com/jn-jairo/jn_node_suite_comfyui": {
"stars": 5,
"last_update": "2024-01-11 20:39:36"
},
"https://github.com/PluMaZero/ComfyUI-SpaceFlower": {
"stars": 4,
"last_update": "2023-12-09 05:55:15"
},
"https://github.com/laksjdjf/ssd-1b-comfyui": {
"stars": 1,
"last_update": "2023-10-27 20:05:06"
},
"https://github.com/flowtyone/comfyui-flowty-lcm": {
"stars": 62,
"last_update": "2023-10-23 12:08:55"
},
"https://github.com/doucx/ComfyUI_WcpD_Utility_Kit": {
"stars": 1,
"last_update": "2024-01-06 19:07:45"
},
"https://github.com/WSJUSA/Comfyui-StableSR": {
"stars": 32,
"last_update": "2023-10-18 12:40:30"
},
"https://github.com/ltdrdata/ComfyUI-Workflow-Component": {
"stars": 181,
"last_update": "2024-04-26 01:39:09"
},
"https://github.com/comfyanonymous/ComfyUI": {
"stars": 33530,
"last_update": "2024-04-29 00:08:28"
}
}

40
node_db/forked/custom-node-list.json

@ -1,35 +1,5 @@
{
"custom_nodes": [
{
"author": "meimeilook",
"title": "ComfyUI_IPAdapter_plus.old [backward compatbility]",
"reference": "https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old",
"files": [
"https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old"
],
"install_type": "git-clone",
"description": "This repo is created to provide backward compatibility for workflows configured with the old IPAdapter."
},
{
"author": "ZHO-ZHO-ZHO",
"title": "Dr.Lt.Data/ComfyUI-YoloWorld-EfficientSAM",
"reference": "https://github.com/ltdrdata/ComfyUI-YoloWorld-EfficientSAM",
"files": [
"https://github.com/ltdrdata/ComfyUI-YoloWorld-EfficientSAM"
],
"install_type": "git-clone",
"description": "This fork includes [a/PR32](https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM/pull/32)"
},
{
"author": "ertu110",
"title": "sdxl_prompt_style",
"reference": "https://github.com/ertu110/sdxl_prompt_style",
"files": [
"https://github.com/ertu110/sdxl_prompt_style"
],
"install_type": "git-clone",
"description": "This project is a complete benchmark [a/https://github.com/twri/sdxl_prompt_styler](https://github.com/twri/sdxl_prompt_styler) A large amount of code inside comes from https://github.com/twri/sdxl_prompt_styler Project and [a/https://www.nodecafe.org/package/pythongosssss_ComfyUI-Custom-Scripts](https://www.nodecafe.org/package/pythongosssss_ComfyUI-Custom-Scripts) project\nThe functionality of this project is related to https://github.com/twri/sdxl_prompt_styler Highly overlapping, the only purpose of creating this project is because there are too many styles when selecting, resulting in a long and inconvenient dropdown box. Therefore, To address this issue, this project has added a secondary menu to the style."
},
{
"author": "gustproof",
"title": "ComfyUI_IPAdapter_plus_Style_Components",
@ -40,6 +10,16 @@
"install_type": "git-clone",
"description": "Style Components is an IP-Adapter model conditioned on anime styles. The style embeddings can either be extracted from images or created manually. This repo currently only supports the SDXL model trained on AutismmixPony."
},
{
"author": "BlenderNeko",
"title": "Dr.Lt.Data/Advanced CLIP Text Encode (PR21)",
"reference": "https://github.com/ltdrdata/ComfyUI_ADV_CLIP_emb",
"files": [
"https://github.com/ltdrdata/ComfyUI_ADV_CLIP_emb"
],
"install_type": "git-clone",
"description": "[a/PR21](https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb/pull/21) is applied.\nmissing 'clip_layer' method fix."
},
{
"author": "gameltb",
"title": "comfyui-stablsr",

80
node_db/legacy/custom-node-list.json

@ -10,76 +10,6 @@
},
{
"author": "IKHOR",
"title": "ikhor-nodes [REMOVED]",
"reference": "https://github.com/IKHOR/ComfyUI-IKHOR-Jam-Nodes",
"files": [
"https://github.com/IKHOR/ComfyUI-IKHOR-Jam-Nodes"
],
"install_type": "git-clone",
"description": "Nodes:LoadFromS3, LoadBatchFromS3, SaveToS3, SaveBatchToS3"
},
{
"author": "kijai",
"title": "ComfyUI wrapper nodes for IC-light [DEPRECATED]",
"reference": "https://github.com/kijai/ComfyUI-IC-Light-Wrapper",
"files": [
"https://github.com/kijai/ComfyUI-IC-Light-Wrapper"
],
"install_type": "git-clone",
"description": "Stopped. Original repo: [a/https://github.com/lllyasviel/IC-Light](https://github.com/lllyasviel/IC-Light)"
},
{
"author": "thedyze",
"title": "Save Image Extended for ComfyUI",
"reference": "https://github.com/thedyze/save-image-extended-comfyui",
"files": [
"https://github.com/thedyze/save-image-extended-comfyui"
],
"install_type": "git-clone",
"description": "Customize the information saved in file- and folder names. Use the values of sampler parameters as part of file or folder names. Save your positive & negative prompt as entries in a JSON (text) file, in each folder.\n[w/This custom node has not been maintained for a long time. Please use an alternative node from the default channel.]"
},
{
"author": "ExponentialML",
"title": "ComfyUI_ELLA [DEPRECATED]",
"reference": "https://github.com/ExponentialML/ComfyUI_ELLA",
"files": [
"https://github.com/ExponentialML/ComfyUI_ELLA"
],
"install_type": "git-clone",
"description": "ComfyUI Implementaion of ELLA: Equip Diffusion Models with LLM for Enhanced Semantic Alignment.[w/Officially implemented here: [a/https://github.com/TencentQQGYLab/ComfyUI-ELLA](https://github.com/TencentQQGYLab/ComfyUI-ELLA)]"
},
{
"author": "shinich39",
"title": "comfyui-text-pipe-39 [DEPRECATED]",
"reference": "https://github.com/shinich39/comfyui-text-pipe-39",
"files": [
"https://github.com/shinich39/comfyui-text-pipe-39"
],
"install_type": "git-clone",
"description": "Modify text by condition."
},
{
"author": "Big Idea Technology",
"title": "Image Text Overlay Node for ComfyUI [DEPRECATED]",
"reference": "https://github.com/Big-Idea-Technology/ComfyUI_Image_Text_Overlay",
"files": [
"https://github.com/Big-Idea-Technology/ComfyUI_Image_Text_Overlay"
],
"install_type": "git-clone",
"description": "Please note that the ImageTextOverlay project is no longer supported and has been moved to a new repository. For ongoing developments, contributions, and issues, please refer to the new repository at: [a/https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools](https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools)"
},
{
"author": "mlinmg",
"title": "LaMa Preprocessor [DEPRECATED]",
"reference": "https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor",
"files": [
"https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor"
],
"install_type": "git-clone",
"description": "A LaMa prerocessor for ComfyUI. This preprocessor finally enable users to generate coherent inpaint and outpaint prompt-free. The best results are given on landscapes, not so much in drawings/animation."
},
{
"author": "CapsAdmin",
"title": "ComfyUI-Euler-Smea-Dyn-Sampler [DEPRECATED]",
@ -140,6 +70,16 @@
"install_type": "git-clone",
"description": "Proof of concent on how to use IPAdapter to control tiled upscaling. NOTE: You need to have 'ComfyUI_IPAdapter_plus' installed."
},
{
"author": "meimeilook",
"title": "ComfyUI_IPAdapter_plus",
"reference": "https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old",
"files": [
"https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old"
],
"install_type": "git-clone",
"description": "This repo is created to provide backward compatibility for workflows configured with the old IPAdapter."
},
{
"author": "XINZHANG-ops",
"title": "comfyui-xin-nodes [REMOVED]",

731
node_db/new/custom-node-list.json

File diff suppressed because it is too large Load Diff

2534
node_db/new/extension-node-map.json

File diff suppressed because it is too large Load Diff

358
node_db/new/model-list.json

@ -1,179 +1,5 @@
{
"models": [
{
"name": "ID-Animator/animator.ckpt",
"type": "ID-Animator",
"base": "SD1.5",
"save_path": "custom_nodes/ComfyUI_ID_Animator/models",
"description": "ID-Animator checkpoint",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "animator.ckpt",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt"
},
{
"name": "ID-Animator/mm_sd_v15_v2.ckpt",
"type": "ID-Animator",
"base": "SD1.5",
"save_path": "custom_nodes/ComfyUI_ID_Animator/models/animatediff_models",
"description": "AnimateDiff checkpoint for ID-Animator",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "mm_sd_v15_v2.ckpt",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt"
},
{
"name": "ID-Animator/image_encoder",
"type": "ID-Animator",
"base": "SD1.5",
"save_path": "custom_nodes/ComfyUI_ID_Animator/models/image_encoder",
"description": "CLIP Image encoder for ID-Animator",
"reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator",
"filename": "model.safetensors",
"url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors"
},
{
"name": "IC-Light/fc",
"type": "IC-Light",
"base": "SD1.5",
"save_path": "unet/IC-Light",
"description": "The default relighting model, conditioned on text and foreground",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fc.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors"
},
{
"name": "IC-Light/fbc",
"type": "IC-Light",
"base": "SD1.5",
"save_path": "unet/IC-Light",
"description": "Relighting model conditioned with text, foreground, and background",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fbc.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors"
},
{
"name": "IC-Light/fcon",
"type": "IC-Light",
"base": "SD1.5",
"save_path": "unet/IC-Light",
"description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise",
"reference": "https://huggingface.co/lllyasviel/ic-light",
"filename": "iclight_sd15_fcon.safetensors",
"url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors"
},
{
"name": "MonsterMMORPG/insightface (for InstantID)",
"type": "insightface",
"base": "SDXL",
"save_path": "insightface/models",
"description": "MonsterMMORPG insightface model for cubiq/InstantID",
"reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main",
"filename": "antelopev2.zip",
"url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip"
},
{
"name": "InstantID/ip-adapter",
"type": "instantid",
"base": "SDXL",
"save_path": "instantid/SDXL",
"description": "ip-adapter model for cubiq/InstantID",
"reference": "https://huggingface.co/InstantX/InstantID",
"filename": "ip-adapter.bin",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin"
},
{
"name": "InstantID/ControlNet",
"type": "controlnet",
"base": "SDXL",
"save_path": "controlnet/SDXL/instantid",
"description": "instantid controlnet model for cubiq/InstantID",
"reference": "https://huggingface.co/InstantX/InstantID",
"filename": "diffusion_pytorch_model.safetensors",
"url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors"
},
{
"name": "ip_plus_composition_sd15.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/ostris/ip-composition-adapter",
"filename": "ip_plus_composition_sd15.safetensors",
"url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sd15.safetensors"
},
{
"name": "ip_plus_composition_sdxl.safetensors",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/ostris/ip-composition-adapter",
"filename": "ip_plus_composition_sdxl.safetensors",
"url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sdxl.safetensors"
},
{
"name": "ip-adapter-faceid-portrait-v11_sd15.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Portrait V11 Model (SD1.5) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-portrait-v11_sd15.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait-v11_sd15.bin"
},
{
"name": "ip-adapter-faceid-portrait_sdxl.bin",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Portrait Model (SDXL) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-portrait_sdxl.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl.bin"
},
{
"name": "ip-adapter-faceid-portrait_sdxl_unnorm.bin",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "IP-Adapter-FaceID Portrait Model (SDXL/unnorm) [ipadapter]",
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid-portrait_sdxl_unnorm.bin",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl_unnorm.bin"
},
{
"name": "ip-adapter_sd15_light_v11.bin",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15_light_v11.bin",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light_v11.bin"
},
{
"name": "Kijai/SUPIR-v0F_fp16.safetensors (pruned)",
"type": "checkpoints",
"base": "SUPIR",
"save_path": "checkpoints/SUPIR",
"description": "SUPIR checkpoint model",
"reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main",
"filename": "SUPIR-v0F_fp16.safetensors",
"url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0F_fp16.safetensors"
},
{
"name": "Kijai/SUPIR-v0Q_fp16.safetensors (pruned)",
"type": "checkpoints",
"base": "SUPIR",
"save_path": "checkpoints/SUPIR",
"description": "SUPIR checkpoint model",
"reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main",
"filename": "SUPIR-v0Q_fp16.safetensors",
"url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0Q_fp16.safetensors"
},
{
"name": "SUPIR-v0F.ckpt",
"type": "checkpoints",
@ -711,6 +537,190 @@
"reference": "https://huggingface.co/h94/IP-Adapter-FaceID",
"filename": "ip-adapter-faceid_sd15_lora.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15_lora.safetensors"
},
{
"name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames_v1.1.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt"
},
{
"name": "animatediff/v3_sd15_sparsectrl_rgb.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "controlnet",
"base": "SD1.x",
"save_path": "controlnet/SD1.5/animatediff",
"description": "AnimateDiff SparseCtrl RGB ControlNet model",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v3_sd15_sparsectrl_rgb.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_rgb.ckpt"
},
{
"name": "animatediff/v3_sd15_sparsectrl_scribble.ckpt",
"type": "controlnet",
"base": "SD1.x",
"save_path": "controlnet/SD1.5/animatediff",
"description": "AnimateDiff SparseCtrl Scribble ControlNet model",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v3_sd15_sparsectrl_scribble.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_scribble.ckpt"
},
{
"name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "custom_nodes/ComfyUI-AnimateDiff-Evolved/models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node. (Note: Requires ComfyUI-Manager V0.24 or above)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v3_sd15_mm.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt"
},
{
"name": "animatediff/v3_sd15_adapter.ckpt",
"type": "lora",
"base": "SD1.x",
"save_path": "loras/SD1.5/animatediff",
"description": "AnimateDiff Adapter LoRA (SD1.5)",
"reference": "https://huggingface.co/guoyww/animatediff",
"filename": "v3_sd15_adapter.ckpt",
"url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_adapter.ckpt"
},
{
"name": "Segmind-Vega",
"type": "checkpoints",
"base": "segmind-vega",
"save_path": "checkpoints/segmind-vega",
"description": "The Segmind-Vega Model is a distilled version of the Stable Diffusion XL (SDXL), offering a remarkable 70% reduction in size and an impressive 100% speedup while retaining high-quality text-to-image generation capabilities.",
"reference": "https://huggingface.co/segmind/Segmind-Vega",
"filename": "segmind-vega.safetensors",
"url": "https://huggingface.co/segmind/Segmind-Vega/resolve/main/segmind-vega.safetensors"
},
{
"name": "Segmind-VegaRT - Latent Consistency Model (LCM) LoRA of Segmind-Vega",
"type": "lora",
"base": "segmind-vega",
"save_path": "loras/segmind-vega",
"description": "Segmind-VegaRT a distilled consistency adapter for Segmind-Vega that allows to reduce the number of inference steps to only between 2 - 8 steps.",
"reference": "https://huggingface.co/segmind/Segmind-VegaRT",
"filename": "pytorch_lora_weights.safetensors",
"url": "https://huggingface.co/segmind/Segmind-VegaRT/resolve/main/pytorch_lora_weights.safetensors"
},
{
"name": "stabilityai/Stable Zero123",
"type": "zero123",
"base": "zero123",
"save_path": "checkpoints/zero123",
"description": "Stable Zero123 is a model for view-conditioned image generation based on [a/Zero123](https://github.com/cvlab-columbia/zero123).",
"reference": "https://huggingface.co/stabilityai/stable-zero123",
"filename": "stable_zero123.ckpt",
"url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_32_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt"
},
{
"name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)",
"type": "animatediff",
"base": "SD1.x",
"save_path": "animatediff_models",
"description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.",
"reference": "https://huggingface.co/Lightricks/LongAnimateDiff",
"filename": "lt_long_mm_16_64_frames.ckpt",
"url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt"
},
{
"name": "ip-adapter_sd15.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15.safetensors"
},
{
"name": "ip-adapter_sd15_light.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15_light.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light.safetensors"
},
{
"name": "ip-adapter_sd15_vit-G.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sd15_vit-G.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_vit-G.safetensors"
},
{
"name": "ip-adapter-plus_sd15.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter-plus_sd15.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-plus_sd15.safetensors"
},
{
"name": "ip-adapter-plus-face_sd15.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter-plus-face_sd15.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-plus-face_sd15.safetensors"
},
{
"name": "ip-adapter-full-face_sd15.safetensors",
"type": "IP-Adapter",
"base": "SD1.5",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter-full-face_sd15.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-full-face_sd15.safetensors"
},
{
"name": "ip-adapter_sdxl.safetensors",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sdxl.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter_sdxl.safetensors"
},
{
"name": "ip-adapter_sdxl_vit-h.safetensors",
"type": "IP-Adapter",
"base": "SDXL",
"save_path": "ipadapter",
"description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints",
"reference": "https://huggingface.co/h94/IP-Adapter",
"filename": "ip-adapter_sdxl_vit-h.safetensors",
"url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter_sdxl_vit-h.safetensors"
}
]
}

50
node_db/tutorial/custom-node-list.json

@ -10,16 +10,6 @@
"install_type": "git-clone",
"description": "There is a small node pack attached to this guide. This includes the init file and 3 nodes associated with the tutorials."
},
{
"author": "bamboodia",
"title": "BAM Nodes",
"reference": "https://github.com/bamboodia/BAM_Nodes",
"files": [
"https://github.com/bamboodia/BAM_Nodes"
],
"install_type": "git-clone",
"description": "A collection of comfyui nodes that I have made for nothing more than educational purposes."
},
{
"author": "BadCafeCode",
"title": "execution-inversion-demo-comfyui",
@ -80,6 +70,16 @@
"install_type": "git-clone",
"description": "Tutorial nodes"
},
{
"author": "GraftingRayman",
"title": "ComfyUI-Trajectory",
"reference": "https://github.com/GraftingRayman/ComfyUI-Trajectory",
"files": [
"https://github.com/GraftingRayman/ComfyUI-Trajectory"
],
"install_type": "git-clone",
"description": "Nodes:GR Trajectory"
},
{
"author": "wailovet",
"title": "ComfyUI-WW",
@ -159,36 +159,6 @@
],
"install_type": "git-clone",
"description": "Nodes:Woman_in_a_dress"
},
{
"author": "shinich39",
"title": "comfyui-concat-text-39",
"reference": "https://github.com/shinich39/comfyui-concat-text-39",
"files": [
"https://github.com/shinich39/comfyui-concat-text-39"
],
"install_type": "git-clone",
"description": "Nodes:Concatenate multiple text nodes."
},
{
"author": "nilor-corp",
"title": "nilor-nodes",
"reference": "https://github.com/nilor-corp/nilor-nodes",
"files": [
"https://github.com/nilor-corp/nilor-nodes"
],
"install_type": "git-clone",
"description": "Custom utility nodes for ComfyUI"
},
{
"author": "nilor-corp",
"title": "nilor-nodes",
"reference": "https://github.com/nilor-corp/nilor-nodes",
"files": [
"https://github.com/nilor-corp/nilor-nodes"
],
"install_type": "git-clone",
"description": "Nodes:Nilor Floats, Nilor Int To List Of Bools, Nilor Bool From List Of Bools, Nilor Int From List Of Ints, Nilor List of Ints, Nilor Count Images In Directory"
}
]
}

28
notebooks/comfyui_colab_with_manager.ipynb

@ -50,21 +50,11 @@
"\n",
"if OPTIONS['UPDATE_COMFY_UI']:\n",
" !echo -= Updating ComfyUI =-\n",
"\n",
" # Correction of the issue of permissions being deleted on Google Drive.\n",
" ![ -f \".ci/nightly/update_windows/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/nightly/update_windows/update_comfyui_and_python_dependencies.bat\n",
" ![ -f \".ci/nightly/windows_base_files/run_nvidia_gpu.bat\" ] && chmod 755 .ci/nightly/windows_base_files/run_nvidia_gpu.bat\n",
" ![ -f \".ci/update_windows/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/update_windows/update_comfyui_and_python_dependencies.bat\n",
" ![ -f \".ci/update_windows_cu118/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/update_windows_cu118/update_comfyui_and_python_dependencies.bat\n",
" ![ -f \".ci/update_windows/update.py\" ] && chmod 755 .ci/update_windows/update.py\n",
" ![ -f \".ci/update_windows/update_comfyui.bat\" ] && chmod 755 .ci/update_windows/update_comfyui.bat\n",
" ![ -f \".ci/update_windows/README_VERY_IMPORTANT.txt\" ] && chmod 755 .ci/update_windows/README_VERY_IMPORTANT.txt\n",
" ![ -f \".ci/update_windows/run_cpu.bat\" ] && chmod 755 .ci/update_windows/run_cpu.bat\n",
" ![ -f \".ci/update_windows/run_nvidia_gpu.bat\" ] && chmod 755 .ci/update_windows/run_nvidia_gpu.bat\n",
"\n",
" !git pull\n",
"\n",
"!echo -= Install dependencies =-\n",
"#Remove cu121 as it causes issues in Colab.\n",
"#!pip install xformers!=0.0.18 -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu121 --extra-index-url https://download.pytorch.org/whl/cu118 --extra-index-url https://download.pytorch.org/whl/cu117\n",
"!pip3 install accelerate\n",
"!pip3 install einops transformers>=4.25.1 safetensors>=0.3.0 aiohttp pyyaml Pillow scipy tqdm psutil\n",
"!pip3 install xformers!=0.0.18 torch==2.1.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121\n",
@ -72,14 +62,6 @@
"\n",
"if OPTIONS['USE_COMFYUI_MANAGER']:\n",
" %cd custom_nodes\n",
"\n",
" # Correction of the issue of permissions being deleted on Google Drive.\n",
" ![ -f \"ComfyUI-Manager/check.sh\" ] && chmod 755 ComfyUI-Manager/check.sh\n",
" ![ -f \"ComfyUI-Manager/scan.sh\" ] && chmod 755 ComfyUI-Manager/scan.sh\n",
" ![ -f \"ComfyUI-Manager/node_db/dev/scan.sh\" ] && chmod 755 ComfyUI-Manager/node_db/dev/scan.sh\n",
" ![ -f \"ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh\" ] && chmod 755 ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh\n",
" ![ -f \"ComfyUI-Manager/scripts/install-comfyui-venv-win.bat\" ] && chmod 755 ComfyUI-Manager/scripts/install-comfyui-venv-win.bat\n",
"\n",
" ![ ! -d ComfyUI-Manager ] && echo -= Initial setup ComfyUI-Manager =- && git clone https://github.com/ltdrdata/ComfyUI-Manager\n",
" %cd ComfyUI-Manager\n",
" !git pull\n",
@ -87,9 +69,9 @@
"%cd $WORKSPACE\n",
"\n",
"if OPTIONS['INSTALL_CUSTOM_NODES_DEPENDENCIES']:\n",
" !pwd\n",
" !echo -= Install custom nodes dependencies =-\n",
" !pip install GitPython\n",
" !python custom_nodes/ComfyUI-Manager/cm-cli.py restore-dependencies\n"
" ![ -f \"custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py\" ] && python \"custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py\"\n"
]
},
{
@ -368,4 +350,4 @@
},
"nbformat": 4,
"nbformat_minor": 0
}
}

21
pip_overrides.json.template

@ -1,21 +0,0 @@
{
"imageio-ffmpeg": "imageio",
"imageio[ffmpeg]": "imageio",
"imageio_ffmpeg": "imageio",
"diffusers~=0.21.4": "diffusers",
"huggingface_hub": "huggingface-hub",
"numpy<1.24>=1.18": "numpy",
"numpy>=1.18.5, <1.25.0": "numpy",
"opencv-contrib-python": "opencv-contrib-python-headless",
"opencv-python": "opencv-contrib-python-headless",
"opencv-python-headless": "opencv-contrib-python-headless",
"opencv-python-headless[ffmpeg]<=4.7.0.72": "opencv-contrib-python-headless",
"opencv-python>=4.7.0.72": "opencv-contrib-python-headless",
"pandas<=1.5.1": "pandas",
"scikit-image==0.20.0": "scikit-image",
"scipy>=1.11.4": "scipy",
"segment_anything": "segment-anything",
"timm==0.6.5": "timm",
"timm>=0.4.12": "timm",
"transformers==4.26.1": "transformers"
}

110
prestartup_script.py

@ -7,13 +7,13 @@ import threading
import re
import locale
import platform
import json
glob_path = os.path.join(os.path.dirname(__file__), "glob")
sys.path.append(glob_path)
from manager_util import *
import cm_global
@ -69,23 +69,6 @@ custom_nodes_path = os.path.abspath(os.path.join(comfyui_manager_path, ".."))
startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts")
restore_snapshot_path = os.path.join(startup_script_path, "restore-snapshot.json")
git_script_path = os.path.join(comfyui_manager_path, "git_helper.py")
pip_overrides_path = os.path.join(comfyui_manager_path, "pip_overrides.json")
cm_global.pip_overrides = {}
if os.path.exists(pip_overrides_path):
with open(pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
cm_global.pip_overrides = json.load(json_file)
def remap_pip_package(pkg):
if pkg in cm_global.pip_overrides:
res = cm_global.pip_overrides[pkg]
print(f"[ComfyUI-Manager] '{pkg}' is remapped to '{res}'")
return res
else:
return pkg
std_log_lock = threading.Lock()
@ -300,30 +283,6 @@ except Exception as e:
print(f"[ComfyUI-Manager] Logging failed: {e}")
try:
import git
except ModuleNotFoundError:
my_path = os.path.dirname(__file__)
requirements_path = os.path.join(my_path, "requirements.txt")
print(f"## ComfyUI-Manager: installing dependencies. (GitPython)")
try:
result = subprocess.check_output([sys.executable, '-s', '-m', 'pip', 'install', '-r', requirements_path])
except subprocess.CalledProcessError as e:
print(f"## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.")
try:
result = subprocess.check_output([sys.executable, '-s', '-m', 'pip', 'install', '--user', '-r', requirements_path])
except subprocess.CalledProcessError as e:
print(f"## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)")
try:
import git
print(f"## ComfyUI-Manager: installing dependencies done.")
except:
# maybe we should sys.exit() here? there is at least two screens worth of error messages still being pumped after our error messages
print(f"## [ERROR] ComfyUI-Manager: GitPython package seems to be installed, but failed to load somehow. Make sure you have a working git client installed")
print("** ComfyUI startup time:", datetime.datetime.now())
print("** Platform:", platform.system())
print("** Python version:", sys.version)
@ -432,6 +391,8 @@ def is_installed(name):
if os.path.exists(restore_snapshot_path):
try:
import json
cloned_repos = []
def msg_capture(stream, prefix):
@ -459,39 +420,40 @@ if os.path.exists(restore_snapshot_path):
cmd_str = [sys.executable, git_script_path, '--apply-snapshot', restore_snapshot_path]
exit_code = process_wrap(cmd_str, custom_nodes_path, handler=msg_capture)
repository_name = ''
for url in cloned_repos:
try:
repository_name = url.split("/")[-1].strip()
repo_path = os.path.join(custom_nodes_path, repository_name)
repo_path = os.path.abspath(repo_path)
requirements_path = os.path.join(repo_path, 'requirements.txt')
install_script_path = os.path.join(repo_path, 'install.py')
this_exit_code = 0
if os.path.exists(requirements_path):
with open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file:
for line in file:
package_name = remap_pip_package(line.strip())
if package_name and not is_installed(package_name):
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
this_exit_code += process_wrap(install_cmd, repo_path)
if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install:
processed_install.add(f'{repo_path}/install.py')
install_cmd = [sys.executable, install_script_path]
print(f">>> {install_cmd} / {repo_path}")
this_exit_code += process_wrap(install_cmd, repo_path)
if this_exit_code != 0:
with open(restore_snapshot_path, 'r', encoding="UTF-8", errors="ignore") as json_file:
info = json.load(json_file)
for url in cloned_repos:
try:
repository_name = url.split("/")[-1].strip()
repo_path = os.path.join(custom_nodes_path, repository_name)
repo_path = os.path.abspath(repo_path)
requirements_path = os.path.join(repo_path, 'requirements.txt')
install_script_path = os.path.join(repo_path, 'install.py')
this_exit_code = 0
if os.path.exists(requirements_path):
with open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file:
for line in file:
package_name = line.strip()
if package_name and not is_installed(package_name):
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
this_exit_code += process_wrap(install_cmd, repo_path)
if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install:
processed_install.add(f'{repo_path}/install.py')
install_cmd = [sys.executable, install_script_path]
print(f">>> {install_cmd} / {repo_path}")
this_exit_code += process_wrap(install_cmd, repo_path)
if this_exit_code != 0:
print(f"[ComfyUI-Manager] Restoring '{repository_name}' is failed.")
except Exception as e:
print(e)
print(f"[ComfyUI-Manager] Restoring '{repository_name}' is failed.")
except Exception as e:
print(e)
print(f"[ComfyUI-Manager] Restoring '{repository_name}' is failed.")
if exit_code != 0:
print(f"[ComfyUI-Manager] Restore snapshot failed.")
else:
@ -514,7 +476,7 @@ def execute_lazy_install_script(repo_path, executable):
print(f"Install: pip packages for '{repo_path}'")
with open(requirements_path, "r") as requirements_file:
for line in requirements_file:
package_name = remap_pip_package(line.strip())
package_name = line.strip()
if package_name and not is_installed(package_name):
install_cmd = [executable, "-m", "pip", "install", package_name]
process_wrap(install_cmd, repo_path)

5
requirements.txt

@ -2,7 +2,4 @@ GitPython
PyGithub
matrix-client==0.4.0
transformers
huggingface-hub>0.20
typer
rich
typing-extensions
huggingface-hub>0.20

101
scanner.py

@ -37,36 +37,21 @@ else:
print(f"TEMP DIR: {temp_dir}")
parse_cnt = 0
def extract_nodes(code_text):
global parse_cnt
try:
if parse_cnt % 100 == 0:
print(f".", end="", flush=True)
parse_cnt += 1
code_text = re.sub(r'\\[^"\']', '', code_text)
parsed_code = ast.parse(code_text)
assignments = (node for node in parsed_code.body if isinstance(node, ast.Assign))
for assignment in assignments:
if isinstance(assignment.targets[0], ast.Name) and assignment.targets[0].id in ['NODE_CONFIG', 'NODE_CLASS_MAPPINGS']:
if isinstance(assignment.targets[0], ast.Name) and assignment.targets[0].id == 'NODE_CLASS_MAPPINGS':
node_class_mappings = assignment.value
break
else:
node_class_mappings = None
if node_class_mappings:
s = set()
for key in node_class_mappings.keys:
if key is not None and isinstance(key.value, str):
s.add(key.value.strip())
s = set([key.s.strip() for key in node_class_mappings.keys if key is not None])
return s
else:
return set()
@ -93,24 +78,15 @@ def scan_in_file(filename, is_builtin=False):
nodes |= extract_nodes(code)
def extract_keys(pattern, code):
keys = re.findall(pattern, code)
return {key.strip() for key in keys}
def update_nodes(nodes, new_keys):
nodes |= new_keys
pattern2 = r'^[^=]*_CLASS_MAPPINGS\["(.*?)"\]'
keys = re.findall(pattern2, code)
for key in keys:
nodes.add(key.strip())
patterns = [
r'^[^=]*_CLASS_MAPPINGS\["(.*?)"\]',
r'^[^=]*_CLASS_MAPPINGS\[\'(.*?)\'\]',
r'@register_node\("(.+)",\s*\".+"\)',
r'"(\w+)"\s*:\s*{"class":\s*\w+\s*'
]
with concurrent.futures.ThreadPoolExecutor() as executor:
futures = {executor.submit(extract_keys, pattern, code): pattern for pattern in patterns}
for future in concurrent.futures.as_completed(futures):
update_nodes(nodes, future.result())
pattern3 = r'^[^=]*_CLASS_MAPPINGS\[\'(.*?)\'\]'
keys = re.findall(pattern3, code)
for key in keys:
nodes.add(key.strip())
matches = regex.findall(code)
for match in matches:
@ -227,7 +203,7 @@ def clone_or_pull_git_repository(git_url):
try:
repo = Repo(repo_dir)
origin = repo.remote(name="origin")
origin.pull()
origin.pull(rebase=True)
repo.git.submodule('update', '--init', '--recursive')
print(f"Pulling {repo_name}...")
except Exception as e:
@ -278,9 +254,6 @@ def update_custom_nodes():
if is_rate_limit_exceeded():
return
if 'github.com' not in url:
return None
print('.', end="")
sys.stdout.flush()
try:
@ -294,31 +267,22 @@ def update_custom_nodes():
repo = g.get_repo(owner_repo)
last_update = repo.pushed_at.strftime("%Y-%m-%d %H:%M:%S") if repo.pushed_at else 'N/A'
item = {
github_stats[url] = {
"stars": repo.stargazers_count,
"last_update": last_update,
"cached_time": datetime.datetime.now().timestamp(),
}
return url, item
with open(GITHUB_STATS_CACHE_FILENAME, 'w', encoding='utf-8') as file:
json.dump(github_stats, file, ensure_ascii=False, indent=4)
else:
print(f"\nInvalid URL format for GitHub repository: {url}\n")
except Exception as e:
print(f"\nERROR on {url}\n{e}")
return None
# resolve unresolved urls
with concurrent.futures.ThreadPoolExecutor(11) as executor:
futures = []
for url, title, preemptions, node_pattern in git_url_titles_preemptions:
if url not in github_stats:
futures.append(executor.submit(renew_stat, url))
for future in concurrent.futures.as_completed(futures):
url_item = future.result()
if url_item is not None:
url, item = url_item
github_stats[url] = item
for url, title, preemptions, node_pattern in git_url_titles_preemptions:
if url not in github_stats:
renew_stat(url)
# renew outdated cache
outdated_urls = []
@ -327,34 +291,26 @@ def update_custom_nodes():
if elapsed > 60*60*12: # 12 hours
outdated_urls.append(k)
with concurrent.futures.ThreadPoolExecutor(11) as executor:
for url in outdated_urls:
futures.append(executor.submit(renew_stat, url))
for future in concurrent.futures.as_completed(futures):
url_item = future.result()
if url_item is not None:
url, item = url_item
github_stats[url] = item
with open('github-stats-cache.json', 'w', encoding='utf-8') as file:
json.dump(github_stats, file, ensure_ascii=False, indent=4)
for url in outdated_urls:
renew_stat(url)
with open(GITHUB_STATS_FILENAME, 'w', encoding='utf-8') as file:
for v in github_stats.values():
if "cached_time" in v:
del v["cached_time"]
github_stats = dict(sorted(github_stats.items()))
json.dump(github_stats, file, ensure_ascii=False, indent=4)
print(f"Successfully written to {GITHUB_STATS_FILENAME}.")
if not skip_stat_update:
process_git_stats(git_url_titles_preemptions)
print(f"Successfully written to {GITHUB_STATS_FILENAME}, removing {GITHUB_STATS_CACHE_FILENAME}.")
# try:
# os.remove(GITHUB_STATS_CACHE_FILENAME) # This cache file is just for avoiding failure of GitHub API fetch, so it is safe to remove.
# except:
# pass
with concurrent.futures.ThreadPoolExecutor(11) as executor:
if not skip_stat_update:
executor.submit(process_git_stats, git_url_titles_preemptions) # One single thread for `process_git_stats()`. Runs concurrently with `process_git_url_title()`.
for url, title, preemptions, node_pattern in git_url_titles_preemptions:
executor.submit(process_git_url_title, url, title, preemptions, node_pattern)
@ -489,4 +445,3 @@ updated_node_info = update_custom_nodes()
print("\n# 'extension-node-map.json' file is generated.\n")
gen_json(updated_node_info)
print("\nDONE.\n")

162
tools/resolve_requirements.py

@ -0,0 +1,162 @@
import requests
import sys
import re
from typing import Tuple, Optional
from packaging import version, specifiers
import re
import traceback
import re
from typing import Tuple, Optional
def parse_pip_spec(spec: str) -> Tuple[str, Optional[str], Optional[str]]:
match = re.match(r'([A-Za-z0-9_-]+)(\[[^\]]+\])?(.*)', spec)
if match:
package_name = match.group(1).strip()
extras = match.group(2)[1:-1] if match.group(2) else None
version_spec = None
if match.group(3):
version_match = re.match(r'\(?([^\)]+)\)?', match.group(3).strip())
if version_match:
version_spec = version_match.group(1).strip()
return package_name, extras, version_spec
else:
raise ValueError(f"Invalid package spec: {spec}")
def fetch_package_versions(package_name):
url = f"https://pypi.org/pypi/{package_name}/json"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
versions = data["releases"].keys()
print(f"Available versions of '{package_name}':")
return list(versions)
except requests.RequestException as e:
print(f"Error fetching package versions: {e}")
return []
def fetch_required_dist(package_name, ver):
url = f"https://pypi.org/pypi/{package_name}/{ver}/json"
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
requires_dist = data.get('info', {}).get('requires_dist', [])
if not requires_dist:
print(f"No dependencies found for {package_name} version {ver}.")
return []
dependencies = []
for dist in requires_dist:
dist = dist.split(";")
dist_extra = None
if len(dist) > 1:
match = re.match(r'extra\s*==\s*"([^"]*)"', dist[1].strip())
if match:
dist_extra = match.group(1).strip()
match = re.match(r'([^=<>!~]+)(.*)', dist[0].strip())
if match:
pkg_name = match.group(1).strip()
ver_spec = match.group(2).strip() or None
if ver_spec is not None and ver_spec.endswith(')'):
pass
dependencies.append((pkg_name, dist_extra, ver_spec))
# print(f"Processed dependencies for {package_name} version {ver}: {dependencies}")
return dependencies
except requests.RequestException as e:
print(f"Error fetching required distribution info: {e}")
return []
def filter_versions(versions, spec):
try:
specifier = specifiers.SpecifierSet(spec) if spec else specifiers.SpecifierSet()
res = []
for v in versions:
match = re.match(r'^([0-9.]+[0-9])', v)
if match:
if match.group(1) in specifier:
res.append(v)
return res
except Exception as e:
print(f"ERROR: {e}")
traceback.print_exc()
def filter_extras(required_dist, extras):
return [x for x in required_dist if x[1] is None or x[1] == extras]
resolved = {}
def resolve_pip_spec(pkg_name, extras, ver):
global resolved
required_dist = fetch_required_dist(pkg_name, ver)
resolved[(pkg_name, extras, ver)] = required_dist
return filter_extras(required_dist, extras)
def best_match(pkg_name, version_spec):
global resolved
candidate_versions = fetch_package_versions(pkg_name)
if version_spec:
candidate_versions = filter_versions(candidate_versions, version_spec)
if candidate_versions:
return max(candidate_versions, key=version.parse)
else:
print("No matching versions found.")
return None
def resolve_recursively(items):
worklist = items
while worklist:
pkg_name, extras, version_spec = worklist[0]
worklist = worklist[1:]
ver = best_match(pkg_name, version_spec)
if (pkg_name, extras, ver) in resolved:
continue
if ver is not None:
nexts = resolve_pip_spec(pkg_name, extras, ver)
worklist += nexts
def main():
global resolved
if len(sys.argv) < 2:
print("Usage: python script.py <package_name>")
sys.exit(1)
pkg_name, extras, version_spec = parse_pip_spec(sys.argv[1])
ver = best_match(pkg_name, version_spec)
required_dist = resolve_pip_spec(pkg_name, extras, ver)
resolve_recursively(required_dist)
print(f"Requirements: {resolved}")
if __name__ == "__main__":
main()

3
tools/usage.md

@ -0,0 +1,3 @@
example:
python resolve_requirements.py opencv-python\>=4.7,\<4.8
Loading…
Cancel
Save