Compare commits

...

254 Commits

Author SHA1 Message Date
Dr.Lt.Data
8dd84bb0ec typo fix 2024-10-08 08:31:31 +09:00
Dr.Lt.Data
e9eaff7f7e double click feature is fixed
MODIFIED: separate into copy-full and copy-all
FIXED: improper size copying

https://github.com/ltdrdata/ComfyUI-Manager/issues/1118
2024-10-08 08:28:33 +09:00
Dr.Lt.Data
0469cad3bc security policy is modified
MODIFIED: Fix custom nodes feature belongs to `high` level risky features
2024-10-07 08:58:47 +09:00
Dr.Lt.Data
d289dd523a update DB 2024-10-07 00:29:37 +09:00
Dr.Lt.Data
1cb6adb3dc update DB 2024-10-05 17:16:17 +09:00
SpenserCai
e93d0ab0f2 Fix link in FunAudioLLM (#1115)
* add ComfyUI-FunAudioLLM

* fix link in FunAudioLLM
2024-10-05 17:11:32 +09:00
Dr.Lt.Data
61537d985d FIXED: component feature - compatibility patch
https://github.com/ltdrdata/ComfyUI-Manager/issues/1108
2024-10-05 15:33:22 +09:00
Dr.Lt.Data
c999886fe0 update DB 2024-10-05 15:22:16 +09:00
chrisgoringe
0e6e391caf Update custom-node-list.json (#1110)
Add comfy controller
2024-10-05 14:32:40 +09:00
YarvixPA
26573ce489 Update custom-node-list.json (#1111) 2024-10-05 14:31:09 +09:00
SpenserCai
c2869c8c67 add ComfyUI-FunAudioLLM (#1112) 2024-10-05 14:30:25 +09:00
akatz
792a836121 Update custom-node-list.json with Depthflow Nodes pack (#1113) 2024-10-05 14:28:29 +09:00
Dr.Lt.Data
72ef927b32 update DB 2024-10-03 23:36:03 +09:00
stephennilor
bb67901e92 add nilor-nodes to custom node list db (#1106)
* add nilor-nodes to custom node list db

* Update custom-node-list.json

---------

Co-authored-by: Stephen <>
Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2024-10-03 23:02:49 +09:00
Johan Mellin
f87d4ea150 Update custom-node-list.json (#1107)
Trying this again since you added my node to node_db/new/custom-node-list.json but never in the live custom-node-list.json
2024-10-03 22:58:38 +09:00
Dr.Lt.Data
7ec376774f update DB 2024-10-02 00:15:48 +09:00
Jet Chopper
21ed4bd420 custom-node-list update (#1103)
Co-authored-by: mykhailo-kabanenko <mykhailo.kabanenko@lumiere3d.ai>
2024-10-02 00:07:50 +09:00
Dr.Lt.Data
93b8c39ad7 update DB 2024-10-02 00:04:56 +09:00
Mcmillian
6ea771781f Update custom-node-list.json (#1090) 2024-10-01 23:03:33 +09:00
Dr.Lt.Data
7fc4343dac update DB 2024-10-01 23:03:08 +09:00
BriaOr
b12bd3849c Added Bria AI's comfy-ui nodes repos to the registry (#1098) 2024-10-01 23:02:15 +09:00
Dr.Lt.Data
78d9cbe659 update DB 2024-10-01 23:01:27 +09:00
Dan Bochman
3e3800bc59 node for fashn-ai api (#1100) 2024-10-01 23:00:54 +09:00
Dr.Lt.Data
9adbff6e16 update DB 2024-10-01 22:59:33 +09:00
ez-af
f7a2e3f874 Add ez-af (#1101)
* Add files via upload

* Add files via upload
2024-10-01 22:58:40 +09:00
James Veitch
5b78ce0bff add comfydv nodes to custom-node-list.json (#1102) 2024-10-01 22:57:22 +09:00
CYCHENYUE
2f2ac86513 Update install_type for ComfyUI-Molmo in custom-node-list.json (#1097)
Changed the install_type for ComfyUI-Molmo from 'git_clone' to 'git-clone' to resolve installation issues and maintain consistency with other extensions.

The nodes are already available in the manager, but the installation prompt says “ComfyUI-Molmo install failed: Bad Request”, is this related?
2024-10-01 11:28:38 +09:00
Dr.Lt.Data
fbb1cd60d6 add docs.comfy.org
https://github.com/ltdrdata/ComfyUI-Manager/pull/1095
2024-09-29 17:18:06 +09:00
Dr.Lt.Data
51d3f3829c update DB 2024-09-29 16:59:23 +09:00
Dr.Lt.Data
53c8fc7751 update DB 2024-09-29 16:55:24 +09:00
CYCHENYUE
22fa2825f8 Update custom-node-list.json (#1094)
Use of the molmo model.Generate detailed image descriptions and analysis using Molmo models in ComfyUI.
2024-09-29 16:54:42 +09:00
Dr.Lt.Data
752c17df3c update DB 2024-09-29 16:54:24 +09:00
codecringebinge
66542292c3 Add ComfyUI-Arrow-Key-Canvas-Navigation to custom-node-list.json (#1096) 2024-09-29 16:34:26 +09:00
Dr.Lt.Data
4745597c0a update DB 2024-09-29 16:33:44 +09:00
CYCHENYUE
1e7d101063 Update custom-node-list.json (#1093)
* Update custom-node-list.json

Custom nodes for MiniCPM language models in ComfyUI. Provides advanced text generation and image understanding functions.

* Update custom-node-list.json

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2024-09-29 16:29:57 +09:00
Dr.Lt.Data
4dc9ee9363 update DB 2024-09-27 22:46:30 +09:00
plugcrypt
07f9a34036 Update custom-node-list.json (#1087)
This set includes toggle nodes for Lora Unet blocks L1/L2
https://github.com/plugcrypt/CRT-Nodes
2024-09-27 22:30:01 +09:00
Timofey Valov
97b55a0da6 OpenRouter node (#1086)
* Update custom-node-list.json

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2024-09-27 16:15:42 +09:00
Dr.Lt.Data
cb8bcd7edf update DB 2024-09-26 09:49:08 +09:00
Dr.Lt.Data
eb607a6b41 version marker 2024-09-26 09:14:14 +09:00
bymyself
32430968b8 Update groupnode/component to be compatible with frontend v1.2.64 (#1084) 2024-09-26 08:33:14 +09:00
Dr.Lt.Data
f3e9856107 update DB 2024-09-25 23:32:11 +09:00
Johan Mellin
d9ec870598 Update custom-node-list.json (#1083)
added ComfyUI GLM-4 Wrapper. https://github.com/Nojahhh/ComfyUI_GLM4_Wrapper
2024-09-25 23:26:59 +09:00
Dr.Lt.Data
a182e526d7 update DB 2024-09-24 22:25:28 +09:00
Dr.Lt.Data
a8d338a997 update DB 2024-09-24 09:03:10 +09:00
Silver
9589f343df Re-add renamed custom node repo and to correct node list (#1077) 2024-09-24 08:54:58 +09:00
Douglas Griffith
71c602be95 fix duplicate repo in custom-node-list (#1082) 2024-09-24 08:35:06 +09:00
Dr.Lt.Data
1d7777fb0b update DB 2024-09-24 02:00:38 +09:00
Dr.Lt.Data
ffc095a3e5 robust validation 2024-09-24 01:59:35 +09:00
Dr.Lt.Data
8db932afd9 update DB 2024-09-24 01:22:35 +09:00
Dr.Lt.Data
45c2cfd92e update DB 2024-09-23 01:13:05 +09:00
Dr.Lt.Data
8bb5eecf0d update DB 2024-09-21 20:03:34 +09:00
Dr.Lt.Data
5dc4cf7206 update DB 2024-09-21 02:38:07 +09:00
Oleksandr Yalynskyi
e73d66d65a add ComfyUI-Color_Transfer nodes to list (#1074) 2024-09-21 02:35:32 +09:00
Dr.Lt.Data
40b2050e71 update DB 2024-09-21 02:35:03 +09:00
Pedro Gabriel Gengo Lourenço
0cc279b109 Adding Luma custom nodes (#1075)
Co-authored-by: Pedro Gengo <pedro@Pedros-MacBook-Pro-2.local>
2024-09-21 02:34:13 +09:00
Dr.Lt.Data
86e13b6ee1 update DB 2024-09-21 01:38:37 +09:00
Dr.Lt.Data
131d2dae3c update DB 2024-09-21 00:09:05 +09:00
Dr.Lt.Data
de3cd9fe72 update DB 2024-09-19 22:36:37 +09:00
Isi
b8389e81a1 Please add ComfyUI Image to Painting and Inspyrenet Assistant Nodes (#1068)
* Update custom-node-list.json with ComfyUI-Img2DrawingAssistants

* Update custom-node-list.json

* Update custom-node-list.json
2024-09-19 22:23:20 +09:00
Paul Molodowitch
3e4ea1662c model-list.json: update url for t5-v1_1-xxl_encoderonly-fp16 (#1069)
The filename in the git repo was changed from "pytorch_model.safetensors" to "model.safetensors":

b13e9156c8
2024-09-19 09:01:35 +09:00
Paul Molodowitch
bc63b2cd3f model-list.json: fix save-path for flux1-dev-F16.gguf (#1070)
The save path has a typo - it saves to the "diffusion_model" subfolder (no "s"), instead of "diffusion_models"
2024-09-19 09:00:41 +09:00
Dr.Lt.Data
3701246fb1 use core badge feature if possible
https://github.com/ltdrdata/ComfyUI-Manager/pull/1051
2024-09-19 02:43:07 +09:00
Dr.Lt.Data
0e4b47c13d update DB 2024-09-19 01:48:36 +09:00
Dr.Lt.Data
79b4136403 update DB 2024-09-18 22:01:14 +09:00
Alexander G. Morano
91425aea62 Cozy Link Toggle (#1067)
https://github.com/cozy-comfyui/cozy_link_toggle
2024-09-18 21:45:55 +09:00
Dr.Lt.Data
6d61491a5b update DB 2024-09-18 01:35:01 +09:00
Christopher Woggon
efbb251635 Added chris-comfyui-nodes (#1066) 2024-09-18 01:22:49 +09:00
Dr.Lt.Data
18b66c7835 update DB 2024-09-17 23:15:41 +09:00
OgreLemonSoup
edb77c24ad Update title and description custom-node-list.json (#1064) 2024-09-17 23:05:54 +09:00
NyaamZ
4e01e70ef5 add Efficiency Nodes ED and ComfyUI ImageGallery ED (#1063)
* add

add

* Update custom-node-list.json

* Add files via upload

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2024-09-17 23:04:46 +09:00
Dr.Lt.Data
0e16c0cb24 update DB 2024-09-17 16:14:09 +09:00
Dr.Lt.Data
7e777c5460 update DB 2024-09-16 12:56:45 +09:00
Dr.Lt.Data
07402c7a90 update DB 2024-09-16 02:12:53 +09:00
Dr.Lt.Data
1c19fa9e38 update DB 2024-09-16 01:44:31 +09:00
Dayuppy
8c799dbf5c Add ComfyUI-DiscordWebhook to custom node list (#1061)
,
        {
            "author": "Dayuppy",
            "title": "Discord Webhook",
            "id": "DiscordWebhook",
            "reference": "https://github.com/Dayuppy/ComfyUI-DiscordWebhook",
            "files": [
                "https://github.com/Dayuppy/ComfyUI-DiscordWebhook"
            ],
            "install_type": "git-clone",
            "description": "A very simple Discord webhook integration node for ComfyUI that lets you post images and text."
        },
2024-09-16 01:43:43 +09:00
Peyton DeNiro
65f26ae443 Add Comfyui to Python Extension to custom node list. (#1060) 2024-09-16 01:41:38 +09:00
Dr.Lt.Data
b690e71ecb update DB 2024-09-14 16:06:16 +09:00
glide-the
4ba4ef3c7d ComfyUI ZhipuAI Platform (#1057)
* This platform extension provides ZhipuAI etector nodes and detailer nodes, enabling you to configure a workflow for online video generation

* Moving repository

* Refactor custom-node-list.json to update ZhipuAI extension description

---------

Co-authored-by: chchchch <stu_chenhao@163.com>
2024-09-14 15:50:18 +09:00
Dr.Lt.Data
704a73888a update DB 2024-09-13 17:46:25 +09:00
Daxton Caylor
d2bf1112ad New Node ComfyUI-TG (#1056)
* Update custom-node-list.json

* Update custom-node-list.json

New Node Comfy-WA

* Update custom-node-list.json
2024-09-13 17:42:51 +09:00
AirzoStorm
33e3da1f12 add comfyui-nettools (#1054)
Co-authored-by: zhuowenhao <zhuowenhao@huya.com>
2024-09-13 17:17:38 +09:00
Dr.Lt.Data
0314610a95 update DB 2024-09-13 01:43:13 +09:00
Fuwuffy
98f6da3222 Add comfyui-visual-area-nodes to custom nodes list (#1052)
* add comfyui-visual-area-nodes

* fix wording comfyui-visual-area-nodes
2024-09-13 01:17:38 +09:00
Patrice Ferlet
19c660c965 Add Human Parts Detector (#1050)
Human Parts Detector is a custom node I created with an exported model to ONNX format.
2024-09-13 01:15:56 +09:00
Dr.Lt.Data
6ed23c7abe update DB 2024-09-12 01:43:42 +09:00
Dr.Lt.Data
5a87326518 update DB 2024-09-11 00:07:43 +09:00
Yvann
584c500247 Change Description of my custom nodes pack "ComfyUI_Yvann-Nodes" (#1046)
* Change Description of my custom nodes pack "ComfyUI_Yvann-Nodes"

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2024-09-10 09:52:02 +09:00
Dr.Lt.Data
bd790a2cd4 update DB 2024-09-10 00:43:15 +09:00
Alex Cong
7e27275eae add comfyui-qwen2-vl node (#1043)
* add comfyui-qwen2-vl node

* fix formating

* fix formating

---------

Co-authored-by: alexcong <alexcong@alexcong.com>
2024-09-10 00:29:27 +09:00
Dr.Lt.Data
89ca98e84f update DB 2024-09-10 00:28:56 +09:00
daxcay
342bb62635 New Node Comfy-WA (#1045)
* Update custom-node-list.json

* Update custom-node-list.json

New Node Comfy-WA
2024-09-10 00:27:28 +09:00
Dan
7da0bf5a2e Added Prompt Gallery to the custom node list (#1044) 2024-09-10 00:25:28 +09:00
Dr.Lt.Data
ce874d5c62 update DB 2024-09-09 01:29:36 +09:00
Dr.Lt.Data
25d47ac7d0 update DB 2024-09-08 12:46:27 +09:00
John Morrissey
a2be700a87 Update custom-node-list.json (#1041)
Added comfyui-simplefeed to list of modules.
2024-09-08 12:16:43 +09:00
bymyself
e396d48488 Fix Terminal Log node render (#1042) 2024-09-08 12:06:47 +09:00
Dr.Lt.Data
0c57379dfe update DB 2024-09-07 00:51:14 +09:00
Dr.Lt.Data
b885100dfe update DB 2024-09-06 23:59:02 +09:00
Dr.Lt.Data
3d0d201208 update DB 2024-09-05 23:32:06 +09:00
Dr.Lt.Data
2e4d1d51e5 update DB 2024-09-05 22:24:33 +09:00
Dr.Lt.Data
a18f6045a3 update DB 2024-09-05 22:18:35 +09:00
Gecco
9f08900064 Add Gecco Discord Autosend to custom node list (#1033)
* Add Gecco Discord Autosend to custom node list

* Update custom-node-list.json
2024-09-05 21:50:17 +09:00
Cesaryuan
e0b88ce42a Fix white theme of Share window (#1036) 2024-09-05 21:49:24 +09:00
Dr.Lt.Data
1ff2ec760b update DB 2024-09-05 02:19:34 +09:00
Dr.Lt.Data
216214625a update DB 2024-09-05 01:49:05 +09:00
Dr.Lt.Data
740b763e78 update DB 2024-09-03 02:35:21 +09:00
lazniak
cd9b9a8ab8 Add Head Orientation Node for ComfyUI to custom node list (#1030)
This pull request adds the Head Orientation Node for ComfyUI to the custom node list. 

Key features of the Head Orientation Node:
- Analyzes and sorts images based on facial orientation using MediaPipe
- Detects facial landmarks and calculates head pose (pitch, yaw, roll)
- Supports batch processing of multiple images
- Enhances AI image processing workflows with intelligent image sorting

Technical details:
- Implemented in Python using MediaPipe, OpenCV, and NumPy
- Compatible with existing ComfyUI infrastructure
- Thoroughly tested for accuracy and performance

This node fills a gap in the current ComfyUI ecosystem by providing advanced facial analysis capabilities, which can be particularly useful for tasks like:
- Automated portrait retouching
- Dataset preparation for facial recognition models
- Creating consistent facial animations

The code follows best practices for Python development and adheres to the Apache 2.0 license, ensuring compatibility with ComfyUI and its extensions.

I've thoroughly tested this node and believe it will be a valuable addition to the ComfyUI toolkit. I'm open to any feedback or suggestions for improvement.

Thank you for considering this contribution to the ComfyUI-Manager repository.
2024-09-03 02:31:54 +09:00
Dr.Lt.Data
faf1600721 update DB 2024-09-02 01:11:47 +09:00
Dr.Lt.Data
f75384ecdd update DB 2024-09-01 15:48:49 +09:00
Dr.Lt.Data
bfb9a7b855 update DB 2024-09-01 01:31:24 +09:00
Hmily
78314d9529 Update custom-node-list.json (#1025) 2024-09-01 01:01:59 +09:00
Dr.Lt.Data
019cce0203 update DB 2024-09-01 01:01:38 +09:00
IuvenisSapiens
2911861db8 add custom node ComfyUI_Qwen2-VL-Instruct (#1024)
* add custom node ComfyUI_Qwen2-Audio-7B-Instruct-Int4

* new custom_node
2024-09-01 01:00:37 +09:00
Dr.Lt.Data
0f679ac99c update DB 2024-08-31 10:37:28 +09:00
Dr.Lt.Data
33bfddeba9 update DB 2024-08-31 01:47:52 +09:00
Dr.Lt.Data
0486f5a294 update DB 2024-08-31 01:05:25 +09:00
Bao Pham
b94c06f81c lyra-vsih (#1017) 2024-08-31 01:04:20 +09:00
Dr.Lt.Data
d7170c0264 update DB 2024-08-29 23:01:17 +09:00
Dr.Lt.Data
60405fcfbc update DB 2024-08-29 22:25:56 +09:00
Dr.Lt.Data
c0cc37787a update DB 2024-08-29 21:51:31 +09:00
racerx2oo3
d4812c09a4 Handle comments on the same line as package name (#1020)
Co-authored-by: SKilbride <110414370+SKilbride@users.noreply.github.com>
2024-08-29 09:34:57 +09:00
Dr.Lt.Data
600c8117a3 update DB 2024-08-29 02:38:02 +09:00
Milad
1a156b1c75 Adding InstaSD custom input nodes (#1019) 2024-08-29 02:31:56 +09:00
Dr.Lt.Data
f5d656c87d update DB 2024-08-28 23:56:28 +09:00
Dr.Lt.Data
f22a7d29dd update DB 2024-08-28 23:45:19 +09:00
Dr.Lt.Data
a7bde44ea9 update DB 2024-08-28 21:37:13 +09:00
tianguanggliu
2783a1da1b pull (#1014)
Co-authored-by: ltg-dyrs <ltg@dyrs.com>
2024-08-28 21:11:18 +09:00
Dr.Lt.Data
5c504ca9f4 update DB 2024-08-28 21:10:26 +09:00
Dominic Roberge
fe44dd08cc Update D00MYsNodes description and nodes list (#1011)
* Update D00MYsNodes description and nodes

* Update in the right place?

* Spaces nickpicking

* New node
2024-08-28 21:09:04 +09:00
Jukka Seppänen
9077f683ae Add CogVideoX wrapper and LLaVA-OneVision -nodes (#1012)
* Add IC-Light nodes and models

* Add Florence2 and LuminaWrapper -nodes

https://github.com/kijai/ComfyUI-Florence2
https://github.com/kijai/ComfyUI-LuminaWrapper

* Update custom-node-list.json

* Update custom-node-list.json

* Update custom-node-list.json

* Add segment-anything-2

* Update custom-node-list.json

* Add T5 encoder models

* Update custom-node-list.json
2024-08-28 21:08:00 +09:00
Isi
9413c3e100 Update custom-node-list.json with ComfyUI-Img2DrawingAssistants (#1010) 2024-08-28 21:06:38 +09:00
morikuni
8c2563e64a Fix SyntaxError: invalid syntax (#1013) 2024-08-28 13:29:28 +09:00
Dr.Lt.Data
7d8a279a12 update DB 2024-08-28 01:38:10 +09:00
xlinx@decade
382498e01d Update custom-node-list.json (#1008)
[update] change tittle match git repositories name shows in Manager node list. In the future can simply login and change it on registry web.
2024-08-28 00:42:12 +09:00
Dr.Lt.Data
820598cdb8 update DB 2024-08-27 01:16:53 +09:00
Dr.Lt.Data
42f33a2dca update DB 2024-08-26 22:48:13 +09:00
Nguyễn Minh Đức
ca0765ac00 add ObjectFusion custom nodes (#1001) 2024-08-26 22:07:45 +09:00
Dr.Lt.Data
49aee6f291 update DB 2024-08-26 01:09:48 +09:00
Dr.Lt.Data
5e20b74dcc update DB 2024-08-26 00:52:42 +09:00
Dr.Lt.Data
fa87ebd9a7 update DB 2024-08-25 11:54:47 +09:00
Dr.Lt.Data
b0b1505777 update DB 2024-08-24 19:09:56 +09:00
Dr.Lt.Data
0d85c2e88a update DB 2024-08-24 18:30:05 +09:00
IuvenisSapiens
61da8de828 add custom node ComfyUI_Qwen2-Audio-7B-Instruct-Int4 (#988) 2024-08-24 18:25:35 +09:00
daxcay
61ee956043 Update custom-node-list.json (#997) 2024-08-24 17:22:10 +09:00
Dr.Lt.Data
efd081a2c5 Update DB 2024-08-24 17:09:11 +09:00
Dr.Lt.Data
c9134d1eeb update DB 2024-08-24 14:19:56 +09:00
Dr.Lt.Data
36de48302d update DB 2024-08-24 14:19:16 +09:00
Dr.Lt.Data
f74481cb53 update DB 2024-08-24 11:07:33 +09:00
niknah
4c17839831 Added quick-connections custom node (#996) 2024-08-24 09:44:14 +09:00
Dr.Lt.Data
ea7e44e122 update DB 2024-08-24 09:42:05 +09:00
Dr. Jusseaux
bc02161d56 added Diffusers-in-ComfyUI custom node (#994)
Co-authored-by: Maëlys Jusseaux <https://gitlab.com/mjusseaux>
2024-08-24 09:39:33 +09:00
Dr.Lt.Data
e8d5c92cb3 update DB 2024-08-23 00:48:33 +09:00
Dr.Lt.Data
c6c35115e1 update DB 2024-08-22 23:11:06 +09:00
Baurzhan Abenov
029a597a31 Added entry for my custom node (#991) 2024-08-22 23:09:40 +09:00
Dr.Lt.Data
6619b9b98b update DB 2024-08-22 23:09:16 +09:00
aidenli
225c3e3a20 add custom node ComfyUI_NYJY (#987) 2024-08-22 23:07:29 +09:00
Dr.Lt.Data
596316536e fix: invalid etc model path
https://github.com/ltdrdata/ComfyUI-Manager/pull/942#issuecomment-2303932387
2024-08-22 23:05:55 +09:00
Dr.Lt.Data
521e92796b update DB 2024-08-22 00:41:09 +09:00
Dr.Lt.Data
2a50beb9ee update DB 2024-08-22 00:29:34 +09:00
雛星 φυβλας
e310072782 Update custom-node-list.json (#985) 2024-08-21 23:49:11 +09:00
dr.lt.data
622c449a86 update DB 2024-08-21 11:31:51 +09:00
Ex-nihilo
b4aa41cac1 Update model-list.json (#986)
Rename flux1-schnell.sft to flux1-schnell.safetensors as it was done on the Hf page, the download is currently broken without this.
2024-08-21 11:31:02 +09:00
Dr.Lt.Data
6b7c4d6330 update DB 2024-08-21 00:16:12 +09:00
Dr.Lt.Data
f5d997bbbb update DB 2024-08-20 00:52:57 +09:00
Dr.Lt.Data
fea911c3d7 update DB 2024-08-19 23:56:15 +09:00
Zhongjie Duan
5222c277e6 Add Dashscope FLUX API node (#981) 2024-08-19 23:31:08 +09:00
Dr.Lt.Data
5835a1da5c update DB 2024-08-19 23:30:27 +09:00
Trần Lê Anh Khoa
2120d76250 feat: Add Handy Node ComfyUI to custom-node-list.json (#979) 2024-08-19 23:29:12 +09:00
Dr.Lt.Data
79f132c23b update DB 2024-08-18 13:00:11 +09:00
Dr.Lt.Data
4b92288f7b update DB 2024-08-18 12:56:07 +09:00
Xrvk
b9c667cdcc Add eesahesNodes (InstantX's Flux union ControlNet loader and implementation) (#977) 2024-08-18 12:51:45 +09:00
Dr.Lt.Data
c4227b17e5 better error message for security policy
https://github.com/ltdrdata/ComfyUI-Manager/issues/975#issuecomment-2294810500
2024-08-18 12:36:02 +09:00
Dr.Lt.Data
7538169251 update DB 2024-08-17 16:26:22 +09:00
Dr.Lt.Data
31e300e4e8 update DB 2024-08-17 14:33:04 +09:00
Dr.Lt.Data
599bf78f20 update DB 2024-08-17 13:37:46 +09:00
Dr.Lt.Data
f53fdb8d7a update DB 2024-08-17 13:36:21 +09:00
Dr.Lt.Data
3b4bfeab22 update DB 2024-08-17 13:33:29 +09:00
Oliver Crosby
8c1f828c1f add minimap entry to custom-node-list.json (#974) 2024-08-17 13:20:17 +09:00
Dr.Lt.Data
f896755a31 refactor: share features 2024-08-17 12:22:01 +09:00
Dr.Lt.Data
e406f8be81 update DB 2024-08-17 01:13:12 +09:00
Dr.Lt.Data
84107d2b65 update DB 2024-08-16 22:46:02 +09:00
Xander Steenbrugge
d890984c70 update Eden custom nodesuite with better naming and add LoRa trainer node (#973) 2024-08-16 22:43:35 +09:00
Dr.Lt.Data
72e4c84f8a force downgrade numpy to <2 when try fix 2024-08-16 20:11:13 +09:00
Dr.Lt.Data
acd41d985c update DB 2024-08-16 19:03:29 +09:00
Nicolas Kendall-Bar
1312657aca Add RTX Remix custom nodes (#966) 2024-08-16 18:22:19 +09:00
Dr.Lt.Data
a502bb9529 update DB 2024-08-16 18:19:45 +09:00
ControlAltAI
5947dee9f9 Update custom-node-list.json (#968)
Quality of Life ComfyUI nodes starting with Flux Resolution Calculator and Flux Sampler.

https://github.com/gseth/ControlAltAI-Nodes
2024-08-16 18:18:47 +09:00
FairyRoot
e68d59098f updated description for ollama llava vision by fairy-root, and added a new node Flux Prompt Generator for ComfyUI (#969) 2024-08-16 18:17:57 +09:00
Dr.Lt.Data
61efd60681 feat: complete pip freezing for torch, torchsde, torchvision 2024-08-16 00:07:19 +09:00
Dr.Lt.Data
d3654b2ee4 update DB 2024-08-15 20:11:51 +09:00
Dr.Lt.Data
ef943a588d update DB 2024-08-15 15:06:54 +09:00
chrisgoringe
8c6ebc665d Update custom-node-list.json (#962)
I've retired my old noise nodes, because Comfy now has noise as a data type. These new nodes do the same and more, and are far less flaky!
2024-08-15 12:28:07 +09:00
Dr.Lt.Data
2d2df3fc2c update DB 2024-08-15 00:24:16 +09:00
yuan199696
958ddcb49c Add a new custom node which supports adding custom text to the generated images. (#958)
* add custom node

* A new custom node
2024-08-15 00:19:41 +09:00
yuan199696
5e9e988a96 add custom node (#956) 2024-08-14 23:39:39 +09:00
dr.lt.data
34f3409f9b remove inproper warning.
https://github.com/ltdrdata/ComfyUI-Manager/issues/954
2024-08-14 09:31:10 +09:00
Dr.Lt.Data
49c548494e update DB 2024-08-14 02:18:06 +09:00
Isi
7ba41fbb7d Update custom-node-list.json (#952)
Updating the custom-node-list.json with two nodes to animate an image using uniAnimate
2024-08-14 02:16:02 +09:00
Dr.Lt.Data
d95b974941 fix: invalid version handling
https://github.com/ltdrdata/ComfyUI-Manager/issues/953
2024-08-14 01:53:28 +09:00
Dr.Lt.Data
74bf39ab27 update DB 2024-08-14 01:30:28 +09:00
Dr.Lt.Data
8897b9e0f7 patch colab notebook.
prevent downloading cloudflare installation package into gdrive
2024-08-13 01:28:49 +09:00
Dr.Lt.Data
d6de8644c0 update DB 2024-08-13 01:08:43 +09:00
Raapys
190f3b1684 New node: LatentGC (#950)
* Update custom-node-list.json

* Update custom-node-list.json
2024-08-13 01:03:27 +09:00
Dr.Lt.Data
ae5961daf4 update DB 2024-08-13 00:44:45 +09:00
OgreLemonSoup
68b51b387a Update custom-node-list.json (#948) 2024-08-13 00:43:19 +09:00
Dr.Lt.Data
9097319c4b update DB 2024-08-12 12:30:05 +09:00
Dr.Lt.Data
49a7db074d update DB 2024-08-12 08:42:39 +09:00
Dr.Lt.Data
7f7ed04a80 update DB 2024-08-11 21:33:33 +09:00
Dr.Lt.Data
ab5f42cc65 update DB 2024-08-11 00:42:54 +09:00
Dr.Lt.Data
b1fd8fd51b update DB 2024-08-10 18:33:05 +09:00
Dr.Lt.Data
16b98576c7 update DB 2024-08-10 18:27:11 +09:00
Ling-APE
78f5d86f89 Add PixelResoltionCalculater custom mode (#945) 2024-08-10 18:24:12 +09:00
Dr.Lt.Data
beec803eff update DB 2024-08-10 15:40:50 +09:00
Dr.Lt.Data
3e0b55e8dc update DB 2024-08-10 13:33:12 +09:00
Dr.Lt.Data
70db90f25b update DB 2024-08-10 00:27:19 +09:00
Dr.Lt.Data
d84b79bee9 update DB 2024-08-09 21:44:48 +09:00
LiGongrong
b491f51a04 feat: mapping clip and checkpoint to model path (#942) 2024-08-09 21:15:40 +09:00
Dr.Lt.Data
3892e3f5e7 fix: missing title in tryInstallCustomNode 2024-08-08 22:48:18 +09:00
Dr.Lt.Data
bd6dc08030 update DB 2024-08-08 22:23:28 +09:00
IuvenisSapiens
596cdbecd6 Add ComfyUI_MiniCPM-V-2_6-int4 to custom-node-list.json (#939)
* Add ComfyUI_MiniCPM-V-2_6-int4 to custom-node-list.json

* Update custom-node-list.json

---------

Co-authored-by: Dr.Lt.Data <128333288+ltdrdata@users.noreply.github.com>
2024-08-08 21:52:37 +09:00
Dr.Lt.Data
7798367348 update DB 2024-08-08 21:50:45 +09:00
kappa54
e775fe78ca Add ComfyUI_Usability to custom-node-list.json (#938) 2024-08-08 21:50:00 +09:00
僵尸浩
e1eddb336d Update custom-node-list.json (#940) 2024-08-08 21:49:01 +09:00
Dr.Lt.Data
b6bfb66c71 update DB 2024-08-07 23:00:07 +09:00
dr.lt.data
bbc28ccef8 update DB 2024-08-07 09:32:32 +09:00
Dr.Lt.Data
d57738b0a8 update DB 2024-08-07 02:10:26 +09:00
Dr.Lt.Data
6b1a3c874d update DB 2024-08-06 23:03:44 +09:00
bananasss00
9932010025 ComfyUI-SP-Nodes (#936)
* https://github.com/bananasss00/ComfyUI-SP-Nodes

* Removed unsafe node from pack

---------

Co-authored-by: rdp <rdp>
2024-08-06 22:58:43 +09:00
Dr.Lt.Data
7cd73bca3c update DB 2024-08-06 22:02:17 +09:00
Dobidop
580abf8608 Patch 1 (#935)
* Update custom-node-list.json

* Update custom-node-list.json
2024-08-06 21:39:31 +09:00
Dr.Lt.Data
d845c4f832 update DB 2024-08-06 08:52:07 +09:00
Dr.Lt.Data
cc09a166da update DB 2024-08-06 08:43:53 +09:00
Nader
78f6ee1428 Update custom-node-list.json (#932) 2024-08-06 08:42:40 +09:00
Dr.Lt.Data
590e9b3906 update DB 2024-08-06 03:38:46 +09:00
Dr.Lt.Data
18f69d379f update DB 2024-08-06 01:24:56 +09:00
Dr.Lt.Data
8b121e1352 update notebook
update db
2024-08-04 23:40:53 +09:00
Dr.Lt.Data
5959f54b6c update DB 2024-08-04 16:01:29 +09:00
Dr.Lt.Data
f7d320df30 update DB 2024-08-04 11:37:14 +09:00
Dr.Lt.Data
31d7fcc8ba update DB 2024-08-04 10:55:39 +09:00
Trott Albert
8b649ae0d9 feat: add new custom node (#925) 2024-08-04 10:46:28 +09:00
Dr.Lt.Data
61675061a0 update DB 2024-08-04 02:17:23 +09:00
Dr.Lt.Data
35285dd74b fix: is_installed - consider --index-url pattern 2024-08-04 02:03:42 +09:00
Dr.Lt.Data
6048092d93 update DB 2024-08-04 01:51:00 +09:00
Jukka Seppänen
28b90f412a Add google_t5-v1_1-xxl encoder_only models (#923)
* Add IC-Light nodes and models

* Add Florence2 and LuminaWrapper -nodes

https://github.com/kijai/ComfyUI-Florence2
https://github.com/kijai/ComfyUI-LuminaWrapper

* Update custom-node-list.json

* Update custom-node-list.json

* Update custom-node-list.json

* Add segment-anything-2

* Update custom-node-list.json

* Add T5 encoder models
2024-08-04 00:06:14 +09:00
Dr.Lt.Data
09e7c4a4f2 update DB 2024-08-03 15:21:19 +09:00
PowerHouseMan
dcdeb668df Update custom-node-list.json (#922) 2024-08-03 15:11:18 +09:00
Dr.Lt.Data
7ac8b1fdcb update DB 2024-08-03 03:38:52 +09:00
Dr.Lt.Data
2eb1020b35 update DB 2024-08-03 02:08:14 +09:00
Dr.Lt.Data
55cb4c3d0a update DB 2024-08-02 02:42:37 +09:00
Dr.Lt.Data
050f391f89 update DB 2024-08-02 02:39:43 +09:00
Dr.Lt.Data
3d5c6889b8 update DB 2024-08-02 02:35:55 +09:00
Dr.Lt.Data
085f2cd064 U
pdate DB
2024-08-02 02:28:17 +09:00
Dr.Lt.Data
5c70089a62 allows --index-url in requirements.txt
https://github.com/ltdrdata/ComfyUI-Manager/discussions/918
2024-08-02 01:55:03 +09:00
33 changed files with 21464 additions and 6280 deletions

4
.gitignore vendored
View File

@@ -12,4 +12,6 @@ matrix_auth
channels.list
comfyworkflows_sharekey
github-stats-cache.json
pip_overrides.json
pip_overrides.json
*.json
check2.sh

View File

@@ -204,7 +204,6 @@ This repository provides Colab notebooks that allow you to install and use Comfy
* Please submit a pull request to update either the custom-node-list.json or model-list.json file.
* The scanner currently provides a detection function for missing nodes, which is capable of detecting nodes described by the following two patterns.
* Or you can provide manually `node_list.json` file.
```
NODE_CLASS_MAPPINGS = {
@@ -218,6 +217,7 @@ NODE_CLASS_MAPPINGS.update({
"SemSegPreprocessor": Uniformer_SemSegPreprocessor,
})
```
* Or you can provide manually `node_list.json` file.
* When you write a docstring in the header of the .py file for the Node as follows, it will be used for managing the database in the Manager.
* Currently, only the `nickname` is being used, but other parts will also be utilized in the future.
@@ -364,9 +364,10 @@ When you run the `scan.sh` script:
* `Install via git url`, `pip install`
* Installation of custom nodes registered not in the `default channel`.
* Display terminal log
* Fix custom nodes
* `middle` level risky features
* Uninstall/Update/Fix custom nodes
* Uninstall/Update
* Installation of custom nodes registered in the `default channel`.
* Restore/Remove Snapshot
* Restart

View File

@@ -4,6 +4,7 @@ cli_mode_flag = os.path.join(os.path.dirname(__file__), '.enable-cli-only-mode')
if not os.path.exists(cli_mode_flag):
from .glob import manager_server
from .glob import share_3rdparty
WEB_DIRECTORY = "js"
else:
print(f"\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n")

View File

@@ -35,6 +35,7 @@ restore_snapshot_path = os.path.join(startup_script_path, "restore-snapshot.json
pip_overrides_path = os.path.join(comfyui_manager_path, "pip_overrides.json")
git_script_path = os.path.join(comfyui_manager_path, "git_helper.py")
cm_global.pip_blacklist = ['torch', 'torchsde', 'torchvision']
cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
cm_global.pip_overrides = {}
if os.path.exists(pip_overrides_path):
@@ -108,7 +109,7 @@ class Ctx:
install_script_path = os.path.join(repo_path, 'install.py')
if os.path.exists(requirements_path):
with (open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file):
with open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file:
for line in file:
package_name = core.remap_pip_package(line.strip())
if package_name and not core.is_installed(package_name):

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -23,7 +23,7 @@ sys.path.append(glob_path)
import cm_global
from manager_util import *
version = [2, 48, 3]
version = [2, 51, 5]
version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '')
@@ -97,12 +97,15 @@ def clear_pip_cache():
def is_blacklisted(name):
name = name.strip()
pattern = r'([^<>!=]+)([<>!=]=?)(.*)'
pattern = r'([^<>!=]+)([<>!=]=?)([^ ]*)'
match = re.search(pattern, name)
if match:
name = match.group(1)
if name in cm_global.pip_blacklist:
return True
if name in cm_global.pip_downgrade_blacklist:
pips = get_installed_packages()
@@ -123,12 +126,15 @@ def is_installed(name):
if name.startswith('#'):
return True
pattern = r'([^<>!=]+)([<>!=]=?)(.*)'
pattern = r'([^<>!=]+)([<>!=]=?)([0-9.a-zA-Z]*)'
match = re.search(pattern, name)
if match:
name = match.group(1)
if name in cm_global.pip_blacklist:
return True
if name in cm_global.pip_downgrade_blacklist:
pips = get_installed_packages()
@@ -404,9 +410,23 @@ def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=Fa
print("Install: pip packages")
with open(requirements_path, "r") as requirements_file:
for line in requirements_file:
#handle comments
if '#' in line:
if line.strip()[0] == '#':
print("Line is comment...skipping")
continue
else:
line = line.split('#')[0].strip()
package_name = remap_pip_package(line.strip())
if package_name and not package_name.startswith('#'):
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
if '--index-url' in package_name:
s = package_name.split('--index-url')
install_cmd = [sys.executable, "-m", "pip", "install", s[0].strip(), '--index-url', s[1].strip()]
else:
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
if package_name.strip() != "" and not package_name.startswith('#'):
try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution)
@@ -1115,7 +1135,7 @@ async def extract_nodes_from_workflow(filepath, mode='local', channel_url='defau
if node_name in ['Reroute', 'Note']:
continue
if node_name is not None and not node_name.startswith('workflow/'):
if node_name is not None and not (node_name.startswith('workflow/') or node_name.startswith('workflow>')):
used_nodes.add(node_name)
if 'nodes' in workflow:
@@ -1215,3 +1235,4 @@ def unzip(model_path):
os.remove(model_path)
return True

View File

@@ -1,4 +1,3 @@
import mimetypes
import traceback
import folder_paths
@@ -6,7 +5,6 @@ import locale
import subprocess # don't remove this
import concurrent
import nodes
import hashlib
import os
import sys
import threading
@@ -22,6 +20,9 @@ print(f"### Loading: ComfyUI-Manager ({core.version_str})")
comfy_ui_hash = "-"
SECURITY_MESSAGE_MIDDLE_OR_BELOW = f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy"
SECURITY_MESSAGE_NORMAL_MINUS = f"ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy"
SECURITY_MESSAGE_GENERAL = f"ERROR: This installation is not allowed in this security_level. Please contact the administrator.\nReference: https://github.com/ltdrdata/ComfyUI-Manager#security-policy"
def handle_stream(stream, prefix):
stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace')
@@ -46,7 +47,9 @@ is_local_mode = args.listen.startswith('127.') or args.listen.startswith('local.
def is_allowed_security_level(level):
if level == 'high':
if level == 'block':
return False
elif level == 'high':
if is_local_mode:
return core.get_config()['security_level'].lower() in ['weak', 'normal-']
else:
@@ -57,7 +60,7 @@ def is_allowed_security_level(level):
return True
async def get_risky_level(files):
async def get_risky_level(files, pip_packages):
json_data1 = await core.get_data_by_mode('local', 'custom-node-list.json')
json_data2 = await core.get_data_by_mode('cache', 'custom-node-list.json', channel_url='https://github.com/ltdrdata/ComfyUI-Manager/raw/main')
@@ -69,6 +72,15 @@ async def get_risky_level(files):
if x not in all_urls:
return "high"
all_pip_packages = set()
for x in json_data1['custom_nodes'] + json_data2['custom_nodes']:
if "pip" in x:
all_pip_packages.update(x['pip'])
for p in pip_packages:
if p not in all_pip_packages:
return "block"
return "middle"
@@ -239,7 +251,7 @@ def get_model_dir(data):
if data['save_path'] != 'default':
if '..' in data['save_path'] or data['save_path'].startswith('/'):
print(f"[WARN] '{data['save_path']}' is not allowed path. So it will be saved into 'models/etc'.")
base_model = "etc"
base_model = os.path.join(folder_paths.models_dir, "etc")
else:
if data['save_path'].startswith("custom_nodes"):
base_model = os.path.join(core.comfy_path, data['save_path'])
@@ -247,10 +259,12 @@ def get_model_dir(data):
base_model = os.path.join(folder_paths.models_dir, data['save_path'])
else:
model_type = data['type']
if model_type == "checkpoints":
if model_type == "checkpoints" or model_type == "checkpoint":
base_model = folder_paths.folder_names_and_paths["checkpoints"][0][0]
elif model_type == "unclip":
base_model = folder_paths.folder_names_and_paths["checkpoints"][0][0]
elif model_type == "clip":
base_model = folder_paths.folder_names_and_paths["clip"][0][0]
elif model_type == "VAE":
base_model = folder_paths.folder_names_and_paths["vae"][0][0]
elif model_type == "lora":
@@ -269,8 +283,14 @@ def get_model_dir(data):
base_model = folder_paths.folder_names_and_paths["upscale_models"][0][0]
elif model_type == "embeddings":
base_model = folder_paths.folder_names_and_paths["embeddings"][0][0]
elif model_type == "unet" or model_type == "diffusion_model":
if folder_paths.folder_names_and_paths.get("diffusion_models"):
base_model = folder_paths.folder_names_and_paths["diffusion_models"][0][1]
else:
print(f"[ComfyUI-Manager] Your ComfyUI is outdated version.")
base_model = folder_paths.folder_names_and_paths["unet"][0][0] # outdated version
else:
base_model = "etc"
base_model = os.path.join(folder_paths.models_dir, "etc")
return base_model
@@ -388,7 +408,7 @@ async def fetch_updates(request):
@PromptServer.instance.routes.get("/customnode/update_all")
async def update_all(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
try:
@@ -590,7 +610,7 @@ async def get_snapshot_list(request):
@PromptServer.instance.routes.get("/snapshot/remove")
async def remove_snapshot(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
try:
@@ -608,7 +628,7 @@ async def remove_snapshot(request):
@PromptServer.instance.routes.get("/snapshot/restore")
async def remove_snapshot(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
try:
@@ -777,14 +797,14 @@ def copy_set_active(files, is_disable, js_path_name='.'):
@PromptServer.instance.routes.post("/customnode/install")
async def install_custom_node(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
json_data = await request.json()
risky_level = await get_risky_level(json_data['files'])
risky_level = await get_risky_level(json_data['files'], json_data.get('pip', []))
if not is_allowed_security_level(risky_level):
print(f"ERROR: This installation is not allowed in this security_level. Please contact the administrator.")
print(SECURITY_MESSAGE_GENERAL)
return web.Response(status=404)
install_type = json_data['install_type']
@@ -823,8 +843,8 @@ async def install_custom_node(request):
@PromptServer.instance.routes.post("/customnode/fix")
async def fix_custom_node(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
if not is_allowed_security_level('high'):
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
json_data = await request.json()
@@ -848,6 +868,10 @@ async def fix_custom_node(request):
install_cmd = [sys.executable, "-m", "pip", "install", '-U', pname]
core.try_install_script(json_data['files'][0], ".", install_cmd)
# HOTFIX: force downgrade to numpy<2
install_cmd = [sys.executable, "-m", "pip", "install", "numpy<2"]
core.try_install_script(json_data['files'][0], ".", install_cmd)
if res:
print(f"After restarting ComfyUI, please refresh the browser.")
return web.json_response({}, content_type='application/json')
@@ -858,7 +882,7 @@ async def fix_custom_node(request):
@PromptServer.instance.routes.post("/customnode/install/git_url")
async def install_custom_node_git_url(request):
if not is_allowed_security_level('high'):
print(f"ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.")
print(SECURITY_MESSAGE_NORMAL_MINUS)
return web.Response(status=403)
url = await request.text()
@@ -874,7 +898,7 @@ async def install_custom_node_git_url(request):
@PromptServer.instance.routes.post("/customnode/install/pip")
async def install_custom_node_git_url(request):
if not is_allowed_security_level('high'):
print(f"ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.")
print(SECURITY_MESSAGE_NORMAL_MINUS)
return web.Response(status=403)
packages = await request.text()
@@ -886,7 +910,7 @@ async def install_custom_node_git_url(request):
@PromptServer.instance.routes.post("/customnode/uninstall")
async def uninstall_custom_node(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
json_data = await request.json()
@@ -914,7 +938,7 @@ async def uninstall_custom_node(request):
@PromptServer.instance.routes.post("/customnode/update")
async def update_custom_node(request):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
json_data = await request.json()
@@ -986,7 +1010,7 @@ async def install_model(request):
model_path = get_model_path(json_data)
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
if not json_data['filename'].endswith('.safetensors') and not is_allowed_security_level('high'):
@@ -999,7 +1023,7 @@ async def install_model(request):
break
if not is_belongs_to_whitelist:
print(f"ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.")
print(SECURITY_MESSAGE_NORMAL_MINUS)
return web.Response(status=403)
res = False
@@ -1049,7 +1073,7 @@ manager_terminal_hook = ManagerTerminalHook()
@PromptServer.instance.routes.get("/manager/terminal")
async def terminal_mode(request):
if not is_allowed_security_level('high'):
print(f"ERROR: To use this feature, you must either set '--listen' to a local IP and set the security level to 'normal-' or lower, or set the security level to 'middle' or 'weak'. Please contact the administrator.")
print(SECURITY_MESSAGE_NORMAL_MINUS)
return web.Response(status=403)
if "mode" in request.rel_url.query:
@@ -1191,7 +1215,7 @@ async def get_notice(request):
@PromptServer.instance.routes.get("/manager/reboot")
def restart(self):
if not is_allowed_security_level('middle'):
print(f"ERROR: To use this action, a security_level of `middle or below` is required. Please contact the administrator.")
print(SECURITY_MESSAGE_MIDDLE_OR_BELOW)
return web.Response(status=403)
try:
@@ -1271,128 +1295,6 @@ async def load_components(request):
return web.Response(status=400)
@PromptServer.instance.routes.get("/manager/share_option")
async def share_option(request):
if "value" in request.rel_url.query:
core.get_config()['share_option'] = request.rel_url.query['value']
core.write_config()
else:
return web.Response(text=core.get_config()['share_option'], status=200)
return web.Response(status=200)
def get_openart_auth():
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".openart_key")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "r") as f:
openart_key = f.read().strip()
return openart_key if openart_key else None
except:
return None
def get_matrix_auth():
if not os.path.exists(os.path.join(core.comfyui_manager_path, "matrix_auth")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "r") as f:
matrix_auth = f.read()
homeserver, username, password = matrix_auth.strip().split("\n")
if not homeserver or not username or not password:
return None
return {
"homeserver": homeserver,
"username": username,
"password": password,
}
except:
return None
def get_comfyworkflows_auth():
if not os.path.exists(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "r") as f:
share_key = f.read()
if not share_key.strip():
return None
return share_key
except:
return None
def get_youml_settings():
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".youml")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, ".youml"), "r") as f:
youml_settings = f.read().strip()
return youml_settings if youml_settings else None
except:
return None
def set_youml_settings(settings):
with open(os.path.join(core.comfyui_manager_path, ".youml"), "w") as f:
f.write(settings)
@PromptServer.instance.routes.get("/manager/get_openart_auth")
async def api_get_openart_auth(request):
# print("Getting stored Matrix credentials...")
openart_key = get_openart_auth()
if not openart_key:
return web.Response(status=404)
return web.json_response({"openart_key": openart_key})
@PromptServer.instance.routes.post("/manager/set_openart_auth")
async def api_set_openart_auth(request):
json_data = await request.json()
openart_key = json_data['openart_key']
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "w") as f:
f.write(openart_key)
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/get_matrix_auth")
async def api_get_matrix_auth(request):
# print("Getting stored Matrix credentials...")
matrix_auth = get_matrix_auth()
if not matrix_auth:
return web.Response(status=404)
return web.json_response(matrix_auth)
@PromptServer.instance.routes.get("/manager/youml/settings")
async def api_get_youml_settings(request):
youml_settings = get_youml_settings()
if not youml_settings:
return web.Response(status=404)
return web.json_response(json.loads(youml_settings))
@PromptServer.instance.routes.post("/manager/youml/settings")
async def api_set_youml_settings(request):
json_data = await request.json()
set_youml_settings(json.dumps(json_data))
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/get_comfyworkflows_auth")
async def api_get_comfyworkflows_auth(request):
# Check if the user has provided Matrix credentials in a file called 'matrix_accesstoken'
# in the same directory as the ComfyUI base folder
# print("Getting stored Comfyworkflows.com auth...")
comfyworkflows_auth = get_comfyworkflows_auth()
if not comfyworkflows_auth:
return web.Response(status=404)
return web.json_response({"comfyworkflows_sharekey": comfyworkflows_auth})
args.enable_cors_header = "*"
if hasattr(PromptServer.instance, "app"):
app = PromptServer.instance.app
@@ -1400,260 +1302,6 @@ if hasattr(PromptServer.instance, "app"):
app.middlewares.append(cors_middleware)
@PromptServer.instance.routes.post("/manager/set_esheep_workflow_and_images")
async def set_esheep_workflow_and_images(request):
json_data = await request.json()
current_workflow = json_data['workflow']
images = json_data['images']
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), "w", encoding='utf-8') as file:
json.dump(json_data, file, indent=4)
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/get_esheep_workflow_and_images")
async def get_esheep_workflow_and_images(request):
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), 'r', encoding='utf-8') as file:
data = json.load(file)
return web.Response(status=200, text=json.dumps(data))
def set_matrix_auth(json_data):
homeserver = json_data['homeserver']
username = json_data['username']
password = json_data['password']
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "w") as f:
f.write("\n".join([homeserver, username, password]))
def set_comfyworkflows_auth(comfyworkflows_sharekey):
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "w") as f:
f.write(comfyworkflows_sharekey)
def has_provided_matrix_auth(matrix_auth):
return matrix_auth['homeserver'].strip() and matrix_auth['username'].strip() and matrix_auth['password'].strip()
def has_provided_comfyworkflows_auth(comfyworkflows_sharekey):
return comfyworkflows_sharekey.strip()
def extract_model_file_names(json_data):
"""Extract unique file names from the input JSON data."""
file_names = set()
model_filename_extensions = {'.safetensors', '.ckpt', '.pt', '.pth', '.bin'}
# Recursively search for file names in the JSON data
def recursive_search(data):
if isinstance(data, dict):
for value in data.values():
recursive_search(value)
elif isinstance(data, list):
for item in data:
recursive_search(item)
elif isinstance(data, str) and '.' in data:
file_names.add(os.path.basename(data)) # file_names.add(data)
recursive_search(json_data)
return [f for f in list(file_names) if os.path.splitext(f)[1] in model_filename_extensions]
def find_file_paths(base_dir, file_names):
"""Find the paths of the files in the base directory."""
file_paths = {}
for root, dirs, files in os.walk(base_dir):
# Exclude certain directories
dirs[:] = [d for d in dirs if d not in ['.git']]
for file in files:
if file in file_names:
file_paths[file] = os.path.join(root, file)
return file_paths
def compute_sha256_checksum(filepath):
"""Compute the SHA256 checksum of a file, in chunks"""
sha256 = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b''):
sha256.update(chunk)
return sha256.hexdigest()
@PromptServer.instance.routes.post("/manager/share")
async def share_art(request):
# get json data
json_data = await request.json()
matrix_auth = json_data['matrix_auth']
comfyworkflows_sharekey = json_data['cw_auth']['cw_sharekey']
set_matrix_auth(matrix_auth)
set_comfyworkflows_auth(comfyworkflows_sharekey)
share_destinations = json_data['share_destinations']
credits = json_data['credits']
title = json_data['title']
description = json_data['description']
is_nsfw = json_data['is_nsfw']
prompt = json_data['prompt']
potential_outputs = json_data['potential_outputs']
selected_output_index = json_data['selected_output_index']
try:
output_to_share = potential_outputs[int(selected_output_index)]
except:
# for now, pick the first output
output_to_share = potential_outputs[0]
assert output_to_share['type'] in ('image', 'output')
output_dir = folder_paths.get_output_directory()
if output_to_share['type'] == 'image':
asset_filename = output_to_share['image']['filename']
asset_subfolder = output_to_share['image']['subfolder']
if output_to_share['image']['type'] == 'temp':
output_dir = folder_paths.get_temp_directory()
else:
asset_filename = output_to_share['output']['filename']
asset_subfolder = output_to_share['output']['subfolder']
if asset_subfolder:
asset_filepath = os.path.join(output_dir, asset_subfolder, asset_filename)
else:
asset_filepath = os.path.join(output_dir, asset_filename)
# get the mime type of the asset
assetFileType = mimetypes.guess_type(asset_filepath)[0]
share_website_host = "UNKNOWN"
if "comfyworkflows" in share_destinations:
share_website_host = "https://comfyworkflows.com"
share_endpoint = f"{share_website_host}/api"
# get presigned urls
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.post(
f"{share_endpoint}/get_presigned_urls",
json={
"assetFileName": asset_filename,
"assetFileType": assetFileType,
"workflowJsonFileName": 'workflow.json',
"workflowJsonFileType": 'application/json',
},
) as resp:
assert resp.status == 200
presigned_urls_json = await resp.json()
assetFilePresignedUrl = presigned_urls_json["assetFilePresignedUrl"]
assetFileKey = presigned_urls_json["assetFileKey"]
workflowJsonFilePresignedUrl = presigned_urls_json["workflowJsonFilePresignedUrl"]
workflowJsonFileKey = presigned_urls_json["workflowJsonFileKey"]
# upload asset
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.put(assetFilePresignedUrl, data=open(asset_filepath, "rb")) as resp:
assert resp.status == 200
# upload workflow json
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.put(workflowJsonFilePresignedUrl, data=json.dumps(prompt['workflow']).encode('utf-8')) as resp:
assert resp.status == 200
model_filenames = extract_model_file_names(prompt['workflow'])
model_file_paths = find_file_paths(folder_paths.base_path, model_filenames)
models_info = {}
for filename, filepath in model_file_paths.items():
models_info[filename] = {
"filename": filename,
"sha256_checksum": compute_sha256_checksum(filepath),
"relative_path": os.path.relpath(filepath, folder_paths.base_path),
}
# make a POST request to /api/upload_workflow with form data key values
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
form = aiohttp.FormData()
if comfyworkflows_sharekey:
form.add_field("shareKey", comfyworkflows_sharekey)
form.add_field("source", "comfyui_manager")
form.add_field("assetFileKey", assetFileKey)
form.add_field("assetFileType", assetFileType)
form.add_field("workflowJsonFileKey", workflowJsonFileKey)
form.add_field("sharedWorkflowWorkflowJsonString", json.dumps(prompt['workflow']))
form.add_field("sharedWorkflowPromptJsonString", json.dumps(prompt['output']))
form.add_field("shareWorkflowCredits", credits)
form.add_field("shareWorkflowTitle", title)
form.add_field("shareWorkflowDescription", description)
form.add_field("shareWorkflowIsNSFW", str(is_nsfw).lower())
form.add_field("currentSnapshot", json.dumps(core.get_current_snapshot()))
form.add_field("modelsInfo", json.dumps(models_info))
async with session.post(
f"{share_endpoint}/upload_workflow",
data=form,
) as resp:
assert resp.status == 200
upload_workflow_json = await resp.json()
workflowId = upload_workflow_json["workflowId"]
# check if the user has provided Matrix credentials
if "matrix" in share_destinations:
comfyui_share_room_id = '!LGYSoacpJPhIfBqVfb:matrix.org'
filename = os.path.basename(asset_filepath)
content_type = assetFileType
try:
from matrix_client.api import MatrixHttpApi
from matrix_client.client import MatrixClient
homeserver = 'matrix.org'
if matrix_auth:
homeserver = matrix_auth.get('homeserver', 'matrix.org')
homeserver = homeserver.replace("http://", "https://")
if not homeserver.startswith("https://"):
homeserver = "https://" + homeserver
client = MatrixClient(homeserver)
try:
token = client.login(username=matrix_auth['username'], password=matrix_auth['password'])
if not token:
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
except:
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
matrix = MatrixHttpApi(homeserver, token=token)
with open(asset_filepath, 'rb') as f:
mxc_url = matrix.media_upload(f.read(), content_type, filename=filename)['content_uri']
workflow_json_mxc_url = matrix.media_upload(prompt['workflow'], 'application/json', filename='workflow.json')['content_uri']
text_content = ""
if title:
text_content += f"{title}\n"
if description:
text_content += f"{description}\n"
if credits:
text_content += f"\ncredits: {credits}\n"
response = matrix.send_message(comfyui_share_room_id, text_content)
response = matrix.send_content(comfyui_share_room_id, mxc_url, filename, 'm.image')
response = matrix.send_content(comfyui_share_room_id, workflow_json_mxc_url, 'workflow.json', 'm.file')
except:
import traceback
traceback.print_exc()
return web.json_response({"error": "An error occurred when sharing your art to Matrix."}, content_type='application/json', status=500)
return web.json_response({
"comfyworkflows": {
"url": None if "comfyworkflows" not in share_destinations else f"{share_website_host}/workflows/{workflowId}",
},
"matrix": {
"success": None if "matrix" not in share_destinations else True
}
}, content_type='application/json', status=200)
def sanitize(data):
return data.replace("<", "&lt;").replace(">", "&gt;")

View File

@@ -1,63 +1,64 @@
try:
from distutils.version import StrictVersion
except:
print(f"[ComfyUI-Manager] 'distutils' package not found. Activating fallback mode for compatibility.")
class StrictVersion:
def __init__(self, version_string):
self.version_string = version_string
self.major = 0
self.minor = 0
self.patch = 0
self.pre_release = None
self.parse_version_string()
# DON'T USE StrictVersion - cannot handle pre_release version
# try:
# from distutils.version import StrictVersion
# except:
# print(f"[ComfyUI-Manager] 'distutils' package not found. Activating fallback mode for compatibility.")
class StrictVersion:
def __init__(self, version_string):
self.version_string = version_string
self.major = 0
self.minor = 0
self.patch = 0
self.pre_release = None
self.parse_version_string()
def parse_version_string(self):
parts = self.version_string.split('.')
if not parts:
raise ValueError("Version string must not be empty")
def parse_version_string(self):
parts = self.version_string.split('.')
if not parts:
raise ValueError("Version string must not be empty")
self.major = int(parts[0])
self.minor = int(parts[1]) if len(parts) > 1 else 0
self.patch = int(parts[2]) if len(parts) > 2 else 0
self.major = int(parts[0])
self.minor = int(parts[1]) if len(parts) > 1 else 0
self.patch = int(parts[2]) if len(parts) > 2 else 0
# Handling pre-release versions if present
if len(parts) > 3:
self.pre_release = parts[3]
# Handling pre-release versions if present
if len(parts) > 3:
self.pre_release = parts[3]
def __str__(self):
version = f"{self.major}.{self.minor}.{self.patch}"
if self.pre_release:
version += f"-{self.pre_release}"
return version
def __str__(self):
version = f"{self.major}.{self.minor}.{self.patch}"
if self.pre_release:
version += f"-{self.pre_release}"
return version
def __eq__(self, other):
return (self.major, self.minor, self.patch, self.pre_release) == \
(other.major, other.minor, other.patch, other.pre_release)
def __eq__(self, other):
return (self.major, self.minor, self.patch, self.pre_release) == \
(other.major, other.minor, other.patch, other.pre_release)
def __lt__(self, other):
if (self.major, self.minor, self.patch) == (other.major, other.minor, other.patch):
return self.pre_release_compare(self.pre_release, other.pre_release) < 0
return (self.major, self.minor, self.patch) < (other.major, other.minor, other.patch)
def __lt__(self, other):
if (self.major, self.minor, self.patch) == (other.major, other.minor, other.patch):
return self.pre_release_compare(self.pre_release, other.pre_release) < 0
return (self.major, self.minor, self.patch) < (other.major, other.minor, other.patch)
@staticmethod
def pre_release_compare(pre1, pre2):
if pre1 == pre2:
return 0
if pre1 is None:
return 1
if pre2 is None:
return -1
return -1 if pre1 < pre2 else 1
@staticmethod
def pre_release_compare(pre1, pre2):
if pre1 == pre2:
return 0
if pre1 is None:
return 1
if pre2 is None:
return -1
return -1 if pre1 < pre2 else 1
def __le__(self, other):
return self == other or self < other
def __le__(self, other):
return self == other or self < other
def __gt__(self, other):
return not self <= other
def __gt__(self, other):
return not self <= other
def __ge__(self, other):
return not self < other
def __ge__(self, other):
return not self < other
def __ne__(self, other):
return not self == other
def __ne__(self, other):
return not self == other

386
glob/share_3rdparty.py Normal file
View File

@@ -0,0 +1,386 @@
import mimetypes
import manager_core as core
import os
from aiohttp import web
import aiohttp
import json
import hashlib
import folder_paths
from server import PromptServer
def extract_model_file_names(json_data):
"""Extract unique file names from the input JSON data."""
file_names = set()
model_filename_extensions = {'.safetensors', '.ckpt', '.pt', '.pth', '.bin'}
# Recursively search for file names in the JSON data
def recursive_search(data):
if isinstance(data, dict):
for value in data.values():
recursive_search(value)
elif isinstance(data, list):
for item in data:
recursive_search(item)
elif isinstance(data, str) and '.' in data:
file_names.add(os.path.basename(data)) # file_names.add(data)
recursive_search(json_data)
return [f for f in list(file_names) if os.path.splitext(f)[1] in model_filename_extensions]
def find_file_paths(base_dir, file_names):
"""Find the paths of the files in the base directory."""
file_paths = {}
for root, dirs, files in os.walk(base_dir):
# Exclude certain directories
dirs[:] = [d for d in dirs if d not in ['.git']]
for file in files:
if file in file_names:
file_paths[file] = os.path.join(root, file)
return file_paths
def compute_sha256_checksum(filepath):
"""Compute the SHA256 checksum of a file, in chunks"""
sha256 = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b''):
sha256.update(chunk)
return sha256.hexdigest()
@PromptServer.instance.routes.get("/manager/share_option")
async def share_option(request):
if "value" in request.rel_url.query:
core.get_config()['share_option'] = request.rel_url.query['value']
core.write_config()
else:
return web.Response(text=core.get_config()['share_option'], status=200)
return web.Response(status=200)
def get_openart_auth():
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".openart_key")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "r") as f:
openart_key = f.read().strip()
return openart_key if openart_key else None
except:
return None
def get_matrix_auth():
if not os.path.exists(os.path.join(core.comfyui_manager_path, "matrix_auth")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "r") as f:
matrix_auth = f.read()
homeserver, username, password = matrix_auth.strip().split("\n")
if not homeserver or not username or not password:
return None
return {
"homeserver": homeserver,
"username": username,
"password": password,
}
except:
return None
def get_comfyworkflows_auth():
if not os.path.exists(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "r") as f:
share_key = f.read()
if not share_key.strip():
return None
return share_key
except:
return None
def get_youml_settings():
if not os.path.exists(os.path.join(core.comfyui_manager_path, ".youml")):
return None
try:
with open(os.path.join(core.comfyui_manager_path, ".youml"), "r") as f:
youml_settings = f.read().strip()
return youml_settings if youml_settings else None
except:
return None
def set_youml_settings(settings):
with open(os.path.join(core.comfyui_manager_path, ".youml"), "w") as f:
f.write(settings)
@PromptServer.instance.routes.get("/manager/get_openart_auth")
async def api_get_openart_auth(request):
# print("Getting stored Matrix credentials...")
openart_key = get_openart_auth()
if not openart_key:
return web.Response(status=404)
return web.json_response({"openart_key": openart_key})
@PromptServer.instance.routes.post("/manager/set_openart_auth")
async def api_set_openart_auth(request):
json_data = await request.json()
openart_key = json_data['openart_key']
with open(os.path.join(core.comfyui_manager_path, ".openart_key"), "w") as f:
f.write(openart_key)
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/get_matrix_auth")
async def api_get_matrix_auth(request):
# print("Getting stored Matrix credentials...")
matrix_auth = get_matrix_auth()
if not matrix_auth:
return web.Response(status=404)
return web.json_response(matrix_auth)
@PromptServer.instance.routes.get("/manager/youml/settings")
async def api_get_youml_settings(request):
youml_settings = get_youml_settings()
if not youml_settings:
return web.Response(status=404)
return web.json_response(json.loads(youml_settings))
@PromptServer.instance.routes.post("/manager/youml/settings")
async def api_set_youml_settings(request):
json_data = await request.json()
set_youml_settings(json.dumps(json_data))
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/get_comfyworkflows_auth")
async def api_get_comfyworkflows_auth(request):
# Check if the user has provided Matrix credentials in a file called 'matrix_accesstoken'
# in the same directory as the ComfyUI base folder
# print("Getting stored Comfyworkflows.com auth...")
comfyworkflows_auth = get_comfyworkflows_auth()
if not comfyworkflows_auth:
return web.Response(status=404)
return web.json_response({"comfyworkflows_sharekey": comfyworkflows_auth})
@PromptServer.instance.routes.post("/manager/set_esheep_workflow_and_images")
async def set_esheep_workflow_and_images(request):
json_data = await request.json()
current_workflow = json_data['workflow']
images = json_data['images']
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), "w", encoding='utf-8') as file:
json.dump(json_data, file, indent=4)
return web.Response(status=200)
@PromptServer.instance.routes.get("/manager/get_esheep_workflow_and_images")
async def get_esheep_workflow_and_images(request):
with open(os.path.join(core.comfyui_manager_path, "esheep_share_message.json"), 'r', encoding='utf-8') as file:
data = json.load(file)
return web.Response(status=200, text=json.dumps(data))
def set_matrix_auth(json_data):
homeserver = json_data['homeserver']
username = json_data['username']
password = json_data['password']
with open(os.path.join(core.comfyui_manager_path, "matrix_auth"), "w") as f:
f.write("\n".join([homeserver, username, password]))
def set_comfyworkflows_auth(comfyworkflows_sharekey):
with open(os.path.join(core.comfyui_manager_path, "comfyworkflows_sharekey"), "w") as f:
f.write(comfyworkflows_sharekey)
def has_provided_matrix_auth(matrix_auth):
return matrix_auth['homeserver'].strip() and matrix_auth['username'].strip() and matrix_auth['password'].strip()
def has_provided_comfyworkflows_auth(comfyworkflows_sharekey):
return comfyworkflows_sharekey.strip()
@PromptServer.instance.routes.post("/manager/share")
async def share_art(request):
# get json data
json_data = await request.json()
matrix_auth = json_data['matrix_auth']
comfyworkflows_sharekey = json_data['cw_auth']['cw_sharekey']
set_matrix_auth(matrix_auth)
set_comfyworkflows_auth(comfyworkflows_sharekey)
share_destinations = json_data['share_destinations']
credits = json_data['credits']
title = json_data['title']
description = json_data['description']
is_nsfw = json_data['is_nsfw']
prompt = json_data['prompt']
potential_outputs = json_data['potential_outputs']
selected_output_index = json_data['selected_output_index']
try:
output_to_share = potential_outputs[int(selected_output_index)]
except:
# for now, pick the first output
output_to_share = potential_outputs[0]
assert output_to_share['type'] in ('image', 'output')
output_dir = folder_paths.get_output_directory()
if output_to_share['type'] == 'image':
asset_filename = output_to_share['image']['filename']
asset_subfolder = output_to_share['image']['subfolder']
if output_to_share['image']['type'] == 'temp':
output_dir = folder_paths.get_temp_directory()
else:
asset_filename = output_to_share['output']['filename']
asset_subfolder = output_to_share['output']['subfolder']
if asset_subfolder:
asset_filepath = os.path.join(output_dir, asset_subfolder, asset_filename)
else:
asset_filepath = os.path.join(output_dir, asset_filename)
# get the mime type of the asset
assetFileType = mimetypes.guess_type(asset_filepath)[0]
share_website_host = "UNKNOWN"
if "comfyworkflows" in share_destinations:
share_website_host = "https://comfyworkflows.com"
share_endpoint = f"{share_website_host}/api"
# get presigned urls
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.post(
f"{share_endpoint}/get_presigned_urls",
json={
"assetFileName": asset_filename,
"assetFileType": assetFileType,
"workflowJsonFileName": 'workflow.json',
"workflowJsonFileType": 'application/json',
},
) as resp:
assert resp.status == 200
presigned_urls_json = await resp.json()
assetFilePresignedUrl = presigned_urls_json["assetFilePresignedUrl"]
assetFileKey = presigned_urls_json["assetFileKey"]
workflowJsonFilePresignedUrl = presigned_urls_json["workflowJsonFilePresignedUrl"]
workflowJsonFileKey = presigned_urls_json["workflowJsonFileKey"]
# upload asset
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.put(assetFilePresignedUrl, data=open(asset_filepath, "rb")) as resp:
assert resp.status == 200
# upload workflow json
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
async with session.put(workflowJsonFilePresignedUrl, data=json.dumps(prompt['workflow']).encode('utf-8')) as resp:
assert resp.status == 200
model_filenames = extract_model_file_names(prompt['workflow'])
model_file_paths = find_file_paths(folder_paths.base_path, model_filenames)
models_info = {}
for filename, filepath in model_file_paths.items():
models_info[filename] = {
"filename": filename,
"sha256_checksum": compute_sha256_checksum(filepath),
"relative_path": os.path.relpath(filepath, folder_paths.base_path),
}
# make a POST request to /api/upload_workflow with form data key values
async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session:
form = aiohttp.FormData()
if comfyworkflows_sharekey:
form.add_field("shareKey", comfyworkflows_sharekey)
form.add_field("source", "comfyui_manager")
form.add_field("assetFileKey", assetFileKey)
form.add_field("assetFileType", assetFileType)
form.add_field("workflowJsonFileKey", workflowJsonFileKey)
form.add_field("sharedWorkflowWorkflowJsonString", json.dumps(prompt['workflow']))
form.add_field("sharedWorkflowPromptJsonString", json.dumps(prompt['output']))
form.add_field("shareWorkflowCredits", credits)
form.add_field("shareWorkflowTitle", title)
form.add_field("shareWorkflowDescription", description)
form.add_field("shareWorkflowIsNSFW", str(is_nsfw).lower())
form.add_field("currentSnapshot", json.dumps(core.get_current_snapshot()))
form.add_field("modelsInfo", json.dumps(models_info))
async with session.post(
f"{share_endpoint}/upload_workflow",
data=form,
) as resp:
assert resp.status == 200
upload_workflow_json = await resp.json()
workflowId = upload_workflow_json["workflowId"]
# check if the user has provided Matrix credentials
if "matrix" in share_destinations:
comfyui_share_room_id = '!LGYSoacpJPhIfBqVfb:matrix.org'
filename = os.path.basename(asset_filepath)
content_type = assetFileType
try:
from matrix_client.api import MatrixHttpApi
from matrix_client.client import MatrixClient
homeserver = 'matrix.org'
if matrix_auth:
homeserver = matrix_auth.get('homeserver', 'matrix.org')
homeserver = homeserver.replace("http://", "https://")
if not homeserver.startswith("https://"):
homeserver = "https://" + homeserver
client = MatrixClient(homeserver)
try:
token = client.login(username=matrix_auth['username'], password=matrix_auth['password'])
if not token:
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
except:
return web.json_response({"error": "Invalid Matrix credentials."}, content_type='application/json', status=400)
matrix = MatrixHttpApi(homeserver, token=token)
with open(asset_filepath, 'rb') as f:
mxc_url = matrix.media_upload(f.read(), content_type, filename=filename)['content_uri']
workflow_json_mxc_url = matrix.media_upload(prompt['workflow'], 'application/json', filename='workflow.json')['content_uri']
text_content = ""
if title:
text_content += f"{title}\n"
if description:
text_content += f"{description}\n"
if credits:
text_content += f"\ncredits: {credits}\n"
response = matrix.send_message(comfyui_share_room_id, text_content)
response = matrix.send_content(comfyui_share_room_id, mxc_url, filename, 'm.image')
response = matrix.send_content(comfyui_share_room_id, workflow_json_mxc_url, 'workflow.json', 'm.file')
except:
import traceback
traceback.print_exc()
return web.json_response({"error": "An error occurred when sharing your art to Matrix."}, content_type='application/json', status=500)
return web.json_response({
"comfyworkflows": {
"url": None if "comfyworkflows" not in share_destinations else f"{share_website_host}/workflows/{workflowId}",
},
"matrix": {
"success": None if "matrix" not in share_destinations else True
}
}, content_type='application/json', status=200)

View File

@@ -4,7 +4,7 @@ import { sleep } from "./common.js";
async function tryInstallCustomNode(event) {
let msg = '-= [ComfyUI Manager] extension installation request =-\n\n';
msg += `The '${event.detail.sender}' extension requires the installation of the '${event.detail.title}' extension. `;
msg += `The '${event.detail.sender}' extension requires the installation of the '${event.detail.target.title}' extension. `;
if(event.detail.target.installed == 'Disabled') {
msg += 'However, the extension is currently disabled. Would you like to enable it and reboot?'

View File

@@ -202,6 +202,40 @@ docStyle.innerHTML = `
}
`;
function is_legacy_front() {
let compareVersion = '1.2.49';
try {
const frontendVersion = window['__COMFYUI_FRONTEND_VERSION__'];
if (typeof frontendVersion !== 'string') {
return false;
}
function parseVersion(versionString) {
const parts = versionString.split('.').map(Number);
return parts.length === 3 && parts.every(part => !isNaN(part)) ? parts : null;
}
const currentVersion = parseVersion(frontendVersion);
const comparisonVersion = parseVersion(compareVersion);
if (!currentVersion || !comparisonVersion) {
return false;
}
for (let i = 0; i < 3; i++) {
if (currentVersion[i] > comparisonVersion[i]) {
return false;
} else if (currentVersion[i] < comparisonVersion[i]) {
return true;
}
}
return false;
} catch {
return true;
}
}
document.head.appendChild(docStyle);
var update_comfyui_button = null;
@@ -842,24 +876,27 @@ class ManagerMenuDialog extends ComfyDialog {
});
// nickname
let badge_combo = document.createElement("select");
badge_combo.setAttribute("title", "Configure the content to be displayed on the badge at the top right corner of the node. The ID is the identifier of the node. If 'hide built-in' is selected, both unknown nodes and built-in nodes will be omitted, making them indistinguishable");
badge_combo.className = "cm-menu-combo";
badge_combo.appendChild($el('option', { value: 'none', text: 'Badge: None' }, []));
badge_combo.appendChild($el('option', { value: 'nick', text: 'Badge: Nickname' }, []));
badge_combo.appendChild($el('option', { value: 'nick_hide', text: 'Badge: Nickname (hide built-in)' }, []));
badge_combo.appendChild($el('option', { value: 'id_nick', text: 'Badge: #ID Nickname' }, []));
badge_combo.appendChild($el('option', { value: 'id_nick_hide', text: 'Badge: #ID Nickname (hide built-in)' }, []));
let badge_combo = "";
if(is_legacy_front()) {
badge_combo = document.createElement("select");
badge_combo.setAttribute("title", "Configure the content to be displayed on the badge at the top right corner of the node. The ID is the identifier of the node. If 'hide built-in' is selected, both unknown nodes and built-in nodes will be omitted, making them indistinguishable");
badge_combo.className = "cm-menu-combo";
badge_combo.appendChild($el('option', { value: 'none', text: 'Badge: None' }, []));
badge_combo.appendChild($el('option', { value: 'nick', text: 'Badge: Nickname' }, []));
badge_combo.appendChild($el('option', { value: 'nick_hide', text: 'Badge: Nickname (hide built-in)' }, []));
badge_combo.appendChild($el('option', { value: 'id_nick', text: 'Badge: #ID Nickname' }, []));
badge_combo.appendChild($el('option', { value: 'id_nick_hide', text: 'Badge: #ID Nickname (hide built-in)' }, []));
api.fetchApi('/manager/badge_mode')
.then(response => response.text())
.then(data => { badge_combo.value = data; badge_mode = data; });
api.fetchApi('/manager/badge_mode')
.then(response => response.text())
.then(data => { badge_combo.value = data; badge_mode = data; });
badge_combo.addEventListener('change', function (event) {
api.fetchApi(`/manager/badge_mode?value=${event.target.value}`);
badge_mode = event.target.value;
app.graph.setDirtyCanvas(true);
});
badge_combo.addEventListener('change', function (event) {
api.fetchApi(`/manager/badge_mode?value=${event.target.value}`);
badge_mode = event.target.value;
app.graph.setDirtyCanvas(true);
});
}
// channel
let channel_combo = document.createElement("select");
@@ -945,6 +982,7 @@ class ManagerMenuDialog extends ComfyDialog {
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' }, []));
dbl_click_policy_combo.appendChild($el('option', { value: 'copy-full', text: 'Double-Click: Copy All Connections and shape' }, []));
dbl_click_policy_combo.appendChild($el('option', { value: 'copy-input', text: 'Double-Click: Copy Input Connections' }, []));
dbl_click_policy_combo.appendChild($el('option', { value: 'possible-input', text: 'Double-Click: Possible Input Connections' }, []));
dbl_click_policy_combo.appendChild($el('option', { value: 'dual', text: 'Double-Click: Possible(left) + Copy(right)' }, []));
@@ -1044,6 +1082,10 @@ class ManagerMenuDialog extends ComfyDialog {
LiteGraph.closeAllContextMenus();
const menu = new LiteGraph.ContextMenu(
[
{
title: "ComfyUI Docs",
callback: () => { window.open("https://docs.comfy.org/", "comfyui-official-manual"); },
},
{
title: "Comfy Custom Node How To",
callback: () => { window.open("https://github.com/chrisgoringe/Comfy-Custom-Node-How-To/wiki/aaa_index", "comfyui-community-manual1"); },
@@ -1095,7 +1137,7 @@ class ManagerMenuDialog extends ComfyDialog {
textContent: 'Workflow Gallery',
style: {
'text-align': 'center',
'color': 'white',
'color': 'var(--input-text)',
'font-size': '18px',
'margin': 0,
'padding': 0,
@@ -1106,7 +1148,7 @@ class ManagerMenuDialog extends ComfyDialog {
textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : ''})`,
style: {
'text-align': 'center',
'color': 'white',
'color': 'var(--input-text)',
'font-size': '12px',
'margin': 0,
'padding': 0,
@@ -1411,24 +1453,28 @@ app.registerExtension({
},
async nodeCreated(node, app) {
if(!node.badge_enabled) {
node.getNickname = function () { return getNickname(node, node.comfyClass.trim()) };
let orig = node.onDrawForeground;
if(!orig)
orig = node.__proto__.onDrawForeground;
if(is_legacy_front()) {
if(!node.badge_enabled) {
node.getNickname = function () { return getNickname(node, node.comfyClass.trim()) };
let orig = node.onDrawForeground;
if(!orig)
orig = node.__proto__.onDrawForeground;
node.onDrawForeground = function (ctx) {
drawBadge(node, orig, arguments)
};
node.badge_enabled = true;
node.onDrawForeground = function (ctx) {
drawBadge(node, orig, arguments)
};
node.badge_enabled = true;
}
}
},
async loadedGraphNode(node, app) {
if(!node.badge_enabled) {
const orig = node.onDrawForeground;
node.getNickname = function () { return getNickname(node, node.type.trim()) };
node.onDrawForeground = function (ctx) { drawBadge(node, orig, arguments) };
if(is_legacy_front()) {
if(!node.badge_enabled) {
const orig = node.onDrawForeground;
node.getNickname = function () { return getNickname(node, node.type.trim()) };
node.onDrawForeground = function (ctx) { drawBadge(node, orig, arguments) };
}
}
},
@@ -1438,7 +1484,7 @@ app.registerExtension({
node.prototype.getExtraMenuOptions = function (_, options) {
origGetExtraMenuOptions?.apply?.(this, arguments);
if (node.category.startsWith('group nodes/')) {
if (node.category.startsWith('group nodes>')) {
options.push({
content: "Save As Component",
callback: (obj) => {

View File

@@ -315,7 +315,7 @@ export class ShareDialogChooser extends ComfyDialog {
key: "comfyworkflows",
textContent: "ComfyWorkflows",
website: "https://comfyworkflows.com",
description: "Share & browse thousands of ComfyUI workflows and art 🎨<br/><br/><a style='color:white;' href='https://comfyworkflows.com' target='_blank'>ComfyWorkflows.com</a>",
description: "Share & browse thousands of ComfyUI workflows and art 🎨<br/><br/><a style='color:var(--input-text);' href='https://comfyworkflows.com' target='_blank'>ComfyWorkflows.com</a>",
onclick: () => {
showShareDialog('comfyworkflows').then((suc) => {
suc && this.close();
@@ -326,7 +326,7 @@ export class ShareDialogChooser extends ComfyDialog {
key: "esheep",
textContent: "eSheep",
website: "https://www.esheep.com",
description: "Share & download thousands of ComfyUI workflows on <a style='color:white;' href='https://www.esheep.com' target='_blank'>esheep.com</a>",
description: "Share & download thousands of ComfyUI workflows on <a style='color:var(--input-text);' href='https://www.esheep.com' target='_blank'>esheep.com</a>",
onclick: () => {
shareToEsheep();
this.close();
@@ -336,7 +336,7 @@ export class ShareDialogChooser extends ComfyDialog {
key: "Copus",
textContent: "Copus",
website: "https://www.copus.io",
description: "🔴 Permanently store and secure ownership of your workflow on the open-source platform: <a style='color:white;' href='https://copus.io' target='_blank'>Copus.io</a>",
description: "🔴 Permanently store and secure ownership of your workflow on the open-source platform: <a style='color:var(--input-text);' href='https://copus.io' target='_blank'>Copus.io</a>",
onclick: () => {
showCopusShareDialog();
this.close();
@@ -382,7 +382,7 @@ export class ShareDialogChooser extends ComfyDialog {
innerHTML: b.description,
style: {
'text-align': 'left',
color: 'white',
color: 'var(--input-text)',
'font-size': '14px',
'margin-bottom': '0',
},
@@ -393,7 +393,7 @@ export class ShareDialogChooser extends ComfyDialog {
href: b.website,
target: "_blank",
style: {
color: 'white',
color: 'var(--input-text)',
'margin-left': '10px',
'font-size': '12px',
'text-decoration': 'none',
@@ -440,7 +440,7 @@ export class ShareDialogChooser extends ComfyDialog {
textContent: 'Choose a platform to share your workflow',
style: {
'text-align': 'center',
'color': 'white',
'color': 'var(--input-text)',
'font-size': '18px',
'margin-bottom': '10px',
},
@@ -686,7 +686,7 @@ export class ShareDialog extends ComfyDialog {
$el("div", {}, [
$el("p", {
size: 3, color: "white", style: {
color: 'white'
color: 'var(--input-text)'
}
}, [`Select where to share your art:`]),
this.matrix_destination_checkbox,
@@ -701,7 +701,7 @@ export class ShareDialog extends ComfyDialog {
size: 3,
color: "white",
style: {
color: 'white'
color: 'var(--input-text)'
}
}, []),
this.credits_input,
@@ -712,7 +712,7 @@ export class ShareDialog extends ComfyDialog {
size: 3,
color: "white",
style: {
color: 'white'
color: 'var(--input-text)'
}
}, []),
this.title_input,
@@ -723,7 +723,7 @@ export class ShareDialog extends ComfyDialog {
size: 3,
color: "white",
style: {
color: 'white'
color: 'var(--input-text)'
}
}, []),
this.description_input,
@@ -989,7 +989,7 @@ export class ShareDialog extends ComfyDialog {
}
const radio_button_text = $el("label", {
// style: {
// color: 'white'
// color: 'var(--input-text)'
// }
}, [output.title])
radio_button.style.color = "var(--fg-color)";
@@ -1028,7 +1028,7 @@ export class ShareDialog extends ComfyDialog {
color: "white",
style: {
'text-align': 'center',
color: 'white',
color: 'var(--input-text)',
backgroundColor: 'black',
padding: '10px',
'margin-top': '0px',
@@ -1040,7 +1040,7 @@ export class ShareDialog extends ComfyDialog {
color: "white",
style: {
'text-align': 'center',
color: 'white',
color: 'var(--input-text)',
'margin-bottom': '5px',
'font-style': 'italic',
'font-size': '12px',

View File

@@ -199,7 +199,7 @@ export class OpenArtShareDialog extends ComfyDialog {
color: "white",
style: {
'text-align': 'center',
color: 'white',
color: 'var(--input-text)',
margin: '0 0 10px 0',
}
});
@@ -733,7 +733,7 @@ export class OpenArtShareDialog extends ComfyDialog {
size: 2,
color: "white",
style: {
color: 'white',
color: 'var(--input-text)',
margin: '0 0 5px 0',
fontSize: '12px',
},

View File

@@ -4,6 +4,8 @@ import { sleep, show_message } from "./common.js";
import { GroupNodeConfig, GroupNodeHandler } from "../../extensions/core/groupNode.js";
import { ComfyDialog, $el } from "../../scripts/ui.js";
const SEPARATOR = ">"
let pack_map = {};
let rpack_map = {};
@@ -20,7 +22,7 @@ export function getPureName(node) {
let purename = node.comfyClass.substring(category.length+1);
return purename;
}
else if(node.comfyClass.startsWith('workflow/')) {
else if(node.comfyClass.startsWith('workflow/') || node.comfyClass.startsWith(`workflow${SEPARATOR}`)) {
return node.comfyClass.substring(9);
}
else {
@@ -76,7 +78,7 @@ export async function load_components() {
let category = data.packname;
if(data.category) {
category += "/" + data.category;
category += SEPARATOR + data.category;
}
if(category == '') {
category = 'components';
@@ -100,7 +102,7 @@ export async function load_components() {
try {
let category = nodeData.packname;
if(nodeData.category) {
category += "/" + nodeData.category;
category += SEPARATOR + nodeData.category;
}
if(category == '') {
category = 'components';
@@ -139,7 +141,7 @@ export async function load_components() {
try {
let category = nodeData.packname;
if(nodeData.workflow.category) {
category += "/" + nodeData.category;
category += SEPARATOR + nodeData.category;
}
if(category == '') {
category = 'components';
@@ -174,7 +176,7 @@ export async function load_components() {
try {
let category = nodeData.workflow.packname;
if(nodeData.workflow.category) {
category += "/" + nodeData.category;
category += SEPARATOR + nodeData.category;
}
if(category == '') {
category = 'components';
@@ -234,7 +236,7 @@ async function save_as_component(node, version, author, prefix, nodename, packna
let category = body.workflow.packname;
if(body.workflow.category) {
category += "/" + body.workflow.category;
category += SEPARATOR + body.workflow.category;
}
if(category == '') {
category = 'components';
@@ -266,7 +268,7 @@ async function import_component(component_name, component, mode) {
let category = component.packname;
if(component.category) {
category += "/" + component.category;
category += SEPARATOR + component.category;
}
if(category == '') {
category = 'components';
@@ -403,7 +405,7 @@ function handle_import_components(components) {
}
if(cnt == 1 && last_name) {
const node = LiteGraph.createNode(`workflow/${last_name}`);
const node = LiteGraph.createNode(`workflow${SEPARATOR}${last_name}`);
node.pos = [app.canvas.graph_mouse[0], app.canvas.graph_mouse[1]];
app.canvas.graph.add(node, false);
}
@@ -786,7 +788,7 @@ app.graphToPrompt = async function () {
// get used group nodes
let used_group_nodes = new Set();
for(let node of p.workflow.nodes) {
if(node.type.startsWith('workflow/')) {
if(node.type.startsWith(`workflow/`) || node.type.startsWith(`workflow${SEPARATOR}`)) {
used_group_nodes.add(node.type.substring(9));
}
}

View File

@@ -1106,7 +1106,7 @@ export class CustomNodesManager {
for (let i in nodes) {
const node_type = nodes[i].type;
if(node_type.startsWith('workflow/'))
if(node_type.startsWith('workflow/') || node_type.startsWith('workflow>'))
continue;
if (!registered_nodes.has(node_type)) {

View File

@@ -101,7 +101,7 @@ function connect_inputs(nearest_inputs, node) {
}
}
function node_info_copy(src, dest, connect_both) {
function node_info_copy(src, dest, connect_both, copy_shape) {
// copy input connections
for(let i in src.inputs) {
let input = src.inputs[i];
@@ -142,9 +142,11 @@ function node_info_copy(src, dest, connect_both) {
}
}
dest.color = src.color;
dest.bgcolor = src.bgcolor;
dest.size = src.size;
if(copy_shape) {
dest.color = src.color;
dest.bgcolor = src.bgcolor;
dest.size = max(src.size, dest.size);
}
app.graph.afterChange();
}
@@ -162,6 +164,7 @@ app.registerExtension({
switch(double_click_policy) {
case "copy-all":
case "copy-full":
case "copy-input":
{
if(node.inputs?.some(x => x.link != null) || node.outputs?.some(x => x.links != null && x.links.length > 0) )
@@ -169,7 +172,11 @@ app.registerExtension({
let src_node = lookup_nearest_nodes(node);
if(src_node)
node_info_copy(src_node, node, double_click_policy == "copy-all");
{
let both_connection = double_click_policy != "copy-input";
let copy_shape = double_click_policy == "copy-full";
node_info_copy(src_node, node, both_connection, copy_shape);
}
}
break;
case "possible-input":

View File

@@ -9,11 +9,13 @@ app.registerExtension({
name: "Comfy.Manager.Terminal",
registerCustomNodes() {
class TerminalNode {
class TerminalNode extends LiteGraph.LGraphNode {
color = "#222222";
bgcolor = "#000000";
groupcolor = LGraphCanvas.node_colors.black.groupcolor;
constructor() {
super();
this.title = "Terminal Log (Manager)";
this.logs = [];
if (!this.properties) {

View File

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,711 @@
{
"author": "monate0615",
"title": "Affine Transform ComfyUI Node",
"reference": "https://github.com/monate0615/ComfyUI-Affine-Transform",
"files": [
"https://github.com/monate0615/ComfyUI-Affine-Transform"
],
"install_type": "git-clone",
"description": "This node output the image that are transfromed by affine matrix what is made according to 4 points of output.\nNOTE: The files in the repo are not organized."
},
{
"author": "ComfyUI-Workflow",
"title": "ComfyUI OpenAI Nodes",
"reference": "https://github.com/ComfyUI-Workflow/ComfyUI-OpenAI",
"files": [
"https://github.com/ComfyUI-Workflow/ComfyUI-OpenAI"
],
"install_type": "git-clone",
"description": "By utilizing OpenAI's powerful vision models, this node enables you to incorporate state-of-the-art image understanding into your ComfyUI projects with minimal setup."
},
{
"author": "ruka-game",
"title": "ComfyUI RukaLib [WIP]",
"reference": "https://github.com/ruka-game/rukalib_comfyui",
"files": [
"https://github.com/ruka-game/rukalib_comfyui"
],
"install_type": "git-clone",
"description": "NODES: Ruka Prompt Enhancer, Ruka Debug Probe.\nMy utilities for comfy (WIP / ollama is required for LLM nodes)"
},
{
"author": "MythicalChu",
"title": "ComfyUI-APG_ImYourCFGNow",
"reference": "https://github.com/MythicalChu/ComfyUI-APG_ImYourCFGNow",
"files": [
"https://github.com/MythicalChu/ComfyUI-APG_ImYourCFGNow"
],
"install_type": "git-clone",
"description": "Use this node like a RescaleCFG node, ... modelIn -> ThisNode -> ModelOut ... -> KSampler\n'scale' acts like your CFG, your CFG doesn't do anything anymore white this node is active. See paper [a/https://arxiv.org/pdf/2410.02416](https://arxiv.org/pdf/2410.02416) for instructions about the other parameters. (Pages 20-21)"
},
{
"author": "okg21",
"title": "VLLMVisionChatNode",
"reference": "https://github.com/okg21/VLLMVisionChatNode",
"files": [
"https://github.com/okg21/VLLMVisionChatNode/raw/refs/heads/main/VLLMVisionChatNode.py"
],
"pip": ["openai", "numpy"],
"install_type": "copy",
"description": "This platform extension provides ZhipuAI nodes, enabling you to configure a workflow for online video generation."
},
{
"author": "jetchopper",
"title": "ComfyUI-GeneraNodes",
"id": "genera",
"reference": "https://github.com/evolox/ComfyUI-GeneraNodes",
"files": [
"https://github.com/evolox/ComfyUI-GeneraNodes"
],
"install_type": "git-clone",
"description": "Genera custom nodes and extensions"
},
{
"author": "HavocsCall",
"title": "comfyui_HavocsCall_Custom_Nodes",
"reference": "https://github.com/HavocsCall/comfyui_HavocsCall_Custom_Nodes",
"files": [
"https://github.com/HavocsCall/comfyui_HavocsCall_Custom_Nodes"
],
"install_type": "git-clone",
"description": "NODES:Prompt Combiner, Sampler Config, Text Box, Int to Float, Clip Switch, Conditioning Switch, Image Switch, Latent Switch, Model Switch, String Switch, VAE Switch"
},
{
"author": "mfg637",
"title": "ComfyUI-ScheduledGuider-Ext",
"reference": "https://github.com/mfg637/ComfyUI-ScheduledGuider-Ext",
"files": [
"https://github.com/mfg637/ComfyUI-ScheduledGuider-Ext"
],
"install_type": "git-clone",
"description": "NODES:SheduledCFGGuider, CosineScheduler, InvertSigmas, ConcatSigmas."
},
{
"author": "SS-snap",
"title": "ComfyUI-Snap_Processing",
"reference": "https://github.com/SS-snap/ComfyUI-Snap_Processing",
"files": [
"https://github.com/SS-snap/ComfyUI-Snap_Processing"
],
"install_type": "git-clone",
"description": "Creating this repository was a last resort because I couldn't find a node in ComfyUI that calculates area size and ratio, so I had to create a custom node to integrate with my 'Majic product' workflow for automated execution.\nNOTE: The files in the repo are not organized."
},
{
"author": "netanelben",
"title": "comfyui-photobooth-customnode",
"reference": "https://github.com/netanelben/comfyui-photobooth-customnode",
"files": [
"https://github.com/netanelben/comfyui-photobooth-customnode"
],
"install_type": "git-clone",
"description": "comfyui-photobooth-customnode"
},
{
"author": "netanelben",
"title": "comfyui-text2image-customnode",
"reference": "https://github.com/netanelben/comfyui-text2image-customnode",
"files": [
"https://github.com/netanelben/comfyui-text2image-customnode"
],
"install_type": "git-clone",
"description": "comfyui-text2image-customnode"
},
{
"author": "netanelben",
"title": "comfyui-camera2image-customnode",
"reference": "https://github.com/netanelben/comfyui-camera2image-customnode",
"files": [
"https://github.com/netanelben/comfyui-camera2image-customnode"
],
"install_type": "git-clone",
"description": "comfyui-camera2image-customnode"
},
{
"author": "netanelben",
"title": "comfyui-image2image-customnode",
"reference": "https://github.com/netanelben/comfyui-image2image-customnode",
"files": [
"https://github.com/netanelben/comfyui-image2image-customnode"
],
"install_type": "git-clone",
"description": "comfyui-image2image-customnode"
},
{
"author": "JayLyu",
"title": "ComfyUI_BaiKong_Node",
"id": "baikong",
"reference": "https://github.com/JayLyu/ComfyUI_BaiKong_Node",
"files": [
"https://github.com/JayLyu/ComfyUI_BaiKong_Node"
],
"install_type": "git-clone",
"description": "Nodes for advanced color manipulation and image processing: BK Img To Color, BK Color Selector, BK Color Contrast, BK Color Limit, BK Color Luminance, BK Gradient Image, and BK Image Aspect Filter.\n[w/requirements.txt is broken.]"
},
{
"author": "ShmuelRonen",
"title": "ComfyUI-FreeMemory",
"reference": "https://github.com/ShmuelRonen/ComfyUI-FreeMemory",
"files": [
"https://github.com/ShmuelRonen/ComfyUI-FreeMemory"
],
"install_type": "git-clone",
"description": "ComfyUI-FreeMemory is a custom node extension for ComfyUI that provides advanced memory management capabilities within your image generation workflows."
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI Llama 3.1 [WIP]",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Llama-3-2",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-Llama-3-2"
],
"install_type": "git-clone",
"description": "Using Llama-3-1 in ComfyUI"
},
{
"author": "netanelben",
"title": "comfyui-text2image-customnode [WIP]",
"reference": "https://github.com/netanelben/comfyui-text2image-customnode",
"files": [
"https://github.com/netanelben/comfyui-text2image-customnode"
],
"install_type": "git-clone",
"description": "text2image web extension"
},
{
"author": "leeguandong",
"title": "ComfyUI_AliControlnetInpainting [WIP]",
"reference": "https://github.com/leeguandong/ComfyUI_AliControlnetInpainting",
"files": [
"https://github.com/leeguandong/ComfyUI_AliControlnetInpainting"
],
"install_type": "git-clone",
"description": "ComfyUI nodes to use AliControlnetInpainting"
},
{
"author": "jordancoult",
"title": "ComfyUI_HelpfulNodes",
"reference": "https://github.com/jordancoult/ComfyUI_HelpfulNodes",
"files": [
"https://github.com/jordancoult/ComfyUI_HelpfulNodes"
],
"install_type": "git-clone",
"description": "NODES: Prep Crop Around Keypoints"
},
{
"author": "ashishsaini",
"title": "comfyui_segformer_b2_sleeves",
"reference": "https://github.com/ashishsaini/comfyui-segment-clothing-sleeves",
"files": [
"https://github.com/ashishsaini/comfyui-segment-clothing-sleeves"
],
"install_type": "git-clone",
"description": "NODES:segformer_b2_sleeves"
},
{
"author": "io-club",
"title": "ComfyUI-LuminaNext [WIP]",
"reference": "https://github.com/io-club/ComfyUI-LuminaNext",
"files": [
"https://github.com/io-club/ComfyUI-LuminaNext"
],
"install_type": "git-clone",
"description": "NODES: GemmaClipLoader"
},
{
"author": "shadowcz007",
"title": "Comfyui-EzAudio",
"reference": "https://github.com/shadowcz007/Comfyui-EzAudio",
"files": [
"https://github.com/shadowcz007/Comfyui-EzAudio"
],
"install_type": "git-clone",
"description": "NODES: EZ Generate Audio, EZ Load Model\nNOTE: The files in the repo are not organized."
},
{
"author": "neo0801",
"title": "my-comfy-node",
"reference": "https://github.com/neo0801/my-comfy-node",
"files": [
"https://github.com/neo0801/my-comfy-node"
],
"install_type": "git-clone",
"description": "NODES:Deep Mosaic Get Image Mosaic Mask, Deep Mosaic Get Video Mosaic Mask, Deep Mosaic Remove Image Mosaic, Deep Mosaic Remove Video Mosaic"
},
{
"author": "nikkuexe",
"title": "List Data Helper Nodes",
"reference": "https://github.com/paulhoux/Smart-Prompting",
"files": [
"https://github.com/paulhoux/Smart-Prompting"
],
"install_type": "git-clone",
"description": "Custom nodes for ComfyUI, allowing you to more easily manipulate text and create good prompts.[w/The use of outdated front extension techniques results in remnants being left behind during uninstallation.]"
},
{
"author": "nikkuexe",
"title": "List Data Helper Nodes",
"reference": "https://github.com/nikkuexe/ComfyUI-ListDataHelpers",
"files": [
"https://github.com/nikkuexe/ComfyUI-ListDataHelpers"
],
"install_type": "git-clone",
"description": "A set of custom nodes for handling lists in ComfyUI."
},
{
"author": "Fannovel16",
"title": "ComfyUI-AppIO",
"reference": "https://github.com/Fannovel16/ComfyUI-AppIO",
"files": [
"https://github.com/Fannovel16/ComfyUI-AppIO"
],
"install_type": "git-clone",
"description": "NODES:AppIO_StringInput, AppIO_ImageInput, AppIO_StringOutput, AppIO_ImageOutput"
},
{
"author": "wilzamguerrero",
"title": "Comfyui-DownZ",
"reference": "https://github.com/wilzamguerrero/Comfyui-DownZ",
"files": [
"https://github.com/wilzamguerrero/Comfyui-DownZ"
],
"install_type": "git-clone",
"description": "NODES:Download Z, Compress Z, Move Z"
},
{
"author": "SoftMeng",
"title": "ComfyUI-PIL",
"reference": "https://github.com/SoftMeng/ComfyUI-PIL",
"files": [
"https://github.com/SoftMeng/ComfyUI-PIL"
],
"install_type": "git-clone",
"description": "PIL Nodes"
},
{
"author": "seancheung",
"title": "comfyui-creative-nodes",
"reference": "https://github.com/seancheung/comfyui-creative-nodes",
"files": [
"https://github.com/seancheung/comfyui-creative-nodes"
],
"install_type": "git-clone",
"description": "NODES:Stop Flow, Skip From Flow, Skip To Flow, Resolution Selector, ResolutionXL Selector"
},
{
"author": "AlexXi19",
"title": "ComfyUI-OpenAINode",
"reference": "https://github.com/AlexXi19/ComfyUI-OpenAINode",
"files": [
"https://github.com/AlexXi19/ComfyUI-OpenAINode"
],
"install_type": "git-clone",
"description": "ComfyUI-OpenAINode is a user-friendly node that serves as an interface to the OpenAI Models.[w/Repo name conflict with Electrofried/ComfyUI-OpenAINode]"
},
{
"author": "hgabha",
"title": "WWAA-CustomNodes",
"reference": "https://github.com/hgabha/WWAA-CustomNodes",
"files": [
"https://github.com/hgabha/WWAA-CustomNodes"
],
"install_type": "git-clone",
"description": "Custom Nodes for ComfyUI made by the team at [a/WeirdWonderfulAI.Art](https://weirdwonderfulai.art/) These are developed based on the needs where there was a gap to make our workflows better. You are welcome to use it as you see fit."
},
{
"author": "IgPoly",
"title": "ComfyUI-igTools",
"reference": "https://github.com/IgPoly/ComfyUI-igTools",
"files": [
"https://github.com/IgPoly/ComfyUI-igTools"
],
"install_type": "git-clone",
"description": "NODES:IGT Simple Tiles Calc"
},
{
"author": "Ryota",
"title": "Ryota's Nodes",
"reference": "https://github.com/lichenhao/Comfyui_Ryota",
"files": [
"https://github.com/lichenhao/Comfyui_Ryota"
],
"install_type": "git-clone",
"description": "NODES:CombineTexts, FontLoader, DrawText, TxtFileLoader, SaveTxtFile, SwitchModelClip, SwitchAnyInputs, Reroute2, Reroute3"
},
{
"author": "Soppatorsk",
"title": "comfyui_img_to_ascii [WIP]",
"reference": "https://github.com/Soppatorsk/comfyui_img_to_ascii",
"files": [
"https://github.com/Soppatorsk/comfyui_img_to_ascii"
],
"install_type": "git-clone",
"description": "Basic functionality for converting an image to ASCII art returned as a png image based on [a/ascii_magic](https://github.com/LeandroBarone/python-ascii_magic)"
},
{
"author": "AIFSH",
"title": "HivisionIDPhotos-ComfyUI",
"reference": "https://github.com/AIFSH/HivisionIDPhotos-ComfyUI",
"files": [
"https://github.com/AIFSH/HivisionIDPhotos-ComfyUI"
],
"install_type": "git-clone",
"description": "a custom node for [a/HivisionIDPhotos](https://github.com/Zeyi-Lin/HivisionIDPhotos).\nNOTE: Unsuitable for international users"
},
{
"author": "lu64k",
"title": "SK-Nodes",
"reference": "https://github.com/lu64k/SK-Nodes",
"files": [
"https://github.com/lu64k/SK-Nodes"
],
"install_type": "git-clone",
"description": "NODES:image select, Load AnyLLM, Ask LLM, OpenAI DAlle Node, SK Text_String, SK Random File Name"
},
{
"author": "Cardoso-topdev",
"title": "comfyui_meshanything_v1 [WIP]",
"reference": "https://github.com/Cardoso-topdev/comfyui_meshanything_v1",
"files": [
"https://github.com/Cardoso-topdev/comfyui_meshanything_v1"
],
"install_type": "git-clone",
"description": "MeshAnything V2: Artist-Created Mesh Generation With Adjacent Mesh Tokenization"
},
{
"author": "Lilien86",
"title": "lauger NodePack for ComfyUI",
"reference": "https://github.com/Lilien86/lauger_NP_comfyui",
"files": [
"https://github.com/Lilien86/lauger_NP_comfyui"
],
"install_type": "git-clone",
"description": "Hey everyone it's my Custom ComfyUI Nodes Pack repository! This project contains a collection of custom nodes designed to extend the functionality of ComfyUI. These nodes offer capabilities and new creative possibilities, especially in the realms of latent space manipulation and interpolation.\nNOTE: The files in the repo are not organized."
},
{
"author": "haodman",
"title": "ComfyUI_Rain",
"reference": "https://github.com/haodman/ComfyUI_Rain",
"files": [
"https://github.com/haodman/ComfyUI_Rain"
],
"install_type": "git-clone",
"description": "NODES:Rain_ValueSwitch, Rain_Math, Rain_IntToFloat, Rain_ImageSize."
},
{
"author": "bananasss00",
"title": "Comfyui-PyExec [UNSAFE]",
"reference": "https://github.com/bananasss00/Comfyui-PyExec",
"files": [
"https://github.com/bananasss00/Comfyui-PyExec"
],
"install_type": "git-clone",
"description": "Nodes:PyExec.[w/This node allows access to arbitrary files through the workflow, which could pose a security threat.]"
},
{
"author": "jgbrblmd",
"title": "ComfyUI-ComfyFluxSize [WIP]",
"reference": "https://github.com/jgbrblmd/ComfyUI-ComfyFluxSize",
"files": [
"https://github.com/jgbrblmd/ComfyUI-ComfyFluxSize"
],
"install_type": "git-clone",
"description": "Nodes:ComfyFlux Size\nNOTE: The files in the repo are not organized."
},
{
"author": "yojimbodayne",
"title": "ComfyUI-Dropbox-API [WIP]",
"reference": "https://github.com/yojimbodayne/ComfyUI-Dropbox-API",
"files": [
"https://github.com/yojimbodayne/ComfyUI-Dropbox-API"
],
"install_type": "git-clone",
"description": "This custom node package for ComfyUI allows users to interact with Dropbox API, enabling image, text, and video uploads, downloads, and management directly from ComfyUI workflows.\nNOTE: The files in the repo are not organized."
},
{
"author": "ilovejohnwhite",
"title": "Kolors Awesome Prompts [WIP]",
"reference": "https://github.com/ilovejohnwhite/Tracer",
"files": [
"https://github.com/ilovejohnwhite/Tracer"
],
"install_type": "git-clone",
"description": "Nodes:Image Load TTK, SuckerPunch, LinkMasterNode, PixelPerfectResolution, ImageGenResolutionFromImage, ImageGenResolutionFromLatent, HintImageEnchance\nNOTE: The files in the repo are not organized."
},
{
"author": "shuanshtalon468uan",
"title": "ComfyUI-Rpg-Architect [WIP]",
"reference": "https://github.com/talon468/ComfyUI-Rpg-Architect",
"files": [
"https://github.com/talon468/ComfyUI-Rpg-Architect"
],
"install_type": "git-clone",
"description": "Custom Node for ComfyUI to create RPG Characters\nNOTE: The files in the repo are not organized."
},
{
"author": "shuanshuan",
"title": "ComfyUI_CheckPointLoader_Ext [WIP]",
"reference": "https://github.com/shuanshuan/ComfyUI_CheckPointLoader_Ext",
"files": [
"https://github.com/shuanshuan/ComfyUI_CheckPointLoader_Ext"
],
"install_type": "git-clone",
"description": "NODES:Checkpoint Loader Ext"
},
{
"author": "123jimin",
"title": "ComfyUI MobileForm [WIP]",
"reference": "https://github.com/123jimin/ComfyUI-MobileForm",
"files": [
"https://github.com/123jimin/ComfyUI-MobileForm"
],
"install_type": "git-clone",
"description": "MobileForm is an extension for ComfyUI, providing simple form for any workflows, suitable for use on mobile phones.[w/Currently MobileForm is in a PoC state; expect bugs and breaking changes.]"
},
{
"author": "go-package-lab",
"title": "ComfyUI-Tools-Video-Combine [WIP]",
"reference": "https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine",
"files": [
"https://github.com/go-package-lab/ComfyUI-Tools-Video-Combine"
],
"install_type": "git-clone",
"description": "NODES:LoadAudioUrl, VideoWatermark"
},
{
"author": "zhongpei",
"title": "Comfyui_image2prompt",
"id": "img2prompt",
"reference": "https://github.com/zhongpei/Comfyui_image2prompt",
"files": [
"https://github.com/zhongpei/Comfyui_image2prompt"
],
"install_type": "git-clone",
"description": "Nodes:Image to Text, Loader Image to Text Model.[w/This custom node may break dependencies by reinstalling the torch package.]"
},
{
"author": "APZmedia",
"title": "comfyui-textools [WIP]",
"reference": "https://github.com/APZmedia/comfyui-textools",
"files": [
"https://github.com/APZmedia/comfyui-textools"
],
"install_type": "git-clone",
"description": "ComfyUI-textools is a collection of custom nodes designed for use with ComfyUI. These nodes enhance text processing capabilities, including applying rich text overlays on images and cleaning file names for safe and consistent file management.\nNOTE: The files in the repo are not organized."
},
{
"author": "shinich39",
"title": "comfyui-event-handler [USAFE]",
"reference": "https://github.com/shinich39/comfyui-event-handler",
"files": [
"https://github.com/shinich39/comfyui-event-handler"
],
"install_type": "git-clone",
"description": "Javascript code will run when an event fires. [w/This node allows you to execute arbitrary JavaScript code as input for the workflow.]"
},
{
"author": "Comfy Org",
"title": "ComfyUI_devtools [WIP]",
"reference": "https://github.com/Comfy-Org/ComfyUI_devtools",
"files": [
"https://github.com/Comfy-Org/ComfyUI_devtools"
],
"install_type": "git-clone",
"description": "ComfyUI developer tools (Custom Node)"
},
{
"author": "Sakura-nee",
"title": "ComfyUI_Save2Discord",
"reference": "https://github.com/Sakura-nee/ComfyUI_Save2Discord",
"files": [
"https://github.com/Sakura-nee/ComfyUI_Save2Discord"
],
"install_type": "git-clone",
"description": "Nodes:Send Generated Image To Discord Webhook.\nNOTE: The files in the repo are not organized."
},
{
"author": "ThisModernDay",
"title": "ComfyUI Instructor Ollama",
"reference": "https://github.com/ThisModernDay/ComfyUI-InstructorOllama",
"files": [
"https://github.com/ThisModernDay/ComfyUI-InstructorOllama"
],
"install_type": "git-clone",
"description": "Custom ComfyUI Nodes for interacting with Ollama using the Instructor. Library to provide structured output from your LLM. To use this properly, you would need a running Ollama server reachable from the host that is running ComfyUI.\nNOTE: The files in the repo are not organized, which may lead to update issues."
},
{
"author": "gioferreira",
"title": "ComfyUI-Molde-Utils",
"reference": "https://github.com/gioferreira/ComfyUI-Molde-Utils",
"files": [
"https://github.com/gioferreira/ComfyUI-Molde-Utils"
],
"install_type": "git-clone",
"description": "ComfyUI-Molde-Utils is a utility library designed to provide various helper functions for working with UI elements. This project includes modules for handling bezier curves and color conversions.\nNOTE: The files in the repo are not organized, which may lead to update issues."
},
{
"author": "kijai",
"title": "ComfyUI nodes for VEnhancer [WIP]",
"reference": "https://github.com/kijai/ComfyUI-VEnhancer",
"files": [
"https://github.com/kijai/ComfyUI-VEnhancer"
],
"install_type": "git-clone",
"description": "Original repo: [a/https://github.com/Vchitect/VEnhancer](https://github.com/Vchitect/VEnhancer)"
},
{
"author": "jimstudt",
"title": "Jim's ComfyUI Nodes [WIP]",
"reference": "https://github.com/jimstudt/ComfyUI-Jims-Nodes",
"files": [
"https://github.com/jimstudt/ComfyUI-Jims-Nodes"
],
"install_type": "git-clone",
"description": "Zoom and Enhance Nodes, Text Dictionary Nodes"
},
{
"author": "hananbeer",
"title": "node_dev - ComfyUI Node Development Helper",
"reference": "https://github.com/hananbeer/node_dev",
"files": [
"https://github.com/hananbeer/node_dev"
],
"install_type": "git-clone",
"description": "Browse to this endpoint to reload custom nodes for more streamlined development:\nhttp://127.0.0.1:8188/node_dev/reload/<module_name>"
},
{
"author": "sebord",
"title": "ComfyUI-LMCQ [WIP]",
"reference": "https://github.com/sebord/ComfyUI-LMCQ",
"files": [
"https://github.com/sebord/ComfyUI-LMCQ"
],
"install_type": "git-clone",
"description": "ComfyUI small node toolkit, this toolkit is mainly to update some practical small nodes, to make a contribution to the comfyui ecosystem, PS: 'LMCQ' is the abbreviation of the team name\nNOTE: The files in the repo are not organized, which may lead to update issues."
},
{
"author": "ChrisColeTech",
"title": "ComfyUI-Get-Random-File [UNSAFE]",
"reference": "https://github.com/ChrisColeTech/ComfyUI-Get-Random-File",
"files": [
"https://github.com/ChrisColeTech/ComfyUI-Get-Random-File"
],
"install_type": "git-clone",
"description": "Gets a random file from a directory. Returns the filpath as a STRING. [w/This node allows access to arbitrary files through the workflow, which could pose a security threat.]"
},
{
"author": "logtd",
"title": "ComfyUI-Fluxtapoz [WIP]",
"reference": "https://github.com/logtd/ComfyUI-Fluxtapoz",
"files": [
"https://github.com/logtd/ComfyUI-Fluxtapoz"
],
"install_type": "git-clone",
"description": "A set of nodes for editing images using Flux in ComfyUI"
},
{
"author": "neeltheninja",
"title": "ComfyUI-ControlNeXt [WIP]",
"reference": "https://github.com/neverbiasu/ComfyUI-ControlNeXt",
"files": [
"https://github.com/neverbiasu/ComfyUI-ControlNeXt"
],
"install_type": "git-clone",
"description": "In progress🚧"
},
{
"author": "neeltheninja",
"title": "ComfyUI-TextOverlay",
"reference": "https://github.com/neeltheninja/ComfyUI-TextOverlay",
"files": [
"https://github.com/neeltheninja/ComfyUI-TextOverlay"
],
"install_type": "git-clone",
"description": "A custom node for ComfyUI that adds text overlay to images, with options for text and background color, opacity, vertical positioning, and custom font selection. [w/Name conflict with munkyfoot/ComfyUI-TextOverlay. Cannot install simulatenously.]"
},
{
"author": "comfyanonymous",
"title": "ComfyUI_bitsandbytes_NF4 [EXPERIMENTAL]",
"reference": "https://github.com/comfyanonymous/ComfyUI_bitsandbytes_NF4",
"files": [
"https://github.com/comfyanonymous/ComfyUI_bitsandbytes_NF4"
],
"install_type": "git-clone",
"description": "A quickly written custom node that uses code from Forge to support the nf4 flux dev checkpoint and nf4 flux schnell checkpoint.\nRequires installing bitsandbytes.\nMake sure your ComfyUI is updated.\nThe node is: CheckpointLoaderNF4, just plug it in your flux workflow instead of the regular one.[w/NF4 checckpoint doesn't support LoRA.]"
},
{
"author": "kijai",
"title": "ComfyUI-EasyAnimateWrapper [WIP]",
"reference": "https://github.com/kijai/ComfyUI-EasyAnimateWrapper",
"files": [
"https://github.com/kijai/ComfyUI-EasyAnimateWrapper"
],
"install_type": "git-clone",
"description": "EasyAnimateWrapper for ComfyUI"
},
{
"author": "logtd",
"title": "ComfyUI-Veevee [WIP]",
"reference": "https://github.com/logtd/ComfyUI-Veevee",
"files": [
"https://github.com/logtd/ComfyUI-Veevee"
],
"install_type": "git-clone",
"description": "A Video2Video framework for text2image models in ComfyUI. Supports SD1.5 and SDXL."
},
{
"author": "IuvenisSapiens",
"title": "ComfyUI_MiniCPM-V-2_6-int4",
"id": "minicpm-v-2_6-int4",
"reference": "https://github.com/IuvenisSapiens/ComfyUI_MiniCPM-V-2_6-int4",
"files": [
"https://github.com/IuvenisSapiens/ComfyUI_MiniCPM-V-2_6-int4"
],
"install_type": "git-clone",
"description": "This is an implementation of [a/MiniCPM-V-2_6-int4](https://github.com/OpenBMB/MiniCPM-V) by [a/ComfyUI](https://github.com/comfyanonymous/ComfyUI), including support for text-based queries, video queries, single-image queries, and multi-image queries to generate captions or responses."
},
{
"author": "chrisdreid",
"title": "ComfyUI_EnvAutopsyAPI [UNSAFE]",
"reference": "https://github.com/chrisdreid/ComfyUI_EnvAutopsyAPI",
"files": [
"https://github.com/chrisdreid/ComfyUI_EnvAutopsyAPI"
],
"install_type": "git-clone",
"description": "ComfyUI_EnvAutopsyAPI is a powerful debugging tool designed for ComfyUI that provides in-depth analysis of your environment and dependencies through an API interface. This tool allows you to inspect environment variables, pip packages, and dependency trees, making it easier to diagnose and resolve issues in your ComfyUI setup.[w/This tool may expose sensitive system information if used on a public server. MUST READ [a/THIS](https://github.com/chrisdreid/ComfyUI_EnvAutopsyAPI#%EF%B8%8F-warning-security-risk-%EF%B8%8F) before install.]"
},
{
"author": "neuratech-ai",
"title": "ComfyUI-MultiGPU",
"reference": "https://github.com/neuratech-ai/ComfyUI-MultiGPU",
"files": [
"https://github.com/neuratech-ai/ComfyUI-MultiGPU"
],
"install_type": "git-clone",
"description": "Experimental nodes for using multiple GPUs in a single ComfyUI workflow.\nThis extension adds new nodes for model loading that allow you to specify the GPU to use for each model. It monkey patches the memory management of ComfyUI in a hacky way and is neither a comprehensive solution nor a well-tested one. Use at your own risk.\nNote that this does not add parallelism. The workflow steps are still executed sequentially just on different GPUs. Any potential speedup comes from not having to constantly load and unload models from VRAM."
},
{
"author": "Isi-dev",
"title": "Isi-dev/ComfyUI-UniAnimate",
"reference": "https://github.com/Isi-dev/ComfyUI-UniAnimate",
"files": [
"https://github.com/Isi-dev/ComfyUI-UniAnimate"
],
"install_type": "git-clone",
"description": "This is my ComfyUi-windows implementation for the image animation project ▶ UniAnimate: Taming Unified Video Diffusion Models for Consistent Human Image Animation[w/This node cannot be installed simultaneously with ComfyUI-UniAnimate by AIFSH because it has the same name as that custom node.]"
},
{
"author": "Futureversecom",
"title": "ComfyUI-JEN",
"reference": "https://github.com/futureversecom/ComfyUI-JEN",
"files": [
"https://github.com/futureversecom/ComfyUI-JEN"
],
"install_type": "git-clone",
"description": "Comfy UI custom nodes for JEN music generation powered by Futureverse"
},
{
"author": "denislov",
"title": "Comfyui_AutoSurvey",
@@ -32,16 +736,6 @@
"install_type": "git-clone",
"description": "This node allows ComfyUI to easily integrate with Midjourney, utilizing the ultra-high quality of Midjourney and the powerful control of SD to provide more convenient capabilities for AIGC.\nNOTE: This node relies on the midjourney proxy project and requires API deployment in advance. For detailed installation, please refer to the instructions of the project. https://github.com/novicezk/midjourney-proxy"
},
{
"author": "hy134300",
"title": "ComfyUI-PhotoMaker-V2",
"reference": "https://github.com/hy134300/ComfyUI-PhotoMaker-V2",
"files": [
"https://github.com/hy134300/ComfyUI-PhotoMaker-V2"
],
"install_type": "git-clone",
"description": "Nodes for PhotoMaker-V2"
},
{
"author": "kijai",
"title": "ComfyUI-FollowYourEmojiWrapper [WIP]",
@@ -62,16 +756,6 @@
"install_type": "git-clone",
"description": "[a/SadTalker](https://github.com/OpenTalker/SadTalker) for ComfyUI"
},
{
"author": "maepopi",
"title": "Diffusers-in-ComfyUI",
"reference": "https://github.com/maepopi/Diffusers-in-ComfyUI",
"files": [
"https://github.com/maepopi/Diffusers-in-ComfyUI"
],
"install_type": "git-clone",
"description": "This is a custom node allowing the use of the diffusers pipeline into ComfyUI. Based on [a/Limitex/ComfyUI-Diffusers](https://github.com/Limitex/ComfyUI-Diffusers)"
},
{
"author": "hotpizzatactics",
"title": "ComfyUI-WaterMark-Detector",
@@ -83,16 +767,6 @@
"install_type": "git-clone",
"description": "Nodes:CLAHE Enhancement, High Pass Filter, Edge Detection, Combine Enhancements, Adaptive Thresholding, Morphological Operations, Gray Color Enhancement, Improved Gray Color Enhancement, Texture Enhancement, Denoising Filter, Flexible Combine Enhancements."
},
{
"author": "drmbt",
"title": "comfyui-dreambait-nodes",
"reference": "https://github.com/drmbt/comfyui-dreambait-nodes",
"files": [
"https://github.com/drmbt/comfyui-dreambait-nodes"
],
"install_type": "git-clone",
"description": "Nodes:Aspect Pad Image For Outpainting"
},
{
"author": "AIFSH",
"title": "IMAGDressing-ComfyUI",
@@ -248,16 +922,6 @@
"install_type": "git-clone",
"description": "If you wish to incorporate these changes into your repo, feel free to open an issue and ask. The commits should be pretty clear, and I also label almost all changes with #HACK so a full text search will work too.\nPlease let me know if you decide to incorporate any of these changes into your LivePortrait implementation so I can direct people to you repository. I do not intend to maintain this repo.\nSome operations are simply not supported on MPS and I didn't rewrite them. Most of my changes are just to .cuda calls and that sort of thing. Many operations are still done on CPU, so don't expect awesome performance."
},
{
"author": "justUmen",
"title": "Bjornulf_custom_nodes [WIP]",
"reference": "https://github.com/justUmen/Bjornulf_custom_nodes",
"files": [
"https://github.com/justUmen/Bjornulf_custom_nodes"
],
"install_type": "git-clone",
"description": "Nodes: ollamaLoader, ShowText, ShowInt, LoopTexts, LoopFloat, LoopInteger, ..."
},
{
"author": "thderoo",
"title": "_topfun_s_nodes",
@@ -278,16 +942,6 @@
"install_type": "git-clone",
"description": "This repository provides developers with a way to better manage their ComfyUI model memory. It includes nodes that allow developers to either unload all models or unload one model at a time. These nodes are designed as pass-through nodes, so they can be used anywhere in the flow. The nodes can be found in the 'Unload Model' section.[w/These are massive hammers, and it could be possible to break things, please don't use them if you need finesse.]"
},
{
"author": "GeekyGhost",
"title": "ComfyUI-GeekyRemB v2",
"reference": "https://github.com/GeekyGhost/ComfyUI-GeekyRemB",
"files": [
"https://github.com/GeekyGhost/ComfyUI-GeekyRemB/raw/SketchUITest/GeekyRembv2.py"
],
"install_type": "copy",
"description": "GeekyRemB Node Description: GeekyRemB is a powerful and versatile image processing node for ComfyUI, designed to remove backgrounds from images with advanced customization options. This node leverages the rembg library and offers a wide range of features for fine-tuning the background removal process and enhancing the resulting images."
},
{
"author": "AIFSH",
"title": "ComfyUI-OpenDIT [WIP]",
@@ -310,16 +964,6 @@
"install_type": "git-clone",
"description": "Custom ComfyUI nodes to run [a/fal-ai/AuraSR](https://huggingface.co/fal-ai/AuraSR) model.[w/This node cannot be installed simultaneously with AIFSH/ComfyUI-AuraSR due to overlapping repository names.]"
},
{
"author": "m-ai-studio",
"title": "mai-prompt-progress",
"reference": "https://github.com/m-ai-studio/mai-prompt-progress",
"files": [
"https://github.com/m-ai-studio/mai-prompt-progress"
],
"install_type": "git-clone",
"description": "mai-prompt-progress"
},
{
"author": "linhusyung",
"title": "ComfyUI Build and Train Your Network [WIP]",
@@ -700,17 +1344,6 @@
"install_type": "git-clone",
"description": "I've been working on the UX/UI of a timeline custom node system for ComfyUI over the past two weeks. The goal is to create a timeline similar to video/animation editing tools, without relying on traditional timeframe code. You can effortlessly add, delete, or rearrange rows, providing a streamlined user experience."
},
{
"author": "jh-leon-kim",
"title": "ComfyUI-JHK-utils",
"id": "jhk",
"reference": "https://github.com/jh-leon-kim/ComfyUI-JHK-utils",
"files": [
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils"
],
"install_type": "git-clone",
"description": "Nodes:JHK_Utils_LoadEmbed, JHK_Utils_string_merge, JHK_Utils_ImageRemoveBackground"
},
{
"author": "StartHua",
"title": "Comfyui_CXH_CRM",
@@ -744,17 +1377,6 @@
"install_type": "git-clone",
"description": "Fixed AttentionCouple/NegPip(negative weights in prompts), more CFG++ samplers, etc."
},
{
"author": "Scorpinaus",
"title": "ComfyUI-DiffusersLoader",
"id": "diffusersloader",
"reference": "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader",
"files": [
"https://github.com/Scorpinaus/ComfyUI-DiffusersLoader"
],
"install_type": "git-clone",
"description": "The purpose of this package is to understand how loading of diffusers format checkpoints are done in comfyUI and to create a loader that works for SDXL."
},
{
"author": "FoundD-oka",
"title": "ComfyUI KISEKAE-OOTD",
@@ -775,7 +1397,7 @@
"https://github.com/bruce007lee/comfyui-tiny-utils"
],
"install_type": "git-clone",
"description": "Nodes:FaceAlign, FaceAlignImageProcess, FaceAlignMaskProcess"
"description": "Nodes:FaceAlign, FaceAlignImageProcess, FaceAlignMaskProcess, ImageFillColorByMask, CropImageByMask, LoadImageAdvance, ImageTransposeAdvance, ImageSAMMask"
},
{
"author": "brycegoh",
@@ -798,16 +1420,6 @@
"install_type": "git-clone",
"description": "Primary Nodes for Inference.Core and Stability Matrix. With a focus on not impacting startup performance and using fully qualified Node names. [w/This custom node is likely to conflict with many other nodes.]"
},
{
"author": "blepping",
"title": "comfyui_overly_complicated_sampling",
"reference": "https://github.com/blepping/comfyui_overly_complicated_sampling",
"files": [
"https://github.com/blepping/comfyui_overly_complicated_sampling"
],
"install_type": "git-clone",
"description": "Very unstable, experimental and mathematically unsound sampling for ComfyUI.\nCurrent status: In flux, not suitable for general use."
},
{
"author": "tracerstar",
"title": "comfyui-p5js-node",
@@ -979,16 +1591,6 @@
"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": "shadowcz007",
"title": "ComfyUI-PuLID [TEST]",
@@ -1181,16 +1783,6 @@
"install_type": "git-clone",
"description": "Experimental method to use reference video to drive motion in generations without training in ComfyUI."
},
{
"author": "logtd",
"title": "ComfyUI-MotionThiefExperiment",
"reference": "https://github.com/logtd/ComfyUI-MotionThiefExperiment",
"files": [
"https://github.com/logtd/ComfyUI-MotionThiefExperiment"
],
"install_type": "git-clone",
"description": "Nodes:This is an experimental node pack to test using reference videos for their motion.\nIt isn't compatible with a lot of things as this is a hacky implementation for experiments only."
},
{
"author": "hy134300",
"title": "comfyui-hb-node",
@@ -1601,16 +2193,6 @@
"install_type": "git-clone",
"description": "A simple custom node that unloads all models. Useful for developers or users who want to free some memory."
},
{
"author": "AIGODLIKE",
"title": "AIGODLIKE/ComfyUI-Model-Manager [WIP]",
"reference": "https://github.com/AIGODLIKE/ComfyUI-Studio",
"files": [
"https://github.com/AIGODLIKE/ComfyUI-Studio"
],
"install_type": "git-clone",
"description": "WIP"
},
{
"author": "MrAdamBlack",
"title": "CheckProgress [WIP]",
@@ -1631,16 +2213,6 @@
"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."
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-AnyText [WIP]",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/AnyText](https://github.com/tyxsspa/AnyText/tree/825bcc54687206b15bd7e28ba1a8b095989d58e3) for ComfyUIEXP"
},
{
"author": "nidefawl",
"title": "ComfyUI-nidefawl [UNSAFE]",
@@ -1731,16 +2303,6 @@
"install_type": "git-clone",
"description": "Nodes: Node Jumper. Various quality of life testing nodes"
},
{
"author": "ilovejohnwhite",
"title": "TatToolkit",
"reference": "https://github.com/ilovejohnwhite/UncleBillyGoncho",
"files": [
"https://github.com/ilovejohnwhite/UncleBillyGoncho"
],
"install_type": "git-clone",
"description": "Nodes:UWU TTK Preprocessor, Pixel Perfect Resolution, Generation Resolution From Image, Generation Resolution From Latent, Enchance And Resize Hint Images, ..."
},
{
"author": "IvanZhd",
"title": "comfyui-codeformer [WIP]",
@@ -1791,16 +2353,6 @@
"install_type": "git-clone",
"description": "Nodes: CheckpointVAELoaderSimpleText, CheckpointVAESelectorText, LoRA_Tag_To_Stack"
},
{
"author": "dnl13",
"title": "ComfyUI-dnl13-seg",
"reference": "https://github.com/dnl13/ComfyUI-dnl13-seg",
"files": [
"https://github.com/dnl13/ComfyUI-dnl13-seg"
],
"install_type": "git-clone",
"description": "After discovering @storyicon implementation here of Segment Anything, I realized its potential as a powerful tool for ComfyUI if implemented correctly. I delved into the SAM and Dino models. The following is my own adaptation of sam_hq for ComfyUI."
},
{
"author": "Brandelan",
"title": "ComfyUI_bd_customNodes",

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,25 @@
{
"custom_nodes": [
{
"author": "jags111",
"title": "NyaamZ/ComfyUI-Long-CLIP",
"reference": "https://github.com/NyaamZ/efficiency-nodes-ED",
"files": [
"https://github.com/NyaamZ/efficiency-nodes-ED"
],
"install_type": "git-clone",
"description": "This forked repo supports efficiency-nodes-comfyui. Additional features."
},
{
"author": "SeaArtLab",
"title": "zer0int/ComfyUI-Long-CLIP",
"reference": "https://github.com/zer0int/ComfyUI-Long-CLIP",
"files": [
"https://github.com/zer0int/ComfyUI-Long-CLIP"
],
"install_type": "git-clone",
"description": "This forked repo supports FLUX.1 not only SD1.5, SDXL."
},
{
"author": "meimeilook",
"title": "ComfyUI_IPAdapter_plus.old [backward compatbility]",

View File

@@ -10,6 +10,222 @@
},
{
"author": "DannyStone1999",
"title": "ComfyUI-Depth2Mask [REMOVED]",
"reference": "https://github.com/DannyStone1999/ComfyUI-Depth2Mask",
"files": [
"https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py"
],
"install_type": "copy",
"description": "Nodes:Depth2Mask"
},
{
"author": "syaofox",
"title": "ComfyUI_FoxTools [REMOVED]",
"reference": "https://github.com/syaofox/ComfyUI_FoxTools",
"files": [
"https://github.com/syaofox/ComfyUI_FoxTools"
],
"install_type": "git-clone",
"description": "Nodes:BatchImageFromList, Load Face Occlusion Model, Create Face Mask, Simple FaceAlign, Cacul FaceAlign, Gen Blurbord, Face Align, Face Rotate, ImageAdd, LoadImageList, SaveImage Plus, RegTextFind"
},
{
"author": "AIFSH",
"title": "SeedVC-ComfyUI [REMOVED]",
"reference": "https://github.com/AIFSH/SeedVC-ComfyUI",
"files": [
"https://github.com/AIFSH/SeedVC-ComfyUI"
],
"install_type": "git-clone",
"description": "a custom node for [a/seed-vc](https://github.com/Plachtaa/seed-vc)"
},
{
"author": "jazhang00",
"title": "ComfyUI Node for Slicedit [REMOVED]",
"reference": "https://github.com/jazhang00/ComfyUI-Slicedit",
"files": [
"https://github.com/jazhang00/ComfyUI-Slicedit"
],
"install_type": "git-clone",
"description": "Slicedit main page: [a/https://matankleiner.github.io/slicedit/](https://matankleiner.github.io/slicedit/). Use Slicedit with ComfyUI."
},
{
"author": "rklaffehn",
"title": "rk-comfy-nodes [REMOVED]",
"id": "rknodes",
"reference": "https://github.com/rklaffehn/rk-comfy-nodes",
"files": [
"https://github.com/rklaffehn/rk-comfy-nodes"
],
"install_type": "git-clone",
"description": "Nodes: RK_CivitAIMetaChecker, RK_CivitAIAddHashes."
},
{
"author": "Extraltodeus",
"title": "CLIP-Token-Injection [REMOVED]",
"reference": "https://github.com/Extraltodeus/CLIP-Token-Injection",
"files": [
"https://github.com/Extraltodeus/CLIP-Token-Injection"
],
"install_type": "git-clone",
"description": "These nodes are to edit the text vectors of CLIP models, so to customize how the prompts will be interpreted. You could see it as either customisation, 'one token prompt' up to some limitation and a way to mess with how the text will be interpreted. The edited CLIP can then be saved, or as well the edited tokens themselves. The shared example weights does not contain any image-knowledge but the text vector of the words affected."
},
{
"author": "openart",
"title": "openart-comfyui-deploy [REMOVED]",
"id": "openart-comfyui-deploy",
"reference": "https://github.com/kulsisme/openart-comfyui-deploy",
"files": [
"https://github.com/kulsisme/openart-comfyui-deploy"
],
"install_type": "git-clone",
"description": "NODES: External Boolean (ComfyUI Deploy), External Checkpoint (ComfyUI Deploy), External Image (ComfyUI Deploy), External Video (ComfyUI Deploy x VHS), OpenArt Text, Image Websocket Output (ComfyDeploy), ..."
},
{
"author": "mittimi",
"title": "ComfyUI_mittimiLoadPreset [DEPRECATED]",
"id": "comfyui-mittimi-load-preset",
"reference": "https://github.com/mittimi/ComfyUI_mittimiLoadPreset",
"files": [
"https://github.com/mittimi/ComfyUI_mittimiLoadPreset"
],
"install_type": "git-clone",
"description": "The system selects and loads preset."
},
{
"author": "jinljin",
"title": "ComfyUI-Talking-Head [REMOVED]",
"reference": "https://github.com/jinljin/ComfyUI-ElevenlabsAndDID-Combine",
"files": [
"https://github.com/jinljin/ComfyUI-ElevenlabsAndDID-Combine"
],
"install_type": "git-clone",
"description": "ComfyUI-Talking-Head"
},
{
"author": "yvann-ba",
"title": "ComfyUI_Yvann-Nodes [REMOVED]",
"reference": "https://github.com/yvann-ba/ComfyUI_Yvann-Nodes",
"files": [
"https://github.com/yvann-ba/ComfyUI_Yvann-Nodes"
],
"install_type": "git-clone",
"description": "Audio reactivity nodes for AI animations 🔊 Analyze audio, extract drums and vocals. Generate reactive masks and weights. Create audio-driven visuals. Produce weight graphs and audio masks. Compatible with IPAdapter, ControlNets and more. Features audio scheduling and waveform analysis. Tutorials to use this pack: [a/Yvann Youtube](https://www.youtube.com/@yvann.mp4)"
},
{
"author": "jh-leon-kim",
"title": "ComfyUI-JHK-utils [REMOVED]",
"id": "jhk",
"reference": "https://github.com/jh-leon-kim/ComfyUI-JHK-utils",
"files": [
"https://github.com/jh-leon-kim/ComfyUI-JHK-utils"
],
"install_type": "git-clone",
"description": "Nodes:JHK_Utils_LoadEmbed, JHK_Utils_string_merge, JHK_Utils_ImageRemoveBackground"
},
{
"author": "ilovejohnwhite",
"title": "TatToolkit [REMOVED]",
"reference": "https://github.com/ilovejohnwhite/UncleBillyGoncho",
"files": [
"https://github.com/ilovejohnwhite/UncleBillyGoncho"
],
"install_type": "git-clone",
"description": "Nodes:UWU TTK Preprocessor, Pixel Perfect Resolution, Generation Resolution From Image, Generation Resolution From Latent, Enchance And Resize Hint Images, ..."
},
{
"author": "hzchet",
"title": "ComfyUI_QueueGeneration [REMOVED]",
"reference": "https://github.com/hzchet/ComfyUI_QueueGeneration",
"files": [
"https://github.com/hzchet/ComfyUI_QueueGeneration"
],
"install_type": "git-clone",
"description": "NODES:Queue Img2Vid Generation"
},
{
"author": "ader47",
"title": "ComfyUI-MeshHamer [REMOVED]",
"reference": "https://github.com/ader47/comfyui_meshhamer",
"files": [
"https://github.com/ader47/comfyui_meshhamer"
],
"install_type": "git-clone",
"description": "Nodes:MeshHamer Hand Refiner. See also: [a/HaMeR: Hand Mesh Recovery](https://github.com/geopavlakos/hamer/tree/main)"
},
{
"author": "SEkINVR",
"title": "ComfyUI-Animator",
"reference": "https://github.com/SEkINVR/ComfyUI-Animator [REMOVED]",
"files": [
"https://github.com/SEkINVR/ComfyUI-Animator"
],
"install_type": "git-clone",
"description": "This custom node for ComfyUI provides full-body animation capabilities, including facial rigging, various lighting styles, and green screen output."
},
{
"author": "m-ai-studio",
"title": "mai-prompt-progress [REMOVED]",
"reference": "https://github.com/m-ai-studio/mai-prompt-progress",
"files": [
"https://github.com/m-ai-studio/mai-prompt-progress"
],
"install_type": "git-clone",
"description": "mai-prompt-progress"
},
{
"author": "ZHO-ZHO-ZHO",
"title": "ComfyUI-AnyText [NOT MAINTAINED]",
"reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText",
"files": [
"https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText"
],
"install_type": "git-clone",
"description": "Unofficial implementation of [a/AnyText](https://github.com/tyxsspa/AnyText/tree/825bcc54687206b15bd7e28ba1a8b095989d58e3) for ComfyUIEXP"
},
{
"author": "shinich39",
"title": "comfyui-pkg39 [DEPRECATED]",
"reference": "https://github.com/shinich39/comfyui-pkg39",
"files": [
"https://github.com/shinich39/comfyui-pkg39"
],
"install_type": "git-clone",
"description": "This package has created for generate image from generated image and embedded workflow."
},
{
"author": "dnl13",
"title": "ComfyUI-dnl13-seg [DEPRECATED]",
"reference": "https://github.com/dnl13/ComfyUI-dnl13-seg",
"files": [
"https://github.com/dnl13/ComfyUI-dnl13-seg"
],
"install_type": "git-clone",
"description": "After discovering @storyicon implementation here of Segment Anything, I realized its potential as a powerful tool for ComfyUI if implemented correctly. I delved into the SAM and Dino models. The following is my own adaptation of sam_hq for ComfyUI."
},
{
"author": "1038lab",
"title": "ComfyUI-latentSizeSelector [REMOVED]",
"id": "ComfyUI-latentSizeSelector",
"reference": "https://github.com/1038lab/ComfyUI_LatentSizeSelector",
"files": [
"https://github.com/1038lab/ComfyUI_LatentSizeSelector"
],
"install_type": "git-clone",
"description": "You'll get a new node Latent Size Selector, you can pick the x and y sizes from a list."
},
{
"author": "hy134300",
"title": "ComfyUI-PhotoMaker-V2 [REMOVED]",
"reference": "https://github.com/hy134300/ComfyUI-PhotoMaker-V2",
"files": [
"https://github.com/hy134300/ComfyUI-PhotoMaker-V2"
],
"install_type": "git-clone",
"description": "Nodes for PhotoMaker-V2"
},
{
"author": "neverbiasu",
"title": "ComfyUI ImageCaptioner [REMOVED]",

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -170,16 +170,6 @@
"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": "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"
},
{
"author": "OuticNZ",
"title": "ComfyUI-Simple-Of-Complex",

View File

@@ -66,10 +66,10 @@
"\n",
"!echo -= Install dependencies =-\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 einops transformers>=4.28.1 safetensors>=0.4.2 aiohttp pyyaml Pillow scipy tqdm psutil tokenizers>=0.13.3\n",
"!pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121\n",
"!pip3 install torchsde\n",
"!pip3 install kornia>=0.7.1 spandrel\n",
"!pip3 install kornia>=0.7.1 spandrel soundfile sentencepiece\n",
"\n",
"if OPTIONS['USE_COMFYUI_MANAGER']:\n",
" %cd custom_nodes\n",
@@ -228,8 +228,8 @@
},
"outputs": [],
"source": [
"!wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb\n",
"!dpkg -i cloudflared-linux-amd64.deb\n",
"!wget -P ~ https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb\n",
"!dpkg -i ~/cloudflared-linux-amd64.deb\n",
"\n",
"import subprocess\n",
"import threading\n",
@@ -369,4 +369,4 @@
},
"nbformat": 4,
"nbformat_minor": 0
}
}

View File

@@ -20,6 +20,7 @@ import cm_global
security_check.security_check()
cm_global.pip_blacklist = ['torch', 'torchsde', 'torchvision']
cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia']
@@ -448,12 +449,15 @@ def is_installed(name):
if name.startswith('#'):
return True
pattern = r'([^<>!=]+)([<>!=]=?)(.*)'
pattern = r'([^<>!=]+)([<>!=]=?)([0-9.a-zA-Z]*)'
match = re.search(pattern, name)
if match:
name = match.group(1)
if name in cm_global.pip_blacklist:
return True
if name in cm_global.pip_downgrade_blacklist:
pips = get_installed_packages()
@@ -532,7 +536,12 @@ if os.path.exists(restore_snapshot_path):
package_name = remap_pip_package(line.strip())
if package_name and not is_installed(package_name):
if not package_name.startswith('#'):
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
if '--index-url' in package_name:
s = package_name.split('--index-url')
install_cmd = [sys.executable, "-m", "pip", "install", s[0].strip(), '--index-url', s[1].strip()]
else:
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:
@@ -575,7 +584,12 @@ def execute_lazy_install_script(repo_path, executable):
for line in requirements_file:
package_name = remap_pip_package(line.strip())
if package_name and not is_installed(package_name):
install_cmd = [executable, "-m", "pip", "install", package_name]
if '--index-url' in package_name:
s = package_name.split('--index-url')
install_cmd = [sys.executable, "-m", "pip", "install", s[0].strip(), '--index-url', s[1].strip()]
else:
install_cmd = [sys.executable, "-m", "pip", "install", package_name]
process_wrap(install_cmd, repo_path)
if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install:

View File

@@ -1,7 +1,7 @@
[project]
name = "comfyui-manager"
description = "ComfyUI-Manager provides features to install and manage custom nodes for ComfyUI, as well as various functionalities to assist with ComfyUI."
version = "2.48.3"
version = "2.51.5"
license = { file = "LICENSE.txt" }
dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"]

View File

@@ -3,5 +3,9 @@ rm ~/.tmp/default/*.py > /dev/null 2>&1
python scanner.py ~/.tmp/default $*
cp extension-node-map.json node_db/new/.
echo Integrity check
./check.sh
echo "Integrity check"
if [ -f "check2.sh" ]; then
./check2.sh
else
./check.sh
fi