diff --git a/custom_nodes/ComfyUI-Manager/LICENSE.txt b/custom_nodes/ComfyUI-Manager/LICENSE.txt new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/custom_nodes/ComfyUI-Manager/README.md b/custom_nodes/ComfyUI-Manager/README.md new file mode 100644 index 000000000..259168126 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/README.md @@ -0,0 +1,415 @@ +# ComfyUI Manager + +**ComfyUI-Manager** is an extension designed to enhance the usability of [ComfyUI](https://github.com/comfyanonymous/ComfyUI). It offers management functions to **install, remove, disable, and enable** various custom nodes of ComfyUI. Furthermore, this extension provides a hub feature and convenience functions to access a wide range of information within ComfyUI. + +![menu](misc/menu.jpg) + +## NOTICE +* V2.37 Show a ✅ mark to accounts that have been active on GitHub for more than six months. +* V2.33 Security policy is applied. +* V2.21 [cm-cli](docs/en/cm-cli.md) tool is added. +* V2.18 to V2.18.3 is not functioning due to a severe bug. Users on these versions are advised to promptly update to V2.18.4. Please navigate to the `ComfyUI/custom_nodes/ComfyUI-Manager` directory and execute `git pull` to update. +* You can see whole nodes info on [ComfyUI Nodes Info](https://ltdrdata.github.io/) page. + +## Installation + +### Installation[method1] (General installation method: ComfyUI-Manager only) + +To install ComfyUI-Manager in addition to an existing installation of ComfyUI, you can follow the following steps: + +1. goto `ComfyUI/custom_nodes` dir in terminal(cmd) +2. `git clone https://github.com/ltdrdata/ComfyUI-Manager.git` +3. Restart ComfyUI + + +### Installation[method2] (Installation for portable ComfyUI version: ComfyUI-Manager only) +1. install git +- https://git-scm.com/download/win +- standalone version +- select option: use windows default console window +2. Download [scripts/install-manager-for-portable-version.bat](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/install-manager-for-portable-version.bat) into installed `"ComfyUI_windows_portable"` directory +3. double click `install-manager-for-portable-version.bat` batch file + +![portable-install](misc/portable-install.png) + + +### Installation[method3] (Installation through comfy-cli: install ComfyUI and ComfyUI-Manager at once.) +> RECOMMENDED: comfy-cli provides various features to manage ComfyUI from the CLI. + +* **prerequisite: python 3, git** + +Windows: +```commandline +python -m venv venv +venv\Scripts\activate +pip install comfy-cli +comfy install +``` + +Linux/OSX: +```commandline +python -m venv venv +. venv/bin/activate +pip install comfy-cli +comfy install +``` + + +### Installation[method4] (Installation for linux+venv: ComfyUI + ComfyUI-Manager) + +To install ComfyUI with ComfyUI-Manager on Linux using a venv environment, you can follow these steps: +* **prerequisite: python-is-python3, python3-venv, git** + +1. Download [scripts/install-comfyui-venv-linux.sh](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/install-comfyui-venv-linux.sh) into empty install directory +- ComfyUI will be installed in the subdirectory of the specified directory, and the directory will contain the generated executable script. +2. `chmod +x install-comfyui-venv-linux.sh` +3. `./install-comfyui-venv-linux.sh` + +### Installation Precautions +* **DO**: `ComfyUI-Manager` files must be accurately located in the path `ComfyUI/custom_nodes/ComfyUI-Manager` + * Installing in a compressed file format is not recommended. +* **DON'T**: Decompress directly into the `ComfyUI/custom_nodes` location, resulting in the Manager contents like `__init__.py` being placed directly in that directory. + * You have to remove all ComfyUI-Manager files from `ComfyUI/custom_nodes` +* **DON'T**: In a form where decompression occurs in a path such as `ComfyUI/custom_nodes/ComfyUI-Manager/ComfyUI-Manager`. + * You have to move `ComfyUI/custom_nodes/ComfyUI-Manager/ComfyUI-Manager` to `ComfyUI/custom_nodes/ComfyUI-Manager` +* **DON'T**: In a form where decompression occurs in a path such as `ComfyUI/custom_nodes/ComfyUI-Manager-main`. + * In such cases, `ComfyUI-Manager` may operate, but it won't be recognized within `ComfyUI-Manager`, and updates cannot be performed. It also poses the risk of duplicate installations. + * You have to rename `ComfyUI/custom_nodes/ComfyUI-Manager-main` to `ComfyUI/custom_nodes/ComfyUI-Manager` + + +You can execute ComfyUI by running either `./run_gpu.sh` or `./run_cpu.sh` depending on your system configuration. + +## Colab Notebook +This repository provides Colab notebooks that allow you to install and use ComfyUI, including ComfyUI-Manager. To use ComfyUI, [click on this link](https://colab.research.google.com/github/ltdrdata/ComfyUI-Manager/blob/main/notebooks/comfyui_colab_with_manager.ipynb). +* Support for installing ComfyUI +* Support for basic installation of ComfyUI-Manager +* Support for automatically installing dependencies of custom nodes upon restarting Colab notebooks. + +## Changes +* **2.38** `Install Custom Nodes` menu is changed to `Custom Nodes Manager`. +* **2.21** [cm-cli](docs/en/cm-cli.md) tool is added. +* **2.4** Copy the connections of the nearest node by double-clicking. +* **2.2.3** Support Components System +* **0.29** Add `Update all` feature +* **0.25** support db channel + * You can directly modify the db channel settings in the `config.ini` file. + * If you want to maintain a new DB channel, please modify the `channels.list` and submit a PR. +* **0.23** support multiple selection +* **0.18.1** `skip update check` feature added. + * A feature that allows quickly opening windows in environments where update checks take a long time. +* **0.17.1** Bug fix for the issue where enable/disable of the web extension was not working. Compatibility patch for StableSwarmUI. + * Requires latest version of ComfyUI (Revision: 1240) +* **0.17** Support preview method setting feature. +* **0.14** Support robust update. +* **0.13** Support additional 'pip' section for install spec. +* **0.12** Better installation support for Windows. +* **0.9** Support keyword search in installer menu. +* **V0.7.1** Bug fix for the issue where updates were not being applied on Windows. + * **For those who have been using versions 0.6, please perform a manual git pull in the custom_nodes/ComfyUI-Manager directory.** +* **V0.7** To address the issue of a slow list refresh, separate the fetch update and update check processes. +* **V0.6** Support extension installation for missing nodes. +* **V0.5** Removed external git program dependencies. + + +## How To Use + +1. Click "Manager" button on main menu + + ![mainmenu](misc/main.jpg) + + +2. If you click on 'Install Custom Nodes' or 'Install Models', an installer dialog will open. + + ![menu](misc/menu.jpg) + + * There are three DB modes: `DB: Channel (1day cache)`, `DB: Local`, and `DB: Channel (remote)`. + * `Channel (1day cache)` utilizes Channel cache information with a validity period of one day to quickly display the list. + * This information will be updated when there is no cache, when the cache expires, or when external information is retrieved through the Channel (remote). + * Whenever you start ComfyUI anew, this mode is always set as the **default** mode. + * `Local` uses information stored locally in ComfyUI-Manager. + * This information will be updated only when you update ComfyUI-Manager. + * For custom node developers, they should use this mode when registering their nodes in `custom-node-list.json` and testing them. + * `Channel (remote)` retrieves information from the remote channel, always displaying the latest list. + * In cases where retrieval is not possible due to network errors, it will forcibly use local information. + + * The ```Fetch Updates``` menu retrieves update data for custom nodes locally. Actual updates are applied by clicking the ```Update``` button in the ```Install Custom Nodes``` menu. + +3. Click 'Install' or 'Try Install' button. + + ![node-install-dialog](misc/custom-nodes.jpg) + + ![model-install-dialog](misc/models.png) + + * Installed: This item is already installed. + * Install: Clicking this button will install the item. + * Try Install: This is a custom node of which installation information cannot be confirmed. Click the button to try installing it. + + * If a red background `Channel` indicator appears at the top, it means it is not the default channel. Since the amount of information held is different from the default channel, many custom nodes may not appear in this channel state. + * Channel settings have a broad impact, affecting not only the node list but also all functions like "Update all." + * Conflicted Nodes with a yellow background show a list of nodes conflicting with other extensions in the respective extension. This issue needs to be addressed by the developer, and users should be aware that due to these conflicts, some nodes may not function correctly and may need to be installed accordingly. + +4. If you set the `Badge:` item in the menu as `Badge: Nickname`, `Badge: Nickname (hide built-in)`, `Badge: #ID Nickname`, `Badge: #ID Nickname (hide built-in)` the information badge will be displayed on the node. + * When selecting (hide built-in), it hides the 🦊 icon, which signifies built-in nodes. + * Nodes without any indication on the badge are custom nodes that Manager cannot recognize. + * `Badge: Nickname` displays the nickname of custom nodes, while `Badge: #ID Nickname` also includes the internal ID of the node. + + ![model-install-dialog](misc/nickname.jpg) + + +5. Share + ![menu](misc/main.jpg) ![share](misc/share.jpg) + + * You can share the workflow by clicking the Share button at the bottom of the main menu or selecting Share Output from the Context Menu of the Image node. + * Currently, it supports sharing via [https://comfyworkflows.com/](https://comfyworkflows.com/), + [https://openart.ai](https://openart.ai/workflows/dev), [https://youml.com](https://youml.com) + as well as through the Matrix channel. + + ![menu](misc/share-setting.jpg) + + * Through the Share settings in the Manager menu, you can configure the behavior of the Share button in the Main menu or Share Ouput button on Context Menu. + * `None`: hide from Main menu + * `All`: Show a dialog where the user can select a title for sharing. + + +## Snapshot-Manager +* When you press `Save snapshot` or use `Update All` on `Manager Menu`, the current installation status snapshot is saved. + * Snapshot file dir: `ComfyUI-Manager/snapshots` + * You can rename snapshot file. +* Press the "Restore" button to revert to the installation status of the respective snapshot. + * However, for custom nodes not managed by Git, snapshot support is incomplete. +* When you press `Restore`, it will take effect on the next ComfyUI startup. + * The selected snapshot file is saved in `ComfyUI-Manager/startup-scripts/restore-snapshot.json`, and upon restarting ComfyUI, the snapshot is applied and then deleted. + +![model-install-dialog](misc/snapshot.jpg) + + +## cm-cli: command line tools for power user +* A tool is provided that allows you to use the features of ComfyUI-Manager without running ComfyUI. +* For more details, please refer to the [cm-cli documentation](docs/en/cm-cli.md). + + +## How to register your custom node into ComfyUI-Manager + +* Add an entry to `custom-node-list.json` located in the root of ComfyUI-Manager and submit a Pull Request. +* NOTE: Before submitting the PR after making changes, please check `Use local DB` and ensure that the extension list loads without any issues in the `Install custom nodes` dialog. Occasionally, missing or extra commas can lead to JSON syntax errors. +* The remaining JSON will be updated through scripts in the future, so you don't need to worry about it. + + +## Custom node support guide + +* Currently, the system operates by cloning the git repository and sequentially installing the dependencies listed in requirements.txt using pip, followed by invoking the install.py script. In the future, we plan to discuss and determine the specifications for supporting custom nodes. + +* 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 = { + "ExecutionSwitch": ExecutionSwitch, + "ExecutionBlocker": ExecutionBlocker, + ... +} + +NODE_CLASS_MAPPINGS.update({ + "UniFormer-SemSegPreprocessor": Uniformer_SemSegPreprocessor, + "SemSegPreprocessor": Uniformer_SemSegPreprocessor, +}) +``` + +* 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. + * The `nickname` will be the name displayed on the badge of the node. + * If there is no `nickname`, it will be truncated to 20 characters from the arbitrarily written title and used. +``` +""" +@author: Dr.Lt.Data +@title: Impact Pack +@nickname: Impact Pack +@description: This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler. +""" +``` + + +* **Special purpose files** (optional) + * `node_list.json` - When your custom nodes pattern of NODE_CLASS_MAPPINGS is not conventional, it is used to manually provide a list of nodes for reference. ([example](https://github.com/melMass/comfy_mtb/raw/main/node_list.json)) + * `requirements.txt` - When installing, this pip requirements will be installed automatically + * `install.py` - When installing, it is automatically called + * `uninstall.py` - When uninstalling, it is automatically called + * `disable.py` - When disabled, it is automatically called + * When installing a custom node setup `.js` file, it is recommended to write this script for disabling. + * `enable.py` - When enabled, it is automatically called + * **All scripts are executed from the root path of the corresponding custom node.** + + +## Component Sharing +* **Copy & Paste** + * [Demo Page](https://ltdrdata.github.io/component-demo/) + * When pasting a component from the clipboard, it supports text in the following JSON format. (text/plain) + ``` + { + "kind": "ComfyUI Components", + "timestamp": , + "components": + { + : + } + } + ``` + * `` Ensure that the timestamp is always unique. + * "components" should have the same structure as the content of the file stored in ComfyUI-Manager/components. + * ``: The name should be in the format `::`. + * ``: In the nodedata of the group node. + * ``: Only two formats are allowed: `major.minor.patch` or `major.minor`. (e.g. `1.0`, `2.2.1`) + * ``: Saved time + * ``: If the packname is not empty, the category becomes packname/workflow, and it is saved in the .pack file in ComfyUI-Manager/components. + * ``: If there is neither a category nor a packname, it is saved in the components category. + ``` + "version":"1.0", + "datetime": 1705390656516, + "packname": "mypack", + "category": "util/pipe", + ``` +* **Drag & Drop** + * Dragging and dropping a `.pack` or `.json` file will add the corresponding components. + * Example pack: [Impact.pack](misc/Impact.pack) + +* Dragging and dropping or pasting a single component will add a node. However, when adding multiple components, nodes will not be added. + + +## Support of missing nodes installation + +![missing-menu](misc/missing-menu.jpg) + +* When you click on the ```Install Missing Custom Nodes``` button in the menu, it displays a list of extension nodes that contain nodes not currently present in the workflow. + +![missing-list](misc/missing-list.jpg) + + +## Additional Feature +* Logging to file feature + * This feature is enabled by default and can be disabled by setting `file_logging = False` in the `config.ini`. + +* Fix node(recreate): When right-clicking on a node and selecting `Fix node (recreate)`, you can recreate the node. The widget's values are reset, while the connections maintain those with the same names. + * It is used to correct errors in nodes of old workflows created before, which are incompatible with the version changes of custom nodes. + +* Double-Click Node Title: You can set the double click behavior of nodes in the ComfyUI-Manager menu. + * `Copy All Connections`, `Copy Input Connections`: Double-clicking a node copies the connections of the nearest node. + * This action targets the nearest node within a straight-line distance of 1000 pixels from the center of the node. + * In the case of `Copy All Connections`, it duplicates existing outputs, but since it does not allow duplicate connections, the existing output connections of the original node are disconnected. + * This feature copies only the input and output that match the names. + + * `Possible Input Connections`: It connects all outputs that match the closest type within the specified range. + * This connection links to the closest outputs among the nodes located on the left side of the target node. + + * `Possible(left) + Copy(right)`: When you Double-Click on the left half of the title, it operates as `Possible Input Connections`, and when you Double-Click on the right half, it operates as `Copy All Connections`. + +* Prevent downgrade of specific packages + * List the package names in the `downgrade_blacklist` section of the `config.ini` file, separating them with commas. + * e.g + ``` + downgrade_blacklist = diffusers, kornia + ``` + +* Custom pip mapping + * When you create the `pip_overrides.json` file, it changes the installation of specific pip packages to installations defined by the user. + * Please refer to the `pip_overrides.json.template` file. + +* Use `aria2` as downloader + * [howto](docs/en/use_aria2.md) + +## Scanner +When you run the `scan.sh` script: + +* It updates the `extension-node-map.json`. + * To do this, it pulls or clones the custom nodes listed in `custom-node-list.json` into `~/.tmp/default`. + * To skip this step, add the `--skip-update` option. + * If you want to specify a different path instead of `~/.tmp/default`, run `python scanner.py [path]` directly instead of `scan.sh`. + +* It updates the `github-stats.json`. + * This uses the GitHub API, so set your token with `export GITHUB_TOKEN=your_token_here` to avoid quickly reaching the rate limit and malfunctioning. + * To skip this step, add the `--skip-update-stat` option. + +* The `--skip-all` option applies both `--skip-update` and `--skip-stat-update`. + + +## Troubleshooting +* If your `git.exe` is installed in a specific location other than system git, please install ComfyUI-Manager and run ComfyUI. Then, specify the path including the file name in `git_exe = ` in the ComfyUI-Manager/config.ini file that is generated. +* If updating ComfyUI-Manager itself fails, please go to the **ComfyUI-Manager** directory and execute the command `git update-ref refs/remotes/origin/main a361cc1 && git fetch --all && git pull`. + * Alternatively, download the update-fix.py script from [update-fix.py](https://github.com/ltdrdata/ComfyUI-Manager/raw/main/scripts/update-fix.py) and place it in the ComfyUI-Manager directory. Then, run it using your Python command. + For the portable version, use `..\..\..\python_embeded\python.exe update-fix.py`. +* For cases where nodes like `PreviewTextNode` from `ComfyUI_Custom_Nodes_AlekPet` are only supported as front-end nodes, we currently do not provide missing nodes for them. +* Currently, `vid2vid` is not being updated, causing compatibility issues. +* If you encounter the error message `Overlapped Object has pending operation at deallocation on Comfyui Manager load` under Windows + * Edit `config.ini` file: add `windows_selector_event_loop_policy = True` +* if `SSL: CERTIFICATE_VERIFY_FAILED` error is occured. + * Edit `config.ini` file: add `bypass_ssl = True` + +## Security policy + * Edit `config.ini` file: add `security_level = ` + * `strong` + * doesn't allow `high` and `middle` level risky feature + * `normal` + * doesn't allow `high` level risky feature if `--listen` is specified and not starts with `127.` + * `middle` level risky feature is available + * `weak` + * all feature is available + + * `high` level risky features + * `Install via git url`, `pip install` + * Installation of custom nodes registered not in the `default channel`. + * Display terminal log + + * `middle` level risky features + * Uninstall/Update/Fix custom nodes + * Installation of custom nodes registered in the `default channel`. + * Restore/Remove Snapshot + * Restart + + * `low` level risky features + * Update ComfyUI + + +## TODO: Unconventional form of custom node list + +* https://github.com/diontimmer/Sample-Diffusion-ComfyUI-Extension +* https://github.com/senshilabs/NINJA-plugin +* https://github.com/MockbaTheBorg/Nodes +* https://github.com/StartHua/Comfyui_GPT_Story +* https://github.com/NielsGercama/comfyui_customsampling +* https://github.com/wrightdaniel2017/ComfyUI-VideoLipSync +* https://github.com/bxdsjs/ComfyUI-Image-preprocessing +* https://github.com/SMUELDigital/ComfyUI-ONSET +* https://github.com/SimithWang/comfyui-renameImages +* https://github.com/icefairy64/comfyui-model-tilt +* https://github.com/andrewharp/ComfyUI-EasyNodes +* https://github.com/SimithWang/comfyui-renameImages +* https://github.com/Tcheko243/ComfyUI-Photographer-Alpha7-Nodes +* https://github.com/Limbicnation/ComfyUINodeToolbox + +## Roadmap + +- [x] System displaying information about failed custom nodes import. +- [x] Guide for missing nodes in ComfyUI vanilla nodes. +- [x] Collision checking system for nodes with the same ID across extensions. +- [x] Template sharing system. (-> Component system based on Group Nodes) +- [x] 3rd party API system. +- [ ] Auto migration for custom nodes with changed structures. +- [ ] Version control feature for nodes. +- [ ] List of currently used custom nodes. +- [x] Download support multiple model download. +- [x] Model download via url. +- [x] List sorting (custom nodes). +- [x] List sorting (model). +- [ ] Provides description of node. + + +# Disclaimer + +* This extension simply provides the convenience of installing custom nodes and does not guarantee their proper functioning. + + +## Credit +ComfyUI/[ComfyUI](https://github.com/comfyanonymous/ComfyUI) - A powerful and modular stable diffusion GUI. + +**And, for all ComfyUI custom node developers** diff --git a/custom_nodes/ComfyUI-Manager/__init__.py b/custom_nodes/ComfyUI-Manager/__init__.py new file mode 100644 index 000000000..ab85975c3 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/__init__.py @@ -0,0 +1,15 @@ +import os + +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 + WEB_DIRECTORY = "js" +else: + print(f"\n[ComfyUI-Manager] !! cli-only-mode is enabled !!\n") + +NODE_CLASS_MAPPINGS = {} +__all__ = ['NODE_CLASS_MAPPINGS'] + + + diff --git a/custom_nodes/ComfyUI-Manager/alter-list.json b/custom_nodes/ComfyUI-Manager/alter-list.json new file mode 100644 index 000000000..33398277e --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/alter-list.json @@ -0,0 +1,224 @@ +{ + "items": [ + { + "id":"https://github.com/Fannovel16/comfyui_controlnet_aux", + "tags":"controlnet", + "description": "This extension provides preprocessor nodes for using controlnet." + }, + { + "id":"https://github.com/comfyanonymous/ComfyUI_experiments", + "tags":"Dynamic Thresholding, DT, CFG, controlnet, reference only", + "description": "This experimental nodes contains a 'Reference Only' node and a 'ModelSamplerTonemapNoiseTest' node corresponding to the 'Dynamic Threshold'." + }, + { + "id":"https://github.com/ltdrdata/ComfyUI-Impact-Pack", + "tags":"ddetailer, adetailer, ddsd, DD, loopback scaler, prompt, wildcard, dynamic prompt", + "description": "To implement the feature of automatically detecting faces and enhancing details, various detection nodes and detailers provided by the Impact Pack can be applied. Similarly to Loopback Scaler, it also provides various custom workflows that can apply Ksampler while gradually scaling up." + }, + { + "id":"https://github.com/ltdrdata/ComfyUI-Inspire-Pack", + "tags":"lora block weight, effective block analyzer, lbw, variation seed", + "description": "The Inspire Pack provides the functionality of Lora Block Weight, Variation Seed." + }, + { + "id":"https://github.com/biegert/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py", + "tags":"ddsd", + "description": "This extension provides a feature that generates segment masks on an image using a text prompt. When used in conjunction with Impact Pack, it enables applications such as DDSD." + }, + { + "id":"https://github.com/BadCafeCode/masquerade-nodes-comfyui", + "tags":"ddetailer", + "description": "This extension is a less feature-rich and well-maintained alternative to Impact Pack, but it has fewer dependencies and may be easier to install on abnormal configurations. The author recommends trying Impact Pack first." + }, + { + "id":"https://github.com/BlenderNeko/ComfyUI_Cutoff", + "tags":"cutoff", + "description": "By using this extension, prompts like 'blue hair' can be prevented from interfering with other prompts by blocking the attribute 'blue' from being used in prompts other than 'hair'." + }, + { + "id":"https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb", + "tags":"prompt, weight", + "description": "There are differences in the processing methods of prompts, such as weighting and scheduling, between A1111 and ComfyUI. With this extension, various settings can be used to implement prompt processing methods similar to A1111. As this feature is also integrated into ComfyUI Cutoff, please download the Cutoff extension if you plan to use it in conjunction with Cutoff." + }, + { + "id":"https://github.com/shiimizu/ComfyUI_smZNodes", + "tags":"prompt, weight", + "description": "There are differences in the processing methods of prompts, such as weighting and scheduling, between A1111 and ComfyUI. This extension helps to reproduce the same embedding as A1111." + }, + { + "id":"https://github.com/BlenderNeko/ComfyUI_Noise", + "tags":"img2img alt, random", + "description": "The extension provides an unsampler that reverses the sampling process, allowing for a function similar to img2img alt to be implemented. Furthermore, ComfyUI uses CPU's Random instead of GPU's Random for better reproducibility compared to A1111. This extension provides the ability to use GPU's Random for Latent Noise. However, since GPU's Random may vary depending on the GPU model, reproducibility on different devices cannot be guaranteed." + }, + { + "id":"https://github.com/BlenderNeko/ComfyUI_SeeCoder", + "tags":"seecoder, prompt-free-diffusion", + "description": "The extension provides seecoder feature." + }, + { + "id":"https://github.com/lilly1987/ComfyUI_node_Lilly", + "tags":"prompt, wildcard", + "description": "This extension provides features such as a wildcard function that randomly selects prompts belonging to a category and the ability to directly load lora from prompts." + }, + { + "id":"https://github.com/Davemane42/ComfyUI_Dave_CustomNode", + "tags":"latent couple", + "description": "ComfyUI already provides the ability to composite latents by default. However, this extension makes it more convenient to use by visualizing the composite area." + }, + { + "id":"https://github.com/LEv145/images-grid-comfy-plugin", + "tags":"X/Y Plot", + "description": "This tool provides a viewer node that allows for checking multiple outputs in a grid, similar to the X/Y Plot extension." + }, + { + "id":"https://github.com/pythongosssss/ComfyUI-WD14-Tagger", + "tags":"deepbooru, clip interrogation", + "description": "This extension generates clip text by taking an image as input and using the Deepbooru model." + }, + { + "id":"https://github.com/szhublox/ambw_comfyui", + "tags":"supermerger", + "description": "This node takes two models, merges individual blocks together at various ratios, and automatically rates each merge, keeping the ratio with the highest score. " + }, + { + "id":"https://github.com/ssitu/ComfyUI_UltimateSDUpscale", + "tags":"upscaler, Ultimate SD Upscale", + "description": "ComfyUI nodes for the Ultimate Stable Diffusion Upscale script by Coyote-A. Uses the same script used in the A1111 extension to hopefully replicate images generated using the A1111 webui." + }, + { + "id":"https://github.com/dawangraoming/ComfyUI_ksampler_gpu/raw/main/ksampler_gpu.py", + "tags":"random, noise", + "description": "A1111 provides KSampler that uses GPU-based random noise. This extension offers KSampler utilizing GPU-based random noise." + }, + { + "id":"https://github.com/space-nuko/nui-suite", + "tags":"prompt, dynamic prompt", + "description": "This extension provides nodes with the functionality of dynamic prompts." + }, + { + "id":"https://github.com/melMass/comfy_mtb", + "tags":"roop", + "description": "This extension provides bunch of nodes including roop" + }, + { + "id":"https://github.com/ssitu/ComfyUI_roop", + "tags":"roop", + "description": "This extension provides nodes for the roop A1111 webui script." + }, + { + "id":"https://github.com/asagi4/comfyui-prompt-control", + "tags":"prompt, prompt editing", + "description": "This extension provides the ability to use prompts like \n\n**a [large::0.1] [cat|dog:0.05] [::0.5] [in a park:in space:0.4]**\n\n" + }, + { + "id":"https://github.com/adieyal/comfyui-dynamicprompts", + "tags":"prompt, dynamic prompt", + "description": "This extension is a port of sd-dynamic-prompt to ComfyUI." + }, + { + "id":"https://github.com/kwaroran/abg-comfyui", + "tags":"abg, background remover", + "description": "A Anime Background Remover node for comfyui, based on this hf space, works same as AGB extention in automatic1111." + }, + { + "id":"https://github.com/Gourieff/comfyui-reactor-node", + "tags":"reactor, sd-webui-roop-nsfw", + "description": "This is a ported version of ComfyUI for the sd-webui-roop-nsfw extension." + }, + { + "id":"https://github.com/laksjdjf/cgem156-ComfyUI", + "tags":"regional prompt, latent couple, prompt", + "description": "This custom nodes provide a functionality similar to regional prompts, offering couple features at the attention level." + }, + { + "id":"https://github.com/FizzleDorf/ComfyUI_FizzNodes", + "tags":"deforum", + "description": "This custom nodes provide functionality that assists in animation creation, similar to deforum." + }, + { + "id":"https://github.com/seanlynch/comfyui-optical-flow", + "tags":"deforum, vid2vid", + "description": "This custom nodes provide functionality that assists in animation creation, similar to deforum." + }, + { + "id":"https://github.com/ssitu/ComfyUI_fabric", + "tags":"fabric", + "description": "Similar to sd-webui-fabric, this custom nodes provide the functionality of [a/FABRIC](https://github.com/sd-fabric/fabric)." + }, + { + "id":"https://github.com/Zuellni/ComfyUI-ExLlama", + "tags":"ExLlama, prompt, language model", + "description": "Similar to text-generation-webui, this custom nodes provide the functionality of [a/exllama](https://github.com/turboderp/exllama)." + }, + { + "id":"https://github.com/spinagon/ComfyUI-seamless-tiling", + "tags":"tiling", + "description": "ComfyUI node for generating seamless textures Replicates 'Tiling' option from A1111" + }, + { + "id":"https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI", + "tags":"cd-tuner, negpip", + "description": "This extension is a port of the [a/sd-webui-cd-tuner](https://github.com/hako-mikan/sd-webui-cd-tuner)(a.k.a. CD(color/Detail) Tuner )and [a/sd-webui-negpip](https://github.com/hako-mikan/sd-webui-negpip)(a.k.a. NegPiP) extensions of A1111 to ComfyUI." + }, + { + "id":"https://github.com/mcmonkeyprojects/sd-dynamic-thresholding", + "tags":"DT, dynamic thresholding", + "description": "This custom node is a port of the Dynamic Thresholding extension from A1111 to make it available for use in ComfyUI." + }, + { + "id":"https://github.com/hhhzzyang/Comfyui_Lama", + "tags":"lama, inpainting anything", + "description": "This extension provides custom nodes developed based on [a/LaMa](https://github.com/advimman/lama) and [a/Inpainting anything](https://github.com/geekyutao/Inpaint-Anything)." + }, + { + "id":"https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor", + "tags":"lama", + "description": "This extension provides custom nodes for [a/LaMa](https://github.com/advimman/lama) functionality." + }, + { + "id":"https://github.com/Haoming02/comfyui-diffusion-cg", + "tags":"diffusion-cg", + "description": "This extension provides custom nodes for [a/SD Webui Diffusion Color Grading](https://github.com/Haoming02/sd-webui-diffusion-cg) functionality." + }, + { + "id":"https://github.com/asagi4/ComfyUI-CADS", + "tags":"diffusion-cg", + "description": "This extension provides custom nodes for [a/sd-webui-cads](https://github.com/v0xie/sd-webui-cads) functionality." + }, + { + "id":"https://git.mmaker.moe/mmaker/sd-webui-color-enhance", + "tags":"color-enhance", + "description": "This extension supports both A1111 and ComfyUI simultaneously." + }, + { + "id":"https://github.com/shiimizu/ComfyUI-TiledDiffusion", + "tags":"multidiffusion", + "description": "This extension provides custom nodes for [a/Mixture of Diffusers](https://github.com/albarji/mixture-of-diffusers) and [a/MultiDiffusion](https://github.com/omerbt/MultiDiffusion)" + }, + { + "id":"https://github.com/abyz22/image_control", + "tags":"BMAB", + "description": "This extension provides some alternative functionalities of the [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab) extension." + }, + { + "id":"https://github.com/blepping/ComfyUI-sonar", + "tags":"sonar", + "description": "This extension provides some alternative functionalities of the [a/stable-diffusion-webui-sonar](https://github.com/Kahsolt/stable-diffusion-webui-sonar) extension." + }, + { + "id":"https://github.com/AIFSH/ComfyUI-RVC", + "tags":"sonar", + "description": "a comfyui custom node for [a/Retrieval-based-Voice-Conversion-WebUI](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git), you can Voice-Conversion in comfyui now!" + }, + { + "id":"https://github.com/portu-sim/comfyui-bmab", + "tags":"bmab", + "description": "a comfyui custom node for [a/sd-webui-bmab](https://github.com/portu-sim/sd-webui-bmab)" + }, + { + "id":"https://github.com/ThereforeGames/ComfyUI-Unprompted", + "tags":"unprompted", + "description": "This extension is a port of [a/unprompted](https://github.com/ThereforeGames/unprompted)" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/channels.list.template b/custom_nodes/ComfyUI-Manager/channels.list.template new file mode 100644 index 000000000..9a8d6877b --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/channels.list.template @@ -0,0 +1,6 @@ +default::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main +recent::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/new +legacy::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/legacy +forked::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/forked +dev::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/dev +tutorial::https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/node_db/tutorial \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/check.bat b/custom_nodes/ComfyUI-Manager/check.bat new file mode 100644 index 000000000..e7a3b09fc --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/check.bat @@ -0,0 +1,21 @@ +@echo off + +python json-checker.py "custom-node-list.json" +python json-checker.py "model-list.json" +python json-checker.py "alter-list.json" +python json-checker.py "extension-node-map.json" +python json-checker.py "node_db\new\custom-node-list.json" +python json-checker.py "node_db\new\model-list.json" +python json-checker.py "node_db\new\extension-node-map.json" +python json-checker.py "node_db\dev\custom-node-list.json" +python json-checker.py "node_db\dev\model-list.json" +python json-checker.py "node_db\dev\extension-node-map.json" +python json-checker.py "node_db\tutorial\custom-node-list.json" +python json-checker.py "node_db\tutorial\model-list.json" +python json-checker.py "node_db\tutorial\extension-node-map.json" +python json-checker.py "node_db\legacy\custom-node-list.json" +python json-checker.py "node_db\legacy\model-list.json" +python json-checker.py "node_db\legacy\extension-node-map.json" +python json-checker.py "node_db\forked\custom-node-list.json" +python json-checker.py "node_db\forked\model-list.json" +python json-checker.py "node_db\forked\extension-node-map.json" \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/check.sh b/custom_nodes/ComfyUI-Manager/check.sh new file mode 100644 index 000000000..6fa408c7c --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/check.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +echo +echo CHECK1 + +files=( + "custom-node-list.json" + "model-list.json" + "alter-list.json" + "extension-node-map.json" + "github-stats.json" + "node_db/new/custom-node-list.json" + "node_db/new/model-list.json" + "node_db/new/extension-node-map.json" + "node_db/dev/custom-node-list.json" + "node_db/dev/model-list.json" + "node_db/dev/extension-node-map.json" + "node_db/tutorial/custom-node-list.json" + "node_db/tutorial/model-list.json" + "node_db/tutorial/extension-node-map.json" + "node_db/legacy/custom-node-list.json" + "node_db/legacy/model-list.json" + "node_db/legacy/extension-node-map.json" + "node_db/forked/custom-node-list.json" + "node_db/forked/model-list.json" + "node_db/forked/extension-node-map.json" +) + +for file in "${files[@]}"; do + python json-checker.py "$file" +done + +echo +echo CHECK2 +find ~/.tmp/default -name "*.py" -print0 | xargs -0 grep "crypto" + +echo +echo CHECK3 +find ~/.tmp/default -name "requirements.txt" | xargs grep "^\s*https\\?:" +find ~/.tmp/default -name "requirements.txt" | xargs grep "\.whl" + +echo diff --git a/custom_nodes/ComfyUI-Manager/cm-cli.py b/custom_nodes/ComfyUI-Manager/cm-cli.py new file mode 100644 index 000000000..518461c56 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/cm-cli.py @@ -0,0 +1,1029 @@ +import os +import sys +import traceback +import json +import asyncio +import subprocess +import shutil +import concurrent +import threading +from typing import Optional + +import typer +from rich import print +from typing_extensions import List, Annotated +import re +import git + +sys.path.append(os.path.dirname(__file__)) +sys.path.append(os.path.join(os.path.dirname(__file__), "glob")) +import manager_core as core +import cm_global + +comfyui_manager_path = os.path.dirname(__file__) +comfy_path = os.environ.get('COMFYUI_PATH') + +if comfy_path is None: + print(f"\n[bold yellow]WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path.[/bold yellow]", file=sys.stderr) + comfy_path = os.path.abspath(os.path.join(comfyui_manager_path, '..', '..')) + +startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts") +custom_nodes_path = os.path.join(comfy_path, 'custom_nodes') + +script_path = os.path.join(startup_script_path, "install-scripts.txt") +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_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia'] +cm_global.pip_overrides = {} +if os.path.exists(pip_overrides_path): + with open(pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file: + cm_global.pip_overrides = json.load(json_file) + + +def check_comfyui_hash(): + repo = git.Repo(comfy_path) + core.comfy_ui_revision = len(list(repo.iter_commits('HEAD'))) + + comfy_ui_hash = repo.head.commit.hexsha + cm_global.variables['comfyui.revision'] = core.comfy_ui_revision + + core.comfy_ui_commit_datetime = repo.head.commit.committed_datetime + + +check_comfyui_hash() # This is a preparation step for manager_core + + +def read_downgrade_blacklist(): + try: + import configparser + config_path = os.path.join(os.path.dirname(__file__), "config.ini") + config = configparser.ConfigParser() + config.read(config_path) + default_conf = config['default'] + + if 'downgrade_blacklist' in default_conf: + items = default_conf['downgrade_blacklist'].split(',') + items = [x.strip() for x in items if x != ''] + cm_global.pip_downgrade_blacklist += items + cm_global.pip_downgrade_blacklist = list(set(cm_global.pip_downgrade_blacklist)) + except: + pass + + +read_downgrade_blacklist() # This is a preparation step for manager_core + + +class Ctx: + def __init__(self): + self.channel = 'default' + self.mode = 'remote' + self.processed_install = set() + self.custom_node_map_cache = None + + def set_channel_mode(self, channel, mode): + if mode is not None: + self.mode = mode + + valid_modes = ["remote", "local", "cache"] + if mode and mode.lower() not in valid_modes: + typer.echo( + f"Invalid mode: {mode}. Allowed modes are 'remote', 'local', 'cache'.", + err=True, + ) + exit(1) + + if channel is not None: + self.channel = channel + + def post_install(self, url): + try: + repository_name = url.split("/")[-1].strip() + repo_path = os.path.join(custom_nodes_path, repository_name) + repo_path = os.path.abspath(repo_path) + + requirements_path = os.path.join(repo_path, 'requirements.txt') + install_script_path = os.path.join(repo_path, 'install.py') + + if os.path.exists(requirements_path): + 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): + install_cmd = [sys.executable, "-m", "pip", "install", package_name] + output = subprocess.check_output(install_cmd, cwd=repo_path, text=True) + for msg_line in output.split('\n'): + if 'Requirement already satisfied:' in msg_line: + print('.', end='') + else: + print(msg_line) + + if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in self.processed_install: + self.processed_install.add(f'{repo_path}/install.py') + install_cmd = [sys.executable, install_script_path] + output = subprocess.check_output(install_cmd, cwd=repo_path, text=True) + for msg_line in output.split('\n'): + if 'Requirement already satisfied:' in msg_line: + print('.', end='') + else: + print(msg_line) + + except Exception: + print(f"ERROR: Restoring '{url}' is failed.") + + def restore_dependencies(self): + node_paths = [os.path.join(custom_nodes_path, name) for name in os.listdir(custom_nodes_path) + if os.path.isdir(os.path.join(custom_nodes_path, name)) and not name.endswith('.disabled')] + + total = len(node_paths) + i = 1 + for x in node_paths: + print(f"----------------------------------------------------------------------------------------------------") + print(f"Restoring [{i}/{total}]: {x}") + self.post_install(x) + i += 1 + + def load_custom_nodes(self): + channel_dict = core.get_channel_dict() + if self.channel not in channel_dict: + print(f"[bold red]ERROR: Invalid channel is specified `--channel {self.channel}`[/bold red]", file=sys.stderr) + exit(1) + + if self.mode not in ['remote', 'local', 'cache']: + print(f"[bold red]ERROR: Invalid mode is specified `--mode {self.mode}`[/bold red]", file=sys.stderr) + exit(1) + + channel_url = channel_dict[self.channel] + + res = {} + json_obj = asyncio.run(core.get_data_by_mode(self.mode, 'custom-node-list.json', channel_url=channel_url)) + for x in json_obj['custom_nodes']: + for y in x['files']: + if 'github.com' in y and not (y.endswith('.py') or y.endswith('.js')): + repo_name = y.split('/')[-1] + res[repo_name] = (x, False) + + if 'id' in x: + if x['id'] not in res: + res[x['id']] = (x, True) + + return res + + def get_custom_node_map(self): + if self.custom_node_map_cache is not None: + return self.custom_node_map_cache + + self.custom_node_map_cache = self.load_custom_nodes() + + return self.custom_node_map_cache + + def lookup_node_path(self, node_name, robust=False): + if '..' in node_name: + print(f"\n[bold red]ERROR: Invalid node name '{node_name}'[/bold red]\n") + exit(2) + + custom_node_map = self.get_custom_node_map() + if node_name in custom_node_map: + node_url = custom_node_map[node_name][0]['files'][0] + repo_name = node_url.split('/')[-1] + node_path = os.path.join(custom_nodes_path, repo_name) + return node_path, custom_node_map[node_name][0] + elif robust: + node_path = os.path.join(custom_nodes_path, node_name) + return node_path, None + + print(f"\n[bold red]ERROR: Invalid node name '{node_name}'[/bold red]\n") + exit(2) + + +cm_ctx = Ctx() + + +def install_node(node_name, is_all=False, cnt_msg=''): + if core.is_valid_url(node_name): + # install via urls + res = core.gitclone_install([node_name]) + if not res: + print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.[/bold red]") + else: + print(f"{cnt_msg} [INSTALLED] {node_name:50}") + else: + node_path, node_item = cm_ctx.lookup_node_path(node_name) + + if os.path.exists(node_path): + if not is_all: + print(f"{cnt_msg} [ SKIPPED ] {node_name:50} => Already installed") + elif os.path.exists(node_path + '.disabled'): + enable_node(node_name) + else: + res = core.gitclone_install(node_item['files'], instant_execution=True, msg_prefix=f"[{cnt_msg}] ") + if not res: + print(f"[bold red]ERROR: An error occurred while installing '{node_name}'.[/bold red]") + else: + print(f"{cnt_msg} [INSTALLED] {node_name:50}") + + +def reinstall_node(node_name, is_all=False, cnt_msg=''): + node_path, node_item = cm_ctx.lookup_node_path(node_name) + + if os.path.exists(node_path): + shutil.rmtree(node_path) + if os.path.exists(node_path + '.disabled'): + shutil.rmtree(node_path + '.disabled') + + install_node(node_name, is_all=is_all, cnt_msg=cnt_msg) + + +def fix_node(node_name, is_all=False, cnt_msg=''): + node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + + files = node_item['files'] if node_item is not None else [node_path] + + if os.path.exists(node_path): + print(f"{cnt_msg} [ FIXING ]: {node_name:50} => Disabled") + res = core.gitclone_fix(files, instant_execution=True) + if not res: + print(f"ERROR: An error occurred while fixing '{node_name}'.") + elif not is_all and os.path.exists(node_path + '.disabled'): + print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => Disabled") + elif not is_all: + print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => Not installed") + + +def uninstall_node(node_name, is_all=False, cnt_msg=''): + node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + + files = node_item['files'] if node_item is not None else [node_path] + + if os.path.exists(node_path) or os.path.exists(node_path + '.disabled'): + res = core.gitclone_uninstall(files) + if not res: + print(f"ERROR: An error occurred while uninstalling '{node_name}'.") + else: + print(f"{cnt_msg} [UNINSTALLED] {node_name:50}") + else: + print(f"{cnt_msg} [ SKIPPED ]: {node_name:50} => Not installed") + + +def update_node(node_name, is_all=False, cnt_msg=''): + node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + + files = node_item['files'] if node_item is not None else [node_path] + + res = core.gitclone_update(files, skip_script=True, msg_prefix=f"[{cnt_msg}] ") + + if not res: + print(f"ERROR: An error occurred while updating '{node_name}'.") + return None + + return node_path + + +def update_parallel(nodes): + is_all = False + if 'all' in nodes: + is_all = True + nodes = [x for x in cm_ctx.get_custom_node_map().keys() if os.path.exists(os.path.join(custom_nodes_path, x)) or os.path.exists(os.path.join(custom_nodes_path, x) + '.disabled')] + + nodes = [x for x in nodes if x.lower() not in ['comfy', 'comfyui', 'all']] + + total = len(nodes) + + lock = threading.Lock() + processed = [] + + i = 0 + + def process_custom_node(x): + nonlocal i + nonlocal processed + + with lock: + i += 1 + + try: + node_path = update_node(x, is_all=is_all, cnt_msg=f'{i}/{total}') + with lock: + processed.append(node_path) + except Exception as e: + print(f"ERROR: {e}") + traceback.print_exc() + + with concurrent.futures.ThreadPoolExecutor(4) as executor: + for item in nodes: + executor.submit(process_custom_node, item) + + i = 1 + for node_path in processed: + if node_path is None: + print(f"[{i}/{total}] Post update: ERROR") + else: + print(f"[{i}/{total}] Post update: {node_path}") + cm_ctx.post_install(node_path) + i += 1 + + +def update_comfyui(): + res = core.update_path(comfy_path, instant_execution=True) + if res == 'fail': + print("Updating ComfyUI has failed.") + elif res == 'updated': + print("ComfyUI is updated.") + else: + print("ComfyUI is already up to date.") + + +def enable_node(node_name, is_all=False, cnt_msg=''): + if node_name == 'ComfyUI-Manager': + return + + node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + + if os.path.exists(node_path + '.disabled'): + current_name = node_path + '.disabled' + os.rename(current_name, node_path) + print(f"{cnt_msg} [ENABLED] {node_name:50}") + elif os.path.exists(node_path): + print(f"{cnt_msg} [SKIPPED] {node_name:50} => Already enabled") + elif not is_all: + print(f"{cnt_msg} [SKIPPED] {node_name:50} => Not installed") + + +def disable_node(node_name, is_all=False, cnt_msg=''): + if node_name == 'ComfyUI-Manager': + return + + node_path, node_item = cm_ctx.lookup_node_path(node_name, robust=True) + + if os.path.exists(node_path): + current_name = node_path + new_name = node_path + '.disabled' + os.rename(current_name, new_name) + print(f"{cnt_msg} [DISABLED] {node_name:50}") + elif os.path.exists(node_path + '.disabled'): + print(f"{cnt_msg} [ SKIPPED] {node_name:50} => Already disabled") + elif not is_all: + print(f"{cnt_msg} [ SKIPPED] {node_name:50} => Not installed") + + +def show_list(kind, simple=False): + for k, v in cm_ctx.get_custom_node_map().items(): + if v[1]: + continue + + node_path = os.path.join(custom_nodes_path, k) + + states = set() + if os.path.exists(node_path): + prefix = '[ ENABLED ] ' + states.add('installed') + states.add('enabled') + states.add('all') + elif os.path.exists(node_path + '.disabled'): + prefix = '[ DISABLED ] ' + states.add('installed') + states.add('disabled') + states.add('all') + else: + prefix = '[ NOT INSTALLED ] ' + states.add('not-installed') + states.add('all') + + if kind in states: + if simple: + print(f"{k:50}") + else: + short_id = v[0].get('id', "") + print(f"{prefix} {k:50} {short_id:20} (author: {v[0]['author']})") + + # unregistered nodes + candidates = os.listdir(os.path.realpath(custom_nodes_path)) + + for k in candidates: + fullpath = os.path.join(custom_nodes_path, k) + + if os.path.isfile(fullpath): + continue + + if k in ['__pycache__']: + continue + + states = set() + if k.endswith('.disabled'): + prefix = '[ DISABLED ] ' + states.add('installed') + states.add('disabled') + states.add('all') + k = k[:-9] + else: + prefix = '[ ENABLED ] ' + states.add('installed') + states.add('enabled') + states.add('all') + + if k not in cm_ctx.get_custom_node_map(): + if kind in states: + if simple: + print(f"{k:50}") + else: + print(f"{prefix} {k:50} {'':20} (author: N/A)") + + +def show_snapshot(simple_mode=False): + json_obj = core.get_current_snapshot() + + if simple_mode: + print(f"[{json_obj['comfyui']}] comfyui") + for k, v in json_obj['git_custom_nodes'].items(): + print(f"[{v['hash']}] {k}") + for v in json_obj['file_custom_nodes']: + print(f"[ N/A ] {v['filename']}") + + else: + formatted_json = json.dumps(json_obj, ensure_ascii=False, indent=4) + print(formatted_json) + + +def show_snapshot_list(simple_mode=False): + snapshot_path = os.path.join(comfyui_manager_path, 'snapshots') + + files = os.listdir(snapshot_path) + json_files = [x for x in files if x.endswith('.json')] + for x in sorted(json_files): + print(x) + + +def cancel(): + if os.path.exists(script_path): + os.remove(script_path) + + if os.path.exists(restore_snapshot_path): + os.remove(restore_snapshot_path) + + +def auto_save_snapshot(): + path = core.save_snapshot_with_postfix('cli-autosave') + print(f"Current snapshot is saved as `{path}`") + + +def for_each_nodes(nodes, act, allow_all=True): + is_all = False + if allow_all and 'all' in nodes: + is_all = True + nodes = [x for x in cm_ctx.get_custom_node_map().keys() if os.path.exists(os.path.join(custom_nodes_path, x)) or os.path.exists(os.path.join(custom_nodes_path, x) + '.disabled')] + + nodes = [x for x in nodes if x.lower() not in ['comfy', 'comfyui', 'all']] + + total = len(nodes) + i = 1 + for x in nodes: + try: + act(x, is_all=is_all, cnt_msg=f'{i}/{total}') + except Exception as e: + print(f"ERROR: {e}") + traceback.print_exc() + i += 1 + + +app = typer.Typer() + + +@app.command(help="Display help for commands") +def help(ctx: typer.Context): + print(ctx.find_root().get_help()) + ctx.exit(0) + + +@app.command(help="Install custom nodes") +def install( + nodes: List[str] = typer.Argument( + ..., help="List of custom nodes to install" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + for_each_nodes(nodes, act=install_node) + + +@app.command(help="Reinstall custom nodes") +def reinstall( + nodes: List[str] = typer.Argument( + ..., help="List of custom nodes to reinstall" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + for_each_nodes(nodes, act=reinstall_node) + + +@app.command(help="Uninstall custom nodes") +def uninstall( + nodes: List[str] = typer.Argument( + ..., help="List of custom nodes to uninstall" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + for_each_nodes(nodes, act=uninstall_node) + + +@app.command(help="Disable custom nodes") +def update( + nodes: List[str] = typer.Argument( + ..., + help="[all|List of custom nodes to update]" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + + if 'all' in nodes: + auto_save_snapshot() + + for x in nodes: + if x.lower() in ['comfyui', 'comfy', 'all']: + update_comfyui() + break + + update_parallel(nodes) + + +@app.command(help="Disable custom nodes") +def disable( + nodes: List[str] = typer.Argument( + ..., + help="[all|List of custom nodes to disable]" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + + if 'all' in nodes: + auto_save_snapshot() + + for_each_nodes(nodes, disable_node, allow_all=True) + + +@app.command(help="Enable custom nodes") +def enable( + nodes: List[str] = typer.Argument( + ..., + help="[all|List of custom nodes to enable]" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + + if 'all' in nodes: + auto_save_snapshot() + + for_each_nodes(nodes, enable_node, allow_all=True) + + +@app.command(help="Fix dependencies of custom nodes") +def fix( + nodes: List[str] = typer.Argument( + ..., + help="[all|List of custom nodes to fix]" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + + if 'all' in nodes: + auto_save_snapshot() + + for_each_nodes(nodes, fix_node, allow_all=True) + + +@app.command("show", help="Show node list (simple mode)") +def show( + arg: str = typer.Argument( + help="[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + valid_commands = [ + "installed", + "enabled", + "not-installed", + "disabled", + "all", + "snapshot", + "snapshot-list", + ] + if arg not in valid_commands: + typer.echo(f"Invalid command: `show {arg}`", err=True) + exit(1) + + cm_ctx.set_channel_mode(channel, mode) + if arg == 'snapshot': + show_snapshot() + elif arg == 'snapshot-list': + show_snapshot_list() + else: + show_list(arg) + + +@app.command("simple-show", help="Show node list (simple mode)") +def simple_show( + arg: str = typer.Argument( + help="[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]" + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + valid_commands = [ + "installed", + "enabled", + "not-installed", + "disabled", + "all", + "snapshot", + "snapshot-list", + ] + if arg not in valid_commands: + typer.echo(f"[bold red]Invalid command: `show {arg}`[/bold red]", err=True) + exit(1) + + cm_ctx.set_channel_mode(channel, mode) + if arg == 'snapshot': + show_snapshot(True) + elif arg == 'snapshot-list': + show_snapshot_list(True) + else: + show_list(arg, True) + + +@app.command('cli-only-mode', help="Set whether to use ComfyUI-Manager in CLI-only mode.") +def cli_only_mode( + mode: str = typer.Argument( + ..., help="[enable|disable]" + )): + cli_mode_flag = os.path.join(os.path.dirname(__file__), '.enable-cli-only-mode') + if mode.lower() == 'enable': + with open(cli_mode_flag, 'w') as file: + pass + print(f"\nINFO: `cli-only-mode` is enabled\n") + elif mode.lower() == 'disable': + if os.path.exists(cli_mode_flag): + os.remove(cli_mode_flag) + print(f"\nINFO: `cli-only-mode` is disabled\n") + else: + print(f"\n[bold red]Invalid value for cli-only-mode: {mode}[/bold red]\n") + exit(1) + + +@app.command( + "deps-in-workflow", help="Generate dependencies file from workflow (.json/.png)" +) +def deps_in_workflow( + workflow: Annotated[ + str, typer.Option(show_default=False, help="Workflow file (.json/.png)") + ], + output: Annotated[ + str, typer.Option(show_default=False, help="Output file (.json)") + ], + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + + input_path = workflow + output_path = output + + if not os.path.exists(input_path): + print(f"[bold red]File not found: {input_path}[/bold red]") + exit(1) + + used_exts, unknown_nodes = asyncio.run(core.extract_nodes_from_workflow(input_path, mode=cm_ctx.mode, channel_url=cm_ctx.channel)) + + custom_nodes = {} + for x in used_exts: + custom_nodes[x] = {'state': core.simple_check_custom_node(x), + 'hash': '-' + } + + res = { + 'custom_nodes': custom_nodes, + 'unknown_nodes': list(unknown_nodes) + } + + with open(output_path, "w", encoding='utf-8') as output_file: + json.dump(res, output_file, indent=4) + + print(f"Workflow dependencies are being saved into {output_path}.") + + +@app.command("save-snapshot", help="Save a snapshot of the current ComfyUI environment. If output path isn't provided. Save to ComfyUI-Manager/snapshots path.") +def save_snapshot( + output: Annotated[ + str, + typer.Option( + show_default=False, help="Specify the output file path. (.json/.yaml)" + ), + ] = None, +): + path = core.save_snapshot_with_postfix('snapshot', output) + print(f"Current snapshot is saved as `{path}`") + + +@app.command("restore-snapshot", help="Restore snapshot from snapshot file") +def restore_snapshot( + snapshot_name: str, + pip_non_url: Optional[bool] = typer.Option( + default=None, + show_default=False, + is_flag=True, + help="Restore for pip packages registered on PyPI.", + ), + pip_non_local_url: Optional[bool] = typer.Option( + default=None, + show_default=False, + is_flag=True, + help="Restore for pip packages registered at web URLs.", + ), + pip_local_url: Optional[bool] = typer.Option( + default=None, + show_default=False, + is_flag=True, + help="Restore for pip packages specified by local paths.", + ), +): + extras = [] + if pip_non_url: + extras.append('--pip-non-url') + + if pip_non_local_url: + extras.append('--pip-non-local-url') + + if pip_local_url: + extras.append('--pip-local-url') + + print(f"PIPs restore mode: {extras}") + + if os.path.exists(snapshot_name): + snapshot_path = os.path.abspath(snapshot_name) + else: + snapshot_path = os.path.join(core.comfyui_manager_path, 'snapshots', snapshot_name) + if not os.path.exists(snapshot_path): + print(f"[bold red]ERROR: `{snapshot_path}` is not exists.[/bold red]") + exit(1) + + try: + cloned_repos = [] + checkout_repos = [] + skipped_repos = [] + enabled_repos = [] + disabled_repos = [] + is_failed = False + + def extract_infos(msg): + nonlocal is_failed + + for x in msg: + if x.startswith("CLONE: "): + cloned_repos.append(x[7:]) + elif x.startswith("CHECKOUT: "): + checkout_repos.append(x[10:]) + elif x.startswith("SKIPPED: "): + skipped_repos.append(x[9:]) + elif x.startswith("ENABLE: "): + enabled_repos.append(x[8:]) + elif x.startswith("DISABLE: "): + disabled_repos.append(x[9:]) + elif 'APPLY SNAPSHOT: False' in x: + is_failed = True + + print(f"Restore snapshot.") + cmd_str = [sys.executable, git_script_path, '--apply-snapshot', snapshot_path] + extras + output = subprocess.check_output(cmd_str, cwd=custom_nodes_path, text=True) + msg_lines = output.split('\n') + extract_infos(msg_lines) + + for url in cloned_repos: + cm_ctx.post_install(url) + + # print summary + for x in cloned_repos: + print(f"[ INSTALLED ] {x}") + for x in checkout_repos: + print(f"[ CHECKOUT ] {x}") + for x in enabled_repos: + print(f"[ ENABLED ] {x}") + for x in disabled_repos: + print(f"[ DISABLED ] {x}") + + if is_failed: + print(output) + print("[bold red]ERROR: Failed to restore snapshot.[/bold red]") + + except Exception: + print("[bold red]ERROR: Failed to restore snapshot.[/bold red]") + traceback.print_exc() + raise typer.Exit(code=1) + + +@app.command( + "restore-dependencies", help="Restore dependencies from whole installed custom nodes." +) +def restore_dependencies(): + node_paths = [os.path.join(custom_nodes_path, name) for name in os.listdir(custom_nodes_path) + if os.path.isdir(os.path.join(custom_nodes_path, name)) and not name.endswith('.disabled')] + + total = len(node_paths) + i = 1 + for x in node_paths: + print(f"----------------------------------------------------------------------------------------------------") + print(f"Restoring [{i}/{total}]: {x}") + cm_ctx.post_install(x) + i += 1 + + +@app.command( + "post-install", help="Install dependencies and execute installation script" +) +def post_install( + path: str = typer.Argument( + help="path to custom node", + )): + path = os.path.expanduser(path) + cm_ctx.post_install(path) + + +@app.command( + "install-deps", + help="Install dependencies from dependencies file(.json) or workflow(.png/.json)", +) +def install_deps( + deps: str = typer.Argument( + help="Dependency spec file (.json)", + ), + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + ), +): + cm_ctx.set_channel_mode(channel, mode) + auto_save_snapshot() + + if not os.path.exists(deps): + print(f"[bold red]File not found: {deps}[/bold red]") + exit(1) + else: + with open(deps, 'r', encoding="UTF-8", errors="ignore") as json_file: + try: + json_obj = json.load(json_file) + except: + print(f"[bold red]Invalid json file: {deps}[/bold red]") + exit(1) + + for k in json_obj['custom_nodes'].keys(): + state = core.simple_check_custom_node(k) + if state == 'installed': + continue + elif state == 'not-installed': + core.gitclone_install([k], instant_execution=True) + else: # disabled + core.gitclone_set_active([k], False) + + print("Dependency installation and activation complete.") + + +@app.command(help="Clear reserved startup action in ComfyUI-Manager") +def clear(): + cancel() + + +@app.command("export-custom-node-ids", help="Export custom node ids") +def export_custom_node_ids( + path: str, + channel: Annotated[ + str, + typer.Option( + show_default=False, + help="Specify the operation mode" + ), + ] = None, + mode: str = typer.Option( + None, + help="[remote|local|cache]" + )): + cm_ctx.set_channel_mode(channel, mode) + + with open(path, "w", encoding='utf-8') as output_file: + for x in cm_ctx.get_custom_node_map().keys(): + print(x, file=output_file) + + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(app()) + +print(f"") diff --git a/custom_nodes/ComfyUI-Manager/custom-node-list.json b/custom_nodes/ComfyUI-Manager/custom-node-list.json new file mode 100644 index 000000000..e81a89263 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/custom-node-list.json @@ -0,0 +1,11693 @@ +{ + "custom_nodes": [ + { + "author": "Dr.Lt.Data", + "title": "ComfyUI-Manager", + "id": "manager", + "reference": "https://github.com/ltdrdata/ComfyUI-Manager", + "files": [ + "https://github.com/ltdrdata/ComfyUI-Manager" + ], + "install_type": "git-clone", + "description": "ComfyUI-Manager itself is also a custom node." + }, + { + "author": "Dr.Lt.Data", + "title": "ComfyUI Impact Pack", + "id": "impact", + "reference": "https://github.com/ltdrdata/ComfyUI-Impact-Pack", + "files": [ + "https://github.com/ltdrdata/ComfyUI-Impact-Pack" + ], + "pip": ["ultralytics"], + "install_type": "git-clone", + "description": "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.", + "preemptions":["SAMLoader"] + }, + { + "author": "Dr.Lt.Data", + "title": "ComfyUI Inspire Pack", + "id": "inspire", + "reference": "https://github.com/ltdrdata/ComfyUI-Inspire-Pack", + "nodename_pattern": "Inspire$", + "files": [ + "https://github.com/ltdrdata/ComfyUI-Inspire-Pack" + ], + "install_type": "git-clone", + "description": "This extension provides various nodes to support Lora Block Weight and the Impact Pack. Provides many easily applicable regional features and applications for Variation Seed." + }, + { + "author": "comfyanonymous", + "title": "ComfyUI_experiments", + "id": "comfy-exp", + "reference": "https://github.com/comfyanonymous/ComfyUI_experiments", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_experiments" + ], + "install_type": "git-clone", + "description": "Nodes: ModelSamplerTonemapNoiseTest, TonemapNoiseWithRescaleCFG, ReferenceOnlySimple, RescaleClassifierFreeGuidanceTest, ModelMergeBlockNumber, ModelMergeSDXL, ModelMergeSDXLTransformers, ModelMergeSDXLDetailedTransformers." + }, + { + "author": "comfyanonymous", + "title": "TensorRT Node for ComfyUI", + "id": "tensorrt", + "reference": "https://github.com/comfyanonymous/ComfyUI_TensorRT", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_TensorRT" + ], + "install_type": "git-clone", + "description": "This node enables the best performance on NVIDIA RTX™ Graphics Cards (GPUs) for Stable Diffusion by leveraging NVIDIA TensorRT." + }, + { + "author": "Stability-AI", + "title": "Stability API nodes for ComfyUI", + "id": "sai-api", + "reference": "https://github.com/Stability-AI/ComfyUI-SAI_API", + "files": [ + "https://github.com/Stability-AI/ComfyUI-SAI_API" + ], + "install_type": "git-clone", + "description": "Nodes:Stability SD3, Stability Outpainting, Stability Search and Replace, Stability Image Core, Stability Inpainting, Stability Remove Background, Stability Creative Upscale.\nAdd API key to environment variable 'SAI_API_KEY'\nAlternatively you can write your API key to file 'sai_platform_key.txt'\nYou can also use and/or override the above by entering your API key in the 'api_key_override' field of each node." + }, + { + "author": "Stability-AI", + "title": "stability-ComfyUI-nodes", + "id": "sai-nodes", + "reference": "https://github.com/Stability-AI/stability-ComfyUI-nodes", + "files": [ + "https://github.com/Stability-AI/stability-ComfyUI-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: ColorBlend, ControlLoraSave, GetImageSize. NOTE: Control-LoRA recolor example uses these nodes." + }, + { + "author": "Fannovel16", + "title": "ComfyUI's ControlNet Auxiliary Preprocessors", + "id": "cnet-aux", + "reference": "https://github.com/Fannovel16/comfyui_controlnet_aux", + "files": [ + "https://github.com/Fannovel16/comfyui_controlnet_aux" + ], + "preemptions":[ + "AIO_Preprocessor", + "AnimalPosePreprocessor", + "AnimeFace_SemSegPreprocessor", + "AnimeLineArtPreprocessor", + "BAE-NormalMapPreprocessor", + "BinaryPreprocessor", + "CannyEdgePreprocessor", + "ColorPreprocessor", + "DSINE-NormalMapPreprocessor", + "DWPreprocessor", + "DensePosePreprocessor", + "DepthAnythingPreprocessor", + "DiffusionEdge_Preprocessor", + "FacialPartColoringFromPoseKps", + "FakeScribblePreprocessor", + "HEDPreprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "ImageIntensityDetector", + "ImageLuminanceDetector", + "InpaintPreprocessor", + "LeReS-DepthMapPreprocessor", + "LineArtPreprocessor", + "LineartStandardPreprocessor", + "M-LSDPreprocessor", + "Manga2Anime_LineArt_Preprocessor", + "MaskOptFlow", + "MediaPipe-FaceMeshPreprocessor", + "MeshGraphormer-DepthMapPreprocessor", + "MiDaS-DepthMapPreprocessor", + "MiDaS-NormalMapPreprocessor", + "OneFormer-ADE20K-SemSegPreprocessor", + "OneFormer-COCO-SemSegPreprocessor", + "OpenposePreprocessor", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "SAMPreprocessor", + "SavePoseKpsAsJsonFile", + "ScribblePreprocessor", + "Scribble_XDoG_Preprocessor", + "SemSegPreprocessor", + "ShufflePreprocessor", + "TEEDPreprocessor", + "TilePreprocessor", + "UniFormer-SemSegPreprocessor", + "Unimatch_OptFlowPreprocessor", + "Zoe-DepthMapPreprocessor", + "Zoe_DepthAnythingPreprocessor"], + "install_type": "git-clone", + "description": "This is a rework of comfyui_controlnet_preprocessors based on ControlNet auxiliary models by 🤗. I think the old repo isn't good enough to maintain. All old workflow will still be work with this repo but the version option won't do anything. Almost all v1 preprocessors are replaced by v1.1 except those doesn't appear in v1.1. [w/NOTE: Please refrain from using the controlnet preprocessor alongside this installation, as it may lead to conflicts and prevent proper recognition.]" + }, + { + "author": "Fannovel16", + "title": "ComfyUI Frame Interpolation", + "id": "frame-interpolation", + "reference": "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation", + "files": [ + "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation" + ], + "install_type": "git-clone", + "description": "Nodes: KSampler Gradually Adding More Denoise (efficient)" + }, + { + "author": "Fannovel16", + "title": "ComfyUI Loopchain", + "id": "loopchain", + "reference": "https://github.com/Fannovel16/ComfyUI-Loopchain", + "files": [ + "https://github.com/Fannovel16/ComfyUI-Loopchain" + ], + "install_type": "git-clone", + "description": "A collection of nodes which can be useful for animation in ComfyUI. The main focus of this extension is implementing a mechanism called loopchain. A loopchain in this case is the chain of nodes only executed repeatly in the workflow. If a node chain contains a loop node from this extension, it will become a loop chain." + }, + { + "author": "Fannovel16", + "title": "ComfyUI MotionDiff", + "id": "motiondiff", + "reference": "https://github.com/Fannovel16/ComfyUI-MotionDiff", + "files": [ + "https://github.com/Fannovel16/ComfyUI-MotionDiff" + ], + "install_type": "git-clone", + "description": "Implementation of MDM, MotionDiffuse and ReMoDiffuse into ComfyUI." + }, + { + "author": "Fannovel16", + "title": "ComfyUI-Video-Matting", + "id": "video-matting", + "reference": "https://github.com/Fannovel16/ComfyUI-Video-Matting", + "files": [ + "https://github.com/Fannovel16/ComfyUI-Video-Matting" + ], + "install_type": "git-clone", + "description": "A minimalistic implementation of [a/Robust Video Matting (RVM)](https://github.com/PeterL1n/RobustVideoMatting/) in ComfyUI" + }, + { + "author": "Fannovel16", + "title": "ComfyUI-MagickWand", + "id": "magicwand", + "reference": "https://github.com/Fannovel16/ComfyUI-MagickWand", + "files": [ + "https://github.com/Fannovel16/ComfyUI-MagickWand" + ], + "install_type": "git-clone", + "description": "Proper implementation of ImageMagick - the famous software suite for editing and manipulating digital images to ComfyUI using [a/wandpy](https://github.com/emcconville/wand).\nNOTE: You need to install ImageMagick, manually." + }, + { + "author": "time-river", + "title": "CLIPSeg", + "id": "clipseg", + "reference": "https://github.com/time-river/ComfyUI-CLIPSeg", + "files": [ + "https://github.com/time-river/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py" + ], + "install_type": "copy", + "description": "The CLIPSeg node generates a binary mask for a given input image and text prompt.\nNOTE:This custom node is a forked custom node with hotfixes applied from the [a/original repository](https://github.com/biegert/ComfyUI-CLIPSeg), which is no longer maintained." + }, + { + "author": "BlenderNeko", + "title": "ComfyUI Cutoff", + "id": "cutoff", + "reference": "https://github.com/BlenderNeko/ComfyUI_Cutoff", + "files": [ + "https://github.com/BlenderNeko/ComfyUI_Cutoff" + ], + "install_type": "git-clone", + "description": "These custom nodes provides features that allow for better control over the effects of the text prompt." + }, + { + "author": "BlenderNeko", + "title": "Advanced CLIP Text Encode", + "id": "adv-encode", + "reference": "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb", + "files": [ + "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb" + ], + "install_type": "git-clone", + "description": "Advanced CLIP Text Encode (if you need A1111 like prompt. you need this. But Cutoff node includes this feature, already.)" + }, + { + "author": "BlenderNeko", + "title": "ComfyUI Noise", + "id": "comfy-noise", + "reference": "https://github.com/BlenderNeko/ComfyUI_Noise", + "files": [ + "https://github.com/BlenderNeko/ComfyUI_Noise" + ], + "install_type": "git-clone", + "description": "This extension contains 6 nodes for ComfyUI that allows for more control and flexibility over the noise." + }, + { + "author": "BlenderNeko", + "title": "Tiled sampling for ComfyUI", + "id": "tiled-sampling", + "reference": "https://github.com/BlenderNeko/ComfyUI_TiledKSampler", + "files": [ + "https://github.com/BlenderNeko/ComfyUI_TiledKSampler" + ], + "install_type": "git-clone", + "description": "This extension contains a tiled sampler for ComfyUI. It allows for denoising larger images by splitting it up into smaller tiles and denoising these. It tries to minimize any seams for showing up in the end result by gradually denoising all tiles one step at the time and randomizing tile positions for every step." + }, + { + "author": "BlenderNeko", + "title": "SeeCoder [WIP]", + "id": "seecoder", + "reference": "https://github.com/BlenderNeko/ComfyUI_SeeCoder", + "files": [ + "https://github.com/BlenderNeko/ComfyUI_SeeCoder" + ], + "install_type": "git-clone", + "description": "It provides the capability to generate CLIP from an image input, unlike unCLIP, which works in all models. (To use this extension, you need to download the required model file from **Install Models**)" + }, + { + "author": "jags111", + "title": "Efficiency Nodes for ComfyUI Version 2.0+", + "id": "eff-nodes", + "reference": "https://github.com/jags111/efficiency-nodes-comfyui", + "files": [ + "https://github.com/jags111/efficiency-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "A collection of ComfyUI custom nodes to help streamline workflows and reduce total node count.[w/NOTE: This node is originally created by LucianoCirino, but the [a/original repository](https://github.com/LucianoCirino/efficiency-nodes-comfyui) is no longer maintained and has been forked by a new maintainer. To use the forked version, you should uninstall the original version and **REINSTALL** this one.]" + }, + { + "author": "jags111", + "title": "Jags_VectorMagic", + "id": "vectormagic", + "reference": "https://github.com/jags111/ComfyUI_Jags_VectorMagic", + "files": [ + "https://github.com/jags111/ComfyUI_Jags_VectorMagic" + ], + "install_type": "git-clone", + "description": "a collection of nodes to explore Vector and image manipulation" + }, + { + "author": "jags111", + "title": "Jags_Audiotools", + "id": "audiotools", + "reference": "https://github.com/jags111/ComfyUI_Jags_Audiotools", + "files": [ + "https://github.com/jags111/ComfyUI_Jags_Audiotools" + ], + "install_type": "git-clone", + "description": "This extension offers various audio generation tools" + }, + { + "author": "Derfuu", + "title": "Derfuu_ComfyUI_ModdedNodes", + "id": "derfuu", + "reference": "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes", + "nodename_pattern": "^DF_", + "files": [ + "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes" + ], + "install_type": "git-clone", + "description": "Automate calculation depending on image sizes or something you want." + }, + { + "author": "paulo-coronado", + "title": "comfy_clip_blip_node", + "id": "blip", + "reference": "https://github.com/paulo-coronado/comfy_clip_blip_node", + "files": [ + "https://github.com/paulo-coronado/comfy_clip_blip_node" + ], + "install_type": "git-clone", + "apt_dependency": [ + "rustc", + "cargo" + ], + "description": "CLIPTextEncodeBLIP: This custom node provides a CLIP Encoder that is capable of receiving images as input." + }, + { + "author": "WASasquatch", + "title": "WAS Node Suite", + "id": "was", + "reference": "https://github.com/WASasquatch/was-node-suite-comfyui", + "pip": ["numba"], + "files": [ + "https://github.com/WASasquatch/was-node-suite-comfyui" + ], + "install_type": "git-clone", + "description": "A node suite for ComfyUI with many new nodes, such as image processing, text processing, and more." + }, + { + "author": "WASasquatch", + "title": "ComfyUI Preset Merger", + "id": "preset-merger", + "reference": "https://github.com/WASasquatch/ComfyUI_Preset_Merger", + "files": [ + "https://github.com/WASasquatch/ComfyUI_Preset_Merger" + ], + "install_type": "git-clone", + "description": "Nodes: ModelMergeByPreset. Merge checkpoint models by preset" + }, + { + "author": "WASasquatch", + "title": "PPF_Noise_ComfyUI", + "id": "ppf", + "reference": "https://github.com/WASasquatch/PPF_Noise_ComfyUI", + "files": [ + "https://github.com/WASasquatch/PPF_Noise_ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes: WAS_PFN_Latent. Perlin Power Fractal Noisey Latents" + }, + { + "author": "WASasquatch", + "title": "Power Noise Suite for ComfyUI", + "id": "power-noise", + "reference": "https://github.com/WASasquatch/PowerNoiseSuite", + "files": [ + "https://github.com/WASasquatch/PowerNoiseSuite" + ], + "install_type": "git-clone", + "description": "Power Noise Suite contains nodes centered around latent noise input, and diffusion, as well as latent adjustments." + }, + { + "author": "WASasquatch", + "title": "FreeU_Advanced", + "id": "freeu-adv", + "reference": "https://github.com/WASasquatch/FreeU_Advanced", + "files": [ + "https://github.com/WASasquatch/FreeU_Advanced" + ], + "install_type": "git-clone", + "description": "This custom node provides advanced settings for FreeU." + }, + { + "author": "WASasquatch", + "title": "ASTERR", + "id": "asterr", + "reference": "https://github.com/WASasquatch/ASTERR", + "files": [ + "https://github.com/WASasquatch/ASTERR" + ], + "install_type": "git-clone", + "description": "Abstract Syntax Trees Evaluated Restricted Run (ASTERR) is a Python Script executor for ComfyUI. [w/Warning:ASTERR runs Python Code from a Web Interface! It is highly recommended to run this in a closed-off environment, as it could have potential security risks.]" + }, + { + "author": "WASasquatch", + "title": "WAS_Extras", + "id": "was-extras", + "reference": "https://github.com/WASasquatch/WAS_Extras", + "files": [ + "https://github.com/WASasquatch/WAS_Extras" + ], + "install_type": "git-clone", + "description": "Nodes:Conditioning (Blend), Inpainting VAE Encode (WAS), VividSharpen. Experimental nodes, or other random extra helper nodes." + }, + { + "author": "SaltAI", + "title": "SaltAI-Open-Resources", + "id": "saltai-open-resource", + "reference": "https://github.com/get-salt-AI/SaltAI", + "pip": ["numba"], + "files": [ + "https://github.com/get-salt-AI/SaltAI" + ], + "install_type": "git-clone", + "description": "This repository is a collection of open-source nodes and workflows for ComfyUI, a dev tool that allows users to create node-based workflows often powered by various AI models to do pretty much anything.\nOur mission is to seamlessly connect people and organizations with the world’s foremost AI innovations, anywhere, anytime. Our vision is to foster a flourishing AI ecosystem where the world’s best developers can build and share their work, thereby redefining how software is made, pushing innovation forward, and ensuring as many people as possible can benefit from the positive promise of AI technologies.\nWe believe that ComfyUI is a powerful tool that can help us achieve our mission and vision, by enabling anyone to explore the possibilities and limitations of AI models in a visual and interactive way, without coding if desired.\nWe hope that by sharing our nodes and workflows, we can inspire and empower more people to create amazing AI-powered content with ComfyUI." + }, + { + "author": "SaltAI", + "title": "SaltAI_LlamaIndex", + "id": "saltai-llamaindex", + "reference": "https://github.com/get-salt-AI/SaltAI_LlamaIndex", + "files": [ + "https://github.com/get-salt-AI/SaltAI_LlamaIndex" + ], + "install_type": "git-clone", + "description": "An implementation of the RAG LlamaIndex with Agents from AutoGen" + }, + { + "author": "SaltAI", + "title": "SaltAI Language Toolkit", + "id": "saltai-langtool", + "reference": "https://github.com/get-salt-AI/SaltAI_Language_Toolkit", + "files": [ + "https://github.com/get-salt-AI/SaltAI_Language_Toolkit" + ], + "install_type": "git-clone", + "description": "The project integrates the Retrieval Augmented Generation (RAG) tool [a/Llama-Index](https://www.llamaindex.ai/), [a/Microsoft's AutoGen](https://microsoft.github.io/autogen/), and [a/LlaVA-Next](https://github.com/LLaVA-VL/LLaVA-NeXT) with ComfyUI's adaptable node interface, enhancing the functionality and user experience of the platform." + }, + { + "author": "omar92", + "title": "Quality of life Suit:V2", + "id": "qol", + "reference": "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92", + "files": [ + "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92" + ], + "install_type": "git-clone", + "description": "openAI suite, String suite, Latent Tools, Image Tools: These custom nodes provide expanded functionality for image and string processing, latent processing, as well as the ability to interface with models such as ChatGPT/DallE-2.\nNOTE: Currently, this extension does not support the new OpenAI API, leading to compatibility issues." + }, + { + "author": "lilly1987", + "title": "simple wildcard for ComfyUI", + "id": "simle-wildcard", + "reference": "https://github.com/lilly1987/ComfyUI_node_Lilly", + "files": [ + "https://github.com/lilly1987/ComfyUI_node_Lilly" + ], + "install_type": "git-clone", + "description": "These custom nodes provides a feature to insert arbitrary inputs through wildcards in the prompt. Additionally, this tool provides features that help simplify workflows, such as VAELoaderDecoder and SimplerSample." + }, + { + "author": "sylym", + "title": "Vid2vid", + "id": "vid2vid", + "reference": "https://github.com/sylym/comfy_vid2vid", + "files": [ + "https://github.com/sylym/comfy_vid2vid" + ], + "install_type": "git-clone", + "description": "A node suite for ComfyUI that allows you to load image sequence and generate new image sequence with different styles or content." + }, + { + "author": "EllangoK", + "title": "ComfyUI-post-processing-nodes", + "id": "post-processing", + "reference": "https://github.com/EllangoK/ComfyUI-post-processing-nodes", + "files": [ + "https://github.com/EllangoK/ComfyUI-post-processing-nodes" + ], + "install_type": "git-clone", + "description": "A collection of post processing nodes for ComfyUI, simply download this repo and drag." + }, + { + "author": "LEv145", + "title": "ImagesGrid", + "id": "imagesgrid", + "reference": "https://github.com/LEv145/images-grid-comfy-plugin", + "files": [ + "https://github.com/LEv145/images-grid-comfy-plugin" + ], + "install_type": "git-clone", + "description": "This tool provides a viewer node that allows for checking multiple outputs in a grid, similar to the X/Y Plot extension." + }, + { + "author": "diontimmer", + "title": "ComfyUI-Vextra-Nodes", + "id": "vextra", + "reference": "https://github.com/diontimmer/ComfyUI-Vextra-Nodes", + "files": [ + "https://github.com/diontimmer/ComfyUI-Vextra-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Pixel Sort, Swap Color Mode, Solid Color, Glitch This, Add Text To Image, Play Sound, Prettify Prompt, Generate Noise, Flatten Colors" + }, + { + "author": "CYBERLOOM-INC", + "title": "ComfyUI-nodes-hnmr", + "id": "hnmr", + "reference": "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr", + "files": [ + "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr" + ], + "install_type": "git-clone", + "description": "Provide various custom nodes for Latent, Sampling, Model, Loader, Image, Text. This is the fixed version of the original [a/ComfyUI-nodes-hnmr](https://github.com/hnmr293/ComfyUI-nodes-hnmr) by hnmr293." + }, + { + "author": "BadCafeCode", + "title": "Masquerade Nodes", + "id": "masquerade", + "reference": "https://github.com/BadCafeCode/masquerade-nodes-comfyui", + "files": [ + "https://github.com/BadCafeCode/masquerade-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "This is a low-dependency node pack primarily dealing with masks. The author recommends using Impact-Pack instead (unless you specifically have trouble installing dependencies)." + }, + { + "author": "guoyk93", + "title": "y.k.'s ComfyUI node suite", + "id": "yks", + "reference": "https://github.com/guoyk93/yk-node-suite-comfyui", + "files": [ + "https://github.com/guoyk93/yk-node-suite-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes: YKImagePadForOutpaint, YKMaskToImage" + }, + { + "author": "Jcd1230", + "title": "Rembg Background Removal Node for ComfyUI", + "id": "rembg", + "reference": "https://github.com/Jcd1230/rembg-comfyui-node", + "files": [ + "https://github.com/Jcd1230/rembg-comfyui-node" + ], + "install_type": "git-clone", + "description": "Nodes: Image Remove Background (rembg)" + }, + { + "author": "YinBailiang", + "title": "MergeBlockWeighted_fo_ComfyUI", + "id": "mbw", + "reference": "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI", + "files": [ + "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes: MergeBlockWeighted" + }, + { + "author": "trojblue", + "title": "trNodes", + "id": "trnodes", + "reference": "https://github.com/trojblue/trNodes", + "files": [ + "https://github.com/trojblue/trNodes" + ], + "install_type": "git-clone", + "description": "Nodes: image_layering, color_correction, model_router" + }, + { + "author": "szhublox", + "title": "Auto-MBW", + "id": "auto-mbw", + "reference": "https://github.com/szhublox/ambw_comfyui", + "files": [ + "https://github.com/szhublox/ambw_comfyui" + ], + "install_type": "git-clone", + "description": "Auto-MBW for ComfyUI loosely based on sdweb-auto-MBW. Nodes: auto merge block weighted" + }, + { + "author": "city96", + "title": "ComfyUI_NetDist", + "id": "netdist", + "reference": "https://github.com/city96/ComfyUI_NetDist", + "files": [ + "https://github.com/city96/ComfyUI_NetDist" + ], + "install_type": "git-clone", + "description": "Run ComfyUI workflows on multiple local GPUs/networked machines. Nodes: Remote images, Local Remote control" + }, + { + "author": "city96", + "title": "Latent-Interposer", + "id": "latent-interposer", + "reference": "https://github.com/city96/SD-Latent-Interposer", + "files": [ + "https://github.com/city96/SD-Latent-Interposer" + ], + "install_type": "git-clone", + "description": "Custom node to convert the lantents between SDXL and SD v1.5 directly without the VAE decoding/encoding step." + }, + { + "author": "city96", + "title": "SD-Advanced-Noise", + "id": "adv-noise", + "reference": "https://github.com/city96/SD-Advanced-Noise", + "files": [ + "https://github.com/city96/SD-Advanced-Noise" + ], + "install_type": "git-clone", + "description": "Nodes: LatentGaussianNoise, MathEncode. An experimental custom node that generates latent noise directly by utilizing the linear characteristics of the latent space." + }, + { + "author": "city96", + "title": "SD-Latent-Upscaler", + "id": "latent-upscaler", + "reference": "https://github.com/city96/SD-Latent-Upscaler", + "files": [ + "https://github.com/city96/SD-Latent-Upscaler" + ], + "pip": ["huggingface-hub"], + "install_type": "git-clone", + "description": "Upscaling stable diffusion latents using a small neural network." + }, + { + "author": "city96", + "title": "ComfyUI_DiT [WIP]", + "id": "dit", + "reference": "https://github.com/city96/ComfyUI_DiT", + "files": [ + "https://github.com/city96/ComfyUI_DiT" + ], + "pip": ["huggingface-hub"], + "install_type": "git-clone", + "description": "Testbed for [a/DiT(Scalable Diffusion Models with Transformers)](https://github.com/facebookresearch/DiT). [w/None of this code is stable, expect breaking changes if for some reason you want to use this.]" + }, + { + "author": "city96", + "title": "ComfyUI_ColorMod", + "id": "colormod", + "reference": "https://github.com/city96/ComfyUI_ColorMod", + "files": [ + "https://github.com/city96/ComfyUI_ColorMod" + ], + "install_type": "git-clone", + "description": "This extension currently has two sets of nodes - one set for editing the contrast/color of images and another set for saving images as 16 bit PNG files." + }, + { + "author": "city96", + "title": "Extra Models for ComfyUI", + "id": "extramodels", + "reference": "https://github.com/city96/ComfyUI_ExtraModels", + "files": [ + "https://github.com/city96/ComfyUI_ExtraModels" + ], + "install_type": "git-clone", + "description": "This extension aims to add support for various random image diffusion models to ComfyUI." + }, + { + "author": "SLAPaper", + "title": "ComfyUI-Image-Selector", + "id": "image-selector", + "reference": "https://github.com/SLAPaper/ComfyUI-Image-Selector", + "files": [ + "https://github.com/SLAPaper/ComfyUI-Image-Selector" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI, which can select one or some of images from a batch." + }, + { + "author": "SLAPaper", + "title": "ComfyUI DPM++ 2M Alt Sampler", + "id": "dpmpp2m-alt", + "reference": "https://github.com/SLAPaper/ComfyUI-dpmpp_2m_alt-Sampler", + "files": [ + "https://github.com/SLAPaper/ComfyUI-dpmpp_2m_alt-Sampler" + ], + "install_type": "git-clone", + "description": "the sampler introduced by [a/hallatore](https://github.com/AUTOMATIC1111/stable-diffusion-webui/discussions/8457)\ncode extracted from [a/smZNodes](https://github.com/shiimizu/ComfyUI_smZNodes)" + }, + { + "author": "flyingshutter", + "title": "As_ComfyUI_CustomNodes", + "reference": "https://github.com/flyingshutter/As_ComfyUI_CustomNodes", + "files": [ + "https://github.com/flyingshutter/As_ComfyUI_CustomNodes" + ], + "install_type": "git-clone", + "description": "Manipulation nodes for Image, Latent" + }, + { + "author": "Zuellni", + "title": "Zuellni/ComfyUI-Custom-Nodes", + "reference": "https://github.com/Zuellni/ComfyUI-Custom-Nodes", + "files": [ + "https://github.com/Zuellni/ComfyUI-Custom-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: DeepFloyd, Filter, Select, Save, Decode, Encode, Repeat, Noise, Noise" + }, + { + "author": "Zuellni", + "title": "ComfyUI-ExLlama", + "id": "exllama", + "reference": "https://github.com/Zuellni/ComfyUI-ExLlama", + "files": [ + "https://github.com/Zuellni/ComfyUI-ExLlama" + ], + "pip": ["sentencepiece", "https://github.com/jllllll/exllama/releases/download/0.0.17/exllama-0.0.17+cu118-cp310-cp310-win_amd64.whl"], + "install_type": "git-clone", + "description": "Nodes: ExLlama Loader, ExLlama Generator.\nUsed to load 4-bit GPTQ Llama/2 models. You can find a lot of them over at [a/https://huggingface.co/TheBloke](https://huggingface.co/TheBloke)[w/NOTE: You need to manually install a pip package that suits your system. For example. If your system is 'Python3.10 + Windows + CUDA 11.8' then you need to install 'exllama-0.0.17+cu118-cp310-cp310-win_amd64.whl'. Available package files are [a/here](https://github.com/jllllll/exllama/releases)]" + }, + { + "author": "Zuellni", + "title": "ComfyUI ExLlamaV2 Nodes", + "id": "exllamav2", + "reference": "https://github.com/Zuellni/ComfyUI-ExLlama-Nodes", + "files": [ + "https://github.com/Zuellni/ComfyUI-ExLlama-Nodes" + ], + "install_type": "git-clone", + "description": "A simple local text generator for ComfyUI utilizing [a/ExLlamaV2](https://github.com/turboderp/exllamav2).\n[w/NOTE:Manual package installation is required.]" + }, + { + "author": "Zuellni", + "title": "ComfyUI PickScore Nodes", + "id": "pickscore", + "reference": "https://github.com/Zuellni/ComfyUI-PickScore-Nodes", + "files": [ + "https://github.com/Zuellni/ComfyUI-PickScore-Nodes" + ], + "install_type": "git-clone", + "description": "Image scoring nodes for ComfyUI using PickScore with a batch of images to predict which ones fit a given prompt the best." + }, + { + "author": "AlekPet", + "title": "AlekPet/ComfyUI_Custom_Nodes_AlekPet", + "id": "alekpet", + "reference": "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet", + "files": [ + "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet" + ], + "install_type": "git-clone", + "description": "Nodes: PoseNode, PainterNode, TranslateTextNode, TranslateCLIPTextEncodeNode, DeepTranslatorTextNode, DeepTranslatorCLIPTextEncodeNode, ArgosTranslateTextNode, ArgosTranslateCLIPTextEncodeNode, PreviewTextNode.\n\nNOTE: Due to the dynamic nature of node name definitions, ComfyUI-Manager cannot recognize the node list from this extension. The Missing nodes and Badge features are not available for this extension." + }, + { + "author": "pythongosssss", + "title": "ComfyUI WD 1.4 Tagger", + "id": "wd14", + "reference": "https://github.com/pythongosssss/ComfyUI-WD14-Tagger", + "files": [ + "https://github.com/pythongosssss/ComfyUI-WD14-Tagger" + ], + "install_type": "git-clone", + "description": "A ComfyUI extension allowing the interrogation of booru tags from images." + }, + { + "author": "pythongosssss", + "title": "pythongosssss/ComfyUI-Custom-Scripts", + "id": "pygos-script", + "reference": "https://github.com/pythongosssss/ComfyUI-Custom-Scripts", + "files": [ + "https://github.com/pythongosssss/ComfyUI-Custom-Scripts" + ], + "install_type": "git-clone", + "description": "This extension provides: Auto Arrange Graph, Workflow SVG, Favicon Status, Image Feed, Latent Upscale By, Lock Nodes & Groups, Lora Subfolders, Preset Text, Show Text, Touch Support, Link Render Mode, Locking, Node Finder, Quick Nodes, Show Image On Menu, Show Text, Workflow Managements, Custom Widget Default Values" + }, + { + "author": "strimmlarn", + "title": "ComfyUI_Strimmlarns_aesthetic_score", + "id": "aesthetic-score", + "reference": "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score", + "js_path": "strimmlarn", + "files": [ + "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score" + ], + "install_type": "git-clone", + "description": "Nodes: CalculateAestheticScore, LoadAesteticModel, AesthetlcScoreSorter, ScoreToNumber" + }, + { + "author": "TinyTerra", + "title": "ComfyUI_tinyterraNodes", + "id": "ttn", + "reference": "https://github.com/TinyTerra/ComfyUI_tinyterraNodes", + "files": [ + "https://github.com/TinyTerra/ComfyUI_tinyterraNodes" + ], + "install_type": "git-clone", + "nodename_pattern": "^ttN ", + "description": "This extension offers various pipe nodes, extensive XYZ plotting, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more." + }, + { + "author": "Jordach", + "title": "comfy-plasma", + "id": "plasma", + "reference": "https://github.com/Jordach/comfy-plasma", + "files": [ + "https://github.com/Jordach/comfy-plasma" + ], + "install_type": "git-clone", + "description": "Nodes: Plasma Noise, Random Noise, Greyscale Noise, Pink Noise, Brown Noise, Plasma KSampler" + }, + { + "author": "bvhari", + "title": "ImageProcessing", + "id": "imageprocessing", + "reference": "https://github.com/bvhari/ComfyUI_ImageProcessing", + "files": [ + "https://github.com/bvhari/ComfyUI_ImageProcessing" + ], + "install_type": "git-clone", + "description": "ComfyUI custom nodes to apply various image processing techniques." + }, + { + "author": "bvhari", + "title": "ComfyUI_PerpWeight", + "id": "perpweight", + "reference": "https://github.com/bvhari/ComfyUI_PerpWeight", + "files": [ + "https://github.com/bvhari/ComfyUI_PerpWeight" + ], + "install_type": "git-clone", + "description": "A novel weighting scheme for token vectors from CLIP. Allows a wider range of values for the weight. Inspired by Perp-Neg." + }, + { + "author": "bvhari", + "title": "ComfyUI_SUNoise", + "id": "sunoise", + "reference": "https://github.com/bvhari/ComfyUI_SUNoise", + "files": [ + "https://github.com/bvhari/ComfyUI_SUNoise" + ], + "install_type": "git-clone", + "description": "Scaled Uniform Noise for Ancestral and Stochastic samplers" + }, + { + "author": "ssitu", + "title": "UltimateSDUpscale", + "id": "usdu", + "reference": "https://github.com/ssitu/ComfyUI_UltimateSDUpscale", + "files": [ + "https://github.com/ssitu/ComfyUI_UltimateSDUpscale" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes for the Ultimate Stable Diffusion Upscale script by Coyote-A." + }, + { + "author": "ssitu", + "title": "Restart Sampling", + "id": "restart-sampling", + "reference": "https://github.com/ssitu/ComfyUI_restart_sampling", + "files": [ + "https://github.com/ssitu/ComfyUI_restart_sampling" + ], + "install_type": "git-clone", + "description": "Unofficial ComfyUI nodes for restart sampling based on the paper 'Restart Sampling for Improving Generative Processes' ([a/paper](https://arxiv.org/abs/2306.14878), [a/repo](https://github.com/Newbeeer/diffusion_restart_sampling))" + }, + { + "author": "ssitu", + "title": "ComfyUI roop", + "id": "roop", + "reference": "https://github.com/ssitu/ComfyUI_roop", + "files": [ + "https://github.com/ssitu/ComfyUI_roop" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes for the roop A1111 webui script." + }, + { + "author": "ssitu", + "title": "ComfyUI fabric", + "id": "fabric", + "reference": "https://github.com/ssitu/ComfyUI_fabric", + "files": [ + "https://github.com/ssitu/ComfyUI_fabric" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes based on the paper [a/FABRIC: Personalizing Diffusion Models with Iterative Feedback](https://arxiv.org/abs/2307.10159) (Feedback via Attention-Based Reference Image Conditioning)" + }, + { + "author": "space-nuko", + "title": "Disco Diffusion", + "id": "disco", + "reference": "https://github.com/space-nuko/ComfyUI-Disco-Diffusion", + "files": [ + "https://github.com/space-nuko/ComfyUI-Disco-Diffusion" + ], + "install_type": "git-clone", + "description": "Modularized version of Disco Diffusion for use with ComfyUI." + }, + { + "author": "space-nuko", + "title": "OpenPose Editor", + "id": "openpose-editor", + "reference": "https://github.com/space-nuko/ComfyUI-OpenPose-Editor", + "files": [ + "https://github.com/space-nuko/ComfyUI-OpenPose-Editor" + ], + "install_type": "git-clone", + "description": "A port of the openpose-editor extension for stable-diffusion-webui. NOTE: Requires [a/this ComfyUI patch](https://github.com/comfyanonymous/ComfyUI/pull/711) to work correctly" + }, + { + "author": "space-nuko", + "title": "nui suite", + "id": "nui", + "reference": "https://github.com/space-nuko/nui-suite", + "files": [ + "https://github.com/space-nuko/nui-suite" + ], + "install_type": "git-clone", + "description": "NODES: Dynamic Prompts Text Encode, Feeling Lucky Text Encode, Output String" + }, + { + "author": "Nourepide", + "title": "Allor Plugin", + "id": "allor", + "reference": "https://github.com/Nourepide/ComfyUI-Allor", + "files": [ + "https://github.com/Nourepide/ComfyUI-Allor" + ], + "install_type": "git-clone", + "description": "Allor is a plugin for ComfyUI with an emphasis on transparency and performance." + }, + { + "author": "melMass", + "title": "MTB Nodes", + "id": "mtb", + "reference": "https://github.com/melMass/comfy_mtb", + "files": [ + "https://github.com/melMass/comfy_mtb" + ], + "nodename_pattern": "\\(mtb\\)$", + "install_type": "git-clone", + "description": "NODES: Face Swap, Film Interpolation, Latent Lerp, Int To Number, Bounding Box, Crop, Uncrop, ImageBlur, Denoise, ImageCompare, RGV to HSV, HSV to RGB, Color Correct, Modulo, Deglaze Image, Smart Step, ..." + }, + { + "author": "xXAdonesXx", + "title": "NodeGPT", + "id": "nodegpt", + "reference": "https://github.com/xXAdonesXx/NodeGPT", + "files": [ + "https://github.com/xXAdonesXx/NodeGPT" + ], + "install_type": "git-clone", + "description": "Implementation of AutoGen inside ComfyUI. This repository is under development, and not everything is functioning correctly yet." + }, + { + "author": "Suzie1", + "title": "Comfyroll Studio", + "id": "comfyroll", + "reference": "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes", + "files": [ + "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes" + ], + "install_type": "git-clone", + "description": "Custom nodes for SDXL and SD1.5 including Multi-ControlNet, LoRA, Aspect Ratio, Process Switches, and many more nodes. NOTE: Maintainer is changed to Suzie1 from RockOfFire. [w/Using an outdated version has resulted in reported issues with updates not being applied. Trying to reinstall the software is advised.]" + }, + { + "author": "bmad4ever", + "title": "ComfyUI-Bmad-DirtyUndoRedo", + "reference": "https://github.com/bmad4ever/ComfyUI-Bmad-DirtyUndoRedo", + "files": [ + "https://github.com/bmad4ever/ComfyUI-Bmad-DirtyUndoRedo" + ], + "install_type": "git-clone", + "description": "ComfyUI extension that adds undo (and redo) functionality." + }, + { + "author": "bmad4ever", + "title": "Bmad Nodes", + "id": "bmad", + "reference": "https://github.com/bmad4ever/comfyui_bmad_nodes", + "files": [ + "https://github.com/bmad4ever/comfyui_bmad_nodes" + ], + "install_type": "git-clone", + "description": "This custom node offers the following functionalities: API support for setting up API requests, computer vision primarily for masking or collages, and general utility to streamline workflow setup or implement essential missing features." + }, + { + "author": "bmad4ever", + "title": "comfyui_ab_sampler", + "id": "ab-sampler", + "reference": "https://github.com/bmad4ever/comfyui_ab_samplercustom", + "files": [ + "https://github.com/bmad4ever/comfyui_ab_samplercustom" + ], + "install_type": "git-clone", + "description": "Experimental sampler node. Sampling alternates between A and B inputs until only one remains, starting with A. B steps run over a 2x2 grid, where 3/4's of the grid are copies of the original input latent. When the optional mask is used, the region outside the defined roi is copied from the original latent at the end of every step." + }, + { + "author": "bmad4ever", + "title": "Lists Cartesian Product", + "reference": "https://github.com/bmad4ever/comfyui_lists_cartesian_product", + "files": [ + "https://github.com/bmad4ever/comfyui_lists_cartesian_product" + ], + "install_type": "git-clone", + "description": "Given a set of lists, the node adjusts them so that when used as input to another node all the possible argument permutations are computed." + }, + { + "author": "bmad4ever", + "title": "comfyui_wfc_like", + "id": "wfc", + "reference": "https://github.com/bmad4ever/comfyui_wfc_like", + "files": [ + "https://github.com/bmad4ever/comfyui_wfc_like" + ], + "install_type": "git-clone", + "description": "An 'opinionated' Wave Function Collapse implementation with a set of nodes for comfyui" + }, + { + "author": "bmad4ever", + "title": "comfyui_quilting", + "id": "quilting", + "reference": "https://github.com/bmad4ever/comfyui_quilting", + "files": [ + "https://github.com/bmad4ever/comfyui_quilting" + ], + "install_type": "git-clone", + "description": "image and latent quilting nodes for comfyui" + }, + { + "author": "FizzleDorf", + "title": "FizzNodes", + "id": "fizz", + "reference": "https://github.com/FizzleDorf/ComfyUI_FizzNodes", + "files": [ + "https://github.com/FizzleDorf/ComfyUI_FizzNodes" + ], + "install_type": "git-clone", + "description": "Scheduled prompts, scheduled float/int values and wave function nodes for animations and utility. compatable with [a/framesync](https://www.framesync.xyz/) and [a/keyframe-string-generator](https://www.chigozie.co.uk/keyframe-string-generator/) for audio synced animations in Comfyui." + }, + { + "author": "FizzleDorf", + "title": "ComfyUI-AIT", + "id": "ait", + "reference": "https://github.com/FizzleDorf/ComfyUI-AIT", + "files": [ + "https://github.com/FizzleDorf/ComfyUI-AIT" + ], + "install_type": "git-clone", + "description": "A ComfyUI implementation of Facebook Meta's [a/AITemplate](https://github.com/facebookincubator/AITemplate) repo for faster inference using cpp/cuda. This new repo is behind the old version but is a much more stable foundation to keep AIT online. Please be patient as the repo will eventually include the same features as before.\nNOTE: You can find the old AIT extension in the legacy channel." + }, + { + "author": "filipemeneses", + "title": "Pixelization", + "id": "pixelization", + "reference": "https://github.com/filipemeneses/comfy_pixelization", + "files": [ + "https://github.com/filipemeneses/comfy_pixelization" + ], + "install_type": "git-clone", + "description": "ComfyUI node that pixelizes images." + }, + { + "author": "shiimizu", + "title": "smZNodes", + "id": "smz", + "reference": "https://github.com/shiimizu/ComfyUI_smZNodes", + "files": [ + "https://github.com/shiimizu/ComfyUI_smZNodes" + ], + "install_type": "git-clone", + "description": "NODES: CLIP Text Encode++. Achieve identical embeddings from stable-diffusion-webui for ComfyUI." + }, + { + "author": "shiimizu", + "title": "Tiled Diffusion & VAE for ComfyUI", + "id": "tiled-diffusion", + "reference": "https://github.com/shiimizu/ComfyUI-TiledDiffusion", + "files": [ + "https://github.com/shiimizu/ComfyUI-TiledDiffusion" + ], + "install_type": "git-clone", + "description": "The extension enables large image drawing & upscaling with limited VRAM via the following techniques:\n1.Two SOTA diffusion tiling algorithms: [a/Mixture of Diffusers](https://github.com/albarji/mixture-of-diffusers) and [a/MultiDiffusion](https://github.com/omerbt/MultiDiffusion)\n2.pkuliyi2015's Tiled VAE algorithm." + }, + { + "author": "ZaneA", + "title": "ImageReward", + "reference": "https://github.com/ZaneA/ComfyUI-ImageReward", + "files": [ + "https://github.com/ZaneA/ComfyUI-ImageReward" + ], + "install_type": "git-clone", + "description": "NODES: ImageRewardLoader, ImageRewardScore" + }, + { + "author": "SeargeDP", + "title": "SeargeSDXL", + "id": "searge", + "reference": "https://github.com/SeargeDP/SeargeSDXL", + "files": [ + "https://github.com/SeargeDP/SeargeSDXL" + ], + "install_type": "git-clone", + "description": "Custom nodes for easier use of SDXL in ComfyUI including an img2img workflow that utilizes both the base and refiner checkpoints." + }, + { + "author": "cubiq", + "title": "Simple Math", + "id": "simplemath", + "reference": "https://github.com/cubiq/ComfyUI_SimpleMath", + "files": [ + "https://github.com/cubiq/ComfyUI_SimpleMath" + ], + "install_type": "git-clone", + "description": "custom node for ComfyUI to perform simple math operations" + }, + { + "author": "cubiq", + "title": "ComfyUI_IPAdapter_plus", + "id": "ipadapter", + "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus", + "files": [ + "https://github.com/cubiq/ComfyUI_IPAdapter_plus" + ], + "pip": ["insightface"], + "install_type": "git-clone", + "description": "ComfyUI reference implementation for IPAdapter models. The code is mostly taken from the original IPAdapter repository and laksjdjf's implementation, all credit goes to them. I just made the extension closer to ComfyUI philosophy." + }, + { + "author": "cubiq", + "title": "ComfyUI InstantID (Native Support)", + "id": "instantid", + "reference": "https://github.com/cubiq/ComfyUI_InstantID", + "files": [ + "https://github.com/cubiq/ComfyUI_InstantID" + ], + "install_type": "git-clone", + "description": "Native [a/InstantID](https://github.com/InstantID/InstantID) support for ComfyUI.\nThis extension differs from the many already available as it doesn't use diffusers but instead implements InstantID natively and it fully integrates with ComfyUI.\nPlease note this still could be considered beta stage, looking forward to your feedback." + }, + { + "author": "cubiq", + "title": "Face Analysis for ComfyUI", + "id": "faceanalysis", + "reference": "https://github.com/cubiq/ComfyUI_FaceAnalysis", + "files": [ + "https://github.com/cubiq/ComfyUI_FaceAnalysis" + ], + "install_type": "git-clone", + "description": "This extension uses [a/DLib](http://dlib.net/) to calculate the Euclidean and Cosine distance between two faces.\nNOTE: Install the Shape Predictor, Face Recognition model from the Install models menu." + }, + { + "author": "cubiq", + "title": "PuLID_ComfyUI", + "id": "pulid", + "reference": "https://github.com/cubiq/PuLID_ComfyUI", + "files": [ + "https://github.com/cubiq/PuLID_ComfyUI" + ], + "install_type": "git-clone", + "description": "[a/PuLID](https://github.com/ToTheBeginning/PuLID) ComfyUI native implementation." + }, + { + "author": "shockz0rz", + "title": "InterpolateEverything", + "id": "interpolate-everything", + "reference": "https://github.com/shockz0rz/ComfyUI_InterpolateEverything", + "files": [ + "https://github.com/shockz0rz/ComfyUI_InterpolateEverything" + ], + "install_type": "git-clone", + "description": "Nodes: Interpolate Poses, Interpolate Lineart, ... Custom nodes for interpolating between, well, everything in the Stable Diffusion ComfyUI." + }, + { + "author": "shockz0rz", + "title": "comfy-easy-grids", + "id": "easy-grids", + "reference": "https://github.com/shockz0rz/comfy-easy-grids", + "files": [ + "https://github.com/shockz0rz/comfy-easy-grids" + ], + "install_type": "git-clone", + "description": "A set of custom nodes for creating image grids, sequences, and batches in ComfyUI." + }, + { + "author": "yolanother", + "title": "Comfy UI Prompt Agent", + "id": "prompt-agent", + "reference": "https://github.com/yolanother/DTAIComfyPromptAgent", + "files": [ + "https://github.com/yolanother/DTAIComfyPromptAgent" + ], + "install_type": "git-clone", + "description": "Nodes: Prompt Agent, Prompt Agent (String). This script provides a prompt agent node for the Comfy UI stable diffusion client." + }, + { + "author": "yolanother", + "title": "Image to Text Node", + "id": "dta-img2txt", + "reference": "https://github.com/yolanother/DTAIImageToTextNode", + "files": [ + "https://github.com/yolanother/DTAIImageToTextNode" + ], + "install_type": "git-clone", + "description": "Nodes: Image URL to Text, Image to Text." + }, + { + "author": "yolanother", + "title": "Comfy UI Online Loaders", + "id": "dta-loader", + "reference": "https://github.com/yolanother/DTAIComfyLoaders", + "files": [ + "https://github.com/yolanother/DTAIComfyLoaders" + ], + "install_type": "git-clone", + "description": "Nodes: Submit Image (Parameters), Submit Image. A collection of loaders that use a shared common online data source rather than relying on the files to be present locally." + }, + { + "author": "yolanother", + "title": "Comfy AI DoubTech.ai Image Sumission Node", + "id": "dta-submit", + "reference": "https://github.com/yolanother/DTAIComfyImageSubmit", + "files": [ + "https://github.com/yolanother/DTAIComfyImageSubmit" + ], + "install_type": "git-clone", + "description": "A ComfyAI submit node to upload images to DoubTech.ai" + }, + { + "author": "yolanother", + "title": "Comfy UI QR Codes", + "id": "dta-qr", + "reference": "https://github.com/yolanother/DTAIComfyQRCodes", + "files": [ + "https://github.com/yolanother/DTAIComfyQRCodes" + ], + "install_type": "git-clone", + "description": "This extension introduces QR code nodes for the Comfy UI stable diffusion client. NOTE: ComfyUI qrcode extension required." + }, + { + "author": "yolanother", + "title": "Variables for Comfy UI", + "id": "dta-var", + "reference": "https://github.com/yolanother/DTAIComfyVariables", + "files": [ + "https://github.com/yolanother/DTAIComfyVariables" + ], + "install_type": "git-clone", + "description": "Nodes: String, Int, Float, Short String, CLIP Text Encode (With Variables), String Format, Short String Format. This extension introduces quality of life improvements by providing variable nodes and shared global variables." + }, + { + "author": "sipherxyz", + "title": "comfyui-art-venture", + "id": "artventure", + "reference": "https://github.com/sipherxyz/comfyui-art-venture", + "files": [ + "https://github.com/sipherxyz/comfyui-art-venture" + ], + "install_type": "git-clone", + "description": "Nodes: ImagesConcat, LoadImageFromUrl, AV_UploadImage" + }, + { + "author": "SOELexicon", + "title": "LexMSDBNodes", + "id": "lexmsdb", + "reference": "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes", + "files": [ + "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes" + ], + "install_type": "git-clone", + "description": "Nodes: MSSqlTableNode, MSSqlSelectNode. This extension provides custom nodes to interact with MSSQL." + }, + { + "author": "pants007", + "title": "pants", + "reference": "https://github.com/pants007/comfy-pants", + "files": [ + "https://github.com/pants007/comfy-pants" + ], + "install_type": "git-clone", + "description": "Nodes: Make Square Node, Interrogate Node, TextEncodeAIO" + }, + { + "author": "evanspearman", + "title": "ComfyMath", + "id": "comfymath", + "reference": "https://github.com/evanspearman/ComfyMath", + "files": [ + "https://github.com/evanspearman/ComfyMath" + ], + "install_type": "git-clone", + "description": "Provides Math Nodes for ComfyUI. Boolean Logic, Integer Arithmetic, Floating Point Arithmetic and Functions, Vec2, Vec3, and Vec4 Arithmetic and Functions" + }, + { + "author": "civitai", + "title": "comfy-nodes", + "id": "civitai", + "reference": "https://github.com/civitai/comfy-nodes", + "files": [ + "https://github.com/civitai/comfy-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: CivitAI_Loaders. Load Checkpoints, and LORA models directly from CivitAI API." + }, + { + "author": "andersxa", + "title": "CLIP Directional Prompt Attention", + "id": "prompt-attention", + "reference": "https://github.com/andersxa/comfyui-PromptAttention", + "files": [ + "https://github.com/andersxa/comfyui-PromptAttention" + ], + "pip": ["scikit-learn", "matplotlib"], + "install_type": "git-clone", + "description": "Nodes: CLIP Directional Prompt Attention Encode. Direction prompt attention tries to solve the problem of contextual words (or parts of the prompt) having an effect on much later or irrelevant parts of the prompt." + }, + { + "author": "ArtVentureX", + "title": "AnimateDiff", + "reference": "https://github.com/ArtVentureX/comfyui-animatediff", + "pip": ["flash_attn"], + "files": [ + "https://github.com/ArtVentureX/comfyui-animatediff" + ], + "install_type": "git-clone", + "description": "AnimateDiff integration for ComfyUI, adapts from sd-webui-animatediff.\n[w/You only need to download one of [a/mm_sd_v14.ckpt](https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt) | [a/mm_sd_v15.ckpt](https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt). Put the model weights under %%ComfyUI/custom_nodes/comfyui-animatediff/models%%. DO NOT change model filename.]" + }, + { + "author": "twri", + "title": "SDXL Prompt Styler", + "id": "twri-styler", + "reference": "https://github.com/twri/sdxl_prompt_styler", + "files": [ + "https://github.com/twri/sdxl_prompt_styler" + ], + "install_type": "git-clone", + "description": "SDXL Prompt Styler is a node that enables you to style prompts based on predefined templates stored in a JSON file." + }, + { + "author": "wolfden", + "title": "SDXL Prompt Styler (customized version by wolfden)", + "id": "wolfden-styler", + "reference": "https://github.com/wolfden/ComfyUi_PromptStylers", + "files": [ + "https://github.com/wolfden/ComfyUi_PromptStylers" + ], + "install_type": "git-clone", + "description": "These custom nodes provide a variety of customized prompt stylers based on [a/twri/SDXL Prompt Styler](https://github.com/twri/sdxl_prompt_styler)." + }, + { + "author": "wolfden", + "title": "ComfyUi_String_Function_Tree", + "id": "str-func-tree", + "reference": "https://github.com/wolfden/ComfyUi_String_Function_Tree", + "files": [ + "https://github.com/wolfden/ComfyUi_String_Function_Tree" + ], + "install_type": "git-clone", + "description": "This custom node provides the capability to manipulate multiple string inputs." + }, + { + "author": "daxthin", + "title": "DZ-FaceDetailer", + "id": "dz-facedetailer", + "reference": "https://github.com/daxthin/DZ-FaceDetailer", + "files": [ + "https://github.com/daxthin/DZ-FaceDetailer" + ], + "install_type": "git-clone", + "description": "Face Detailer is a custom node for the 'ComfyUI' framework inspired by !After Detailer extension from auto1111, it allows you to detect faces using Mediapipe and YOLOv8n to create masks for the detected faces." + }, + { + "author": "asagi4", + "title": "ComfyUI prompt control", + "id": "prompt-control", + "reference": "https://github.com/asagi4/comfyui-prompt-control", + "files": [ + "https://github.com/asagi4/comfyui-prompt-control" + ], + "install_type": "git-clone", + "description": "Nodes for convenient prompt editing. The aim is to make basic generations in ComfyUI completely prompt-controllable." + }, + { + "author": "asagi4", + "title": "ComfyUI-CADS", + "id": "cads", + "reference": "https://github.com/asagi4/ComfyUI-CADS", + "files": [ + "https://github.com/asagi4/ComfyUI-CADS" + ], + "install_type": "git-clone", + "description": "Attempts to implement [a/CADS](https://arxiv.org/abs/2310.17347) for ComfyUI. Credit also to the [a/A1111 implementation](https://github.com/v0xie/sd-webui-cads/tree/main) that I used as a reference." + }, + { + "author": "asagi4", + "title": "asagi4/comfyui-utility-nodes", + "id": "asagi-nodes", + "reference": "https://github.com/asagi4/comfyui-utility-nodes", + "files": [ + "https://github.com/asagi4/comfyui-utility-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:MUJinjaRender, MUSimpleWildcard" + }, + { + "author": "asagi4", + "title": "Adaptive Guidance for ComfyUI", + "id": "asagi-nodes", + "reference": "https://github.com/asagi4/ComfyUI-Adaptive-Guidance", + "files": [ + "https://github.com/asagi4/ComfyUI-Adaptive-Guidance" + ], + "install_type": "git-clone", + "description": "An implementation of adaptive guidance for ComfyUI\nSee [a/https://bcv-uniandes.github.io/adaptiveguidance-wp](https://bcv-uniandes.github.io/adaptiveguidance-wp)" + }, + { + "author": "jamesWalker55", + "title": "ComfyUI - P2LDGAN Node", + "id": "p2ldgan", + "reference": "https://github.com/jamesWalker55/comfyui-p2ldgan", + "files": [ + "https://github.com/jamesWalker55/comfyui-p2ldgan" + ], + "install_type": "git-clone", + "description": "Nodes: P2LDGAN. This integrates P2LDGAN into ComfyUI. P2LDGAN extracts lineart from input images.\n[w/To use this extension, you need to download the [a/p2ldgan model](https://drive.google.com/file/d/1To4V_Btc3QhCLBWZ0PdSNgC1cbm3isHP) and save it in the %%ComfyUI/custom_nodes/comfyui-p2ldgan/checkpoints%% directory.]" + }, + { + "author": "jamesWalker55", + "title": "Various ComfyUI Nodes by Type", + "id": "jameswalker-nodes", + "reference": "https://github.com/jamesWalker55/comfyui-various", + "files": [ + "https://github.com/jamesWalker55/comfyui-various" + ], + "nodename_pattern": "^JW", + "install_type": "git-clone", + "description": "Nodes: JWInteger, JWFloat, JWString, JWImageLoadRGB, JWImageResize, ..." + }, + { + "author": "adieyal", + "title": "DynamicPrompts Custom Nodes", + "id": "dynamicprompt", + "reference": "https://github.com/adieyal/comfyui-dynamicprompts", + "files": [ + "https://github.com/adieyal/comfyui-dynamicprompts" + ], + "install_type": "git-clone", + "description": "Nodes: Random Prompts, Combinatorial Prompts, I'm Feeling Lucky, Magic Prompt, Jinja2 Templates. ComfyUI-DynamicPrompts is a custom nodes library that integrates into your existing ComfyUI Library. It provides nodes that enable the use of Dynamic Prompts in your ComfyUI." + }, + { + "author": "mihaiiancu", + "title": "mihaiiancu/Inpaint", + "id": "inpaint", + "reference": "https://github.com/mihaiiancu/ComfyUI_Inpaint", + "files": [ + "https://github.com/mihaiiancu/ComfyUI_Inpaint" + ], + "install_type": "git-clone", + "description": "Nodes: InpaintMediapipe. This node provides a simple interface to inpaint." + }, + { + "author": "kwaroran", + "title": "abg-comfyui", + "id": "abg", + "reference": "https://github.com/kwaroran/abg-comfyui", + "files": [ + "https://github.com/kwaroran/abg-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes: Remove Image Background (abg). A Anime Background Remover node for comfyui, based on this hf space, works same as AGB extention in automatic1111." + }, + { + "author": "bash-j", + "title": "Mikey Nodes", + "id": "mikey", + "reference": "https://github.com/bash-j/mikey_nodes", + "files": [ + "https://github.com/bash-j/mikey_nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Prompt With Style, Prompt With SDXL, Resize Image for SDXL, Save Image With Prompt Data, HaldCLUT, Empty Latent Ratio Select/Custom SDXL" + }, + { + "author": "failfa.st", + "title": "failfast-comfyui-extensions", + "id": "failfast", + "reference": "https://github.com/failfa-st/failfast-comfyui-extensions", + "files": [ + "https://github.com/failfa-st/failfast-comfyui-extensions" + ], + "install_type": "git-clone", + "description": "node color customization, custom colors, dot reroutes, link rendering options, straight lines, group freezing, node pinning, automated arrangement of nodes, copy image\nNOTE: This repo is identical to 'blibla-comfyui-extensions'." + }, + { + "author": "Pfaeff", + "title": "pfaeff-comfyui", + "id": "pfaeff", + "reference": "https://github.com/Pfaeff/pfaeff-comfyui", + "files": [ + "https://github.com/Pfaeff/pfaeff-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes: AstropulsePixelDetector, BackgroundRemover, ImagePadForBetterOutpaint, InpaintingPipelineLoader, Inpainting, ..." + }, + { + "author": "wallish77", + "title": "wlsh_nodes", + "id": "wlsh", + "reference": "https://github.com/wallish77/wlsh_nodes", + "files": [ + "https://github.com/wallish77/wlsh_nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Checkpoint Loader with Name, Save Prompt Info, Outpaint to Image, CLIP Positive-Negative, SDXL Quick Empty Latent, Empty Latent by Ratio, Time String, SDXL Steps, SDXL Resolutions ..." + }, + { + "author": "Kosinkadink", + "title": "ComfyUI-Advanced-ControlNet", + "id": "adv-cnet", + "reference": "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet", + "files": [ + "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet" + ], + "install_type": "git-clone", + "description": "Nodes: ControlNetLoaderAdvanced, DiffControlNetLoaderAdvanced, ScaledSoftControlNetWeights, SoftControlNetWeights, CustomControlNetWeights, SoftT2IAdapterWeights, CustomT2IAdapterWeights" + }, + { + "author": "Kosinkadink", + "title": "AnimateDiff Evolved", + "id": "ad-evolved", + "reference": "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved", + "files": [ + "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved" + ], + "install_type": "git-clone", + "description": "A forked repository that actively maintains [a/AnimateDiff](https://github.com/ArtVentureX/comfyui-animatediff), created by ArtVentureX.\n\nImproved AnimateDiff integration for ComfyUI, adapts from sd-webui-animatediff.\n[w/Download one or more motion models from [a/Original Models](https://huggingface.co/guoyww/animatediff/tree/main) | [a/Finetuned Models](https://huggingface.co/manshoety/AD_Stabilized_Motion/tree/main). See README for additional model links and usage. Put the model weights under %%ComfyUI/custom_nodes/ComfyUI-AnimateDiff-Evolved/models%%. You are free to rename the models, but keeping original names will ease use when sharing your workflow.]" + }, + { + "author": "Kosinkadink", + "title": "ComfyUI-VideoHelperSuite", + "id": "vhs", + "reference": "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite", + "files": [ + "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite" + ], + "install_type": "git-clone", + "description": "Nodes: VHS_VideoCombine. Nodes related to video workflows" + }, + { + "author": "Gourieff", + "title": "ReActor Node for ComfyUI", + "id": "reactor", + "reference": "https://github.com/Gourieff/comfyui-reactor-node", + "files": [ + "https://github.com/Gourieff/comfyui-reactor-node" + ], + "install_type": "git-clone", + "description": "The Fast and Simple 'roop-like' Face Swap Extension Node for ComfyUI, based on ReActor (ex Roop-GE) SD-WebUI Face Swap Extension" + }, + { + "author": "Gourieff", + "title": "ComfyUI-FutureWarningIgnore", + "id": "futureignore", + "reference": "https://github.com/Gourieff/ComfyUI-FutureWarningIgnore", + "files": [ + "https://github.com/Gourieff/ComfyUI-FutureWarningIgnore/raw/main/0_FutureWarningIgnore.py" + ], + "install_type": "copy", + "description": "This extension collapses 'future warning' messages in your Console" + }, + { + "author": "imb101", + "title": "FaceSwap", + "id": "faceswap", + "reference": "https://github.com/imb101/ComfyUI-FaceSwap", + "files": [ + "https://github.com/imb101/ComfyUI-FaceSwap" + ], + "install_type": "git-clone", + "description": "Nodes:FaceSwapNode. Very basic custom node to enable face swapping in ComfyUI. (roop)" + }, + { + "author": "Chaoses-Ib", + "title": "ComfyUI_Ib_CustomNodes","id": "ib-nodes", + "reference": "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes", + "files": [ + "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes" + ], + "install_type": "git-clone", + "description": "Nodes: LoadImageFromPath. Load Image From Path loads the image from the source path and does not have such problems." + }, + { + "author": "AIrjen", + "title": "One Button Prompt", + "id": "1button", + "reference": "https://github.com/AIrjen/OneButtonPrompt", + "files": [ + "https://github.com/AIrjen/OneButtonPrompt" + ], + "install_type": "git-clone", + "description": "One Button Prompt has a prompt generation node for beginners who have problems writing a good prompt, or advanced users who want to get inspired. It generates an entire prompt from scratch. It is random, but controlled. You simply load up the script and press generate, and let it surprise you." + }, + { + "author": "coreyryanhanson", + "title": "ComfyQR", + "id": "comfyqr", + "reference": "https://github.com/coreyryanhanson/ComfyQR", + "files": [ + "https://github.com/coreyryanhanson/ComfyQR" + ], + "install_type": "git-clone", + "description": "QR generation within ComfyUI. Contains nodes suitable for workflows from generating basic QR images to techniques with advanced QR masking." + }, + { + "author": "coreyryanhanson", + "title": "ComfyQR-scanning-nodes", + "id": "comfyqr-scanning", + "reference": "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes", + "files": [ + "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes" + ], + "install_type": "git-clone", + "description": "A set of ComfyUI nodes to quickly test generated QR codes for scannability. A companion project to ComfyQR." + }, + { + "author": "dimtoneff", + "title": "ComfyUI PixelArt Detector", + "id": "pixelart-detector", + "reference": "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector", + "files": [ + "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector" + ], + "install_type": "git-clone", + "description": "This node manipulates the pixel art image in ways that it should look pixel perfect (downscales, changes palette, upscales etc.)." + }, + { + "author": "dimtoneff", + "title": "Eagle PNGInfo", + "id": "eaglepnginfo", + "reference": "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo", + "files": [ + "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo" + ], + "install_type": "git-clone", + "description": "Nodes: EagleImageNode" + }, + { + "author": "theUpsider", + "title": "Styles CSV Loader Extension for ComfyUI", + "id": "styles-csv-loader", + "reference": "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader", + "files": [ + "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader" + ], + "install_type": "git-clone", + "description": "This extension allows users to load styles from a CSV file, primarily for migration purposes from the automatic1111 Stable Diffusion web UI." + }, + { + "author": "theUpsider", + "title": "ComfyUI-Logic", + "id": "comfy-logic", + "reference": "https://github.com/theUpsider/ComfyUI-Logic", + "files": [ + "https://github.com/theUpsider/ComfyUI-Logic" + ], + "install_type": "git-clone", + "description": "An extension to ComfyUI that introduces logic nodes and conditional rendering capabilities." + }, + { + "author": "M1kep", + "title": "Comfy_KepListStuff", + "id": "keplist", + "reference": "https://github.com/M1kep/Comfy_KepListStuff", + "files": [ + "https://github.com/M1kep/Comfy_KepListStuff" + ], + "install_type": "git-clone", + "description": "Nodes: Range(Step), Range(Num Steps), List Length, Image Overlay, Stack Images, Empty Images, Join Image Lists, Join Float Lists. This extension provides various list manipulation nodes" + }, + { + "author": "M1kep", + "title": "ComfyLiterals", + "id": "comfyliterals", + "reference": "https://github.com/M1kep/ComfyLiterals", + "files": [ + "https://github.com/M1kep/ComfyLiterals" + ], + "install_type": "git-clone", + "description": "Nodes: Int, Float, String, Operation, Checkpoint" + }, + { + "author": "M1kep", + "title": "KepPromptLang", + "id": "kepprompt", + "reference": "https://github.com/M1kep/KepPromptLang", + "files": [ + "https://github.com/M1kep/KepPromptLang" + ], + "install_type": "git-clone", + "description": "Nodes: Build Gif, Special CLIP Loader. It offers various manipulation capabilities for the internal operations of the prompt." + }, + { + "author": "M1kep", + "title": "Comfy_KepMatteAnything", + "id": "kepmatte", + "reference": "https://github.com/M1kep/Comfy_KepMatteAnything", + "files": [ + "https://github.com/M1kep/Comfy_KepMatteAnything" + ], + "install_type": "git-clone", + "description": "This extension provides a custom node that allows the use of [a/Matte Anything](https://github.com/hustvl/Matte-Anything) in ComfyUI." + }, + { + "author": "M1kep", + "title": "Comfy_KepKitchenSink", + "id": "kepkitchen", + "reference": "https://github.com/M1kep/Comfy_KepKitchenSink", + "files": [ + "https://github.com/M1kep/Comfy_KepKitchenSink" + ], + "install_type": "git-clone", + "description": "Nodes: KepRotateImage" + }, + { + "author": "M1kep", + "title": "ComfyUI-OtherVAEs", + "id": "kep-othervae", + "reference": "https://github.com/M1kep/ComfyUI-OtherVAEs", + "files": [ + "https://github.com/M1kep/ComfyUI-OtherVAEs" + ], + "install_type": "git-clone", + "description": "Nodes: TAESD VAE Decode" + }, + { + "author": "M1kep", + "title": "ComfyUI-KepOpenAI", + "id": "kep-openai", + "reference": "https://github.com/M1kep/ComfyUI-KepOpenAI", + "files": [ + "https://github.com/M1kep/ComfyUI-KepOpenAI" + ], + "install_type": "git-clone", + "description": "ComfyUI-KepOpenAI is a user-friendly node that serves as an interface to the GPT-4 with Vision (GPT-4V) API. This integration facilitates the processing of images coupled with text prompts, leveraging the capabilities of the OpenAI API to generate text completions that are contextually relevant to the provided inputs." + }, + { + "author": "uarefans", + "title": "ComfyUI-Fans", + "id": "fans", + "reference": "https://github.com/uarefans/ComfyUI-Fans", + "files": [ + "https://github.com/uarefans/ComfyUI-Fans" + ], + "install_type": "git-clone", + "description": "Nodes: Fans Styler (Max 10 Style), Fans Text Concat (Until 10 text)." + }, + { + "author": "NicholasMcCarthy", + "title": "ComfyUI_TravelSuite", + "id": "travel", + "reference": "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite", + "files": [ + "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite" + ], + "install_type": "git-clone", + "description": "ComfyUI custom nodes to apply various latent travel techniques." + }, + { + "author": "ManglerFTW", + "title": "ComfyI2I", + "id": "comfyi2i", + "reference": "https://github.com/ManglerFTW/ComfyI2I", + "files": [ + "https://github.com/ManglerFTW/ComfyI2I" + ], + "install_type": "git-clone", + "description": "A set of custom nodes to perform image 2 image functions in ComfyUI." + }, + { + "author": "mpiquero7164", + "title": "SaveImgPrompt", + "id": "save-imgprompt", + "reference": "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt", + "files": [ + "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt" + ], + "install_type": "git-clone", + "description": "Save a png or jpeg and option to save prompt/workflow in a text or json file for each image in Comfy + Workflow loading." + }, + { + "author": "m-sokes", + "title": "ComfyUI Sokes Nodes", + "id": "sokes", + "reference": "https://github.com/m-sokes/ComfyUI-Sokes-Nodes", + "files": [ + "https://github.com/m-sokes/ComfyUI-Sokes-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Empty Latent Randomizer (9 Inputs)" + }, + { + "author": "Extraltodeus", + "title": "noise latent perlinpinpin", + "id": "perlipinpin", + "reference": "https://github.com/Extraltodeus/noise_latent_perlinpinpin", + "files": [ + "https://github.com/Extraltodeus/noise_latent_perlinpinpin" + ], + "install_type": "git-clone", + "description": "Nodes: NoisyLatentPerlin. This allows to create latent spaces filled with perlin-based noise that can actually be used by the samplers." + }, + { + "author": "Extraltodeus", + "title": "LoadLoraWithTags", + "reference": "https://github.com/Extraltodeus/LoadLoraWithTags", + "files": [ + "https://github.com/Extraltodeus/LoadLoraWithTags" + ], + "install_type": "git-clone", + "description": "Nodes:LoadLoraWithTags. Save/Load trigger words for loras from a json and auto fetch them on civitai if they are missing." + }, + { + "author": "Extraltodeus", + "title": "sigmas_tools_and_the_golden_scheduler", + "id": "sigmas-tools", + "reference": "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler", + "files": [ + "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler" + ], + "install_type": "git-clone", + "description": "A few nodes to mix sigmas and a custom scheduler that uses phi, then one using eval() to be able to schedule with custom formulas." + }, + { + "author": "Extraltodeus", + "title": "ComfyUI-AutomaticCFG", + "id": "autocfg", + "reference": "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG", + "files": [ + "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG" + ], + "install_type": "git-clone", + "description": "My own version 'from scratch' of a self-rescaling CFG. It isn't much but it's honest work.\nTLDR: set your CFG at 8 to try it. No burned images and artifacts anymore. CFG is also a bit more sensitive because it's a proportion around 8. Low scale like 4 also gives really nice results since your CFG is not the CFG anymore. Also in general even with relatively low settings it seems to improve the quality." + }, + { + "author": "Extraltodeus", + "title": "Vector_Sculptor_ComfyUI", + "id": "vector-sculptor", + "reference": "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI", + "files": [ + "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI" + ], + "install_type": "git-clone", + "description": "The main node makes your conditioning go towards similar concepts so to enrich your composition or further away so to make it more precise. It gathers similar pre-cond vectors for as long as the cosine similarity score diminishes. If it climbs back it stops. This allows to set a relative direction to similar concepts.\nThere are examples at the end but [a/you can also check this imgur album](https://imgur.com/a/WvPd81Y) which demonstrates the capability of improving variety." + }, + { + "author": "Extraltodeus", + "title": "Stable-Diffusion-temperature-settings", + "id": "sd-temperature", + "reference": "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings", + "files": [ + "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings" + ], + "install_type": "git-clone", + "description": "Provides the ability to set the temperature for both UNET and CLIP. For ComfyUI." + }, + { + "author": "Extraltodeus", + "title": "Uncond-Zero-for-ComfyUI", + "id": "uncond-zero", + "reference": "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI", + "files": [ + "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI" + ], + "install_type": "git-clone", + "description": "Allows to sample without generating any uncond with Stable Diffusion!" + }, + { + "author": "Extraltodeus", + "title": "pre_cfg_comfy_nodes_for_ComfyUI", + "id": "precfg", + "reference": "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI", + "files": [ + "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI" + ], + "install_type": "git-clone", + "description": "A set of nodes to prepare the noise predictions before the CFG function" + }, + { + "author": "JPS", + "title": "JPS Custom Nodes for ComfyUI", + "id": "jps-nodes", + "reference": "https://github.com/JPS-GER/ComfyUI_JPS-Nodes", + "files": [ + "https://github.com/JPS-GER/ComfyUI_JPS-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Various nodes to handle SDXL Resolutions, SDXL Basic Settings, IP Adapter Settings, Revision Settings, SDXL Prompt Styler, Crop Image to Square, Crop Image to Target Size, Get Date-Time String, Resolution Multiply, Largest Integer, 5-to-1 Switches for Integer, Images, Latents, Conditioning, Model, VAE, ControlNet" + }, + { + "author": "hustille", + "title": "hus' utils for ComfyUI", + "id": "husutil", + "reference": "https://github.com/hustille/ComfyUI_hus_utils", + "files": [ + "https://github.com/hustille/ComfyUI_hus_utils" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes primarily for seed and filename generation" + }, + { + "author": "hustille", + "title": "ComfyUI_Fooocus_KSampler", + "id": "fooocus-ksampler", + "reference": "https://github.com/hustille/ComfyUI_Fooocus_KSampler", + "files": [ + "https://github.com/hustille/ComfyUI_Fooocus_KSampler" + ], + "install_type": "git-clone", + "description": "Nodes: KSampler With Refiner (Fooocus). The KSampler from [a/Fooocus](https://github.com/lllyasviel/Fooocus) as a ComfyUI node [w/NOTE: This patches basic ComfyUI behaviour - don't use together with other samplers. Or perhaps do? Other samplers might profit from those changes ... ymmv.]" + }, + { + "author": "badjeff", + "title": "LoRA Tag Loader for ComfyUI", + "id": "lora-tag-loader", + "reference": "https://github.com/badjeff/comfyui_lora_tag_loader", + "files": [ + "https://github.com/badjeff/comfyui_lora_tag_loader" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node to read LoRA tag(s) from text and load it into checkpoint model." + }, + { + "author": "rgthree", + "title": "rgthree's ComfyUI Nodes", + "id": "rgthree", + "reference": "https://github.com/rgthree/rgthree-comfy", + "files": [ + "https://github.com/rgthree/rgthree-comfy" + ], + "nodename_pattern": " \\(rgthree\\)$", + "install_type": "git-clone", + "description": "Nodes: Seed, Reroute, Context, Lora Loader Stack, Context Switch, Fast Muter. These custom nodes helps organize the building of complex workflows." + }, + { + "author": "AIGODLIKE", + "title": "AIGODLIKE-COMFYUI-TRANSLATION", + "id": "translation", + "reference": "https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION", + "files": [ + "https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION" + ], + "install_type": "git-clone", + "description": "It provides language settings. (Contribution from users of various languages is needed due to the support for each language.)" + }, + { + "author": "AIGODLIKE", + "title": "AIGODLIKE-ComfyUI-Studio", + "id": "comfy-studio", + "reference": "https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Studio", + "files": [ + "https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Studio" + ], + "install_type": "git-clone", + "description": "Improve the interactive experience of using ComfyUI, such as making the loading of ComfyUI models more intuitive and making it easier to create model thumbnails" + }, + { + "author": "AIGODLIKE", + "title": "ComfyUI-CUP", + "id": "comfycup", + "reference": "https://github.com/AIGODLIKE/ComfyUI-CUP", + "files": [ + "https://github.com/AIGODLIKE/ComfyUI-CUP" + ], + "install_type": "git-clone", + "description": "Bridge between ComfyUI and blender's ComfyUI-BlenderAI-node addon." + }, + { + "author": "AIGODLIKE", + "title": "ComfyUI-ToonCrafter", + "id": "tooncrafter", + "reference": "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter", + "files": [ + "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter" + ], + "install_type": "git-clone", + "description": "This project is used to enable [a/ToonCrafter](https://github.com/ToonCrafter/ToonCrafter) to be used in ComfyUI.\nYou can use it to achieve generative keyframe animation\nAnd use it in Blender for animation rendering and prediction" + }, + { + "author": "syllebra", + "title": "BilboX's ComfyUI Custom Nodes", + "id": "bilbox", + "reference": "https://github.com/syllebra/bilbox-comfyui", + "files": [ + "https://github.com/syllebra/bilbox-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes: BilboX's PromptGeek Photo Prompt. This provides a convenient way to compose photorealistic prompts into ComfyUI." + }, + { + "author": "Girish Gopaul", + "title": "Save Image with Generation Metadata", + "id": "image-saver", + "reference": "https://github.com/giriss/comfy-image-saver", + "files": [ + "https://github.com/giriss/comfy-image-saver" + ], + "install_type": "git-clone", + "description": "All the tools you need to save images with their generation metadata on ComfyUI. Compatible with Civitai & Prompthero geninfo auto-detection. Works with png, jpeg and webp." + }, + { + "author": "shingo1228", + "title": "ComfyUI-send-Eagle(slim)", + "id": "send-eagle", + "reference": "https://github.com/shingo1228/ComfyUI-send-eagle-slim", + "files": [ + "https://github.com/shingo1228/ComfyUI-send-eagle-slim" + ], + "install_type": "git-clone", + "description": "Nodes:Send Webp Image to Eagle. This is an extension node for ComfyUI that allows you to send generated images in webp format to Eagle. This extension node is a re-implementation of the Eagle linkage functions of the previous ComfyUI-send-Eagle node, focusing on the functions required for this node." + }, + { + "author": "shingo1228", + "title": "ComfyUI-SDXL-EmptyLatentImage", + "id": "sdxl-emptylatent", + "reference": "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage", + "files": [ + "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage" + ], + "install_type": "git-clone", + "description": "Nodes:SDXL Empty Latent Image. An extension node for ComfyUI that allows you to select a resolution from the pre-defined json files and output a Latent Image." + }, + { + "author": "laksjdjf", + "title": "pfg-ComfyUI", + "id": "pfg", + "reference": "https://github.com/laksjdjf/pfg-ComfyUI", + "files": [ + "https://github.com/laksjdjf/pfg-ComfyUI" + ], + "install_type": "git-clone", + "description": "ComfyUI version of https://github.com/laksjdjf/pfg-webui. (To use this extension, you need to download the required model file from **Install Models**)" + }, + { + "author": "laksjdjf", + "title": "cgem156-ComfyUI🍌", + "id": "cgem156", + "reference": "https://github.com/laksjdjf/cgem156-ComfyUI", + "files": [ + "https://github.com/laksjdjf/cgem156-ComfyUI" + ], + "install_type": "git-clone", + "description": "The custom nodes of laksjdjf have been integrated into the node pack of cgem156🍌.\nNOTE:This includes the attention couple feature." + }, + { + "author": "laksjdjf", + "title": "cd-tuner_negpip-ComfyUI", + "id": "cdtuner", + "reference": "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI", + "files": [ + "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes:Apply CDTuner, Apply Negapip. This extension provides the [a/CD(Color/Detail) Tuner](https://github.com/hako-mikan/sd-webui-cd-tuner) and the [a/Negative Prompt in the Prompt](https://github.com/hako-mikan/sd-webui-negpip) features." + }, + { + "author": "laksjdjf", + "title": "LCMSampler-ComfyUI", + "id": "lcm-sampler", + "reference": "https://github.com/laksjdjf/LCMSampler-ComfyUI", + "files": [ + "https://github.com/laksjdjf/LCMSampler-ComfyUI" + ], + "install_type": "git-clone", + "description": "This extension node is intended for the use of LCM conversion for SSD-1B-anime. It does not guarantee operation with the original LCM (as it cannot load weights in the current version). To take advantage of fast generation with LCM, a node for using TAESD as a decoder is also provided. This is inspired by ComfyUI-OtherVAEs." + }, + { + "author": "laksjdjf", + "title": "LoRTnoC-ComfyUI", + "id": "lortnoc", + "reference": "https://github.com/laksjdjf/LoRTnoC-ComfyUI", + "files": [ + "https://github.com/laksjdjf/LoRTnoC-ComfyUI" + ], + "install_type": "git-clone", + "description": "This is a repository for using LoRTnoC (LoRA with hint block of ControlNet) on ComfyUI.\nNOTE:Please place the model file in the same location as controlnet. (Is this too arbitrary?)" + }, + { + "author": "laksjdjf", + "title": "Batch-Condition-ComfyUI", + "id": "batch-condition", + "reference": "https://github.com/laksjdjf/Batch-Condition-ComfyUI", + "files": [ + "https://github.com/laksjdjf/Batch-Condition-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes:CLIP Text Encode (Batch), String Input, Batch String" + }, + { + "author": "alsritter", + "title": "asymmetric-tiling-comfyui", + "id": "asymmetric", + "reference": "https://github.com/alsritter/asymmetric-tiling-comfyui", + "files": [ + "https://github.com/alsritter/asymmetric-tiling-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:Asymmetric_Tiling_KSampler. " + }, + { + "author": "meap158", + "title": "GPU temperature protection", + "id": "gputemp", + "reference": "https://github.com/meap158/ComfyUI-GPU-temperature-protection", + "files": [ + "https://github.com/meap158/ComfyUI-GPU-temperature-protection" + ], + "install_type": "git-clone", + "description": "Pause image generation when GPU temperature exceeds threshold." + }, + { + "author": "meap158", + "title": "ComfyUI-Prompt-Expansion", + "id": "promtp-expansion", + "reference": "https://github.com/meap158/ComfyUI-Prompt-Expansion", + "files": [ + "https://github.com/meap158/ComfyUI-Prompt-Expansion" + ], + "install_type": "git-clone", + "description": "Dynamic prompt expansion, powered by GPT-2 locally on your device." + }, + { + "author": "meap158", + "title": "ComfyUI-Background-Replacement", + "id": "bg-replacement", + "reference": "https://github.com/meap158/ComfyUI-Background-Replacement", + "files": [ + "https://github.com/meap158/ComfyUI-Background-Replacement" + ], + "install_type": "git-clone", + "description": "Instantly replace your image's background." + }, + { + "author": "TeaCrab", + "title": "ComfyUI-TeaNodes", + "id": "teanodes", + "reference": "https://github.com/TeaCrab/ComfyUI-TeaNodes", + "files": [ + "https://github.com/TeaCrab/ComfyUI-TeaNodes" + ], + "install_type": "git-clone", + "description": "Nodes:TC_EqualizeCLAHE, TC_SizeApproximation, TC_ImageResize, TC_ImageScale, TC_ColorFill." + }, + { + "author": "nagolinc", + "title": "ComfyUI_FastVAEDecorder_SDXL", + "reference": "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL", + "files": [ + "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL" + ], + "install_type": "git-clone", + "description": "Based off of: [a/Birch-san/diffusers-play/approx_vae](https://github.com/Birch-san/diffusers-play/tree/main/approx_vae). This ComfyUI node allows you to quickly preview SDXL 1.0 latents." + }, + { + "author": "nagolinc", + "title": "comfyui_openai_node", + "reference": "https://github.com/nagolinc/comfyui_openai_node", + "files": [ + "https://github.com/nagolinc/comfyui_openai_node" + ], + "install_type": "git-clone", + "description": "This provides a single node openai > Open AI query node\nthat takes a system prompt and user message and sends them to chatGPT 3.5\nNote, you MUST have an OPEN AI API key stored in the environment variable OPENAI_API_KEY in order for this to work." + }, + { + "author": "bradsec", + "title": "ResolutionSelector for ComfyUI", + "id": "resolution-selector", + "reference": "https://github.com/bradsec/ComfyUI_ResolutionSelector", + "files": [ + "https://github.com/bradsec/ComfyUI_ResolutionSelector" + ], + "install_type": "git-clone", + "description": "A custom node for Stable Diffusion ComfyUI to enable easy selection of image resolutions for SDXL SD15 SD21" + }, + { + "author": "bradsec", + "title": "ComfyUI_StringTools", + "id": "stringtools", + "reference": "https://github.com/bradsec/ComfyUI_StringTools", + "files": [ + "https://github.com/bradsec/ComfyUI_StringTools" + ], + "install_type": "git-clone", + "description": "Some simple string tools to modify text and strings in ComfyUI." + }, + { + "author": "kohya-ss", + "title": "ControlNet-LLLite-ComfyUI", + "id": "lllite", + "reference": "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI", + "files": [ + "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes: LLLiteLoader" + }, + { + "author": "jjkramhoeft", + "title": "ComfyUI-Jjk-Nodes", + "id": "jjk", + "reference": "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes", + "files": [ + "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: SDXLRecommendedImageSize, JjkText, JjkShowText, JjkConcat. A set of custom nodes for ComfyUI - focused on text and parameter utility" + }, + { + "author": "dagthomas", + "title": "SDXL Auto Prompter", + "id": "autoprompt", + "reference": "https://github.com/dagthomas/comfyui_dagthomas", + "files": [ + "https://github.com/dagthomas/comfyui_dagthomas" + ], + "install_type": "git-clone", + "description": "Easy prompting for generation of endless random art pieces and photographs!" + }, + { + "author": "marhensa", + "title": "Recommended Resolution Calculator", + "id": "resoultion-calc", + "reference": "https://github.com/marhensa/sdxl-recommended-res-calc", + "files": [ + "https://github.com/marhensa/sdxl-recommended-res-calc" + ], + "install_type": "git-clone", + "description": "Input your desired output final resolution, it will automaticaly set the initial recommended SDXL ratio/size and its Upscale Factor to reach that output final resolution, also there's an option for 2x/4x reverse Upscale Factor. These all to avoid using bad/arbitary initial ratio/resolution." + }, + { + "author": "Nuked", + "title": "ComfyUI-N-Nodes", + "id": "nnodes", + "reference": "https://github.com/Nuked88/ComfyUI-N-Nodes", + "files": [ + "https://github.com/Nuked88/ComfyUI-N-Nodes" + ], + "install_type": "git-clone", + "description": "A suite of custom nodes for ConfyUI that includes GPT text-prompt generation, LoadVideo,SaveVideo,LoadFramesFromFolder and FrameInterpolator" + }, + { + "author": "Nuked", + "title": "ComfyUI-N-Sidebar", + "id": "nsidebar", + "reference": "https://github.com/Nuked88/ComfyUI-N-Sidebar", + "files": [ + "https://github.com/Nuked88/ComfyUI-N-Sidebar" + ], + "install_type": "git-clone", + "description": "A simple sidebar for ComfyUI." + }, + { + "author": "richinsley", + "title": "Comfy-LFO", + "id": "lfo", + "reference": "https://github.com/richinsley/Comfy-LFO", + "files": [ + "https://github.com/richinsley/Comfy-LFO" + ], + "install_type": "git-clone", + "description": "Nodes:LFO_Triangle, LFO_Sine, SawtoothNode, SquareNode, PulseNode. ComfyUI custom nodes to create Low Frequency Oscillators." + }, + { + "author": "Beinsezii", + "title": "bsz-cui-extras", + "id": "bsz", + "reference": "https://github.com/Beinsezii/bsz-cui-extras", + "files": [ + "https://github.com/Beinsezii/bsz-cui-extras" + ], + "install_type": "git-clone", + "description": "This contains all-in-one 'principled' nodes for T2I, I2I, refining, and scaling. Additionally it has many tools for directly manipulating the color of latents, high res fix math, and scripted image post-processing." + }, + { + "author": "youyegit", + "title": "tdxh_node_comfyui", + "id": "tdxh", + "reference": "https://github.com/youyegit/tdxh_node_comfyui", + "files": [ + "https://github.com/youyegit/tdxh_node_comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:TdxhImageToSize, TdxhImageToSizeAdvanced, TdxhLoraLoader, TdxhIntInput, TdxhFloatInput, TdxhStringInput. Some nodes for stable diffusion comfyui. Sometimes it helps conveniently to use less nodes for doing the same things." + }, + { + "author": "Sxela", + "title": "ComfyWarp", + "id": "warp", + "reference": "https://github.com/Sxela/ComfyWarp", + "files": [ + "https://github.com/Sxela/ComfyWarp" + ], + "install_type": "git-clone", + "description": "Nodes:LoadFrameSequence, LoadFrame" + }, + { + "author": "skfoo", + "title": "ComfyUI-Coziness", + "id": "coziness", + "reference": "https://github.com/skfoo/ComfyUI-Coziness", + "files": [ + "https://github.com/skfoo/ComfyUI-Coziness" + ], + "install_type": "git-clone", + "description": "Nodes:MultiLora Loader, Lora Text Extractor. Provides a node for assisting in loading loras through text." + }, + { + "author": "YOUR-WORST-TACO", + "title": "ComfyUI-TacoNodes", + "id": "taco", + "reference": "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes", + "files": [ + "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes" + ], + "install_type": "git-clone", + "description": "Nodes:TacoLatent, TacoAnimatedLoader, TacoImg2ImgAnimatedLoader, TacoGifMaker." + }, + { + "author": "Lerc", + "title": "Canvas Tab", + "id": "canvastab", + "reference": "https://github.com/Lerc/canvas_tab", + "files": [ + "https://github.com/Lerc/canvas_tab" + ], + "install_type": "git-clone", + "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor." + }, + { + "author": "Ttl", + "title": "ComfyUI Neural Network Latent Upscale", + "id": "nnlatent", + "reference": "https://github.com/Ttl/ComfyUi_NNLatentUpscale", + "files": [ + "https://github.com/Ttl/ComfyUi_NNLatentUpscale" + ], + "install_type": "git-clone", + "preemptions": ["NNLatentUpscale"], + "description": "Nodes:NNLatentUpscale, A custom ComfyUI node designed for rapid latent upscaling using a compact neural network, eliminating the need for VAE-based decoding and encoding." + }, + { + "author": "spro", + "title": "Latent Mirror node for ComfyUI", + "id": "latentmirror", + "reference": "https://github.com/spro/comfyui-mirror", + "files": [ + "https://github.com/spro/comfyui-mirror" + ], + "install_type": "git-clone", + "description": "Nodes: Latent Mirror. Node to mirror a latent along the Y (vertical / left to right) or X (horizontal / top to bottom) axis." + }, + { + "author": "Tropfchen", + "title": "Embedding Picker", + "id": "embedding-picker", + "reference": "https://github.com/Tropfchen/ComfyUI-Embedding_Picker", + "files": [ + "https://github.com/Tropfchen/ComfyUI-Embedding_Picker" + ], + "install_type": "git-clone", + "description": "Tired of forgetting and misspelling often weird names of embeddings you use? Or perhaps you use only one, cause you forgot you have tens of them installed?" + }, + { + "author": "Acly", + "title": "ComfyUI Nodes for External Tooling", + "id": "external-tooling", + "reference": "https://github.com/Acly/comfyui-tooling-nodes", + "files": [ + "https://github.com/Acly/comfyui-tooling-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Load Image (Base64), Load Mask (Base64), Send Image (WebSocket), Crop Image, Apply Mask to Image. Provides nodes geared towards using ComfyUI as a backend for external tools.\nNOTE: This extension is necessary when using an external tool like [comfyui-capture-inference](https://github.com/minux302/comfyui-capture-inference)." + }, + { + "author": "Acly", + "title": "ComfyUI Inpaint Nodes", + "id": "inpaint-nodes", + "reference": "https://github.com/Acly/comfyui-inpaint-nodes", + "files": [ + "https://github.com/Acly/comfyui-inpaint-nodes" + ], + "install_type": "git-clone", + "description": "Experimental nodes for better inpainting with ComfyUI. Adds two nodes which allow using [a/Fooocus](https://github.com/Acly/comfyui-inpaint-nodes) inpaint model. It's a small and flexible patch which can be applied to any SDXL checkpoint and will transform it into an inpaint model. This model can then be used like other inpaint models, and provides the same benefits. [a/Read more](https://github.com/lllyasviel/Fooocus/discussions/414)" + }, + { + "author": "picturesonpictures", + "title": "comfy_PoP", + "id": "pop", + "reference": "https://github.com/picturesonpictures/comfy_PoP", + "files": ["https://github.com/picturesonpictures/comfy_PoP"], + "install_type": "git-clone", + "description": "A collection of custom nodes for ComfyUI. Includes a quick canny edge detection node with unconventional settings, simple LoRA stack nodes for workflow efficiency, and a customizable aspect ratio node." + }, + { + "author": "Dream Project", + "title": "Dream Project Animation Nodes", + "id": "dream-anime", + "reference": "https://github.com/alt-key-project/comfyui-dream-project", + "files": [ + "https://github.com/alt-key-project/comfyui-dream-project" + ], + "install_type": "git-clone", + "description": "This extension offers various nodes that are useful for Deforum-like animations in ComfyUI." + }, + { + "author": "Dream Project", + "title": "Dream Video Batches", + "id": "dream-video", + "reference": "https://github.com/alt-key-project/comfyui-dream-video-batches", + "files": [ + "https://github.com/alt-key-project/comfyui-dream-video-batches" + ], + "install_type": "git-clone", + "description": "Provide utilities for batch based video generation workflows (s.a. AnimateDiff and Stable Video Diffusion)." + }, + { + "author": "seanlynch", + "title": "ComfyUI Optical Flow", + "id": "optical-flow", + "reference": "https://github.com/seanlynch/comfyui-optical-flow", + "files": [ + "https://github.com/seanlynch/comfyui-optical-flow" + ], + "install_type": "git-clone", + "description": "This package contains three nodes to help you compute optical flow between pairs of images, usually adjacent frames in a video, visualize the flow, and apply the flow to another image of the same dimensions. Most of the code is from Deforum, so this is released under the same license (MIT)." + }, + { + "author": "ealkanat", + "title": "ComfyUI Easy Padding", + "id": "easy-padding", + "reference": "https://github.com/ealkanat/comfyui_easy_padding", + "files": [ + "https://github.com/ealkanat/comfyui_easy_padding" + ], + "install_type": "git-clone", + "description": "ComfyUI Easy Padding is a simple custom ComfyUI node that helps you to add padding to images on ComfyUI." + }, + { + "author": "ArtBot2023", + "title": "Character Face Swap", + "id": "char-faceswap", + "reference": "https://github.com/ArtBot2023/CharacterFaceSwap", + "files": [ + "https://github.com/ArtBot2023/CharacterFaceSwap" + ], + "install_type": "git-clone", + "description": "Character face swap with LoRA and embeddings." + }, + { + "author": "mav-rik", + "title": "Facerestore CF (Code Former)", + "id": "face-cf", + "reference": "https://github.com/mav-rik/facerestore_cf", + "files": [ + "https://github.com/mav-rik/facerestore_cf" + ], + "install_type": "git-clone", + "description": "This is a copy of [a/facerestore custom node](https://civitai.com/models/24690/comfyui-facerestore-node) with a bit of a change to support CodeFormer Fidelity parameter. These ComfyUI nodes can be used to restore faces in images similar to the face restore option in AUTOMATIC1111 webui.\nNOTE: To use this node, you need to download the face restoration model and face detection model from the 'Install models' menu." + }, + { + "author": "braintacles", + "title": "braintacles-nodes", + "id": "braintacles", + "reference": "https://github.com/braintacles/braintacles-comfyui-nodes", + "files": [ + "https://github.com/braintacles/braintacles-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: CLIPTextEncodeSDXL-Multi-IO, CLIPTextEncodeSDXL-Pipe, Empty Latent Image from Aspect-Ratio, Random Find and Replace." + }, + { + "author": "hayden-fr", + "title": "ComfyUI-Model-Manager", + "id": "modelmanager", + "reference": "https://github.com/hayden-fr/ComfyUI-Model-Manager", + "files": [ + "https://github.com/hayden-fr/ComfyUI-Model-Manager" + ], + "install_type": "git-clone", + "description": "Manage models: browsing, download and delete." + }, + { + "author": "hayden-fr", + "title": "ComfyUI-Image-Browsing", + "id": "image-browsing", + "reference": "https://github.com/hayden-fr/ComfyUI-Image-Browsing", + "files": [ + "https://github.com/hayden-fr/ComfyUI-Image-Browsing" + ], + "install_type": "git-clone", + "description": "Image Browsing: browsing, download and delete." + }, + { + "author": "ali1234", + "title": "comfyui-job-iterator", + "id": "job-iterator", + "reference": "https://github.com/ali1234/comfyui-job-iterator", + "files": [ + "https://github.com/ali1234/comfyui-job-iterator" + ], + "install_type": "git-clone", + "description": "Implements iteration over sequences within a single workflow run. [w/NOTE: This node replaces the execution of ComfyUI for iterative processing functionality.]" + }, + { + "author": "jmkl", + "title": "ComfyUI Ricing", + "id": "ricing", + "reference": "https://github.com/jmkl/ComfyUI-ricing", + "files": [ + "https://github.com/jmkl/ComfyUI-ricing" + ], + "install_type": "git-clone", + "description": "ComfyUI custom user.css and some script stuff. mainly for web interface." + }, + { + "author": "budihartono", + "title": "Otonx's Custom Nodes", + "id": "otonx", + "reference": "https://github.com/budihartono/comfyui_otonx_nodes", + "files": [ + "https://github.com/budihartono/comfyui_otonx_nodes" + ], + "install_type": "git-clone", + "description": "Nodes: OTX Multiple Values, OTX KSampler Feeder. This extension provides custom nodes for ComfyUI created for personal projects. Made available for reference. Nodes may be updated or changed intermittently or not at all. Review & test before use." + }, + { + "author": "ramyma", + "title": "A8R8 ComfyUI Nodes", + "id": "a8r8", + "reference": "https://github.com/ramyma/A8R8_ComfyUI_nodes", + "files": [ + "https://github.com/ramyma/A8R8_ComfyUI_nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Base64Image Input Node, Base64Image Output Node. [a/A8R8](https://github.com/ramyma/a8r8) supporting nodes to integrate with ComfyUI" + }, + { + "author": "spinagon", + "title": "Seamless tiling Node for ComfyUI", + "id": "seamless", + "reference": "https://github.com/spinagon/ComfyUI-seamless-tiling", + "files": [ + "https://github.com/spinagon/ComfyUI-seamless-tiling" + ], + "install_type": "git-clone", + "description": "Node for generating almost seamless textures, based on similar setting from A1111." + }, + { + "author": "BiffMunky", + "title": "Endless ️🌊✨ Nodes", + "id": "endless", + "reference": "https://github.com/tusharbhutt/Endless-Nodes", + "files": [ + "https://github.com/tusharbhutt/Endless-Nodes" + ], + "install_type": "git-clone", + "description": "A small set of nodes I created for various numerical and text inputs. Features image saver with ability to have JSON saved to separate folder, parameter collection nodes, two aesthetic scoring models, switches for text and numbers, and conversion of string to numeric and vice versa." + }, + { + "author": "spacepxl", + "title": "ComfyUI-HQ-Image-Save", + "id": "hq-image-save", + "reference": "https://github.com/spacepxl/ComfyUI-HQ-Image-Save", + "files": [ + "https://github.com/spacepxl/ComfyUI-HQ-Image-Save" + ], + "install_type": "git-clone", + "description": "Add Image Save nodes for TIFF 16 bit and EXR 32 bit formats. Probably only useful if you're applying a LUT or other color corrections, and care about preserving as much color accuracy as possible." + }, + { + "author": "spacepxl", + "title": "ComfyUI-Image-Filters", + "id": "image-fitlers", + "reference": "https://github.com/spacepxl/ComfyUI-Image-Filters", + "files": [ + "https://github.com/spacepxl/ComfyUI-Image-Filters" + ], + "install_type": "git-clone", + "description": "Image and matte filtering nodes for ComfyUI `image/filters/*`" + }, + { + "author": "spacepxl", + "title": "ComfyUI-RAVE", + "id": "rave", + "reference": "https://github.com/spacepxl/ComfyUI-RAVE", + "files": [ + "https://github.com/spacepxl/ComfyUI-RAVE" + ], + "install_type": "git-clone", + "description": "Unofficial ComfyUI implementation of [a/RAVE](https://rave-video.github.io/)" + }, + { + "author": "spacepxl", + "title": "ComfyUI-StyleGan", + "id": "stylegan", + "reference": "https://github.com/spacepxl/ComfyUI-StyleGan", + "files": [ + "https://github.com/spacepxl/ComfyUI-StyleGan" + ], + "install_type": "git-clone", + "description": "Basic support for StyleGAN2 and StyleGAN3 models." + }, + { + "author": "spacepxl", + "title": "ComfyUI-Florence-2", + "id": "florence2-spacepxl", + "reference": "https://github.com/spacepxl/ComfyUI-Florence-2", + "files": [ + "https://github.com/spacepxl/ComfyUI-Florence-2" + ], + "install_type": "git-clone", + "description": "[a/https://huggingface.co/microsoft/Florence-2-large-ft](https://huggingface.co/microsoft/Florence-2-large-ft)\nLarge or base model, support for captioning and bbox task modes, more coming soon." + }, + { + "author": "PTA", + "title": "auto nodes layout", + "id": "autolayout", + "reference": "https://github.com/phineas-pta/comfyui-auto-nodes-layout", + "files": [ + "https://github.com/phineas-pta/comfyui-auto-nodes-layout" + ], + "install_type": "git-clone", + "description": "A ComfyUI extension to apply better nodes layout algorithm to ComfyUI workflow (mostly for visualization purpose)" + }, + { + "author": "receyuki", + "title": "SD Prompt Reader", + "id": "sdpromptreader", + "reference": "https://github.com/receyuki/comfyui-prompt-reader-node", + "files": [ + "https://github.com/receyuki/comfyui-prompt-reader-node" + ], + "install_type": "git-clone", + "description": "The ultimate solution for managing image metadata and multi-tool compatibility. ComfyUI node version of the SD Prompt Reader." + }, + { + "author": "rklaffehn", + "title": "rk-comfy-nodes", + "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": "cubiq", + "title": "ComfyUI Essentials", + "id": "essentials", + "reference": "https://github.com/cubiq/ComfyUI_essentials", + "files": [ + "https://github.com/cubiq/ComfyUI_essentials" + ], + "install_type": "git-clone", + "description": "Essential nodes that are weirdly missing from ComfyUI core. With few exceptions they are new features and not commodities. I hope this will be just a temporary repository until the nodes get included into ComfyUI." + }, + { + "author": "Clybius", + "title": "ComfyUI-Latent-Modifiers", + "id": "latent-modifier", + "reference": "https://github.com/Clybius/ComfyUI-Latent-Modifiers", + "files": [ + "https://github.com/Clybius/ComfyUI-Latent-Modifiers" + ], + "install_type": "git-clone", + "description": "Nodes: Latent Diffusion Mega Modifier. ComfyUI nodes which modify the latent during the diffusion process. (Sharpness, Tonemap, Rescale, Extra Noise)" + }, + { + "author": "Clybius", + "title": "ComfyUI Extra Samplers", + "id": "extra-samplers", + "reference": "https://github.com/Clybius/ComfyUI-Extra-Samplers", + "files": [ + "https://github.com/Clybius/ComfyUI-Extra-Samplers" + ], + "install_type": "git-clone", + "description": "Nodes: SamplerCustomNoise, SamplerCustomNoiseDuo, SamplerCustomModelMixtureDuo, SamplerRES_Momentumized, SamplerDPMPP_DualSDE_Momentumized, SamplerCLYB_4M_SDE_Momentumized, SamplerTTM, SamplerLCMCustom\nThis extension provides various custom samplers not offered by the default nodes in ComfyUI." + }, + { + "author": "mcmonkeyprojects", + "title": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)", + "id": "dynamic-thresholding", + "reference": "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding", + "files": [ + "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding" + ], + "install_type": "git-clone", + "description": "Extension for StableSwarmUI, ComfyUI, and AUTOMATIC1111 Stable Diffusion WebUI that enables a way to use higher CFG Scales without color issues. This works by clamping latents between steps." + }, + { + "author": "Tropfchen", + "title": "YARS: Yet Another Resolution Selector", + "id": "yars", + "reference": "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector", + "files": [ + "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector" + ], + "install_type": "git-clone", + "description": "A slightly different Resolution Selector node, allowing to freely change base resolution and aspect ratio, with options to maintain the pixel count or use the base resolution as the highest or lowest dimension." + }, + { + "author": "chrisgoringe", + "title": "Variation seeds", + "id": "variation-seed", + "reference": "https://github.com/chrisgoringe/cg-noise", + "files": [ + "https://github.com/chrisgoringe/cg-noise" + ], + "install_type": "git-clone", + "description": "Adds KSampler custom nodes with variation seed and variation strength." + }, + { + "author": "chrisgoringe", + "title": "Image chooser", + "id": "image-chooser", + "reference": "https://github.com/chrisgoringe/cg-image-picker", + "files": [ + "https://github.com/chrisgoringe/cg-image-picker" + ], + "install_type": "git-clone", + "description": "A custom node that pauses the flow while you choose which image (or latent) to pass on to the rest of the workflow." + }, + { + "author": "chrisgoringe", + "title": "Use Everywhere (UE Nodes)", + "id": "ue", + "reference": "https://github.com/chrisgoringe/cg-use-everywhere", + "files": [ + "https://github.com/chrisgoringe/cg-use-everywhere" + ], + "install_type": "git-clone", + "nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)", + "description": "A set of nodes that allow data to be 'broadcast' to some or all unconnected inputs. Greatly reduces link spaghetti." + }, + { + "author": "chrisgoringe", + "title": "Prompt Info", + "id": "promptinfo", + "reference": "https://github.com/chrisgoringe/cg-prompt-info", + "files": [ + "https://github.com/chrisgoringe/cg-prompt-info" + ], + "install_type": "git-clone", + "description": "Prompt Info" + }, + { + "author": "TGu-97", + "title": "TGu Utilities", + "id": "tgu", + "reference": "https://github.com/TGu-97/ComfyUI-TGu-utils", + "files": [ + "https://github.com/TGu-97/ComfyUI-TGu-utils" + ], + "install_type": "git-clone", + "description": "Nodes: MPN Switch, MPN Reroute, PN Switch. This is a set of custom nodes for ComfyUI. Mainly focus on control switches." + }, + { + "author": "seanlynch", + "title": "SRL's nodes", + "id": "srl", + "reference": "https://github.com/seanlynch/srl-nodes", + "files": [ + "https://github.com/seanlynch/srl-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: SRL Conditional Interrupt, SRL Format String, SRL Eval, SRL Filter Image List. This is a collection of nodes I find useful. Note that at least one module allows execution of arbitrary code. Do not use any of these nodes on a system that allow untrusted users to control workflows or inputs.[w/WARNING: The custom nodes in this extension are vulnerable to **security risks** because they allow the execution of arbitrary code through the workflow]" + }, + { + "author": "alpertunga-bile", + "title": "prompt-generator", + "reference": "https://github.com/alpertunga-bile/prompt-generator-comfyui", + "files": [ + "https://github.com/alpertunga-bile/prompt-generator-comfyui" + ], + "install_type": "git-clone", + "description": "Custom AI prompt generator node for ComfyUI." + }, + { + "author": "kijai", + "title": "KJNodes for ComfyUI", + "id": "kjnodes", + "reference": "https://github.com/kijai/ComfyUI-KJNodes", + "files": [ + "https://github.com/kijai/ComfyUI-KJNodes" + ], + "install_type": "git-clone", + "description": "Various quality of life -nodes for ComfyUI, mostly just visual stuff to improve usability." + }, + { + "author": "kijai", + "title": "ComfyUI-CCSR", + "id": "ccsr", + "reference": "https://github.com/kijai/ComfyUI-CCSR", + "files": [ + "https://github.com/kijai/ComfyUI-CCSR" + ], + "install_type": "git-clone", + "description": "ComfyUI- CCSR upscaler node" + }, + { + "author": "kijai", + "title": "ComfyUI-SVD", + "id": "kijai-svd", + "reference": "https://github.com/kijai/ComfyUI-SVD", + "files": [ + "https://github.com/kijai/ComfyUI-SVD" + ], + "install_type": "git-clone", + "description": "Preliminary use of SVD in ComfyUI.\nNOTE: Quick Implementation, Unstable. See details on repositories." + }, + { + "author": "kijai", + "title": "Marigold depth estimation in ComfyUI", + "id": "marigold", + "reference": "https://github.com/kijai/ComfyUI-Marigold", + "files": [ + "https://github.com/kijai/ComfyUI-Marigold" + ], + "install_type": "git-clone", + "description": "This is a wrapper node for Marigold depth estimation: [https://github.com/prs-eth/Marigold](https://github.com/kijai/ComfyUI-Marigold). Currently using the same diffusers pipeline as in the original implementation, so in addition to the custom node, you need the model in diffusers format.\nNOTE: See details in repo to install." + }, + { + "author": "kijai", + "title": "Geowizard depth and normal estimation in ComfyUI", + "id": "geowizard", + "reference": "https://github.com/kijai/ComfyUI-Geowizard", + "files": [ + "https://github.com/kijai/ComfyUI-Geowizard" + ], + "install_type": "git-clone", + "description": "This is a diffusers (0.27.2) wrapper node for Geowizard: [https://github.com/fuxiao0719/GeoWizard]. The model is autodownloaded from Hugginface to ComfyUI/models/diffusers/geowizard" + }, + { + "author": "kijai", + "title": "ComfyUI-depth-fm", + "id": "depth-fm", + "reference": "https://github.com/kijai/ComfyUI-depth-fm", + "files": [ + "https://github.com/kijai/ComfyUI-depth-fm" + ], + "install_type": "git-clone", + "description": "Fast and accurate monocular depth estimation." + }, + { + "author": "kijai", + "title": "ComfyUI-DDColor", + "id": "ddcolor-kijai", + "reference": "https://github.com/kijai/ComfyUI-DDColor", + "files": [ + "https://github.com/kijai/ComfyUI-DDColor" + ], + "install_type": "git-clone", + "description": "Node to use [a/DDColor](https://github.com/piddnad/DDColor) in ComfyUI." + }, + { + "author": "kijai", + "title": "Animatediff MotionLoRA Trainer", + "id": "motionlora-trainer", + "reference": "https://github.com/kijai/ComfyUI-ADMotionDirector", + "files": [ + "https://github.com/kijai/ComfyUI-ADMotionDirector" + ], + "install_type": "git-clone", + "description": "This is a trainer for AnimateDiff MotionLoRAs, based on the implementation of MotionDirector by ExponentialML.\nNOTE:[a/ADMotionDirector](https://github.com/ExponentialML/AnimateDiff-MotionDirector)" + }, + { + "author": "kijai", + "title": "ComfyUI-moondream", + "id": "moondream", + "reference": "https://github.com/kijai/ComfyUI-moondream", + "files": [ + "https://github.com/kijai/ComfyUI-moondream" + ], + "install_type": "git-clone", + "description": "Moondream image to text query node with batch support" + }, + { + "author": "kijai", + "title": "ComfyUI-SUPIR", + "id": "supir", + "reference": "https://github.com/kijai/ComfyUI-SUPIR", + "files": [ + "https://github.com/kijai/ComfyUI-SUPIR" + ], + "install_type": "git-clone", + "description": "Wrapper nodes to use SUPIR upscaling process in ComfyUI" + }, + { + "author": "kijai", + "title": "ComfyUI-DynamiCrafterWrapper", + "id": "dynamicrafter-kijai", + "reference": "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper" + ], + "install_type": "git-clone", + "description": "Wrapper nodes to use DynamiCrafter image2video and frame interpolation models in ComfyUI\nAnd this extension supports ToonCrafter as well" + }, + { + "author": "kijai", + "title": "ComfyUI-APISR", + "id": "apisr", + "reference": "https://github.com/kijai/ComfyUI-APISR-KJ", + "files": [ + "https://github.com/kijai/ComfyUI-APISR-KJ" + ], + "install_type": "git-clone", + "description": "Node to use [a/APISR](https://github.com/Kiteretsu77/APISR) upscale models in ComfyUI.[w/NOTE: repo name is changed from ComfyUI-APISR -> ComfyUI-APISR-KJ]" + }, + { + "author": "kijai", + "title": "DiffusionLight implementation for ComfyUI", + "id": "diffusionlight", + "reference": "https://github.com/kijai/ComfyUI-DiffusionLight", + "files": [ + "https://github.com/kijai/ComfyUI-DiffusionLight" + ], + "install_type": "git-clone", + "description": "This is simplified implementation of the [a/DiffusionLight](https://github.com/DiffusionLight/DiffusionLight) method of creating light probes. You will need the included LoRA, place it in ComfyUI/loras folder like usual, it's converted from the original diffusers one." + }, + { + "author": "kijai", + "title": "ComfyUI-ELLA-wrapper", + "reference": "https://github.com/kijai/ComfyUI-ELLA-wrapper", + "files": [ + "https://github.com/kijai/ComfyUI-ELLA-wrapper" + ], + "install_type": "git-clone", + "description": "ComfyUI wrapper nodes to use the Diffusers implementation of ELLA" + }, + { + "author": "kijai", + "title": "ComfyUI-LaVi-Bridge-Wrapper", + "reference": "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper", + "files": [ + "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper" + ], + "install_type": "git-clone", + "description": "ComfyUI wrapper node to test LaVi-Bridge using Diffusers" + }, + { + "author": "kijai", + "title": "ComfyUI-BrushNet-Wrapper", + "reference": "https://github.com/kijai/ComfyUI-BrushNet-Wrapper", + "files": [ + "https://github.com/kijai/ComfyUI-BrushNet-Wrapper" + ], + "install_type": "git-clone", + "description": "ComfyUI wrapper nodes to use the Diffusers implementation of BrushNet" + }, + { + "author": "kijai", + "title": "ComfyUI-IC-Light", + "id": "ic-light-kijai", + "reference": "https://github.com/kijai/ComfyUI-IC-Light", + "files": [ + "https://github.com/kijai/ComfyUI-IC-Light" + ], + "install_type": "git-clone", + "description": "ComfyUI native nodes for IC-Light" + }, + { + "author": "kijai", + "title": "ComfyUI-DepthAnythingV2", + "id": "depth-anything-v2", + "reference": "https://github.com/kijai/ComfyUI-DepthAnythingV2", + "files": [ + "https://github.com/kijai/ComfyUI-DepthAnythingV2" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes to use [a/DepthAnythingV2](https://depth-anything-v2.github.io/)\nNOTE:Models autodownload to ComfyUI/models/depthanything from [a/https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main](https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main)" + }, + { + "author": "kijai", + "title": "ComfyUI-Florence2", + "id": "florence2-kijai", + "reference": "https://github.com/kijai/ComfyUI-Florence2", + "files": [ + "https://github.com/kijai/ComfyUI-Florence2" + ], + "install_type": "git-clone", + "description": "Nodes to use Florence2 VLM for image vision tasks: object detection, captioning, segmentation and ocr" + }, + { + "author": "kijai", + "title": "ComfyUI-LuminaWrapper", + "id": "lumina", + "reference": "https://github.com/kijai/ComfyUI-LuminaWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-LuminaWrapper" + ], + "install_type": "git-clone", + "description": "ComfyUI wrapper nodes for Lumina models" + }, + { + "author": "kijai", + "title": "ComfyUI-MimicMotionWrapper", + "id": "mimicmotion-kijai", + "reference": "https://github.com/kijai/ComfyUI-MimicMotionWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-MimicMotionWrapper" + ], + "install_type": "git-clone", + "description": "Optimized wrapper nodes for MimicMotion: [a/https://github.com/tencent/MimicMotion](https://github.com/tencent/MimicMotion)" + }, + { + "author": "kijai", + "title": "ComfyUI-OpenDiTWrapper", + "id": "opendit-kijai", + "reference": "https://github.com/kijai/ComfyUI-OpenDiTWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-OpenDiTWrapper" + ], + "install_type": "git-clone", + "description": "Wrapper nodes for OpenDiT: [a/OpenDiT](https://github.com/NUS-HPC-AI-Lab/OpenDiT/), supports Open-Sora t2i and i2i" + }, + { + "author": "kijai", + "title": "ComfyUI-LivePortraitKJ", + "id": "liveportrait-kijai", + "reference": "https://github.com/kijai/ComfyUI-LivePortraitKJ", + "files": [ + "https://github.com/kijai/ComfyUI-LivePortraitKJ" + ], + "install_type": "git-clone", + "description": "Nodes for [a/LivePortrait](https://github.com/KwaiVGI/LivePortrait), insightface is required" + }, + { + "author": "kijai", + "title": "ComfyUI-KwaiKolorsWrapper", + "id": "kwaikolors", + "reference": "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper" + ], + "install_type": "git-clone", + "description": "Rudimentary wrapper that runs [a/Kwai-Kolors](https://huggingface.co/Kwai-Kolors/Kolors) text2image pipeline using diffusers." + }, + { + "author": "hhhzzyang", + "title": "Comfyui-Lama", + "id": "lama", + "reference": "https://github.com/hhhzzyang/Comfyui_Lama", + "files": [ + "https://github.com/hhhzzyang/Comfyui_Lama" + ], + "install_type": "git-clone", + "description": "Nodes: LamaaModelLoad, LamaApply, YamlConfigLoader. a costumer node is realized to remove anything/inpainting anything from a picture by mask inpainting.[w/WARN:This extension includes the entire model, which can result in a very long initial installation time, and there may be some compatibility issues with older dependencies and ComfyUI.]" + }, + { + "author": "audioscavenger", + "title": "Save Image Extended for ComfyUI", + "id": "save-image-extended", + "reference": "https://github.com/audioscavenger/save-image-extended-comfyui", + "files": [ + "https://github.com/audioscavenger/save-image-extended-comfyui" + ], + "install_type": "git-clone", + "description": "Upgrade the Save File node: customize subfolders, file names with checkpoint names, or any sampler attribute your want! [w/NOTE: This node is a fork from @thedyze, since the [a/original repository](https://github.com/thedyze/save-image-extended-comfyui) is no longer maintained. Simply *uninstall* the original version and **REINSTALL** this one.]" + }, + { + "author": "SOELexicon", + "title": "ComfyUI-LexTools", + "id": "lextools", + "reference": "https://github.com/SOELexicon/ComfyUI-LexTools", + "files": [ + "https://github.com/SOELexicon/ComfyUI-LexTools" + ], + "install_type": "git-clone", + "description": "ComfyUI-LexTools is a Python-based image processing and analysis toolkit that uses machine learning models for semantic image segmentation, image scoring, and image captioning." + }, + { + "author": "mikkel", + "title": "ComfyUI - Text Overlay Plugin", + "id": "textoverlay-mikkel", + "reference": "https://github.com/mikkel/ComfyUI-text-overlay", + "files": [ + "https://github.com/mikkel/ComfyUI-text-overlay" + ], + "install_type": "git-clone", + "description": "The ComfyUI Text Overlay Plugin provides functionalities for superimposing text on images. Users can select different font types, set text size, choose color, and adjust the text's position on the image." + }, + { + "author": "avatechai", + "title": "Avatar Graph", + "id": "avatar-graph", + "reference": "https://github.com/avatechai/avatar-graph-comfyui", + "files": [ + "https://github.com/avatechai/avatar-graph-comfyui" + ], + "install_type": "git-clone", + "description": "Include nodes for sam + bpy operation, that allows workflow creations for generative 2d character rig." + }, + { + "author": "TRI3D-LC", + "title": "tri3d-comfyui-nodes", + "id": "tri3d", + "reference": "https://github.com/TRI3D-LC/tri3d-comfyui-nodes", + "files": [ + "https://github.com/TRI3D-LC/tri3d-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: tri3d-extract-hand, tri3d-fuzzification, tri3d-position-hands, tri3d-atr-parse." + }, + { + "author": "TRI3D-LC", + "title": "ComfyUI-MiroBoard", + "id": "miroboard", + "reference": "https://github.com/TRI3D-LC/ComfyUI-MiroBoard", + "files": [ + "https://github.com/TRI3D-LC/ComfyUI-MiroBoard" + ], + "install_type": "git-clone", + "description": "Nodes: add-image-miro-board." + }, + { + "author": "storyicon", + "title": "segment anything", + "id": "sam", + "reference": "https://github.com/storyicon/comfyui_segment_anything", + "files": [ + "https://github.com/storyicon/comfyui_segment_anything" + ], + "install_type": "git-clone", + "description": "Based on GroundingDino and SAM, use semantic strings to segment any element in an image. The comfyui version of sd-webui-segment-anything." + }, + { + "author": "storyicon", + "title": "ComfyUI MuseV Evolved", + "id": "musev-evolved", + "reference": "https://github.com/storyicon/comfyui_musev_evolved", + "files": [ + "https://github.com/storyicon/comfyui_musev_evolved" + ], + "install_type": "git-clone", + "description": "Nodes:MuseVImg2Vid (comfyui_musev_evolved)\nNOTE: Download [a/MuseV](https://huggingface.co/TMElyralab/MuseV) to ComfyUI/models/diffusers" + }, + { + "author": "a1lazydog", + "title": "ComfyUI-AudioScheduler", + "id": "audioscheduler", + "reference": "https://github.com/a1lazydog/ComfyUI-AudioScheduler", + "files": [ + "https://github.com/a1lazydog/ComfyUI-AudioScheduler" + ], + "install_type": "git-clone", + "description": "Load mp3 files and use the audio nodes to power animations and prompt scheduling. Use with FizzNodes." + }, + { + "author": "whatbirdisthat", + "title": "cyberdolphin", + "reference": "https://github.com/whatbirdisthat/cyberdolphin", + "files": [ + "https://github.com/whatbirdisthat/cyberdolphin" + ], + "install_type": "git-clone", + "description": "Cyberdolphin Suite of ComfyUI nodes for wiring up things." + }, + { + "author": "chrish-slingshot", + "title": "CrasH Utils", + "id": "crash", + "reference": "https://github.com/chrish-slingshot/CrasHUtils", + "files": [ + "https://github.com/chrish-slingshot/CrasHUtils" + ], + "install_type": "git-clone", + "description": "A mixture of effects and quality of life nodes. Nodes: ImageGlitcher (gives an image a cool glitchy effect), ColorStylizer (highlights a single color in an image), QueryLocalLLM (queries a local LLM API though oobabooga), SDXLReslution (resolution picker for the standard SDXL resolutions, the complete list), SDXLResolutionSplit (splits the SDXL resolution into width and height). " + }, + { + "author": "spinagon", + "title": "ComfyUI-seam-carving", + "id": "seamcarving", + "reference": "https://github.com/spinagon/ComfyUI-seam-carving", + "files": [ + "https://github.com/spinagon/ComfyUI-seam-carving" + ], + "install_type": "git-clone", + "description": "Nodes: Image Resize (seam carving). Seam carving (image resize) for ComfyUI. Based on [a/https://github.com/li-plus/seam-carving](https://github.com/li-plus/seam-carving). With seam carving algorithm, the image could be intelligently resized while keeping the important contents undistorted. The carving process could be further guided, so that an object could be removed from the image without apparent artifacts." + }, + { + "author": "YMC", + "title": "ymc-node-suite-comfyui", + "id": "ymc", + "reference": "https://github.com/YMC-GitHub/ymc-node-suite-comfyui", + "files": [ + "https://github.com/YMC-GitHub/ymc-node-suite-comfyui" + ], + "install_type": "git-clone", + "description": "ymc 's nodes for comfyui. This extension is composed of nodes that provide various utility features such as text, region, and I/O." + }, + { + "author": "chibiace", + "title": "ComfyUI-Chibi-Nodes", + "id": "chibi", + "reference": "https://github.com/chibiace/ComfyUI-Chibi-Nodes", + "files": [ + "https://github.com/chibiace/ComfyUI-Chibi-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Loader, Prompts, ImageTool, Wildcards, LoadEmbedding, ConditionText, SaveImages, ..." + }, + { + "author": "DigitalIO", + "title": "ComfyUI-stable-wildcards", + "id": "stable-wildcards", + "reference": "https://github.com/DigitalIO/ComfyUI-stable-wildcards", + "files": [ + "https://github.com/DigitalIO/ComfyUI-stable-wildcards" + ], + "install_type": "git-clone", + "description": "Wildcard implementation that can be reproduced with workflows." + }, + { + "author": "THtianhao", + "title": "ComfyUI-Portrait-Maker", + "id": "portrait-maker", + "reference": "https://github.com/THtianhao/ComfyUI-Portrait-Maker", + "files": [ + "https://github.com/THtianhao/ComfyUI-Portrait-Maker" + ], + "install_type": "git-clone", + "description": "Nodes:RetainFace, FaceFusion, RatioMerge2Image, MaskMerge2Image, ReplaceBoxImg, ExpandMaskBox, FaceSkin, SkinRetouching, PortraitEnhancement, ..." + }, + { + "author": "THtianhao", + "title": "ComfyUI-FaceChain", + "id": "facechain", + "reference": "https://github.com/THtianhao/ComfyUI-FaceChain", + "files": [ + "https://github.com/THtianhao/ComfyUI-FaceChain" + ], + "install_type": "git-clone", + "description": "The official ComfyUI version of facechain greatly improves the speed of reasoning and has great custom process controls." + }, + { + "author": "zer0TF", + "title": "Cute Comfy", + "id": "cutecomfy", + "reference": "https://github.com/zer0TF/cute-comfy", + "files": [ + "https://github.com/zer0TF/cute-comfy" + ], + "install_type": "git-clone", + "description": "Adds a configurable folder watcher that auto-converts Comfy metadata into a Civitai-friendly format for automatic resource tagging when you upload images. Oh, and it makes your UI awesome, too. 💜" + }, + { + "author": "chflame163", + "title": "ComfyUI_MSSpeech_TTS", + "id": "msspeech", + "reference": "https://github.com/chflame163/ComfyUI_MSSpeech_TTS", + "files": [ + "https://github.com/chflame163/ComfyUI_MSSpeech_TTS" + ], + "install_type": "git-clone", + "description": "A text-to-speech plugin used under ComfyUI. It utilizes the Microsoft Speech TTS interface to convert text content into MP3 format audio files." + }, + { + "author": "chflame163", + "title": "ComfyUI_WordCloud", + "id": "wordcloud", + "reference": "https://github.com/chflame163/ComfyUI_WordCloud", + "files": [ + "https://github.com/chflame163/ComfyUI_WordCloud" + ], + "install_type": "git-clone", + "description": "Nodes:Word Cloud, Load Text File" + }, + { + "author": "chflame163", + "title": "ComfyUI Layer Style", + "id": "layerstyle", + "reference": "https://github.com/chflame163/ComfyUI_LayerStyle", + "files": [ + "https://github.com/chflame163/ComfyUI_LayerStyle" + ], + "install_type": "git-clone", + "description": "A set of nodes for ComfyUI it generate image like Adobe Photoshop's Layer Style. the Drop Shadow is first completed node, and follow-up work is in progress." + }, + { + "author": "chflame163", + "title": "ComfyUI Face Similarity", + "id": "face-similarity", + "reference": "https://github.com/chflame163/ComfyUI_FaceSimilarity", + "files": [ + "https://github.com/chflame163/ComfyUI_FaceSimilarity" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI. It compare two images to rate facial similarity." + }, + { + "author": "drustan-hawk", + "title": "primitive-types", + "reference": "https://github.com/drustan-hawk/primitive-types", + "files": [ + "https://github.com/drustan-hawk/primitive-types" + ], + "install_type": "git-clone", + "description": "Small collection of typed primitive nodes." + }, + { + "author": "shadowcz007", + "title": "comfyui-mixlab-nodes", + "id": "mixlab", + "reference": "https://github.com/shadowcz007/comfyui-mixlab-nodes", + "files": [ + "https://github.com/shadowcz007/comfyui-mixlab-nodes" + ], + "install_type": "git-clone", + "description": "3D, ScreenShareNode & FloatingVideoNode, SpeechRecognition & SpeechSynthesis, GPT, LoadImagesFromLocal, Layers, Other Nodes, ..." + }, + { + "author": "shadowcz007", + "title": "comfyui-ultralytics-yolo", + "id": "yolo", + "reference": "https://github.com/shadowcz007/comfyui-ultralytics-yolo", + "files": [ + "https://github.com/shadowcz007/comfyui-ultralytics-yolo" + ], + "install_type": "git-clone", + "description": "Nodes:Detect By Label." + }, + { + "author": "shadowcz007", + "title": "Consistency Decoder", + "id": "consistency-decoder", + "reference": "https://github.com/shadowcz007/comfyui-consistency-decoder", + "files": [ + "https://github.com/shadowcz007/comfyui-consistency-decoder" + ], + "install_type": "git-clone", + "description": "[a/openai Consistency Decoder](https://github.com/openai/consistencydecoder). After downloading the [a/OpenAI VAE model](https://openaipublic.azureedge.net/diff-vae/c9cebd3132dd9c42936d803e33424145a748843c8f716c0814838bdc8a2fe7cb/decoder.pt), place it in the `model/vae` directory for use." + }, + { + "author": "shadowcz007", + "title": "comfyui-Image-reward", + "reference": "https://github.com/shadowcz007/comfyui-Image-reward", + "files": [ + "https://github.com/shadowcz007/comfyui-Image-reward" + ], + "install_type": "git-clone", + "description": "[a/ImageReward](https://github.com/THUDM/ImageReward): Human preference learning in text-to-image generation. This is a [a/paper](https://arxiv.org/abs/2304.05977) from NeurIPS 2023" + }, + { + "author": "shadowcz007", + "title": "comfyui-sound-lab", + "id": "soundlab", + "reference": "https://github.com/shadowcz007/comfyui-sound-lab", + "files": [ + "https://github.com/shadowcz007/comfyui-sound-lab" + ], + "install_type": "git-clone", + "description": "Nodes:Music Gen, Audio Play, Stable Audio" + }, + { + "author": "shadowcz007", + "title": "comfyui-edit-mask", + "id": "edit-mask", + "reference": "https://github.com/shadowcz007/comfyui-edit-mask", + "files": [ + "https://github.com/shadowcz007/comfyui-edit-mask" + ], + "install_type": "git-clone", + "description": "Nodes:Edit Mask" + }, + { + "author": "shadowcz007", + "title": "comfyui-liveportrait", + "id": "liveportrait", + "reference": "https://github.com/shadowcz007/comfyui-liveportrait", + "files": [ + "https://github.com/shadowcz007/comfyui-liveportrait" + ], + "install_type": "git-clone", + "description": "The ComfyUI version of [a/LivePortrait](https://github.com/KwaiVGI/LivePortrait)." + }, + { + "author": "ostris", + "title": "Ostris Nodes ComfyUI", + "id": "ostris", + "reference": "https://github.com/ostris/ostris_nodes_comfyui", + "files": [ + "https://github.com/ostris/ostris_nodes_comfyui" + ], + "install_type": "git-clone", + "nodename_pattern": "- Ostris$", + "description": "This is a collection of custom nodes for ComfyUI that I made for some QOL. I will be adding much more advanced ones in the future once I get more familiar with the API." + }, + { + "author": "0xbitches", + "title": "Latent Consistency Model for ComfyUI", + "id": "lcm", + "reference": "https://github.com/0xbitches/ComfyUI-LCM", + "files": [ + "https://github.com/0xbitches/ComfyUI-LCM" + ], + "install_type": "git-clone", + "description": "This custom node implements a Latent Consistency Model sampler in ComfyUI. (LCM)" + }, + { + "author": "aszc-dev", + "title": "Core ML Suite for ComfyUI", + "id": "coreml", + "reference": "https://github.com/aszc-dev/ComfyUI-CoreMLSuite", + "files": [ + "https://github.com/aszc-dev/ComfyUI-CoreMLSuite" + ], + "install_type": "git-clone", + "description": "This extension contains a set of custom nodes for ComfyUI that allow you to use Core ML models in your ComfyUI workflows. The models can be obtained here, or you can convert your own models using coremltools. The main motivation behind using Core ML models in ComfyUI is to allow you to utilize the ANE (Apple Neural Engine) on Apple Silicon (M1/M2) machines to improve performance." + }, + { + "author": "taabata", + "title": "Syrian Falcon Nodes", + "id": "syrian", + "reference": "https://github.com/taabata/Comfy_Syrian_Falcon_Nodes", + "files": [ + "https://github.com/taabata/Comfy_Syrian_Falcon_Nodes/raw/main/SyrianFalconNodes.py" + ], + "install_type": "copy", + "description": "Nodes:Prompt editing, Word as Image" + }, + { + "author": "taabata", + "title": "LCM_Inpaint-Outpaint_Comfy", + "id": "lcm-inpaint-outpaint", + "reference": "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy", + "files": [ + "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy" + ], + "install_type": "git-clone", + "description": "ComfyUI custom nodes for inpainting/outpainting using the new latent consistency model (LCM)" + }, + { + "author": "noxinias", + "title": "ComfyUI_NoxinNodes", + "id": "noxin", + "reference": "https://github.com/noxinias/ComfyUI_NoxinNodes", + "files": [ + "https://github.com/noxinias/ComfyUI_NoxinNodes" + ], + "install_type": "git-clone", + "description": "Nodes: Noxin Complete Chime, Noxin Scaled Resolutions, Load from Noxin Prompt Library, Save to Noxin Prompt Library" + }, + { + "author": "apesplat", + "title": "ezXY scripts and nodes", + "id": "ezxy", + "reference": "https://github.com/GMapeSplat/ComfyUI_ezXY", + "files": [ + "https://github.com/GMapeSplat/ComfyUI_ezXY" + ], + "install_type": "git-clone", + "description": "Extensions/Patches: Enables linking float and integer inputs and ouputs. Values are automatically cast to the correct type and clamped to the correct range. Works with both builtin and custom nodes.[w/NOTE: This repo patches ComfyUI's validate_inputs and map_node_over_list functions while running. May break depending on your version of ComfyUI. Can be deactivated in config.yaml.]Nodes: A collection of nodes for facilitating the generation of XY plots. Capable of plotting changes over most primitive values." + }, + { + "author": "kinfolk0117", + "title": "SimpleTiles", + "id": "simpletiles", + "reference": "https://github.com/kinfolk0117/ComfyUI_SimpleTiles", + "files": [ + "https://github.com/kinfolk0117/ComfyUI_SimpleTiles" + ], + "install_type": "git-clone", + "description": "Nodes:TileSplit, TileMerge." + }, + { + "author": "kinfolk0117", + "title": "ComfyUI_GradientDeepShrink", + "id": "deepshrink", + "reference": "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink", + "files": [ + "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink" + ], + "install_type": "git-clone", + "description": "Nodes:GradientPatchModelAddDownscale (Kohya Deep Shrink)." + }, + { + "author": "kinfolk0117", + "title": "ComfyUI_Pilgram", + "id": "pilgram", + "reference": "https://github.com/kinfolk0117/ComfyUI_Pilgram", + "files": [ + "https://github.com/kinfolk0117/ComfyUI_Pilgram" + ], + "install_type": "git-clone", + "description": "Use [a/Pilgram2](https://github.com/mgineer85/pilgram2) filters in ComfyUI" + }, + { + "author": "Fictiverse", + "title": "ComfyUI Fictiverse Nodes", + "id": "fictverse", + "reference": "https://github.com/Fictiverse/ComfyUI_Fictiverse", + "files": [ + "https://github.com/Fictiverse/ComfyUI_Fictiverse" + ], + "install_type": "git-clone", + "description": "Nodes:Color correction." + }, + { + "author": "idrirap", + "title": "ComfyUI-Lora-Auto-Trigger-Words", + "id": "lora-auto-trigger", + "reference": "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words", + "files": [ + "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words" + ], + "install_type": "git-clone", + "description": "This project is a fork of [a/https://github.com/Extraltodeus/LoadLoraWithTags](https://github.com/Extraltodeus/LoadLoraWithTags) The aim of these custom nodes is to get an easy access to the tags used to trigger a lora." + }, + { + "author": "aianimation55", + "title": "Comfy UI FatLabels", + "id": "fatlab", + "reference": "https://github.com/aianimation55/ComfyUI-FatLabels", + "files": [ + "https://github.com/aianimation55/ComfyUI-FatLabels" + ], + "install_type": "git-clone", + "description": "It's a super simple custom node for Comfy UI, to generate text, with a font size option. Useful for bigger labelling of nodes, helpful for wider screen captures or tutorials. Plus you can of course use the text within your generations." + }, + { + "author": "noEmbryo", + "title": "noEmbryo nodes", + "id": "noembryo", + "reference": "https://github.com/noembryo/ComfyUI-noEmbryo", + "files": [ + "https://github.com/noembryo/ComfyUI-noEmbryo" + ], + "install_type": "git-clone", + "description": "PromptTermList (1-6): are some nodes that help with the creation of Prompts inside ComfyUI. Resolution Scale outputs image dimensions using a scale factor. Regex Text Chopper outputs the chopped parts of a text using RegEx." + }, + { + "author": "mikkel", + "title": "ComfyUI - Mask Bounding Box", + "id": "mask-bbox", + "reference": "https://github.com/mikkel/comfyui-mask-boundingbox", + "files": [ + "https://github.com/mikkel/comfyui-mask-boundingbox" + ], + "install_type": "git-clone", + "description": "The ComfyUI Mask Bounding Box Plugin provides functionalities for selecting a specific size mask from an image. Can be combined with ClipSEG to replace any aspect of an SDXL image with an SD1.5 output." + }, + { + "author": "ParmanBabra", + "title": "ComfyUI-Malefish-Custom-Scripts", + "id": "malefish", + "reference": "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts", + "files": [ + "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts" + ], + "install_type": "git-clone", + "description": "Nodes:Multi Lora Loader, Random (Prompt), Combine (Prompt), CSV Prompts Loader" + }, + { + "author": "IAmMatan.com", + "title": "ComfyUI Serving toolkit", + "id": "serving-toolkit", + "reference": "https://github.com/matan1905/ComfyUI-Serving-Toolkit", + "files": [ + "https://github.com/matan1905/ComfyUI-Serving-Toolkit" + ], + "install_type": "git-clone", + "description": "This extension adds nodes that allow you to easily serve your workflow (for example using a discord bot) " + }, + { + "author": "PCMonsterx", + "title": "ComfyUI-CSV-Loader", + "id": "csv-loader", + "reference": "https://github.com/PCMonsterx/ComfyUI-CSV-Loader", + "files": [ + "https://github.com/PCMonsterx/ComfyUI-CSV-Loader" + ], + "install_type": "git-clone", + "description": "CSV Loader for prompt building within ComfyUI interface. Allows access to positive/negative prompts associated with a name. Selections are being pulled from CSV files." + }, + { + "author": "Trung0246", + "title": "ComfyUI-0246", + "id": "0246", + "reference": "https://github.com/Trung0246/ComfyUI-0246", + "files": [ + "https://github.com/Trung0246/ComfyUI-0246" + ], + "install_type": "git-clone", + "description": "Random nodes for ComfyUI I made to solve my struggle with ComfyUI (ex: pipe, process). Have varying quality." + }, + { + "author": "fexli", + "title": "fexli-util-node-comfyui", + "id": "fexli", + "reference": "https://github.com/fexli/fexli-util-node-comfyui", + "files": [ + "https://github.com/fexli/fexli-util-node-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:FEImagePadForOutpaint, FEColorOut, FEColor2Image, FERandomizedColor2Image" + }, + { + "author": "AbyssYuan0", + "title": "ComfyUI_BadgerTools", + "id": "badger", + "reference": "https://github.com/AbyssYuan0/ComfyUI_BadgerTools", + "files": [ + "https://github.com/AbyssYuan0/ComfyUI_BadgerTools" + ], + "install_type": "git-clone", + "description": "Nodes:ImageOverlap-badger, FloatToInt-badger, IntToString-badger, FloatToString-badger, ImageNormalization-badger, ImageScaleToSide-badger, NovelToFizz-badger." + }, + { + "author": "palant", + "title": "Image Resize for ComfyUI", + "id": "image-resize", + "reference": "https://github.com/palant/image-resize-comfyui", + "files": [ + "https://github.com/palant/image-resize-comfyui" + ], + "install_type": "git-clone", + "description": "This custom node provides various tools for resizing images. The goal is resizing without distorting proportions, yet without having to perform any calculations with the size of the original image. If a mask is present, it is resized and modified along with the image." + }, + { + "author": "palant", + "title": "Integrated Nodes for ComfyUI", + "reference": "https://github.com/palant/integrated-nodes-comfyui", + "files": [ + "https://github.com/palant/integrated-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "This tool will turn entire workflows or parts of them into single integrated nodes. In a way, it is similar to the Node Templates functionality but hides the inner structure. This is useful if all you want is to reuse and quickly configure a bunch of nodes without caring how they are interconnected." + }, + { + "author": "palant", + "title": "Extended Save Image for ComfyUI", + "reference": "https://github.com/palant/extended-saveimage-comfyui", + "files": [ + "https://github.com/palant/extended-saveimage-comfyui" + ], + "install_type": "git-clone", + "description": "This custom node is largely identical to the usual Save Image but allows saving images also in JPEG and WEBP formats, the latter with both lossless and lossy compression. Metadata is embedded in the images as usual, and the resulting images can be used to load a workflow." + }, + { + "author": "whmc76", + "title": "ComfyUI-Openpose-Editor-Plus", + "id": "openpose-editor-plus", + "reference": "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus", + "files": [ + "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus" + ], + "install_type": "git-clone", + "description": "Nodes:Openpose Editor Plus" + }, + { + "author": "martijnat", + "title": "comfyui-previewlatent", + "reference": "https://github.com/martijnat/comfyui-previewlatent", + "files": [ + "https://github.com/martijnat/comfyui-previewlatent" + ], + "install_type": "git-clone", + "description": "a ComfyUI plugin for previewing latents without vae decoding. Useful for showing intermediate results and can be used a faster 'preview image' if you don't wan't to use vae decode." + }, + { + "author": "banodoco", + "title": "Steerable Motion", + "id": "steerable-motion", + "reference": "https://github.com/banodoco/steerable-motion", + "files": [ + "https://github.com/banodoco/steerable-motion" + ], + "install_type": "git-clone", + "description": "Steerable Motion is a ComfyUI node for batch creative interpolation. Our goal is to feature the best methods for steering motion with images as video models evolve." + }, + { + "author": "gemell1", + "title": "ComfyUI_GMIC", + "id": "gmic", + "reference": "https://github.com/gemell1/ComfyUI_GMIC", + "files": [ + "https://github.com/gemell1/ComfyUI_GMIC" + ], + "install_type": "git-clone", + "description": "Nodes:GMIC Image Processing." + }, + { + "author": "LonicaMewinsky", + "title": "ComfyBreakAnim", + "id": "breakanim", + "reference": "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame", + "files": [ + "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame" + ], + "install_type": "git-clone", + "description": "Nodes:BreakFrames, GetKeyFrames, MakeGrid." + }, + { + "author": "TheBarret", + "title": "ZSuite", + "id": "zsuite", + "reference": "https://github.com/TheBarret/ZSuite", + "files": [ + "https://github.com/TheBarret/ZSuite" + ], + "install_type": "git-clone", + "description": "Nodes:Prompter, RF Noise, SeedMod." + }, + { + "author": "romeobuilderotti", + "title": "ComfyUI PNG Metadata", + "id": "pngmeta", + "reference": "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata", + "files": [ + "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata" + ], + "install_type": "git-clone", + "description": "Add custom Metadata fields to your saved PNG files." + }, + { + "author": "ka-puna", + "title": "comfyui-yanc", + "id": "yanc", + "reference": "https://github.com/ka-puna/comfyui-yanc", + "files": [ + "https://github.com/ka-puna/comfyui-yanc" + ], + "install_type": "git-clone", + "description": "NOTE: Concatenate Strings, Format Datetime String, Integer Caster, Multiline String, Truncate String. Yet Another Node Collection, a repository of simple nodes for ComfyUI. This repository eases the addition or removal of custom nodes to itself." + }, + { + "author": "amorano", + "title": "Jovimetrix Composition Nodes", + "id": "jovimetrix", + "reference": "https://github.com/Amorano/Jovimetrix", + "files": [ + "https://github.com/Amorano/Jovimetrix" + ], + "nodename_pattern": " \\(JOV\\)$", + "install_type": "git-clone", + "description": "Webcam, MIDI, Spout and GLSL shader support. Animation via tick. Parameter manipulation with wave generator. Math operations, universal value converstion, shape mask generation, image channel ops, batch splitting/merging/randomizing, load image/video from URL, Dynamic bus routing, support for GIPHY, save output anywhere! flatten, crop, transform; check color blindness, make stereograms or stereoscopic images, and much more." + }, + { + "author": "Umikaze-job", + "title": "select_folder_path_easy", + "reference": "https://github.com/Umikaze-job/select_folder_path_easy", + "files": [ + "https://github.com/Umikaze-job/select_folder_path_easy" + ], + "install_type": "git-clone", + "description": "This extension simply connects the nodes and specifies the output path of the generated images to a manageable path." + }, + { + "author": "Niutonian", + "title": "ComfyUi-NoodleWebcam", + "id": "noodle-webcam", + "reference": "https://github.com/Niutonian/ComfyUi-NoodleWebcam", + "files": [ + "https://github.com/Niutonian/ComfyUi-NoodleWebcam" + ], + "install_type": "git-clone", + "description": "Nodes:Noodle webcam is a node that records frames and send them to your favourite node." + }, + { + "author": "Feidorian", + "title": "feidorian-ComfyNodes", + "id": "feidorian", + "reference": "https://github.com/Feidorian/feidorian-ComfyNodes", + "nodename_pattern": "^Feidorian_", + "files": [ + "https://github.com/Feidorian/feidorian-ComfyNodes" + ], + "install_type": "git-clone", + "description": "This extension provides various custom nodes. literals, loaders, logic, output, switches" + }, + { + "author": "wutipong", + "title": "ComfyUI-TextUtils", + "reference": "https://github.com/wutipong/ComfyUI-TextUtils", + "files": [ + "https://github.com/wutipong/ComfyUI-TextUtils" + ], + "install_type": "git-clone", + "description": "Nodes:Create N-Token String" + }, + { + "author": "natto-maki", + "title": "ComfyUI-NegiTools", + "id": "negitools", + "reference": "https://github.com/natto-maki/ComfyUI-NegiTools", + "files": [ + "https://github.com/natto-maki/ComfyUI-NegiTools" + ], + "install_type": "git-clone", + "description": "Nodes:OpenAI DALLe3, OpenAI Translate to English, String Function, Seed Generator" + }, + { + "author": "LonicaMewinsky", + "title": "ComfyUI-RawSaver", + "id": "rawsaver", + "reference": "https://github.com/LonicaMewinsky/ComfyUI-RawSaver", + "files": [ + "https://github.com/LonicaMewinsky/ComfyUI-RawSaver" + ], + "install_type": "git-clone", + "description": "Nodes:SaveTifImage. ComfyUI custom node for purpose of saving image as uint16 tif file." + }, + { + "author": "jojkaart", + "title": "ComfyUI-sampler-lcm-alternative", + "id": "lmc-alt", + "reference": "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative", + "files": [ + "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative" + ], + "install_type": "git-clone", + "description": "Nodes:LCMScheduler, SamplerLCMAlternative, SamplerLCMCycle. ComfyUI Custom Sampler nodes that add a new improved LCM sampler functions" + }, + { + "author": "GTSuya-Studio", + "title": "ComfyUI-GTSuya-Nodes", + "id": "gtsuya", + "reference": "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes", + "files": [ + "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes" + ], + "install_type": "git-clone", + "description": "ComfyUI-GTSuya-Nodes is a ComfyUI extension designed to add several wildcards supports into ComfyUI. Wildcards allow you to use __name__ syntax in your prompt to get a random line from a file named name.txt in a wildcards directory." + }, + { + "author": "oyvindg", + "title": "ComfyUI-TrollSuite", + "id": "troll", + "reference": "https://github.com/oyvindg/ComfyUI-TrollSuite", + "files": [ + "https://github.com/oyvindg/ComfyUI-TrollSuite" + ], + "install_type": "git-clone", + "description": "Nodes: BinaryImageMask, ImagePadding, LoadLastCreatedImage, RandomMask, TransparentImage." + }, + { + "author": "drago87", + "title": "ComfyUI_Dragos_Nodes", + "id": "dragos", + "reference": "https://github.com/drago87/ComfyUI_Dragos_Nodes", + "files": [ + "https://github.com/drago87/ComfyUI_Dragos_Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:File Padding, Image Info, VAE Loader With Name" + }, + { + "author": "ansonkao", + "title": "comfyui-geometry", + "id": "geometry", + "reference": "https://github.com/ansonkao/comfyui-geometry", + "files": [ + "https://github.com/ansonkao/comfyui-geometry" + ], + "install_type": "git-clone", + "description": "Nodes: Mask to Centroid, Mask to Eigenvector. A small collection of custom nodes for use with ComfyUI, for geometry calculations" + }, + { + "author": "bronkula", + "title": "comfyui-fitsize", + "id": "fitsize", + "reference": "https://github.com/bronkula/comfyui-fitsize", + "files": [ + "https://github.com/bronkula/comfyui-fitsize" + ], + "install_type": "git-clone", + "description": "Nodes:Fit Size From Int/Image/Resize, Load Image And Resize To Fit, Pick Image From Batch/List, Crop Image Into Even Pieces, Image Region To Mask... A simple set of nodes for making an image fit within a bounding box" + }, + { + "author": "toyxyz", + "title": "ComfyUI_toyxyz_test_nodes", + "id": "toyxyz", + "reference": "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes", + "files": [ + "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes" + ], + "install_type": "git-clone", + "description": "This node was created to send a webcam to ComfyUI in real time. This node is recommended for use with LCM." + }, + { + "author": "thecooltechguy", + "title": "ComfyUI Stable Video Diffusion", + "reference": "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion", + "files": [ + "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion" + ], + "install_type": "git-clone", + "description": "Easily use Stable Video Diffusion inside ComfyUI!" + }, + { + "author": "thecooltechguy", + "title": "ComfyUI-ComfyRun", + "reference": "https://github.com/thecooltechguy/ComfyUI-ComfyRun", + "files": [ + "https://github.com/thecooltechguy/ComfyUI-ComfyRun" + ], + "install_type": "git-clone", + "description": "The easiest way to run & share any ComfyUI workflow [a/https://comfyrun.com](https://comfyrun.com)" + }, + { + "author": "thecooltechguy", + "title": "ComfyUI-MagicAnimate", + "reference": "https://github.com/thecooltechguy/ComfyUI-MagicAnimate", + "files": [ + "https://github.com/thecooltechguy/ComfyUI-MagicAnimate" + ], + "install_type": "git-clone", + "description": "Easily use Magic Animate within ComfyUI!\n[w/WARN: This extension requires 15GB disk space.]" + }, + { + "author": "thecooltechguy", + "title": "ComfyUI-ComfyWorkflows", + "reference": "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows", + "files": [ + "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows" + ], + "install_type": "git-clone", + "description": "The best way to run, share, & discover thousands of ComfyUI workflows." + }, + { + "author": "Danand", + "title": "Comfy Couple", + "reference": "https://github.com/Danand/ComfyUI-ComfyCouple", + "files": [ + "https://github.com/Danand/ComfyUI-ComfyCouple" + ], + "install_type": "git-clone", + "description": " If you want to draw two different characters together without blending their features, so you could try to check out this custom node." + }, + { + "author": "42lux", + "title": "ComfyUI-safety-checker", + "reference": "https://github.com/42lux/ComfyUI-safety-checker", + "files": [ + "https://github.com/42lux/ComfyUI-safety-checker" + ], + "install_type": "git-clone", + "description": "A NSFW/Safety Checker Node for ComfyUI." + }, + { + "author": "sergekatzmann", + "title": "ComfyUI_Nimbus-Pack", + "reference": "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack", + "files": [ + "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack" + ], + "install_type": "git-clone", + "description": "Nodes:Image Square Adapter Node, Image Resize And Crop Node" + }, + { + "author": "komojini", + "title": "ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes", + "reference": "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes", + "files": [ + "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes" + ], + "install_type": "git-clone", + "description": "Nodes:XL DreamBooth LoRA, S3 Bucket LoRA" + }, + { + "author": "komojini", + "title": "komojini-comfyui-nodes", + "id": "komojini-nodes", + "reference": "https://github.com/komojini/komojini-comfyui-nodes", + "files": [ + "https://github.com/komojini/komojini-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:YouTube Video Loader. Custom ComfyUI Nodes for video generation" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "APISR IN COMFYUI", + "id": "apisr-zho", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of APISR for ComfyUI, both image and video" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Text_Image-Composite [WIP]", + "id": "txtimg-composite", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite" + ], + "install_type": "git-clone", + "description": "Nodes:Text_Image_Zho, Text_Image_Multiline_Zho, RGB_Image_Zho, AlphaChanelAddByMask, ImageComposite_Zho, ..." + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Gemini", + "id": "gemini", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini" + ], + "install_type": "git-clone", + "description": "Using Gemini-pro & Gemini-pro-vision in ComfyUI." + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "comfyui-portrait-master-zh-cn", + "id": "portrait-master-zho", + "reference": "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn" + ], + "install_type": "git-clone", + "description": "ComfyUI Portrait Master 简体中文版." + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Q-Align", + "id": "qalign-zho", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align" + ], + "install_type": "git-clone", + "description": "Nodes:Q-Align Scoring. Implementation of [a/Q-Align](https://arxiv.org/abs/2312.17090) for ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-InstantID", + "id": "instantid-zho", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/InstantID](https://github.com/InstantID/InstantID) for ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI PhotoMaker (ZHO)", + "id": "photomaker-zho", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) for ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Qwen-VL-API", + "id": "qwen-vl-api", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API" + ], + "install_type": "git-clone", + "description": "QWen-VL-Plus & QWen-VL-Max in ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-SVD-ZHO (WIP)", + "id": "svd-zho", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO" + ], + "install_type": "git-clone", + "description": "My Workflows + Auxiliary nodes for Stable Video Diffusion (SVD)" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI SegMoE", + "id": "segmoe", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/SegMoE: Segmind Mixture of Diffusion Experts](https://github.com/segmind/segmoe) for ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI YoloWorld-EfficientSAM", + "id": "yoloworld", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/YOLO-World + EfficientSAM](https://huggingface.co/spaces/SkalskiP/YOLO-World) & [a/YOLO-World](https://github.com/AILab-CVC/YOLO-World) for ComfyUI\nNOTE: Install the efficient_sam model from the Install models menu.\n[w/When installing or updating this custom node, many installation packages may be downgraded due to the installation of requirements.\n!! python3.12 is incompatible.]" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-PixArt-alpha-Diffusers", + "id": "pixart-alpha", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/PixArt-alpha-Diffusers](https://github.com/PixArt-alpha/PixArt-alpha) for ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-BRIA_AI-RMBG", + "id": "bria-ai-rmbg", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of BRIA RMBG Model for ComfyUI." + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "DepthFM IN COMFYUI", + "id": "depthfm", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/DepthFM](https://github.com/CompVis/depth-fm) for ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-BiRefNet-ZHO", + "id": "birefnet", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO" + ], + "install_type": "git-clone", + "description": "Better version for [a/BiRefNet](https://github.com/zhengpeng7/birefnet) in ComfyUI | Both img and video" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "Phi-3-mini in ComfyUI", + "id": "phi3mini", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini" + ], + "install_type": "git-clone", + "description": "Nodes:Phi3mini_4k_ModelLoader_Zho, Phi3mini_4k_Zho, Phi3mini_4k_Chat_Zho" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-ArtGallery", + "id": "artgallery", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery" + ], + "install_type": "git-clone", + "description": "Prompt Visualization | Art Gallery\n[w/WARN: Installation requires 2GB of space, and it will involve a long download time.]" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Animated-optical-illusions", + "id": "animated-optical-illusion", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions" + ], + "install_type": "git-clone", + "description": "Animated optical illusions in ComfyUI" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-Qwen-2", + "id": "qwen-2", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2" + ], + "install_type": "git-clone", + "description": "Using Qwen-2 in ComfyUI" + }, + { + "author": "kenjiqq", + "title": "qq-nodes-comfyui", + "reference": "https://github.com/kenjiqq/qq-nodes-comfyui", + "files": [ + "https://github.com/kenjiqq/qq-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:Any List, Image Accumulator Start, Image Accumulator End, Load Lines From Text File, XY Grid Helper, Slice List, Axis To String/Int/Float/Model, ..." + }, + { + "author": "80sVectorz", + "title": "ComfyUI-Static-Primitives", + "reference": "https://github.com/80sVectorz/ComfyUI-Static-Primitives", + "files": [ + "https://github.com/80sVectorz/ComfyUI-Static-Primitives" + ], + "install_type": "git-clone", + "description": "Adds Static Primitives to ComfyUI. Mostly to work with reroute nodes" + }, + { + "author": "AbdullahAlfaraj", + "title": "Comfy-Photoshop-SD", + "reference": "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD", + "files": [ + "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD" + ], + "install_type": "git-clone", + "description": "Nodes: load Image with metadata, get config data, load image from base64 string, Load Loras From Prompt, Generate Latent Noise, Combine Two Latents Into Batch, General Purpose Controlnet Unit, ControlNet Script, Content Mask Latent, Auto-Photoshop-SD Seed, Expand and Blur the Mask" + }, + { + "author": "zhuanqianfish", + "title": "EasyCaptureNode for ComfyUI", + "reference": "https://github.com/zhuanqianfish/ComfyUI-EasyNode", + "files": [ + "https://github.com/zhuanqianfish/ComfyUI-EasyNode" + ], + "install_type": "git-clone", + "description": "Capture window content from other programs, easyway combined with LCM for real-time painting" + }, + { + "author": "discopixel-studio", + "title": "ComfyUI Discopixel Nodes", + "reference": "https://github.com/discopixel-studio/comfyui-discopixel", + "files": [ + "https://github.com/discopixel-studio/comfyui-discopixel" + ], + "install_type": "git-clone", + "description": "Nodes:TransformTemplateOntoFaceMask, ... A small collection of custom nodes for use with ComfyUI, by Discopixel" + }, + { + "author": "zcfrank1st", + "title": "ComfyUI Yolov8", + "reference": "https://github.com/zcfrank1st/Comfyui-Yolov8", + "files": [ + "https://github.com/zcfrank1st/Comfyui-Yolov8" + ], + "install_type": "git-clone", + "description": "Nodes: Yolov8Detection, Yolov8Segmentation. Deadly simple yolov8 comfyui plugin" + }, + { + "author": "SoftMeng", + "title": "ComfyUI_Mexx_Styler", + "reference": "https://github.com/SoftMeng/ComfyUI_Mexx_Styler", + "files": [ + "https://github.com/SoftMeng/ComfyUI_Mexx_Styler" + ], + "install_type": "git-clone", + "description": "Nodes: ComfyUI Mexx Styler, ComfyUI Mexx Styler Advanced" + }, + { + "author": "SoftMeng", + "title": "ComfyUI_Mexx_Poster", + "reference": "https://github.com/SoftMeng/ComfyUI_Mexx_Poster", + "files": [ + "https://github.com/SoftMeng/ComfyUI_Mexx_Poster" + ], + "install_type": "git-clone", + "description": "Nodes: ComfyUI_Mexx_Poster" + }, + { + "author": "SoftMeng", + "title": "ComfyUI_ImageToText", + "reference": "https://github.com/SoftMeng/ComfyUI_ImageToText", + "files": [ + "https://github.com/SoftMeng/ComfyUI_ImageToText" + ], + "install_type": "git-clone", + "description": "Nodes: ComfyUI_ImageToText" + }, + { + "author": "wmatson", + "title": "easy-comfy-nodes", + "reference": "https://github.com/wmatson/easy-comfy-nodes", + "files": [ + "https://github.com/wmatson/easy-comfy-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: HTTP POST, Empty Dict, Assoc Str, Assoc Dict, Assoc Img, Load Img From URL (EZ), Load Img Batch From URLs (EZ), Video Combine + upload (EZ), ..." + }, + { + "author": "DrJKL", + "title": "ComfyUI-Anchors", + "reference": "https://github.com/DrJKL/ComfyUI-Anchors", + "files": [ + "https://github.com/DrJKL/ComfyUI-Anchors" + ], + "install_type": "git-clone", + "description": "A ComfyUI extension to add spatial anchors/waypoints to better navigate large workflows." + }, + { + "author": "vanillacode314", + "title": "Simple Wildcard", + "reference": "https://github.com/vanillacode314/SimpleWildcardsComfyUI", + "files": ["https://github.com/vanillacode314/SimpleWildcardsComfyUI"], + "install_type": "git-clone", + "pip": ["pipe"], + "description": "A simple wildcard node for ComfyUI. Can also be used a style prompt node." + }, + { + "author": "WebDev9000", + "title": "WebDev9000-Nodes", + "reference": "https://github.com/WebDev9000/WebDev9000-Nodes", + "files": [ + "https://github.com/WebDev9000/WebDev9000-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Ignore Braces, Settings Switch." + }, + { + "author": "Scholar01", + "title": "SComfyUI-Keyframe", + "reference": "https://github.com/Scholar01/ComfyUI-Keyframe", + "files": [ + "https://github.com/Scholar01/ComfyUI-Keyframe" + ], + "install_type": "git-clone", + "description": "Nodes:Keyframe Part, Keyframe Interpolation Part, Keyframe Apply." + }, + { + "author": "Haoming02", + "title": "ComfyUI Diffusion Color Grading", + "reference": "https://github.com/Haoming02/comfyui-diffusion-cg", + "files": [ + "https://github.com/Haoming02/comfyui-diffusion-cg" + ], + "install_type": "git-clone", + "description": "This is the ComfyUI port of the joint research between me and TimothyAlexisVass. For more information, check out the original [a/Extension](https://github.com/Haoming02/sd-webui-diffusion-cg) for Automatic1111." + }, + { + "author": "Haoming02", + "title": "comfyui-prompt-format", + "reference": "https://github.com/Haoming02/comfyui-prompt-format", + "files": [ + "https://github.com/Haoming02/comfyui-prompt-format" + ], + "install_type": "git-clone", + "description": "This is an Extension for ComfyUI, which helps formatting texts." + }, + { + "author": "Haoming02", + "title": "ComfyUI Clear Screen", + "reference": "https://github.com/Haoming02/comfyui-clear-screen", + "files": [ + "https://github.com/Haoming02/comfyui-clear-screen" + ], + "install_type": "git-clone", + "description": "Adds a CLS button to clear the console." + }, + { + "author": "Haoming02", + "title": "ComfyUI Menu Anchor", + "reference": "https://github.com/Haoming02/comfyui-menu-anchor", + "files": [ + "https://github.com/Haoming02/comfyui-menu-anchor" + ], + "install_type": "git-clone", + "description": "This is an Extension for ComfyUI, which moves the menu to the specified corner on startup." + }, + { + "author": "Haoming02", + "title": "ComfyUI Tab Handler", + "reference": "https://github.com/Haoming02/comfyui-tab-handler", + "files": [ + "https://github.com/Haoming02/comfyui-tab-handler" + ], + "install_type": "git-clone", + "description": "Intercepts the Tab key to switch between textarea" + }, + { + "author": "Haoming02", + "title": "ComfyUI Floodgate", + "reference": "https://github.com/Haoming02/comfyui-floodgate", + "files": [ + "https://github.com/Haoming02/comfyui-floodgate" + ], + "install_type": "git-clone", + "description": "A node that allows you to switch between execution flow" + }, + { + "author": "Haoming02", + "title": "ComfyUI Node Beautify", + "reference": "https://github.com/Haoming02/comfyui-node-beautify", + "files": [ + "https://github.com/Haoming02/comfyui-node-beautify" + ], + "install_type": "git-clone", + "description": "This is an Extension for ComfyUI, which helps formatting the workflow." + }, + { + "author": "bedovyy", + "title": "ComfyUI_NAIDGenerator", + "reference": "https://github.com/bedovyy/ComfyUI_NAIDGenerator", + "files": [ + "https://github.com/bedovyy/ComfyUI_NAIDGenerator" + ], + "install_type": "git-clone", + "description": "This extension helps generate images through NAI." + }, + { + "author": "Off-Live", + "title": "ComfyUI-off-suite", + "reference": "https://github.com/Off-Live/ComfyUI-off-suite", + "files": [ + "https://github.com/Off-Live/ComfyUI-off-suite" + ], + "install_type": "git-clone", + "description": "Nodes:Image Crop Fit, OFF SEGS to Image, Crop Center wigh SEGS, Watermarking, GW Number Formatting Node." + }, + { + "author": "ningxiaoxiao", + "title": "comfyui-NDI", + "reference": "https://github.com/ningxiaoxiao/comfyui-NDI", + "files": [ + "https://github.com/ningxiaoxiao/comfyui-NDI" + ], + "pip": ["ndi-python"], + "install_type": "git-clone", + "description": "Real-time input output node for ComfyUI by NDI. Leveraging the powerful linking capabilities of NDI, you can access NDI video stream frames and send images generated by the model to NDI video streams." + }, + { + "author": "subtleGradient", + "title": "Touchpad two-finger gesture support for macOS", + "reference": "https://github.com/subtleGradient/TinkerBot-tech-for-ComfyUI-Touchpad", + "files": [ + "https://github.com/subtleGradient/TinkerBot-tech-for-ComfyUI-Touchpad" + ], + "install_type": "git-clone", + "description": "Two-finger scrolling (vertical and horizontal) to pan the canvas. Two-finger pinch to zoom in and out. Command-scroll up and down to zoom in and out. Fixes [a/comfyanonymous/ComfyUI#2059](https://github.com/comfyanonymous/ComfyUI/issues/2059)." + }, + { + "author": "zcfrank1st", + "title": "comfyui_visual_anagram", + "reference": "https://github.com/zcfrank1st/comfyui_visual_anagrams", + "files": [ + "https://github.com/zcfrank1st/comfyui_visual_anagrams" + ], + "install_type": "git-clone", + "description": "Nodes:visual_anagrams_sample, visual_anagrams_animate" + }, + { + "author": "Electrofried", + "title": "OpenAINode", + "reference": "https://github.com/Electrofried/ComfyUI-OpenAINode", + "files": [ + "https://github.com/Electrofried/ComfyUI-OpenAINode" + ], + "install_type": "git-clone", + "description": "A simply node for hooking in to openAI API based servers via comfyUI" + }, + { + "author": "AustinMroz", + "title": "SpliceTools", + "id": "splicetools", + "reference": "https://github.com/AustinMroz/ComfyUI-SpliceTools", + "files": [ + "https://github.com/AustinMroz/ComfyUI-SpliceTools" + ], + "install_type": "git-clone", + "description": "Experimental utility nodes with a focus on manipulation of noised latents" + }, + { + "author": "AustinMroz", + "title": "DynamicOversampling", + "id": "dynamic-oversampling", + "reference": "https://github.com/AustinMroz/ComfyUI-DynamicOversampling", + "files": [ + "https://github.com/AustinMroz/ComfyUI-DynamicOversampling" + ], + "install_type": "git-clone", + "description": "Nodes:DynamicSampler, MeasuredSampler, ResolveMaskPromise" + }, + { + "author": "AustinMroz", + "title": "ComfyUI-WorkflowCheckpointing", + "id": "workflowcheckpointing", + "reference": "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing", + "files": [ + "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing" + ], + "install_type": "git-clone", + "description": "Automatically creates checkpoints during workflow execution. If If an workflow is canceled or ComfyUI crashes mid-execution, then these checkpoints are used when the workflow is re-queued to resume execution with minimal progress loss." + }, + { + "author": "11cafe", + "title": "ComfyUI Workspace Manager - Comfyspace", + "reference": "https://github.com/11cafe/comfyui-workspace-manager", + "files": [ + "https://github.com/11cafe/comfyui-workspace-manager" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node for project management to centralize the management of all your workflows in one place. Seamlessly switch between workflows, create and update them within a single workspace, like Google Docs." + }, + { + "author": "knuknX", + "title": "ComfyUI-Image-Tools", + "reference": "https://github.com/knuknX/ComfyUI-Image-Tools", + "files": [ + "https://github.com/knuknX/ComfyUI-Image-Tools" + ], + "install_type": "git-clone", + "description": "Nodes:BatchImageResizeProcessor, SingleImagePathLoader, SingleImageUrlLoader" + }, + { + "author": "jtrue", + "title": "ComfyUI-JaRue", + "reference": "https://github.com/jtrue/ComfyUI-JaRue", + "files": [ + "https://github.com/jtrue/ComfyUI-JaRue" + ], + "nodename_pattern": "_jru$", + "install_type": "git-clone", + "description": "A collection of nodes powering a tensor oracle on a home network with automation" + }, + { + "author": "filliptm", + "title": "ComfyUI_Fill-Nodes", + "reference": "https://github.com/filliptm/ComfyUI_Fill-Nodes", + "files": [ + "https://github.com/filliptm/ComfyUI_Fill-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:FL Image Randomizer. The start of a pack that I will continue to build out to fill the gaps of nodes and functionality that I feel is missing in comfyUI" + }, + { + "author": "zfkun", + "title": "ComfyUI_zfkun", + "reference": "https://github.com/zfkun/ComfyUI_zfkun", + "files": [ + "https://github.com/zfkun/ComfyUI_zfkun" + ], + "install_type": "git-clone", + "description": "A collection of nodes for common tools, including text preview, text translation (multi-platform, multi-language), image loader, webcamera capture." + }, + { + "author": "zcfrank1st", + "title": "Comfyui-Toolbox", + "reference": "https://github.com/zcfrank1st/Comfyui-Toolbox", + "files": [ + "https://github.com/zcfrank1st/Comfyui-Toolbox" + ], + "install_type": "git-clone", + "description": "Nodes:Preview Json, Save Json, Test Json Preview, ... preview and save nodes" + }, + { + "author": "talesofai", + "title": "ComfyUI Browser", + "reference": "https://github.com/talesofai/comfyui-browser", + "files": [ + "https://github.com/talesofai/comfyui-browser" + ], + "install_type": "git-clone", + "description": "This is an image/video/workflow browser and manager for ComfyUI. You could add image/video/workflow to collections and load it to ComfyUI. You will be able to use your collections everywhere." + }, + { + "author": "yolain", + "title": "ComfyUI Easy Use", + "reference": "https://github.com/yolain/ComfyUI-Easy-Use", + "files": [ + "https://github.com/yolain/ComfyUI-Easy-Use" + ], + "install_type": "git-clone", + "description": "To enhance the usability of ComfyUI, optimizations and integrations have been implemented for several commonly used nodes." + }, + { + "author": "bruefire", + "title": "ComfyUI Sequential Image Loader", + "reference": "https://github.com/bruefire/ComfyUI-SeqImageLoader", + "files": [ + "https://github.com/bruefire/ComfyUI-SeqImageLoader" + ], + "install_type": "git-clone", + "description": "This is an extension node for ComfyUI that allows you to load frames from a video in bulk and perform masking and sketching on each frame through a GUI." + }, + { + "author": "mmaker", + "title": "Color Enhance", + "reference": "https://git.mmaker.moe/mmaker/sd-webui-color-enhance", + "files": [ + "https://git.mmaker.moe/mmaker/sd-webui-color-enhance" + ], + "install_type": "git-clone", + "description": "Node: Color Enhance, Color Blend. This is the same algorithm GIMP/GEGL uses for color enhancement. The gist of this implementation is that it converts the color space to CIELCh(ab) and normalizes the chroma (or [colorfulness](https://en.wikipedia.org/wiki/Colorfulness)] component. Original source can be found in the link below." + }, + { + "author": "modusCell", + "title": "Preset Dimensions", + "reference": "https://github.com/modusCell/ComfyUI-dimension-node-modusCell", + "files": [ + "https://github.com/modusCell/ComfyUI-dimension-node-modusCell" + ], + "install_type": "git-clone", + "description": "Simple node for sharing latent image size between nodes. Preset dimensions for SD and XL." + }, + { + "author": "aria1th", + "title": "ComfyUI-LogicUtils", + "reference": "https://github.com/aria1th/ComfyUI-LogicUtils", + "files": [ + "https://github.com/aria1th/ComfyUI-LogicUtils" + ], + "install_type": "git-clone", + "description": "Nodes:UniformRandomFloat..., RandomShuffleInt, YieldableIterator..., LogicGate..., Add..., MergeString, MemoryNode, ..." + }, + { + "author": "MitoshiroPJ", + "title": "ComfyUI Slothful Attention", + "reference": "https://github.com/MitoshiroPJ/comfyui_slothful_attention", + "files": [ + "https://github.com/MitoshiroPJ/comfyui_slothful_attention" + ], + "install_type": "git-clone", + "description": "This custom node allow controlling output without training. The reducing method is similar to [a/Spatial-Reduction Attention](https://paperswithcode.com/method/spatial-reduction-attention), but generating speed may not be increased on typical image sizes due to overheads. (In some cases, slightly slower)" + }, + { + "author": "brianfitzgerald", + "title": "StyleAligned for ComfyUI", + "reference": "https://github.com/brianfitzgerald/style_aligned_comfy", + "files": [ + "https://github.com/brianfitzgerald/style_aligned_comfy" + ], + "install_type": "git-clone", + "description": "Implementation of the [a/StyleAligned](https://style-aligned-gen.github.io/) paper for ComfyUI. This node allows you to apply a consistent style to all images in a batch; by default it will use the first image in the batch as the style reference, forcing all other images to be consistent with it." + }, + { + "author": "deroberon", + "title": "demofusion-comfyui", + "id": "demofusion", + "reference": "https://github.com/deroberon/demofusion-comfyui", + "files": [ + "https://github.com/deroberon/demofusion-comfyui" + ], + "install_type": "git-clone", + "description": "The Demofusion Custom Node is a wrapper that adapts the work and implementation of the [a/DemoFusion](https://ruoyidu.github.io/demofusion/demofusion.html) technique created and implemented by Ruoyi Du to the Comfyui environment." + }, + { + "author": "deroberon", + "title": "StableZero123-comfyui", + "reference": "https://github.com/deroberon/StableZero123-comfyui", + "files": [ + "https://github.com/deroberon/StableZero123-comfyui" + ], + "install_type": "git-clone", + "description": "StableZero123 is a node wrapper that uses the model and technique provided [here](https://github.com/SUDO-AI-3D/zero123plus/). It uses the Zero123plus model to generate 3D views using just one image." + }, + { + "author": "glifxyz", + "title": "ComfyUI-GlifNodes", + "id": "glif", + "reference": "https://github.com/glifxyz/ComfyUI-GlifNodes", + "files": [ + "https://github.com/glifxyz/ComfyUI-GlifNodes" + ], + "install_type": "git-clone", + "description": "Nodes:Consistency VAE Decoder." + }, + { + "author": "concarne000", + "title": "ConCarneNode", + "reference": "https://github.com/concarne000/ConCarneNode", + "files": [ + "https://github.com/concarne000/ConCarneNode" + ], + "install_type": "git-clone", + "description": "Nodes:Bing Image Grabber, Zephyr chat, Hermes Chat" + }, + { + "author": "Aegis72", + "title": "AegisFlow Utility Nodes", + "id": "aegis", + "reference": "https://github.com/aegis72/aegisflow_utility_nodes", + "files": [ + "https://github.com/aegis72/aegisflow_utility_nodes" + ], + "install_type": "git-clone", + "description": "These nodes will be placed in comfyui/custom_nodes/aegisflow and contains the image passer (accepts an image as either wired or wirelessly, input and passes it through. Latent passer does the same for latents, and the Preprocessor chooser allows a passthrough image and 10 controlnets to be passed in AegisFlow Shima. The inputs on the Preprocessor chooser should not be renamed if you intend to accept image inputs wirelessly through UE nodes. It can be done, but the send node input regex for each controlnet preprocessor column must also be changed." + }, + { + "author": "Aegis72", + "title": "ComfyUI-styles-all", + "id": "styles-all", + "reference": "https://github.com/aegis72/comfyui-styles-all", + "files": [ + "https://github.com/aegis72/comfyui-styles-all" + ], + "install_type": "git-clone", + "description": "This is a straight clone of Azazeal04's all-in-one styler menu, which was removed from gh on Jan 21, 2024. I have made no changes to the files at all." + }, + { + "author": "glibsonoran", + "title": "Plush-for-ComfyUI", + "id": "plush", + "reference": "https://github.com/glibsonoran/Plush-for-ComfyUI", + "files": [ + "https://github.com/glibsonoran/Plush-for-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes: Style Prompt, OAI Dall_e Image. Plush contains two OpenAI enabled nodes: Style Prompt: Takes your prompt and the art style you specify and generates a prompt from ChatGPT3 or 4 that Stable Diffusion can use to generate an image in that style. OAI Dall_e 3: Takes your prompt and parameters and produces a Dall_e3 image in ComfyUI." + }, + { + "author": "vienteck", + "title": "ComfyUI-Chat-GPT-Integration", + "reference": "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration", + "files": [ + "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration" + ], + "install_type": "git-clone", + + "description": "This extension is a reimagined version based on the [a/ComfyUI-QualityOfLifeSuit_Omar92](https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92) extension, and it supports integration with ChatGPT through the new OpenAI API.\nNOTE: See detailed installation instructions on the [a/repository](https://github.com/vienteck/ComfyUI-Chat-GPT-Integration)." + }, + { + "author": "MNeMoNiCuZ", + "title": "ComfyUI-mnemic-nodes", + "id": "mnemic", + "reference": "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes", + "files": [ + "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Save Text File, Download Image from URL, Groq LLM API, Generate Negative Prompt (experimental)" + }, + { + "author": "AI2lab", + "title": "comfyUI-tool-2lab", + "id": "tool-2lab", + "reference": "https://github.com/AI2lab/comfyUI-tool-2lab", + "files": [ + "https://github.com/AI2lab/comfyUI-tool-2lab" + ], + "install_type": "git-clone", + "description": "tool set for developing workflow and publish to web api server" + }, + { + "author": "AI2lab", + "title": "comfyUI-DeepSeek-2lab", + "id": "deepseek", + "reference": "https://github.com/AI2lab/comfyUI-DeepSeek-2lab", + "files": [ + "https://github.com/AI2lab/comfyUI-DeepSeek-2lab" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of DeepSeek for ComfyUI" + }, + { + "author": "AI2lab", + "title": "comfyUI-siliconflow-api-2lab", + "id": "siliconflow", + "reference": "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab", + "files": [ + "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of siliconflow API for ComfyUI\nHow to use:apply api key in :https://cloud.siliconflow.cn/\nadd api key in config.json" + }, + { + "author": "SpaceKendo", + "title": "Text to video for Stable Video Diffusion in ComfyUI", + "id": "svd-txt2vid", + "reference": "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid", + "files": [ + "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid" + ], + "install_type": "git-clone", + "description": "This is node replaces the init_image conditioning for the [a/Stable Video Diffusion](https://github.com/Stability-AI/generative-models) image to video model with text embeds, together with a conditioning frame. The conditioning frame is a set of latents." + }, + { + "author": "NimaNzrii", + "title": "comfyui-popup_preview", + "id": "popup-preview", + "reference": "https://github.com/NimaNzrii/comfyui-popup_preview", + "files": [ + "https://github.com/NimaNzrii/comfyui-popup_preview" + ], + "install_type": "git-clone", + "description": "popup preview for comfyui" + }, + { + "author": "NimaNzrii", + "title": "comfyui-photoshop", + "id": "comfy-photoshop", + "reference": "https://github.com/NimaNzrii/comfyui-photoshop", + "files": [ + "https://github.com/NimaNzrii/comfyui-photoshop" + ], + "install_type": "git-clone", + "description": "Powerfull bridge to Photoshop by NimaNzrii" + }, + { + "author": "Rui", + "title": "RUI-Nodes", + "id": "rui-nodes", + "reference": "https://github.com/rui40000/RUI-Nodes", + "files": [ + "https://github.com/rui40000/RUI-Nodes" + ], + "install_type": "git-clone", + "description": "Rui's workflow-specific custom node, written using GPT." + }, + { + "author": "dmarx", + "title": "ComfyUI-Keyframed", + "id": "keyframed", + "reference": "https://github.com/dmarx/ComfyUI-Keyframed", + "files": [ + "https://github.com/dmarx/ComfyUI-Keyframed" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes to facilitate parameter/prompt keyframing using comfyui nodes for defining and manipulating parameter curves. Essentially provides a ComfyUI interface to the [a/keyframed](https://github.com/dmarx/keyframed) library." + }, + { + "author": "dmarx", + "title": "ComfyUI-AudioReactive", + "id": "audioreactive", + "reference": "https://github.com/dmarx/ComfyUI-AudioReactive", + "files": [ + "https://github.com/dmarx/ComfyUI-AudioReactive" + ], + "install_type": "git-clone", + "description": "porting audioreactivity pipeline from vktrs to comfyui." + }, + { + "author": "TripleHeadedMonkey", + "title": "ComfyUI_MileHighStyler", + "id": "milehighstyler", + "reference": "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler", + "files": [ + "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler" + ], + "install_type": "git-clone", + "description": "This extension provides various SDXL Prompt Stylers. See: [a/youtube](https://youtu.be/WBHI-2uww7o?si=dijvDaUI4nmx4VkF)" + }, + { + "author": "BennyKok", + "title": "ComfyUI Deploy", + "id": "comfy-deploy", + "reference": "https://github.com/BennyKok/comfyui-deploy", + "files": [ + "https://github.com/BennyKok/comfyui-deploy" + ], + "install_type": "git-clone", + "description": "Open source comfyui deployment platform, a vercel for generative workflow infra." + }, + { + "author": "florestefano1975", + "title": "comfyui-portrait-master", + "id": "portrait-master", + "reference": "https://github.com/florestefano1975/comfyui-portrait-master", + "files": [ + "https://github.com/florestefano1975/comfyui-portrait-master" + ], + "install_type": "git-clone", + "description": "ComfyUI Portrait Master. A node designed to help AI image creators to generate prompts for human portraits." + }, + { + "author": "florestefano1975", + "title": "comfyui-prompt-composer", + "id": "prompt-composer", + "reference": "https://github.com/florestefano1975/comfyui-prompt-composer", + "files": [ + "https://github.com/florestefano1975/comfyui-prompt-composer" + ], + "install_type": "git-clone", + "description": "A suite of tools for prompt management. Combining nodes helps the user sequence strings for prompts, also creating logical groupings if necessary. Individual nodes can be chained together in any order." + }, + { + "author": "florestefano1975", + "title": "ComfyUI StabilityAI Suite", + "id": "sai-suite", + "reference": "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite", + "files": [ + "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite" + ], + "install_type": "git-clone", + "description": "This fork of the official StabilityAI repository contains a number of enhancements and implementations." + }, + { + "author": "florestefano1975", + "title": "ComfyUI HiDiffusion", + "id": "hidiffusion", + "reference": "https://github.com/florestefano1975/ComfyUI-HiDiffusion", + "files": [ + "https://github.com/florestefano1975/ComfyUI-HiDiffusion" + ], + "install_type": "git-clone", + "description": "Simple custom nodes for testing and use HiDiffusion technology: https://github.com/megvii-research/HiDiffusion/" + }, + { + "author": "mozman", + "title": "ComfyUI_mozman_nodes", + "id": "mozman-nodes", + "reference": "https://github.com/mozman/ComfyUI_mozman_nodes", + "files": [ + "https://github.com/mozman/ComfyUI_mozman_nodes" + ], + "install_type": "git-clone", + "description": "This extension provides styler nodes for SDXL.\n\nNOTE: Due to the dynamic nature of node name definitions, ComfyUI-Manager cannot recognize the node list from this extension. The Missing nodes and Badge features are not available for this extension." + }, + { + "author": "rcsaquino", + "title": "rcsaquino/comfyui-custom-nodes", + "id": "rcsaquino-nodes", + "reference": "https://github.com/rcsaquino/comfyui-custom-nodes", + "files": [ + "https://github.com/rcsaquino/comfyui-custom-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: VAE Processor, VAE Loader, Background Remover" + }, + { + "author": "rcfcu2000", + "title": "zhihuige-nodes-comfyui", + "id": "zhihuige-nodes", + "reference": "https://github.com/rcfcu2000/zhihuige-nodes-comfyui", + "files": [ + "https://github.com/rcfcu2000/zhihuige-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes: Combine ZHGMasks, Cover ZHGMasks, ZHG FaceIndex, ZHG SaveImage, ZHG SmoothEdge, ZHG GetMaskArea, ..." + }, + { + "author": "IDGallagher", + "title": "IG Interpolation Nodes", + "id": "ig-nodes", + "reference": "https://github.com/IDGallagher/ComfyUI-IG-Nodes", + "files": [ + "https://github.com/IDGallagher/ComfyUI-IG-Nodes" + ], + "install_type": "git-clone", + "description": "Custom nodes to aid in the exploration of Latent Space" + }, + { + "author": "violet-chen", + "title": "comfyui-psd2png", + "id": "psd2png", + "reference": "https://github.com/violet-chen/comfyui-psd2png", + "files": [ + "https://github.com/violet-chen/comfyui-psd2png" + ], + "install_type": "git-clone", + "description": "Nodes: Psd2Png." + }, + { + "author": "lldacing", + "title": "comfyui-easyapi-nodes", + "id": "easyapi", + "reference": "https://github.com/lldacing/comfyui-easyapi-nodes", + "files": [ + "https://github.com/lldacing/comfyui-easyapi-nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Base64 To Image, Image To Base64, Load Image To Base64." + }, + { + "author": "CosmicLaca", + "title": "Primere nodes for ComfyUI", + "id": "primere", + "reference": "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes", + "files": [ + "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes" + ], + "install_type": "git-clone", + "description": "This extension provides various utility nodes. Inputs(prompt, styles, dynamic, merger, ...), Outputs(style pile), Dashboard(selectors, loader, switch, ...), Networks(LORA, Embedding, Hypernetwork), Visuals(visual selectors, )" + }, + { + "author": "RenderRift", + "title": "ComfyUI-RenderRiftNodes", + "id": "renderrift", + "reference": "https://github.com/RenderRift/ComfyUI-RenderRiftNodes", + "files": [ + "https://github.com/RenderRift/ComfyUI-RenderRiftNodes" + ], + "install_type": "git-clone", + "description": "Nodes:RR_Date_Folder_Format, RR_Image_Metadata_Overlay, RR_VideoPathMetaExtraction, RR_DisplayMetaOptions. This extension provides nodes designed to enhance the Animatediff workflow." + }, + { + "author": "OpenArt-AI", + "title": "ComfyUI Assistant", + "id": "openart", + "reference": "https://github.com/OpenArt-AI/ComfyUI-Assistant", + "files": [ + "https://github.com/OpenArt-AI/ComfyUI-Assistant" + ], + "install_type": "git-clone", + "description": "ComfyUI Assistant is your one stop plugin for everything you need to get started with comfy-ui. Now it provides useful courses, tutorials, and basic templates." + }, + { + "author": "ttulttul", + "title": "ComfyUI Iterative Mixing Nodes", + "id": "itermix", + "reference": "https://github.com/ttulttul/ComfyUI-Iterative-Mixer", + "files": [ + "https://github.com/ttulttul/ComfyUI-Iterative-Mixer" + ], + "install_type": "git-clone", + "description": "Nodes to use Florence2 VLM for image vision tasks: object detection, captioning, segmentation and ocr" + }, + { + "author": "ttulttul", + "title": "ComfyUI-Tensor-Operations", + "id": "tensorop", + "reference": "https://github.com/ttulttul/ComfyUI-Tensor-Operations", + "files": [ + "https://github.com/ttulttul/ComfyUI-Tensor-Operations" + ], + "install_type": "git-clone", + "description": "This repo contains nodes for ComfyUI that implement some helpful operations on tensors, such as normalization." + }, + { + "author": "jitcoder", + "title": "LoraInfo", + "id": "lorainfo", + "reference": "https://github.com/jitcoder/lora-info", + "files": [ + "https://github.com/jitcoder/lora-info" + ], + "install_type": "git-clone", + "description": "Shows Lora information from CivitAI and outputs trigger words and example prompt" + }, + { + "author": "ceruleandeep", + "title": "ComfyUI LLaVA Captioner", + "id": "llava-captioner", + "reference": "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner", + "files": [ + "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner" + ], + "install_type": "git-clone", + "description": "A ComfyUI extension for chatting with your images. Runs on your own system, no external services used, no filter. Uses the [a/LLaVA multimodal LLM](https://llava-vl.github.io/) so you can give instructions or ask questions in natural language. It's maybe as smart as GPT3.5, and it can see." + }, + { + "author": "styler00dollar", + "title": "ComfyUI-sudo-latent-upscale", + "id": "sudo-latent-upscale", + "reference": "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale", + "files": [ + "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale" + ], + "install_type": "git-clone", + "description": "Directly upscaling inside the latent space. Model was trained for SD1.5 and drawn content. Might add new architectures or update models at some point. This took heavy inspriration from [city96/SD-Latent-Upscaler](https://github.com/city96/SD-Latent-Upscaler) and [Ttl/ComfyUi_NNLatentUpscale](https://github.com/Ttl/ComfyUi_NNLatentUpscale). " + }, + { + "author": "styler00dollar", + "title": "ComfyUI-deepcache", + "id": "deepcache", + "reference": "https://github.com/styler00dollar/ComfyUI-deepcache", + "files": [ + "https://github.com/styler00dollar/ComfyUI-deepcache" + ], + "install_type": "git-clone", + "description": "This extension provides nodes for [a/DeepCache: Accelerating Diffusion Models for Free](https://arxiv.org/abs/2312.00858)\nNOTE:Original code can be found [a/here](https://gist.github.com/laksjdjf/435c512bc19636e9c9af4ee7bea9eb86). Full credit to laksjdjf for sharing the code. " + }, + { + "author": "HarroweD and quadmoon", + "title": "Harrlogos Prompt Builder Node", + "id": "harrlogos-prompt-builder", + "reference": "https://github.com/NotHarroweD/Harronode", + "nodename_pattern": "Harronode", + "files": [ + "https://github.com/NotHarroweD/Harronode" + ], + "install_type": "git-clone", + "description": "Harronode is a custom node designed to build prompts easily for use with the Harrlogos SDXL LoRA. This Node simplifies the process of crafting prompts and makes all built in activation terms available at your fingertips." + }, + { + "author": "Limitex", + "title": "ComfyUI-Calculation", + "id": "calc", + "reference": "https://github.com/Limitex/ComfyUI-Calculation", + "files": [ + "https://github.com/Limitex/ComfyUI-Calculation" + ], + "install_type": "git-clone", + "description": "Nodes: Center Calculation. Improved Numerical Calculation for ComfyUI" + }, + { + "author": "Limitex", + "title": "ComfyUI-Diffusers", + "id": "diffusers", + "reference": "https://github.com/Limitex/ComfyUI-Diffusers", + "files": [ + "https://github.com/Limitex/ComfyUI-Diffusers" + ], + "install_type": "git-clone", + "description": "This extension enables the use of the diffuser pipeline in ComfyUI." + }, + { + "author": "aiXander", + "title": "Various custom nodes by Eden.art", + "id": "Eden", + "reference": "https://github.com/edenartlab/eden_comfy_pipelines", + "files": [ + "https://github.com/edenartlab/eden_comfy_pipelines" + ], + "install_type": "git-clone", + "description": "A set of custom nodes for various purposed, maintained by Eden.art" + }, + { + "author": "pkpk", + "title": "ComfyUI-SaveAVIF", + "id": "saveavif", + "reference": "https://github.com/pkpkTech/ComfyUI-SaveAVIF", + "files": [ + "https://github.com/pkpkTech/ComfyUI-SaveAVIF" + ], + "install_type": "git-clone", + "description": "A custom node on ComfyUI that saves images in AVIF format. Workflow can be loaded from images saved at this node." + }, + { + "author": "pkpkTech", + "title": "ComfyUI-ngrok", + "id": "ngrok", + "reference": "https://github.com/pkpkTech/ComfyUI-ngrok", + "files": [ + "https://github.com/pkpkTech/ComfyUI-ngrok" + ], + "install_type": "git-clone", + "description": "Use ngrok to allow external access to ComfyUI.\nNOTE: Need to manually modify a token inside the __init__.py file." + }, + { + "author": "pkpk", + "title": "ComfyUI-TemporaryLoader", + "id": "temploader", + "reference": "https://github.com/pkpkTech/ComfyUI-TemporaryLoader", + "files": [ + "https://github.com/pkpkTech/ComfyUI-TemporaryLoader" + ], + "install_type": "git-clone", + "description": "This is a custom node of ComfyUI that downloads and loads models from the input URL. The model is temporarily downloaded into memory and not saved to storage.\nThis could be useful when trying out models or when using various models on machines with limited storage. Since the model is downloaded into memory, expect higher memory usage than usual." + }, + { + "author": "pkpkTech", + "title": "ComfyUI-SaveQueues", + "id": "savequeues", + "reference": "https://github.com/pkpkTech/ComfyUI-SaveQueues", + "files": [ + "https://github.com/pkpkTech/ComfyUI-SaveQueues" + ], + "install_type": "git-clone", + "description": "Add a button to the menu to save and load the running queue and the pending queues.\nThis is intended to be used when you want to exit ComfyUI with queues still remaining." + }, + { + "author": "Crystian", + "title": "Crystools", + "id": "crytools", + "reference": "https://github.com/crystian/ComfyUI-Crystools", + "files": [ + "https://github.com/crystian/ComfyUI-Crystools" + ], + "nodename_pattern": " \\[Crystools\\]$", + "install_type": "git-clone", + "description": "With this suit, you can see the resources monitor, progress bar & time elapsed, metadata and compare between two images, compare between two JSONs, show any value to console/display, pipes, and more!\nThis provides better nodes to load/save images, previews, etc, and see \"hidden\" data without loading a new workflow." + }, + { + "author": "Crystian", + "title": "Crystools-save", + "id": "crytools-save", + "reference": "https://github.com/crystian/ComfyUI-Crystools-save", + "files": [ + "https://github.com/crystian/ComfyUI-Crystools-save" + ], + "install_type": "git-clone", + "description": "With this quality of life extension, you can save your workflow with a specific name and include additional details such as the author, a description, and the version (in metadata/json). Important: When you share your workflow (via png/json), others will be able to see your information!" + }, + { + "author": "Kangkang625", + "title": "ComfyUI-Paint-by-Example", + "id": "paint-by-example", + "reference": "https://github.com/Kangkang625/ComfyUI-paint-by-example", + "pip": ["diffusers"], + "files": [ + "https://github.com/Kangkang625/ComfyUI-paint-by-example" + ], + "install_type": "git-clone", + "description": "This repo is a simple implementation of [a/Paint-by-Example](https://github.com/Fantasy-Studio/Paint-by-Example) based on its [a/huggingface pipeline](https://huggingface.co/Fantasy-Studio/Paint-by-Example)." + }, + { + "author": "54rt1n", + "title": "ComfyUI-DareMerge", + "id": "daremerge", + "reference": "https://github.com/54rt1n/ComfyUI-DareMerge", + "files": [ + "https://github.com/54rt1n/ComfyUI-DareMerge" + ], + "install_type": "git-clone", + "description": "Merge two checkpoint models by dare ties [a/(https://github.com/yule-BUAA/MergeLM)](https://github.com/yule-BUAA/MergeLM), sort of." + }, + { + "author": "an90ray", + "title": "ComfyUI_RErouter_CustomNodes", + "id": "rerouter", + "reference": "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes", + "files": [ + "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes" + ], + "install_type": "git-clone", + "description": "Nodes: RErouter, String (RE), Int (RE)" + }, + { + "author": "jesenzhang", + "title": "ComfyUI_StreamDiffusion", + "id": "streamdiffusion", + "reference": "https://github.com/jesenzhang/ComfyUI_StreamDiffusion", + "files": [ + "https://github.com/jesenzhang/ComfyUI_StreamDiffusion" + ], + "install_type": "git-clone", + "description": "This is a simple implementation StreamDiffusion(A Pipeline-Level Solution for Real-Time Interactive Generation) for ComfyUI" + }, + { + "author": "ai-liam", + "title": "LiamUtil (single node)", + "id": "liam-util-single", + "reference": "https://github.com/ai-liam/comfyui_liam_util", + "files": [ + "https://github.com/ai-liam/comfyui_liam_util" + ], + "install_type": "git-clone", + "description": "Nodes: LiamLoadImage. This node provides the capability to load images from a URL." + }, + { + "author": "ai-liam", + "title": "LiamUtil", + "id": "liam-util", + "reference": "https://github.com/ai-liam/comfyui-liam", + "files": [ + "https://github.com/ai-liam/comfyui-liam" + ], + "install_type": "git-clone", + "description": "Nodes: LiamLibLoadImage, LiamLibImageToGray, LiamLibSaveImg, LiamLibFillImage, PreviewReliefImage, GetBetterDepthImage, LiamLibSaveText" + }, + { + "author": "Ryuukeisyou", + "title": "comfyui_face_parsing", + "id": "face-parsing", + "reference": "https://github.com/Ryuukeisyou/comfyui_face_parsing", + "files": [ + "https://github.com/Ryuukeisyou/comfyui_face_parsing" + ], + "install_type": "git-clone", + "description": "This is a set of custom nodes for ComfyUI. The nodes utilize the [a/face parsing model](https://huggingface.co/jonathandinu/face-parsing) to provide detailed segmantation of face. To improve face segmantation accuracy, [a/yolov8 face model](https://huggingface.co/Bingsu/adetailer/) is used to first extract face from an image. There are also auxiliary nodes for image and mask processing. A guided filter is also provided for skin smoothing." + }, + { + "author": "tocubed", + "title": "ComfyUI-AudioReactor", + "id": "audioreactor", + "reference": "https://github.com/tocubed/ComfyUI-AudioReactor", + "files": [ + "https://github.com/tocubed/ComfyUI-AudioReactor" + ], + "install_type": "git-clone", + "description": "Nodes: Shadertoy, Load Audio (from Path), Audio Frame Transform (Shadertoy), Audio Frame Transform (Beats)" + }, + { + "author": "ntc-ai", + "title": "ComfyUI - Apply LoRA Stacker with DARE", + "reference": "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge", + "files": [ + "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge" + ], + "install_type": "git-clone", + "description": "An experiment about combining multiple LoRAs with [a/DARE](https://arxiv.org/pdf/2311.03099.pdf)" + }, + { + "author": "wwwins", + "title": "ComfyUI-Simple-Aspect-Ratio", + "reference": "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio", + "files": [ + "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio" + ], + "install_type": "git-clone", + "description": "Nodes:SimpleAspectRatio" + }, + { + "author": "ownimage", + "title": "ComfyUI-ownimage", + "reference": "https://github.com/ownimage/ComfyUI-ownimage", + "files": [ + "https://github.com/ownimage/ComfyUI-ownimage" + ], + "install_type": "git-clone", + "description": "Nodes:Caching Image Loader." + }, + { + "author": "Millyarde", + "title": "Pomfy - Photoshop and ComfyUI 2-way sync", + "reference": "https://github.com/Millyarde/Pomfy", + "files": [ + "https://github.com/Millyarde/Pomfy" + ], + "install_type": "git-clone", + "description": "Photoshop custom nodes inside of ComfyUi, send and get data via Photoshop UXP plugin for cross platform support" + }, + { + "author": "Ryuukeisyou", + "title": "comfyui_io_helpers", + "reference": "https://github.com/Ryuukeisyou/comfyui_io_helpers", + "files": [ + "https://github.com/Ryuukeisyou/comfyui_io_helpers" + ], + "install_type": "git-clone", + "description": "Nodes:ImageLoadFromBase64, ImageLoadByPath, ImageLoadAsMaskByPath, ImageSaveToPath, ImageSaveAsBase64." + }, + { + "author": "flowtyone", + "title": "ComfyUI-Flowty-LDSR", + "reference": "https://github.com/flowtyone/ComfyUI-Flowty-LDSR", + "files": [ + "https://github.com/flowtyone/ComfyUI-Flowty-LDSR" + ], + "install_type": "git-clone", + "description": "This is a custom node that lets you take advantage of Latent Diffusion Super Resolution (LDSR) models inside ComfyUI." + }, + { + "author": "flowtyone", + "title": "ComfyUI-Flowty-TripoSR", + "reference": "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR", + "files": [ + "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR" + ], + "install_type": "git-clone", + "description": "This is a custom node that lets you use TripoSR right from ComfyUI.\n[a/TripoSR](https://github.com/VAST-AI-Research/TripoSR) is a state-of-the-art open-source model for fast feedforward 3D reconstruction from a single image, collaboratively developed by Tripo AI and Stability AI. (TL;DR it creates a 3d model from an image.)" + }, + { + "author": "flowtyone", + "title": "ComfyUI-Flowty-CRM", + "reference": "https://github.com/flowtyone/ComfyUI-Flowty-CRM", + "files": [ + "https://github.com/flowtyone/ComfyUI-Flowty-CRM" + ], + "install_type": "git-clone", + "description": "This is a custom node that lets you use Convolutional Reconstruction Models right from ComfyUI.\n[a/CRM](https://ml.cs.tsinghua.edu.cn/~zhengyi/CRM/) is a high-fidelity feed-forward single image-to-3D generative model." + }, + { + "author": "massao000", + "title": "ComfyUI_aspect_ratios", + "reference": "https://github.com/massao000/ComfyUI_aspect_ratios", + "files": [ + "https://github.com/massao000/ComfyUI_aspect_ratios" + ], + "install_type": "git-clone", + "description": "Aspect ratio selector for ComfyUI based on [a/sd-webui-ar](https://github.com/alemelis/sd-webui-ar?tab=readme-ov-file)." + }, + { + "author": "SiliconFlow", + "title": "OneDiff Nodes", + "id": "onddiff", + "reference": "https://github.com/siliconflow/onediff_comfy_nodes", + "files": [ + "https://github.com/siliconflow/onediff_comfy_nodes" + ], + "install_type": "git-clone", + "description": "[a/Onediff](https://github.com/siliconflow/onediff) ComfyUI Nodes." + }, + { + "author": "hinablue", + "title": "ComfyUI 3D Pose Editor", + "id": "3d-pose-editor", + "reference": "https://github.com/hinablue/ComfyUI_3dPoseEditor", + "files": [ + "https://github.com/hinablue/ComfyUI_3dPoseEditor" + ], + "install_type": "git-clone", + "description": "Nodes:3D Pose Editor" + }, + { + "author": "chaojie", + "title": "ComfyUI-CameraCtrl-Wrapper", + "id": "cameractrl-wrapper", + "reference": "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper", + "files": [ + "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper" + ], + "install_type": "git-clone", + "description": "ComfyUI-CameraCtrl-Wrapper" + }, + { + "author": "chaojie", + "title": "ComfyUI-EasyAnimate", + "id": "easyanimate", + "reference": "https://github.com/chaojie/ComfyUI-EasyAnimate", + "files": [ + "https://github.com/chaojie/ComfyUI-EasyAnimate" + ], + "install_type": "git-clone", + "description": "ComfyUI-EasyAnimate" + }, + { + "author": "chaojie", + "title": "ComfyUI_StreamingT2V", + "id": "streamingt2v", + "reference": "https://github.com/chaojie/ComfyUI_StreamingT2V", + "files": [ + "https://github.com/chaojie/ComfyUI_StreamingT2V" + ], + "install_type": "git-clone", + "description": "ComfyUI_StreamingT2V" + }, + { + "author": "chaojie", + "title": "ComfyUI-Open-Sora-Plan", + "id": "opensora-plan", + "reference": "https://github.com/chaojie/ComfyUI-Open-Sora-Plan", + "files": [ + "https://github.com/chaojie/ComfyUI-Open-Sora-Plan" + ], + "install_type": "git-clone", + "description": "ComfyUI node for [a/Open-Sora-Plan](https://github.com/PKU-YuanGroup/Open-Sora-Plan)" + }, + { + "author": "chaojie", + "title": "ComfyUI-MuseTalk", + "id": "musetalk-chaojie", + "reference": "https://github.com/chaojie/ComfyUI-MuseTalk", + "files": [ + "https://github.com/chaojie/ComfyUI-MuseTalk" + ], + "install_type": "git-clone", + "description": "ComfyUI MuseTalk" + }, + { + "author": "chaojie", + "title": "ComfyUI-MuseV", + "id": "musev", + "reference": "https://github.com/chaojie/ComfyUI-MuseV", + "files": [ + "https://github.com/chaojie/ComfyUI-MuseV" + ], + "install_type": "git-clone", + "description": "ComfyUI MuseV" + }, + { + "author": "chaojie", + "title": "ComfyUI-AniPortrait", + "id": "aniportrait", + "reference": "https://github.com/chaojie/ComfyUI-AniPortrait", + "files": [ + "https://github.com/chaojie/ComfyUI-AniPortrait" + ], + "install_type": "git-clone", + "description": "ComfyUI [a/AniPortrait](https://github.com/Zejun-Yang/AniPortrait)" + }, + { + "author": "chaojie", + "title": "ComfyUI-Img2Img-Turbo", + "id": "img2img-turbo", + "reference": "https://github.com/chaojie/ComfyUI-Img2Img-Turbo", + "files": [ + "https://github.com/chaojie/ComfyUI-Img2Img-Turbo" + ], + "install_type": "git-clone", + "description": "ComfyUI Img2Img-Turbo" + }, + { + "author": "chaojie", + "title": "ComfyUI-Champ", + "id": "champ", + "reference": "https://github.com/chaojie/ComfyUI-Champ", + "files": [ + "https://github.com/chaojie/ComfyUI-Champ" + ], + "install_type": "git-clone", + "description": "ComfyUI Champ" + }, + { + "author": "chaojie", + "title": "ComfyUI-Open-Sora", + "id": "opensora", + "reference": "https://github.com/chaojie/ComfyUI-Open-Sora", + "files": [ + "https://github.com/chaojie/ComfyUI-Open-Sora" + ], + "install_type": "git-clone", + "description": "ComfyUI Open Sora\nNOTE:only supports Linux now" + }, + { + "author": "chaojie", + "title": "ComfyUI-Trajectory", + "id": "trajectory", + "reference": "https://github.com/chaojie/ComfyUI-Trajectory", + "files": [ + "https://github.com/chaojie/ComfyUI-Trajectory" + ], + "install_type": "git-clone", + "description": "ComfyUI Trajectory" + }, + { + "author": "chaojie", + "title": "ComfyUI-dust3r", + "id": "dust3r", + "reference": "https://github.com/chaojie/ComfyUI-dust3r", + "files": [ + "https://github.com/chaojie/ComfyUI-dust3r" + ], + "install_type": "git-clone", + "description": "ComfyUI dust3r" + }, + { + "author": "chaojie", + "title": "ComfyUI-Gemma", + "id": "gamma", + "reference": "https://github.com/chaojie/ComfyUI-Gemma", + "files": [ + "https://github.com/chaojie/ComfyUI-Gemma" + ], + "install_type": "git-clone", + "description": "ComfyUI Gemma" + }, + { + "author": "chaojie", + "title": "ComfyUI-DynamiCrafter", + "id": "dynamicrafter-chaojie", + "reference": "https://github.com/chaojie/ComfyUI-DynamiCrafter", + "files": [ + "https://github.com/chaojie/ComfyUI-DynamiCrafter" + ], + "install_type": "git-clone", + "description": "Better Dynamic, Higher Resolution, and Stronger Coherence!" + }, + { + "author": "chaojie", + "title": "ComfyUI-Panda3d", + "id": "panda3d", + "reference": "https://github.com/chaojie/ComfyUI-Panda3d", + "files": [ + "https://github.com/chaojie/ComfyUI-Panda3d" + ], + "install_type": "git-clone", + "description": "ComfyUI 3d engine" + }, + { + "author": "chaojie", + "title": "ComfyUI-Pymunk", + "id": "pymunk", + "reference": "https://github.com/chaojie/ComfyUI-Pymunk", + "files": [ + "https://github.com/chaojie/ComfyUI-Pymunk" + ], + "install_type": "git-clone", + "description": "Pymunk is a easy-to-use pythonic 2d physics library that can be used whenever you need 2d rigid body physics from Python" + }, + { + "author": "chaojie", + "title": "ComfyUI-MotionCtrl", + "id": "motionctrl", + "reference": "https://github.com/chaojie/ComfyUI-MotionCtrl", + "files": [ + "https://github.com/chaojie/ComfyUI-MotionCtrl" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of MotionCtrl [a/motionctrl.pth](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl.pth) and put it to ComfyUI/models/checkpoints" + }, + { + "author": "chaojie", + "title": "ComfyUI-Motion-Vector-Extractor", + "id": "motion-vector-extractor", + "reference": "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor", + "files": [ + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor" + ], + "install_type": "git-clone", + "description": "Nodes: that we currently provide the package only for x86-64 linux, such as Ubuntu or Debian, and Python 3.8, 3.9, and 3.10." + }, + { + "author": "chaojie", + "title": "ComfyUI-MotionCtrl-SVD", + "id": "motionctrl-svd", + "reference": "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD", + "files": [ + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of MotionCtrl-SVD [a/motionctrl_svd.ckpt](https://huggingface.co/TencentARC/MotionCtrl/blob/main/motionctrl_svd.ckpt) and put it to ComfyUI/models/checkpoints" + }, + { + "author": "chaojie", + "title": "ComfyUI-DragAnything", + "id": "draganything", + "reference": "https://github.com/chaojie/ComfyUI-DragAnything", + "files": [ + "https://github.com/chaojie/ComfyUI-DragAnything" + ], + "install_type": "git-clone", + "description": "DragAnything" + }, + { + "author": "chaojie", + "title": "ComfyUI-DragNUWA", + "id": "dragnuwa", + "reference": "https://github.com/chaojie/ComfyUI-DragNUWA", + "files": [ + "https://github.com/chaojie/ComfyUI-DragNUWA" + ], + "install_type": "git-clone", + "description": "Nodes: Download the weights of DragNUWA [a/drag_nuwa_svd.pth](https://drive.google.com/file/d/1Z4JOley0SJCb35kFF4PCc6N6P1ftfX4i/view) and put it to ComfyUI/models/checkpoints/drag_nuwa_svd.pth\n[w/Due to changes in the torch package and versions of many other packages, it may disrupt your installation environment.]" + }, + { + "author": "chaojie", + "title": "ComfyUI-Moore-AnimateAnyone", + "id": "moore-animateanyone", + "reference": "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone", + "files": [ + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone" + ], + "install_type": "git-clone", + "description": "Nodes: Run python tools/download_weights.py first to download weights automatically" + }, + { + "author": "chaojie", + "title": "ComfyUI-I2VGEN-XL", + "id": "i2vgen-xl", + "reference": "https://github.com/chaojie/ComfyUI-I2VGEN-XL", + "files": [ + "https://github.com/chaojie/ComfyUI-I2VGEN-XL" + ], + "install_type": "git-clone", + "description": "This is an implementation of [a/i2vgen-xl](https://github.com/ali-vilab/i2vgen-xl)" + }, + { + "author": "chaojie", + "title": "ComfyUI-LightGlue", + "id": "lightglue", + "reference": "https://github.com/chaojie/ComfyUI-LightGlue", + "files": [ + "https://github.com/chaojie/ComfyUI-LightGlue" + ], + "install_type": "git-clone", + "description": "This is an ComfyUI implementation of LightGlue to generate motion brush" + }, + { + "author": "chaojie", + "title": "ComfyUI-RAFT", + "id": "raft", + "reference": "https://github.com/chaojie/ComfyUI-RAFT", + "files": [ + "https://github.com/chaojie/ComfyUI-RAFT" + ], + "install_type": "git-clone", + "description": "This is an ComfyUI implementation of RAFT to generate motion brush" + }, + { + "author": "chaojie", + "title": "ComfyUI-LaVIT", + "id": "lavit", + "reference": "https://github.com/chaojie/ComfyUI-LaVIT", + "files": [ + "https://github.com/chaojie/ComfyUI-LaVIT" + ], + "install_type": "git-clone", + "description": "Nodes:VideoLaVITLoader, VideoLaVITT2V, VideoLaVITI2V, VideoLaVITI2VLong, VideoLaVITT2VLong, VideoLaVITI2I" + }, + { + "author": "chaojie", + "title": "ComfyUI-SimDA", + "id": "simda", + "reference": "https://github.com/chaojie/ComfyUI-SimDA", + "files": [ + "https://github.com/chaojie/ComfyUI-SimDA" + ], + "install_type": "git-clone", + "description": "Nodes:SimDATrain, SimDALoader, SimDARun, VHS_FILENAMES_STRING_SimDA" + }, + { + "author": "chaojie", + "title": "ComfyUI-Video-Editing-X-Attention", + "id": "video-editing-x-attention", + "reference": "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention", + "files": [ + "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention" + ], + "install_type": "git-clone", + "description": "Investigating the Effectiveness of Cross Attention to Unlock Zero-Shot Editing of Text-to-Video Diffusion Models" + }, + { + "author": "alexopus", + "title": "ComfyUI Image Saver", + "id": "image-saver", + "reference": "https://github.com/alexopus/ComfyUI-Image-Saver", + "files": [ + "https://github.com/alexopus/ComfyUI-Image-Saver" + ], + "install_type": "git-clone", + "description": "Allows you to save images with their generation metadata compatible with Civitai. Works with png, jpeg and webp. Stores LoRAs, models and embeddings hashes for resource recognition." + }, + { + "author": "kft334", + "title": "Knodes", + "id": "knodes", + "reference": "https://github.com/kft334/Knodes", + "files": [ + "https://github.com/kft334/Knodes" + ], + "install_type": "git-clone", + "description": "Nodes: Image(s) To Websocket (Base64), Load Image (Base64),Load Images (Base64)" + }, + { + "author": "MrForExample", + "title": "ComfyUI-3D-Pack", + "id": "3dpack", + "reference": "https://github.com/MrForExample/ComfyUI-3D-Pack", + "files": [ + "https://github.com/MrForExample/ComfyUI-3D-Pack" + ], + "nodename_pattern": "^\\[Comfy3D\\]", + "install_type": "git-clone", + "description": "An extensive node suite that enables ComfyUI to process 3D inputs (Mesh & UV Texture, etc) using cutting edge algorithms (3DGS, NeRF, etc.)\nNOTE: Pre-built python wheels can be download from [a/https://github.com/remsky/ComfyUI3D-Assorted-Wheels](https://github.com/remsky/ComfyUI3D-Assorted-Wheels)" + }, + { + "author": "Mr.ForExample", + "title": "ComfyUI-AnimateAnyone-Evolved", + "id": "animateanyone-evolved", + "reference": "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved", + "files": [ + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved" + ], + "nodename_pattern": "^\\[AnimateAnyone\\]", + "install_type": "git-clone", + "description": "Improved AnimateAnyone implementation that allows you to use the opse image sequence and reference image to generate stylized video.\nThe current goal of this project is to achieve desired pose2video result with 1+FPS on GPUs that are equal to or better than RTX 3080!🚀\n[w/The torch environment may be compromised due to version issues as some torch-related packages are being reinstalled.]" + }, + { + "author": "Hangover3832", + "title": "ComfyUI-Hangover-Nodes", + "reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes", + "files": [ + "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: MS kosmos-2 Interrogator, Save Image w/o Metadata, Image Scale Bounding Box. An implementation of Microsoft [a/kosmos-2](https://huggingface.co/microsoft/kosmos-2-patch14-224) image to text transformer." + }, + { + "author": "Hangover3832", + "title": "ComfyUI-Hangover-Moondream", + "reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream", + "files": [ + "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream" + ], + "install_type": "git-clone", + "description": "Moondream is a lightweight multimodal large language model.\n[w/WARN:Additional python code will be downloaded from huggingface and executed. You have to trust this creator if you want to use this node!]" + }, + { + "author": "Hangover3832", + "title": "Recognize Anything Model (RAM) for ComfyUI", + "reference": "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything", + "files": [ + "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything" + ], + "install_type": "git-clone", + "description": "This is an image recognition node for ComfyUI based on the RAM++ model from [a/xinyu1205](https://huggingface.co/xinyu1205).\nThis node outputs a string of tags with all the recognized objects and elements in the image in English or Chinese language.\nFor image tagging and captioning." + }, + { + "author": "tzwm", + "title": "ComfyUI Profiler", + "reference": "https://github.com/tzwm/comfyui-profiler", + "files": [ + "https://github.com/tzwm/comfyui-profiler" + ], + "install_type": "git-clone", + "description": "Calculate the execution time of all nodes." + }, + { + "author": "Daniel Lewis", + "title": "ComfyUI-Llama", + "reference": "https://github.com/daniel-lewis-ab/ComfyUI-Llama", + "files": [ + "https://github.com/daniel-lewis-ab/ComfyUI-Llama" + ], + "install_type": "git-clone", + "description": "This is a set of nodes to interact with llama-cpp-python" + }, + { + "author": "Daniel Lewis", + "title": "ComfyUI-TTS", + "reference": "https://github.com/daniel-lewis-ab/ComfyUI-TTS", + "files": [ + "https://github.com/daniel-lewis-ab/ComfyUI-TTS" + ], + "install_type": "git-clone", + "description": "Text To Speech (TTS) for ComfyUI" + }, + { + "author": "djbielejeski", + "title": "a-person-mask-generator", + "reference": "https://github.com/djbielejeski/a-person-mask-generator", + "files": [ + "https://github.com/djbielejeski/a-person-mask-generator" + ], + "install_type": "git-clone", + "description": "Extension for Automatic1111 and ComfyUI to automatically create masks for Background/Hair/Body/Face/Clothes in Img2Img" + }, + { + "author": "smagnetize", + "title": "kb-comfyui-nodes", + "reference": "https://github.com/smagnetize/kb-comfyui-nodes", + "files": [ + "https://github.com/smagnetize/kb-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:SingleImageDataUrlLoader" + }, + { + "author": "ginlov", + "title": "segment_to_mask_comfyui", + "reference": "https://github.com/ginlov/segment_to_mask_comfyui", + "files": [ + "https://github.com/ginlov/segment_to_mask_comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:SegToMask" + }, + { + "author": "glowcone", + "title": "Load Image From Base64 URI", + "reference": "https://github.com/glowcone/comfyui-base64-to-image", + "files": [ + "https://github.com/glowcone/comfyui-base64-to-image" + ], + "install_type": "git-clone", + "description": "Nodes: LoadImageFromBase64. Loads an image and its transparency mask from a base64-encoded data URI for easy API connection." + }, + { + "author": "AInseven", + "title": "ComfyUI-fastblend", + "reference": "https://github.com/AInseven/ComfyUI-fastblend", + "files": [ + "https://github.com/AInseven/ComfyUI-fastblend" + ], + "install_type": "git-clone", + "description": "fastblend for comfyui, and other nodes that I write for video2video. rebatch image, my openpose" + }, + { + "author": "HebelHuber", + "title": "comfyui-enhanced-save-node", + "reference": "https://github.com/HebelHuber/comfyui-enhanced-save-node", + "files": [ + "https://github.com/HebelHuber/comfyui-enhanced-save-node" + ], + "install_type": "git-clone", + "description": "Nodes:Enhanced Save Node" + }, + { + "author": "LarryJane491", + "title": "Lora-Training-in-Comfy", + "reference": "https://github.com/LarryJane491/Lora-Training-in-Comfy", + "files": [ + "https://github.com/LarryJane491/Lora-Training-in-Comfy" + ], + "install_type": "git-clone", + "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!" + }, + { + "author": "LarryJane491", + "title": "Image-Captioning-in-ComfyUI", + "reference": "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI", + "files": [ + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI" + ], + "install_type": "git-clone", + "description": "The LoRA Caption custom nodes, just like their name suggests, allow you to caption images so they are ready for LoRA training." + }, + { + "author": "Layer-norm", + "title": "Comfyui lama remover", + "reference": "https://github.com/Layer-norm/comfyui-lama-remover", + "files": [ + "https://github.com/Layer-norm/comfyui-lama-remover" + ], + "install_type": "git-clone", + "description": "A very simple ComfyUI node to remove item with mask." + }, + { + "author": "Taremin", + "title": "ComfyUI Prompt ExtraNetworks", + "reference": "https://github.com/Taremin/comfyui-prompt-extranetworks", + "files": [ + "https://github.com/Taremin/comfyui-prompt-extranetworks" + ], + "install_type": "git-clone", + "description": "Instead of LoraLoader or HypernetworkLoader, it receives a prompt and loads and applies LoRA or HN based on the specifications within the prompt. The main purpose of this custom node is to allow changes without reconnecting the LoraLoader node when the prompt is randomly altered, etc." + }, + { + "author": "Taremin", + "title": "ComfyUI String Tools", + "reference": "https://github.com/Taremin/comfyui-string-tools", + "files": [ + "https://github.com/Taremin/comfyui-string-tools" + ], + "install_type": "git-clone", + "description": " This extension provides the StringToolsConcat node, which concatenates multiple texts, and the StringToolsRandomChoice node, which selects one randomly from multiple texts." + }, + { + "author": "Taremin", + "title": "WebUI Monaco Prompt", + "reference": "https://github.com/Taremin/webui-monaco-prompt", + "files": [ + "https://github.com/Taremin/webui-monaco-prompt" + ], + "install_type": "git-clone", + "description": "Make it possible to edit the prompt using the Monaco Editor, an editor implementation used in VSCode.\nNOTE: This extension supports both ComfyUI and A1111 simultaneously." + }, + { + "author": "foxtrot-roger", + "title": "RF Nodes", + "reference": "https://github.com/foxtrot-roger/comfyui-rf-nodes", + "files": [ + "https://github.com/foxtrot-roger/comfyui-rf-nodes" + ], + "install_type": "git-clone", + "description": "A bunch of nodes that can be useful to manipulate primitive types (numbers, text, ...) Also some helpers to generate text and timestamps." + }, + { + "author": "abyz22", + "title": "image_control", + "reference": "https://github.com/abyz22/image_control", + "files": [ + "https://github.com/abyz22/image_control" + ], + "install_type": "git-clone", + "description": "Nodes:abyz22_Padding Image, abyz22_ImpactWildcardEncode, abyz22_setimageinfo, abyz22_SaveImage, abyz22_ImpactWildcardEncode_GetPrompt, abyz22_SetQueue, abyz22_drawmask, abyz22_FirstNonNull, abyz22_blendimages, abyz22_blend_onecolor. Please check workflow in [a/https://github.com/abyz22/image_control](https://github.com/abyz22/image_control)" + }, + { + "author": "HAL41", + "title": "ComfyUI aichemy nodes", + "reference": "https://github.com/HAL41/ComfyUI-aichemy-nodes", + "files": [ + "https://github.com/HAL41/ComfyUI-aichemy-nodes" + ], + "install_type": "git-clone", + "description": "Simple node to handle scaling of YOLOv8 segmentation masks" + }, + { + "author": "nkchocoai", + "title": "ComfyUI-SizeFromPresets", + "reference": "https://github.com/nkchocoai/ComfyUI-SizeFromPresets", + "files": [ + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets" + ], + "install_type": "git-clone", + "description": "Add a node that outputs width and height of the size selected from the preset (.csv)." + }, + { + "author": "nkchocoai", + "title": "ComfyUI-PromptUtilities", + "reference": "https://github.com/nkchocoai/ComfyUI-PromptUtilities", + "files": [ + "https://github.com/nkchocoai/ComfyUI-PromptUtilities" + ], + "install_type": "git-clone", + "description": "Nodes: Format String, Join String List, Load Preset, Load Preset (Advanced), Const String, Const String (multi line). Add useful nodes related to prompt." + }, + { + "author": "nkchocoai", + "title": "ComfyUI-TextOnSegs", + "reference": "https://github.com/nkchocoai/ComfyUI-TextOnSegs", + "files": [ + "https://github.com/nkchocoai/ComfyUI-TextOnSegs" + ], + "install_type": "git-clone", + "description": "Add a node for drawing text with CR Draw Text of ComfyUI_Comfyroll_CustomNodes to the area of SEGS detected by Ultralytics Detector of ComfyUI-Impact-Pack." + }, + { + "author": "nkchocoai", + "title": "ComfyUI-SaveImageWithMetaData", + "reference": "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData", + "files": [ + "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData" + ], + "install_type": "git-clone", + "description": "Add a node to save images with metadata (PNGInfo) extracted from the input values of each node.\nSince the values are extracted dynamically, values output by various extension nodes can be added to metadata." + }, + { + "author": "nkchocoai", + "title": "ComfyUI-Dart", + "id": "dart", + "reference": "https://github.com/nkchocoai/ComfyUI-Dart", + "files": [ + "https://github.com/nkchocoai/ComfyUI-Dart" + ], + "install_type": "git-clone", + "description": "Add nodes that generates danbooru tags by [a/Dart(Danbooru Tags Transformer)](https://huggingface.co/p1atdev/dart-v1-sft)." + }, + { + "author": "JaredTherriault", + "title": "ComfyUI-JNodes", + "id": "jnodes", + "reference": "https://github.com/JaredTherriault/ComfyUI-JNodes", + "files": [ + "https://github.com/JaredTherriault/ComfyUI-JNodes" + ], + "install_type": "git-clone", + "description": "python and web UX improvements for ComfyUI: Lora/Embedding picker, web extension manager (enable/disable any extension without disabling python nodes), control any parameter with text prompts, image and video viewer, metadata viewer, token counter, comments in prompts, font control, and more! \n[w/'ImageFeed.js' from the custom scripts of pythongosssss is not compatible with this suite's ImageDrawer feature. Additionally, 'DynamicPrompts.js' and 'EditAttention.js' from the core, along with 'favicon.js' from the custom scripts of pythongosssss, are incompatible with advanced features of the suite. Please use the JNodes Extension Management setting in Settings > JNodes > Extension Management to disable these extensions by unchecking them to use the full functionality of the suite.]" + }, + { + "author": "prozacgod", + "title": "ComfyUI Multi-Workspace", + "id": "multi-workspace", + "reference": "https://github.com/prozacgod/comfyui-pzc-multiworkspace", + "files": [ + "https://github.com/prozacgod/comfyui-pzc-multiworkspace" + ], + "install_type": "git-clone", + "description": "A simple, quick, and dirty implementation of multiple workspaces within ComfyUI." + }, + { + "author": "Siberpone", + "title": "Lazy Pony Prompter", + "id": "lazy-pony-prompter", + "reference": "https://github.com/Siberpone/lazy-pony-prompter", + "files": [ + "https://github.com/Siberpone/lazy-pony-prompter" + ], + "install_type": "git-clone", + "description": "A booru API powered prompt generator for A1111 and ComfyUI with flexible tag filtering system and customizable prompt templates." + }, + { + "author": "dave-palt", + "title": "comfyui_DSP_imagehelpers", + "id": "dsp-imagehelpers", + "reference": "https://github.com/dave-palt/comfyui_DSP_imagehelpers", + "files": [ + "https://github.com/dave-palt/comfyui_DSP_imagehelpers" + ], + "install_type": "git-clone", + "description": "Nodes: DSP Image Concat" + }, + { + "author": "Inzaniak", + "title": "Ranbooru for ComfyUI", + "id": "ranbooru", + "reference": "https://github.com/Inzaniak/comfyui-ranbooru", + "files": [ + "https://github.com/Inzaniak/comfyui-ranbooru" + ], + "install_type": "git-clone", + "description": "Ranbooru is an extension for the comfyUI. The purpose of this extension is to add a node that gets a random set of tags from boorus pictures. This is mostly being used to help me test my checkpoints on a large variety of" + }, + { + "author": "miosp", + "title": "ComfyUI-FBCNN", + "id": "fbcnn", + "reference": "https://github.com/Miosp/ComfyUI-FBCNN", + "files": [ + "https://github.com/Miosp/ComfyUI-FBCNN" + ], + "install_type": "git-clone", + "description": "A node for JPEG de-artifacting using [a/FBCNN](https://github.com/jiaxi-jiang/FBCNN)." + }, + { + "author": "JcandZero", + "title": "ComfyUI_GLM4Node", + "id": "glm4node", + "reference": "https://github.com/JcandZero/ComfyUI_GLM4Node", + "files": [ + "https://github.com/JcandZero/ComfyUI_GLM4Node" + ], + "install_type": "git-clone", + "description": "GLM4 Vision Integration" + }, + { + "author": "darkpixel", + "title": "DarkPrompts", + "id": "darkprompts", + "reference": "https://github.com/darkpixel/darkprompts", + "files": [ + "https://github.com/darkpixel/darkprompts" + ], + "install_type": "git-clone", + "description": "Slightly better random prompt generation tools that allow combining and picking prompts from both file and text input sources." + }, + { + "author": "shiimizu", + "title": "ComfyUI PhotoMaker Plus", + "id": "photomaker-plus", + "reference": "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus", + "files": [ + "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus" + ], + "install_type": "git-clone", + "description": "ComfyUI reference implementation for [a/PhotoMaker](https://github.com/TencentARC/PhotoMaker) models. [w/WARN:The repository name has been changed. For those who have previously installed it, please delete custom_nodes/ComfyUI-PhotoMaker from disk and reinstall this.]" + }, + { + "author": "yytdfc", + "title": "Amazon Bedrock nodes for ComfyUI", + "id": "bedrock", + "reference": "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock", + "files": [ + "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock" + ], + "pip": ["boto3"], + "install_type": "git-clone", + "description": "Amazon Bedrock is a fully managed service that offers a choice of high-performing foundation models (FMs) from leading AI companies. This repo is the ComfyUI nodes for Bedrock service. You could invoke the foundation model in your ComfyUI pipeline." + }, + { + "author": "Qais Malkawi", + "title": "ComfyUI-Qais-Helper", + "id": "qais-helper", + "reference": "https://github.com/QaisMalkawi/ComfyUI-QaisHelper", + "files": [ + "https://github.com/QaisMalkawi/ComfyUI-QaisHelper" + ], + "install_type": "git-clone", + "description": "This Extension adds a few custom QOL nodes that ComfyUI lacks by default." + }, + { + "author": "longgui0318", + "title": "comfyui-mask-util", + "id": "mask-util", + "reference": "https://github.com/longgui0318/comfyui-mask-util", + "files": [ + "https://github.com/longgui0318/comfyui-mask-util" + ], + "install_type": "git-clone", + "description": "Nodes:Split Masks, Mask Selection Of Masks, Mask Region Info" + }, + { + "author": "longgui0318", + "title": "comfyui-llm-assistant", + "id": "llm-assistant", + "reference": "https://github.com/longgui0318/comfyui-llm-assistant", + "files": [ + "https://github.com/longgui0318/comfyui-llm-assistant" + ], + "install_type": "git-clone", + "description": "Nodes:Generate Stable Diffsution Prompt With LLM, Translate Text With LLM, Chat With LLM" + }, + { + "author": "longgui0318", + "title": "comfyui-oms-diffusion", + "id": "oms-diffusion", + "reference": "https://github.com/longgui0318/comfyui-oms-diffusion", + "files": [ + "https://github.com/longgui0318/comfyui-oms-diffusion" + ], + "install_type": "git-clone", + "description": "Nodes:Extract Features With Unet, Additional Features With Attention" + }, + { + "author": "longgui0318", + "title": "comfyui-magic-clothing", + "id": "magic-clothing", + "reference": "https://github.com/longgui0318/comfyui-magic-clothing", + "files": [ + "https://github.com/longgui0318/comfyui-magic-clothing" + ], + "install_type": "git-clone", + "description": "The comfyui supported version of the [a/Magic Clothing](https://github.com/ShineChen1024/MagicClothing) project, not the diffusers version, allows direct integration with modules such as ipadapter" + }, + { + "author": "longgui0318", + "title": "comfyui-common-util", + "id": "common-util", + "reference": "https://github.com/longgui0318/comfyui-common-util", + "files": [ + "https://github.com/longgui0318/comfyui-common-util" + ], + "install_type": "git-clone", + "description": "Nodes:Init Layer Info Array, Added Layer Info To Array, Layer Info Array Fuse, Layer Image Seleted, Layer Images IPAdapter Advanced, Enhanced Random Light Source" + }, + { + "author": "DimaChaichan", + "title": "LAizypainter-Exporter-ComfyUI", + "reference": "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI", + "files": [ + "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI" + ], + "install_type": "git-clone", + "description": "This exporter is a plugin for ComfyUI, which can export tasks for [a/LAizypainter](https://github.com/DimaChaichan/LAizypainter).\nLAizypainter is a Photoshop plugin with which you can send tasks directly to a Stable Diffusion server. More information about a [a/Task](https://github.com/DimaChaichan/LAizypainter?tab=readme-ov-file#task)" + }, + { + "author": "adriflex", + "title": "ComfyUI_Blender_Texdiff", + "id": "blender-texdiff", + "reference": "https://github.com/adriflex/ComfyUI_Blender_Texdiff", + "files": [ + "https://github.com/adriflex/ComfyUI_Blender_Texdiff" + ], + "install_type": "git-clone", + "description": "Nodes:Blender viewport color, Blender Viewport depth" + }, + { + "author": "Shraknard", + "title": "ComfyUI-Remover", + "id": "remover", + "reference": "https://github.com/Shraknard/ComfyUI-Remover", + "files": [ + "https://github.com/Shraknard/ComfyUI-Remover" + ], + "install_type": "git-clone", + "description": "Custom node for ComfyUI that makes parts of the image transparent (face, background...)" + }, + { + "author": "FlyingFireCo", + "title": "tiled_ksampler", + "reference": "https://github.com/FlyingFireCo/tiled_ksampler", + "files": [ + "https://github.com/FlyingFireCo/tiled_ksampler" + ], + "install_type": "git-clone", + "description": "Nodes:Tiled KSampler, Asymmetric Tiled KSampler, Circular VAEDecode." + }, + { + "author": "Nlar", + "title": "ComfyUI_CartoonSegmentation", + "id": "cartoon-seg", + "reference": "https://github.com/Nlar/ComfyUI_CartoonSegmentation", + "files": [ + "https://github.com/Nlar/ComfyUI_CartoonSegmentation" + ], + "install_type": "git-clone", + "description": "Front end ComfyUI nodes for CartoonSegmentation Based upon the work of the CartoonSegmentation repository this project will provide a front end to some of the features." + }, + { + "author": "godspede", + "title": "ComfyUI Substring", + "id": "substring", + "reference": "https://github.com/godspede/ComfyUI_Substring", + "files": [ + "https://github.com/godspede/ComfyUI_Substring" + ], + "install_type": "git-clone", + "description": "Just a simple substring node that takes text and length as input, and outputs the first length characters." + }, + { + "author": "gokayfem", + "title": "VLM_nodes", + "id": "vlm", + "reference": "https://github.com/gokayfem/ComfyUI_VLM_nodes", + "files": [ + "https://github.com/gokayfem/ComfyUI_VLM_nodes" + ], + "install_type": "git-clone", + "description": "Custom Nodes for Vision Language Models (VLM) , Large Language Models (LLM), Image Captioning, Automatic Prompt Generation, Creative and Consistent Prompt Suggestion, Keyword Extraction" + }, + { + "author": "gokayfem", + "title": "ComfyUI-Dream-Interpreter", + "id": "dream-interpreter", + "reference": "https://github.com/gokayfem/ComfyUI-Dream-Interpreter", + "files": [ + "https://github.com/gokayfem/ComfyUI-Dream-Interpreter" + ], + "install_type": "git-clone", + "description": "Tell your dream and it interprets it and puts you inside your dream" + }, + { + "author": "gokayfem", + "title": "ComfyUI-Depth-Visualization", + "id": "delpth-visualization", + "reference": "https://github.com/gokayfem/ComfyUI-Depth-Visualization", + "files": [ + "https://github.com/gokayfem/ComfyUI-Depth-Visualization" + ], + "install_type": "git-clone", + "description": "Works with any Depth Map and visualizes the applied version it inside ComfyUI" + }, + { + "author": "gokayfem", + "title": "ComfyUI-Texture-Simple", + "id": "texture-simple", + "reference": "https://github.com/gokayfem/ComfyUI-Texture-Simple", + "files": [ + "https://github.com/gokayfem/ComfyUI-Texture-Simple" + ], + "install_type": "git-clone", + "description": "Visualize your textures inside ComfyUI" + }, + { + "author": "Hiero207", + "title": "Hiero-Nodes", + "id": "hiero", + "reference": "https://github.com/Hiero207/ComfyUI-Hiero-Nodes", + "files": [ + "https://github.com/Hiero207/ComfyUI-Hiero-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Post to Discord w/ Webhook" + }, + { + "author": "azure-dragon-ai", + "title": "ComfyUI-ClipScore-Nodes", + "id": "clipscore", + "reference": "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes", + "files": [ + "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:ImageScore, Loader, Image Processor, Real Image Processor, Fake Image Processor, Text Processor. ComfyUI Nodes for ClipScore" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI Whisper", + "id": "whisper", + "reference": "https://github.com/yuvraj108c/ComfyUI-Whisper", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-Whisper" + ], + "install_type": "git-clone", + "description": "Transcribe audio and add subtitles to videos using Whisper in ComfyUI" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI-Pronodes", + "id": "pronodes", + "reference": "https://github.com/yuvraj108c/ComfyUI-Pronodes", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-Pronodes" + ], + "install_type": "git-clone", + "description": "A collection of nice utility nodes for ComfyUI" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI-Vsgan", + "id": "vsgan", + "reference": "https://github.com/yuvraj108c/ComfyUI-Vsgan", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-Vsgan" + ], + "install_type": "git-clone", + "description": "Nodes:Upscale Video Tensorrt" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI Depth Anything TensorRT", + "id": "depth-anything-tensorrt", + "reference": "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt" + ], + "install_type": "git-clone", + "description": "This extension provides a ComfyUI Custom Node implementation of the [a/Depth-Anything-Tensorrt](https://github.com/spacewalk01/depth-anything-tensorrt) in Python for ultra fast depth map generation" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI PiperTTS", + "id": "pipertts", + "reference": "https://github.com/yuvraj108c/ComfyUI-PiperTTS", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-PiperTTS" + ], + "install_type": "git-clone", + "description": "Convert Text-to-Speech inside ComfyUI using [a/Piper](https://github.com/rhasspy/piper)" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI Upscaler TensorRT", + "id": "upscaler-tensorrt", + "reference": "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt" + ], + "install_type": "git-clone", + "description": "This project provides a Tensorrt implementation for fast image upscaling inside ComfyUI (3-4x faster)" + }, + { + "author": "yuvraj108c", + "title": "ComfyUI YoloNasPose Tensorrt", + "id": "yolonaspose-tensorrt", + "reference": "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt" + ], + "install_type": "git-clone", + "description": "This repo provides a ComfyUI Custom Node implementation of [a/YOLO-NAS-POSE](https://github.com/Deci-AI/super-gradients), powered by TensorRT for ultra fast pose estimation. It has been adapted to work with openpose controlnet (experimental)" + }, + { + "author": "blepping", + "title": "ComfyUI-bleh", + "id": "bleh", + "reference": "https://github.com/blepping/ComfyUI-bleh", + "files": [ + "https://github.com/blepping/ComfyUI-bleh" + ], + "install_type": "git-clone", + "description": "Better TAESD previews, BlehHyperTile." + }, + { + "author": "blepping", + "title": "ComfyUI-sonar", + "id": "sonar", + "reference": "https://github.com/blepping/ComfyUI-sonar", + "files": [ + "https://github.com/blepping/ComfyUI-sonar" + ], + "install_type": "git-clone", + "description": "A janky implementation of Sonar sampling (momentum-based sampling) for ComfyUI." + }, + { + "author": "blepping", + "title": "ComfyUI jank HiDiffusion", + "id": "jank-hidiffusion", + "reference": "https://github.com/blepping/comfyui_jankhidiffusion", + "files": [ + "https://github.com/blepping/comfyui_jankhidiffusion" + ], + "install_type": "git-clone", + "description": "Janky experimental attempt at implementing [a/HiDiffusion](https://github.com/megvii-research/HiDiffusion) for ComfyUI." + }, + { + "author": "JerryOrbachJr", + "title": "Random Size", + "reference": "https://github.com/JerryOrbachJr/ComfyUI-RandomSize", + "files": [ + "https://github.com/JerryOrbachJr/ComfyUI-RandomSize" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node that randomly selects a height and width pair from a list in a config file" + }, + { + "author": "jamal-alkharrat", + "title": "ComfyUI_rotate_image", + "reference": "https://github.com/jamal-alkharrat/ComfyUI_rotate_image", + "files": [ + "https://github.com/jamal-alkharrat/ComfyUI_rotate_image" + ], + "install_type": "git-clone", + "description": "ComfyUI Custom Node to Rotate Images, Img2Img node." + }, + { + "author": "mape", + "title": "mape's helpers", + "id": "mape-helpers", + "reference": "https://github.com/mape/ComfyUI-mape-Helpers", + "files": [ + "https://github.com/mape/ComfyUI-mape-Helpers" + ], + "install_type": "git-clone", + "description": "Multi-monitor image preview, Variable Assigment/Wireless Nodes, Prompt Tweaking, Command Palette, Pinned favourite nodes, Node navigation, Fuzzy search, Node time tracking, Organizing and Error management. For more info visit: [a/https://comfyui.ma.pe/](https://comfyui.ma.pe/)" + }, + { + "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." + }, + { + "author": "zhongpei", + "title": "ComfyUI for InstructIR", + "id": "instructir", + "reference": "https://github.com/zhongpei/ComfyUI-InstructIR", + "files": [ + "https://github.com/zhongpei/ComfyUI-InstructIR" + ], + "install_type": "git-clone", + "description": "Enhancing Image Restoration. (ref:[a/InstructIR](https://github.com/mv-lab/InstructIR))" + }, + { + "author": "Loewen-Hob", + "title": "Rembg Background Removal Node for ComfyUI (Better)", + "id": "rembg-better", + "reference": "https://github.com/Loewen-Hob/rembg-comfyui-node-better", + "files": [ + "https://github.com/Loewen-Hob/rembg-comfyui-node-better" + ], + "install_type": "git-clone", + "description": "This custom node is based on the [a/rembg-comfyui-node](https://github.com/Jcd1230/rembg-comfyui-node) but provides additional functionality to select ONNX models." + }, + { + "author": "HaydenReeve", + "title": "ComfyUI Better Strings", + "id": "better-string", + "reference": "https://github.com/HaydenReeve/ComfyUI-Better-Strings", + "files": [ + "https://github.com/HaydenReeve/ComfyUI-Better-Strings" + ], + "install_type": "git-clone", + "description": "Strings should be easy, and simple. This extension aims to provide a set of nodes that make working with strings in ComfyUI a little bit easier." + }, + { + "author": "StartHua", + "title": "ComfyUI_Seg_VITON", + "id": "seg-viton", + "reference": "https://github.com/StartHua/ComfyUI_Seg_VITON", + "files": [ + "https://github.com/StartHua/ComfyUI_Seg_VITON" + ], + "install_type": "git-clone", + "description": "Nodes:segformer_clothes, segformer_agnostic, segformer_remove_bg, stabel_vition. Nodes for model dress up." + }, + { + "author": "StartHua", + "title": "Comfyui_joytag", + "id": "joytag", + "reference": "https://github.com/StartHua/Comfyui_joytag", + "files": [ + "https://github.com/StartHua/Comfyui_joytag" + ], + "install_type": "git-clone", + "description": "JoyTag is a state of the art AI vision model for tagging images, with a focus on sex positivity and inclusivity. It uses the Danbooru tagging schema, but works across a wide range of images, from hand drawn to photographic.\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/fancyfeast/joytag/tree/main](https://huggingface.co/fancyfeast/joytag/tree/main)" + }, + { + "author": "StartHua", + "title": "comfyui_segformer_b2_clothes", + "id": "segformer-b2-clothes", + "reference": "https://github.com/StartHua/Comfyui_segformer_b2_clothes", + "files": [ + "https://github.com/StartHua/Comfyui_segformer_b2_clothes" + ], + "install_type": "git-clone", + "description": "SegFormer model fine-tuned on ATR dataset for clothes segmentation but can also be used for human segmentation!\nDownload the weight and put it under checkpoints: [a/https://huggingface.co/mattmdjaga/segformer_b2_clothes](https://huggingface.co/mattmdjaga/segformer_b2_clothes)" + }, + { + "author": "StartHua", + "title": "ComfyUI_OOTDiffusion_CXH", + "id": "ootdiffusion-cxh", + "reference": "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH", + "files": [ + "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH" + ], + "install_type": "git-clone", + "description": "Nodes:Ood_hd_CXH, Ood_hd_CXH. [a/OOTDiffusion](https://github.com/levihsu/OOTDiffusion)" + }, + { + "author": "StartHua", + "title": "ComfyUI_PCDMs", + "id": "pcdms", + "reference": "https://github.com/StartHua/ComfyUI_PCDMs", + "files": [ + "https://github.com/StartHua/ComfyUI_PCDMs" + ], + "install_type": "git-clone", + "description": "Original project: [a/link](https://github.com/tencent-ailab/PCDMs)\nBased on testing, the author's original images work very well, but using my own images generally requires some luck!" + }, + { + "author": "ricklove", + "title": "comfyui-ricklove", + "id": "ricklove", + "reference": "https://github.com/ricklove/comfyui-ricklove", + "files": [ + "https://github.com/ricklove/comfyui-ricklove" + ], + "install_type": "git-clone", + "description": "Nodes: Image Crop and Resize by Mask, Image Uncrop, Image Shadow, Optical Flow (Dip), Warp Image with Flow, Image Threshold (Channels), Finetune Variable, Finetune Analyze, Finetune Analyze Batch, ... Misc ComfyUI nodes by Rick Love" + }, + { + "author": "nosiu", + "title": "ComfyUI InstantID Faceswapper", + "id": "instantid-faceswapper", + "reference": "https://github.com/nosiu/comfyui-instantId-faceswap", + "files": [ + "https://github.com/nosiu/comfyui-instantId-faceswap" + ], + "install_type": "git-clone", + "description": "Implementation of [a/faceswap](https://github.com/nosiu/InstantID-faceswap/tree/main) based on [a/InstantID](https://github.com/InstantID/InstantID) for ComfyUI. Allows usage of [a/LCM Lora](https://huggingface.co/latent-consistency/lcm-lora-sdxl) which can produce good results in only a few generation steps.\nNOTE:Works ONLY with SDXL checkpoints." + }, + { + "author": "LyazS", + "title": "Anime Character Segmentation node for comfyui", + "reference": "https://github.com/LyazS/comfyui-anime-seg", + "files": [ + "https://github.com/LyazS/comfyui-anime-seg" + ], + "install_type": "git-clone", + "description": "A Anime Character Segmentation node for comfyui, based on [this hf space](https://huggingface.co/spaces/skytnt/anime-remove-background)." + }, + { + "author": "Chan-0312", + "title": "ComfyUI-IPAnimate", + "reference": "https://github.com/Chan-0312/ComfyUI-IPAnimate", + "files": [ + "https://github.com/Chan-0312/ComfyUI-IPAnimate" + ], + "install_type": "git-clone", + "description": "This is a project that generates videos frame by frame based on IPAdapter+ControlNet. Unlike [a/Steerable-motion](https://github.com/banodoco/Steerable-Motion), we do not rely on AnimateDiff. This decision is primarily due to the fact that the videos generated by AnimateDiff are often blurry. Through frame-by-frame control using IPAdapter+ControlNet, we can produce higher definition and more controllable videos." + }, + { + "author": "Chan-0312", + "title": "ComfyUI-EasyDeforum", + "reference": "https://github.com/Chan-0312/ComfyUI-EasyDeforum", + "files": [ + "https://github.com/Chan-0312/ComfyUI-EasyDeforum" + ], + "install_type": "git-clone", + "description": "Nodes:Easy2DDeforum (Chan)" + }, + { + "author": "trumanwong", + "title": "ComfyUI-NSFW-Detection", + "reference": "https://github.com/trumanwong/ComfyUI-NSFW-Detection", + "files": [ + "https://github.com/trumanwong/ComfyUI-NSFW-Detection" + ], + "install_type": "git-clone", + "description": "An implementation of NSFW Detection for ComfyUI" + }, + { + "author": "TemryL", + "title": "ComfyS3", + "reference": "https://github.com/TemryL/ComfyS3", + "files": [ + "https://github.com/TemryL/ComfyS3" + ], + "install_type": "git-clone", + "description": "ComfyS3 seamlessly integrates with [a/Amazon S3](https://aws.amazon.com/en/s3/) in ComfyUI. This open-source project provides custom nodes for effortless loading and saving of images, videos, and checkpoint models directly from S3 buckets within the ComfyUI graph interface." + }, + { + "author": "MaraScott", + "title": "🐰 MaraScott Nodes", + "id": "marascott-nodes", + "reference": "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes", + "files": [ + "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes" + ], + "install_type": "git-clone", + "description": "A set of nodes including a universal bus, an Inpainting By Mask and a large Upscaler/Refiner\n[AnyBus,McInpainty,McBoaty]" + }, + { + "author": "yffyhk", + "title": "comfyui_auto_danbooru", + "reference": "https://github.com/yffyhk/comfyui_auto_danbooru", + "files": [ + "https://github.com/yffyhk/comfyui_auto_danbooru" + ], + "install_type": "git-clone", + "description": "Nodes: Get Danbooru, Tag Encode" + }, + { + "author": "dfl", + "title": "CLIP with BREAK syntax", + "reference": "https://github.com/dfl/comfyui-clip-with-break", + "files": [ + "https://github.com/dfl/comfyui-clip-with-break" + ], + "install_type": "git-clone", + "description": "Clip text encoder with BREAK formatting like A1111 (uses conditioning concat)" + }, + { + "author": "dfl", + "title": "ComfyUI-TCD-scheduler", + "id": "dfl-tcd", + "reference": "https://github.com/dfl/comfyui-tcd-scheduler", + "files": [ + "https://github.com/dfl/comfyui-tcd-scheduler" + ], + "install_type": "git-clone", + "description": "ComfyUI Custom Sampler nodes that implement Zheng et al.'s Trajectory Consistency Distillation based on [a/https://mhh0318.github.io/tcd](https://mhh0318.github.io/tcd)" + }, + { + "author": "antrobot", + "title": "antrobots ComfyUI Nodepack", + "reference": "https://github.com/antrobot1234/antrobots-comfyUI-nodepack", + "files": [ + "https://github.com/antrobot1234/antrobots-comfyUI-nodepack" + ], + "install_type": "git-clone", + "description": "A small node pack containing various things I felt like ought to be in base comfy-UI. Currently includes Some image handling nodes to help with inpainting, a version of KSampler (advanced) that allows for denoise, and a node that can swap it's inputs. Remember to make an issue if you experience any bugs or errors!" + }, + { + "author": "bilal-arikan", + "title": "ComfyUI_TextAssets", + "reference": "https://github.com/bilal-arikan/ComfyUI_TextAssets", + "files": [ + "https://github.com/bilal-arikan/ComfyUI_TextAssets" + ], + "install_type": "git-clone", + "description": "With this node you can upload text files to input folder from your local computer." + }, + { + "author": "kadirnar", + "title": "ComfyUI-Transformers", + "id": "comfy-transformers", + "reference": "https://github.com/kadirnar/ComfyUI-Transformers", + "files": [ + "https://github.com/kadirnar/ComfyUI-Transformers" + ], + "install_type": "git-clone", + "description": "ComfyUI-Transformers is a cutting-edge project combining the power of computer vision and natural language processing to create intuitive and user-friendly interfaces. Our goal is to make technology more accessible and engaging." + }, + { + "author": "kadirnar", + "title": "ComfyUI-YOLO", + "id": "comfy-yolo", + "reference": "https://github.com/kadirnar/ComfyUI-YOLO", + "files": [ + "https://github.com/kadirnar/ComfyUI-YOLO" + ], + "install_type": "git-clone", + "description": "Ultralytics-Powered Object Recognition for ComfyUI" + }, + { + "author": "digitaljohn", + "title": "ComfyUI-ProPost", + "reference": "https://github.com/digitaljohn/comfyui-propost", + "files": [ + "https://github.com/digitaljohn/comfyui-propost" + ], + "install_type": "git-clone", + "description": "A set of custom ComfyUI nodes for performing basic post-processing effects including Film Grain and Vignette. These effects can help to take the edge off AI imagery and make them feel more natural." + }, + { + "author": "DonBaronFactory", + "title": "ComfyUI-Cre8it-Nodes", + "reference": "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes", + "files": [ + "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:CRE8IT Serial Prompter, CRE8IT Apply Serial Prompter, CRE8IT Image Sizer. A few simple nodes to facilitate working wiht ComfyUI Workflows" + }, + { + "author": "deforum", + "title": "Deforum Nodes", + "reference": "https://github.com/XmYx/deforum-comfy-nodes", + "files": [ + "https://github.com/XmYx/deforum-comfy-nodes" + ], + "install_type": "git-clone", + "description": "Official Deforum animation pipeline tools that provide a unique way to create frame-by-frame generative motion art." + }, + { + "author": "adbrasi", + "title": "ComfyUI-TrashNodes-DownloadHuggingface", + "reference": "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface", + "files": [ + "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface" + ], + "install_type": "git-clone", + "description": "ComfyUI-TrashNodes-DownloadHuggingface is a ComfyUI node designed to facilitate the download of models you have just trained and uploaded to Hugging Face. This node is particularly useful for users who employ Google Colab for training and need to quickly download their models for deployment." + }, + { + "author": "mbrostami", + "title": "ComfyUI-HF", + "reference": "https://github.com/mbrostami/ComfyUI-HF", + "files": [ + "https://github.com/mbrostami/ComfyUI-HF" + ], + "install_type": "git-clone", + "description": "ComfyUI Node to work with Hugging Face repositories" + }, + { + "author": "Billius-AI", + "title": "ComfyUI-Path-Helper", + "reference": "https://github.com/Billius-AI/ComfyUI-Path-Helper", + "files": [ + "https://github.com/Billius-AI/ComfyUI-Path-Helper" + ], + "install_type": "git-clone", + "description": "Nodes:Create Project Root, Add Folder, Add Folder Advanced, Add File Name Prefix, Add File Name Prefix Advanced, ShowPath" + }, + { + "author": "Franck-Demongin", + "title": "NX_PromptStyler", + "reference": "https://github.com/Franck-Demongin/NX_PromptStyler", + "files": [ + "https://github.com/Franck-Demongin/NX_PromptStyler" + ], + "install_type": "git-clone", + "description": "A custom node for ComfyUI to create a prompt based on a list of keywords saved in CSV files." + }, + { + "author": "xiaoxiaodesha", + "title": "hd-nodes-comfyui", + "reference": "https://github.com/xiaoxiaodesha/hd_node", + "files": [ + "https://github.com/xiaoxiaodesha/hd_node" + ], + "install_type": "git-clone", + "description": "Nodes:Combine HDMasks, Cover HDMasks, HD FaceIndex, HD SmoothEdge, HD GetMaskArea, HD Image Levels, HD Ultimate SD Upscale" + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI-SVDResizer", + "id": "svdresizer", + "reference": "https://github.com/ShmuelRonen/ComfyUI-SVDResizer", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI-SVDResizer" + ], + "install_type": "git-clone", + "description": "SVDResizer is a helper for resizing the source image, according to the sizes enabled in Stable Video Diffusion. The rationale behind the possibility of changing the size of the image in steps between the ranges of 576 and 1024, is the use of the greatest common denominator of these two numbers which is 64. SVD is lenient with resizing that adheres to this rule, so the chance of coherent video that is not the standard size of 576X1024 is greater. It is advisable to keep the value 1024 constant and play with the second size to maintain the stability of the result." + }, + { + "author": "ShmuelRonen", + "title": "Wav2Lip Node for ComfyUI", + "id": "wav2lip", + "reference": "https://github.com/ShmuelRonen/ComfyUI_wav2lip", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI_wav2lip" + ], + "install_type": "git-clone", + "description": "The Wav2Lip node is a custom node for ComfyUI that allows you to perform lip-syncing on videos using the Wav2Lip model. It takes an input video and an audio file and generates a lip-synced output video." + }, + { + "author": "ShmuelRonen", + "title": "ComfyUI_Gemini_Flash", + "id": "gemini-flash", + "reference": "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash", + "files": [ + "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash" + ], + "install_type": "git-clone", + "description": "ComfyUI_Gemini_Flash is a custom node for ComfyUI, integrating the capabilities of the Gemini 1.5 Flash model. This node supports text and vision-based prompts, allowing users to analyze and adapt images to text prompts for text2image tasks." + }, + { + "author": "redhottensors", + "title": "ComfyUI-Prediction", + "id": "prediction", + "reference": "https://github.com/redhottensors/ComfyUI-Prediction", + "files": [ + "https://github.com/redhottensors/ComfyUI-Prediction" + ], + "install_type": "git-clone", + "description": "Fully customizable Classifier Free Guidance for ComfyUI." + }, + { + "author": "Mamaaaamooooo", + "title": "Batch Rembg for ComfyUI", + "id": "batch-rembg", + "reference": "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes", + "files": [ + "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes" + ], + "install_type": "git-clone", + "description": "Remove background of plural images." + }, + { + "author": "jordoh", + "title": "ComfyUI Deepface", + "id": "deepface", + "reference": "https://github.com/jordoh/ComfyUI-Deepface", + "files": [ + "https://github.com/jordoh/ComfyUI-Deepface" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes wrapping the [a/deepface](https://github.com/serengil/deepface) library." + }, + { + "author": "al-swaiti", + "title": "ComfyUI-CascadeResolutions", + "id": "cascade-resolution", + "reference": "https://github.com/al-swaiti/ComfyUI-CascadeResolutions", + "files": [ + "https://github.com/al-swaiti/ComfyUI-CascadeResolutions" + ], + "install_type": "git-clone", + "description": "Nodes:Cascade Resolutions" + }, + { + "author": "mirabarukaso", + "title": "ComfyUI_Mira", + "id": "mira", + "reference": "https://github.com/mirabarukaso/ComfyUI_Mira", + "files": [ + "https://github.com/mirabarukaso/ComfyUI_Mira" + ], + "install_type": "git-clone", + "description": "Nodes:Integer Multiplier, Float Multiplier, Convert Numeral to String, Create Canvas Advanced, Create Canvas, Create PNG Mask, Color Mask to HEX String, Color Mask to INT RGB, Color Masks to List" + }, + { + "author": "1038lab", + "title": "ComfyUI-GPT2P", + "id": "gpt2p", + "reference": "https://github.com/1038lab/ComfyUI-GPT2P", + "files": [ + "https://github.com/1038lab/ComfyUI-GPT2P" + ], + "install_type": "git-clone", + "description": "ComfyUI Node - Hugging Face repositories GTP2 Prompt" + }, + { + "author": "1038lab", + "title": "ComfyUI-latentSizeSelector", + "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": "Klinter", + "title": "Klinter_nodes", + "id": "klinter", + "reference": "https://github.com/klinter007/klinter_nodes", + "files": [ + "https://github.com/klinter007/klinter_nodes" + ], + "install_type": "git-clone", + "description": "Concat_strings atm - celebrating first_node" + }, + { + "author": "Ludobico", + "title": "ComfyUI-ScenarioPrompt", + "id": "scenarioprompt", + "reference": "https://github.com/Ludobico/ComfyUI-ScenarioPrompt", + "files": [ + "https://github.com/Ludobico/ComfyUI-ScenarioPrompt" + ], + "install_type": "git-clone", + "description": "ScenarioPrompt is a custom node that helps you understand what you're prompting for each property as you build your prompts" + }, + { + "author": "logtd", + "title": "InstanceDiffusion Nodes", + "id": "instancediffusion", + "reference": "https://github.com/logtd/ComfyUI-InstanceDiffusion", + "files": [ + "https://github.com/logtd/ComfyUI-InstanceDiffusion" + ], + "install_type": "git-clone", + "description": "A set of nodes to perform multi-object prompting with InstanceDiffusion" + }, + { + "author": "logtd", + "title": "Tracking Nodes for Videos", + "id": "tracking", + "reference": "https://github.com/logtd/ComfyUI-TrackingNodes", + "files": [ + "https://github.com/logtd/ComfyUI-TrackingNodes" + ], + "install_type": "git-clone", + "description": "A set of nodes to track objects through videos using YOLO and other processors." + }, + { + "author": "logtd", + "title": "ComfyUI-InversedNoise", + "id": "inversed-noise", + "reference": "https://github.com/logtd/ComfyUI-InversedNoise", + "files": [ + "https://github.com/logtd/ComfyUI-InversedNoise" + ], + "install_type": "git-clone", + "description": "Nodes:Inversed Euler Sampler, Mix Noise with Latent, Combine Latent Noise" + }, + { + "author": "logtd", + "title": "ComfyUI-RefSampling", + "id": "refsampling", + "reference": "https://github.com/logtd/ComfyUI-RefSampling", + "files": [ + "https://github.com/logtd/ComfyUI-RefSampling" + ], + "install_type": "git-clone", + "description": "Nodes:Apply Ref UNet, Ref Sampler, Ref Sampler Custom" + }, + { + "author": "logtd", + "title": "ComfyUI-FLATTEN", + "id": "flatten", + "reference": "https://github.com/logtd/ComfyUI-FLATTEN", + "files": [ + "https://github.com/logtd/ComfyUI-FLATTEN" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes to use [a/FLATTEN: optical FLow-guided ATTENtion for consistent text-to-video editing](https://github.com/yrcong/flatten)." + }, + { + "author": "logtd", + "title": "ComfyUI-RAVE Attention", + "id": "rave", + "reference": "https://github.com/logtd/ComfyUI-RAVE_ATTN", + "files": [ + "https://github.com/logtd/ComfyUI-RAVE_ATTN" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes to use RAVE attention as a temporal attention mechanism.\nThis differs from other implementations in that it does not concatenate the images together, but within the UNet's Self-Attention mechanism performs the RAVE technique. By not altering the images/latents throughout the UNet, this method does not affect other temporal techniques, style mechanisms, or other UNet modifications.\nFor example, it can be combined with AnimateDiff, ModelScope/ZeroScope, or FLATTEN." + }, + { + "author": "Big-Idea-Technology", + "title": "ComfyUI-Book-Tools Nodes for ComfyUI", + "id": "booktool", + "reference": "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools", + "files": [ + "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools" + ], + "install_type": "git-clone", + "description": "ComfyUI-Book-Tools is a set o new nodes for ComfyUI that allows users to easily add text overlays to images within their ComfyUI projects. This Node leverages Python Imaging Library (PIL) and PyTorch to dynamically render text on images, supporting a wide range of customization options including font size, alignment, color, and padding. Loop with any parameters (*), prompt batch schedule with prompt selector, end queue for automatic ending current queue." + }, + { + "author": "Big Idea Technology", + "title": "LLM Node for ComfyUI", + "reference": "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node", + "files": [ + "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node" + ], + "install_type": "git-clone", + "description": "The LLM_Node enhances ComfyUI by integrating advanced language model capabilities, enabling a wide range of NLP tasks such as text generation, content summarization, question answering, and more. This flexibility is powered by various transformer model architectures from the transformers library, allowing for the deployment of models like T5, GPT-2, and others based on your project's needs." + }, + { + "author": "Guillaume-Fgt", + "title": "ComfyUI_StableCascadeLatentRatio", + "id": "cascade-latent-ratio", + "reference": "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio", + "files": [ + "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio" + ], + "install_type": "git-clone", + "description": "A custom node to create empty latents for Stable Cascade.\nfeatures: width and height incrementation of 64 by default, possibility to lock the aspect ratio, switch width/height at execution" + }, + { + "author": "AuroBit", + "title": "ComfyUI OOTDiffusion", + "id": "ootdiffusion", + "reference": "https://github.com/AuroBit/ComfyUI-OOTDiffusion", + "files": [ + "https://github.com/AuroBit/ComfyUI-OOTDiffusion" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node that simply integrates the [a/OOTDiffusion](https://github.com/levihsu/OOTDiffusion) functionality." + }, + { + "author": "AuroBit", + "title": "ComfyUI-AnimateAnyone-reproduction", + "id": "animateanyone-reproduction", + "reference": "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction", + "files": [ + "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction" + ], + "install_type": "git-clone", + "description": "A ComfyUI custom node that simply integrates the [a/animate-anyone-reproduction](https://github.com/bendanzzc/AnimateAnyone-reproduction) functionality." + }, + { + "author": "czcz1024", + "title": "Face Compare", + "id": "facecompare", + "reference": "https://github.com/czcz1024/Comfyui-FaceCompare", + "files": [ + "https://github.com/czcz1024/Comfyui-FaceCompare" + ], + "install_type": "git-clone", + "description": "Nodes:FaceCompare" + }, + { + "author": "TheBill2001", + "title": "comfyui-upscale-by-model", + "reference": "https://github.com/TheBill2001/comfyui-upscale-by-model", + "files": [ + "https://github.com/TheBill2001/comfyui-upscale-by-model" + ], + "install_type": "git-clone", + "description": "This custom node allow upscaling an image by a factor using a model." + }, + { + "author": "leoleelxh", + "title": "ComfyUI-LLMs", + "reference": "https://github.com/leoleelxh/ComfyUI-LLMs", + "files": [ + "https://github.com/leoleelxh/ComfyUI-LLMs" + ], + "install_type": "git-clone", + "description": "A minimalist node that calls LLMs, combined with one API, can call all language models, including local models." + }, + { + "author": "hughescr", + "title": "OpenPose Keypoint Extractor", + "reference": "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor", + "files": [ + "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor" + ], + "install_type": "git-clone", + "description": "This is a single node which can take the POSE_KEYPOINT output from the OpenPose extractor node, parse it, and return x,y,width,height bounding boxes around any elements of the OpenPose skeleton" + }, + { + "author": "jkrauss82", + "title": "ULTools for ComfyUI", + "reference": "https://github.com/jkrauss82/ultools-comfyui", + "files": [ + "https://github.com/jkrauss82/ultools-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:SaveImgAdv, CLIPTextEncodeWithStats. Collection of tools supporting txt2img generation in ComfyUI and other tasks." + }, + { + "author": "hiforce", + "title": "Comfyui HiFORCE Plugin", + "reference": "https://github.com/hiforce/comfyui-hiforce-plugin", + "files": [ + "https://github.com/hiforce/comfyui-hiforce-plugin" + ], + "install_type": "git-clone", + "description": "Custom nodes pack provided by [a/HiFORCE](https://www.hiforce.net/) for ComfyUI. This custom node helps to conveniently enhance images through Sampler, Upscaler, Mask, and more.\nNOTE:You should install [a/ComfyUI-Impact-Pack](https://github.com/ltdrdata/ComfyUI-Impact-Pack). Many optimizations are built upon the foundation of ComfyUI-Impact-Pack." + }, + { + "author": "kuschanow", + "title": "Advanced Latent Control", + "reference": "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control", + "files": [ + "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control" + ], + "install_type": "git-clone", + "description": "This custom node helps to transform latent in different ways." + }, + { + "author": "guill", + "title": "abracadabra-comfyui", + "reference": "https://github.com/guill/abracadabra-comfyui", + "files": [ + "https://github.com/guill/abracadabra-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:Abracadabra Summary, Abracadabra" + }, + { + "author": "cerspense", + "title": "cspnodes", + "reference": "https://github.com/cerspense/ComfyUI_cspnodes", + "files": [ + "https://github.com/cerspense/ComfyUI_cspnodes" + ], + "install_type": "git-clone", + "description": "Nodes:Image Dir Iterator, Modelscopet2v, Modelscopev2v." + }, + { + "author": "qwixiwp", + "title": "queuetools", + "reference": "https://github.com/qwixiwp/queuetools", + "files": [ + "https://github.com/qwixiwp/queuetools" + ], + "install_type": "git-clone", + "description": "Nodes:load images (queue tools). tools made for queueing in comfyUI" + }, + { + "author": "Chan-0312", + "title": "ComfyUI-Prompt-Preview", + "reference": "https://github.com/Chan-0312/ComfyUI-Prompt-Preview", + "files": [ + "https://github.com/Chan-0312/ComfyUI-Prompt-Preview" + ], + "install_type": "git-clone", + "description": "Welcome to ComfyUI Prompt Preview, where you can visualize the styles from [sdxl_prompt_styler](https://github.com/twri/sdxl_prompt_styler)." + }, + { + "author": "munkyfoot", + "title": "ComfyUI-TextOverlay", + "id": "textoverlay-munkyfoot", + "reference": "https://github.com/Munkyfoot/ComfyUI-TextOverlay", + "files": [ + "https://github.com/Munkyfoot/ComfyUI-TextOverlay" + ], + "install_type": "git-clone", + "description": "This extension provides a node that allows you to overlay text on an image or a batch of images with support for custom fonts and styles." + }, + { + "author": "holchan", + "title": "ComfyUI-ModelDownloader", + "reference": "https://github.com/holchan/ComfyUI-ModelDownloader", + "files": [ + "https://github.com/holchan/ComfyUI-ModelDownloader" + ], + "install_type": "git-clone", + "description": "A ComfyUI node to download models(Checkpoints and LoRA) from external links and act as an output standalone node." + }, + { + "author": "CC-BryanOttho", + "title": "ComfyUI_API_Manager", + "reference": "https://github.com/CC-BryanOttho/ComfyUI_API_Manager", + "files": [ + "https://github.com/CC-BryanOttho/ComfyUI_API_Manager" + ], + "install_type": "git-clone", + "description": "This package provides three custom nodes designed to streamline workflows involving API requests, dynamic text manipulation based on API responses, and image posting to APIs. These nodes are particularly useful for automating interactions with APIs, enhancing text-based workflows with dynamic data, and facilitating image uploads." + }, + { + "author": "maracman", + "title": "ComfyUI-SubjectStyle-CSV", + "reference": "https://github.com/maracman/ComfyUI-SubjectStyle-CSV", + "files": [ + "https://github.com/maracman/ComfyUI-SubjectStyle-CSV" + ], + "install_type": "git-clone", + "description": "Store a CSV of prompts where the style can change for each subject. The CSV node initialises with the column (style) and row (subject) names for easy interpretability." + }, + { + "author": "438443467", + "title": "ComfyUI-GPT4V-Image-Captioner", + "reference": "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner", + "files": [ + "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner" + ], + "install_type": "git-clone", + "description": "Nodes:GPT4V-Image-Captioner" + }, + { + "author": "uetuluk", + "title": "comfyui-webcam-node", + "id": "webcam", + "reference": "https://github.com/uetuluk/comfyui-webcam-node", + "files": [ + "https://github.com/uetuluk/comfyui-webcam-node" + ], + "install_type": "git-clone", + "description": "Nodes:Webcam Capture" + }, + { + "author": "huchenlei", + "title": "ComfyUI-layerdiffuse (layerdiffusion)", + "id": "layerdiffuse", + "reference": "https://github.com/huchenlei/ComfyUI-layerdiffuse", + "files": [ + "https://github.com/huchenlei/ComfyUI-layerdiffuse" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/LayerDiffusion](https://github.com/layerdiffusion/LayerDiffusion)." + }, + { + "author": "huchenlei", + "title": "ComfyUI_DanTagGen", + "id": "dantangen", + "reference": "https://github.com/huchenlei/ComfyUI_DanTagGen", + "files": [ + "https://github.com/huchenlei/ComfyUI_DanTagGen" + ], + "install_type": "git-clone", + "description": "ComfyUI node of [a/Kohaku's DanTagGen Demo](https://huggingface.co/KBlueLeaf/DanTagGen?not-for-all-audiences=true)." + }, + { + "author": "huchenlei", + "title": "ComfyUI-openpose-editor", + "reference": "https://github.com/huchenlei/ComfyUI-openpose-editor", + "files": [ + "https://github.com/huchenlei/ComfyUI-openpose-editor" + ], + "install_type": "git-clone", + "description": "Port of [a/https://github.com/huchenlei/sd-webui-openpose-editor](https://github.com/huchenlei/sd-webui-openpose-editor) in ComfyUI" + }, + { + "author": "huchenlei", + "title": "ComfyUI-IC-Light-Native", + "id": "ic-light-native", + "reference": "https://github.com/huchenlei/ComfyUI-IC-Light-Native", + "files": [ + "https://github.com/huchenlei/ComfyUI-IC-Light-Native" + ], + "install_type": "git-clone", + "description": "ComfyUI native implementation of [a/IC-Light](https://github.com/lllyasviel/IC-Light)." + }, + { + "author": "huchenlei", + "title": "ComfyUI DenseDiffusion", + "id": "densediffusion", + "reference": "https://github.com/huchenlei/ComfyUI_densediffusion", + "files": [ + "https://github.com/huchenlei/ComfyUI_densediffusion" + ], + "install_type": "git-clone", + "description": "[a/DenseDiffusion](https://github.com/naver-ai/DenseDiffusion) custom node for ComfyUI." + }, + { + "author": "huchenlei", + "title": "ComfyUI_omost", + "id": "omost", + "reference": "https://github.com/huchenlei/ComfyUI_omost", + "files": [ + "https://github.com/huchenlei/ComfyUI_omost" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/Omost](https://github.com/lllyasviel/Omost), and everything about regional prompt.\nNOTE: You need to install ComfyUI_densediffusion to use this node." + }, + { + "author": "nathannlu", + "title": "ComfyUI Pets", + "id": "pets", + "reference": "https://github.com/nathannlu/ComfyUI-Pets", + "files": [ + "https://github.com/nathannlu/ComfyUI-Pets" + ], + "install_type": "git-clone", + "description": "Play with your pet while your workflow generates!" + }, + { + "author": "nathannlu", + "title": "Comfy Cloud", + "id": "cloud", + "reference": "https://github.com/nathannlu/ComfyUI-Cloud", + "files": [ + "https://github.com/nathannlu/ComfyUI-Cloud" + ], + "install_type": "git-clone", + "description": "Run your workflow using cloud GPU resources, from your local ComfyUI.\nNOTE:After you first install the plugin...\nThe first time you click 'generate', you will be prompted to log into your account.Subsequent generations after the first is faster (the first run it takes a while to process your workflow). Once those two steps have been completed, you will be able to seamlessly generate your workflow on the cloud!" + }, + { + "author": "11dogzi", + "title": "Comfyui-ergouzi-Nodes", + "id": "ergouzi-nodes", + "reference": "https://github.com/11dogzi/Comfyui-ergouzi-Nodes", + "files": [ + "https://github.com/11dogzi/Comfyui-ergouzi-Nodes" + ], + "install_type": "git-clone", + "description": "This is a node group kit that covers multiple nodes such as local refinement, tag management, random prompt words, text processing, image processing, mask processing, etc" + }, + { + "author": "11dogzi", + "title": "Comfyui-ergouzi-samplers", + "id": "ergouzi-samplers", + "reference": "https://github.com/11dogzi/Comfyui-ergouzi-samplers", + "files": [ + "https://github.com/11dogzi/Comfyui-ergouzi-samplers" + ], + "install_type": "git-clone", + "description": "Partial redraw sampler and variant seed sampler" + }, + { + "author": "11dogzi", + "title": "ComfUI-EGAdapterMadAssistant", + "id": "ergouzi-samplers", + "reference": "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant", + "files": [ + "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant" + ], + "install_type": "git-clone", + "description": "This is a hierarchical auxiliary project of the IPAdapter project, which uses a slider to quickly control the hierarchical weights and add fully random and semi random modes" + }, + { + "author": "BXYMartin", + "title": "ComfyUI-InstantIDUtils", + "id": "instantid-utils", + "reference": "https://github.com/BXYMartin/ComfyUI-InstantIDUtils", + "files": [ + "https://github.com/BXYMartin/ComfyUI-InstantIDUtils" + ], + "install_type": "git-clone", + "description": "Nodes:Multi-ControlNet Converter, List of Images, Convert PIL to Tensor (NHWC), Convert Tensor (NHWC) to (NCHW), Convert Tensor (NHWC) to PIL" + }, + { + "author": "cdb-boop", + "title": "comfyui-image-round", + "id": "image-round", + "reference": "https://github.com/cdb-boop/comfyui-image-round", + "files": [ + "https://github.com/cdb-boop/comfyui-image-round" + ], + "install_type": "git-clone", + "description": "A simple node to round an input image up (pad) or down (crop) to the nearest integer multiple. Padding offset from left/bottom and the padding value are adjustable." + }, + { + "author": "cdb-boop", + "title": "ComfyUI Bringing Old Photos Back to Life", + "reference": "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life", + "files": [ + "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life" + ], + "install_type": "git-clone", + "description": "Enhance old or low-quality images in ComfyUI. Optional features include automatic scratch removal and face enhancement. Based on Microsoft's Bringing-Old-Photos-Back-to-Life. Requires installing models, so see instructions here: https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life." + }, + { + "author": "atmaranto", + "title": "SaveAsScript", + "id": "saveasscript", + "reference": "https://github.com/atmaranto/ComfyUI-SaveAsScript", + "files": [ + "https://github.com/atmaranto/ComfyUI-SaveAsScript" + ], + "install_type": "git-clone", + "description": "A version of ComfyUI-to-Python-Extension that works as a custom node. Adds a button in the UI that saves the current workflow as a Python file, a CLI for converting workflows, and slightly better custom node support." + }, + { + "author": "meshmesh-io", + "title": "mm-comfyui-megamask", + "id": "megamask", + "reference": "https://github.com/meshmesh-io/mm-comfyui-megamask", + "files": [ + "https://github.com/meshmesh-io/mm-comfyui-megamask" + ], + "install_type": "git-clone", + "description": "Nodes:ColorListMaskToImage, FlattenAndCombineMaskImages" + }, + { + "author": "meshmesh-io", + "title": "mm-comfyui-loopback", + "id": "mm-loopback", + "reference": "https://github.com/meshmesh-io/mm-comfyui-loopback", + "files": [ + "https://github.com/meshmesh-io/mm-comfyui-loopback" + ], + "install_type": "git-clone", + "description": "Nodes:Loop, LoopStart, LoopEnd, LoopStart_SEGIMAGE, LoopEnd_SEGIMAGE" + }, + { + "author": "meshmesh-io", + "title": "ComfyUI-MeshMesh", + "id": "meshmesh", + "reference": "https://github.com/meshmesh-io/ComfyUI-MeshMesh", + "files": [ + "https://github.com/meshmesh-io/ComfyUI-MeshMesh" + ], + "install_type": "git-clone", + "description": "Nodes:Masks to Colored Masks, Color Picker" + }, + { + "author": "CozyMantis", + "title": "Cozy Human Parser", + "id": "humanparser", + "reference": "https://github.com/cozymantis/human-parser-comfyui-node", + "files": [ + "https://github.com/cozymantis/human-parser-comfyui-node" + ], + "install_type": "git-clone", + "description": "A ComfyUI node to automatically extract masks for body regions and clothing/fashion items. Made with 💚 by the CozyMantis squad." + }, + { + "author": "CozyMantis", + "title": "Cozy Reference Pose Generator", + "id": "posegen", + "reference": "https://github.com/cozymantis/pose-generator-comfyui-node", + "files": [ + "https://github.com/cozymantis/pose-generator-comfyui-node" + ], + "install_type": "git-clone", + "description": "Generate OpenPose face/body reference poses in ComfyUI with ease. Made with 💚 by the CozyMantis squad." + }, + { + "author": "CozyMantis", + "title": "Cozy Utils", + "id": "cozy-utils", + "reference": "https://github.com/cozymantis/cozy-utils-comfyui-nodes", + "files": [ + "https://github.com/cozymantis/cozy-utils-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Various cozy nodes, made with 💚 by the CozyMantis squad." + }, + { + "author": "vivax3794", + "title": "ComfyUI-Vivax-Nodes", + "reference": "https://github.com/vivax3794/ComfyUI-Vivax-Nodes", + "files": [ + "https://github.com/vivax3794/ComfyUI-Vivax-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Inspect, Any String, Model From URL" + }, + { + "author": "vivax3794", + "title": "ComfyUI-Sub-Nodes", + "reference": "https://github.com/vivax3794/ComfyUI-Sub-Nodes", + "files": [ + "https://github.com/vivax3794/ComfyUI-Sub-Nodes" + ], + "install_type": "git-clone", + "description": "Creating subgraph and Calling subgraphs." + }, + { + "author": "victorchall", + "title": "Comfyui Webcam capture node", + "reference": "https://github.com/victorchall/comfyui_webcamcapture", + "files": [ + "https://github.com/victorchall/comfyui_webcamcapture" + ], + "install_type": "git-clone", + "description": "This node captures images one at a time from your webcam when you click generate.\nThis is particular useful for img2img or controlnet workflows.\nNOTE:This node will take over your webcam, so if you have another program using it, you may need to close that program first. Likewise, you may need to close Comfyui or close the workflow to release the webcam." + }, + { + "author": "ljleb", + "title": "Mecha Merge Node Pack", + "id": "mecha", + "reference": "https://github.com/ljleb/comfy-mecha", + "files": [ + "https://github.com/ljleb/comfy-mecha" + ], + "install_type": "git-clone", + "description": "model merging nodes powered by sd-mecha, a memory efficient state dict recipe merger." + }, + { + "author": "diSty", + "title": "ComfyUI Frame Maker", + "id": "frame-maker", + "reference": "https://github.com/diStyApps/ComfyUI_FrameMaker", + "files": [ + "https://github.com/diStyApps/ComfyUI_FrameMaker" + ], + "install_type": "git-clone", + "description": "This node creates a sequence of frames by moving and scaling a subject image over a background image." + }, + { + "author": "hackkhai", + "title": "ComfyUI-Image-Matting", + "id": "image-matting", + "reference": "https://github.com/hackkhai/ComfyUI-Image-Matting", + "files": [ + "https://github.com/hackkhai/ComfyUI-Image-Matting" + ], + "install_type": "git-clone", + "description": "This node improves the quality of the image mask. more suitable for image composite matting" + }, + { + "author": "Pos13", + "title": "Cyclist", + "id": "cyclist", + "reference": "https://github.com/Pos13/comfyui-cyclist", + "files": [ + "https://github.com/Pos13/comfyui-cyclist" + ], + "install_type": "git-clone", + "description": "This extension provides tools to iterate generation results between runs. In general, it's for cycles." + }, + { + "author": "ExponentialML", + "title": "ComfyUI_ModelScopeT2V", + "id": "modelscopet2v", + "reference": "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V", + "files": [ + "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V" + ], + "install_type": "git-clone", + "description": "Allows native usage of ModelScope based Text To Video Models in ComfyUI" + }, + { + "author": "ExponentialML", + "title": "ComfyUI - Native DynamiCrafter", + "id": "dynamicrafter", + "reference": "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter", + "files": [ + "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter" + ], + "install_type": "git-clone", + "description": "DynamiCrafter that works natively with ComfyUI's nodes, optimizations, ControlNet, and more." + }, + { + "author": "ExponentialML", + "title": "ComfyUI_VisualStylePrompting", + "id": "visual-style-prompting", + "reference": "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting", + "files": [ + "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting" + ], + "install_type": "git-clone", + "description": "ComfyUI Version of '[a/Visual Style Prompting with Swapping Self-Attention](https://github.com/naver-ai/Visual-Style-Prompting)'" + }, + { + "author": "angeloshredder", + "title": "StableCascadeResizer", + "reference": "https://github.com/angeloshredder/StableCascadeResizer", + "files": [ + "https://github.com/angeloshredder/StableCascadeResizer" + ], + "install_type": "git-clone", + "description": "Nodes:Cascade_Resizer" + }, + { + "author": "stavsap", + "title": "ComfyUI Ollama", + "id": "ollama", + "reference": "https://github.com/stavsap/comfyui-ollama", + "files": [ + "https://github.com/stavsap/comfyui-ollama" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI Nodes for interacting with [a/Ollama](https://ollama.com/) using the [a/ollama python client](https://github.com/ollama/ollama-python).\nIntegrate the power of LLMs into CompfyUI workflows easily." + }, + { + "author": "dchatel", + "title": "comfyui_facetools", + "id": "facetools", + "reference": "https://github.com/dchatel/comfyui_facetools", + "files": [ + "https://github.com/dchatel/comfyui_facetools" + ], + "install_type": "git-clone", + "description": "These custom nodes provide a rotation aware face extraction, paste back, and various face related masking options." + }, + { + "author": "prodogape", + "title": "Comfyui-Minio", + "id": "minio", + "reference": "https://github.com/prodogape/ComfyUI-Minio", + "files": [ + "https://github.com/prodogape/ComfyUI-Minio" + ], + "install_type": "git-clone", + "description": "This plugin is mainly based on Minio, implementing the ability to read images from Minio, save images, facilitating expansion and connection across multiple machines." + }, + { + "author": "prodogape", + "title": "ComfyUI-EasyOCR", + "id": "easyocr", + "reference": "https://github.com/prodogape/ComfyUI-EasyOCR", + "files": [ + "https://github.com/prodogape/ComfyUI-EasyOCR" + ], + "install_type": "git-clone", + "description": "This node is primarily based on Easy-OCR to implement OCR text recognition functionality." + }, + { + "author": "prodogape", + "title": "ComfyUI-OmDet", + "id": "omdet", + "reference": "https://github.com/prodogape/ComfyUI-OmDet", + "files": [ + "https://github.com/prodogape/ComfyUI-OmDet" + ], + "install_type": "git-clone", + "description": "This node is mainly based on [a/OmDet](https://github.com/om-ai-lab/OmDet) for object detection, and it outputs related images, masks, and Labelme JSON information." + }, + { + "author": "prodogape", + "title": "Comfyui-Yolov8-JSON", + "reference": "https://github.com/prodogape/Comfyui-Yolov8-JSON", + "files": [ + "https://github.com/prodogape/Comfyui-Yolov8-JSON" + ], + "install_type": "git-clone", + "description": "This node is mainly based on the Yolov8 model for object detection, and it outputs related images, masks, and JSON information.[w/Repository url is changed. Please remove previous one and reinstall.]" + }, + { + "author": "kingzcheung", + "title": "ComfyUI_kkTranslator_nodes", + "id": "kktranslator", + "reference": "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes", + "files": [ + "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes" + ], + "install_type": "git-clone", + "description": "These nodes are mainly used to translate prompt words from other languages into English. PromptTranslateToText implements prompt word translation based on Helsinki NLP translation model.It doesn't require internet connection。" + }, + { + "author": "vsevolod-oparin", + "title": "Kandinsky 2.2 ComfyUI Plugin", + "id": "kandinsky", + "reference": "https://github.com/vsevolod-oparin/comfyui-kandinsky22", + "files": [ + "https://github.com/vsevolod-oparin/comfyui-kandinsky22" + ], + "install_type": "git-clone", + "description": "Nodes provide an options to combine prior and decoder models of Kandinsky 2.2." + }, + { + "author": "Xyem", + "title": "Xycuno Oobabooga", + "id": "xycuno-oobabooga", + "reference": "https://github.com/Xyem/Xycuno-Oobabooga", + "files": [ + "https://github.com/Xyem/Xycuno-Oobabooga" + ], + "install_type": "git-clone", + "description": "Xycuno Oobabooga provides custom nodes for ComfyUI, for sending requests to an [a/Oobabooga](https://github.com/oobabooga/text-generation-webui) instance to assist in creating prompt texts." + }, + { + "author": "shi3z", + "title": "ComfyUI_Memeplex_DALLE", + "id": "memeplex-dalle", + "reference": "https://github.com/shi3z/ComfyUI_Memeplex_DALLE", + "files": [ + "https://github.com/shi3z/ComfyUI_Memeplex_DALLE" + ], + "install_type": "git-clone", + "description": "You can use memeplex and DALL-E thru ComfyUI. You need API keys." + }, + { + "author": "if-ai", + "title": "ComfyUI-IF_AI_tools", + "id": "if-ai-tools", + "reference": "https://github.com/if-ai/ComfyUI-IF_AI_tools", + "files": [ + "https://github.com/if-ai/ComfyUI-IF_AI_tools" + ], + "install_type": "git-clone", + "description": "Various AI tools to use in Comfy UI. Starting with VL and prompt making tools using Ollma as backend will evolve as I find time." + }, + { + "author": "if-ai", + "title": "ComfyUI-IF_AI_WishperSpeechNode", + "id": "if-ai-whisper-speech", + "reference": "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode", + "files": [ + "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode" + ], + "install_type": "git-clone", + "description": "This repository hosts a Text-to-Speech (TTS) application that leverages Whisper Speech for voice synthesis, allowing users to train a voice model on-the-fly. It is built on ComfyUI and supports rapid training and inference processes." + }, + { + "author": "if-ai", + "title": "ComfyUI-IF_AI_HFDownloaderNode", + "id": "if-ai-hfdownloader", + "reference": "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode", + "files": [ + "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode" + ], + "install_type": "git-clone", + "description": "Talking avatars Heads for the IF_AI tools integrates dreamtalk in ComfyUI" + }, + { + "author": "dmMaze", + "title": "Sketch2Manga", + "id": "sketch2manga", + "reference": "https://github.com/dmMaze/sketch2manga", + "files": [ + "https://github.com/dmMaze/sketch2manga" + ], + "install_type": "git-clone", + "description": "Apply screentone to line drawings or colored illustrations with diffusion models." + }, + { + "author": "olduvai-jp", + "title": "ComfyUI-HfLoader", + "id": "hfloader", + "reference": "https://github.com/olduvai-jp/ComfyUI-HfLoader", + "files": [ + "https://github.com/olduvai-jp/ComfyUI-HfLoader" + ], + "install_type": "git-clone", + "description": "Nodes:Lora Loader From HF" + }, + { + "author": "AiMiDi", + "title": "ComfyUI-Aimidi-nodes", + "id": "aimidi-nodes", + "reference": "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes", + "files": [ + "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Merge Tag, Clear Tag, Add Tag, Load Images Pair Batch, Save Images Pair" + }, + { + "author": "ForeignGods", + "title": "ComfyUI-Mana-Nodes", + "id": "mana-nodes", + "reference": "https://github.com/ForeignGods/ComfyUI-Mana-Nodes", + "files": [ + "https://github.com/ForeignGods/ComfyUI-Mana-Nodes" + ], + "install_type": "git-clone", + "description": "Font Animation, Speech Recognition, Caption Generator, TTS" + }, + { + "author": "Cornea Valentin", + "title": "ControlNet Auxiliar", + "id": "controlnet-aux-valentin", + "reference": "https://github.com/madtunebk/ComfyUI-ControlnetAux", + "files": [ + "https://github.com/madtunebk/ComfyUI-ControlnetAux" + ], + "install_type": "git-clone", + "description": "This ComfyUI custom node, named ControlNet Auxiliar, is designed to provide auxiliary functionalities for image processing tasks. It is particularly useful for various image manipulation and enhancement operations. The node is integrated with functionalities for converting images between different formats and applying various image processing techniques." + }, + { + "author": "MarkoCa1", + "title": "ComfyUI-Text", + "reference": "https://github.com/MarkoCa1/ComfyUI-Text", + "files": [ + "https://github.com/MarkoCa1/ComfyUI-Text" + ], + "install_type": "git-clone", + "description": "Text." + }, + { + "author": "MarkoCa1", + "title": "ComfyUI_Segment_Mask", + "id": "seg-mask", + "reference": "https://github.com/MarkoCa1/ComfyUI_Segment_Mask", + "files": [ + "https://github.com/MarkoCa1/ComfyUI_Segment_Mask" + ], + "install_type": "git-clone", + "description": "Mask cutout based on Segment Anything." + }, + { + "author": "Shadetail", + "title": "Eagleshadow Custom Nodes", + "id": "eagleshadow", + "reference": "https://github.com/Shadetail/ComfyUI_Eagleshadow", + "files": [ + "https://github.com/Shadetail/ComfyUI_Eagleshadow" + ], + "install_type": "git-clone", + "description": "Custom nodes for ComfyUI by Eagleshadow." + }, + { + "author": "ArdeniusAI", + "title": "CPlus_Ardenius ComfyUI Control Box", + "id": "controlbox", + "reference": "https://github.com/ArdeniusAI/CPlus_Ardenius", + "files": [ + "https://github.com/ArdeniusAI/CPlus_Ardenius" + ], + "install_type": "git-clone", + "description": "1 node to have control over your workflow." + }, + { + "author": "Jannchie", + "title": "ComfyUI-J", + "reference": "https://github.com/Jannchie/ComfyUI-J", + "files": [ + "https://github.com/Jannchie/ComfyUI-J" + ], + "install_type": "git-clone", + "description": "This is a completely different set of nodes than Comfy's own KSampler series. This set of nodes is based on Diffusers, which makes it easier to import models, apply prompts with weights, inpaint, reference only, controlnet, etc." + }, + { + "author": "daxcay", + "title": "ComfyUI-JDCN", + "id": "jdcn", + "reference": "https://github.com/daxcay/ComfyUI-JDCN", + "files": [ + "https://github.com/daxcay/ComfyUI-JDCN" + ], + "install_type": "git-clone", + "description": "Jerry Davos Custom Nodes for Saving Latents in Directory (BatchLatentSave) , Importing Latent from directory (BatchLatentLoadFromDir) , List to string, string to list, get any file list from directory which give filepath, filename, move any files from any directory to any other directory, VHS Video combine file mover, rebatch list of strings, batch image load from any dir, load image batch from any directory and other custom nodes." + }, + { + "author": "daxcay", + "title": "ComfyUI-DataSet", + "reference": "https://github.com/daxcay/ComfyUI-DataSet", + "files": [ + "https://github.com/daxcay/ComfyUI-DataSet" + ], + "install_type": "git-clone", + "description": "Data Research, Preparation And Manipulators Nodes for Model Trainers, Artists, Designers and Animators. Captions, Visualizer, Text Manipulator\nNOTE: This repo is renamed to ComfyUI-DataSet.\n[w/Repository name is renamed to ComfyUI-DataSet from ComfyUI-DRMN. Please, remove previous one and reinstall.]" + }, + { + "author": "daxcay", + "title": "ComfyUI-NODEJS", + "reference": "https://github.com/daxcay/ComfyUI-NODEJS", + "files": [ + "https://github.com/daxcay/ComfyUI-NODEJS" + ], + "install_type": "git-clone", + "description": "This node allows the execution of Node.js application within ComfyUI by leveraging the ComfyUI-NODEJS, which starts alongside ComfyUI and facilitates the installation of Node.js. The integration enables Python subprocesses to execute Node.js scripts." + }, + { + "author": "Seedsa", + "title": "ComfyUI Fooocus Nodes", + "id": "fooocus-nodes", + "reference": "https://github.com/Seedsa/Fooocus_Nodes", + "files": [ + "https://github.com/Seedsa/Fooocus_Nodes" + ], + "install_type": "git-clone", + "description": "This extension provides image generation features based on Fooocus." + }, + { + "author": "zhangp365", + "title": "zhangp365/Some Utils for ComfyUI", + "reference": "https://github.com/zhangp365/ComfyUI-utils-nodes", + "files": [ + "https://github.com/zhangp365/ComfyUI-utils-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:LoadImageWithSwitch, ImageBatchOneOrMore, ConcatText, ModifyTextGender" + }, + { + "author": "ratulrafsan", + "title": "Comfyui-SAL-VTON", + "id": "sal-vton", + "reference": "https://github.com/ratulrafsan/Comfyui-SAL-VTON", + "files": [ + "https://github.com/ratulrafsan/Comfyui-SAL-VTON" + ], + "install_type": "git-clone", + "description": "Dressup your models!\nThis is my quick implementation of the SAL-VTON node for ComfyUI.\nBased on the paper [a/Keyu Y. Tingwei G. et al. (2023). Linking Garment with Person via Semantically Associated Landmakrs for Virtual Try-On](https://openaccess.thecvf.com/content/CVPR2023/papers/Yan_Linking_Garment_With_Person_via_Semantically_Associated_Landmarks_for_Virtual_CVPR_2023_paper.pdf)" + }, + { + "author": "Nevysha", + "title": "ComfyUI-nevysha-top-menu", + "id": "nevysha-top-menu", + "reference": "https://github.com/Nevysha/ComfyUI-nevysha-top-menu", + "files": [ + "https://github.com/Nevysha/ComfyUI-nevysha-top-menu" + ], + "install_type": "git-clone", + "description": "A simple sidebar tweak to force fixe the ComfyUI menu to the top of the screen. Reaaally quick and dirty. May break with some ComfyUI setup." + }, + { + "author": "alisson-anjos", + "title": "ComfyUI-Ollama-Describer", + "id": "ollama-describer", + "reference": "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer", + "files": [ + "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer" + ], + "install_type": "git-clone", + "description": "This is an extension for ComfyUI that makes it possible to use some LLM models provided by Ollama, such as Gemma, Llava (multimodal), Llama2, Llama3 or Mistral. Speaking specifically of the LLaVa - Large Language and Vision Assistant model, although trained on a relatively small dataset, it demonstrates exceptional capabilities in understanding images and answering questions about them. This model presents similar behaviors to multimodal models such as GPT-4, even when presented with invisible images and instructions." + }, + { + "author": "chaosaiart", + "title": "Chaosaiart-Nodes", + "id": "chaosaiart", + "reference": "https://github.com/chaosaiart/Chaosaiart-Nodes", + "files": [ + "https://github.com/chaosaiart/Chaosaiart-Nodes" + ], + "install_type": "git-clone", + "description": "LowVRAM Animation : txt2video - img2video - video2video , Frame by Frame, compatible with LowVRAM GPUs\nIncluded : Prompt Switch, Checkpoint Switch, Cache, Number Count by Frame, Ksampler txt2img & img2img ..." + }, + { + "author": "viperyl", + "title": "ComfyUI-BiRefNet", + "id": "birefnet", + "reference": "https://github.com/viperyl/ComfyUI-BiRefNet", + "files": [ + "https://github.com/viperyl/ComfyUI-BiRefNet" + ], + "install_type": "git-clone", + "description": "Bilateral Reference Network achieves SOTA result in multi Salient Object Segmentation dataset, this repo pack BiRefNet as ComfyUI nodes, and make this SOTA model easier use for everyone." + }, + { + "author": "viperyl", + "title": "ComfyUI-RGT", + "id": "rgt", + "reference": "https://github.com/viperyl/ComfyUI-RGT", + "pip": ["loguru"], + "files": [ + "https://github.com/viperyl/ComfyUI-RGT" + ], + "install_type": "git-clone", + "description": "This repo cast Recursive Generalization Transformer for Image Super-Resolution to ComfyUI, the original [a/paper link](https://arxiv.org/abs/2303.06373) and [a/github link](https://github.com/zhengchen1999/RGT)" + }, + { + "author": "SuperBeastsAI", + "title": "ComfyUI-SuperBeasts", + "id": "superbeasts", + "reference": "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts", + "files": [ + "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts" + ], + "install_type": "git-clone", + "description": "Nodes:HDR Effects (SuperBeasts.AI). This repository contains custom nodes for ComfyUI created and used by SuperBeasts.AI (@SuperBeasts.AI on Instagram)" + }, + { + "author": "hay86", + "title": "ComfyUI Dreamtalk", + "id": "dreamtalk", + "reference": "https://github.com/hay86/ComfyUI_Dreamtalk", + "files": [ + "https://github.com/hay86/ComfyUI_Dreamtalk" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/dreamtalk](https://github.com/ali-vilab/dreamtalk) for ComfyUI" + }, + { + "author": "hay86", + "title": "ComfyUI Hallo", + "id": "hallo-hay86", + "reference": "https://github.com/hay86/ComfyUI_Hallo", + "files": [ + "https://github.com/hay86/ComfyUI_Hallo" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/hallo](https://github.com/fudan-generative-vision/hallo) for ComfyUI" + }, + { + "author": "hay86", + "title": "ComfyUI OpenVoice", + "id": "openvoice-hay86", + "reference": "https://github.com/hay86/ComfyUI_OpenVoice", + "files": [ + "https://github.com/hay86/ComfyUI_OpenVoice" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/OpenVoice](https://github.com/myshell-ai/OpenVoice) for ComfyUI" + }, + { + "author": "hay86", + "title": "ComfyUI DDColor", + "id": "ddcolor-hay86", + "reference": "https://github.com/hay86/ComfyUI_DDColor", + "files": [ + "https://github.com/hay86/ComfyUI_DDColor" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/DDColor](https://github.com/piddnad/DDColor) for ComfyUI" + }, + { + "author": "hay86", + "title": "ComfyUI MiniCPM-V", + "id": "minicpm-v", + "reference": "https://github.com/hay86/ComfyUI_MiniCPM-V", + "files": [ + "https://github.com/hay86/ComfyUI_MiniCPM-V" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/MiniCPM-V](https://github.com/OpenBMB/MiniCPM-V) for ComfyUI" + }, + { + "author": "hay86", + "title": "ComfyUI AceNodes", + "reference": "https://github.com/hay86/ComfyUI_AceNodes", + "files": [ + "https://github.com/hay86/ComfyUI_AceNodes" + ], + "install_type": "git-clone", + "description": "Some useful custom nodes that are not included in ComfyUI core yet." + }, + { + "author": "shinich39", + "title": "comfyui-load-image-in-seq", + "reference": "https://github.com/shinich39/comfyui-load-image-in-seq", + "files": [ + "https://github.com/shinich39/comfyui-load-image-in-seq" + ], + "install_type": "git-clone", + "description": "This node is load png image sequentially with metadata. Only supported for PNG format that has been created by ComfyUI.[w/renamed from comfyui-load-image-39. You need to remove previous one and reinstall to this.]" + }, + { + "author": "shinich39", + "title": "comfyui-random-node", + "id": "random-node", + "reference": "https://github.com/shinich39/comfyui-ramdom-node", + "files": [ + "https://github.com/shinich39/comfyui-ramdom-node" + ], + "install_type": "git-clone", + "description": "Shuffle nodes after queue added. [w/Repository name has been changed from comfyui-random-node-39 to comfyui-random-node. Please remove and reinstall it.]" + }, + { + "author": "shinich39", + "title": "comfyui-local-db", + "reference": "https://github.com/shinich39/comfyui-local-db", + "files": [ + "https://github.com/shinich39/comfyui-local-db" + ], + "install_type": "git-clone", + "description": "Store text to Key-Values pair json." + }, + { + "author": "wei30172", + "title": "comfygen", + "reference": "https://github.com/wei30172/comfygen", + "files": [ + "https://github.com/wei30172/comfygen" + ], + "install_type": "git-clone", + "description": "Setting Up a Web Interface Using ComfyUI.\nNOTE:When installed, you can access it via http://127.0.0.1:8188/comfygen." + }, + { + "author": "zombieyang", + "title": "SD-PPP", + "reference": "https://github.com/zombieyang/sd-ppp", + "files": [ + "https://github.com/zombieyang/sd-ppp" + ], + "install_type": "git-clone", + "description": "!!Another custom node about Photoshop!! PPP means interoP with your PhotoshoP. You can get or send layers from/to your Photoshop. This custom node is easier to use." + }, + { + "author": "KytraScript", + "title": "ComfyUI_KytraWebhookHTTP", + "reference": "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP", + "files": [ + "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP" + ], + "install_type": "git-clone", + "description": "A ComfyUI node that utilizes Moviepy to convert and send your images or videos to a webhook endpoint directly from ComfyUI." + }, + { + "author": "1mckw", + "title": "Comfyui-Gelbooru", + "reference": "https://github.com/1mckw/Comfyui-Gelbooru", + "files": [ + "https://github.com/1mckw/Comfyui-Gelbooru" + ], + "install_type": "git-clone", + "description": "Get random images from gelbooru, support multiple tag searches, exclude tags, etc. user and api key are optional." + }, + { + "author": "NeuralSamurAI", + "title": "SuperPrompter Node for ComfyUI", + "reference": "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial", + "files": [ + "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial" + ], + "install_type": "git-clone", + "description": "The SuperPrompter node is a ComfyUI node that uses the SuperPrompt-v1 model from Hugging Face to generate text based on a given prompt. It provides various parameters to control the text generation process." + }, + { + "author": "MokkaBoss1", + "title": "Node Pack mostly for manipulating strings and integers", + "reference": "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1/wiki/Documentation-for-the-ComfyUI-Nodes-in-this-Node-Pack", + "files": [ + "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1" + ], + "install_type": "git-clone", + "description": "Node Pack mostly for manipulating strings and integers" + }, + { + "author": "jiaxiangc", + "title": "ResAdapter for ComfyUI", + "reference": "https://github.com/jiaxiangc/ComfyUI-ResAdapter", + "files": [ + "https://github.com/jiaxiangc/ComfyUI-ResAdapter" + ], + "install_type": "git-clone", + "description": "We provide ComfyUI-ResAdapter node to help users to use [a/ResAdapter](https://github.com/bytedance/res-adapter) in ComfyUI." + }, + { + "author": "ParisNeo", + "title": "lollms_nodes_suite", + "reference": "https://github.com/ParisNeo/lollms_nodes_suite", + "files": [ + "https://github.com/ParisNeo/lollms_nodes_suite" + ], + "install_type": "git-clone", + "description": "lollms_nodes_suite is a set of nodes for comfyui that harnesses the power of lollms, a state-of-the-art AI text generation tool, to improve the quality of image generation." + }, + { + "author": "IsItDanOrAi", + "title": "ComfyUI-Stereopsis", + "reference": "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis", + "files": [ + "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis" + ], + "install_type": "git-clone", + "description": "This initiative represents a solo venture dedicated to integrating a stereopsis effect within ComfyUI (Stable Diffusion). Presently, the project is focused on the refinement of node categorization within a unified framework, as it is in the early stages of development. However, it has achieved functionality in a fundamental capacity. By processing a video through the Side-by-Side (SBS) node and applying Frame Delay to one of the inputs, it facilitates the creation of a stereopsis effect. This effect is compatible with any Virtual Reality headset that supports SBS video playback, offering a practical application in immersive media experiences." + }, + { + "author": "nickve28", + "title": "ComfyUI Nich Utils", + "reference": "https://github.com/nickve28/ComfyUI-Nich-Utils", + "files": [ + "https://github.com/nickve28/ComfyUI-Nich-Utils" + ], + "install_type": "git-clone", + "description": "Several utility nodes for use with ComfyUI." + }, + { + "author": "FrankChieng", + "title": "ComfyUI_Aniportrait", + "reference": "https://github.com/frankchieng/ComfyUI_Aniportrait", + "files": [ + "https://github.com/frankchieng/ComfyUI_Aniportrait" + ], + "install_type": "git-clone", + "description": "implementation of [a/AniPortrait](https://github.com/Zejun-Yang/AniPortrait) generating of videos, includes self driven, face reenacment and audio driven with a reference image" + }, + { + "author": "FrankChieng", + "title": "ComfyUI_MagicClothing", + "reference": "https://github.com/frankchieng/ComfyUI_MagicClothing", + "files": [ + "https://github.com/frankchieng/ComfyUI_MagicClothing" + ], + "install_type": "git-clone", + "description": "implementation of MagicClothing with garment and prompt in ComfyUI" + }, + { + "author": "BlakeOne", + "title": "ComfyUI SchedulerMixer", + "reference": "https://github.com/BlakeOne/ComfyUI-SchedulerMixer", + "files": [ + "https://github.com/BlakeOne/ComfyUI-SchedulerMixer" + ], + "install_type": "git-clone", + "description": "Create a custom scheduler from a weighted average of the built-in schedulers" + }, + { + "author": "BlakeOne", + "title": "ComfyUI CustomScheduler", + "reference": "https://github.com/BlakeOne/ComfyUI-CustomScheduler", + "files": [ + "https://github.com/BlakeOne/ComfyUI-CustomScheduler" + ], + "install_type": "git-clone", + "description": "Simple node for setting the sigma values directly. Note, for a full denoise the last sigma should be zero." + }, + { + "author": "BlakeOne", + "title": "ComfyUI NodePresets", + "id": "nodepresets", + "reference": "https://github.com/BlakeOne/ComfyUI-NodePresets", + "files": [ + "https://github.com/BlakeOne/ComfyUI-NodePresets" + ], + "install_type": "git-clone", + "description": "An extension for ComyUI that enables saving and loading node presets using the node's context menu.\nRight click a node and choose 'Presets' from its context menu to access the node's presets." + }, + { + "author": "BlakeOne", + "title": "ComfyUI NodeReset", + "id": "nodereset", + "reference": "https://github.com/BlakeOne/ComfyUI-NodeReset", + "files": [ + "https://github.com/BlakeOne/ComfyUI-NodeReset" + ], + "install_type": "git-clone", + "description": "An extension for ComyUI to allow resetting a node's inputs to their default values.\nNOTE:Right click any node and choose 'Reset' from the context menu." + }, + { + "author": "kale4eat", + "title": "ComfyUI_demucus", + "id": "demucus", + "reference": "https://github.com/kale4eat/ComfyUI-path-util", + "files": [ + "https://github.com/kale4eat/ComfyUI-path-util" + ], + "install_type": "git-clone", + "description": "Path utility for ComfyUI" + }, + { + "author": "kale4eat", + "title": "ComfyUI-string-util", + "reference": "https://github.com/kale4eat/ComfyUI-string-util", + "files": [ + "https://github.com/kale4eat/ComfyUI-string-util" + ], + "install_type": "git-clone", + "description": "String utility for ComfyUI" + }, + { + "author": "kale4eat", + "title": "ComfyUI-text-file-util", + "reference": "https://github.com/kale4eat/ComfyUI-text-file-util", + "files": [ + "https://github.com/kale4eat/ComfyUI-text-file-util" + ], + "install_type": "git-clone", + "description": "Text file utility for ComfyUI" + }, + { + "author": "kale4eat", + "title": "ComfyUI-speech-dataset-toolkit", + "reference": "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit", + "files": [ + "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit" + ], + "install_type": "git-clone", + "description": "Basic audio tools using torchaudio for ComfyUI. It is assumed to assist in the speech dataset creation for ASR, TTS, etc." + }, + { + "author": "DrMWeigand", + "title": "ComfyUI Color Detection Nodes", + "reference": "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection", + "files": [ + "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection" + ], + "install_type": "git-clone", + "description": "A collection of nodes for detecting color in images, leveraging RGB and LAB color spaces. These nodes aim to distinguish colored images from black and white, including those with color tints." + }, + { + "author": "bobmagicii", + "title": "ComfyKit Custom Nodes", + "reference": "https://github.com/bobmagicii/comfykit-custom-nodes", + "files": [ + "https://github.com/bobmagicii/comfykit-custom-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:LoraWithMetadata, TypecasterImage." + }, + { + "author": "TJ16th", + "title": "comfyUI_TJ_NormalLighting", + "reference": "https://github.com/TJ16th/comfyUI_TJ_NormalLighting", + "files": [ + "https://github.com/TJ16th/comfyUI_TJ_NormalLighting" + ], + "install_type": "git-clone", + "description": "Custom Node for comfyUI for virtual lighting based on normal map.\nYou can use normal maps to add virtual lighting effects to your images." + }, + { + "author": "A4P7J1N7M05OT", + "title": "ComfyUI-PixelOE", + "reference": "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE", + "files": [ + "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE" + ], + "install_type": "git-clone", + "description": "A barebones ComfyUI wrapper for [a/PixelOE](https://github.com/KohakuBlueleaf/PixelOE).\nI cannot promise any support, if there is someone who wants to make a proper node, please do." + }, + { + "author": "A4P7J1N7M05OT", + "title": "ComfyUI-AutoColorGimp", + "reference": "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp", + "files": [ + "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp" + ], + "install_type": "git-clone", + "description": "Shamelessly copied the code to auto color correct the image like in gimp from this answer: [a/https://stackoverflow.com/a/56365560/4561887](https://stackoverflow.com/a/56365560/4561887)" + }, + { + "author": "ronniebasak", + "title": "ComfyUI-Tara-LLM-Integration", + "id": "tarallm", + "reference": "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration", + "files": [ + "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration" + ], + "install_type": "git-clone", + "description": "Tara is a powerful node for ComfyUI that integrates Large Language Models (LLMs) to enhance and automate workflow processes. With Tara, you can create complex, intelligent workflows that refine and generate content, manage API keys, and seamlessly integrate various LLMs into your projects." + }, + { + "author": "Sida Liu", + "title": "ComfyUI-Debug", + "id": "debug", + "reference": "https://github.com/liusida/ComfyUI-Debug", + "files": [ + "https://github.com/liusida/ComfyUI-Debug" + ], + "install_type": "git-clone", + "description": "Attach a debug node to an output to obtain more detailed information. Uncover the details of your models in ComfyUI with ease." + }, + { + "author": "Sida Liu", + "title": "ComfyUI-Login", + "id": "login", + "reference": "https://github.com/liusida/ComfyUI-Login", + "files": [ + "https://github.com/liusida/ComfyUI-Login" + ], + "install_type": "git-clone", + "description": "A simple password to protect ComfyUI." + }, + { + "author": "Sida Liu", + "title": "ComfyUI-AutoCropFaces", + "id": "autocropfaces", + "reference": "https://github.com/liusida/ComfyUI-AutoCropFaces", + "files": [ + "https://github.com/liusida/ComfyUI-AutoCropFaces" + ], + "install_type": "git-clone", + "description": "Use RetinaFace to detect and automatically crop faces." + }, + { + "author": "Sida Liu", + "title": "ComfyUI-SD3-nodes", + "id": "sd3-nodes", + "reference": "https://github.com/liusida/ComfyUI-SD3-nodes", + "files": [ + "https://github.com/liusida/ComfyUI-SD3-nodes" + ], + "install_type": "git-clone", + "description": "Nodes that support Stable Diffusion 3 Medium better." + }, + { + "author": "Sida Liu", + "title": "ComfyUI-B-LoRA", + "id": "b-lora", + "reference": "https://github.com/liusida/ComfyUI-B-LoRA", + "files": [ + "https://github.com/liusida/ComfyUI-B-LoRA" + ], + "install_type": "git-clone", + "description": "Load and apply B-LoRA models, currently B-LoRA models only works with SDXL (sdxl_base_1.0)." + }, + { + "author": "jtydhr88", + "title": "ComfyUI-Workflow-Encrypt", + "id": "workflow-encrypt", + "reference": "https://github.com/jtydhr88/ComfyUI-Workflow-Encrypt", + "files": [ + "https://github.com/jtydhr88/ComfyUI-Workflow-Encrypt" + ], + "install_type": "git-clone", + "description": "Encrypt your comfyui workflow, and share it with key" + }, + { + "author": "jtydhr88", + "title": "ComfyUI LayerDivider", + "id": "layer-divider", + "reference": "https://github.com/jtydhr88/ComfyUI-LayerDivider", + "files": [ + "https://github.com/jtydhr88/ComfyUI-LayerDivider" + ], + "install_type": "git-clone", + "description": "ComfyUI LayerDivider is custom nodes that generating layered psd files inside ComfyUI[w/Please follow readme and run install_windows_portable_win_py311_cu121 for ComfyUI embedded python.]" + }, + { + "author": "jtydhr88", + "title": "ComfyUI Unique3D", + "id": "unique3d", + "reference": "https://github.com/jtydhr88/ComfyUI-Unique3D", + "files": [ + "https://github.com/jtydhr88/ComfyUI-Unique3D" + ], + "install_type": "git-clone", + "description": "ComfyUI Unique3D is custom nodes that running AiuniAI/Unique3D into ComfyUI[w/Please follow readme to install with ComfyUI embedded python.]" + }, + { + "author": "SeaArtLab", + "title": "ComfyUI-Long-CLIP", + "reference": "https://github.com/SeaArtLab/ComfyUI-Long-CLIP", + "files": [ + "https://github.com/SeaArtLab/ComfyUI-Long-CLIP" + ], + "install_type": "git-clone", + "description": "This project implements the comfyui for long-clip, currently supporting the replacement of clip-l. For SD1.5, the SeaArtLongClip module can be used to replace the original clip in the model, expanding the token length from 77 to 248." + }, + { + "author": "tsogzark", + "title": "ComfyUI-load-image-from-url", + "reference": "https://github.com/tsogzark/ComfyUI-load-image-from-url", + "files": [ + "https://github.com/tsogzark/ComfyUI-load-image-from-url" + ], + "install_type": "git-clone", + "description": "A simple node to load image from local path or http url.\nYou can find this node from 'image' category." + }, + { + "author": "discus0434", + "title": "ComfyUI Caching Embeddings", + "id": "caching-embeddings", + "reference": "https://github.com/discus0434/comfyui-caching-embeddings", + "files": [ + "https://github.com/discus0434/comfyui-caching-embeddings" + ], + "install_type": "git-clone", + "description": "This repository simply caches the CLIP embeddings and subtly accelerates the inference process by bypassing unnecessary computations." + }, + { + "author": "discus0434", + "title": "ComfyUI Aesthetic Predictor V2.5", + "id": "caching-embeddings", + "reference": "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5", + "files": [ + "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5" + ], + "install_type": "git-clone", + "description": "Simple ComfyUI node that predicts the score of an aesthetic image with SigLIP-based predictor." + }, + { + "author": "AIFSH", + "title": "ComfyUI-UVR5", + "id": "uvr5", + "reference": "https://github.com/AIFSH/ComfyUI-UVR5", + "files": [ + "https://github.com/AIFSH/ComfyUI-UVR5" + ], + "install_type": "git-clone", + "description": "the custom code for [a/UVR5](https://github.com/Anjok07/ultimatevocalremovergui) to separate vocals and background music" + }, + { + "author": "AIFSH", + "title": "ComfyUI-IP_LAP", + "id": "iplap", + "reference": "https://github.com/AIFSH/ComfyUI-IP_LAP", + "files": [ + "https://github.com/AIFSH/ComfyUI-IP_LAP" + ], + "install_type": "git-clone", + "description": "Nodes:IP_LAP Node, Video Loader, PreView Video, Combine Audio Video. the comfyui custom node of [a/IP_LAP](https://github.com/Weizhi-Zhong/IP_LAP) to make audio driven videos!" + }, + { + "author": "AIFSH", + "title": "ComfyUI-GPT_SoVITS", + "id": "sovits", + "reference": "https://github.com/AIFSH/ComfyUI-GPT_SoVITS", + "files": [ + "https://github.com/AIFSH/ComfyUI-GPT_SoVITS" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS)! you can voice cloning and tts in comfyui now\n[w/NOTE:make sure ffmpeg is worked in your commandline]" + }, + { + "author": "AIFSH", + "title": "ComfyUI-MuseTalk_FSH", + "id": "musetalk-fsh", + "reference": "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH", + "files": [ + "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH" + ], + "install_type": "git-clone", + "description": "the comfyui custom node of [a/MuseTalk](https://github.com/TMElyralab/MuseTalk) to make audio driven videos!" + }, + { + "author": "AIFSH", + "title": "ComfyUI-WhisperX", + "id": "whisperx", + "reference": "https://github.com/AIFSH/ComfyUI-WhisperX", + "files": [ + "https://github.com/AIFSH/ComfyUI-WhisperX" + ], + "install_type": "git-clone", + "description": "a comfyui cuatom node for audio subtitling based on [a/whisperX](https://github.com/m-bain/whisperX.git) and [a/translators](https://github.com/UlionTse/translators)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-RVC", + "id": "aifsh-rvc", + "reference": "https://github.com/AIFSH/ComfyUI-RVC", + "files": [ + "https://github.com/AIFSH/ComfyUI-RVC" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/Retrieval-based-Voice-Conversion-WebUI](https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git), you can Voice-Conversion in comfyui now!\nNOTE: make sure ffmpeg is worked in your commandline for Linux" + }, + { + "author": "AIFSH", + "title": "ComfyUI-XTTS", + "id": "xtts", + "reference": "https://github.com/AIFSH/ComfyUI-XTTS", + "files": [ + "https://github.com/AIFSH/ComfyUI-XTTS" + ], + "install_type": "git-clone", + "description": "a custom comfyui node for [a/coqui-ai/TTS](https://github.com/coqui-ai/TTS.git)'s xtts module! support 17 languages voice cloning and tts" + }, + { + "author": "AIFSH", + "title": "ComfyUI-Live2DViewer", + "id": "live2dviewer", + "reference": "https://github.com/AIFSH/ComfyUI-Live2DViewer", + "files": [ + "https://github.com/AIFSH/ComfyUI-Live2DViewer" + ], + "install_type": "git-clone", + "description": "a comfyui node for viewing Live2D model" + }, + { + "author": "AIFSH", + "title": "ComfyUI-FishSpeech", + "id": "fishspeech", + "reference": "https://github.com/AIFSH/ComfyUI-FishSpeech", + "files": [ + "https://github.com/AIFSH/ComfyUI-FishSpeech" + ], + "install_type": "git-clone", + "description": "a custom comfyui node for [a/fish-speech](https://github.com/fishaudio/fish-speech.git)" + }, + { + "author": "AIFSH", + "title": "ComfyUI_V-Express", + "id": "v-express-aifsh", + "reference": "https://github.com/AIFSH/ComfyUI_V-Express", + "files": [ + "https://github.com/AIFSH/ComfyUI_V-Express" + ], + "install_type": "git-clone", + "description": "the comfyui custom node of [a/V-Express](https://github.com/tencent-ailab/V-Express) to make audio driven videos!" + }, + { + "author": "AIFSH", + "title": "ComfyUI-MimicBrush", + "id": "mimicbrush", + "reference": "https://github.com/AIFSH/ComfyUI-MimicBrush", + "files": [ + "https://github.com/AIFSH/ComfyUI-MimicBrush" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/MimicBrush](https://github.com/ali-vilab/MimicBrush),then inpainting with reference image." + }, + { + "author": "AIFSH", + "title": "ComfyUI-Hallo", + "id": "hallo", + "reference": "https://github.com/AIFSH/ComfyUI-Hallo", + "files": [ + "https://github.com/AIFSH/ComfyUI-Hallo" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/hallo](https://github.com/fudan-generative-vision/hallo)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-UniAnimate", + "id": "unianimate", + "reference": "https://github.com/AIFSH/ComfyUI-UniAnimate", + "files": [ + "https://github.com/AIFSH/ComfyUI-UniAnimate" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/UniAnimate](https://github.com/ali-vilab/UniAnimate)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-3d-photo-inpainting", + "id": "3d-photo-inpainting", + "reference": "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting", + "files": [ + "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/3d-photo-inpainting](https://github.com/vt-vl-lab/3d-photo-inpainting),then you can render one image to zoom-in/dolly zoom/swing motion/circle motion video" + }, + { + "author": "AIFSH", + "title": "AIFSH/ComfyUI-AuraSR", + "id": "aurasr-aifsh", + "reference": "https://github.com/AIFSH/ComfyUI-AuraSR", + "files": [ + "https://github.com/AIFSH/ComfyUI-AuraSR" + ], + "install_type": "git-clone", + "description": "a node for [a/AuraSR](https://github.com/fal-ai/aura-sr)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-MARS5-TTS", + "id": "mars5-tts", + "reference": "https://github.com/AIFSH/ComfyUI-MARS5-TTS", + "files": [ + "https://github.com/AIFSH/ComfyUI-MARS5-TTS" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/MARS5-TTS](https://github.com/Camb-ai/MARS5-TTS)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-I2V-Adapter", + "id": "i2v-adapter", + "reference": "https://github.com/AIFSH/ComfyUI-I2V-Adapter", + "files": [ + "https://github.com/AIFSH/ComfyUI-I2V-Adapter" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/I2V-Adapter](https://github.com/KwaiVGI/I2V-Adapter)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-MimicMotion", + "id": "mimicmotion-aifsh", + "reference": "https://github.com/AIFSH/ComfyUI-MimicMotion", + "files": [ + "https://github.com/AIFSH/ComfyUI-MimicMotion" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/MimicMotion](https://github.com/Tencent/MimicMotion)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-DiffSynth-Studio", + "id": "diffsynth-studio", + "reference": "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio", + "files": [ + "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio" + ], + "install_type": "git-clone", + "description": "make [a/DiffSynth-Studio](https://github.com/modelscope/DiffSynth-Studio) available in ComfyUI" + }, + { + "author": "Koishi-Star", + "title": "Euler-Smea-Dyn-Sampler", + "id": "smea", + "reference": "https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler", + "files": [ + "https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler" + ], + "install_type": "git-clone", + "description": "СomfyUI version of [a/Euler Smea Dyn Sampler](https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler). It adds samplers directly to KSampler nodes." + }, + { + "author": "sdfxai", + "title": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration", + "id": "sdfx", + "reference": "https://github.com/sdfxai/SDFXBridgeForComfyUI", + "files": [ + "https://github.com/sdfxai/SDFXBridgeForComfyUI" + ], + "install_type": "git-clone", + "description": "SDFXBridgeForComfyUI is a custom node designed for seamless integration between ComfyUI and SDFX. This custom node allows users to make ComfyUI compatible with SDFX when running the ComfyUI instance on their local machines." + }, + { + "author": "smthemex", + "title": "ComfyUI_ChatGLM_API", + "id": "chatglm-api", + "reference": "https://github.com/smthemex/ComfyUI_ChatGLM_API", + "files": [ + "https://github.com/smthemex/ComfyUI_ChatGLM_API" + ], + "install_type": "git-clone", + "description": "You can call Chatglm's API in comfyUI to translate and describe pictures, and the API similar to OpenAI." + }, + { + "author": "smthemex", + "title": "ComfyUI_StableAudio_Open", + "id": "stable-audio-open-1.0", + "reference": "https://github.com/smthemex/ComfyUI_StableAudio_Open", + "files": [ + "https://github.com/smthemex/ComfyUI_StableAudio_Open" + ], + "install_type": "git-clone", + "description": "You can use stable-audio-open-1.0 in comfyUI" + }, + { + "author": "smthemex", + "title": "ComfyUI_AnyDoor", + "id": "ComfyUI_AnyDoor", + "reference": "https://github.com/smthemex/ComfyUI_AnyDoor", + "files": [ + "https://github.com/smthemex/ComfyUI_AnyDoor" + ], + "install_type": "git-clone", + "description": "You can use anydoor, change clothes or object..." + }, + { + "author": "smthemex", + "title": "ComfyUI_HiDiffusion_Pro", + "id": "hidiffusion-pro", + "reference": "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro", + "files": [ + "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro" + ], + "install_type": "git-clone", + "description": "A HiDiffusion node for ComfyUI." + }, + { + "author": "smthemex", + "title": "ComfyUI_StoryDiffusion", + "id": "StoryDiffusion", + "reference": "https://github.com/smthemex/ComfyUI_StoryDiffusion", + "files": [ + "https://github.com/smthemex/ComfyUI_StoryDiffusion" + ], + "install_type": "git-clone", + "description": "A StoryDiffusion node for ComfyUI." + }, + { + "author": "smthemex", + "title": "ComfyUI_MS_Diffusion", + "id": "MS_Diffusion", + "reference": "https://github.com/smthemex/ComfyUI_MS_Diffusion", + "files": [ + "https://github.com/smthemex/ComfyUI_MS_Diffusion" + ], + "install_type": "git-clone", + "description": "You can using MS-diffusion make story in comfyUI." + }, + { + "author": "smthemex", + "title": "ComfyUI_Pic2Story", + "id": "pic2story", + "reference": "https://github.com/smthemex/ComfyUI_Pic2Story", + "files": [ + "https://github.com/smthemex/ComfyUI_Pic2Story" + ], + "install_type": "git-clone", + "description": "ComfyUI simple node based on BLIP method, with the function of Image to Txt." + }, + { + "author": "smthemex", + "title": "ComfyUI_Llama3_8B", + "id": "llama3-8b", + "reference": "https://github.com/smthemex/ComfyUI_Llama3_8B", + "files": [ + "https://github.com/smthemex/ComfyUI_Llama3_8B" + ], + "install_type": "git-clone", + "description": "Llama3_8B for comfyUI, using pipeline workflow." + }, + { + "author": "smthemex", + "title": "ComfyUI_ParlerTTS", + "id": "parlertts", + "reference": "https://github.com/smthemex/ComfyUI_ParlerTTS", + "files": [ + "https://github.com/smthemex/ComfyUI_ParlerTTS" + ], + "install_type": "git-clone", + "description": "You can call the ParlerTTS tool in comfyUI, which currently only supports English." + }, + { + "author": "smthemex", + "title": "ComfyUI_Pipeline_Tool", + "id": "pipeline-tool", + "reference": "https://github.com/smthemex/ComfyUI_Pipeline_Tool", + "files": [ + "https://github.com/smthemex/ComfyUI_Pipeline_Tool" + ], + "install_type": "git-clone", + "description": "A tool for novice users in Chinese Mainland to call the huggingface hub and download the huggingface models." + }, + { + "author": "smthemex", + "title": "ComfyUI_ID_Animator", + "id": "id-animator", + "reference": "https://github.com/smthemex/ComfyUI_ID_Animator", + "files": [ + "https://github.com/smthemex/ComfyUI_ID_Animator" + ], + "install_type": "git-clone", + "description": "This node allows you to use ID_Animator, the zero shot video generation model" + }, + { + "author": "smthemex", + "title": "ComfyUI_CustomNet", + "id": "customnet", + "reference": "https://github.com/smthemex/ComfyUI_CustomNet", + "files": [ + "https://github.com/smthemex/ComfyUI_CustomNet" + ], + "install_type": "git-clone", + "description": "This node allows you to use customnet." + }, + { + "author": "smthemex", + "title": "ComfyUI_Pops", + "id": "pops", + "reference": "https://github.com/smthemex/ComfyUI_Pops", + "files": [ + "https://github.com/smthemex/ComfyUI_Pops" + ], + "install_type": "git-clone", + "description": "You can use [a/Popspaper](https://popspaper.github.io/pOps/) method in comfyUI" + }, + { + "author": "smthemex", + "title": "ComfyUI_Streamv2v_Plus", + "id": "streamv2v", + "reference": "https://github.com/smthemex/ComfyUI_Streamv2v_Plus", + "files": [ + "https://github.com/smthemex/ComfyUI_Streamv2v_Plus" + ], + "install_type": "git-clone", + "description": "[a/StreamV2V](https://github.com/Jeff-LiangF/streamv2v) for ComfyUI" + }, + { + "author": "choey", + "title": "Comfy-Topaz", + "id": "topaz", + "reference": "https://github.com/choey/Comfy-Topaz", + "files": [ + "https://github.com/choey/Comfy-Topaz" + ], + "install_type": "git-clone", + "description": "Comfy-Topaz is a custom node for ComfyUI, which integrates with Topaz Photo AI to enhance (upscale, sharpen, denoise, etc.) images, allowing this traditionally asynchronous step to become a part of ComfyUI workflows.\nNOTE:Licensed installation of Topaz Photo AI" + }, + { + "author": "ALatentPlace", + "title": "ComfyUI_yanc", + "id": "yanc", + "reference": "https://github.com/ALatentPlace/ComfyUI_yanc", + "files": [ + "https://github.com/ALatentPlace/ComfyUI_yanc" + ], + "install_type": "git-clone", + "description": "Yet Another Node Collection. Adds some useful nodes, check out the GitHub page for more details." + }, + { + "author": "Wicloz", + "title": "ComfyUI Simply Nodes", + "reference": "https://github.com/Wicloz/ComfyUI-Simply-Nodes", + "files": [ + "https://github.com/Wicloz/ComfyUI-Simply-Nodes" + ], + "install_type": "git-clone", + "description": "Simple nodes to help clean up your workflow, mostly focussed on text operations." + }, + { + "author": "wandbrandon", + "title": "comfyui-pixel", + "id": "pixel", + "reference": "https://github.com/wandbrandon/comfyui-pixel", + "files": [ + "https://github.com/wandbrandon/comfyui-pixel" + ], + "install_type": "git-clone", + "description": "pixel art workshop nodes for comfyui." + }, + { + "author": "nullquant", + "title": "BrushNet", + "id": "brushnet", + "reference": "https://github.com/nullquant/ComfyUI-BrushNet", + "files": [ + "https://github.com/nullquant/ComfyUI-BrushNet" + ], + "install_type": "git-clone", + "description": "Custom nodes for ComfyUI allow to inpaint using Brushnet: '[a/BrushNet: A Plug-and-Play Image Inpainting Model with Decomposed Dual-Branch Diffusion](https://arxiv.org/abs/2403.06976)'." + }, + { + "author": "pamparamm", + "title": "Perturbed-Attention Guidance", + "id": "pag", + "reference": "https://github.com/pamparamm/sd-perturbed-attention", + "files": [ + "https://github.com/pamparamm/sd-perturbed-attention" + ], + "install_type": "git-clone", + "description": "Perturbed-Attention Guidance node for ComfyUI." + }, + { + "author": "pamparamm", + "title": "ComfyUI Vectorscope CC", + "id": "vectorscope", + "reference": "https://github.com/pamparamm/ComfyUI-vectorscope-cc", + "files": [ + "https://github.com/pamparamm/ComfyUI-vectorscope-cc" + ], + "install_type": "git-clone", + "description": "ComfyUI port of a wonderful extension [a/SD Webui Vectorscope CC by Haoming02](https://github.com/Haoming02/sd-webui-vectorscope-cc).\nBased on (and probably incompatible with) [a/ComfyUI Diffusion Color Grading by Haoming02](https://github.com/Haoming02/comfyui-diffusion-cg)." + }, + { + "author": "unwdef", + "title": "unwdef-nodes", + "reference": "https://github.com/unwdef/unwdef-nodes-comfyui", + "files": [ + "https://github.com/unwdef/unwdef-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "Custom nodes for ComfyUI by unwdef." + }, + { + "author": "fevre27", + "title": "Self-Guidance nodes", + "id": "self-guidance", + "reference": "https://github.com/forever22777/comfyui-self-guidance", + "files": [ + "https://github.com/forever22777/comfyui-self-guidance" + ], + "install_type": "git-clone", + "description": "Unofficial ComfyUI implementation of Self-Guidance." + }, + { + "author": "aburahamu", + "title": "ComfyUI-RequestPoster", + "id": "request-poster", + "reference": "https://github.com/aburahamu/ComfyUI-RequestsPoster", + "files": [ + "https://github.com/aburahamu/ComfyUI-RequestsPoster" + ], + "install_type": "git-clone", + "description": "This extension can send HTTP Requests. You can request image generation to StableDiffusion3 and post images to X (Twitter) and Discord." + }, + { + "author": "aburahamu", + "title": "ComfyUI-IsNiceParts", + "id": "isniceparts", + "reference": "https://github.com/aburahamu/ComfyUI-IsNiceParts", + "files": [ + "https://github.com/aburahamu/ComfyUI-IsNiceParts" + ], + "install_type": "git-clone", + "description": "This custom node detects body parts (currently only hands) from the received image and outputs the image if the skeleton can be estimated." + }, + { + "author": "Sorcerio", + "title": "MBM's Music Visualizer", + "reference": "https://github.com/Sorcerio/MBM-Music-Visualizer", + "files": [ + "https://github.com/Sorcerio/MBM-Music-Visualizer" + ], + "install_type": "git-clone", + "description": "An image generation based music visualizer integrated into comfyanonymous/ComfyUI as custom nodes." + }, + { + "author": "quadmoon", + "title": "quadmoon's ComfyUI nodes", + "reference": "https://github.com/traugdor/ComfyUI-quadMoons-nodes", + "files": [ + "https://github.com/traugdor/ComfyUI-quadMoons-nodes" + ], + "install_type": "git-clone", + "description": "These are just some nodes I wanted and couldn't find where anyone else had made them yet." + }, + { + "author": "quadme7macoon", + "title": "ComfyUI-ShadertoyGL", + "reference": "https://github.com/e7mac/ComfyUI-ShadertoyGL", + "files": [ + "https://github.com/e7mac/ComfyUI-ShadertoyGL" + ], + "install_type": "git-clone", + "description": "Nodes:Shadertoy, Shader, ColorChannelOffset." + }, + { + "author": "royceschultz", + "title": "ComfyUI-TranscriptionTools", + "id": "transcription-tools", + "reference": "https://github.com/royceschultz/ComfyUI-TranscriptionTools", + "files": [ + "https://github.com/royceschultz/ComfyUI-TranscriptionTools" + ], + "install_type": "git-clone", + "description": "Transcribe audio and video files in ComfyUI." + }, + { + "author": "kunieone", + "title": "ComfyUI_alkaid", + "id": "alkadi", + "reference": "https://github.com/kunieone/ComfyUI_alkaid", + "files": [ + "https://github.com/kunieone/ComfyUI_alkaid" + ], + "install_type": "git-clone", + "description": "Nodes:A_Face3DSwapper, A_FaceCrop, A_FacePaste, A_OpenPosePreprocessor, A_EmptyLatentImageLongside, A_GetImageSize, AlkaidLoader, AdapterFaceLoader, AdapterStyleLoader, ..." + }, + { + "author": "txt2any", + "title": "ComfyUI-PromptOrganizer", + "id": "prompt-organizer", + "reference": "https://github.com/txt2any/ComfyUI-PromptOrganizer", + "files": [ + "https://github.com/txt2any/ComfyUI-PromptOrganizer" + ], + "install_type": "git-clone", + "description": "This is a custom node for ComfyUI that automatically saves your AI-generated images specifically to [a/www.txt2any.com](http://www.txt2any.com/)." + }, + { + "author": "kealiu", + "title": "ComfyUI Load and Save file to S3", + "id": "savefile-to-s3", + "reference": "https://github.com/kealiu/ComfyUI-S3-Tools", + "files": [ + "https://github.com/kealiu/ComfyUI-S3-Tools" + ], + "install_type": "git-clone", + "description": "Nodes:Load From S3, Save To S3." + }, + { + "author": "kealiu", + "title": "ComfyUI-ZeroShot-MTrans", + "id": "zeroshot-mtrans", + "reference": "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans", + "files": [ + "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans" + ], + "install_type": "git-clone", + "description": "An unofficial ComfyUI custom node for [a/Zero-Shot Material Transfer from a Single Image](https://ttchengab.github.io/zest), Given an input image (e.g., a photo of an apple) and a single material exemplar image (e.g., a golden bowl), ZeST can transfer the gold material from the exemplar onto the apple with accurate lighting cues while making everything else consistent." + }, + { + "author": "kealiu", + "title": "ComfyUI-Zero123-Porting", + "id": "zero123-porting", + "reference": "https://github.com/kealiu/ComfyUI-Zero123-Porting", + "files": [ + "https://github.com/kealiu/ComfyUI-Zero123-Porting" + ], + "install_type": "git-clone", + "description": "Zero-1-to-3: Zero-shot One Image to 3D Object, unofficial porting of original [Zero123](https://github.com/cvlab-columbia/zero123)" + }, + { + "author": "TashaSkyUp", + "title": "ComfyUI_LiteLLM", + "id": "litellm", + "reference": "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM", + "files": [ + "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM" + ], + "install_type": "git-clone", + "description": "Nodes for interfacing with LiteLLM" + }, + { + "author": "AonekoSS", + "title": "ComfyUI-SimpleCounter", + "id": "simplecounter", + "reference": "https://github.com/AonekoSS/ComfyUI-SimpleCounter", + "files": [ + "https://github.com/AonekoSS/ComfyUI-SimpleCounter" + ], + "install_type": "git-clone", + "description": "Node: utils/Simple Counter\nThis node is a simple counter, when pressing 'Queue Prompt' resets the count." + }, + { + "author": "AonekoSS", + "title": "ComfyUI-LoRA-Tuner", + "id": "lora-tuner", + "reference": "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner", + "files": [ + "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner" + ], + "install_type": "git-clone", + "description": "Nodes: LoRA-Tuner. For using multiple LoRA easily." + }, + { + "author": "heshengtao", + "title": "comfyui_LLM_party", + "id": "llm-party", + "reference": "https://github.com/heshengtao/comfyui_LLM_party", + "files": [ + "https://github.com/heshengtao/comfyui_LLM_party" + ], + "install_type": "git-clone", + "description": "A set of block-based LLM agent node libraries designed for ComfyUI.This project aims to develop a complete set of nodes for LLM workflow construction based on comfyui. It allows users to quickly and conveniently build their own LLM workflows and easily integrate them into their existing SD workflows." + }, + { + "author": "VAST-AI-Research", + "title": "Tripo for ComfyUI", + "id": "tripo", + "reference": "https://github.com/VAST-AI-Research/ComfyUI-Tripo", + "files": [ + "https://github.com/VAST-AI-Research/ComfyUI-Tripo" + ], + "install_type": "git-clone", + "description": "Custom nodes for using [a/Tripo](https://www.tripo3d.ai/) in ComfyUI to create 3D from text and image prompts." + }, + { + "author": "JettHu", + "title": "ComfyUI_TGate", + "id": "tgate", + "reference": "https://github.com/JettHu/ComfyUI_TGate", + "files": [ + "https://github.com/JettHu/ComfyUI_TGate" + ], + "install_type": "git-clone", + "description": "ComfyUI reference implementation for [a/T-GATE](https://github.com/HaozheLiu-ST/T-GATE)." + }, + { + "author": "JettHu", + "title": "ComfyUI-TCD", + "id": "jetthu-tcd", + "reference": "https://github.com/JettHu/ComfyUI-TCD", + "files": [ + "https://github.com/JettHu/ComfyUI-TCD" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation for [a/TCD](https://github.com/jabir-zheng/TCD)." + }, + { + "author": "sugarkwork", + "title": "comfyui_tag_filter", + "id": "tag-filter", + "reference": "https://github.com/sugarkwork/comfyui_tag_fillter", + "files": [ + "https://github.com/sugarkwork/comfyui_tag_fillter" + ], + "install_type": "git-clone", + "description": "This is a custom node of ComfyUI that categorizes tags outputted by tools like WD14Tagger, filters them by each category, and returns the filtered results." + }, + { + "author": "Intersection98", + "title": "ComfyUI-MX-post-processing-nodes", + "reference": "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes", + "files": [ + "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes" + ], + "install_type": "git-clone", + "description": "A collection of post processing nodes for ComfyUI, dds image post-processing adjustment capabilities to the ComfyUI." + }, + { + "author": "TencentQQGYLab", + "title": "ComfyUI-ELLA", + "id": "ella", + "reference": "https://github.com/TencentQQGYLab/ComfyUI-ELLA", + "files": [ + "https://github.com/TencentQQGYLab/ComfyUI-ELLA" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation for [a/ELLA](https://github.com/TencentQQGYLab/ELLA)." + }, + { + "author": "DarKDinDoN", + "title": "ComfyUI Checkpoint Automatic Config", + "id": "checkpoint-autoconfig", + "reference": "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config", + "files": [ + "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config" + ], + "install_type": "git-clone", + "description": "This node was designed to help with checkpoint configuration." + }, + { + "author": "MinusZoneAI", + "title": "ComfyUI-Prompt-MZ", + "id": "prompt-mz", + "reference": "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ", + "files": [ + "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ" + ], + "install_type": "git-clone", + "description": "Use llama.cpp to help generate some nodes for prompt word related work" + }, + { + "author": "MinusZoneAI", + "title": "ComfyUI-StylizePhoto-MZ", + "id": "stylizephoto", + "reference": "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ", + "files": [ + "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ" + ], + "install_type": "git-clone", + "description": "A stylized node with simple operation. The effect is achieved by I2I and lora. The clay style is currently implemented.Comes with watermark function." + }, + { + "author": "MinusZoneAI", + "title": "ComfyUI-TrainTools-MZ", + "id": "traintools", + "reference": "https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ", + "files": [ + "https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ" + ], + "install_type": "git-clone", + "description": "Nodes for fine-tuning lora in ComfyUI, dependent on training tools such as kohya-ss/sd-scripts" + }, + { + "author": "blueraincoatli", + "title": "comfyUI_SillyNodes", + "id": "silly", + "reference": "https://github.com/blueraincoatli/comfyUI_SillyNodes", + "files": [ + "https://github.com/blueraincoatli/comfyUI_SillyNodes" + ], + "install_type": "git-clone", + "description": "Using rgthree's fast_group_muter and bookmark nodes, introduce the pyautogui library to simulate clicks and hotkeys, and run groups in sequence. screen manipulation is involved" + }, + { + "author": "ty0x2333", + "title": "ComfyUI-Dev-Utils", + "id": "dev-utils", + "reference": "https://github.com/ty0x2333/ComfyUI-Dev-Utils", + "files": [ + "https://github.com/ty0x2333/ComfyUI-Dev-Utils" + ], + "install_type": "git-clone", + "description": "Execution Time Analysis, Reroute Enhancement, Node collection for developers." + }, + { + "author": "lquesada", + "title": "ComfyUI-Prompt-Combinator", + "id": "prompt-combinator", + "reference": "https://github.com/lquesada/ComfyUI-Prompt-Combinator", + "files": [ + "https://github.com/lquesada/ComfyUI-Prompt-Combinator" + ], + "install_type": "git-clone", + "description": "'🔢 Prompt Combinator' is a node that generates all possible combinations of prompts from several lists of strings.\n'🔢 Prompt Combinator Merger' is a node that enables merging the output of two different '🔢 Prompt Combinator' nodes." + }, + { + "author": "lquesada", + "title": "ComfyUI-Inpaint-CropAndStitch", + "id": "crop-and-stitch", + "reference": "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch", + "files": [ + "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch" + ], + "install_type": "git-clone", + "description": "'✂️ Inpaint Crop' is a node that crops an image before sampling. The context area can be specified via the mask, expand pixels and expand factor or via a separate (optional) mask.\n'✂️ Inpaint Stitch' is a node that stitches the inpainted image back into the original image without altering unmasked areas." + }, + { + "author": "randjtw", + "title": "advance-aesthetic-score", + "reference": "https://github.com/randjtw/advance-aesthetic-score", + "files": [ + "https://github.com/randjtw/advance-aesthetic-score" + ], + "install_type": "git-clone", + "description": "Nodes:Advance Aesthetic Score" + }, + { + "author": "FredBill1", + "title": "comfyui-fb-utils", + "id": "fb-utils", + "reference": "https://github.com/FredBill1/comfyui-fb-utils", + "files": [ + "https://github.com/FredBill1/comfyui-fb-utils" + ], + "install_type": "git-clone", + "description": "Nodes:FBStringJoin, FBStringSplit, FBMultilineStringList, FBMultilineString" + }, + { + "author": "jeffy5", + "title": "Faceless Node for ComfyUI", + "id": "faceless", + "reference": "https://github.com/jeffy5/comfyui-faceless-node", + "files": [ + "https://github.com/jeffy5/comfyui-faceless-node" + ], + "install_type": "git-clone", + "description": "Nodes:Load Video, Load Frames, Save Video, Face Swap, Face Restore, Face Swap (Video), Face Restore (Video)" + }, + { + "author": "TaiTair", + "title": "Simswap Node for ComfyUI", + "id": "simswap", + "reference": "https://github.com/TaiTair/comfyui-simswap", + "files": [ + "https://github.com/TaiTair/comfyui-simswap" + ], + "install_type": "git-clone", + "description": "A hacky implementation of Simswap based on [a/Comfyui ReActor Node 0.5.1](https://github.com/Gourieff/comfyui-reactor-node) and [a/Simswap](https://github.com/neuralchen/SimSwap)." + }, + { + "author": "fofr", + "title": "ComfyUI-HyperSDXL1StepUnetScheduler (ByteDance)", + "id": "hypersdxl", + "reference": "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler", + "files": [ + "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler" + ], + "install_type": "git-clone", + "description": "Original author is ByteDance.\nComfyUI sampler for HyperSDXL UNet\nPorted from: [a/https://huggingface.co/ByteDance/Hyper-SD](https://huggingface.co/ByteDance/Hyper-SD)" + }, + { + "author": "fofr", + "title": "ComfyUI-Prompter-fofrAI", + "id": "prompter-fofr", + "reference": "https://github.com/fofr/ComfyUI-Prompter-fofrAI", + "files": [ + "https://github.com/fofr/ComfyUI-Prompter-fofrAI" + ], + "install_type": "git-clone", + "description": "A prompt helper. Use templates from [a/https://prompter.fofr.ai](https://prompter.fofr.ai) in ComfyUI." + }, + { + "author": "fofr", + "title": "comfyui-replicate", + "reference": "https://github.com/fofr/comfyui-replicate", + "files": [ + "https://github.com/fofr/comfyui-replicate" + ], + "install_type": "git-clone", + "description": "Run [a/Replicate models](https://replicate.com/explore) in ComfyUI." + }, + { + "author": "cfreilich", + "title": "Virtuoso Nodes for ComfyUI", + "id": "virtuoso", + "reference": "https://github.com/chrisfreilich/virtuoso-nodes", + "files": [ + "https://github.com/chrisfreilich/virtuoso-nodes" + ], + "install_type": "git-clone", + "description": "Photoshop type functions and adjustment layers: 30 blend modes, Selective Color, Blend If, Color Balance, Solid Color Images, Black and White, Hue/Saturation, Levels, and RGB Splitting and Merging." + }, + { + "author": "da2el-ai", + "title": "D2 Steps", + "id": "d2steps", + "reference": "https://github.com/da2el-ai/ComfyUI-d2-steps", + "files": [ + "https://github.com/da2el-ai/ComfyUI-d2-steps" + ], + "install_type": "git-clone", + "description": "A handy custom node for using Refiner (switching to a different checkpoint midway) When you specify the end of the base checkpoint, you can extract refiner_start which is end + 1. The output is fixed as an INT, so it can be passed to the handy custom node, Anything Everywhere? Since it only outputs a numerical value, it can also be used for other purposes." + }, + { + "author": "da2el-ai", + "title": "D2 Size Selector", + "id": "size-selector", + "reference": "https://github.com/da2el-ai/ComfyUI-d2-size-selector", + "files": [ + "https://github.com/da2el-ai/ComfyUI-d2-size-selector" + ], + "install_type": "git-clone", + "description": "This is a custom node that allows you to easily call up and set image size presets. Settings can be made by editing the included config.yaml. It is almost identical to Comfyroll Studio's CR AspectRatio. I created it because I wanted to easily edit the presets." + }, + { + "author": "nat-chan", + "title": "ComfyUI-Transceiver📡", + "id": "transceiver", + "reference": "https://github.com/nat-chan/comfyui-transceiver", + "files": [ + "https://github.com/nat-chan/comfyui-transceiver" + ], + "install_type": "git-clone", + "description": "Transceiver is a python library that swiftly exchanges fundamental data structures, specifically numpy arrays, between processes, optimizing AI inference tasks that utilize ComfyUI." + }, + { + "author": "nat-chan", + "title": "ComfyUI-graphToPrompt", + "id": "graph2prompt", + "reference": "https://github.com/nat-chan/ComfyUI-graphToPrompt", + "files": [ + "https://github.com/nat-chan/ComfyUI-graphToPrompt" + ], + "install_type": "git-clone", + "description": "workflow.json -> workflow_api.json" + }, + { + "author": "web3nomad", + "title": "ComfyUI Invisible Watermark", + "id": "invisible-watermark", + "reference": "https://github.com/web3nomad/ComfyUI_Invisible_Watermark", + "files": [ + "https://github.com/web3nomad/ComfyUI_Invisible_Watermark" + ], + "install_type": "git-clone", + "description": "Nodes: InvisibleWatermarkEncode" + }, + { + "author": "GentlemanHu", + "title": "ComfyUI Suno API", + "id": "suno-api", + "reference": "https://github.com/GentlemanHu/ComfyUI-SunoAI", + "files": [ + "https://github.com/GentlemanHu/ComfyUI-SunoAI" + ], + "install_type": "git-clone", + "description": "An unofficial Python library for [a/Suno AI](https://www.suno.ai/) API" + }, + { + "author": "TemryL", + "title": "ComfyUI-IDM-VTON [WIP]", + "id": "idm-vton", + "reference": "https://github.com/TemryL/ComfyUI-IDM-VTON", + "files": [ + "https://github.com/TemryL/ComfyUI-IDM-VTON" + ], + "install_type": "git-clone", + "description": "ComfyUI adaptation of [a/IDM-VTON](https://github.com/yisol/IDM-VTON) for virtual try-on." + }, + { + "author": "NStor", + "title": "ComfyUI-RUS localization", + "reference": "https://github.com/Nestorchik/NStor-ComfyUI-Translation", + "files": [ + "https://github.com/Nestorchik/NStor-ComfyUI-Translation" + ], + "install_type": "git-clone", + "description": "Russian localization of ComfyUI, ComafyUI-Manager & more..." + }, + { + "author": "jax-explorer", + "title": "fast_video_comfyui", + "reference": "https://github.com/jax-explorer/fast_video_comfyui", + "files": [ + "https://github.com/jax-explorer/fast_video_comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:FastImageListToImageBatch" + }, + { + "author": "sugarkwork", + "title": "comfyui_cohere", + "id": "cohere", + "reference": "https://github.com/sugarkwork/comfyui_cohere", + "files": [ + "https://github.com/sugarkwork/comfyui_cohere" + ], + "install_type": "git-clone", + "description": "This is a node for using cohere (Command R+) from ComfyUI. You need to edit the startup .bat file of ComfyUI and describe the API key obtained from Cohere as follows." + }, + { + "author": "alessandrozonta", + "title": "Bounding Box Crop Node for ComfyUI", + "id": "bbox-crop", + "reference": "https://github.com/alessandrozonta/ComfyUI-CenterNode", + "files": [ + "https://github.com/alessandrozonta/ComfyUI-CenterNode" + ], + "install_type": "git-clone", + "description": "This extension contains a custom node for ComfyUI. The node, called 'Bounding Box Crop', is designed to compute the top-left coordinates of a cropped bounding box based on input coordinates and dimensions of the final cropped image. It does so computing the center of the cropping area and then computing where the top-left coordinates would be." + }, + { + "author": "alessandrozonta", + "title": "Save Layers Node for ComfyUI", + "id": "layers", + "reference": "https://github.com/alessandrozonta/ComfyUI-Layers", + "files": [ + "https://github.com/alessandrozonta/ComfyUI-Layers" + ], + "install_type": "git-clone", + "description": "This custom node for ComfyUI allows you to create layers of an image based on input masks and save them into a PSD file." + }, + { + "author": "alessandrozonta", + "title": "OpenPose Node", + "id": "openpose-alessandrozonta", + "reference": "https://github.com/alessandrozonta/ComfyUI-OpenPose", + "files": [ + "https://github.com/alessandrozonta/ComfyUI-OpenPose" + ], + "install_type": "git-clone", + "description": "This extension contains a custom node for ComfyUI. The node, called 'Bounding Box Crop', is designed to compute the top-left coordinates of a cropped bounding box based on input coordinates and dimensions of the final cropped image. It does so computing the center of the cropping area and then computing where the top-left coordinates would be." + }, + { + "author": "curiousjp", + "title": "ComfyUI-MaskBatchPermutations", + "id": "maskbatch-permutations", + "reference": "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations", + "files": [ + "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations" + ], + "install_type": "git-clone", + "description": "Permutes a mask batch to present possible additive combinations. Passing a mask batch (e.g. out of [a/SEGS to Mask Batch](https://github.com/ltdrdata/ComfyUI-Impact-Pack)) will return a new mask batch representing all the possible combinations of the included masks. So, a mask batch with two mask sections, 'A' and 'B', will return a batch containing an empty mask, an empty mask & A, an empty mask & B, and an empty mask & A & B." + }, + { + "author": "BAIS1C", + "title": "ComfyUI_RSS_Feed_Reader", + "id": "rssfeed", + "reference": "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader", + "files": [ + "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader" + ], + "install_type": "git-clone", + "description": "A Simple Python RSS Feed Reader to create Prompts in Comfy UI" + }, + { + "author": "runtime44", + "title": "Runtime44 ComfyUI Nodes", + "reference": "https://github.com/runtime44/comfyui_r44_nodes", + "files": [ + "https://github.com/runtime44/comfyui_r44_nodes" + ], + "install_type": "git-clone", + "description": "Nodes: Runtime44Upscaler, Runtime44ColorMatch, Runtime44DynamicKSampler, Runtime44ImageOverlay, Runtime44ImageResizer, Runtime44ImageToNoise, Runtime44MaskSampler, Runtime44TiledMaskSampler, Runtime44IterativeUpscaleFactor, Runtime44ImageEnhance, Runtime44FilmGrain" + }, + { + "author": "osiworx", + "title": "ComfyUI_Prompt-Quill", + "reference": "https://github.com/osi1880vr/prompt_quill_comfyui", + "files": [ + "https://github.com/osi1880vr/prompt_quill_comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:Use Prompt Quill in Comfyui" + }, + { + "author": "philz1337x", + "title": "✨ Clarity AI - Creative Image Upscaler and Enhancer for ComfyUI", + "reference": "https://github.com/philz1337x/ComfyUI-ClarityAI", + "files": [ + "https://github.com/philz1337x/ComfyUI-ClarityAI" + ], + "install_type": "git-clone", + "description": "[a/Clarity AI](https://clarityai.cc) is a creative image enhancer and is able to upscale to high resolution. [w/NOTE: This is a Magnific AI alternative for ComfyUI.] \nCreate an API key on [a/ClarityAI.cc/api](https://clarityai.cc/api) and add to environment variable 'CAI_API_KEY'\nAlternatively you can write your API key to file 'cai_platform_key.txt'\nYou can also use and/or override the above by entering your API key in the 'api_key_override' field of the node." + }, + { + "author": "KoreTeknology", + "title": "ComfyUI Universal Styler", + "id": "universal-styler", + "reference": "https://github.com/KoreTeknology/ComfyUI-Universal-Styler", + "files": [ + "https://github.com/KoreTeknology/ComfyUI-Universal-Styler" + ], + "install_type": "git-clone", + "description": "A research Node based project on Artificial Intelligence using ComfyUI visual editor with Stable diffusion Local processing focus in mind. This custom node is intended to serve the purpose to offer a large palette of prompting scenrarios, based on Public Checkpoint Models OR/AND Private custom Models and LoRas. It includes an integrated learning machine process as well as a set of workflows." + }, + { + "author": "ZeDarkAdam", + "title": "ComfyUI-Embeddings-Tools", + "id": "embeddings-tools", + "reference": "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools", + "files": [ + "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools" + ], + "install_type": "git-clone", + "description": "EmbeddingsNameLoader, EmbendingList" + }, + { + "author": "chenpx976", + "title": "ComfyUI-RunRunRun", + "id": "runrunrun", + "reference": "https://github.com/chenpx976/ComfyUI-RunRunRun", + "files": [ + "https://github.com/chenpx976/ComfyUI-RunRunRun" + ], + "install_type": "git-clone", + "description": "add http api http://127.0.0.1:8188/comfyui-run/run use in other llm project." + }, + { + "author": "githubYiheng", + "title": "ComfyUI_GetFileNameFromURL", + "id": "getfilename-from-url", + "reference": "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL", + "files": [ + "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL" + ], + "install_type": "git-clone", + "description": "GetFileNameFromURL is a ComfyUI custom node that extracts the filename from a URL. It can handle various URLs and is capable of handling redirects." + }, + { + "author": "githubYiheng", + "title": "comfyui_kmeans_filter", + "id": "kmeans-filter", + "reference": "https://github.com/githubYiheng/comfyui_kmeans_filter", + "files": [ + "https://github.com/githubYiheng/comfyui_kmeans_filter" + ], + "install_type": "git-clone", + "description": "Nodes:Apply Kmeans Filter" + }, + { + "author": "githubYiheng", + "title": "ComfyUI_Change_IMAGE_BOREDER", + "id": "change-image-border", + "reference": "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER", + "files": [ + "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER" + ], + "install_type": "git-clone", + "description": "Nodes:Change Image Border" + }, + { + "author": "githubYiheng", + "title": "comfyui_meanshift_filter", + "id": "meanshift-filter", + "reference": "https://github.com/githubYiheng/comfyui_meanshift_filter", + "files": [ + "https://github.com/githubYiheng/comfyui_meanshift_filter" + ], + "install_type": "git-clone", + "description": "Nodes:Apply Meanshift Filter" + }, + { + "author": "githubYiheng", + "title": "comfyui_private_postprocessor", + "id": "githubyiheng-private-postprocessor", + "reference": "https://github.com/githubYiheng/comfyui_private_postprocessor", + "files": [ + "https://github.com/githubYiheng/comfyui_private_postprocessor" + ], + "install_type": "git-clone", + "description": "Nodes:Private ImageCPostprocessor" + }, + { + "author": "Fihade", + "title": "IC-Light-ComfyUI-Node", + "reference": "https://github.com/Fihade/IC-Light-ComfyUI-Node", + "files": [ + "https://github.com/Fihade/IC-Light-ComfyUI-Node" + ], + "install_type": "git-clone", + "description": "Original repo: [a/https://github.com/lllyasviel/IC-Light](https://github.com/lllyasviel/IC-Light)\nModels: [a/https://huggingface.co/lllyasviel/ic-light/tree/main](https://huggingface.co/lllyasviel/ic-light/tree/main), [a/https://huggingface.co/digiplay/Photon_v1/tree/main](https://huggingface.co/digiplay/Photon_v1/tree/main)\nmodels go into ComfyUI/models/unet" + }, + { + "author": "KewkLW", + "title": "ComfyUI-kewky_tools", + "id": "kewky-tools", + "reference": "https://github.com/KewkLW/ComfyUI-kewky_tools", + "files": [ + "https://github.com/KewkLW/ComfyUI-kewky_tools" + ], + "install_type": "git-clone", + "description": "text_append_node, vramdebugplus, tensordebugplus, animation_schedule_output" + }, + { + "author": "ITurchenko", + "title": "ComfyUI-SizeFromArray", + "id": "sizefromarray", + "reference": "https://github.com/ITurchenko/ComfyUI-SizeFromArray", + "files": [ + "https://github.com/ITurchenko/ComfyUI-SizeFromArray" + ], + "install_type": "git-clone", + "description": "Nodes:SizeFromArray" + }, + { + "author": "Suplex", + "title": "Suplex Misc ComfyUI Nodes", + "id": "suplex", + "reference": "https://github.com/saftle/suplex_comfy_nodes", + "files": [ + "https://github.com/saftle/suplex_comfy_nodes" + ], + "install_type": "git-clone", + "description": "Misc Nodes: ControlNet Selector Node, Load Optional ControlNet Model" + }, + { + "author": "mephisto83", + "title": "petty-paint-comfyui-node", + "id": "petty-paint", + "reference": "https://github.com/mephisto83/petty-paint-comfyui-node", + "files": [ + "https://github.com/mephisto83/petty-paint-comfyui-node" + ], + "install_type": "git-clone", + "description": "An integration between comfy ui and petty paint" + }, + { + "author": "fsdymy1024", + "title": "ComfyUI_fsdymy", + "id": "fsdymy", + "reference": "https://github.com/fsdymy1024/ComfyUI_fsdymy", + "files": [ + "https://github.com/fsdymy1024/ComfyUI_fsdymy" + ], + "install_type": "git-clone", + "description": "Nodes:Save Image Without Metadata" + }, + { + "author": "ray", + "title": "Light Gradient for ComfyUI", + "id": "light-gradient", + "reference": "https://github.com/huagetai/ComfyUI_LightGradient", + "files": [ + "https://github.com/huagetai/ComfyUI_LightGradient" + ], + "install_type": "git-clone", + "description": "Nodes:Image Gradient,Mask Gradient" + }, + { + "author": "ray", + "title": "comfyui's gaffer(ComfyUI native implementation of IC-Light. )", + "id": "gaffer", + "reference": "https://github.com/huagetai/ComfyUI-Gaffer", + "files": [ + "https://github.com/huagetai/ComfyUI-Gaffer" + ], + "install_type": "git-clone", + "description": "Nodes:Load ICLight Model,Apply ICLight,Simple Light Source,Calculate Normal Map" + }, + { + "author": "YFG", + "title": "😸 YFG Comical Nodes", + "id": "comical", + "reference": "https://github.com/gonzalu/ComfyUI_YFG_Comical", + "files": [ + "https://github.com/gonzalu/ComfyUI_YFG_Comical" + ], + "install_type": "git-clone", + "description": "Image Historgram Generator - Outputs a set of images displaying the Histogram of the input image. Nodes: img2histograms, img2histogramsSelf" + }, + { + "author": "ruiqutech", + "title": "RuiquNodes for ComfyUI", + "id": "RuiquNodes", + "reference": "https://github.com/ruiqutech/ComfyUI-RuiquNodes", + "files": [ + "https://github.com/ruiqutech/ComfyUI-RuiquNodes" + ], + "install_type": "git-clone", + "description": "Nodes of EvaluateMultiple1, EvaluateMultiple3...\nSupport the execution of any fragment of Python code, generating multiple outputs from multiple inputs." + }, + { + "author": "teward", + "title": "ComfyUI-Helper-Nodes", + "id": "helper-nodes", + "reference": "https://github.com/teward/ComfyUI-Helper-Nodes", + "files": [ + "https://github.com/teward/ComfyUI-Helper-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes: HelperNodes_MultilineStringLiteral, HelperNodes_StringLiteral, HelperNodes_Steps, HelperNodes_CfgScale, HelperNodes_WidthHeight, HelperNodes_SchedulerSelector, HelperNodes_SamplerSelector, ..." + }, + { + "author": "fmatray", + "title": "ComfyUI_BattlemapGrid", + "id": "battlemap-grid", + "reference": "https://github.com/fmatray/ComfyUI_BattlemapGrid", + "files": [ + "https://github.com/fmatray/ComfyUI_BattlemapGrid" + ], + "install_type": "git-clone", + "description": "Nodes for ComfyUI in order to generate battelmaps" + }, + { + "author": "christian-byrne", + "title": "img2txt-comfyui-nodes", + "id": "img2txt-nodes", + "reference": "https://github.com/christian-byrne/img2txt-comfyui-nodes", + "files": [ + "https://github.com/christian-byrne/img2txt-comfyui-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:img2txt BLIP/Llava Multimodel Tagger" + }, + { + "author": "christian-byrne", + "title": "img2colors-comfyui-node", + "id": "img2colors-nodes", + "reference": "https://github.com/christian-byrne/img2colors-comfyui-node", + "files": [ + "https://github.com/christian-byrne/img2colors-comfyui-node" + ], + "install_type": "git-clone", + "description": "Nodes:Img2Color - Color Palette Extractor" + }, + { + "author": "christian-byrne", + "title": "Node - Size Matcher", + "id": "sizematcher", + "reference": "https://github.com/christian-byrne/size-match-compositing-nodes", + "files": [ + "https://github.com/christian-byrne/size-match-compositing-nodes" + ], + "install_type": "git-clone", + "description": "Takes two images and matches their sizes using various methods, detailed below." + }, + { + "author": "christian-byrne", + "title": "comfyui-search-navigation", + "reference": "https://github.com/christian-byrne/comfyui-search-navigation", + "files": [ + "https://github.com/christian-byrne/comfyui-search-navigation" + ], + "install_type": "git-clone", + "description": "Search navigation extension." + }, + { + "author": "christian-byrne", + "title": "audio-separation-nodes-comfyui", + "reference": "https://github.com/christian-byrne/audio-separation-nodes-comfyui", + "files": [ + "https://github.com/christian-byrne/audio-separation-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "Separate audio track into stems (vocals, bass, drums, other). Along with tools to recombine, tempo match, slice/crop audio." + }, + { + "author": "christian-byrne", + "title": "comfyui-default-values-manager", + "reference": "https://github.com/christian-byrne/comfyui-default-values-manager", + "files": [ + "https://github.com/christian-byrne/comfyui-default-values-manager" + ], + "install_type": "git-clone", + "description": "comfyui-default-values-manager" + }, + { + "author": "oztrkoguz", + "title": "ComfyUI StoryCreater", + "id": "storycreater", + "reference": "https://github.com/oztrkoguz/ComfyUI_StoryCreator", + "files": [ + "https://github.com/oztrkoguz/ComfyUI_StoryCreator" + ], + "install_type": "git-clone", + "description": "Nodes:story_sampler_simple, text2, kosmos2_sampler.\nI created a dataset for generating short stories [a/Short-Story](https://huggingface.co/datasets/oztrkoguz/Short-Story) and used it to fine-tune my own model using Phi-3." + }, + { + "author": "GraftingRayman", + "title": "GraftingRayman", + "id": "graftingrayman", + "reference": "https://github.com/GraftingRayman/ComfyUI_GraftingRayman", + "files": [ + "https://github.com/GraftingRayman/ComfyUI_GraftingRayman" + ], + "install_type": "git-clone", + "description": "Image Manipulation Nodes" + }, + { + "author": "royceschultz", + "title": "ComfyUI-Notifications", + "reference": "https://github.com/royceschultz/ComfyUI-Notifications", + "files": [ + "https://github.com/royceschultz/ComfyUI-Notifications" + ], + "install_type": "git-clone", + "description": "Send notifications when a workflow completes." + }, + { + "author": "katalist-ai", + "title": "comfyUI-nsfw-detection", + "id": "nsfw-detection", + "reference": "https://github.com/katalist-ai/comfyUI-nsfw-detection", + "files": [ + "https://github.com/katalist-ai/comfyUI-nsfw-detection" + ], + "install_type": "git-clone", + "description": "Nodes: NudenetDetector" + }, + { + "author": "kaanyalova", + "title": "Extended Image Formats for ComfyUI", + "id": "extended-image-format", + "reference": "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats", + "files": [ + "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats" + ], + "install_type": "git-clone", + "description": "Adds a custom node for saving images in webp, jpeg, avif, jxl (no metadata) and supports loading workflows from saved images" + }, + { + "author": "badayvedat", + "title": "ComfyUI-fal-Connector", + "id": "fal", + "reference": "https://github.com/badayvedat/ComfyUI-fal-Connector", + "files": [ + "https://github.com/badayvedat/ComfyUI-fal-Connector" + ], + "install_type": "git-clone", + "description": "The ComfyUI-fal-Connector is a tool designed to provide an integration between ComfyUI and fal. This extension allows users to execute their ComfyUI workflows directly on [a/fal.ai](https://fal.ai/). This enables users to leverage the computational power and resources provided by fal.ai for running their ComfyUI workflows." + }, + { + "author": "TheMistoAI", + "title": "Anyline", + "id": "anyline", + "reference": "https://github.com/TheMistoAI/ComfyUI-Anyline", + "files": [ + "https://github.com/TheMistoAI/ComfyUI-Anyline" + ], + "install_type": "git-clone", + "description": "A Fast, Accurate, and Detailed Line Detection Preprocessor.\nAnyline is a ControlNet line preprocessor that accurately extracts object edges, image details, and textual content from most images. Users can input any type of image to quickly obtain line drawings with clear edges, sufficient detail preservation, and high fidelity text, which are then used as input for conditional generation in Stable Diffusion." + }, + { + "author": "mbrostami", + "title": "ComfyUI-TITrain", + "id": "titrain", + "reference": "https://github.com/mbrostami/ComfyUI-TITrain", + "files": [ + "https://github.com/mbrostami/ComfyUI-TITrain" + ], + "install_type": "git-clone", + "description": "Nodes:TextualInversionTrainingSDXL, TextualInversionTraining" + }, + { + "author": "ArcherFMY", + "title": "Diffusion360_ComfyUI", + "id": "diffusion360", + "reference": "https://github.com/ArcherFMY/Diffusion360_ComfyUI", + "files": [ + "https://github.com/ArcherFMY/Diffusion360_ComfyUI" + ], + "install_type": "git-clone", + "description": "ComfyUI plugin of [a/SD-T2I-360PanoImage](https://github.com/ArcherFMY/SD-T2I-360PanoImage).\nbase t2i-pipeline for generating 512*1024 panorama image from text input" + }, + { + "author": "Makeezi", + "title": "ComfyUI-promptLAB", + "id": "promptlab", + "reference": "https://github.com/Makeezi/ComfyUI-promptLAB", + "files": [ + "https://github.com/Makeezi/ComfyUI-promptLAB" + ], + "install_type": "git-clone", + "description": "connection nodes for api requests, fully supports promptLAB" + }, + { + "author": "portu-sim", + "title": "comfyui_bmab", + "id": "bmab", + "reference": "https://github.com/portu-sim/comfyui_bmab", + "files": [ + "https://github.com/portu-sim/comfyui_bmab" + ], + "install_type": "git-clone", + "description": "BMAB for ComfyUI\n[w/comfyui-bmab is changed to comfyui_bmab. Remove 'custom_nodes/comyui-bmab' in your directory and then reinstall this.]" + }, + { + "author": "griptape-ai", + "title": "ComfyUI Griptape Nodes", + "id": "griptape", + "reference": "https://github.com/griptape-ai/ComfyUI-Griptape", + "files": [ + "https://github.com/griptape-ai/ComfyUI-Griptape" + ], + "install_type": "git-clone", + "description": "This repo creates a series of nodes that enable you to utilize the [a/Griptape Python Framework](https://github.com/griptape-ai/griptape/) with ComfyUI, integrating AI into your workflow. This repo creates a series of nodes that enable you to utilize the Griptape Python Framework with ComfyUI, integrating AI into your workflow." + }, + { + "author": "cavinHuang", + "title": "comfyui-nodes-docs", + "id": "nodedocs", + "reference": "https://github.com/CavinHuang/comfyui-nodes-docs", + "files": [ + "https://github.com/CavinHuang/comfyui-nodes-docs" + ], + "install_type": "git-clone", + "description": "This is a plugin for displaying documentation for each comfyui node. " + }, + { + "author": "icesun963", + "title": "HFDownLoad Node for ComfyUI", + "id": "HFDownLoad-ic", + "reference": "https://github.com/icesun963/ComfyUI_HFDownLoad", + "files": [ + "https://github.com/icesun963/ComfyUI_HFDownLoad" + ], + "install_type": "git-clone", + "description": "Download the model from huggingface and put it in any directory." + }, + { + "author": "conquestace", + "title": "Image Uploader", + "id": "image-uploader", + "reference": "https://github.com/conquestace/ComfyUI-ImageUploader", + "files": [ + "https://github.com/conquestace/ComfyUI-ImageUploader" + ], + "install_type": "git-clone", + "description": "Upload images automatically to image hosting sites." + }, + { + "author": "chandlergis", + "title": "ComfyUI-IMG_Query", + "id": "img-query", + "reference": "https://github.com/chandlergis/ComfyUI-IMG_Query", + "files": [ + "https://github.com/chandlergis/ComfyUI-IMG_Query" + ], + "install_type": "git-clone", + "description": "Nodes:ImageRequestNode" + }, + { + "author": "Isaac Emesowum", + "title": "Isaac's Nodes", + "id": "isaac", + "reference": "https://github.com/iemesowum/ComfyUI_IsaacNodes", + "files": [ + "https://github.com/iemesowum/ComfyUI_IsaacNodes" + ], + "install_type": "git-clone", + "description": "This extension offers automatic drums extraction from audio files, as well as a few helper nodes to support my audio synchronization AnimateDiff workflows." + }, + { + "author": "fexploit", + "title": "ComfyUI-AutoTrimBG", + "id": "autotrimbg", + "reference": "https://github.com/fexploit/ComfyUI-AutoTrimBG", + "files": [ + "https://github.com/fexploit/ComfyUI-AutoTrimBG" + ], + "install_type": "git-clone", + "description": "ComfyUI-AutoCropBgTrim is a powerful tool designed to automatically clean up the background of your images. This tool trims unnecessary spaces and pixels, leaving only the main subject of the image. It generates both a mask and an image output, making it easy to focus on the essential elements. Perfect for enhancing your photos and preparing them for professional use." + }, + { + "author": "fexploit", + "title": "ComfyUI-AutoLabel", + "id": "autolabel", + "reference": "https://github.com/fexploit/ComfyUI-AutoLabel", + "files": [ + "https://github.com/fexploit/ComfyUI-AutoLabel" + ], + "install_type": "git-clone", + "description": "ComfyUI-AutoLabel is a custom node for ComfyUI that uses BLIP (Bootstrapping Language-Image Pre-training) to generate detailed descriptions of the main object in an image. This node leverages the power of BLIP to provide accurate and context-aware captions for images." + }, + { + "author": "fexploit", + "title": "ComfyUI-Classifier", + "id": "classifier", + "reference": "https://github.com/fexploit/ComfyUI-Classifier", + "files": [ + "https://github.com/fexploit/ComfyUI-Classifier" + ], + "install_type": "git-clone", + "description": "ComfyUI-Classifier is a custom node for ComfyUI that uses a zero-shot classification model to classify text inputs based on a set of candidate labels. This node leverages the power of Hugging Face Transformers to provide accurate and flexible text classification." + }, + { + "author": "linshier", + "title": "comfyui-remote-tools", + "id": "remote-tools", + "reference": "https://github.com/linshier/comfyui-remote-tools", + "files": [ + "https://github.com/linshier/comfyui-remote-tools" + ], + "install_type": "git-clone", + "description": "Node:SendBase64ToRemote. To connect to another ComfyUI server." + }, + { + "author": "Fantaxico", + "title": "ComfyUI-GCP-Storage", + "id": "gcp-storage", + "reference": "https://github.com/Fantaxico/ComfyUI-GCP-Storage", + "files": [ + "https://github.com/Fantaxico/ComfyUI-GCP-Storage" + ], + "install_type": "git-clone", + "description": "Node:GCP Storage Node. Support google-cloud-storage." + }, + { + "author": "daniabib", + "title": "ComfyUI ProPainter Nodes", + "id": "propainter", + "reference": "https://github.com/daniabib/ComfyUI_ProPainter_Nodes", + "files": [ + "https://github.com/daniabib/ComfyUI_ProPainter_Nodes" + ], + "install_type": "git-clone", + "description": "ComfyUI custom node implementation of [a/ProPainter](https://github.com/sczhou/ProPainter) framework for video inpainting." + }, + { + "author": "iFREEGROUP", + "title": "comfyui-undistort", + "id": "undistort", + "reference": "https://github.com/iFREEGROUP/comfyui-undistort", + "files": [ + "https://github.com/iFREEGROUP/comfyui-undistort" + ], + "install_type": "git-clone", + "description": "Node:Load Checkerboard Images for Calibrate Camera, Matrix and distortion coefficient to text, Undistort" + }, + { + "author": "Auttasak-L", + "title": "ComfyUI-ImageCropper", + "id": "imagecropper", + "reference": "https://github.com/Auttasak-L/ComfyUI-ImageCropper", + "files": [ + "https://github.com/Auttasak-L/ComfyUI-ImageCropper" + ], + "install_type": "git-clone", + "description": "Nodes:Image cropping tool" + }, + { + "author": "muzi12888", + "title": "PoseKeypoint Mask", + "id": "posekeypoint-mask", + "reference": "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask", + "files": [ + "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask" + ], + "install_type": "git-clone", + "description": "Convert PoseKeypoint to mask, please refer to the example workflow for usage instructions." + }, + { + "author": "muzi12888", + "title": "m9-prompts-comfyui", + "id": "m9-prompts", + "reference": "https://github.com/MarcusNyne/m9-prompts-comfyui", + "files": [ + "https://github.com/MarcusNyne/m9-prompts-comfyui" + ], + "install_type": "git-clone", + "description": "Two custom nodes are included for modifying a prompt to create prompt variations.\nScramblePrompts [m9]: Reorder prompts, remove prompts, modify weights\nTweakWeights [m9]: Modify the weights of prompts matching keywords" + }, + { + "author": "xuhongming251", + "title": "ComfyUI-GPEN", + "id": "gpen", + "reference": "https://github.com/xuhongming251/ComfyUI-GPEN", + "files": [ + "https://github.com/xuhongming251/ComfyUI-GPEN" + ], + "install_type": "git-clone", + "description": "Nodes:FaceEnhancement. Based on modelscope pipeline." + }, + { + "author": "xuhongming251", + "title": "ComfyUI-MuseTalkUtils", + "id": "musetalk-utils", + "reference": "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils", + "files": [ + "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils" + ], + "install_type": "git-clone", + "description": "MuseTalk ComfyUI Preprocess and Postprocess Nodes" + }, + { + "author": "Thomas Ward", + "title": "TW-CUI-Util", + "id": "tw-cui-util", + "reference": "https://github.com/TW-CUI/TW-CUI-Util", + "files": [ + "https://github.com/TW-CUI/TW-CUI-Util" + ], + "install_type": "git-clone", + "description": "A collection of custom nodes to help with saving images, providing generation parameters, static literal nodes, and other useful nodes." + }, + { + "author": "lks-ai", + "title": "ComfyUI AnyNode: Any Node you ask for", + "id": "anynode", + "reference": "https://github.com/lks-ai/anynode", + "files": [ + "https://github.com/lks-ai/anynode" + ], + "install_type": "git-clone", + "description": "Nodes: AnyNode. Nodes that can be anything you ask. Auto-Generate functional nodes using LLMs. Create impossible workflows. API Compatibility: (OpenAI, LocalLLMs, Gemini)." + }, + { + "author": "lks-ai", + "title": "ComfyUI Stable Audio Open 1.0 Sampler", + "id": "stableaudiosampler", + "reference": "https://github.com/lks-ai/ComfyUI-StableAudioSampler", + "files": [ + "https://github.com/lks-ai/ComfyUI-StableAudioSampler" + ], + "install_type": "git-clone", + "description": "Nodes: StableAudioSampler. Wraps the new Stable Audio Open Model in the sampler that dropped Jun 5th. See Github for Features" + }, + { + "author": "SayanoAI", + "title": "Comfy-RVC", + "id": "sayano-rvc", + "reference": "https://github.com/SayanoAI/Comfy-RVC", + "files": [ + "https://github.com/SayanoAI/Comfy-RVC" + ], + "install_type": "git-clone", + "description": "ComfyUI custom nodes for RVC related inference and image generation" + }, + { + "author": "nirbhay-faaya", + "title": "ImgProcessing_ComfyUI", + "id": "imgprocessing", + "reference": "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI", + "files": [ + "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI" + ], + "install_type": "git-clone", + "description": "Custom Image processing ComfyUI Nodes" + }, + { + "author": "larsupb", + "title": "LoRA Power-Merger ComfyUI", + "id": "lora-powermerger", + "reference": "https://github.com/larsupb/LoRA-Merger-ComfyUI", + "files": [ + "https://github.com/larsupb/LoRA-Merger-ComfyUI" + ], + "install_type": "git-clone", + "description": "An extension for merging LoRAs. Offers a wide range of LoRA merge techniques (including dare) and XY plots. XY plots require efficiency nodes." + }, + { + "author": "Mason-McGough", + "title": "Mosaica", + "id": "mosaica", + "reference": "https://github.com/Mason-McGough/ComfyUI-Mosaica", + "files": [ + "https://github.com/Mason-McGough/ComfyUI-Mosaica" + ], + "install_type": "git-clone", + "description": "Create colorful mosaic images in ComfyUI by computing label images and applying lookup tables." + }, + { + "author": "cuongloveit", + "title": "comfy_http_request", + "reference": "https://github.com/cuongloveit/comfy_http_request", + "files": [ + "https://github.com/cuongloveit/comfy_http_request" + ], + "install_type": "git-clone", + "description": "Nodes:Send Http Request. You can use this node to save full size images through the websocket." + }, + { + "author": "Ron-Digital", + "title": "ComfyUI-SceneGenerator", + "id": "scenegenerator", + "reference": "https://github.com/Ron-Digital/ComfyUI-SceneGenerator", + "files": [ + "https://github.com/Ron-Digital/ComfyUI-SceneGenerator" + ], + "install_type": "git-clone", + "description": "ComfyUI-SceneGenerator is a ComfyUI plugin used to generate scene preview photos from JSON files. This plugin creates scenes based on the provided JSON configuration and produces two different image outputs: one containing only the products and the other containing both the products and the props." + }, + { + "author": "xliry", + "title": "ComfyUI_SendDiscord", + "id": "senddiscord", + "reference": "https://github.com/xliry/ComfyUI_SendDiscord", + "files": [ + "https://github.com/xliry/ComfyUI_SendDiscord" + ], + "install_type": "git-clone", + "description": "Nodes:Send Video to Discord" + }, + { + "author": "xliry", + "title": "color2rgb", + "reference": "https://github.com/vxinhao/color2rgb", + "files": [ + "https://github.com/vxinhao/color2rgb/raw/main/color2rgb.py" + ], + "install_type": "copy", + "description": "Nodes:color2RGB" + }, + { + "author": "moyi7712", + "title": "ComfyUI_Seamless_Patten", + "id": "seamless-pattern", + "reference": "https://github.com/moyi7712/ComfyUI_Seamless_Patten", + "files": [ + "https://github.com/moyi7712/ComfyUI_Seamless_Patten" + ], + "install_type": "git-clone", + "description": "It make any text2image create seamless patten" + }, + { + "author": "nirex0", + "title": "ComfyUI_pytorch_openpose", + "id": "pytorch-openpose", + "reference": "https://github.com/nirex0/ComfyUI_pytorch_openpose", + "files": [ + "https://github.com/nirex0/ComfyUI_pytorch_openpose" + ], + "install_type": "git-clone", + "description": "All Credits go to the original Repo: [a/Hzzone/pytorch-openpose](https://github.com/Hzzone/pytorch-openpose)." + }, + { + "author": "AshMartian", + "title": "Dir Gir", + "id": "dir-gir", + "reference": "https://github.com/AshMartian/ComfyUI-DirGir", + "files": [ + "https://github.com/AshMartian/ComfyUI-DirGir" + ], + "install_type": "git-clone", + "description": "A collection of ComfyUI directory automation utility nodes. Directory Get It Right adds a GUI directory browser, and smart directory loop/iteration node that supports regex and file extension filtering." + }, + { + "author": "SozeInc", + "title": "ComfyUI-Mobile", + "id": "comfyui-mobile", + "reference": "https://github.com/SozeInc/ComfyUI-Mobile", + "files": [ + "https://github.com/SozeInc/ComfyUI-Mobile" + ], + "install_type": "git-clone", + "description": "Nodes: Ultimate Concat (Mobile), Send Notification (Mobile), Settings Launcher (Mobile), Settings Launcher Outputs (Mobile)" + }, + { + "author": "audioscavenger", + "title": "ComfyUI Thumbnails", + "id": "thumbnails", + "reference": "https://github.com/audioscavenger/ComfyUI-Thumbnails", + "files": [ + "https://github.com/audioscavenger/ComfyUI-Thumbnails" + ], + "install_type": "git-clone", + "description": "Load Image thumbnails for ComfyUI" + }, + { + "author": "goktug", + "title": "Save Image Plus for ComfyUI", + "id": "saveimage-plus", + "reference": "https://github.com/Goktug/comfyui-saveimage-plus", + "files": [ + "https://github.com/Goktug/comfyui-saveimage-plus" + ], + "install_type": "git-clone", + "description": "Save Image Plus is a custom node for ComfyUI that allows you to save images in JPEG and WEBP formats with optional metadata embedding." + }, + { + "author": "wujm424606", + "title": "ComfyUi-Ollama-YN", + "id": "ollama-YN", + "reference": "https://github.com/wujm424606/ComfyUi-Ollama-YN", + "files": [ + "https://github.com/wujm424606/ComfyUi-Ollama-YN" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI Nodes for interacting with [a/Ollama](https://ollama.com/) using the [a/ollama python client](https://github.com/ollama/ollama-python).\n Meanwhile it will provide better prompt descriptor for stable diffusion." + }, + { + "author": "tmagara", + "title": "ComfyUI-Prediction-Boost", + "id": "prediction-boost", + "reference": "https://github.com/tmagara/ComfyUI-Prediction-Boost", + "files": [ + "https://github.com/tmagara/ComfyUI-Prediction-Boost" + ], + "install_type": "git-clone", + "description": "prediction boost custom node for ComfyUI" + }, + { + "author": "chesnokovivan", + "title": "ComfyUI-Novakid", + "id": "novakid", + "reference": "https://github.com/chesnokovivan/ComfyUI-Novakid", + "files": [ + "https://github.com/chesnokovivan/ComfyUI-Novakid" + ], + "install_type": "git-clone", + "description": "ComfyUI: Novakid. A node." + }, + { + "author": "Jin Liu", + "title": "ComfyUI-Photopea", + "id": "photopea", + "reference": "https://github.com/coolzilj/ComfyUI-Photopea", + "files": [ + "https://github.com/coolzilj/ComfyUI-Photopea" + ], + "install_type": "git-clone", + "description": "Edit images in the Photopea editor directly within ComfyUI." + }, + { + "author": "bitaffinity", + "title": "ComfyUI_HF_Inference", + "id": "hf-inference", + "reference": "https://github.com/bitaffinity/ComfyUI_HF_Inference", + "files": [ + "https://github.com/bitaffinity/ComfyUI_HF_Inference" + ], + "install_type": "git-clone", + "description": "Unofficial support for Hugging Face's hosted inference." + }, + { + "author": "claussteinmassl", + "title": "CS Transform Node for ComfyUI", + "id": "cs-transform", + "reference": "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes", + "files": [ + "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes" + ], + "install_type": "git-clone", + "description": "The CS Transform node is a custom node for ComfyUI that applies a series of transformations to an input image and mask. The transformations include scaling, rotation, and translation, all centered around a specified pivot point. The node ensures that the transformed image is properly accommodated within a canvas, which can be expanded if needed." + }, + { + "author": "MariusKM", + "title": "ComfyUI-BadmanNodes", + "id": "badman", + "reference": "https://github.com/MariusKM/ComfyUI-BadmanNodes", + "files": [ + "https://github.com/MariusKM/ComfyUI-BadmanNodes" + ], + "install_type": "git-clone", + "description": "Nodes:Badman_Blend, Badman_HexGenerator, Badman_String, Badman_Concat_String, Badman_Print, BadmanIO, BadmanIntUtil" + }, + { + "author": "TMElyralab", + "title": "Comfyui-MusePose", + "id": "musepose", + "reference": "https://github.com/TMElyralab/Comfyui-MusePose", + "files": [ + "https://github.com/TMElyralab/Comfyui-MusePose" + ], + "install_type": "git-clone", + "description": "[a/MusePose](https://github.com/TMElyralab/MusePose) is an image-to-video generation framework for virtual human under control signal such as pose.\nNOTE: You need to download weigths manually from: [a/https://huggingface.co/TMElyralab/MusePose](https://huggingface.co/TMElyralab/MusePose).[w/The repository name has changed. If you are not receiving updates, please delete the existing node and reinstall it.]" + }, + { + "author": "PnthrLeo", + "title": "comfyUI-image-search", + "id": "image-search", + "reference": "https://github.com/PnthrLeo/comfyUI-image-search", + "files": [ + "https://github.com/PnthrLeo/comfyUI-image-search" + ], + "install_type": "git-clone", + "description": "Nodes:Close Images Searcher" + }, + { + "author": "l20richo", + "title": "ComfyUI-Azure-Blob-Storage", + "id": "azure-blob-storage", + "reference": "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage", + "files": [ + "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage" + ], + "install_type": "git-clone", + "description": "ComfyUI-Azure-Blob-Storage seamlessly integrates with [a/Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/) in ComfyUI. This open-source project provides custom nodes for effortless loading and saving of images, videos, and checkpoint models directly from Azure blob containers within the ComfyUI graph interface." + }, + { + "author": "AARG-FAN", + "title": "Image-vector-for-ComfyUI", + "id": "image-vector", + "reference": "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI", + "files": [ + "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI" + ], + "install_type": "git-clone", + "description": "a wrap-up of ComfyUI nodes for converting pixels to raster, sent out to [a/Vtracer](https://github.com/visioncortex/vtracer)!" + }, + { + "author": "Smirnov75", + "title": "ComfyUI-mxToolkit", + "id": "mxtoolkit", + "reference": "https://github.com/Smirnov75/ComfyUI-mxToolkit", + "files": [ + "https://github.com/Smirnov75/ComfyUI-mxToolkit" + ], + "install_type": "git-clone", + "description": "A set of useful nodes for convenient use of ComfyUI, including: Seed randomization before the generation process starts, with saving of the last used values and the ability to automatically interrupt the current generation; A function to pause the generation process; Slider nodes for convenient control of input parameters; An alternative version of the standard Reroute node." + }, + { + "author": "humgate", + "title": "simplecomfy", + "reference": "https://github.com/humgate/simplecomfy", + "files": [ + "https://github.com/humgate/simplecomfy" + ], + "install_type": "git-clone", + "description": "Simple JS application based on ComfyUI which takes prompt and style picture from user and runs hardcoded workflow inference returning generated image to user." + }, + { + "author": "vanche1212", + "title": "ZMG PLUGIN", + "id": "zmg", + "reference": "https://github.com/vanche1212/ComfyUI-ZMG-Nodes", + "files": [ + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:ApiRequestNode, LoadVideoNode, JsonParserNode, OllamaRequestNode, OldPhotoColorizationNode." + }, + { + "author": "hben35096", + "title": "ComfyUI-ToolBox", + "id": "hben-toolbox", + "reference": "https://github.com/hben35096/ComfyUI-ToolBox", + "files": [ + "https://github.com/hben35096/ComfyUI-ToolBox" + ], + "install_type": "git-clone", + "description": "Nodes:commonly_node." + }, + { + "author": "tiankuan93", + "title": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation", + "id": "v-express", + "reference": "https://github.com/tiankuan93/ComfyUI-V-Express", + "files": [ + "https://github.com/tiankuan93/ComfyUI-V-Express" + ], + "install_type": "git-clone", + "description": "[Original] In the field of portrait video generation, the use of single images to generate portrait videos has become increasingly prevalent. A common approach involves leveraging generative models to enhance adapters for controlled generation. However, control signals can vary in strength, including text, audio, image reference, pose, depth map, etc. Among these, weaker conditions often struggle to be effective due to interference from stronger conditions, posing a challenge in balancing these conditions. In our work on portrait video generation, we identified audio signals as particularly weak, often overshadowed by stronger signals such as pose and original image. However, direct training with weak signals often leads to difficulties in convergence. To address this, we propose V-Express, a simple method that balances different control signals through a series of progressive drop operations. Our method gradually enables effective control by weak conditions, thereby achieving generation capabilities that simultaneously take into account pose, input image, and audio.\nNOTE: You need to downdload [a/model_ckpts](https://huggingface.co/tk93/V-Express/tree/main) manually." + }, + { + "author": "CMonk", + "title": "Stable Projectorz Bridge", + "id": "projectorz", + "reference": "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge", + "files": [ + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge" + ], + "install_type": "git-clone", + "description": "This custom nodes enables Stable Projectorz to work with ComfyUI Directly." + }, + { + "author": "Scorpinaus", + "title": "Loaders for Diffusers-format checkpoints", + "id": "diffusersloader", + "reference": "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader", + "files": [ + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader" + ], + "install_type": "git-clone", + "description": "This node pack allows loading of CLIP, MODEL, VAE aspects for both SD1.5 and SDXL checkpoints that is converted to diffusers format." + }, + { + "author": "chakib-belgaid", + "title": "ComfyUI Style Plugin", + "id": "style-plugin", + "reference": "https://github.com/chakib-belgaid/Comfyui_Prompt_styler", + "files": [ + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler" + ], + "install_type": "git-clone", + "description": "This is a simple plugin for ComfyUI that allows you to import A1111 CSV styles into ComfyUI prompts." + }, + { + "author": "chakib-belgaid", + "title": "ComfyUI-autosize", + "id": "autosize", + "reference": "https://github.com/chakib-belgaid/ComfyUI-autosize", + "files": [ + "https://github.com/chakib-belgaid/ComfyUI-autosize" + ], + "install_type": "git-clone", + "description": "A ComfyUI utility plugin designed to optimize the latent space for generating high-quality results. It approximates the closest size model for better generation results." + }, + { + "author": "ThereforeGames", + "title": "ComfyUI-Unprompted", + "id": "unprompted", + "reference": "https://github.com/ThereforeGames/ComfyUI-Unprompted", + "files": [ + "https://github.com/ThereforeGames/ComfyUI-Unprompted" + ], + "install_type": "git-clone", + "description": "This is a ComfyUI node that processes your input text with the [a/Unprompted templating language](https://github.com/ThereforeGames/unprompted). Early alpha release.\n" + }, + { + "author": "Tool Of North america", + "title": "Easy automatic (square) image cropper using Yolo", + "id": "tooldigital", + "reference": "https://github.com/tooldigital/ComfyUI-Yolo-Cropper", + "files": [ + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper" + ], + "install_type": "git-clone", + "description": "A very simple and easy to use node to automaticaaly create (square) image crops and masks using YoloV8. This can be very useful when using controlnet and ip adapters" + }, + { + "author": "luandev", + "title": "ComfyUI CrewAI", + "id": "crewai", + "reference": "https://github.com/luandev/ComfyUI-CrewAI", + "files": [ + "https://github.com/luandev/ComfyUI-CrewAI" + ], + "install_type": "git-clone", + "description": "ComfyUI-CrewAI aims to integrate Crew AI's multi-agent collaboration framework into the ComfyUI environment. By combining the strengths of Crew AI's role-based, collaborative AI agent system with ComfyUI's intuitive interface, we will create a robust platform for managing and executing complex AI tasks seamlessly" + }, + { + "author": "chandlergis", + "title": "ComfyUI_EmojiOverlay", + "id": "emoji-overlay", + "reference": "https://github.com/chandlergis/ComfyUI_EmojiOverlay", + "files": [ + "https://github.com/chandlergis/ComfyUI_EmojiOverlay" + ], + "install_type": "git-clone", + "description": "Nodes:Image Emoji Overlay" + }, + { + "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:BK Img To Color, BK Color Selector" + }, + { + "author": "risunobushi", + "title": "comfyUI_FrequencySeparation_RGB-HSV", + "id": "freq-sep", + "reference": "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV", + "files": [ + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV" + ], + "install_type": "git-clone", + "description": "A collection of simple nodes for Frequency Separation / Frequency Recombine with RGB and HSV methods" + }, + { + "author": "zohac", + "title": "ComfyUI_ZC_DrawShape", + "id": "drawshape", + "reference": "https://github.com/zohac/ComfyUI_ZC_DrawShape", + "files": [ + "https://github.com/zohac/ComfyUI_ZC_DrawShape" + ], + "install_type": "git-clone", + "description": "Nodes:ZC DrawShape Node" + }, + { + "author": "DataCTE", + "title": "Prompt Injection Node for ComfyUI", + "id": "prompt-injection", + "reference": "https://github.com/DataCTE/prompt_injection", + "files": [ + "https://github.com/DataCTE/prompt_injection" + ], + "install_type": "git-clone", + "description": "This custom node for ComfyUI allows you to inject specific prompts at specific blocks of the Stable Diffusion UNet, providing fine-grained control over the generated image. It is based on the concept that the content/subject understanding of the model is primarily contained within the MID0 and MID1 blocks, as demonstrated in the B-Lora (Content Style implicit separation) paper. Features.\nInject different prompts into specific UNet blocks Three different node variations for flexible workflow integration Customize the learning rate of specific blocks to focus on content, lighting, style, or other aspects Potential for developing a 'Mix of Experts' approach by swapping blocks on-the-fly based on prompt content" + }, + { + "author": "FrankChieng", + "title": "ComfyUI_llm_easyanimiate", + "id": "llm-easyanimate", + "nodename_pattern": "^FrankChiengEasyAnimate", + "reference": "https://github.com/frankchieng/ComfyUI_llm_easyanimiate", + "files": [ + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate" + ], + "install_type": "git-clone", + "description": "implementation easyanimate with llama3-8b-6bit instruction LLM generation prompt help" + }, + { + "author": "nuanarchy", + "title": "ComfyUI-NuA-FlashFace", + "id": "nua-flashface", + "reference": "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace", + "files": [ + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/FlashFace: Human Image Personalization with High-fidelity Identity Preservation](https://github.com/ali-vilab/FlashFace)\nNOTE: You need to downalod models manually." + }, + { + "author": "nuanarchy", + "title": "ComfyUI-NuA-BIRD", + "id": "nua-bird", + "reference": "https://github.com/nuanarchy/ComfyUI-NuA-BIRD", + "files": [ + "https://github.com/nuanarchy/ComfyUI-NuA-BIRD" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of '[a/Blind Image Restoration via Fast Diffusion Inversion](https://github.com/hamadichihaoui/BIRD)' Original [a/article](https://arxiv.org/abs/2405.19572)" + }, + { + "author": "denfrost", + "title": "Den_ComfyUI_Workflows", + "id": "den", + "reference": "https://github.com/denfrost/Den_ComfyUI_Workflow", + "files": [ + "https://github.com/denfrost/Den_ComfyUI_Workflow" + ], + "install_type": "git-clone", + "description": "Custom nodes make easy Advanced Workflows. Focus on Image/Video and ControlNet efficiency and performances. Manipulation of Latent Space, Automatic pipeline with a bit efforts." + }, + { + "author": "marduk191", + "title": "marduk191 workflow settings", + "id": "marnodes", + "reference": "https://github.com/marduk191/comfyui-marnodes", + "files": [ + "https://github.com/marduk191/comfyui-marnodes" + ], + "install_type": "git-clone", + "description": "A node to set workflow settings." + }, + { + "author": "haohaocreates", + "title": "ComfyUI-HH-Image-Selector", + "id": "hh-image-selector", + "reference": "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector", + "files": [ + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector" + ], + "install_type": "git-clone", + "description": "comfy ui custom node that returns an image from a batch based on selected criteria such as RGB value, brightness, etc (credits to chris goringe's custom nodes tutorial )." + }, + { + "author": "exdysa", + "title": "comfyui-selector", + "reference": "https://github.com/exdysa/comfyui-selector", + "files": [ + "https://github.com/exdysa/comfyui-selector" + ], + "install_type": "git-clone", + "description": "Nodes:Selector. Quick and dirty parameter generator node for ComfyUI." + }, + { + "author": "Jin Liu", + "title": "ComfyUI-LJNodes", + "id": "ComfyUI-LJNodes", + "reference": "https://github.com/coolzilj/ComfyUI-LJNodes", + "files": [ + "https://github.com/coolzilj/ComfyUI-LJNodes" + ], + "install_type": "git-clone", + "description": "A variety of custom nodes to enhance ComfyUI for a buttery smooth experience." + }, + { + "author": "GavChap", + "title": "ComfyUI-SD3LatentSelectRes", + "id": "sd3latent-select-res", + "reference": "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes", + "files": [ + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes" + ], + "install_type": "git-clone", + "description": "You'll get a new node called SD3 Latent Select Resolution, you can pick the x and y sizes from a list." + }, + { + "author": "BenNarum", + "title": "SigmaWaveFormNodes", + "id": "sigmawaveform", + "reference": "https://github.com/BenNarum/SigmaWaveFormNode", + "files": [ + "https://github.com/BenNarum/SigmaWaveFormNode" + ], + "install_type": "git-clone", + "description": "A set of tools for generating and altering sigmas in ComfyUI." + }, + { + "author": "shobhitic", + "title": "PlusMinusTextClip - Single node for Positive and Negative Prompts", + "id": "plusminustextclip", + "reference": "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip", + "files": [ + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip" + ], + "install_type": "git-clone", + "description": "This adds a node that has both the positive and negative prompts as input in one node. You can just add one node and be done with both Positive and Negative prompts, in place of adding two different nodes for them." + }, + { + "author": "Late Night Labs", + "title": "LNL Frame Selector", + "id": "lnlframeselector", + "reference": "https://github.com/latenightlabs/ComfyUI-LNL", + "files": [ + "https://github.com/latenightlabs/ComfyUI-LNL" + ], + "install_type": "git-clone", + "description": "Frame Selector & Sequence Selection Node for ComfyUI." + }, + { + "author": "Michael Standen", + "title": "Ollama Prompt Encode", + "id": "ollamapromptencode", + "reference": "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode", + "files": [ + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode" + ], + "install_type": "git-clone", + "description": "A prompt generator and CLIP encoder using AI provided by Ollama." + }, + { + "author": "toxicwind", + "title": "TTools for ComfyUI", + "id": "ttools", + "reference": "https://github.com/toxicwind/ComfyUI-TTools", + "files": [ + "https://github.com/toxicwind/ComfyUI-TTools" + ], + "install_type": "git-clone", + "description": "Text Randomization and Formatting, JSON Extraction and Processing, SD3 Resolution Solver" + }, + { + "author": "Yanick112", + "title": "ComfyUI-ToSVG", + "id": "tosvg", + "reference": "https://github.com/Yanick112/ComfyUI-ToSVG", + "files": [ + "https://github.com/Yanick112/ComfyUI-ToSVG" + ], + "install_type": "git-clone", + "description": "This project converts raster images into SVG format using the [a/VTracer](https://github.com/visioncortex/vtracer) library. It's a handy tool for designers and developers who need to work with vector graphics programmatically." + }, + { + "author": "dicksondickson", + "title": "ComfyUI-Dickson-Nodes", + "id": "dicksonnodes", + "reference": "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes", + "files": [ + "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes" + ], + "install_type": "git-clone", + "description": "Custom nodes for ComfyUI by DicksonDickson." + }, + { + "author": "juehackr", + "title": "comfyui_fk_server", + "id": "fk-server", + "reference": "https://github.com/juehackr/comfyui_fk_server", + "files": [ + "https://github.com/juehackr/comfyui_fk_server" + ], + "install_type": "git-clone", + "description": "🤗🤗🤗Comfyui Universal Translation Plugin (no longer requires adding various nodes, directly add translation function on the existing nodes), allowing Comfyui to support Chinese input and automatic translation for any long text input box, while adding error translation function (calling Baidu Translate), achieving translation freedom!" + }, + { + "author": "G-370", + "title": "ComfyUI-SD3-Powerlab", + "id": "sd3-powerlab", + "reference": "https://github.com/G-370/ComfyUI-SD3-Powerlab", + "files": [ + "https://github.com/G-370/ComfyUI-SD3-Powerlab" + ], + "install_type": "git-clone", + "description": "Nodes:Render SD3 Attention, SD3 Attention To Image, SD3 Image Into Attention." + }, + { + "author": "TylerZoro", + "title": "SD3-Scaling", + "id": "sd3-scaling", + "reference": "https://github.com/TylerZoro/SD3-Scaling", + "files": [ + "https://github.com/TylerZoro/SD3-Scaling" + ], + "install_type": "git-clone", + "description": "Tools for scaling images and latents appropriate to SD3 in ComfyUI." + }, + { + "author": "baicai99", + "title": "ComfyUI-FrameSkipping", + "id": "FrameSkipping", + "reference": "https://github.com/baicai99/ComfyUI-FrameSkipping", + "files": [ + "https://github.com/baicai99/ComfyUI-FrameSkipping" + ], + "install_type": "git-clone", + "description": "Used to process video redrawing, frame skipping, frame ending early, etc." + }, + { + "author": "SuperMasterBlasterLaser", + "title": "ComfyUI_YOLO_Classifiers", + "id": "yolo-classifier", + "reference": "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers", + "files": [ + "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers" + ], + "install_type": "git-clone", + "description": "Nodes:YOLO Classifier Model Loader, YOLO Classify." + }, + { + "author": "SamKhoze", + "title": "DeepFuze", + "id": "deepfuze", + "reference": "https://github.com/SamKhoze/ComfyUI-DeepFuze", + "files": [ + "https://github.com/SamKhoze/ComfyUI-DeepFuze" + ], + "install_type": "git-clone", + "description": "DeepFuze is a state-of-the-art deep learning tool that seamlessly integrates with ComfyUI to revolutionize facial transformations, lipsyncing, video generation, voice cloning, face swapping, and lipsync translation. Leveraging advanced algorithms, DeepFuze enables users to combine audio and video with unparalleled realism, ensuring perfectly synchronized facial movements. This innovative solution is ideal for content creators, animators, developers, and anyone seeking to elevate their video editing projects with sophisticated AI-driven features." + }, + { + "author": "superyoman", + "title": "comfyui_lumaAPI", + "id": "luma", + "reference": "https://github.com/superyoman/comfyui_lumaAPI", + "files": [ + "https://github.com/superyoman/comfyui_lumaAPI" + ], + "install_type": "git-clone", + "description": "Unofficial Luma API-ComfyUI version.[w/WARN: This project is for learning purpose only!]" + }, + { + "author": "chris-the-wiz", + "title": "EmbeddingsCurveEditor_ComfyUI", + "id": "embeddings-curve-editor", + "reference": "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI", + "files": [ + "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI" + ], + "install_type": "git-clone", + "description": "Edit embeddings with a curve. Actually should work on any 1D input tensor. Tested with IPAdapter-Plus." + }, + { + "author": "zhulu111", + "title": "ComfyUI_Bxb", + "id": "ComfyUI_Bxb", + "reference": "https://github.com/zhulu111/ComfyUI_Bxb", + "files": [ + "https://github.com/zhulu111/ComfyUI_Bxb" + ], + "install_type": "git-clone", + "description": "sdBxb, a tool that converts ComfyUI workflows into WeChat Mini Program, Douyin Mini Program, and H5 with one click, and supports payments." + }, + { + "author": "lordgasmic", + "title": "comfyui_wildcards", + "reference": "https://github.com/lordgasmic/comfyui_wildcards", + "files": [ + "https://github.com/lordgasmic/comfyui_wildcards" + ], + "install_type": "git-clone", + "description": "This is an attempt to recreate the wildcards plugin for Automatic1111 but for ComfyUI." + }, + { + "author": "lordgasmic", + "title": "comfyui_save_image_with_options", + "reference": "https://github.com/lordgasmic/comfyui_save_image_with_options", + "files": [ + "https://github.com/lordgasmic/comfyui_save_image_with_options" + ], + "install_type": "git-clone", + "description": "Nodes:Save Image with Options" + }, + { + "author": "opvelll", + "title": "Comfy UI Text List Product", + "id": "listproduct", + "reference": "https://github.com/opvelll/ComfyUI_TextListProduct", + "files": [ + "https://github.com/opvelll/ComfyUI_TextListProduct" + ], + "install_type": "git-clone", + "description": "This is a custom node for Comfy UI. It mainly wraps itertools.product and can be used to create patterns by combining prompts. It is recommended to install this custom node in combination with the nodes from the WAS Node Suite." + }, + { + "author": "jakechai", + "title": "ComfyUI-JakeUpgrade", + "id": "jkupgrade", + "reference": "https://github.com/jakechai/ComfyUI-JakeUpgrade", + "files": [ + "https://github.com/jakechai/ComfyUI-JakeUpgrade" + ], + "install_type": "git-clone", + "description": "A ComfyUI workflow customization by Jake." + }, + { + "author": "celsojr2013", + "title": "ComfyUI SimpleTools Suit", + "reference": "https://github.com/celsojr2013/comfyui_simpletools", + "files": [ + "https://github.com/celsojr2013/comfyui_simpletools" + ], + "install_type": "git-clone", + "description": "Nodes:Simple Google Translator, Simple Resolution Solver.\nThis is a small set of simple nodes that help your workflow on ComfyUI." + }, + { + "author": "celsojr2013", + "title": "comfyui_jamworks_client", + "reference": "https://github.com/celsojr2013/comfyui_jamworks_client", + "files": [ + "https://github.com/celsojr2013/comfyui_jamworks_client" + ], + "install_type": "git-clone", + "description": "Nodes:Jamworks_Login, Jamworks_Download, Shell_Command.\nA Simple Client for Jamworks Platform DAM Integration" + }, + { + "author": "fablestudio", + "title": "ComfyUI-Showrunner-Utils", + "reference": "https://github.com/fablestudio/ComfyUI-Showrunner-Utils", + "files": [ + "https://github.com/fablestudio/ComfyUI-Showrunner-Utils" + ], + "install_type": "git-clone", + "description": "Comfyui Custom Nodes for Showrunner" + }, + { + "author": "MilitantHitchhiker", + "title": "Militant Hitchhiker's Switchblade Pack", + "id": "hitchhiker", + "reference": "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack", + "files": [ + "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack" + ], + "install_type": "git-clone", + "description": "Militant Hitchhiker's Switchblade Pack is a collection of custom nodes for ComfyUI that provide various multi-function capabilities." + }, + { + "author": "slyt", + "title": "comfyui-ollama-nodes", + "reference": "https://github.com/slyt/comfyui-ollama-nodes", + "files": [ + "https://github.com/slyt/comfyui-ollama-nodes" + ], + "install_type": "git-clone", + "description": "ComfyUI custom nodes for working with [a/Ollama](https://github.com/ollama/ollama).\nNOTE:Assumes that an Ollama server is running at http://127.0.0.1:11434 and accessible by the ComfyUI backend." + }, + { + "author": "zwng", + "title": "ComfyUI_Zwng_Nodes", + "id": "zwng", + "reference": "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes", + "files": [ + "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes" + ], + "install_type": "git-clone", + "description": "Simple nodes for loading image files.Nodes that include a simple remote connection to Photoshop, a node that can overlay and preview an image with a mask, and a node that can load images directly from a file path." + }, + { + "author": "RedRayz", + "title": "ComfyUI-Danbooru-To-WD", + "id": "danbooru2wd", + "reference": "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD", + "files": [ + "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD" + ], + "install_type": "git-clone", + "description": "Converts booru tags to a format suitable for Waifu Diffusion(or Danbooru based models)." + }, + { + "author": "Shibiko-AI", + "title": "Shibiko AI ComfyUI Tools", + "id": "shibiko-ai-tools", + "reference": "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools", + "files": [ + "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools" + ], + "install_type": "git-clone", + "description": "This is a collection of tools that I use to make my life easier when developing ComfyUI applications. It is a collection of tools that I have created to help me with my development process. I have decided to share these tools with the community in the hopes that they will be useful to others as well. I use this tools to further develop features for [a/https://shibiko.ai](https://shibiko.ai)" + }, + { + "author": "SaltAI", + "title": "SaltAI_AudioViz", + "id": "saltai-audioviz", + "reference": "https://github.com/get-salt-AI/SaltAI_AudioViz", + "files": [ + "https://github.com/get-salt-AI/SaltAI_AudioViz" + ], + "install_type": "git-clone", + "description": "SaltAI AudioViz contains ComfyUI nodes for generating complex audio reactive visualizations" + }, + { + "author": "SherryXieYuchen", + "title": "ComfyUI-Image-Inpainting", + "id": "image-inpainting", + "reference": "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting", + "files": [ + "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting" + ], + "install_type": "git-clone", + "description": "Nodes:VAE Encode Inpaint, VAE Decode Inpaint, ColorCorrection Inpaint, ImagePreprocess Inpaint, ImagePostprocess Inpaint, Load Model Inpaint, Inpainting (using Model)" + }, + { + "author": "zeroxoxo", + "title": "ComfyUI-Fast-Style-Transfer", + "id": "fast-style-transfer", + "reference": "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer", + "files": [ + "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer" + ], + "install_type": "git-clone", + "description": "ComfyUI node for fast neural style transfer. This is a simple conversion based on this: [a/https://github.com/rrmina/fast-neural-style-pytorch](https://github.com/rrmina/fast-neural-style-pytorch) Only basic inference functionality is ported for now." + }, + { + "author": "iwanders", + "title": "iwanders/ComfyUI_nodes", + "id": "iwanders-nodes", + "reference": "https://github.com/iwanders/ComfyUI_nodes", + "files": [ + "https://github.com/iwanders/ComfyUI_nodes" + ], + "install_type": "git-clone", + "description": "Nodes:IW SaveString, IW PrintString, IW ReplaceString, IW StringNode, IW StringConcat, IW TokenizerVocab, IW JsonPickItem." + }, + { + "author": "rhdunn", + "title": "comfyui-bus-plugin", + "id": "bus", + "reference": "https://github.com/rhdunn/comfyui-bus-plugin", + "files": [ + "https://github.com/rhdunn/comfyui-bus-plugin" + ], + "install_type": "git-clone", + "description": "A collection of nodes for rerouting multiple I/O lines together in a bus." + }, + { + "author": "hyunamy", + "title": "Comfy-UI on-complete-email-me", + "id": "hyunamy", + "reference": "https://github.com/hyunamy/comfy-ui-on-complete-email-me", + "files": [ + "https://github.com/hyunamy/comfy-ui-on-complete-email-me" + ], + "install_type": "git-clone", + "description": "A feature that sends an email via Gmail once image generation is completed in Comfy-ui." + }, + { + "author": "veighnsche", + "title": "comfyui_gr85", + "id": "gr85", + "reference": "https://github.com/veighnsche/comfyui_gr85", + "files": [ + "https://github.com/veighnsche/comfyui_gr85" + ], + "install_type": "git-clone", + "description": "Nodes:Image Dimension Resizer, Image Sizer, Random Ratio, Show Text, Random Title Character, Random Wildcard Tag Picker, Random Show Atm Loc Outfit, Contains Word, Elements Concatenator, ..." + }, + { + "author": "leiweiqiang", + "title": "ComfyUI-TRA", + "id": "tra", + "reference": "https://github.com/leiweiqiang/ComfyUI-TRA", + "files": [ + "https://github.com/leiweiqiang/ComfyUI-TRA" + ], + "install_type": "git-clone", + "description": "Nodes:TCL EbSynth, TCL Extract Frames (From File), TCL Extract Frames (From Video), TCL Combine Frames, TCL Save Video (From Frames)" + }, + { + "author": "hwhaocool", + "title": "ComfyUI-Select-Any", + "id": "select-any", + "reference": "https://github.com/hwhaocool/ComfyUI-Select-Any", + "files": [ + "https://github.com/hwhaocool/ComfyUI-Select-Any" + ], + "install_type": "git-clone", + "description": "a comfyui custom node, which can select value from inputs" + }, + { + "author": "mingqizhang", + "title": "ComfyUI_InSPyResNet_zmq", + "id": "inspy", + "reference": "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq", + "files": [ + "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq" + ], + "install_type": "git-clone", + "description": "Nodes:INSPY removebg ModelLoader, INSPY RMBG" + }, + { + "author": "GreenLandisaLie", + "title": "AuraSR-ComfyUI", + "id": "aurasr-greenlandisalie", + "reference": "https://github.com/GreenLandisaLie/AuraSR-ComfyUI", + "files": [ + "https://github.com/GreenLandisaLie/AuraSR-ComfyUI" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/Aura-SR](https://github.com/fal-ai/aura-sr)" + }, + { + "author": "licyk", + "title": "ComfyUI-Restart-Sampler", + "id": "restart-sampler-licyk", + "reference": "https://github.com/licyk/ComfyUI-Restart-Sampler", + "files": [ + "https://github.com/licyk/ComfyUI-Restart-Sampler" + ], + "install_type": "git-clone", + "description": "This extension is a node that directly expands the functionality of KSampler, rather than being in the form of a custom node. [w/Workflows created using this feature are not compatible with other users.]" + }, + { + "author": "Fuou Marinas", + "title": "ComfyUI-FirstOrderMM", + "id": "fomm", + "reference": "https://github.com/FuouM/ComfyUI-FirstOrderMM", + "files": [ + "https://github.com/FuouM/ComfyUI-FirstOrderMM" + ], + "install_type": "git-clone", + "description": "Run [a/First Order Motion Model](https://github.com/AliaksandrSiarohin/first-order-model) for Image Animation in ComfyUI." + }, + { + "author": "my-opencode", + "title": "ComfyUI_IndustrialMagick", + "id": "industrialmagick", + "reference": "https://github.com/my-opencode/ComfyUI_IndustrialMagick", + "files": [ + "https://github.com/my-opencode/ComfyUI_IndustrialMagick" + ], + "install_type": "git-clone", + "description": "[a/ImageMagick](https://imagemagick.org/index.php) nodes for ComfyUI. Adds nodes to call ImageMagick subprocesses from ComfyUI.\nRequirements: [a/ImagMagick7](https://imagemagick.org/script/download.php), 'magick' command in your CLI environment." + }, + { + "author": "my-opencode", + "title": "ComfyUI_KSamplerTimer", + "id": "ksamplertimer", + "reference": "https://github.com/my-opencode/ComfyUI_KSamplerTimer", + "files": [ + "https://github.com/my-opencode/ComfyUI_KSamplerTimer" + ], + "install_type": "git-clone", + "description": "A custom node that returns the generation time of the KSampler. Intended for benchmarking or debugging." + }, + { + "author": "SEkINVR", + "title": "ComfyUI SaveAS", + "id": "saveas", + "reference": "https://github.com/SEkINVR/ComfyUI-SaveAs", + "files": [ + "https://github.com/SEkINVR/ComfyUI-SaveAs" + ], + "install_type": "git-clone", + "description": "This custom node for ComfyUI allows you to save images in multiple formats, including PNG, JPG, WebP, and ICO.\n[w/ComfyUI-Save-Multi-Format is renamed to SaveAs. Remove previous one and reinstall to this.]" + }, + { + "author": "MrSamSeen", + "title": "ComfyUI_SSStereoscope", + "id": "ssstereoscope", + "reference": "https://github.com/MrSamSeen/ComfyUI_SSStereoscope", + "files": [ + "https://github.com/MrSamSeen/ComfyUI_SSStereoscope" + ], + "install_type": "git-clone", + "description": "Side by Side 3D Stereoscope generation node for ComfyUI by SamSeen." + }, + { + "author": "jroc22", + "title": "ComfyUI-CSV-prompt-builder", + "id": "csv-prompt-builder", + "reference": "https://github.com/jroc22/ComfyUI-CSV-prompt-builder", + "files": [ + "https://github.com/jroc22/ComfyUI-CSV-prompt-builder" + ], + "install_type": "git-clone", + "description": "This is a simple node for creating prompts using a .csv file. I created this node as an easy way to output different prompts each time a workflow is run." + }, + { + "author": "DeJoker", + "title": "Pipeline Parallel ComfyUI", + "reference": "https://github.com/DeJoker/pipeline-parallel-comfy", + "files": [ + "https://github.com/DeJoker/pipeline-parallel-comfy" + ], + "install_type": "git-clone", + "description": "provide extra api to run prompt request with parallel execution of independent node" + }, + { + "author": "yiwangsimple", + "title": "comfy-groqchat", + "reference": "https://github.com/yiwangsimple/ComfyUI_GroqChat", + "files": [ + "https://github.com/yiwangsimple/ComfyUI_GroqChat" + ], + "install_type": "git-clone", + "description": "Content generation with open source models in comfyui via graq api implementation." + }, + { + "author": "Tritant", + "title": "ComfyUI-CreaPrompt", + "id": "creaprompt", + "reference": "https://github.com/tritant/ComfyUI_CreaPrompt", + "files": [ + "https://github.com/tritant/ComfyUI_CreaPrompt" + ], + "install_type": "git-clone", + "description": "Generate random prompts easily." + }, + { + "author": "metncelik", + "title": "comfyui_met_suite", + "reference": "https://github.com/metncelik/comfyui_met_suite", + "files": [ + "https://github.com/metncelik/comfyui_met_suite" + ], + "install_type": "git-clone", + "description": "Nodes: Primitive BBOX, BBOX Padding, BBOX Resize, ImageResize KeepRatio." + }, + { + "author": "Smuzzies", + "title": "comfyui_meme_maker", + "reference": "https://github.com/Smuzzies/comfyui_meme_maker", + "files": [ + "https://github.com/Smuzzies/comfyui_meme_maker" + ], + "install_type": "git-clone", + "description": "Meme Maker Node for ComfyUI." + }, + { + "author": "bluevisor", + "title": "ComfyUI_PS_Blend_Node", + "reference": "https://github.com/bluevisor/ComfyUI_PS_Blend_Node", + "files": [ + "https://github.com/bluevisor/ComfyUI_PS_Blend_Node" + ], + "install_type": "git-clone", + "description": "This repository contains a simple custom node for ComfyUI that implements familiar PS-style blend modes using PyTorch. The PSBlendNode allows you to blend two images together using a variety of blend modes and an opacity parameter." + }, + { + "author": "Grant-CP", + "title": "ComfyUI-LivePortraitKJ-MPS", + "reference": "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS", + "files": [ + "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS" + ], + "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": "wTechArtist", + "title": "ComfyUI-CustomNodes", + "reference": "https://github.com/wTechArtist/ComfyUI-CustomNodes", + "files": [ + "https://github.com/wTechArtist/ComfyUI-CustomNodes" + ], + "install_type": "git-clone", + "description": "Nodes:Image Blending Mode Mask" + }, + { + "author": "mullakhmetov", + "title": "comfyui_dynamic_util_nodes", + "reference": "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes", + "files": [ + "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes" + ], + "install_type": "git-clone", + "description": "ComfyS3 helpful util nodes for dynamic workflows" + }, + { + "author": "HECer", + "title": "ComfyUI-FilePathCreator", + "reference": "https://github.com/HECer/ComfyUI-FilePathCreator", + "files": [ + "https://github.com/HECer/ComfyUI-FilePathCreator" + ], + "install_type": "git-clone", + "description": "The ComfyUI-FilePathCreator is a custom node extension for ComfyUI designed to generate dynamic filenames based on user-defined parameters. This node helps streamline the process of creating organized and timestamped filenames, ideal for saving output files in a structured manner." + }, + { + "author": "adigayung", + "title": "ComfyUI-Translator", + "reference": "https://github.com/adigayung/ComfyUI-Translator", + "files": [ + "https://github.com/adigayung/ComfyUI-Translator" + ], + "install_type": "git-clone", + "description": "Auto translate all languages ​​to english" + }, + { + "author": "ZZXYWQ", + "title": "ZZX Nodes", + "id": "ZZXYWQ", + "reference": "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ", + "files": [ + "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ" + ], + "install_type": "git-clone", + "description": "Node(s): VideoFormatConverter(VFC)" + }, + + + + + + + + { + "author": "Ser-Hilary", + "title": "SDXL_sizing", + "reference": "https://github.com/Ser-Hilary/SDXL_sizing", + "files": [ + "https://github.com/Ser-Hilary/SDXL_sizing/raw/main/conditioning_sizing_for_SDXL.py" + ], + "install_type": "copy", + "description": "Nodes:sizing_node. Size calculation node related to image size in prompts supported by SDXL." + }, + { + "author": "ailex000", + "title": "Image Gallery", + "reference": "https://github.com/ailex000/ComfyUI-Extensions", + "js_path": "image-gallery", + "files": [ + "https://github.com/ailex000/ComfyUI-Extensions/raw/main/image-gallery/imageGallery.js" + ], + "install_type": "copy", + "description": "Custom javascript extensions for better UX for ComfyUI. Supported nodes: PreviewImage, SaveImage. Double click on image to open." + }, + { + "author": "rock-land", + "title": "graphNavigator", + "reference": "https://github.com/rock-land/graphNavigator", + "js_path": "graphNavigator", + "files": [ + "https://github.com/rock-land/graphNavigator/raw/main/graphNavigator/graphNavigator.js" + ], + "install_type": "copy", + "description": "ComfyUI Web Extension for saving views and navigating graphs." + }, + { + "author": "diffus3", + "title": "diffus3/ComfyUI-extensions", + "reference": "https://github.com/diffus3/ComfyUI-extensions", + "js_path": "diffus3", + "files": [ + "https://github.com/diffus3/ComfyUI-extensions/raw/main/multiReroute/multireroute.js", + "https://github.com/diffus3/ComfyUI-extensions/raw/main/setget/setget.js" + ], + "install_type": "copy", + "description": "Extensions: subgraph, setget, multiReroute" + }, + { + "author": "m957ymj75urz", + "title": "m957ymj75urz/ComfyUI-Custom-Nodes", + "reference": "https://github.com/m957ymj75urz/ComfyUI-Custom-Nodes", + "js_path": "m957ymj75urz", + "files": [ + "https://github.com/m957ymj75urz/ComfyUI-Custom-Nodes/raw/main/clip-text-encode-split/clip_text_encode_split.py", + "https://github.com/m957ymj75urz/ComfyUI-Custom-Nodes/raw/main/colors/colors.js" + ], + "install_type": "copy", + "description": "Nodes: RawText, RawTextCLIPEncode, RawTextCombine, RawTextReplace, Extension: m957ymj75urz.colors" + }, + { + "author": "Bikecicle", + "title": "Waveform Extensions", + "reference": "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions", + "files": [ + "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py", + "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_VariationUtils.py" + ], + "install_type": "copy", + "description": "Some additional audio utilites for use on top of Sample Diffusion ComfyUI Extension" + }, + { + "author": "dawangraoming", + "title": "KSampler GPU", + "reference": "https://github.com/dawangraoming/ComfyUI_ksampler_gpu", + "files": [ + "https://github.com/dawangraoming/ComfyUI_ksampler_gpu/raw/main/ksampler_gpu.py" + ], + "install_type": "copy", + "description": "KSampler is provided, based on GPU random noise" + }, + { + "author": "fitCorder", + "title": "fcSuite", + "reference": "https://github.com/fitCorder/fcSuite", + "files": [ + "https://github.com/fitCorder/fcSuite/raw/main/fcSuite.py" + ], + "install_type": "copy", + "description": "fcFloatMatic is a custom module, that when configured correctly will increment through the lines generating you loras at different strengths. The JSON file will load the config." + }, + { + "author": "lrzjason", + "title": "ComfyUIJasonNode", + "reference": "https://github.com/lrzjason/ComfyUIJasonNode", + "files": [ + "https://github.com/lrzjason/ComfyUIJasonNode/raw/main/SDXLMixSampler.py", + "https://github.com/lrzjason/ComfyUIJasonNode/raw/main/LatentByRatio.py", + "" + ], + "install_type": "copy", + "description": "Nodes:SDXLMixSampler, LatentByRatio" + }, + { + "author": "lordgasmic", + "title": "Wildcards", + "reference": "https://github.com/lordgasmic/ComfyUI-Wildcards", + "files": [ + "https://github.com/lordgasmic/ComfyUI-Wildcards/raw/master/wildcards.py" + ], + "install_type": "copy", + "description": "Nodes:CLIPTextEncodeWithWildcards. This wildcard node is a wildcard node that operates based on the seed." + }, + { + "author": "throttlekitty", + "title": "SDXLCustomAspectRatio", + "reference": "https://github.com/throttlekitty/SDXLCustomAspectRatio", + "files": [ + "https://raw.githubusercontent.com/throttlekitty/SDXLCustomAspectRatio/main/SDXLAspectRatio.py" + ], + "install_type": "copy", + "description": "A quick and easy ComfyUI custom node for setting SDXL-friendly aspect ratios." + }, + { + "author": "s1dlx", + "title": "comfy_meh", + "reference": "https://github.com/s1dlx/comfy_meh", + "files": [ + "https://github.com/s1dlx/comfy_meh/raw/main/meh.py" + ], + "install_type": "copy", + "description": "Advanced merging methods." + }, + { + "author": "tudal", + "title": "Hakkun-ComfyUI-nodes", + "reference": "https://github.com/tudal/Hakkun-ComfyUI-nodes", + "files": [ + "https://github.com/tudal/Hakkun-ComfyUI-nodes/raw/main/hakkun_nodes.py" + ], + "install_type": "copy", + "description": "Nodes: Prompt parser. ComfyUI extra nodes. Mostly prompt parsing." + }, + { + "author": "SadaleNet", + "title": "ComfyUI A1111-like Prompt Custom Node Solution", + "reference": "https://github.com/SadaleNet/CLIPTextEncodeA1111-ComfyUI", + "files": [ + "https://github.com/SadaleNet/CLIPTextEncodeA1111-ComfyUI/raw/master/custom_nodes/clip_text_encoder_a1111.py" + ], + "install_type": "copy", + "description": "Nodes: CLIPTextEncodeA1111, RerouteTextForCLIPTextEncodeA1111." + }, + { + "author": "wsippel", + "title": "SDXLResolutionPresets", + "reference": "https://github.com/wsippel/comfyui_ws", + "files": [ + "https://github.com/wsippel/comfyui_ws/raw/main/sdxl_utility.py" + ], + "install_type": "copy", + "description": "Nodes: SDXLResolutionPresets. Easy access to the officially supported resolutions, in both horizontal and vertical formats: 1024x1024, 1152x896, 1216x832, 1344x768, 1536x640" + }, + { + "author": "nicolai256", + "title": "comfyUI_Nodes_nicolai256", + "id": "nicoali256", + "reference": "https://github.com/nicolai256/comfyUI_Nodes_nicolai256", + "files": [ + "https://github.com/nicolai256/comfyUI_Nodes_nicolai256/raw/main/yugioh-presets.py" + ], + "install_type": "copy", + "description": "Nodes: yugioh_Presets. by Nicolai256 inspired by throttlekitty SDXLAspectRatio" + }, + { + "author": "Onierous", + "title": "QRNG_Node_ComfyUI", + "id": "qrng", + "reference": "https://github.com/Onierous/QRNG_Node_ComfyUI", + "files": [ + "https://github.com/Onierous/QRNG_Node_ComfyUI/raw/main/qrng_node.py" + ], + "install_type": "copy", + "description": "Nodes: QRNG Node CSV. A node that takes in an array of random numbers from the ANU QRNG API and stores them locally for generating quantum random number noise_seeds in ComfyUI" + }, + { + "author": "ntdviet", + "title": "ntdviet/comfyui-ext", + "reference": "https://github.com/ntdviet/comfyui-ext", + "files": [ + "https://github.com/ntdviet/comfyui-ext/raw/main/custom_nodes/gcLatentTunnel/gcLatentTunnel.py" + ], + "install_type": "copy", + "description": "Nodes:LatentGarbageCollector. This ComfyUI custom node flushes the GPU cache and empty cuda interprocess memory. It's helpfull for low memory environment such as the free Google Colab, especially when the workflow VAE decode latents of the size above 1500x1500." + }, + { + "author": "alkemann", + "title": "alkemann nodes", + "id": "alkemann", + "reference": "https://gist.github.com/alkemann/7361b8eb966f29c8238fd323409efb68", + "files": [ + "https://gist.github.com/alkemann/7361b8eb966f29c8238fd323409efb68/raw/f9605be0b38d38d3e3a2988f89248ff557010076/alkemann.py" + ], + "install_type": "copy", + "description": "Nodes:Int to Text, Seed With Text, Save A1 Image." + }, + { + "author": "catscandrive", + "title": "Image loader with subfolders", + "id": "imgsubfolders", + "reference": "https://github.com/catscandrive/comfyui-imagesubfolders", + "files": [ + "https://github.com/catscandrive/comfyui-imagesubfolders/raw/main/loadImageWithSubfolders.py" + ], + "install_type": "copy", + "description": "Adds an Image Loader node that also shows images in subfolders of the default input directory" + }, + { + "author": "Smuzzies", + "title": "Chatbox Overlay node for ComfyUI", + "id": "chatbox-overlay", + "reference": "https://github.com/Smuzzies/comfyui_chatbox_overlay", + "files": [ + "https://github.com/Smuzzies/comfyui_chatbox_overlay/raw/main/chatbox_overlay.py" + ], + "install_type": "copy", + "description": "Nodes: Chatbox Overlay. Custom node for ComfyUI to add a text box over a processed image before save node." + }, + { + "author": "CaptainGrock", + "title": "ComfyUIInvisibleWatermark", + "id": "invisible-watermark-grock", + "reference": "https://github.com/CaptainGrock/ComfyUIInvisibleWatermark", + "files": [ + "https://github.com/CaptainGrock/ComfyUIInvisibleWatermark/raw/main/Invisible%20Watermark.py" + ], + "install_type": "copy", + "description": "Nodes:Apply Invisible Watermark, Extract Watermark. Adds up to 12 characters encoded into an image that can be extracted." + }, + { + "author": "fearnworks", + "title": "Fearnworks Custom Nodes", + "id": "fearnworks", + "reference": "https://github.com/fearnworks/ComfyUI_FearnworksNodes", + "files": [ + "https://github.com/fearnworks/ComfyUI_FearnworksNodes/raw/main/fw_nodes.py" + ], + "install_type": "copy", + "description": "A collection of ComfyUI nodes. These nodes are tailored for specific tasks, such as counting files in directories and sorting text segments based on token counts. Currently this is only tested on SDXL 1.0 models. An additional swich is needed to hand 1.x" + }, + { + "author": "LZC", + "title": "Hayo comfyui nodes", + "id": "lzcnodes", + "reference": "https://github.com/1shadow1/hayo_comfyui_nodes", + "files": [ + "https://github.com/1shadow1/hayo_comfyui_nodes/raw/main/LZCNodes.py" + ], + "install_type": "copy", + "description": "Nodes:tensor_trans_pil, Make Transparent mask, MergeImages, words_generatee, load_PIL image" + }, + { + "author": "underclockeddev", + "title": "Preview Subselection Node for ComfyUI", + "id": "preview-subselection", + "reference": "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node", + "files": [ + "https://github.com/underclockeddev/ComfyUI-PreviewSubselection-Node/raw/master/preview_subselection.py" + ], + "install_type": "copy", + "description": "A node which takes in x, y, width, height, total width, and total height, in order to accurately represent the area of an image which is covered by area-based conditioning." + }, + { + "author": "underclockeddev", + "title": "BrevImage", + "id": "brevimage", + "reference": "https://github.com/bkunbargi/BrevImage", + "files": [ + "https://github.com/bkunbargi/BrevImage/raw/main/BrevLoadImage.py" + ], + "install_type": "copy", + "description": "Nodes:BrevImage. ComfyUI Load Image From URL" + }, + { + "author": "jw782cn", + "title": "ComfyUI-Catcat", + "id": "catcat", + "reference": "https://github.com/jw782cn/ComfyUI-Catcat", + "files": [ + "https://github.com/jw782cn/ComfyUI-Catcat" + ], + "install_type": "copy", + "description": "Extension to show random cat GIFs while queueing prompt." + }, + { + "author": "barckley75", + "title": "comfyUI_DaVinciResolve", + "reference": "https://github.com/barckley75/comfyUI_DaVinciResolve", + "files": [ + "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/node_text_to_speech.py", + "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/nodes_phy_3_contitioning.py", + "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/save_audio_to_davinci.py", + "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/save_image_to_davinci.py" + ], + "install_type": "copy", + "description": "Nodes:TextToSpeech, phy_3_conditioning, SaveAudioToDaVinci, SaveImageToDaVinci.\nNOTE:In order to use DaVinci node you must have DaVinci Resolve Studio connected to the API. For more information check the help seciton in DaVinci Resolve Studio HELP>DOCUMENTATION>DEVELOPER. It will open a folder, search for scripting and the for README.txt file, the API documentation." + }, + { + "author": "DannyStone1999", + "title": "ComfyUI-Depth2Mask", + "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": "Limbicnation", + "title": "ComfyUIDepthEstimation", + "reference": "https://github.com/Limbicnation/ComfyUIDepthEstimation", + "files": [ + "https://github.com/Limbicnation/ComfyUIDepthEstimation/raw/main/depth_estimation_node.py" + ], + "pip": ["transformers"], + "install_type": "copy", + "description": "A custom depth estimation node for ComfyUI using transformer models. It integrates depth estimation with automatic gamma correction, contrast adjustment, and edge detection, based on the [a/TransformDepth](https://github.com/Limbicnation/TransformDepth) repository." + }, + { + "author": "seghier", + "title": "ComfyUI_LibreTranslate", + "reference": "https://github.com/seghier/ComfyUI_LibreTranslate", + "files": [ + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py" + ], + "install_type": "copy", + "description": "Use LibreTranslation in ComfyUI [a/https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)" + }, + { + "author": "ImmortalPie", + "title": "PonySwitch Node", + "reference": "https://github.com/ImmortalPie/ComfyUI-PonySwitch", + "files": [ + "https://github.com/ImmortalPie/ComfyUI-PonySwitch/raw/main/PonySwitch.py" + ], + "install_type": "copy", + "description": "The PonySwitch node is a custom node for ComfyUI that modifies prompts based on a toggle switch and adds configurable pony tags." + }, + { + "author": "theally", + "title": "TheAlly's Custom Nodes", + "id": "ally", + "reference": "https://civitai.com/models/19625?modelVersionId=23296", + "files": [ + "https://civitai.com/api/download/models/25114", + "https://civitai.com/api/download/models/24679", + "https://civitai.com/api/download/models/24154", + "https://civitai.com/api/download/models/23884", + "https://civitai.com/api/download/models/23649", + "https://civitai.com/api/download/models/23467", + "https://civitai.com/api/download/models/23296" + ], + "install_type": "unzip", + "description": "Custom nodes for ComfyUI by TheAlly." + }, + { + "author": "xss", + "title": "Custom Nodes by xss", + "id": "xss", + "reference": "https://civitai.com/models/24869/comfyui-custom-nodes-by-xss", + "files": [ + "https://civitai.com/api/download/models/32717", + "https://civitai.com/api/download/models/47776", + "https://civitai.com/api/download/models/29772", + "https://civitai.com/api/download/models/31618", + "https://civitai.com/api/download/models/31591", + "https://civitai.com/api/download/models/29773", + "https://civitai.com/api/download/models/29774", + "https://civitai.com/api/download/models/29755", + "https://civitai.com/api/download/models/29750" + ], + "install_type": "unzip", + "description": "Various image processing nodes." + }, + { + "author": "aimingfail", + "title": "Image2Halftone Node for ComfyUI", + "id": "img2halftone", + "reference": "https://civitai.com/models/143293/image2halftone-node-for-comfyui", + "files": [ + "https://civitai.com/api/download/models/158997" + ], + "install_type": "unzip", + "description": "This is a node to convert an image into a CMYK Halftone dot image." + } + ] +} diff --git a/custom_nodes/ComfyUI-Manager/docs/en/cm-cli.md b/custom_nodes/ComfyUI-Manager/docs/en/cm-cli.md new file mode 100644 index 000000000..e5158be84 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/docs/en/cm-cli.md @@ -0,0 +1,146 @@ +# `cm-cli`: ComfyUI-Manager CLI + +`cm-cli` is a tool that allows you to use various functions of ComfyUI-Manager from the command line without launching ComfyUI. + + +``` +-= ComfyUI-Manager CLI (V2.24) =- + + +python cm-cli.py [OPTIONS] + +OPTIONS: + [install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel ] ?[--mode [remote|local|cache]] + [update|disable|enable|fix] all ?[--channel ] ?[--mode [remote|local|cache]] + [simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel ] ?[--mode [remote|local|cache]] + save-snapshot ?[--output ] + restore-snapshot ?[--pip-non-url] ?[--pip-non-local-url] ?[--pip-local-url] + cli-only-mode [enable|disable] + restore-dependencies + clear +``` + +## How To Use? +* You can execute it via `python cm-cli.py`. +* For example, if you want to update all custom nodes: + * In the ComfyUI-Manager directory, you can execute the command `python cm-cli.py update all`. + * If running from the ComfyUI directory, you can specify the path to cm-cli.py like this: `python custom_nodes/ComfyUI-Manager/cm-cli.py update all`. + +## Prerequisite +* It must be run in the same Python environment as the one running ComfyUI. + * If using a venv, you must run it with the venv activated. + * If using a portable version, and you are in the directory with the run_nvidia_gpu.bat file, you should execute the command as follows: + `.\python_embeded\python.exe ComfyUI\custom_nodes\ComfyUI-Manager\cm-cli.py update all` +* The path for ComfyUI can be set with the COMFYUI_PATH environment variable. If omitted, a warning message will appear, and the path will be set relative to the installed location of ComfyUI-Manager: + ``` + WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path. + ``` + +## Features + +### 1. --channel, --mode +* For viewing information and managing custom nodes, you can set the information database through --channel and --mode. +* For instance, executing the command `python cm-cli.py update all --channel recent --mode remote` will operate based on the latest information from remote rather than local data embedded in the current ComfyUI-Manager repo and will only target the list in the recent channel. +* --channel, --mode are only available with the commands `simple-show, show, install, uninstall, update, disable, enable, fix`. + +### 2. Viewing Management Information + +`[simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel ] ?[--mode [remote|local|cache]]` + +* `[show|simple-show]` - `show` provides detailed information, while `simple-show` displays information more simply. + +Executing a command like `python cm-cli.py show installed` will display detailed information about the installed custom nodes. + +``` +-= ComfyUI-Manager CLI (V2.24) =- + +FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json +[ ENABLED ] ComfyUI-Manager (author: Dr.Lt.Data) +[ ENABLED ] ComfyUI-Impact-Pack (author: Dr.Lt.Data) +[ ENABLED ] ComfyUI-Inspire-Pack (author: Dr.Lt.Data) +[ ENABLED ] ComfyUI_experiments (author: comfyanonymous) +[ ENABLED ] ComfyUI-SAI_API (author: Stability-AI) +[ ENABLED ] stability-ComfyUI-nodes (author: Stability-AI) +[ ENABLED ] comfyui_controlnet_aux (author: Fannovel16) +[ ENABLED ] ComfyUI-Frame-Interpolation (author: Fannovel16) +[ DISABLED ] ComfyUI-Loopchain (author: Fannovel16) +``` + +Using a command like `python cm-cli.py simple-show installed` will simply display information about the installed custom nodes. + +``` +-= ComfyUI-Manager CLI (V2.24) =- + +FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json +ComfyUI-Manager +ComfyUI-Impact-Pack +ComfyUI-Inspire-Pack +ComfyUI_experiments +ComfyUI-SAI_API +stability-ComfyUI-nodes +comfyui_controlnet_aux +ComfyUI-Frame-Interpolation +ComfyUI-Loopchain +``` + +`[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]` + * `enabled`, `disabled`: Shows nodes that have been enabled or disabled among the installed custom nodes. + * `installed`: Shows all nodes that have been installed, regardless of whether they are enabled or disabled. + * `not-installed`: Shows a list of custom nodes that have not been installed. + * `all`: Shows a list of all custom nodes. + * `snapshot`: Displays snapshot information of the currently installed custom nodes. When viewed with `show`, it is displayed in JSON format, and with `simple-show`, it is displayed simply, along with the commit hash. + * `snapshot-list`: Shows a list of snapshot files stored in ComfyUI-Manager/snapshots. + +### 3. Managing Custom Nodes + +`[install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel ] ?[--mode [remote|local|cache]]` + +* You can apply management functions by listing the names of custom nodes, such as `python cm-cli.py install ComfyUI-Impact-Pack ComfyUI-Inspire-Pack ComfyUI_experiments`. +* The names of the custom nodes are as shown by `show` and are the names of the git repositories. +(Plans are to update the use of nicknames in the future.) + +`[update|disable|enable|fix] all ?[--channel ] ?[--mode [remote|local|cache]]` + +* The `update, disable, enable, fix` functions can be specified for all. + +* Detailed Operations + * `install`: Installs the specified custom nodes. + * `reinstall`: Removes and then reinstalls the specified custom nodes. + * `uninstall`: Uninstalls the specified custom nodes. + * `update`: Updates the specified custom nodes. + * `disable`: Disables the specified custom nodes. + * `enable`: Enables the specified custom nodes. + * `fix`: Attempts to fix dependencies for the specified custom nodes. + + +### 4. Snapshot Management +* `python cm-cli.py save-snapshot [--output ]`: Saves the current snapshot. + * With `--output`, you can save a file in .yaml format to any specified path. +* `python cm-cli.py restore-snapshot `: Restores to the specified snapshot. + * If a file exists at the snapshot path, that snapshot is loaded. + * If no file exists at the snapshot path, it is implicitly assumed to be in ComfyUI-Manager/snapshots. + * `--pip-non-url`: Restore for pip packages registered on PyPI. + * `--pip-non-local-url`: Restore for pip packages registered at web URLs. + * `--pip-local-url`: Restore for pip packages specified by local paths. + + +### 5. CLI Only Mode + +You can set whether to use ComfyUI-Manager solely via CLI. + +`cli-only-mode [enable|disable]` + +* This mode can be used if you want to restrict the use of ComfyUI-Manager through the GUI for security or policy reasons. + * When CLI only mode is enabled, ComfyUI-Manager is loaded in a very restricted state, the internal web API is disabled, and the Manager button is not displayed in the main menu. + +### 6. Dependency Restoration + +`restore-dependencies` + +* This command can be used if custom nodes are installed under the `ComfyUI/custom_nodes` path but their dependencies are not installed. +* It is useful when starting a new cloud instance, like colab, where dependencies need to be reinstalled and installation scripts re-executed. +* It can also be utilized if ComfyUI is reinstalled and only the custom_nodes path has been backed up and restored. + +### 7. Clear + +In the GUI, installations, updates, or snapshot restorations are scheduled to execute the next time ComfyUI is launched. The `clear` command clears this scheduled state, ensuring no pre-execution actions are applied. \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/docs/en/use_aria2.md b/custom_nodes/ComfyUI-Manager/docs/en/use_aria2.md new file mode 100644 index 000000000..10a7c6dd5 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/docs/en/use_aria2.md @@ -0,0 +1,40 @@ +# Use `aria2` as downloader + +Two environment variables are needed to use `aria2` as the downloader. + +```bash +export COMFYUI_MANAGER_ARIA2_SERVER=http://127.0.0.1:6800 +export COMFYUI_MANAGER_ARIA2_SECRET=__YOU_MUST_CHANGE_IT__ +``` + +An example `docker-compose.yml` + +```yaml +services: + + aria2: + container_name: aria2 + image: p3terx/aria2-pro + environment: + - PUID=1000 + - PGID=1000 + - UMASK_SET=022 + - RPC_SECRET=__YOU_MUST_CHANGE_IT__ + - RPC_PORT=5080 + - DISK_CACHE=64M + - IPV6_MODE=false + - UPDATE_TRACKERS=false + - CUSTOM_TRACKER_URL= + volumes: + - ./config:/config + - ./downloads:/downloads + - ~/ComfyUI/models:/models + - ~/ComfyUI/custom_nodes:/custom_nodes + ports: + - 6800:6800 + restart: unless-stopped + logging: + driver: json-file + options: + max-size: 1m +``` diff --git a/custom_nodes/ComfyUI-Manager/docs/ko/cm-cli.md b/custom_nodes/ComfyUI-Manager/docs/ko/cm-cli.md new file mode 100644 index 000000000..33860f6b2 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/docs/ko/cm-cli.md @@ -0,0 +1,149 @@ +# `cm-cli`: ComfyUI-Manager CLI + +`cm-cli` 는 ComfyUI를 실행시키지 않고 command line에서 ComfyUI-Manager의 여러가지 기능을 사용할 수 있도록 도와주는 도구입니다. + + +``` +-= ComfyUI-Manager CLI (V2.24) =- + + +python cm-cli.py [OPTIONS] + +OPTIONS: + [install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel ] ?[--mode [remote|local|cache]] + [update|disable|enable|fix] all ?[--channel ] ?[--mode [remote|local|cache]] + [simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel ] ?[--mode [remote|local|cache]] + save-snapshot ?[--output ] + restore-snapshot ?[--pip-non-url] ?[--pip-non-local-url] ?[--pip-local-url] + cli-only-mode [enable|disable] + restore-dependencies + clear +``` + +## How To Use? +* `python cm-cli.py` 를 통해서 실행 시킬 수 있습니다. +* 예를 들어 custom node를 모두 업데이트 하고 싶다면 + * ComfyUI-Manager경로 에서 `python cm-cli.py update all` 를 command를 실행할 수 있습니다. + * ComfyUI 경로에서 실행한다면, `python custom_nodes/ComfyUI-Manager/cm-cli.py update all` 와 같이 cm-cli.py 의 경로를 지정할 수도 있습니다. + +## Prerequisite +* ComfyUI 를 실행하는 python과 동일한 python 환경에서 실행해야 합니다. + * venv를 사용할 경우 해당 venv를 activate 한 상태에서 실행해야 합니다. + * portable 버전을 사용할 경우 run_nvidia_gpu.bat 파일이 있는 경로인 경우, 다음과 같은 방식으로 코맨드를 실행해야 합니다. + `.\python_embeded\python.exe ComfyUI\custom_nodes\ComfyUI-Manager\cm-cli.py update all` +* ComfyUI 의 경로는 COMFYUI_PATH 환경 변수로 설정할 수 있습니다. 만약 생략할 경우 다음과 같은 경고 메시지가 나타나며, ComfyUI-Manager가 설치된 경로를 기준으로 상대 경로로 설정됩니다. + ``` + WARN: The `COMFYUI_PATH` environment variable is not set. Assuming `custom_nodes/ComfyUI-Manager/../../` as the ComfyUI path. + ``` + +## Features + +### 1. --channel, --mode +* 정보 보기 기능과 커스텀 노드 관리 기능의 경우는 --channel과 --mode를 통해 정보 DB를 설정할 수 있습니다. +* 예들 들어 `python cm-cli.py update all --channel recent --mode remote`와 같은 command를 실행할 경우, 현재 ComfyUI-Manager repo에 내장된 로컬의 정보가 아닌 remote의 최신 정보를 기준으로 동작하며, recent channel에 있는 목록을 대상으로만 동작합니다. +* --channel, --mode 는 `simple-show, show, install, uninstall, update, disable, enable, fix` command에서만 사용 가능합니다. + +### 2. 관리 정보 보기 + +`[simple-show|show] [installed|enabled|not-installed|disabled|all|snapshot|snapshot-list] ?[--channel ] ?[--mode [remote|local|cache]]` + + +* `[show|simple-show]` - `show`는 상세하게 정보를 보여주며, `simple-show`는 간단하게 정보를 보여줍니다. + + +`python cm-cli.py show installed` 와 같은 코맨드를 실행하면 설치된 커스텀 노드의 정보를 상세하게 보여줍니다. +``` +-= ComfyUI-Manager CLI (V2.24) =- + +FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json +[ ENABLED ] ComfyUI-Manager (author: Dr.Lt.Data) +[ ENABLED ] ComfyUI-Impact-Pack (author: Dr.Lt.Data) +[ ENABLED ] ComfyUI-Inspire-Pack (author: Dr.Lt.Data) +[ ENABLED ] ComfyUI_experiments (author: comfyanonymous) +[ ENABLED ] ComfyUI-SAI_API (author: Stability-AI) +[ ENABLED ] stability-ComfyUI-nodes (author: Stability-AI) +[ ENABLED ] comfyui_controlnet_aux (author: Fannovel16) +[ ENABLED ] ComfyUI-Frame-Interpolation (author: Fannovel16) +[ DISABLED ] ComfyUI-Loopchain (author: Fannovel16) +``` + +`python cm-cli.py simple-show installed` 와 같은 코맨드를 이용해서 설치된 커스텀 노드의 정보를 간단하게 보여줍니다. + +``` +-= ComfyUI-Manager CLI (V2.24) =- + +FETCH DATA from: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json +ComfyUI-Manager +ComfyUI-Impact-Pack +ComfyUI-Inspire-Pack +ComfyUI_experiments +ComfyUI-SAI_API +stability-ComfyUI-nodes +comfyui_controlnet_aux +ComfyUI-Frame-Interpolation +ComfyUI-Loopchain +``` + +* `[installed|enabled|not-installed|disabled|all|snapshot|snapshot-list]` + * `enabled`, `disabled`: 설치된 커스텀 노드들 중 enable 되었거나, disable된 노드들을 보여줍니다. + * `installed`: enable, disable 여부와 상관없이 설치된 모든 노드를 보여줍니다 + * `not-installed`: 설치되지 않은 커스텀 노드의 목록을 보여줍니다. + * `all`: 모든 커스텀 노드의 목록을 보여줍니다. + * `snapshot`: 현재 설치된 커스텀 노드의 snapshot 정보를 보여줍니다. `show`롤 통해서 볼 경우는 json 출력 형태로 보여주며, `simple-show`를 통해서 볼 경우는 간단하게, 커밋 해시와 함께 보여줍니다. + * `snapshot-list`: ComfyUI-Manager/snapshots 에 저장된 snapshot 파일의 목록을 보여줍니다. + +### 3. 커스텀 노드 관리 하기 + +`[install|reinstall|uninstall|update|disable|enable|fix] node_name ... ?[--channel ] ?[--mode [remote|local|cache]]` + +* `python cm-cli.py install ComfyUI-Impact-Pack ComfyUI-Inspire-Pack ComfyUI_experiments` 와 같이 커스텀 노드의 이름을 나열해서 관리 기능을 적용할 수 있습니다. +* 커스텀 노드의 이름은 `show`를 했을 때 보여주는 이름이며, git repository의 이름입니다. +(추후 nickname 을 사용가능하돌고 업데이트 할 예정입니다.) + +`[update|disable|enable|fix] all ?[--channel ] ?[--mode [remote|local|cache]]` + +* `update, disable, enable, fix` 기능은 all 로 지정 가능합니다. + +* 세부 동작 + * `install`: 지정된 커스텀 노드들을 설치합니다 + * `reinstall`: 지정된 커스텀 노드를 삭제하고 재설치 합니다. + * `uninstall`: 지정된 커스텀 노드들을 삭제합니다. + * `update`: 지정된 커스텀 노드들을 업데이트합니다. + * `disable`: 지정된 커스텀 노드들을 비활성화합니다. + * `enable`: 지정된 커스텀 노드들을 활성화합니다. + * `fix`: 지정된 커스텀 노드의 의존성을 고치기 위한 시도를 합니다. + + +### 4. 스냅샷 관리 기능 +* `python cm-cli.py save-snapshot ?[--output ]`: 현재의 snapshot을 저장합니다. + * --output 으로 임의의 경로에 .yaml 파일과 format으로 저장할 수 있습니다. +* `python cm-cli.py restore-snapshot `: 지정된 snapshot으로 복구합니다. + * snapshot 경로에 파일이 존재하는 경우 해당 snapshot을 로드합니다. + * snapshot 경로에 파일이 존재하지 않는 경우 묵시적으로, ComfyUI-Manager/snapshots 에 있다고 가정합니다. + * `--pip-non-url`: PyPI 에 등록된 pip 패키지들에 대해서 복구를 수행 + * `--pip-non-local-url`: web URL에 등록된 pip 패키지들에 대해서 복구를 수행 + * `--pip-local-url`: local 경로를 지정하고 있는 pip 패키지들에 대해서 복구를 수행 + + +### 5. CLI only mode + +ComfyUI-Manager를 CLI로만 사용할 것인지를 설정할 수 있습니다. + +`cli-only-mode [enable|disable]` + +* security 혹은 policy 의 이유로 GUI 를 통한 ComfyUI-Manager 사용을 제한하고 싶은 경우 이 모드를 사용할 수 있습니다. + * CLI only mode를 적용할 경우 ComfyUI-Manager 가 매우 제한된 상태로 로드되어, 내부적으로 제공하는 web API가 비활성화 되며, 메인 메뉴에서도 Manager 버튼이 표시되지 않습니다. + + +### 6. 의존성 설치 + +`restore-dependencies` + +* `ComfyUI/custom_nodes` 하위 경로에 커스텀 노드들이 설치되어 있긴 하지만, 의존성이 설치되지 않은 경우 사용할 수 있습니다. +* colab 과 같이 cloud instance를 새로 시작하는 경우 의존성 재설치 및 설치 스크립트가 재실행 되어야 하는 경우 사용합니다. +* ComfyUI을 재설치할 경우, custom_nodes 경로만 백업했다가 재설치 할 경우 활용 가능합니다. + + +### 7. clear + +GUI에서 install, update를 하거나 snapshot 을 restore하는 경우 예약을 통해서 다음번 ComfyUI를 실행할 경우 실행되는 구조입니다. `clear` 는 이런 예약 상태를 clear해서, 아무런 사전 실행이 적용되지 않도록 합니다. \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/extension-node-map.json b/custom_nodes/ComfyUI-Manager/extension-node-map.json new file mode 100644 index 000000000..8843576b5 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/extension-node-map.json @@ -0,0 +1,15962 @@ +{ + "https://gist.github.com/alkemann/7361b8eb966f29c8238fd323409efb68/raw/f9605be0b38d38d3e3a2988f89248ff557010076/alkemann.py": [ + [ + "Int to Text", + "Save A1 Image", + "Seed With Text" + ], + { + "title_aux": "alkemann nodes" + } + ], + "https://git.mmaker.moe/mmaker/sd-webui-color-enhance": [ + [ + "MMakerColorBlend", + "MMakerColorEnhance" + ], + { + "title_aux": "Color Enhance" + } + ], + "https://github.com/0xbitches/ComfyUI-LCM": [ + [ + "LCM_Sampler", + "LCM_Sampler_Advanced", + "LCM_img2img_Sampler", + "LCM_img2img_Sampler_Advanced" + ], + { + "title_aux": "Latent Consistency Model for ComfyUI" + } + ], + "https://github.com/1038lab/ComfyUI-GPT2P": [ + [ + "GPT2PNode" + ], + { + "title_aux": "ComfyUI-GPT2P" + } + ], + "https://github.com/1038lab/ComfyUI_LatentSizeSelector": [ + [ + "LatentSizeSelector" + ], + { + "title_aux": "ComfyUI-latentSizeSelector" + } + ], + "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant": [ + [ + "EGIPAdapter_Mad_Assistant", + "EGIPAdapter_Mad_AssistantV1", + "EGIPAdapter_Mad_AssistantV2", + "EGIPAdapter_Mad_AssistantV3", + "EGIPAdapter_Mad_AssistantV4", + "EGIPAdapter_Mad_AssistantV5" + ], + { + "title_aux": "ComfUI-EGAdapterMadAssistant" + } + ], + "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": [ + [ + "EG-YSZT-ZT", + "EG_CPSYTJ", + "EG_FX_BDAPI", + "EG_HT_YSTZ", + "EG_JF_ZZSC", + "EG_JXFZ_node", + "EG_K_LATENT", + "EG_RY_HT", + "EG_SCQY_BHDQY", + "EG_SCQY_QBQY", + "EG_SCQY_SXQY", + "EG_SJ", + "EG_SJPJ_Node", + "EG_SS_RYZH", + "EG_SZ_JDYS", + "EG_TC_Node", + "EG_TSCDS_CJ", + "EG_TSCDS_DG", + "EG_TSCDS_FG", + "EG_TSCDS_JT", + "EG_TSCDS_QT", + "EG_TSCDS_RW", + "EG_TSCDS_WP", + "EG_TSCDS_ZL", + "EG_TSCMB_GL", + "EG_TXZZ_ZH", + "EG_TX_CCHQ", + "EG_TX_CJPJ", + "EG_TX_JZRY", + "EG_TX_LJ", + "EG_TX_LJBC", + "EG_TX_SFBLS", + "EG_TX_WHLJ", + "EG_WB_KSH", + "EG_WXZ_QH", + "EG_XZ_QH", + "EG_YSQY_BBLLD", + "EG_YSQY_BLLD", + "EG_ZY_WBK", + "EG_ZZHBCJ", + "EG_ZZKZ_HT_node", + "EG_ZZ_BSYH", + "EG_ZZ_BYYH", + "EG_ZZ_HSYH", + "EG_ZZ_SSKZ", + "ER_JBCH", + "ER_TX_ZZCJ" + ], + { + "title_aux": "Comfyui-ergouzi-Nodes" + } + ], + "https://github.com/11dogzi/Comfyui-ergouzi-samplers": [ + [ + "EGBYZZCYQ", + "EGCYQJB", + "EGCYQJBCJ" + ], + { + "title_aux": "Comfyui-ergouzi-samplers" + } + ], + "https://github.com/1mckw/Comfyui-Gelbooru": [ + [ + "Gelbooru (ID)", + "Gelbooru (Random)" + ], + { + "title_aux": "Comfyui-Gelbooru" + } + ], + "https://github.com/1shadow1/hayo_comfyui_nodes/raw/main/LZCNodes.py": [ + [ + "LoadPILImages", + "MergeImages", + "make_transparentmask", + "tensor_trans_pil", + "words_generatee" + ], + { + "title_aux": "Hayo comfyui nodes" + } + ], + "https://github.com/42lux/ComfyUI-safety-checker": [ + [ + "Safety Checker" + ], + { + "title_aux": "ComfyUI-safety-checker" + } + ], + "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": [ + [ + "GPT4VCaptioner", + "Image Load with Metadata", + "SAMIN String Attribute Selector", + "SANMIN Adapt Coordinates", + "SANMIN AdjustTransparency", + "SANMIN BlurMaskArea", + "SANMIN ChineseToCharacter", + "SANMIN ClothingWildcards", + "SANMIN ConvertToEnglish", + "SANMIN EditWildcards", + "SANMIN Float", + "SANMIN LoadPathImagesPreview", + "SANMIN SCALE AND FILL BLACK", + "SANMIN SanmiSaveImageToLocal", + "SANMIN SimpleWildcards", + "SANMIN Upscale And Original Size", + "Samin Counter", + "Samin Load Image Batch" + ], + { + "title_aux": "ComfyUI-GPT4V-Image-Captioner" + } + ], + "https://github.com/54rt1n/ComfyUI-DareMerge": [ + [ + "DM_AdvancedDareModelMerger", + "DM_AdvancedModelMerger", + "DM_AttentionGradient", + "DM_BlockGradient", + "DM_BlockModelMerger", + "DM_DareClipMerger", + "DM_DareModelMergerBlock", + "DM_DareModelMergerElement", + "DM_DareModelMergerMBW", + "DM_GradientEdit", + "DM_GradientOperations", + "DM_GradientReporting", + "DM_InjectNoise", + "DM_LoRALoaderTags", + "DM_LoRAReporting", + "DM_MBWGradient", + "DM_MagnitudeMasker", + "DM_MaskEdit", + "DM_MaskOperations", + "DM_MaskReporting", + "DM_ModelReporting", + "DM_NormalizeModel", + "DM_QuadMasker", + "DM_ShellGradient", + "DM_SimpleMasker" + ], + { + "title_aux": "ComfyUI-DareMerge" + } + ], + "https://github.com/80sVectorz/ComfyUI-Static-Primitives": [ + [ + "FloatStaticPrimitive", + "IntStaticPrimitive", + "StringMlStaticPrimitive", + "StringStaticPrimitive" + ], + { + "title_aux": "ComfyUI-Static-Primitives" + } + ], + "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": [ + [ + "AutoColorGimp" + ], + { + "title_aux": "ComfyUI-AutoColorGimp" + } + ], + "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE": [ + [ + "PixelOE" + ], + { + "title_aux": "ComfyUI-PixelOE" + } + ], + "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI": [ + [ + "AIraster" + ], + { + "title_aux": "Image-vector-for-ComfyUI" + } + ], + "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting": [ + [ + "LoadImagePath", + "PreViewVideo", + "TreeDNode" + ], + { + "title_aux": "ComfyUI-3d-photo-inpainting" + } + ], + "https://github.com/AIFSH/ComfyUI-AuraSR": [ + [ + "AuraSRNode" + ], + { + "title_aux": "AIFSH/ComfyUI-AuraSR" + } + ], + "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio": [ + [ + "ControlNetPathLoader", + "DiffTextNode", + "DiffutoonNode", + "ExVideoNode", + "LoadVideo", + "PreViewVideo", + "SDPathLoader" + ], + { + "title_aux": "ComfyUI-DiffSynth-Studio" + } + ], + "https://github.com/AIFSH/ComfyUI-FishSpeech": [ + [ + "FishSpeech_INFER", + "FishSpeech_INFER_SRT", + "LoadAudio", + "LoadSRT", + "PreViewAudio" + ], + { + "title_aux": "ComfyUI-FishSpeech" + } + ], + "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": [ + [ + "GPT_SOVITS_FT", + "GPT_SOVITS_INFER", + "GPT_SOVITS_TTS", + "LoadAudio", + "LoadSRT", + "PreViewAudio" + ], + { + "title_aux": "ComfyUI-GPT_SoVITS" + } + ], + "https://github.com/AIFSH/ComfyUI-Hallo": [ + [ + "HalloNode", + "LoadAudioPath", + "LoadImagePath", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-Hallo" + } + ], + "https://github.com/AIFSH/ComfyUI-I2V-Adapter": [ + [ + "I2V_AdapterNode", + "LoraPathLoader", + "MotionLoraLoader", + "PreViewVideo", + "PromptNode" + ], + { + "title_aux": "ComfyUI-I2V-Adapter" + } + ], + "https://github.com/AIFSH/ComfyUI-IP_LAP": [ + [ + "CombineAudioVideo", + "IP_LAP", + "LoadVideo", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-IP_LAP" + } + ], + "https://github.com/AIFSH/ComfyUI-Live2DViewer": [ + [ + "Live2DViewer", + "LoadAudio" + ], + { + "title_aux": "ComfyUI-Live2DViewer" + } + ], + "https://github.com/AIFSH/ComfyUI-MARS5-TTS": [ + [ + "LoadAudioPath", + "MARS5TTS_Node", + "PreViewAudio", + "TTSTextEncode" + ], + { + "title_aux": "ComfyUI-MARS5-TTS" + } + ], + "https://github.com/AIFSH/ComfyUI-MimicBrush": [ + [ + "MimicBrushNode" + ], + { + "title_aux": "ComfyUI-MimicBrush" + } + ], + "https://github.com/AIFSH/ComfyUI-MimicMotion": [ + [ + "LoadVideo", + "MimicMotionNode", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-MimicMotion" + } + ], + "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": [ + [ + "CombineAudioVideo", + "LoadVideo", + "MuseTalk", + "MuseTalkRealTime", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-MuseTalk_FSH" + } + ], + "https://github.com/AIFSH/ComfyUI-RVC": [ + [ + "CombineAudio", + "LoadAudio", + "PreViewAudio", + "RVC_Infer", + "RVC_Train" + ], + { + "title_aux": "ComfyUI-RVC" + } + ], + "https://github.com/AIFSH/ComfyUI-UVR5": [ + [ + "LoadAudioPath", + "PreViewAudio", + "UVR5_Node" + ], + { + "title_aux": "ComfyUI-UVR5" + } + ], + "https://github.com/AIFSH/ComfyUI-UniAnimate": [ + [ + "LoadImagePath", + "LoadVideo", + "PoseAlignNode", + "PreViewVideo", + "UniAnimateNode" + ], + { + "title_aux": "ComfyUI-UniAnimate" + } + ], + "https://github.com/AIFSH/ComfyUI-WhisperX": [ + [ + "LoadAudio", + "PreViewSRT", + "WhisperX" + ], + { + "title_aux": "ComfyUI-WhisperX" + } + ], + "https://github.com/AIFSH/ComfyUI-XTTS": [ + [ + "LoadAudioPath", + "LoadSRT", + "PreViewAudio", + "XTTS_INFER", + "XTTS_INFER_SRT" + ], + { + "title_aux": "ComfyUI-XTTS" + } + ], + "https://github.com/AIFSH/ComfyUI_V-Express": [ + [ + "LoadAudioPath", + "LoadImagePath", + "LoadVideo", + "PreViewVideo", + "VExpress" + ], + { + "title_aux": "ComfyUI_V-Express" + } + ], + "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": [ + [ + "LoadMarianMTCheckPoint", + "PromptBaiduFanyiToText", + "PromptTranslateToText" + ], + { + "title_aux": "ComfyUI_kkTranslator_nodes" + } + ], + "https://github.com/AIGODLIKE/ComfyUI-CUP": [ + [ + "Mask", + "OpenPose", + "OpenPoseCanny", + "OpenPoseDepth", + "OpenPoseFace", + "OpenPoseFull", + "OpenPoseFullExtraLimb", + "OpenPoseHand", + "OpenPoseKeyPose", + "OpenPoseLineart", + "OpenPoseMediaPipeFace", + "PreviewAudio", + "SaveAudioBL", + "\u5b58\u50a8", + "\u5bfc\u5165", + "\u622a\u56fe", + "\u6750\u8d28\u56fe", + "\u8f93\u5165\u56fe\u50cf", + "\u9884\u89c8" + ], + { + "title_aux": "ComfyUI-CUP" + } + ], + "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": [ + [ + "ToonCrafterNode" + ], + { + "title_aux": "ComfyUI-ToonCrafter" + } + ], + "https://github.com/AInseven/ComfyUI-fastblend": [ + [ + "FillDarkMask", + "InterpolateKeyFrame", + "MaskListcaptoBatch", + "Merge_Image_List", + "MyOpenPoseNode", + "SmoothVideo", + "alert_when_finished", + "reBatchImage" + ], + { + "title_aux": "ComfyUI-fastblend" + } + ], + "https://github.com/AIrjen/OneButtonPrompt": [ + [ + "AutoNegativePrompt", + "CreatePromptVariant", + "OneButtonArtify", + "OneButtonFlufferize", + "OneButtonPreset", + "OneButtonPrompt", + "OneButtonSuperPrompt", + "SavePromptToFile" + ], + { + "title_aux": "One Button Prompt" + } + ], + "https://github.com/ALatentPlace/ComfyUI_yanc": [ + [ + "> Clear Text", + "> Float to Int", + "> Get Mean Color", + "> Int", + "> Int to Text", + "> Layer Weights (for IPAMS)", + "> Light Source Mask", + "> Load Image", + "> Load Image From Folder", + "> Mask Curves", + "> NIKSampler", + "> Noise From Image", + "> Normal Map Lighting", + "> RGB Color", + "> Resolution by Aspect Ratio", + "> Rotate Image", + "> Save Image", + "> Scale Image to Side", + "> Text", + "> Text Combine", + "> Text Pick Random Line", + "> Text Random Weights", + "> Text Replace" + ], + { + "title_aux": "ComfyUI_yanc" + } + ], + "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": [ + [ + "APS_LatentBatch", + "APS_Seed", + "ContentMaskLatent", + "ControlNetScript", + "ControlnetUnit", + "GaussianLatentImage", + "GetConfig", + "LoadImageBase64", + "LoadImageWithMetaData", + "LoadLorasFromPrompt", + "MaskExpansion" + ], + { + "title_aux": "Comfy-Photoshop-SD" + } + ], + "https://github.com/AbyssYuan0/ComfyUI_BadgerTools": [ + [ + "ApplyMaskToImage-badger", + "CropImageByMask-badger", + "ExpandImageWithColor-badger", + "FindThickLinesFromCanny-badger", + "FloatToInt-badger", + "FloatToString-badger", + "FrameToVideo-badger", + "GETRequset-badger", + "GarbageCollect-badger", + "GetColorFromBorder-badger", + "GetDirName-badger", + "GetUUID-badger", + "IdentifyBorderColorToMask-badger", + "IdentifyColorToMask-badger", + "ImageNormalization-badger", + "ImageOverlap-badger", + "ImageScaleToSide-badger", + "IntToString-badger", + "IntToStringAdvanced-badger", + "LoadImageAdvanced-badger", + "LoadImagesFromDirListAdvanced-badger", + "SegmentToMaskByPoint-badger", + "SimpleBoolean-badger", + "StringToFizz-badger", + "TextListToString-badger", + "ToPixel-badger", + "TrimTransparentEdges-badger", + "VideoCutFromDir-badger", + "VideoToFrame-badger", + "deleteDir-badger", + "findCenterOfMask-badger", + "getImageSide-badger", + "getParentDir-badger", + "mkdir-badger" + ], + { + "title_aux": "ComfyUI_BadgerTools" + } + ], + "https://github.com/Acly/comfyui-inpaint-nodes": [ + [ + "INPAINT_ApplyFooocusInpaint", + "INPAINT_DenoiseToCompositingMask", + "INPAINT_ExpandMask", + "INPAINT_InpaintWithModel", + "INPAINT_LoadFooocusInpaint", + "INPAINT_LoadInpaintModel", + "INPAINT_MaskedBlur", + "INPAINT_MaskedFill", + "INPAINT_VAEEncodeInpaintConditioning" + ], + { + "title_aux": "ComfyUI Inpaint Nodes" + } + ], + "https://github.com/Acly/comfyui-tooling-nodes": [ + [ + "ETN_ApplyMaskToImage", + "ETN_AttentionMask", + "ETN_BackgroundRegion", + "ETN_CropImage", + "ETN_DefineRegion", + "ETN_ExtractImageTile", + "ETN_ExtractMaskTile", + "ETN_GenerateTileMask", + "ETN_ListRegionMasks", + "ETN_LoadImageBase64", + "ETN_LoadMaskBase64", + "ETN_MergeImageTile", + "ETN_SendImageWebSocket", + "ETN_TileLayout" + ], + { + "title_aux": "ComfyUI Nodes for External Tooling" + } + ], + "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": [ + [ + "Add Tag", + "Clear Tag", + "Load Images Pair Batch", + "Merge Tag", + "Move Tag To Top", + "Reserve Tag", + "Save Images Pair" + ], + { + "title_aux": "ComfyUI-Aimidi-nodes" + } + ], + "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": [ + [ + "ArgosTranslateCLIPTextEncodeNode", + "ArgosTranslateTextNode", + "ColorsCorrectNode", + "DeepTranslatorCLIPTextEncodeNode", + "DeepTranslatorTextNode", + "GoogleTranslateCLIPTextEncodeNode", + "GoogleTranslateTextNode", + "HexToHueNode", + "PainterNode", + "PoseNode", + "PreviewTextNode" + ], + { + "title_aux": "AlekPet/ComfyUI_Custom_Nodes_AlekPet" + } + ], + "https://github.com/Amorano/Jovimetrix": [ + [ + "ADJUST (JOV) \ud83d\udd78\ufe0f", + "AKASHIC (JOV) \ud83d\udcd3", + "ARRAY (JOV) \ud83d\udcda", + "BLEND (JOV) \u2697\ufe0f", + "COLOR BLIND (JOV) \ud83d\udc41\u200d\ud83d\udde8", + "COLOR MATCH (JOV) \ud83d\udc9e", + "COLOR THEORY (JOV) \ud83d\udede", + "COMPARISON (JOV) \ud83d\udd75\ud83c\udffd", + "CONSTANT (JOV) \ud83d\udfea", + "CROP (JOV) \u2702\ufe0f", + "DELAY (JOV) \u270b\ud83c\udffd", + "EXPORT (JOV) \ud83d\udcfd", + "FILTER MASK (JOV) \ud83e\udd3f", + "FLATTEN (JOV) \u2b07\ufe0f", + "GLSL (JOV) \ud83c\udf69", + "GRADIENT MAP (JOV) \ud83c\uddf2\ud83c\uddfa", + "GRAPH (JOV) \ud83d\udcc8", + "LERP (JOV) \ud83d\udd30", + "MIDI FILTER (JOV) \u2733\ufe0f", + "MIDI FILTER EZ (JOV) \u2747\ufe0f", + "MIDI MESSAGE (JOV) \ud83c\udf9b\ufe0f", + "MIDI READER (JOV) \ud83c\udfb9", + "OP BINARY (JOV) \ud83c\udf1f", + "OP UNARY (JOV) \ud83c\udfb2", + "PIXEL MERGE (JOV) \ud83e\udec2", + "PIXEL SPLIT (JOV) \ud83d\udc94", + "PIXEL SWAP (JOV) \ud83d\udd03", + "QUEUE (JOV) \ud83d\uddc3", + "ROUTE (JOV) \ud83d\ude8c", + "SAVE OUTPUT (JOV) \ud83d\udcbe", + "SHAPE GEN (JOV) \u2728", + "SPOUT WRITER (JOV) \ud83c\udfa5", + "STACK (JOV) \u2795", + "STEREOGRAM (JOV) \ud83d\udcfb", + "STEREOSCOPIC (JOV) \ud83d\udd76\ufe0f", + "STREAM READER (JOV) \ud83d\udcfa", + "STREAM WRITER (JOV) \ud83c\udf9e\ufe0f", + "SWIZZLE (JOV) \ud83d\ude35", + "TEXT GEN (JOV) \ud83d\udcdd", + "THRESHOLD (JOV) \ud83d\udcc9", + "TICK (JOV) \u23f1", + "TRANSFORM (JOV) \ud83c\udfdd\ufe0f", + "VALUE (JOV) \ud83e\uddec", + "WAVE GEN (JOV) \ud83c\udf0a", + "WAVE GRAPH (JOV) \u25b6 \u0131l\u0131\u0131l\u0131" + ], + { + "author": "amorano", + "description": "Jovimetrix integrates Webcam, MIDI, Spout and GLSL shader support.", + "nodename_pattern": " \\(JOV\\)$", + "title": "Jovimetrix", + "title_aux": "Jovimetrix Composition Nodes" + } + ], + "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": [ + [ + "LoraTuner" + ], + { + "title_aux": "ComfyUI-LoRA-Tuner" + } + ], + "https://github.com/AonekoSS/ComfyUI-SimpleCounter": [ + [ + "Simple Counter" + ], + { + "title_aux": "ComfyUI-SimpleCounter" + } + ], + "https://github.com/ArcherFMY/Diffusion360_ComfyUI": [ + [ + "Diffusion360LoaderImage2Pano", + "Diffusion360LoaderText2Pano", + "Diffusion360Sampler", + "Diffusion360SamplerImage2Pano", + "Diffusion360SamplerText2Pano", + "InputImage", + "InputText", + "VAEDecodeTiledBlended" + ], + { + "title_aux": "Diffusion360_ComfyUI" + } + ], + "https://github.com/ArdeniusAI/CPlus_Ardenius": [ + [ + "Control_Box" + ], + { + "author": "initials AMA", + "description": "CPlus control box is designed to gather workflow variables into 1 node for easier control of your workflow.", + "nickname": "Ardenius", + "title": "Ardenius", + "title_aux": "CPlus_Ardenius ComfyUI Control Box" + } + ], + "https://github.com/ArtBot2023/CharacterFaceSwap": [ + [ + "Color Blend", + "Crop Face", + "Exclude Facial Feature", + "Generation Parameter Input", + "Generation Parameter Output", + "Image Full BBox", + "Load BiseNet", + "Load RetinaFace", + "Mask Contour", + "Segment Face", + "Uncrop Face" + ], + { + "title_aux": "Character Face Swap" + } + ], + "https://github.com/ArtVentureX/comfyui-animatediff": [ + [ + "AnimateDiffCombine", + "AnimateDiffLoraLoader", + "AnimateDiffModuleLoader", + "AnimateDiffSampler", + "AnimateDiffSlidingWindowOptions", + "ImageSizeAndBatchSize", + "LoadVideo" + ], + { + "title_aux": "AnimateDiff" + } + ], + "https://github.com/AshMartian/ComfyUI-DirGir": [ + [ + "Dir_Gir_Looper", + "Dir_Gir_Picker", + "Gir_Image_Nabber" + ], + { + "title_aux": "Dir Gir" + } + ], + "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": [ + [ + "AnimateAnyone" + ], + { + "title_aux": "ComfyUI-AnimateAnyone-reproduction" + } + ], + "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": [ + [ + "DynamicSampler", + "MeasuredSampler", + "ResolveMaskPromise" + ], + { + "title_aux": "DynamicOversampling" + } + ], + "https://github.com/AustinMroz/ComfyUI-SpliceTools": [ + [ + "LogSigmas", + "RerangeSigmas", + "SpliceDenoised", + "SpliceLatents", + "TemporalSplice" + ], + { + "title_aux": "SpliceTools" + } + ], + "https://github.com/Auttasak-L/ComfyUI-ImageCropper": [ + [ + "ImageCropper" + ], + { + "title_aux": "ComfyUI-ImageCropper" + } + ], + "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": [ + [ + "RSSFeedNode" + ], + { + "title_aux": "ComfyUI_RSS_Feed_Reader" + } + ], + "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": [ + [ + "ListOfImages", + "MultiControlNetConverter", + "NHWC2NCHWTensor", + "NHWCTensor2PIL", + "PIL2NHWCTensor" + ], + { + "title_aux": "ComfyUI-InstantIDUtils" + } + ], + "https://github.com/BadCafeCode/masquerade-nodes-comfyui": [ + [ + "Blur", + "Change Channel Count", + "Combine Masks", + "Constant Mask", + "Convert Color Space", + "Create QR Code", + "Create Rect Mask", + "Cut By Mask", + "Get Image Size", + "Image To Mask", + "Make Image Batch", + "Mask By Text", + "Mask Morphology", + "Mask To Region", + "MasqueradeIncrementer", + "Mix Color By Mask", + "Mix Images By Mask", + "Paste By Mask", + "Prune By Mask", + "Separate Mask Components", + "Unary Image Op", + "Unary Mask Op" + ], + { + "title_aux": "Masquerade Nodes" + } + ], + "https://github.com/Beinsezii/bsz-cui-extras": [ + [ + "BSZAbsoluteHires", + "BSZAspectHires", + "BSZColoredLatentImageXL", + "BSZCombinedHires", + "BSZHueChromaXL", + "BSZInjectionKSampler", + "BSZLatentDebug", + "BSZLatentFill", + "BSZLatentGradient", + "BSZLatentHSVAImage", + "BSZLatentOffsetXL", + "BSZLatentRGBAImage", + "BSZLatentbuster", + "BSZPixelbuster", + "BSZPixelbusterHelp", + "BSZPrincipledConditioning", + "BSZPrincipledSampler", + "BSZPrincipledScale", + "BSZStrangeResample" + ], + { + "title_aux": "bsz-cui-extras" + } + ], + "https://github.com/BenNarum/SigmaWaveFormNode": [ + [ + "AttenuatorNode", + "FourierFilterNode", + "PhaseLockedLoopNode", + "SigmaWaveFormNode", + "SigmaWaveFormNodeAdvanced", + "SigmaWaveFormNodeSimple" + ], + { + "title_aux": "SigmaWaveFormNodes" + } + ], + "https://github.com/BennyKok/comfyui-deploy": [ + [ + "ComfyDeployWebscoketImageInput", + "ComfyDeployWebscoketImageOutput", + "ComfyUIDeployExternalBoolean", + "ComfyUIDeployExternalCheckpoint", + "ComfyUIDeployExternalImage", + "ComfyUIDeployExternalImageAlpha", + "ComfyUIDeployExternalImageBatch", + "ComfyUIDeployExternalLora", + "ComfyUIDeployExternalNumber", + "ComfyUIDeployExternalNumberInt", + "ComfyUIDeployExternalNumberSlider", + "ComfyUIDeployExternalText", + "ComfyUIDeployExternalVid", + "ComfyUIDeployExternalVideo" + ], + { + "author": "BennyKok", + "description": "", + "nickname": "Comfy Deploy", + "title": "comfyui-deploy", + "title_aux": "ComfyUI Deploy" + } + ], + "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": [ + [ + "BTPromptSchedule", + "BTPromptSelector", + "EndQueue", + "ImageTextOverlay", + "Loop", + "LoopEnd", + "LoopStart" + ], + { + "title_aux": "ComfyUI-Book-Tools Nodes for ComfyUI" + } + ], + "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": [ + [ + "AdvOptions_Node", + "CodingOptionsNode", + "LLM_Node", + "Output_Node", + "QuantizationConfig_Node" + ], + { + "title_aux": "LLM Node for ComfyUI" + } + ], + "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py": [ + [ + "BatchJoinAudio", + "CutAudio", + "DuplicateAudio", + "JoinAudio", + "ResampleAudio", + "ReverseAudio", + "StretchAudio" + ], + { + "title_aux": "Waveform Extensions" + } + ], + "https://github.com/Billius-AI/ComfyUI-Path-Helper": [ + [ + "Add File Name Prefix", + "Add File Name Prefix Advanced", + "Add Folder", + "Add Folder Advanced", + "Create Project Root", + "Join Variables", + "Show Path", + "Show String" + ], + { + "title_aux": "ComfyUI-Path-Helper" + } + ], + "https://github.com/BlakeOne/ComfyUI-CustomScheduler": [ + [ + "CustomScheduler" + ], + { + "title_aux": "ComfyUI CustomScheduler" + } + ], + "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": [ + [ + "SchedulerMixer" + ], + { + "title_aux": "ComfyUI SchedulerMixer" + } + ], + "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [ + [ + "BNK_AddCLIPSDXLParams", + "BNK_AddCLIPSDXLRParams", + "BNK_CLIPTextEncodeAdvanced", + "BNK_CLIPTextEncodeSDXLAdvanced" + ], + { + "title_aux": "Advanced CLIP Text Encode" + } + ], + "https://github.com/BlenderNeko/ComfyUI_Cutoff": [ + [ + "BNK_CutoffBasePrompt", + "BNK_CutoffRegionsToConditioning", + "BNK_CutoffRegionsToConditioning_ADV", + "BNK_CutoffSetRegions" + ], + { + "title_aux": "ComfyUI Cutoff" + } + ], + "https://github.com/BlenderNeko/ComfyUI_Noise": [ + [ + "BNK_DuplicateBatchIndex", + "BNK_GetSigma", + "BNK_InjectNoise", + "BNK_NoisyLatentImage", + "BNK_SlerpLatent", + "BNK_Unsampler" + ], + { + "title_aux": "ComfyUI Noise" + } + ], + "https://github.com/BlenderNeko/ComfyUI_SeeCoder": [ + [ + "ConcatConditioning", + "SEECoderImageEncode" + ], + { + "title_aux": "SeeCoder [WIP]" + } + ], + "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": [ + [ + "BNK_TiledKSampler", + "BNK_TiledKSamplerAdvanced" + ], + { + "title_aux": "Tiled sampling for ComfyUI" + } + ], + "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": [ + [ + "APIRequestNode", + "PostImageToAPI", + "TextPromptCombinerNode" + ], + { + "title_aux": "ComfyUI_API_Manager" + } + ], + "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": [ + [ + "CLIPIter", + "Dict2Model", + "GridImage", + "ImageBlend2", + "KSamplerOverrided", + "KSamplerSetting", + "KSamplerXYZ", + "LatentToHist", + "LatentToImage", + "ModelIter", + "RandomLatentImage", + "SaveStateDict", + "SaveText", + "StateDictLoader", + "StateDictMerger", + "StateDictMergerBlockWeighted", + "StateDictMergerBlockWeightedMulti", + "VAEDecodeBatched", + "VAEEncodeBatched", + "VAEIter" + ], + { + "title_aux": "ComfyUI-nodes-hnmr" + } + ], + "https://github.com/CaptainGrock/ComfyUIInvisibleWatermark/raw/main/Invisible%20Watermark.py": [ + [ + "Apply Invisible Watermark", + "Extract Watermark" + ], + { + "title_aux": "ComfyUIInvisibleWatermark" + } + ], + "https://github.com/Chan-0312/ComfyUI-EasyDeforum": [ + [ + "Easy2DDeforum" + ], + { + "title_aux": "ComfyUI-EasyDeforum" + } + ], + "https://github.com/Chan-0312/ComfyUI-IPAnimate": [ + [ + "IPAdapterAnimate" + ], + { + "title_aux": "ComfyUI-IPAnimate" + } + ], + "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": [ + [ + "SDXLPromptStylerAdvancedPreview", + "SDXLPromptStylerPreview" + ], + { + "title_aux": "ComfyUI-Prompt-Preview" + } + ], + "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": [ + [ + "ImageToPIL", + "LoadImageFromPath", + "PILToImage", + "PILToMask" + ], + { + "title_aux": "ComfyUI_Ib_CustomNodes" + } + ], + "https://github.com/Clybius/ComfyUI-Extra-Samplers": [ + [ + "GeometricCFGGuider", + "ImageAssistedCFGGuider", + "MegaCFGGuider", + "SamplerCLYB_4M_SDE_Momentumized", + "SamplerCustomModelMixtureDuo", + "SamplerCustomNoise", + "SamplerCustomNoiseDuo", + "SamplerDPMPP_3M_SDE_DynETA", + "SamplerDPMPP_DualSDE_Momentumized", + "SamplerEulerAncestralDancing_Experimental", + "SamplerLCMCustom", + "SamplerRES_Momentumized", + "SamplerSupreme", + "SamplerTTM", + "ScaledCFGGuider", + "SimpleExponentialScheduler", + "WarmupDecayCFGGuider" + ], + { + "title_aux": "ComfyUI Extra Samplers" + } + ], + "https://github.com/Clybius/ComfyUI-Latent-Modifiers": [ + [ + "Latent Diffusion Mega Modifier" + ], + { + "title_aux": "ComfyUI-Latent-Modifiers" + } + ], + "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": [ + [ + "PrimereAestheticCKPTScorer", + "PrimereAnyDetailer", + "PrimereAnyOutput", + "PrimereCKPT", + "PrimereCKPTLoader", + "PrimereCLIPEncoder", + "PrimereClearPrompt", + "PrimereConceptDataTuple", + "PrimereDynamicParser", + "PrimereEmbedding", + "PrimereEmbeddingHandler", + "PrimereEmbeddingKeywordMerger", + "PrimereEmotionsStyles", + "PrimereHypernetwork", + "PrimereImageSegments", + "PrimereKSampler", + "PrimereLCMSelector", + "PrimereLORA", + "PrimereLYCORIS", + "PrimereLatentNoise", + "PrimereLoraKeywordMerger", + "PrimereLoraStackMerger", + "PrimereLycorisKeywordMerger", + "PrimereLycorisStackMerger", + "PrimereMetaCollector", + "PrimereMetaDistributor", + "PrimereMetaDistributorStage2", + "PrimereMetaHandler", + "PrimereMetaRead", + "PrimereMetaSave", + "PrimereMidjourneyStyles", + "PrimereModelConceptSelector", + "PrimereModelKeyword", + "PrimereNetworkTagLoader", + "PrimerePreviewImage", + "PrimerePrompt", + "PrimerePromptOrganizer", + "PrimerePromptSwitch", + "PrimereRefinerPrompt", + "PrimereResolution", + "PrimereResolutionCoordinatorMPX", + "PrimereResolutionMultiplier", + "PrimereResolutionMultiplierMPX", + "PrimereSamplers", + "PrimereSamplersSteps", + "PrimereSeed", + "PrimereStepsCfg", + "PrimereStyleLoader", + "PrimereStylePile", + "PrimereTextOutput", + "PrimereUpscaleModel", + "PrimereVAE", + "PrimereVAELoader", + "PrimereVAESelector", + "PrimereVisualCKPT", + "PrimereVisualEmbedding", + "PrimereVisualHypernetwork", + "PrimereVisualLORA", + "PrimereVisualLYCORIS", + "PrimereVisualStyle" + ], + { + "title_aux": "Primere nodes for ComfyUI" + } + ], + "https://github.com/Danand/ComfyUI-ComfyCouple": [ + [ + "Attention couple", + "Comfy Couple" + ], + { + "author": "Rei D.", + "description": "If you want to draw two different characters together without blending their features, so you could try to check out this custom node.", + "nickname": "Danand", + "title": "Comfy Couple", + "title_aux": "Comfy Couple" + } + ], + "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py": [ + [ + "Depth2Mask" + ], + { + "title_aux": "ComfyUI-Depth2Mask" + } + ], + "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": [ + [ + "CheckpointAutomaticConfig", + "ConfigPipe" + ], + { + "title_aux": "ComfyUI Checkpoint Automatic Config" + } + ], + "https://github.com/DataCTE/prompt_injection": [ + [ + "AdvancedPromptInjection", + "PromptInjection", + "SVDPromptInjection", + "SimplePromptInjection" + ], + { + "title_aux": "Prompt Injection Node for ComfyUI" + } + ], + "https://github.com/DeJoker/pipeline-parallel-comfy": [ + [ + "PipelineParallel" + ], + { + "title_aux": "Pipeline Parallel ComfyUI" + } + ], + "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": [ + [], + { + "author": "Derfuu", + "description": "Pack of simple (or not) and modded nodes for scaling images/latents, editing numbers or text. Automate calculations depending on image sizes or any other thing you want. Or randomize any number in your workflow. Debug node included.", + "nickname": "Derfuu simple/modded Nodes", + "nodename_pattern": "^DF_", + "title": "Derfuu simple/modded Nodes", + "title_aux": "Derfuu_ComfyUI_ModdedNodes" + } + ], + "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes": [ + [ + "ApplySerialPrompter", + "ImageSizer", + "SerialPrompter" + ], + { + "author": "CRE8IT GmbH", + "description": "This extension offers various nodes.", + "nickname": "cre8Nodes", + "title": "cr8SerialPrompter", + "title_aux": "ComfyUI-Cre8it-Nodes" + } + ], + "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": [ + [ + "LABColorDetection", + "RGBColorDetection" + ], + { + "title_aux": "ComfyUI Color Detection Nodes" + } + ], + "https://github.com/Electrofried/ComfyUI-OpenAINode": [ + [ + "OpenAINode" + ], + { + "title_aux": "OpenAINode" + } + ], + "https://github.com/EllangoK/ComfyUI-post-processing-nodes": [ + [ + "ArithmeticBlend", + "AsciiArt", + "Blend", + "Blur", + "CannyEdgeMask", + "ChromaticAberration", + "ColorCorrect", + "ColorTint", + "Dissolve", + "Dither", + "DodgeAndBurn", + "FilmGrain", + "Glow", + "HSVThresholdMask", + "KMeansQuantize", + "KuwaharaBlur", + "Parabolize", + "PencilSketch", + "PixelSort", + "Pixelize", + "Quantize", + "Sharpen", + "SineWave", + "Solarize", + "Vignette" + ], + { + "title_aux": "ComfyUI-post-processing-nodes" + } + ], + "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": [ + [ + "ModelScopeT2VLoader" + ], + { + "title_aux": "ComfyUI_ModelScopeT2V" + } + ], + "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": [ + [ + "DynamiCrafterLoader", + "DynamiCrafterProcessor" + ], + { + "title_aux": "ComfyUI - Native DynamiCrafter" + } + ], + "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": [ + [ + "ApplyVisualStyle" + ], + { + "title_aux": "ComfyUI_VisualStylePrompting" + } + ], + "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": [ + [ + "Automatic CFG", + "Automatic CFG - Advanced", + "Automatic CFG - Attention modifiers", + "Automatic CFG - Attention modifiers tester", + "Automatic CFG - Custom attentions", + "Automatic CFG - Excellent attention", + "Automatic CFG - Negative", + "Automatic CFG - Post rescale only", + "Automatic CFG - Preset Loader", + "Automatic CFG - Unpatch function", + "Automatic CFG - Warp Drive", + "SAG delayed activation", + "Temperature separate settings CLIP SDXL", + "Temperature settings CLIP", + "Temperature settings SD 1.5", + "Temperature settings SDXL", + "Zero Uncond CFG - standalone patch (incompatible with the others)" + ], + { + "title_aux": "ComfyUI-AutomaticCFG" + } + ], + "https://github.com/Extraltodeus/LoadLoraWithTags": [ + [ + "LoraLoaderTagsQuery" + ], + { + "title_aux": "LoadLoraWithTags" + } + ], + "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": [ + [ + "CLIP Temperature", + "Unet Temperature" + ], + { + "title_aux": "Stable-Diffusion-temperature-settings" + } + ], + "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI": [ + [ + "Conditioning combine positive and negative", + "Conditioning crop or fill", + "Uncond Zero", + "interrupt on NaN" + ], + { + "title_aux": "Uncond-Zero-for-ComfyUI" + } + ], + "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": [ + [ + "CLIP Vector Sculptor text encode", + "Conditioning (Average keep magnitude)", + "Conditioning (Slerp)", + "Conditioning SDXL merge clip_g / clip_l", + "Conditioning normalize magnitude to empty" + ], + { + "title_aux": "Vector_Sculptor_ComfyUI" + } + ], + "https://github.com/Extraltodeus/noise_latent_perlinpinpin": [ + [ + "NoisyLatentPerlin" + ], + { + "title_aux": "noise latent perlinpinpin" + } + ], + "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI": [ + [ + "Pre CFG automatic scale", + "Pre CFG consensus sharpening", + "Pre CFG exponentiation", + "Pre CFG perp-neg", + "Pre CFG sharpening" + ], + { + "title_aux": "pre_cfg_comfy_nodes_for_ComfyUI" + } + ], + "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": [ + [ + "Aligned Scheduler", + "Gaussian Tail Scheduler", + "Get sigmas as float", + "Graph sigmas", + "Manual scheduler", + "Merge many sigmas by average", + "Merge sigmas by average", + "Merge sigmas gradually", + "Multiply sigmas", + "Output min/max sigmas", + "Split and concatenate sigmas", + "The Golden Scheduler" + ], + { + "title_aux": "sigmas_tools_and_the_golden_scheduler" + } + ], + "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": [ + [ + "AMT VFI", + "CAIN VFI", + "FILM VFI", + "FLAVR VFI", + "GMFSS Fortuna VFI", + "IFRNet VFI", + "IFUnet VFI", + "KSampler Gradually Adding More Denoise (efficient)", + "M2M VFI", + "Make Interpolation State List", + "RIFE VFI", + "STMFNet VFI", + "Sepconv VFI", + "VFI FloatToInt" + ], + { + "title_aux": "ComfyUI Frame Interpolation" + } + ], + "https://github.com/Fannovel16/ComfyUI-Loopchain": [ + [ + "EmptyLatentImageLoop", + "FolderToImageStorage", + "ImageStorageExportLoop", + "ImageStorageImport", + "ImageStorageReset", + "LatentStorageExportLoop", + "LatentStorageImport", + "LatentStorageReset" + ], + { + "title_aux": "ComfyUI Loopchain" + } + ], + "https://github.com/Fannovel16/ComfyUI-MagickWand": [ + [ + "ImageMagick Adaptive Blur", + "ImageMagick Adaptive Resize", + "ImageMagick Adaptive Sharpen", + "ImageMagick Adaptive Threshold", + "ImageMagick Auto Gamma", + "ImageMagick Auto Level", + "ImageMagick Auto Orient", + "ImageMagick Auto Threshold", + "ImageMagick Blue Shift", + "ImageMagick Blur", + "ImageMagick Brightness Contrast", + "ImageMagick Canny", + "ImageMagick Charcoal", + "ImageMagick Chop", + "ImageMagick Clahe", + "ImageMagick Clamp", + "ImageMagick Coalesce", + "ImageMagick Color Decision List", + "ImageMagick Color Matrix", + "ImageMagick Combine", + "ImageMagick Concat", + "ImageMagick Contrast", + "ImageMagick Contrast Stretch", + "ImageMagick Crop", + "ImageMagick Cycle Color Map", + "ImageMagick Decipher", + "ImageMagick Despeckle", + "ImageMagick Distort", + "ImageMagick Edge", + "ImageMagick Emboss", + "ImageMagick Encipher", + "ImageMagick Enhance", + "ImageMagick Equalize", + "ImageMagick Evaluate", + "ImageMagick Extent", + "ImageMagick Flip", + "ImageMagick Flop", + "ImageMagick Forward Fourier Transform", + "ImageMagick Function", + "ImageMagick Gamma", + "ImageMagick Gaussian Blur", + "ImageMagick Hough Lines", + "ImageMagick Implode", + "ImageMagick Kmeans", + "ImageMagick Kuwahara", + "ImageMagick Level", + "ImageMagick Levelize", + "ImageMagick Linear Stretch", + "ImageMagick Liquid Rescale", + "ImageMagick Local Contrast", + "ImageMagick Magnify", + "ImageMagick Mean Shift", + "ImageMagick Merge Layers", + "ImageMagick Mode", + "ImageMagick Modulate", + "ImageMagick Morphology", + "ImageMagick Motion Blur", + "ImageMagick Negate", + "ImageMagick Noise", + "ImageMagick Normalize", + "ImageMagick Oil Paint", + "ImageMagick Ordered Dither", + "ImageMagick Polynomial", + "ImageMagick Posterize", + "ImageMagick Quantize", + "ImageMagick Random Threshold", + "ImageMagick Range Threshold", + "ImageMagick Resample", + "ImageMagick Resize", + "ImageMagick Roll", + "ImageMagick Rotational Blur", + "ImageMagick Sample", + "ImageMagick Scale", + "ImageMagick Selective Blur", + "ImageMagick Sepia Tone", + "ImageMagick Shade", + "ImageMagick Shadow", + "ImageMagick Sharpen", + "ImageMagick Shave", + "ImageMagick Sigmoidal Contrast", + "ImageMagick Sketch", + "ImageMagick Smush", + "ImageMagick Solarize", + "ImageMagick Splice", + "ImageMagick Spread", + "ImageMagick Statistic", + "ImageMagick Swirl", + "ImageMagick Threshold", + "ImageMagick Thumbnail", + "ImageMagick Transform", + "ImageMagick Transform Colorspace", + "ImageMagick Transparentize", + "ImageMagick Transpose", + "ImageMagick Transverse", + "ImageMagick Unsharp Mask", + "ImageMagick Vignette", + "ImageMagick Wave", + "ImageMagick Wavelet Denoise", + "ImageMagick White Balance" + ], + { + "title_aux": "ComfyUI-MagickWand" + } + ], + "https://github.com/Fannovel16/ComfyUI-MotionDiff": [ + [ + "EmptyMotionData", + "ExportSMPLTo3DSoftware", + "Export_SMPLMultipleSubjects_To_3DSoftware", + "Human4D_Img2SMPL", + "Humans4DLoader", + "MotionCLIPTextEncode", + "MotionDataVisualizer", + "MotionDiffLoader", + "MotionDiffSimpleSampler", + "RenderMultipleSubjectsSMPLMesh", + "RenderSMPLMesh", + "Render_OpenPose_From_SMPL_Mesh_Multiple_Subjects", + "SMPLLoader", + "SMPLShapeParameters", + "SaveSMPL", + "SmplifyMotionData", + "SpectreFaceReconLoader", + "SpectreImg2SMPL", + "mgpt_model_loader", + "mgpt_t2m" + ], + { + "title_aux": "ComfyUI MotionDiff" + } + ], + "https://github.com/Fannovel16/ComfyUI-Video-Matting": [ + [ + "BRIAAI Matting", + "Robust Video Matting" + ], + { + "title_aux": "ComfyUI-Video-Matting" + } + ], + "https://github.com/Fannovel16/comfyui_controlnet_aux": [ + [ + "AIO_Preprocessor", + "AnimalPosePreprocessor", + "AnimeFace_SemSegPreprocessor", + "AnimeLineArtPreprocessor", + "AnyLineArtPreprocessor_aux", + "BAE-NormalMapPreprocessor", + "BinaryPreprocessor", + "CannyEdgePreprocessor", + "ColorPreprocessor", + "ControlNetPreprocessorSelector", + "DSINE-NormalMapPreprocessor", + "DWPreprocessor", + "DensePosePreprocessor", + "DepthAnythingPreprocessor", + "DepthAnythingV2Preprocessor", + "DiffusionEdge_Preprocessor", + "FacialPartColoringFromPoseKps", + "FakeScribblePreprocessor", + "HEDPreprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "ImageIntensityDetector", + "ImageLuminanceDetector", + "InpaintPreprocessor", + "LeReS-DepthMapPreprocessor", + "LineArtPreprocessor", + "LineartStandardPreprocessor", + "M-LSDPreprocessor", + "Manga2Anime_LineArt_Preprocessor", + "MaskOptFlow", + "MediaPipe-FaceMeshPreprocessor", + "MeshGraphormer+ImpactDetector-DepthMapPreprocessor", + "MeshGraphormer-DepthMapPreprocessor", + "Metric3D-DepthMapPreprocessor", + "Metric3D-NormalMapPreprocessor", + "Metric_DepthAnythingV2Preprocessor", + "MiDaS-DepthMapPreprocessor", + "MiDaS-NormalMapPreprocessor", + "OneFormer-ADE20K-SemSegPreprocessor", + "OneFormer-COCO-SemSegPreprocessor", + "OpenposePreprocessor", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "RenderAnimalKps", + "RenderPeopleKps", + "SAMPreprocessor", + "SavePoseKpsAsJsonFile", + "ScribblePreprocessor", + "Scribble_PiDiNet_Preprocessor", + "Scribble_XDoG_Preprocessor", + "SemSegPreprocessor", + "ShufflePreprocessor", + "TEEDPreprocessor", + "TTPlanet_TileGF_Preprocessor", + "TTPlanet_TileSimple_Preprocessor", + "TilePreprocessor", + "UniFormer-SemSegPreprocessor", + "Unimatch_OptFlowPreprocessor", + "UpperBodyTrackingFromPoseKps", + "Zoe-DepthMapPreprocessor", + "Zoe_DepthAnythingPreprocessor" + ], + { + "author": "tstandley", + "preemptions": [ + "AIO_Preprocessor", + "AnimalPosePreprocessor", + "AnimeFace_SemSegPreprocessor", + "AnimeLineArtPreprocessor", + "BAE-NormalMapPreprocessor", + "BinaryPreprocessor", + "CannyEdgePreprocessor", + "ColorPreprocessor", + "DSINE-NormalMapPreprocessor", + "DWPreprocessor", + "DensePosePreprocessor", + "DepthAnythingPreprocessor", + "DiffusionEdge_Preprocessor", + "FacialPartColoringFromPoseKps", + "FakeScribblePreprocessor", + "HEDPreprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "ImageIntensityDetector", + "ImageLuminanceDetector", + "InpaintPreprocessor", + "LeReS-DepthMapPreprocessor", + "LineArtPreprocessor", + "LineartStandardPreprocessor", + "M-LSDPreprocessor", + "Manga2Anime_LineArt_Preprocessor", + "MaskOptFlow", + "MediaPipe-FaceMeshPreprocessor", + "MeshGraphormer-DepthMapPreprocessor", + "MiDaS-DepthMapPreprocessor", + "MiDaS-NormalMapPreprocessor", + "OneFormer-ADE20K-SemSegPreprocessor", + "OneFormer-COCO-SemSegPreprocessor", + "OpenposePreprocessor", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "SAMPreprocessor", + "SavePoseKpsAsJsonFile", + "ScribblePreprocessor", + "Scribble_XDoG_Preprocessor", + "SemSegPreprocessor", + "ShufflePreprocessor", + "TEEDPreprocessor", + "TilePreprocessor", + "UniFormer-SemSegPreprocessor", + "Unimatch_OptFlowPreprocessor", + "Zoe-DepthMapPreprocessor", + "Zoe_DepthAnythingPreprocessor" + ], + "title_aux": "ComfyUI's ControlNet Auxiliary Preprocessors" + } + ], + "https://github.com/Fantaxico/ComfyUI-GCP-Storage": [ + [ + "GCPStorageNode" + ], + { + "title_aux": "ComfyUI-GCP-Storage" + } + ], + "https://github.com/Feidorian/feidorian-ComfyNodes": [ + [], + { + "nodename_pattern": "^Feidorian_", + "title_aux": "feidorian-ComfyNodes" + } + ], + "https://github.com/Fictiverse/ComfyUI_Fictiverse": [ + [ + "Add Noise to Image with Mask", + "Color correction", + "Displace Image with Depth", + "Displace Images with Mask", + "Zoom Image with Depth" + ], + { + "title_aux": "ComfyUI Fictiverse Nodes" + } + ], + "https://github.com/Fihade/IC-Light-ComfyUI-Node": [ + [ + "LoadICLightUnetDiffusers", + "diffusers_model_loader", + "iclight_diffusers_sampler" + ], + { + "title_aux": "IC-Light-ComfyUI-Node" + } + ], + "https://github.com/FizzleDorf/ComfyUI-AIT": [ + [ + "AIT_Unet_Loader", + "AIT_VAE_Encode_Loader" + ], + { + "title_aux": "ComfyUI-AIT" + } + ], + "https://github.com/FizzleDorf/ComfyUI_FizzNodes": [ + [ + "AbsCosWave", + "AbsSinWave", + "BatchGLIGENSchedule", + "BatchPromptSchedule", + "BatchPromptScheduleEncodeSDXL", + "BatchPromptScheduleLatentInput", + "BatchPromptScheduleNodeFlowEnd", + "BatchPromptScheduleSDXLLatentInput", + "BatchStringSchedule", + "BatchValueSchedule", + "BatchValueScheduleLatentInput", + "CalculateFrameOffset", + "ConcatStringSingle", + "CosWave", + "FizzFrame", + "FizzFrameConcatenate", + "ImagesFromBatchSchedule", + "Init FizzFrame", + "InvCosWave", + "InvSinWave", + "Lerp", + "PromptSchedule", + "PromptScheduleEncodeSDXL", + "PromptScheduleNodeFlow", + "PromptScheduleNodeFlowEnd", + "SawtoothWave", + "SinWave", + "SquareWave", + "StringConcatenate", + "StringSchedule", + "TriangleWave", + "ValueSchedule", + "convertKeyframeKeysToBatchKeys" + ], + { + "title_aux": "FizzNodes" + } + ], + "https://github.com/FlyingFireCo/tiled_ksampler": [ + [ + "Asymmetric Tiled KSampler", + "Circular VAEDecode", + "Tiled KSampler" + ], + { + "title_aux": "tiled_ksampler" + } + ], + "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": [ + [ + "Canvas Properties", + "Combine Video", + "Font Properties", + "Generate Audio", + "Preset Color Animations", + "Save/Preview Text", + "Scheduled Values", + "Speech Recognition", + "Split Video", + "Text to Image Generator" + ], + { + "title_aux": "ComfyUI-Mana-Nodes" + } + ], + "https://github.com/Franck-Demongin/NX_PromptStyler": [ + [ + "NX_PromptStyler" + ], + { + "title_aux": "NX_PromptStyler" + } + ], + "https://github.com/FuouM/ComfyUI-FirstOrderMM": [ + [ + "FOMM_Partswap", + "FOMM_Runner", + "FOMM_Seg10Chooser", + "FOMM_Seg15Chooser", + "FOMM_Seg5Chooser" + ], + { + "author": "Fuou Marinas", + "description": "Run First Order Motion Model for Image Animation in ComfyUI.", + "nickname": "FOMM", + "title": "ComfyUI-FirstOrderMM", + "title_aux": "ComfyUI-FirstOrderMM" + } + ], + "https://github.com/G-370/ComfyUI-SD3-Powerlab": [ + [ + "G370SD3PowerLab_AttentionToImage", + "G370SD3PowerLab_ImageIntoAttention", + "G370SD3PowerLab_ImageIntoLayer", + "G370SD3PowerLab_LayerToImage", + "G370SD3PowerLab_RenderAttention" + ], + { + "title_aux": "ComfyUI-SD3-Powerlab" + } + ], + "https://github.com/GMapeSplat/ComfyUI_ezXY": [ + [ + "ConcatenateString", + "ItemFromDropdown", + "IterationDriver", + "JoinImages", + "LineToConsole", + "NumberFromList", + "NumbersToList", + "PlotImages", + "StringFromList", + "StringToLabel", + "StringsToList", + "ezMath", + "ezXY_AssemblePlot", + "ezXY_Driver" + ], + { + "title_aux": "ezXY scripts and nodes" + } + ], + "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [ + [ + "Danbooru (ID)", + "Danbooru (Random)", + "Random File From Path", + "Replace Strings", + "Simple Wildcards", + "Simple Wildcards (Dir.)", + "Wildcards Nodes" + ], + { + "title_aux": "ComfyUI-GTSuya-Nodes" + } + ], + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": [ + [ + "SD3LatentSelectRes" + ], + { + "title_aux": "ComfyUI-SD3LatentSelectRes" + } + ], + "https://github.com/GentlemanHu/ComfyUI-SunoAI": [ + [ + "GentlemanHu_SunoAI", + "GentlemanHu_SunoAI_NotSafe" + ], + { + "title_aux": "ComfyUI Suno API" + } + ], + "https://github.com/Goktug/comfyui-saveimage-plus": [ + [ + "SaveImagePlus" + ], + { + "title_aux": "Save Image Plus for ComfyUI" + } + ], + "https://github.com/Gourieff/comfyui-reactor-node": [ + [ + "ImageRGBA2RGB", + "ReActorBuildFaceModel", + "ReActorFaceBoost", + "ReActorFaceSwap", + "ReActorFaceSwapOpt", + "ReActorImageDublicator", + "ReActorLoadFaceModel", + "ReActorMakeFaceModelBatch", + "ReActorMaskHelper", + "ReActorOptions", + "ReActorRestoreFace", + "ReActorSaveFaceModel" + ], + { + "title_aux": "ReActor Node for ComfyUI" + } + ], + "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": [ + [ + "GR Background Remover REMBG", + "GR Checkered Board", + "GR Counter", + "GR Flip Tile Random Inverted", + "GR Flip Tile Random Red Ring", + "GR Image Details Displayer", + "GR Image Details Saver", + "GR Image Paste", + "GR Image Paste With Mask", + "GR Image Resize", + "GR Image Resize Methods", + "GR Image Size", + "GR Image/Depth Mask", + "GR Mask Create", + "GR Mask Create Random", + "GR Mask Resize", + "GR Multi Mask Create", + "GR Onomatopoeia", + "GR Prompt HUB", + "GR Prompt Selector", + "GR Prompt Selector Multi", + "GR Scroller", + "GR Stack Image", + "GR Text Overlay", + "GR Tile and Border Image", + "GR Tile and Border Image Random Flip" + ], + { + "title_aux": "GraftingRayman" + } + ], + "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS": [ + [ + "DownloadAndLoadLivePortraitModels", + "LivePortraitProcess" + ], + { + "title_aux": "ComfyUI-LivePortraitKJ-MPS" + } + ], + "https://github.com/GreenLandisaLie/AuraSR-ComfyUI": [ + [ + "AuraSR.AuraSRUpscaler" + ], + { + "title_aux": "AuraSR-ComfyUI" + } + ], + "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": [ + [ + "StableCascadeLatentRatio" + ], + { + "title_aux": "ComfyUI_StableCascadeLatentRatio" + } + ], + "https://github.com/HAL41/ComfyUI-aichemy-nodes": [ + [ + "aichemyYOLOv8Segmentation" + ], + { + "title_aux": "ComfyUI aichemy nodes" + } + ], + "https://github.com/HECer/ComfyUI-FilePathCreator": [ + [ + "FilePathCreator" + ], + { + "title_aux": "ComfyUI-FilePathCreator" + } + ], + "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream": [ + [ + "Moondream Interrogator" + ], + { + "author": "AlexL", + "description": "An implementation of the moondream visual LLM", + "nickname": "Hangover-Moondream", + "title": "ComfyUI-Hangover-Moondream", + "title_aux": "ComfyUI-Hangover-Moondream" + } + ], + "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": [ + [ + "Image Scale Bounding Box", + "MS kosmos-2 Interrogator", + "Make Inpaint Model", + "Save Image w/o Metadata" + ], + { + "author": "AlexL", + "description": "Scales an input image into a given box size, whereby the aspect ratio keeps retained.", + "nickname": "Hangover-Image_Scale_Bouning_Box", + "title": "ComfyUI-Hangover-Image_Scale_Bouning_Box", + "title_aux": "ComfyUI-Hangover-Nodes" + } + ], + "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything": [ + [ + "Recognize Anything Model (RAM)" + ], + { + "author": "AlexL", + "description": "An implementation of the Recognize Anything Model (RAM++) for ComfyUI. The counterpart of Segment Anything Model (SAM).", + "nickname": "Hangover-Recognize_Anything", + "title": "ComfyUI-Hangover-Recognize_Anything", + "title_aux": "Recognize Anything Model (RAM) for ComfyUI" + } + ], + "https://github.com/Haoming02/comfyui-diffusion-cg": [ + [ + "Normalization", + "NormalizationXL", + "Recenter", + "Recenter XL" + ], + { + "title_aux": "ComfyUI Diffusion Color Grading" + } + ], + "https://github.com/Haoming02/comfyui-floodgate": [ + [ + "FloodGate" + ], + { + "title_aux": "ComfyUI Floodgate" + } + ], + "https://github.com/HaydenReeve/ComfyUI-Better-Strings": [ + [ + "BetterString" + ], + { + "title_aux": "ComfyUI Better Strings" + } + ], + "https://github.com/HebelHuber/comfyui-enhanced-save-node": [ + [ + "EnhancedSaveNode" + ], + { + "title_aux": "comfyui-enhanced-save-node" + } + ], + "https://github.com/Hiero207/ComfyUI-Hiero-Nodes": [ + [ + "Load Prompt Travel file", + "Post to Discord w/ Webhook", + "Save Prompt Travel file" + ], + { + "author": "Hiero", + "description": "Just some nodes that I wanted/needed, so I made them.", + "nickname": "HNodes", + "title": "Hiero-Nodes", + "title_aux": "Hiero-Nodes" + } + ], + "https://github.com/IDGallagher/ComfyUI-IG-Nodes": [ + [ + "IG Analyze SSIM", + "IG Cross Fade Images", + "IG Explorer", + "IG Float", + "IG Float List", + "IG Folder", + "IG Int", + "IG Interpolate", + "IG Load Image", + "IG Load Images", + "IG Multiply", + "IG Path Join", + "IG String", + "IG String List", + "IG ZFill" + ], + { + "author": "IDGallagher", + "description": "Custom nodes to aid in the exploration of Latent Space", + "nickname": "IG Interpolation Nodes", + "title": "IG Interpolation Nodes", + "title_aux": "IG Interpolation Nodes" + } + ], + "https://github.com/ITurchenko/ComfyUI-SizeFromArray": [ + [ + "SizeFromArray" + ], + { + "title_aux": "ComfyUI-SizeFromArray" + } + ], + "https://github.com/ImmortalPie/ComfyUI-PonySwitch/raw/main/PonySwitch.py": [ + [ + "PonySwitch" + ], + { + "title_aux": "PonySwitch Node" + } + ], + "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": [ + [ + "MX_AlphaBlend", + "MX_Blend", + "MX_Blur", + "MX_Canny", + "MX_ChromaticAberration", + "MX_ColorCorrect", + "MX_ColorMatch", + "MX_ColorTint", + "MX_Glow", + "MX_HSVThresholdMask", + "MX_KuwaharaBlur(Cartoon)", + "MX_LUT", + "MX_LensBokeh", + "MX_LensOpticAxis", + "MX_LensZoomBurst", + "MX_Mosaic", + "MX_Noise", + "MX_Posterize", + "MX_SineWave", + "MX_Solarize", + "MX_Vignette" + ], + { + "title_aux": "ComfyUI-MX-post-processing-nodes" + } + ], + "https://github.com/Inzaniak/comfyui-ranbooru": [ + [ + "LockSeed", + "PromptBackground", + "PromptLimit", + "PromptMix", + "PromptRandomWeight", + "PromptRemove", + "Ranbooru", + "RanbooruURL", + "RandomPicturePath", + "TimestampFileName" + ], + { + "title_aux": "Ranbooru for ComfyUI" + } + ], + "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": [ + [ + "Dan_FrameDelay", + "Dan_Stereopsis" + ], + { + "title_aux": "ComfyUI-Stereopsis" + } + ], + "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": [ + [ + "CLIPTextEncode SDXL Plus (JPS)", + "Conditioning Switch (JPS)", + "ControlNet Switch (JPS)", + "Crop Image Pipe (JPS)", + "Crop Image Settings (JPS)", + "Crop Image Square (JPS)", + "Crop Image TargetSize (JPS)", + "CtrlNet CannyEdge Pipe (JPS)", + "CtrlNet CannyEdge Settings (JPS)", + "CtrlNet MiDaS Pipe (JPS)", + "CtrlNet MiDaS Settings (JPS)", + "CtrlNet OpenPose Pipe (JPS)", + "CtrlNet OpenPose Settings (JPS)", + "CtrlNet ZoeDepth Pipe (JPS)", + "CtrlNet ZoeDepth Settings (JPS)", + "Disable Enable Switch (JPS)", + "Enable Disable Switch (JPS)", + "Generation TXT IMG Settings (JPS)", + "Get Date Time String (JPS)", + "Get Image Size (JPS)", + "IP Adapter Settings (JPS)", + "IP Adapter Settings Pipe (JPS)", + "IP Adapter Tiled Settings (JPS)", + "IP Adapter Tiled Settings Pipe (JPS)", + "IPA Switch (JPS)", + "Image Prepare Pipe (JPS)", + "Image Prepare Settings (JPS)", + "Image Switch (JPS)", + "ImageToImage Pipe (JPS)", + "ImageToImage Settings (JPS)", + "Images Masks MultiPipe (JPS)", + "InstantID Mask Prepare Pipe (JPS)", + "InstantID Mask Prepare Settings (JPS)", + "InstantID Pipe (JPS)", + "InstantID Pose Prepare Pipe (JPS)", + "InstantID Pose Prepare Settings (JPS)", + "InstantID Settings (JPS)", + "InstantID Source Prepare Pipe (JPS)", + "InstantID Source Prepare Settings (JPS)", + "Integer Switch (JPS)", + "Largest Int (JPS)", + "Latent Switch (JPS)", + "Lora Loader (JPS)", + "Mask Switch (JPS)", + "Model Switch (JPS)", + "Multiply Float Float (JPS)", + "Multiply Int Float (JPS)", + "Multiply Int Int (JPS)", + "Prepare Image (JPS)", + "Prepare Image Plus (JPS)", + "Prepare Image Tiled IPA (JPS)", + "Resolution Multiply (JPS)", + "Revision Settings (JPS)", + "Revision Settings Pipe (JPS)", + "SDXL Basic Settings (JPS)", + "SDXL Basic Settings Pipe (JPS)", + "SDXL Fundamentals MultiPipe (JPS)", + "SDXL Prompt Handling (JPS)", + "SDXL Prompt Handling Plus (JPS)", + "SDXL Prompt Styler (JPS)", + "SDXL Recommended Resolution Calc (JPS)", + "SDXL Resolutions (JPS)", + "SDXL Settings (JPS)", + "SDXL Settings Pipe (JPS)", + "Sampler Scheduler Settings (JPS)", + "Save Images Plus (JPS)", + "Substract Int Int (JPS)", + "Text Concatenate (JPS)", + "Text Prompt (JPS)", + "Text Prompt Combo (JPS)", + "Time Seed (JPS)", + "VAE Switch (JPS)" + ], + { + "author": "JPS", + "description": "Various nodes to handle SDXL Resolutions, SDXL Basic Settings, IP Adapter Settings, Revision Settings, SDXL Prompt Styler, Crop Image to Square, Crop Image to Target Size, Get Date-Time String, Resolution Multiply, Largest Integer, 5-to-1 Switches for Integer, Images, Latents, Conditioning, Model, VAE, ControlNet", + "nickname": "JPS Custom Nodes", + "title": "JPS Custom Nodes for ComfyUI", + "title_aux": "JPS Custom Nodes for ComfyUI" + } + ], + "https://github.com/Jannchie/ComfyUI-J": [ + [ + "DiffusersCompelPromptEmbedding", + "DiffusersControlnetLoader", + "DiffusersControlnetUnit", + "DiffusersControlnetUnitStack", + "DiffusersDecoder", + "DiffusersGenerator", + "DiffusersPipeline", + "DiffusersPrepareLatents", + "DiffusersTextureInversionLoader", + "DiffusersXLPipeline", + "GetAverageColorFromImage", + "GetFilledColorImage" + ], + { + "title_aux": "ComfyUI-J" + } + ], + "https://github.com/JaredTherriault/ComfyUI-JNodes": [ + [ + "JNodes_AddOrSetMetaDataKey", + "JNodes_AnyToString", + "JNodes_AppendReversedFrames", + "JNodes_BooleanSelectorWithString", + "JNodes_BreakMediaInfo", + "JNodes_CheckpointSelectorWithString", + "JNodes_CreateStereoscopicImageFromDepth", + "JNodes_GetOutputDirectory", + "JNodes_GetParameterFromList", + "JNodes_GetParameterGlobal", + "JNodes_GetTempDirectory", + "JNodes_ImageFormatSelector", + "JNodes_ImageSizeSelector", + "JNodes_LoadVideo", + "JNodes_LoadVisualMediaFromPath", + "JNodes_LoraExtractor", + "JNodes_MediaInfoToString", + "JNodes_OutVideoInfo", + "JNodes_ParseDynamicPrompts", + "JNodes_ParseParametersToGlobalList", + "JNodes_ParseWildcards", + "JNodes_PromptBuilderSingleSubject", + "JNodes_RemoveCommentedText", + "JNodes_RemoveMetaDataKey", + "JNodes_RemoveParseableDataForInference", + "JNodes_SamplerSelectorWithString", + "JNodes_SaveImageWithOutput", + "JNodes_SaveVideo", + "JNodes_SchedulerSelectorWithString", + "JNodes_SearchAndReplace", + "JNodes_SearchAndReplaceFromFile", + "JNodes_SearchAndReplaceFromList", + "JNodes_SelectRandomFileFromDirectory", + "JNodes_SetNegativePromptInMetaData", + "JNodes_SetPositivePromptInMetaData", + "JNodes_SplitAndJoin", + "JNodes_StringLiteral", + "JNodes_SyncedStringLiteral", + "JNodes_TokenCounter", + "JNodes_TrimAndStrip", + "JNodes_UploadVideo", + "JNodes_UploadVisualMedia", + "JNodes_VaeSelectorWithString" + ], + { + "title_aux": "ComfyUI-JNodes" + } + ], + "https://github.com/JayLyu/ComfyUI_BaiKong_Node": [ + [ + "BK_ColorLimit", + "BK_ColorSelector", + "BK_GradientImage", + "BK_Img2Color" + ], + { + "title_aux": "ComfyUI_BaiKong_Node" + } + ], + "https://github.com/JcandZero/ComfyUI_GLM4Node": [ + [ + "GLM3_turbo_CHAT", + "GLM4_CHAT", + "GLM4_Vsion_IMGURL" + ], + { + "title_aux": "ComfyUI_GLM4Node" + } + ], + "https://github.com/Jcd1230/rembg-comfyui-node": [ + [ + "Image Remove Background (rembg)" + ], + { + "title_aux": "Rembg Background Removal Node for ComfyUI" + } + ], + "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": [ + [ + "JOJR_RandomSize" + ], + { + "author": "JerryOrbachJr", + "description": "A ComfyUI custom node that randomly selects a height and width pair from a list in a config file", + "nickname": "Random Size", + "title": "Random Size", + "title_aux": "Random Size" + } + ], + "https://github.com/JettHu/ComfyUI-TCD": [ + [ + "TCDModelSamplingDiscrete" + ], + { + "title_aux": "ComfyUI-TCD" + } + ], + "https://github.com/JettHu/ComfyUI_TGate": [ + [ + "TGateApply", + "TGateApplyAdvanced", + "TGateApplySimple" + ], + { + "title_aux": "ComfyUI_TGate" + } + ], + "https://github.com/Jordach/comfy-plasma": [ + [ + "JDC_AutoContrast", + "JDC_BlendImages", + "JDC_BrownNoise", + "JDC_Contrast", + "JDC_EqualizeGrey", + "JDC_GaussianBlur", + "JDC_GreyNoise", + "JDC_Greyscale", + "JDC_ImageLoader", + "JDC_ImageLoaderMeta", + "JDC_PinkNoise", + "JDC_Plasma", + "JDC_PlasmaSampler", + "JDC_PowerImage", + "JDC_RandNoise", + "JDC_ResizeFactor" + ], + { + "title_aux": "comfy-plasma" + } + ], + "https://github.com/Kangkang625/ComfyUI-paint-by-example": [ + [ + "PaintbyExamplePipeLoader", + "PaintbyExampleSampler" + ], + { + "title_aux": "ComfyUI-Paint-by-Example" + } + ], + "https://github.com/KewkLW/ComfyUI-kewky_tools": [ + [ + "CLIPInterrogator", + "FormattedPromptNode", + "ImageBatcher", + "LoadImagePlus", + "LoadVideoPlus", + "TensorDebugPlus", + "TextAppendNode", + "TextSearchNode", + "VRAM_Debug_Plus" + ], + { + "title_aux": "ComfyUI-kewky_tools" + } + ], + "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": [ + [ + "Load Nai Styles Complex CSV", + "ShowText|pysssss", + "Universal_Styler_Node", + "concat" + ], + { + "title_aux": "ComfyUI Universal Styler" + } + ], + "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [ + [ + "ACN_AdvancedControlNetApply", + "ACN_ControlNetLoaderWithLoraAdvanced", + "ACN_DefaultUniversalWeights", + "ACN_ReferenceControlNet", + "ACN_ReferenceControlNetFinetune", + "ACN_ReferencePreprocessor", + "ACN_SparseCtrlIndexMethodNode", + "ACN_SparseCtrlLoaderAdvanced", + "ACN_SparseCtrlMergedLoaderAdvanced", + "ACN_SparseCtrlRGBPreprocessor", + "ACN_SparseCtrlSpreadMethodNode", + "ACN_SparseCtrlWeightExtras", + "ACN_TimestepKeyframeFromStrengthList", + "ACN_TimestepKeyframeInterpolation", + "ControlNetLoaderAdvanced", + "CustomControlNetWeights", + "CustomT2IAdapterWeights", + "DiffControlNetLoaderAdvanced", + "LatentKeyframe", + "LatentKeyframeBatchedGroup", + "LatentKeyframeGroup", + "LatentKeyframeTiming", + "LoadImagesFromDirectory", + "ScaledSoftControlNetWeights", + "ScaledSoftMaskedUniversalWeights", + "SoftControlNetWeights", + "SoftT2IAdapterWeights", + "TimestepKeyframe" + ], + { + "title_aux": "ComfyUI-Advanced-ControlNet" + } + ], + "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [ + [ + "ADE_AdjustPEFullStretch", + "ADE_AdjustPEManual", + "ADE_AdjustPESweetspotStretch", + "ADE_AdjustWeightAllAdd", + "ADE_AdjustWeightAllMult", + "ADE_AdjustWeightIndivAdd", + "ADE_AdjustWeightIndivAttnAdd", + "ADE_AdjustWeightIndivAttnMult", + "ADE_AdjustWeightIndivMult", + "ADE_AnimateDiffCombine", + "ADE_AnimateDiffKeyframe", + "ADE_AnimateDiffLoRALoader", + "ADE_AnimateDiffLoaderGen1", + "ADE_AnimateDiffLoaderV1Advanced", + "ADE_AnimateDiffLoaderWithContext", + "ADE_AnimateDiffModelSettings", + "ADE_AnimateDiffModelSettingsAdvancedAttnStrengths", + "ADE_AnimateDiffModelSettingsSimple", + "ADE_AnimateDiffModelSettings_Release", + "ADE_AnimateDiffSamplingSettings", + "ADE_AnimateDiffSettings", + "ADE_AnimateDiffUniformContextOptions", + "ADE_AnimateDiffUnload", + "ADE_ApplyAnimateDiffModel", + "ADE_ApplyAnimateDiffModelSimple", + "ADE_ApplyAnimateDiffModelWithCameraCtrl", + "ADE_ApplyAnimateDiffModelWithPIA", + "ADE_ApplyAnimateLCMI2VModel", + "ADE_AttachLoraHookToCLIP", + "ADE_AttachLoraHookToConditioning", + "ADE_BatchedContextOptions", + "ADE_CameraCtrlAnimateDiffKeyframe", + "ADE_CameraManualPoseAppend", + "ADE_CameraPoseAdvanced", + "ADE_CameraPoseBasic", + "ADE_CameraPoseCombo", + "ADE_CombineLoraHooks", + "ADE_CombineLoraHooksEight", + "ADE_CombineLoraHooksFour", + "ADE_ConditioningSetMask", + "ADE_ConditioningSetMaskAndCombine", + "ADE_ConditioningSetUnmaskedAndCombine", + "ADE_CustomCFG", + "ADE_CustomCFGKeyframe", + "ADE_EmptyLatentImageLarge", + "ADE_InjectI2VIntoAnimateDiffModel", + "ADE_InjectPIAIntoAnimateDiffModel", + "ADE_InputPIA_Multival", + "ADE_InputPIA_PaperPresets", + "ADE_IterationOptsDefault", + "ADE_IterationOptsFreeInit", + "ADE_LoadAnimateDiffModel", + "ADE_LoadAnimateDiffModelWithCameraCtrl", + "ADE_LoadAnimateLCMI2VModel", + "ADE_LoadCameraPoses", + "ADE_LoopedUniformContextOptions", + "ADE_LoopedUniformViewOptions", + "ADE_LoraHookKeyframe", + "ADE_LoraHookKeyframeFromStrengthList", + "ADE_LoraHookKeyframeInterpolation", + "ADE_MultivalConvertToMask", + "ADE_MultivalDynamic", + "ADE_MultivalDynamicFloatInput", + "ADE_MultivalScaledMask", + "ADE_NoiseLayerAdd", + "ADE_NoiseLayerAddWeighted", + "ADE_NoiseLayerReplace", + "ADE_NoisedImageInjectOptions", + "ADE_NoisedImageInjection", + "ADE_PIA_AnimateDiffKeyframe", + "ADE_PairedConditioningSetMask", + "ADE_PairedConditioningSetMaskAndCombine", + "ADE_PairedConditioningSetUnmaskedAndCombine", + "ADE_RawSigmaSchedule", + "ADE_RegisterLoraHook", + "ADE_RegisterLoraHookModelOnly", + "ADE_RegisterModelAsLoraHook", + "ADE_RegisterModelAsLoraHookModelOnly", + "ADE_ReplaceCameraParameters", + "ADE_ReplaceOriginalPoseAspectRatio", + "ADE_SetLoraHookKeyframe", + "ADE_SigmaSchedule", + "ADE_SigmaScheduleSplitAndCombine", + "ADE_SigmaScheduleWeightedAverage", + "ADE_SigmaScheduleWeightedAverageInterp", + "ADE_StandardStaticContextOptions", + "ADE_StandardStaticViewOptions", + "ADE_StandardUniformContextOptions", + "ADE_StandardUniformViewOptions", + "ADE_TimestepsConditioning", + "ADE_UpscaleAndVAEEncode", + "ADE_UseEvolvedSampling", + "ADE_ViewsOnlyContextOptions", + "AnimateDiffLoaderV1", + "CheckpointLoaderSimpleWithNoiseSelect" + ], + { + "title_aux": "AnimateDiff Evolved" + } + ], + "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": [ + [ + "VHS_AudioToVHSAudio", + "VHS_BatchManager", + "VHS_DuplicateImages", + "VHS_DuplicateLatents", + "VHS_DuplicateMasks", + "VHS_GetImageCount", + "VHS_GetLatentCount", + "VHS_GetMaskCount", + "VHS_LoadAudio", + "VHS_LoadAudioUpload", + "VHS_LoadImages", + "VHS_LoadImagesPath", + "VHS_LoadVideo", + "VHS_LoadVideoPath", + "VHS_MergeImages", + "VHS_MergeLatents", + "VHS_MergeMasks", + "VHS_PruneOutputs", + "VHS_SelectEveryNthImage", + "VHS_SelectEveryNthLatent", + "VHS_SelectEveryNthMask", + "VHS_SplitImages", + "VHS_SplitLatents", + "VHS_SplitMasks", + "VHS_VAEDecodeBatched", + "VHS_VAEEncodeBatched", + "VHS_VHSAudioToAudio", + "VHS_VideoCombine", + "VHS_VideoInfo", + "VHS_VideoInfoLoaded", + "VHS_VideoInfoSource" + ], + { + "title_aux": "ComfyUI-VideoHelperSuite" + } + ], + "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": [ + [ + "SendToDiscordWebhook" + ], + { + "title_aux": "ComfyUI_KytraWebhookHTTP" + } + ], + "https://github.com/LEv145/images-grid-comfy-plugin": [ + [ + "GridAnnotation", + "ImageCombine", + "ImagesGridByColumns", + "ImagesGridByRows", + "LatentCombine" + ], + { + "title_aux": "ImagesGrid" + } + ], + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [ + [ + "LoRA Caption Load", + "LoRA Caption Save" + ], + { + "title_aux": "Image-Captioning-in-ComfyUI" + } + ], + "https://github.com/LarryJane491/Lora-Training-in-Comfy": [ + [ + "Lora Training in Comfy (Advanced)", + "Lora Training in ComfyUI", + "Tensorboard Access" + ], + { + "title_aux": "Lora-Training-in-Comfy" + } + ], + "https://github.com/Layer-norm/comfyui-lama-remover": [ + [ + "LamaRemover", + "LamaRemoverIMG" + ], + { + "title_aux": "Comfyui lama remover" + } + ], + "https://github.com/Lerc/canvas_tab": [ + [ + "Canvas_Tab", + "Send_To_Editor" + ], + { + "author": "Lerc", + "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor.", + "nickname": "Canvas Tab", + "title": "Canvas Tab", + "title_aux": "Canvas Tab" + } + ], + "https://github.com/Limitex/ComfyUI-Calculation": [ + [ + "CenterCalculation", + "CreateQRCode" + ], + { + "title_aux": "ComfyUI-Calculation" + } + ], + "https://github.com/Limitex/ComfyUI-Diffusers": [ + [ + "CreateIntListNode", + "DiffusersClipTextEncode", + "DiffusersModelMakeup", + "DiffusersPipelineLoader", + "DiffusersSampler", + "DiffusersSchedulerLoader", + "DiffusersVaeLoader", + "LcmLoraLoader", + "StreamDiffusionCreateStream", + "StreamDiffusionFastSampler", + "StreamDiffusionSampler", + "StreamDiffusionWarmup" + ], + { + "title_aux": "ComfyUI-Diffusers" + } + ], + "https://github.com/Loewen-Hob/rembg-comfyui-node-better": [ + [ + "Image Remove Background (rembg)" + ], + { + "title_aux": "Rembg Background Removal Node for ComfyUI (Better)" + } + ], + "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": [ + [ + "BreakFrames", + "BreakGrid", + "GetKeyFrames", + "MakeGrid", + "RandomImageFromDir" + ], + { + "title_aux": "ComfyBreakAnim" + } + ], + "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": [ + [ + "SaveTifImage" + ], + { + "title_aux": "ComfyUI-RawSaver" + } + ], + "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": [ + [ + "ScenarioPrompt" + ], + { + "title_aux": "ComfyUI-ScenarioPrompt" + } + ], + "https://github.com/LyazS/comfyui-anime-seg": [ + [ + "Anime Character Seg" + ], + { + "title_aux": "Anime Character Segmentation node for comfyui" + } + ], + "https://github.com/M1kep/ComfyLiterals": [ + [ + "Checkpoint", + "Float", + "Int", + "KepStringLiteral", + "Lora", + "Operation", + "String" + ], + { + "title_aux": "ComfyLiterals" + } + ], + "https://github.com/M1kep/ComfyUI-KepOpenAI": [ + [ + "KepOpenAI_ImageWithPrompt" + ], + { + "title_aux": "ComfyUI-KepOpenAI" + } + ], + "https://github.com/M1kep/ComfyUI-OtherVAEs": [ + [ + "OtherVAE_Taesd" + ], + { + "title_aux": "ComfyUI-OtherVAEs" + } + ], + "https://github.com/M1kep/Comfy_KepKitchenSink": [ + [ + "KepRotateImage" + ], + { + "title_aux": "Comfy_KepKitchenSink" + } + ], + "https://github.com/M1kep/Comfy_KepListStuff": [ + [ + "Empty Images", + "Image Overlay", + "ImageListLoader", + "Join Float Lists", + "Join Image Lists", + "KepStringList", + "KepStringListFromNewline", + "Kep_JoinListAny", + "Kep_RepeatList", + "Kep_ReverseList", + "Kep_VariableImageBuilder", + "List Length", + "Range(Num Steps) - Float", + "Range(Num Steps) - Int", + "Range(Step) - Float", + "Range(Step) - Int", + "Stack Images", + "XYAny", + "XYImage" + ], + { + "title_aux": "Comfy_KepListStuff" + } + ], + "https://github.com/M1kep/Comfy_KepMatteAnything": [ + [ + "MatteAnything_DinoBoxes", + "MatteAnything_GenerateVITMatte", + "MatteAnything_InitSamPredictor", + "MatteAnything_LoadDINO", + "MatteAnything_LoadVITMatteModel", + "MatteAnything_SAMLoader", + "MatteAnything_SAMMaskFromBoxes", + "MatteAnything_ToTrimap" + ], + { + "title_aux": "Comfy_KepMatteAnything" + } + ], + "https://github.com/M1kep/KepPromptLang": [ + [ + "Build Gif", + "Special CLIP Loader" + ], + { + "title_aux": "KepPromptLang" + } + ], + "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [ + [ + "\u26d4 Generate Negative Prompt", + "\u2728 Groq LLM API", + "\ud83d\udcbe Save Text File With Path", + "\ud83d\uddbc\ufe0f Download Image from URL" + ], + { + "title_aux": "ComfyUI-mnemic-nodes" + } + ], + "https://github.com/Makeezi/ComfyUI-promptLAB": [ + [ + "PromptLAB" + ], + { + "title_aux": "ComfyUI-promptLAB" + } + ], + "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": [ + [ + "Image Remove Background (rembg)" + ], + { + "title_aux": "Batch Rembg for ComfyUI" + } + ], + "https://github.com/ManglerFTW/ComfyI2I": [ + [ + "Color Transfer", + "Combine and Paste", + "Inpaint Segments", + "Mask Ops" + ], + { + "author": "ManglerFTW", + "title": "ComfyI2I", + "title_aux": "ComfyI2I" + } + ], + "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": [ + [ + "MaraScottAnyBusNode", + "MaraScottAnyBus_v2", + "MaraScottDisplayInfoNode", + "MaraScottDisplayInfo_v1", + "MaraScottPasteInpaintingByMask_v1", + "MaraScottPromptFromImage_v1", + "MaraScottSetInpaintingByMask_v1", + "MaraScottUpscalerRefinerNode_v2", + "MaraScottUpscalerRefinerNode_v3", + "MaraScott_Kijai_TokenCounter_v1", + "McBoaty_Refiner_v4", + "McBoaty_TilePrompter_v4", + "McBoaty_Upscaler_v4" + ], + { + "title_aux": "\ud83d\udc30 MaraScott Nodes" + } + ], + "https://github.com/MarcusNyne/m9-prompts-comfyui": [ + [ + "ScramblePrompts_m9", + "TweakWeights_m9" + ], + { + "title_aux": "m9-prompts-comfyui" + } + ], + "https://github.com/MariusKM/ComfyUI-BadmanNodes": [ + [ + "BadmanCLIPTextEncodeSDXLRegion", + "BadmanIO", + "BadmanIntUtil", + "BadmanStringSelect", + "Badman_Blend", + "Badman_Concat_String", + "Badman_HexGenerator", + "Badman_Print", + "Badman_String" + ], + { + "title_aux": "ComfyUI-BadmanNodes" + } + ], + "https://github.com/MarkoCa1/ComfyUI-Text": [ + [ + "CombinationText", + "PlaceholderText", + "ReplaceText", + "ShowText" + ], + { + "title_aux": "ComfyUI-Text" + } + ], + "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [ + [ + "AutomaticMask(segment anything)" + ], + { + "title_aux": "ComfyUI_Segment_Mask" + } + ], + "https://github.com/Mason-McGough/ComfyUI-Mosaica": [ + [ + "ApplyLUTToLabelImage", + "KMeans", + "LoadLUTFromMatplotlib", + "MeanShift", + "RandomLUT", + "Watershed" + ], + { + "title_aux": "Mosaica" + } + ], + "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack": [ + [ + "IntegratedRandomPromptGenerator", + "TextAppender" + ], + { + "author": "Militant Hitchhiker", + "description": "Militant Hitchhiker's multi-function nodes.", + "nickname": "Switchblade", + "title": "Switchblade Pack", + "title_aux": "Militant Hitchhiker's Switchblade Pack" + } + ], + "https://github.com/Miosp/ComfyUI-FBCNN": [ + [ + "JPEG artifacts removal FBCNN" + ], + { + "title_aux": "ComfyUI-FBCNN" + } + ], + "https://github.com/MitoshiroPJ/comfyui_slothful_attention": [ + [ + "NearSightedAttention", + "NearSightedAttentionSimple", + "NearSightedTile", + "SlothfulAttention" + ], + { + "title_aux": "ComfyUI Slothful Attention" + } + ], + "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": [ + [ + "AnimeCosplayDir", + "AspectRatioCondition", + "ChooseImage", + "Colors", + "CombinedCrop", + "ConnectFloat", + "ConnectImage", + "ConnectInteger", + "ConnectLatent", + "ConnectString", + "DirSelector", + "DoubleClipTextEncode", + "EmbeddingLoader", + "FilmCharDir", + "FuseImages", + "FuseImages2", + "HashText", + "HueSatLum", + "HueShift", + "ImageDimensions", + "ImageDimensionsBatch", + "ImageOverlayResized", + "ImageResizeLong", + "ImageZigzag", + "IndoorBackgrounds", + "IndoorDir", + "IntEvaluate", + "IntFloatDict", + "IntStringDict", + "JsonSearch", + "KillWorkflow", + "LandscapeBackgrounds", + "LandscapeDir", + "MakeupStylesDir", + "Mbsampler", + "OptimalCrop", + "Overlay", + "PhotomontageA", + "PhotomontageB", + "PhotomontageC", + "PostSamplerCrop", + "PresetLoad", + "PresetRemove", + "PresetSave", + "PromptSwitcher", + "RandomString", + "SDXLEmptyLatent", + "SavePrompt", + "SaveWithMetaData", + "SaveWithMetaData2", + "SearchReplace", + "SimplePrompts", + "SpecificStylesDir", + "SplitImages", + "StringJoin", + "TimeStamp", + "TintnShift", + "TricolorComposition", + "WorkflowSettings", + "WrapText", + "X_In_a_Dress", + "X_In_a_Suit", + "X_In_a_Suit)", + "ZoomCrop", + "imageborder" + ], + { + "title_aux": "Node Pack mostly for manipulating strings and integers" + } + ], + "https://github.com/MrForExample/ComfyUI-3D-Pack": [ + [], + { + "nodename_pattern": "^\\[Comfy3D\\]", + "title_aux": "ComfyUI-3D-Pack" + } + ], + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": [ + [], + { + "nodename_pattern": "^\\[AnimateAnyone\\]", + "title_aux": "ComfyUI-AnimateAnyone-Evolved" + } + ], + "https://github.com/MrSamSeen/ComfyUI_SSStereoscope": [ + [ + "SBS_by_SamSeen" + ], + { + "title_aux": "ComfyUI_SSStereoscope" + } + ], + "https://github.com/Munkyfoot/ComfyUI-TextOverlay": [ + [ + "Text Overlay" + ], + { + "title_aux": "ComfyUI-TextOverlay" + } + ], + "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": [ + [ + "SuperPrompterNode" + ], + { + "title_aux": "SuperPrompter Node for ComfyUI" + } + ], + "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": [ + [ + "LatentTravel" + ], + { + "title_aux": "ComfyUI_TravelSuite" + } + ], + "https://github.com/NimaNzrii/comfyui-photoshop": [ + [ + "\ud83d\udd39 Photoshop RemoteConnection", + "\ud83d\udd39Photoshop ComfyUI Plugin", + "\ud83d\udd39SendTo Photoshop Plugin" + ], + { + "title_aux": "comfyui-photoshop" + } + ], + "https://github.com/NimaNzrii/comfyui-popup_preview": [ + [ + "PreviewPopup" + ], + { + "title_aux": "comfyui-popup_preview" + } + ], + "https://github.com/Niutonian/ComfyUi-NoodleWebcam": [ + [ + "WebcamNode" + ], + { + "title_aux": "ComfyUi-NoodleWebcam" + } + ], + "https://github.com/Nlar/ComfyUI_CartoonSegmentation": [ + [ + "AnimeSegmentation", + "KenBurnsConfigLoader", + "KenBurns_Processor", + "LoadImageFilename" + ], + { + "author": "Nels Larsen", + "description": "This extension offers a front end to the Cartoon Segmentation Project (https://github.com/CartoonSegmentation/CartoonSegmentation)", + "nickname": "CfyCS", + "title": "ComfyUI_CartoonSegmentation", + "title_aux": "ComfyUI_CartoonSegmentation" + } + ], + "https://github.com/NotHarroweD/Harronode": [ + [ + "Harronode" + ], + { + "author": "HarroweD and quadmoon (https://github.com/traugdor)", + "description": "This extension to ComfyUI will build a prompt for the Harrlogos LoRA for SDXL.", + "nickname": "Harronode", + "nodename_pattern": "Harronode", + "title": "Harrlogos Prompt Builder Node", + "title_aux": "Harrlogos Prompt Builder Node" + } + ], + "https://github.com/Nourepide/ComfyUI-Allor": [ + [ + "AlphaChanelAdd", + "AlphaChanelAddByMask", + "AlphaChanelAsMask", + "AlphaChanelRemove", + "AlphaChanelRestore", + "ClipClamp", + "ClipVisionClamp", + "ClipVisionOutputClamp", + "ConditioningClamp", + "ControlNetClamp", + "GligenClamp", + "ImageBatchCopy", + "ImageBatchFork", + "ImageBatchGet", + "ImageBatchJoin", + "ImageBatchPermute", + "ImageBatchRemove", + "ImageClamp", + "ImageCompositeAbsolute", + "ImageCompositeAbsoluteByContainer", + "ImageCompositeRelative", + "ImageCompositeRelativeByContainer", + "ImageContainer", + "ImageContainerInheritanceAdd", + "ImageContainerInheritanceMax", + "ImageContainerInheritanceScale", + "ImageContainerInheritanceSum", + "ImageDrawArc", + "ImageDrawArcByContainer", + "ImageDrawChord", + "ImageDrawChordByContainer", + "ImageDrawEllipse", + "ImageDrawEllipseByContainer", + "ImageDrawLine", + "ImageDrawLineByContainer", + "ImageDrawPieslice", + "ImageDrawPiesliceByContainer", + "ImageDrawPolygon", + "ImageDrawRectangle", + "ImageDrawRectangleByContainer", + "ImageDrawRectangleRounded", + "ImageDrawRectangleRoundedByContainer", + "ImageEffectsAdjustment", + "ImageEffectsGrayscale", + "ImageEffectsLensBokeh", + "ImageEffectsLensChromaticAberration", + "ImageEffectsLensOpticAxis", + "ImageEffectsLensVignette", + "ImageEffectsLensZoomBurst", + "ImageEffectsNegative", + "ImageEffectsSepia", + "ImageFilterBilateralBlur", + "ImageFilterBlur", + "ImageFilterBoxBlur", + "ImageFilterContour", + "ImageFilterDetail", + "ImageFilterEdgeEnhance", + "ImageFilterEdgeEnhanceMore", + "ImageFilterEmboss", + "ImageFilterFindEdges", + "ImageFilterGaussianBlur", + "ImageFilterGaussianBlurAdvanced", + "ImageFilterMax", + "ImageFilterMedianBlur", + "ImageFilterMin", + "ImageFilterMode", + "ImageFilterRank", + "ImageFilterSharpen", + "ImageFilterSmooth", + "ImageFilterSmoothMore", + "ImageFilterStackBlur", + "ImageNoiseBeta", + "ImageNoiseBinomial", + "ImageNoiseBytes", + "ImageNoiseGaussian", + "ImageSegmentation", + "ImageSegmentationCustom", + "ImageSegmentationCustomAdvanced", + "ImageText", + "ImageTextMultiline", + "ImageTextMultilineOutlined", + "ImageTextOutlined", + "ImageTransformCropAbsolute", + "ImageTransformCropCorners", + "ImageTransformCropRelative", + "ImageTransformPaddingAbsolute", + "ImageTransformPaddingRelative", + "ImageTransformResizeAbsolute", + "ImageTransformResizeClip", + "ImageTransformResizeRelative", + "ImageTransformRotate", + "ImageTransformTranspose", + "LatentClamp", + "MaskClamp", + "ModelClamp", + "StyleModelClamp", + "UpscaleModelClamp", + "VaeClamp" + ], + { + "title_aux": "Allor Plugin" + } + ], + "https://github.com/Nuked88/ComfyUI-N-Nodes": [ + [ + "CLIPTextEncodeAdvancedNSuite [n-suite]", + "DynamicPrompt [n-suite]", + "Float Variable [n-suite]", + "FrameInterpolator [n-suite]", + "GPT Loader Simple [n-suite]", + "GPT Sampler [n-suite]", + "ImagePadForOutpaintAdvanced [n-suite]", + "Integer Variable [n-suite]", + "Llava Clip Loader [n-suite]", + "LoadFramesFromFolder [n-suite]", + "LoadImageFromFolder [n-suite]", + "LoadVideo [n-suite]", + "SaveVideo [n-suite]", + "SetMetadataForSaveVideo [n-suite]", + "String Variable [n-suite]" + ], + { + "title_aux": "ComfyUI-N-Nodes" + } + ], + "https://github.com/Off-Live/ComfyUI-off-suite": [ + [ + "Apply CLAHE", + "Cached Image Load From URL", + "CalcMaskBound", + "Crop Center wigh SEGS", + "Crop Center with SEGS", + "Dilate Mask for Each Face", + "GW Number Formatting", + "Grid Image from batch (OFF)", + "Image Crop Fit", + "Image Resize Fit", + "OFF SEGS to Image", + "Paste Face Segment to Image", + "Query Gender and Age", + "RandomSeedfromList", + "SEGS to Face Crop Data", + "Safe Mask to Image", + "VAE Encode For Inpaint V2", + "Watermarking" + ], + { + "title_aux": "ComfyUI-off-suite" + } + ], + "https://github.com/Onierous/QRNG_Node_ComfyUI/raw/main/qrng_node.py": [ + [ + "QRNG_Node_CSV" + ], + { + "title_aux": "QRNG_Node_ComfyUI" + } + ], + "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": [ + [ + "Load Artists CSV", + "Load Artmovements CSV", + "Load Characters CSV", + "Load Colors CSV", + "Load Composition CSV", + "Load Lighting CSV", + "Load Negative CSV", + "Load Positive CSV", + "Load Settings CSV", + "Load Styles CSV" + ], + { + "title_aux": "ComfyUI-CSV-Loader" + } + ], + "https://github.com/ParisNeo/lollms_nodes_suite": [ + [ + "Artbot", + "Lollms_Text_Gen", + "Lollms_Text_Saver", + "RandomizeVideo" + ], + { + "title_aux": "lollms_nodes_suite" + } + ], + "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": [ + [ + "CSVPromptsLoader", + "CombinePrompt", + "MultiLoraLoader", + "RandomPrompt" + ], + { + "title_aux": "ComfyUI-Malefish-Custom-Scripts" + } + ], + "https://github.com/Pfaeff/pfaeff-comfyui": [ + [ + "AstropulsePixelDetector", + "BackgroundRemover", + "ImagePadForBetterOutpaint", + "Inpainting", + "InpaintingPipelineLoader" + ], + { + "title_aux": "pfaeff-comfyui" + } + ], + "https://github.com/PnthrLeo/comfyUI-image-search": [ + [ + "CloseImagesSearcher" + ], + { + "title_aux": "comfyUI-image-search" + } + ], + "https://github.com/Pos13/comfyui-cyclist": [ + [ + "CyclistCompare", + "CyclistMathFloat", + "CyclistMathInt", + "CyclistTimer", + "CyclistTimerStop", + "CyclistTypeCast", + "Interrupt", + "LoopManager", + "MemorizeConditioning", + "MemorizeFloat", + "MemorizeInt", + "MemorizeString", + "OverrideImage", + "OverrideLatent", + "OverrideModel", + "RecallConditioning", + "RecallFloat", + "RecallInt", + "RecallString", + "ReloadImage", + "ReloadLatent", + "ReloadModel" + ], + { + "author": "Pos13", + "description": "This extension provides tools to iterate generation results between runs. In general, it's for cycles.", + "nickname": "comfyui-cyclist", + "title": "Cyclist", + "title_aux": "Cyclist" + } + ], + "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": [ + [ + "Bool Binary Operation", + "Bool Unary Operation", + "Item Debugger", + "Item Switch", + "Nearest SDXL Resolution", + "SDXL Resolution", + "Size Swapper" + ], + { + "title_aux": "ComfyUI-Qais-Helper" + } + ], + "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD": [ + [ + "DanbooruToWD" + ], + { + "title_aux": "ComfyUI-Danbooru-To-WD" + } + ], + "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": [ + [ + "AnalyseMetadata", + "DateIntegerNode", + "DisplayMetaOptions", + "LoadImageWithMeta", + "MetadataOverlayNode", + "VideoPathMetaExtraction" + ], + { + "title_aux": "ComfyUI-RenderRiftNodes" + } + ], + "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": [ + [ + "LatentAddTransform", + "LatentInterpolateTransform", + "LatentMirror", + "LatentNormalize", + "LatentShift", + "MirrorTransform", + "MultiplyTransform", + "OffsetCombine", + "OneTimeLatentAddTransform", + "OneTimeLatentInterpolateTransform", + "OneTimeMirrorTransform", + "OneTimeMultiplyTransform", + "OneTimeShiftTransform", + "ShiftTransform", + "TransformHijack", + "TransformOffset", + "TransformSampler", + "TransformSamplerAdvanced", + "TransformsCombine" + ], + { + "title_aux": "Advanced Latent Control" + } + ], + "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": [ + [ + "Scene Generator" + ], + { + "title_aux": "ComfyUI-SceneGenerator" + } + ], + "https://github.com/Ryuukeisyou/comfyui_face_parsing": [ + [ + "BBoxListItemSelect(FaceParsing)", + "BBoxResize(FaceParsing)", + "ColorAdjust(FaceParsing)", + "FaceBBoxDetect(FaceParsing)", + "FaceBBoxDetectorLoader(FaceParsing)", + "FaceParse(FaceParsing)", + "FaceParsingModelLoader(FaceParsing)", + "FaceParsingProcessorLoader(FaceParsing)", + "FaceParsingResultsParser(FaceParsing)", + "GuidedFilter(FaceParsing)", + "ImageCropWithBBox(FaceParsing)", + "ImageInsertWithBBox(FaceParsing)", + "ImageListSelect(FaceParsing)", + "ImagePadWithBBox(FaceParsing)", + "ImageResizeCalculator(FaceParsing)", + "ImageResizeWithBBox(FaceParsing)", + "ImageSize(FaceParsing)", + "LatentCropWithBBox(FaceParsing)", + "LatentInsertWithBBox(FaceParsing)", + "LatentSize(FaceParsing)", + "MaskComposite(FaceParsing)", + "MaskInsertWithBBox(FaceParsing)", + "MaskListComposite(FaceParsing)", + "MaskListSelect(FaceParsing)", + "MaskToBBox(FaceParsing)", + "SkinDetectTraditional(FaceParsing)" + ], + { + "title_aux": "comfyui_face_parsing" + } + ], + "https://github.com/Ryuukeisyou/comfyui_io_helpers": [ + [ + "ImageLoadAsMaskByPath(IOHelpers)", + "ImageLoadByPath(IOHelpers)", + "ImageLoadFromBase64(IOHelpers)", + "ImageSaveAsBase64(IOHelpers)", + "ImageSaveToPath(IOHelpers)", + "TypeConversion(IOHelpers)" + ], + { + "title_aux": "comfyui_io_helpers" + } + ], + "https://github.com/SEkINVR/ComfyUI-SaveAs": [ + [ + "ComfyUISaveAs" + ], + { + "title_aux": "ComfyUI SaveAS" + } + ], + "https://github.com/SLAPaper/ComfyUI-Image-Selector": [ + [ + "ImageDuplicator", + "ImageSelector", + "LatentDuplicator", + "LatentSelector" + ], + { + "title_aux": "ComfyUI-Image-Selector" + } + ], + "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": [ + [ + "MSSqlSelectNode", + "MSSqlTableNode" + ], + { + "title_aux": "LexMSDBNodes" + } + ], + "https://github.com/SOELexicon/ComfyUI-LexTools": [ + [ + "AesthetlcScoreSorter", + "AgeClassifierNode", + "ArtOrHumanClassifierNode", + "CalculateAestheticScore", + "DocumentClassificationNode", + "FoodCategoryClassifierNode", + "ImageAspectPadNode", + "ImageCaptioning", + "ImageFilterByFloatScoreNode", + "ImageFilterByIntScoreNode", + "ImageQualityScoreNode", + "ImageRankingNode", + "ImageScaleToMin", + "LoadAesteticModel", + "MD5ImageHashNode", + "SamplerPropertiesNode", + "ScoreConverterNode", + "SeedIncrementerNode", + "SegformerNode", + "SegformerNodeMasks", + "SegformerNodeMergeSegments", + "StepCfgIncrementNode" + ], + { + "title_aux": "ComfyUI-LexTools" + } + ], + "https://github.com/SadaleNet/CLIPTextEncodeA1111-ComfyUI/raw/master/custom_nodes/clip_text_encoder_a1111.py": [ + [ + "CLIPTextEncodeA1111", + "RerouteTextForCLIPTextEncodeA1111" + ], + { + "preemptions": [ + "SAMLoader" + ], + "title_aux": "ComfyUI A1111-like Prompt Custom Node Solution" + } + ], + "https://github.com/SamKhoze/ComfyUI-DeepFuze": [ + [ + "DeepFuze Save", + "DeepFuzeAdavance", + "DeepFuzeFaceSwap", + "DeepfuzePreview", + "LLM_node", + "PlayBackAudio", + "TTS_generation" + ], + { + "title_aux": "DeepFuze" + } + ], + "https://github.com/SayanoAI/Comfy-RVC": [ + [ + "AudioBatchValueNode", + "AudioTranscriptionNode", + "DownloadAudio", + "ImageRepeatInterleavedNode", + "LatentRepeatInterleavedNode", + "LoadAudio", + "LoadHubertModel", + "LoadPitchExtractionParams", + "LoadRVCModelNode", + "LoadWhisperModelNode", + "MergeAudioNode", + "MergeImageBatches", + "MergeLatentBatches", + "PreviewAudio", + "RVCNode", + "UVR5Node" + ], + { + "title_aux": "Comfy-RVC" + } + ], + "https://github.com/Scholar01/ComfyUI-Keyframe": [ + [ + "KeyframeApply", + "KeyframeInterpolationPart", + "KeyframePart" + ], + { + "title_aux": "SComfyUI-Keyframe" + } + ], + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [ + [ + "CombinedDiffusersLoader", + "DiffusersClipLoader", + "DiffusersUNETLoader", + "DiffusersVAELoader" + ], + { + "title_aux": "Loaders for Diffusers-format checkpoints" + } + ], + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": [ + [ + "OllamaCLIPTextEncode", + "OllamaPromptGenerator" + ], + { + "author": "Michael Standen", + "description": "Use AI to generate prompts and perform CLIP text encoding", + "nickname": "Ollama Prompt Encode", + "title": "Ollama Prompt Encode", + "title_aux": "Ollama Prompt Encode" + } + ], + "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": [ + [ + "SeaArtLongClip", + "SeaArtLongXLClipMerge" + ], + { + "title_aux": "ComfyUI-Long-CLIP" + } + ], + "https://github.com/SeargeDP/SeargeSDXL": [ + [ + "SeargeAdvancedParameters", + "SeargeCheckpointLoader", + "SeargeConditionMixing", + "SeargeConditioningMuxer2", + "SeargeConditioningMuxer5", + "SeargeConditioningParameters", + "SeargeControlnetAdapterV2", + "SeargeControlnetModels", + "SeargeCustomAfterUpscaling", + "SeargeCustomAfterVaeDecode", + "SeargeCustomPromptMode", + "SeargeDebugPrinter", + "SeargeEnablerInputs", + "SeargeFloatConstant", + "SeargeFloatMath", + "SeargeFloatPair", + "SeargeFreeU", + "SeargeGenerated1", + "SeargeGenerationParameters", + "SeargeHighResolution", + "SeargeImage2ImageAndInpainting", + "SeargeImageAdapterV2", + "SeargeImageSave", + "SeargeImageSaving", + "SeargeInput1", + "SeargeInput2", + "SeargeInput3", + "SeargeInput4", + "SeargeInput5", + "SeargeInput6", + "SeargeInput7", + "SeargeIntegerConstant", + "SeargeIntegerMath", + "SeargeIntegerPair", + "SeargeIntegerScaler", + "SeargeLatentMuxer3", + "SeargeLoraLoader", + "SeargeLoras", + "SeargeMagicBox", + "SeargeModelSelector", + "SeargeOperatingMode", + "SeargeOutput1", + "SeargeOutput2", + "SeargeOutput3", + "SeargeOutput4", + "SeargeOutput5", + "SeargeOutput6", + "SeargeOutput7", + "SeargeParameterProcessor", + "SeargePipelineStart", + "SeargePipelineTerminator", + "SeargePreviewImage", + "SeargePromptAdapterV2", + "SeargePromptCombiner", + "SeargePromptStyles", + "SeargePromptText", + "SeargeSDXLBasePromptEncoder", + "SeargeSDXLImage2ImageSampler", + "SeargeSDXLImage2ImageSampler2", + "SeargeSDXLPromptEncoder", + "SeargeSDXLRefinerPromptEncoder", + "SeargeSDXLSampler", + "SeargeSDXLSampler2", + "SeargeSDXLSamplerV3", + "SeargeSamplerAdvanced", + "SeargeSamplerInputs", + "SeargeSaveFolderInputs", + "SeargeSeparator", + "SeargeStylePreprocessor", + "SeargeTextInputV2", + "SeargeUpscaleModelLoader", + "SeargeUpscaleModels", + "SeargeVAELoader" + ], + { + "title_aux": "SeargeSDXL" + } + ], + "https://github.com/Seedsa/Fooocus_Nodes": [ + [ + "BasicScheduler", + "CLIPLoader", + "CLIPMergeSimple", + "CLIPSave", + "CLIPSetLastLayer", + "CLIPTextEncode", + "CLIPTextEncodeSDXL", + "CLIPTextEncodeSDXLRefiner", + "CLIPVisionEncode", + "CLIPVisionLoader", + "Canny", + "CheckpointLoader", + "CheckpointLoaderSimple", + "CheckpointSave", + "ConditioningAverage", + "ConditioningCombine", + "ConditioningConcat", + "ConditioningSetArea", + "ConditioningSetAreaPercentage", + "ConditioningSetMask", + "ConditioningSetTimestepRange", + "ConditioningZeroOut", + "ControlNetApply", + "ControlNetApplyAdvanced", + "ControlNetLoader", + "CropMask", + "DiffControlNetLoader", + "DiffusersLoader", + "DualCLIPLoader", + "EmptyImage", + "EmptyLatentImage", + "ExponentialScheduler", + "FeatherMask", + "FlipSigmas", + "Fooocus ApplyImagePrompt", + "Fooocus Controlnet", + "Fooocus ImagePrompt", + "Fooocus Inpaint", + "Fooocus KSampler", + "Fooocus Loader", + "Fooocus LoraStack", + "Fooocus PipeOut", + "Fooocus PreKSampler", + "Fooocus Styles", + "Fooocus Upscale", + "Fooocus detailerFix", + "Fooocus negative", + "Fooocus positive", + "Fooocus preDetailerFix", + "Fooocus samLoaderPipe", + "Fooocus ultralyticsDetectorPipe", + "FreeU", + "FreeU_V2", + "GLIGENLoader", + "GLIGENTextBoxApply", + "GrowMask", + "HyperTile", + "HypernetworkLoader", + "ImageBatch", + "ImageBlend", + "ImageBlur", + "ImageColorToMask", + "ImageCompositeMasked", + "ImageCrop", + "ImageInvert", + "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", + "ImagePadForOutpaint", + "ImageQuantize", + "ImageScale", + "ImageScaleBy", + "ImageScaleToTotalPixels", + "ImageSharpen", + "ImageToMask", + "ImageUpscaleWithModel", + "InpaintModelConditioning", + "InvertMask", + "JoinImageWithAlpha", + "KSampler", + "KSamplerAdvanced", + "KSamplerSelect", + "KarrasScheduler", + "LatentAdd", + "LatentBatch", + "LatentBatchSeedBehavior", + "LatentBlend", + "LatentComposite", + "LatentCompositeMasked", + "LatentCrop", + "LatentFlip", + "LatentFromBatch", + "LatentInterpolate", + "LatentMultiply", + "LatentRotate", + "LatentSubtract", + "LatentUpscale", + "LatentUpscaleBy", + "LoadImage", + "LoadImageMask", + "LoadLatent", + "LoraLoader", + "LoraLoaderModelOnly", + "MaskComposite", + "MaskToImage", + "ModelMergeAdd", + "ModelMergeBlocks", + "ModelMergeSimple", + "ModelMergeSubtract", + "ModelSamplingContinuousEDM", + "ModelSamplingDiscrete", + "PatchModelAddDownscale", + "PerpNeg", + "PhotoMakerEncode", + "PhotoMakerLoader", + "PolyexponentialScheduler", + "PorterDuffImageComposite", + "PreviewImage", + "RebatchImages", + "RebatchLatents", + "RepeatImageBatch", + "RepeatLatentBatch", + "RescaleCFG", + "SDTurboScheduler", + "SD_4XUpscale_Conditioning", + "SVD_img2vid_Conditioning", + "SamplerCustom", + "SamplerDPMPP_2M_SDE", + "SamplerDPMPP_SDE", + "SaveAnimatedPNG", + "SaveAnimatedWEBP", + "SaveImage", + "SaveLatent", + "SelfAttentionGuidance", + "SetLatentNoiseMask", + "SolidMask", + "SplitImageWithAlpha", + "SplitSigmas", + "StableZero123_Conditioning", + "StableZero123_Conditioning_Batched", + "StyleModelApply", + "StyleModelLoader", + "TomePatchModel", + "UNETLoader", + "UpscaleModelLoader", + "VAEDecode", + "VAEDecodeTiled", + "VAEEncode", + "VAEEncodeForInpaint", + "VAEEncodeTiled", + "VAELoader", + "VAESave", + "VPScheduler", + "VideoLinearCFGGuidance", + "unCLIPCheckpointLoader", + "unCLIPConditioning" + ], + { + "title_aux": "ComfyUI Fooocus Nodes" + } + ], + "https://github.com/Ser-Hilary/SDXL_sizing/raw/main/conditioning_sizing_for_SDXL.py": [ + [ + "get_aspect_from_image", + "get_aspect_from_ints", + "sizing_node", + "sizing_node_basic", + "sizing_node_unparsed" + ], + { + "title_aux": "SDXL_sizing" + } + ], + "https://github.com/Shadetail/ComfyUI_Eagleshadow": [ + [ + "Batch 12 Images", + "Detect Transparency", + "Fix Checkpoint Name", + "ImageLinearGammaCompositeMasked", + "KSampler Same Noise", + "MaskGlow", + "OffsetImage", + "Round Float to String", + "SaveImageToFolder", + "Select ControlNet", + "Select Model 20", + "Simple Load Image Batch" + ], + { + "title_aux": "Eagleshadow Custom Nodes" + } + ], + "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting": [ + [ + "CropImageByRect", + "INPAINT_ColorCorrection", + "INPAINT_CropImage", + "INPAINT_InpaintingWithModel", + "INPAINT_LoadModel", + "INPAINT_PasteBackCropImage", + "INPAINT_VAEDecode", + "INPAINT_VAEEncode", + "ImagePostprocess", + "ImagePreprocess" + ], + { + "title_aux": "ComfyUI-Image-Inpainting" + } + ], + "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools": [ + [ + "Cascade", + "Luts", + "Waifu2x" + ], + { + "title_aux": "Shibiko AI ComfyUI Tools" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": [ + [ + "SVDRsizer" + ], + { + "title_aux": "ComfyUI-SVDResizer" + } + ], + "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash": [ + [ + "Gemini_Flash" + ], + { + "title_aux": "ComfyUI_Gemini_Flash" + } + ], + "https://github.com/ShmuelRonen/ComfyUI_wav2lip": [ + [ + "Wav2Lip" + ], + { + "title_aux": "Wav2Lip Node for ComfyUI" + } + ], + "https://github.com/Shraknard/ComfyUI-Remover": [ + [ + "Remover" + ], + { + "title_aux": "ComfyUI-Remover" + } + ], + "https://github.com/Siberpone/lazy-pony-prompter": [ + [ + "LPP_Deleter", + "LPP_Derpibooru", + "LPP_E621", + "LPP_Loader_Derpibooru", + "LPP_Loader_E621", + "LPP_Saver" + ], + { + "title_aux": "Lazy Pony Prompter" + } + ], + "https://github.com/Smirnov75/ComfyUI-mxToolkit": [ + [ + "mxSeed", + "mxSlider", + "mxSlider2D", + "mxStop" + ], + { + "title_aux": "ComfyUI-mxToolkit" + } + ], + "https://github.com/Smuzzies/comfyui_chatbox_overlay/raw/main/chatbox_overlay.py": [ + [ + "Chatbox Overlay" + ], + { + "title_aux": "Chatbox Overlay node for ComfyUI" + } + ], + "https://github.com/Smuzzies/comfyui_meme_maker": [ + [ + "MemeMaker" + ], + { + "title_aux": "comfyui_meme_maker" + } + ], + "https://github.com/SoftMeng/ComfyUI_ImageToText": [ + [ + "ComfyUI_ImageToText" + ], + { + "title_aux": "ComfyUI_ImageToText" + } + ], + "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": [ + [ + "ComfyUI_Mexx_Poster" + ], + { + "title_aux": "ComfyUI_Mexx_Poster" + } + ], + "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": [ + [ + "MexxSDXLPromptStyler", + "MexxSDXLPromptStylerAdvanced" + ], + { + "title_aux": "ComfyUI_Mexx_Styler" + } + ], + "https://github.com/Sorcerio/MBM-Music-Visualizer": [ + [ + "id", + "mbmAudioFeatureCalculator", + "mbmAudioLoader", + "mbmImageConcat", + "mbmPromptSequenceBuilder", + "mbmPromptSequenceBuilderAdv", + "mbmPromptSequenceInterpolator", + "mbmPromptSequenceLoader", + "mbmPromptSequenceRenderer" + ], + { + "title_aux": "MBM's Music Visualizer" + } + ], + "https://github.com/SozeInc/ComfyUI-Mobile": [ + [ + "Mobile_Settings_Launcher_Data", + "Send Notification (Mobile)", + "Settings Launcher (Mobile)", + "Ultimate Concat (Mobile)" + ], + { + "title_aux": "ComfyUI-Mobile" + } + ], + "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid": [ + [ + "SVD_txt2vid_ConditioningwithLatent" + ], + { + "title_aux": "Text to video for Stable Video Diffusion in ComfyUI" + } + ], + "https://github.com/Stability-AI/ComfyUI-SAI_API": [ + [ + "Stability Conservative Upscale", + "Stability Control Skech", + "Stability Control Structure", + "Stability Creative Upscale", + "Stability Erase", + "Stability Image Core", + "Stability Image Ultra", + "Stability Inpainting", + "Stability Outpainting", + "Stability Remove Background", + "Stability SD3", + "Stability Search and Replace" + ], + { + "title_aux": "Stability API nodes for ComfyUI" + } + ], + "https://github.com/Stability-AI/stability-ComfyUI-nodes": [ + [ + "ColorBlend", + "ControlLoraSave", + "GetImageSize" + ], + { + "title_aux": "stability-ComfyUI-nodes" + } + ], + "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": [ + [ + "Ood_CXH" + ], + { + "title_aux": "ComfyUI_OOTDiffusion_CXH" + } + ], + "https://github.com/StartHua/ComfyUI_PCDMs": [ + [ + "PCDMS_CXH" + ], + { + "title_aux": "ComfyUI_PCDMs" + } + ], + "https://github.com/StartHua/ComfyUI_Seg_VITON": [ + [ + "segformer_agnostic", + "segformer_clothes", + "segformer_remove_bg", + "stabel_vition" + ], + { + "title_aux": "ComfyUI_Seg_VITON" + } + ], + "https://github.com/StartHua/Comfyui_joytag": [ + [ + "CXH_JoyTag" + ], + { + "title_aux": "Comfyui_joytag" + } + ], + "https://github.com/StartHua/Comfyui_segformer_b2_clothes": [ + [ + "segformer_b2_clothes" + ], + { + "title_aux": "comfyui_segformer_b2_clothes" + } + ], + "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": [ + [ + "Deflicker (SuperBeasts.AI)", + "HDR Effects (SuperBeasts.AI)", + "Image Batch Manager (SuperBeasts.AI)", + "Make Resized Mask Batch (SuperBeasts.AI)", + "Mask Batch Manager (SuperBeasts.AI)", + "Pixel Deflicker (SuperBeasts.AI)", + "String List Manager (SuperBeasts.AI)" + ], + { + "title_aux": "ComfyUI-SuperBeasts" + } + ], + "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers": [ + [ + "YOLO Classifier Model Loader", + "YOLO Classify" + ], + { + "title_aux": "ComfyUI_YOLO_Classifiers" + } + ], + "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": [ + [ + "CR 8 Channel In", + "CR 8 Channel Out", + "CR Apply ControlNet", + "CR Apply LoRA Stack", + "CR Apply Model Merge", + "CR Apply Multi Upscale", + "CR Apply Multi-ControlNet", + "CR Arabic Text RTL", + "CR Aspect Ratio", + "CR Aspect Ratio Banners", + "CR Aspect Ratio SDXL", + "CR Aspect Ratio Social Media", + "CR Batch Images From List", + "CR Batch Process Switch", + "CR Binary Pattern", + "CR Binary To Bit List", + "CR Bit Schedule", + "CR Central Schedule", + "CR Checker Pattern", + "CR Clamp Value", + "CR Clip Input Switch", + "CR Color Bars", + "CR Color Gradient", + "CR Color Panel", + "CR Color Tint", + "CR Combine Prompt", + "CR Combine Schedules", + "CR Comic Panel Templates", + "CR Composite Text", + "CR Conditioning Input Switch", + "CR Conditioning Mixer", + "CR ControlNet Input Switch", + "CR Current Frame", + "CR Cycle Images", + "CR Cycle Images Simple", + "CR Cycle LoRAs", + "CR Cycle Models", + "CR Cycle Text", + "CR Cycle Text Simple", + "CR Data Bus In", + "CR Data Bus Out", + "CR Debatch Frames", + "CR Diamond Panel", + "CR Draw Perspective Text", + "CR Draw Pie", + "CR Draw Shape", + "CR Draw Text", + "CR Encode Scheduled Prompts", + "CR Feathered Border", + "CR Float Range List", + "CR Float To Integer", + "CR Float To String", + "CR Font File List", + "CR Get Parameter From Prompt", + "CR Gradient Float", + "CR Gradient Integer", + "CR Half Drop Panel", + "CR Halftone Filter", + "CR Halftone Grid", + "CR Hires Fix Process Switch", + "CR Image Border", + "CR Image Grid Panel", + "CR Image Input Switch", + "CR Image Input Switch (4 way)", + "CR Image List", + "CR Image List Simple", + "CR Image Output", + "CR Image Panel", + "CR Image Pipe Edit", + "CR Image Pipe In", + "CR Image Pipe Out", + "CR Image Size", + "CR Img2Img Process Switch", + "CR Increment Float", + "CR Increment Integer", + "CR Index", + "CR Index Increment", + "CR Index Multiply", + "CR Index Reset", + "CR Input Text List", + "CR Integer Multiple", + "CR Integer Range List", + "CR Integer To String", + "CR Interpolate Latents", + "CR Intertwine Lists", + "CR Keyframe List", + "CR Latent Batch Size", + "CR Latent Input Switch", + "CR LoRA List", + "CR LoRA Stack", + "CR Load Animation Frames", + "CR Load Flow Frames", + "CR Load GIF As List", + "CR Load Image List", + "CR Load Image List Plus", + "CR Load LoRA", + "CR Load Prompt Style", + "CR Load Schedule From File", + "CR Load Scheduled ControlNets", + "CR Load Scheduled LoRAs", + "CR Load Scheduled Models", + "CR Load Text List", + "CR Mask Text", + "CR Math Operation", + "CR Model Input Switch", + "CR Model List", + "CR Model Merge Stack", + "CR Module Input", + "CR Module Output", + "CR Module Pipe Loader", + "CR Multi Upscale Stack", + "CR Multi-ControlNet Stack", + "CR Multiline Text", + "CR Output Flow Frames", + "CR Output Schedule To File", + "CR Overlay Text", + "CR Overlay Transparent Image", + "CR Page Layout", + "CR Pipe Switch", + "CR Polygons", + "CR Prompt List", + "CR Prompt List Keyframes", + "CR Prompt Scheduler", + "CR Prompt Text", + "CR Radial Gradient", + "CR Random Hex Color", + "CR Random LoRA Stack", + "CR Random Multiline Colors", + "CR Random Multiline Values", + "CR Random Panel Codes", + "CR Random RGB", + "CR Random RGB Gradient", + "CR Random Shape Pattern", + "CR Random Weight LoRA", + "CR Repeater", + "CR SD1.5 Aspect Ratio", + "CR SDXL Aspect Ratio", + "CR SDXL Base Prompt Encoder", + "CR SDXL Prompt Mix Presets", + "CR SDXL Prompt Mixer", + "CR SDXL Style Text", + "CR Save Text To File", + "CR Schedule Input Switch", + "CR Schedule To ScheduleList", + "CR Seamless Checker", + "CR Seed", + "CR Seed to Int", + "CR Select Font", + "CR Select ISO Size", + "CR Select Model", + "CR Select Resize Method", + "CR Set Switch From String", + "CR Set Value On Binary", + "CR Set Value On Boolean", + "CR Set Value on String", + "CR Simple Banner", + "CR Simple Binary Pattern", + "CR Simple Binary Pattern Simple", + "CR Simple Image Compare", + "CR Simple List", + "CR Simple Meme Template", + "CR Simple Prompt List", + "CR Simple Prompt List Keyframes", + "CR Simple Prompt Scheduler", + "CR Simple Schedule", + "CR Simple Text Panel", + "CR Simple Text Scheduler", + "CR Simple Text Watermark", + "CR Simple Titles", + "CR Simple Value Scheduler", + "CR Split String", + "CR Starburst Colors", + "CR Starburst Lines", + "CR String To Boolean", + "CR String To Combo", + "CR String To Number", + "CR Style Bars", + "CR Switch Model and CLIP", + "CR Text", + "CR Text Blacklist", + "CR Text Concatenate", + "CR Text Cycler", + "CR Text Input Switch", + "CR Text Input Switch (4 way)", + "CR Text Length", + "CR Text List", + "CR Text List Simple", + "CR Text List To String", + "CR Text Operation", + "CR Text Replace", + "CR Text Scheduler", + "CR Thumbnail Preview", + "CR Trigger", + "CR Upscale Image", + "CR VAE Decode", + "CR VAE Input Switch", + "CR Value", + "CR Value Cycler", + "CR Value Scheduler", + "CR Vignette Filter", + "CR XY From Folder", + "CR XY Index", + "CR XY Interpolate", + "CR XY List", + "CR XY Product", + "CR XY Save Grid Image", + "CR XYZ Index", + "CR_Aspect Ratio For Print" + ], + { + "author": "Suzie1", + "description": "175 custom nodes for artists, designers and animators.", + "nickname": "Comfyroll Studio", + "title": "Comfyroll Studio", + "title_aux": "Comfyroll Studio" + } + ], + "https://github.com/Sxela/ComfyWarp": [ + [ + "ExtractOpticalFlow", + "LoadFrame", + "LoadFrameFromDataset", + "LoadFrameFromFolder", + "LoadFramePairFromDataset", + "LoadFrameSequence", + "MakeFrameDataset", + "MixConsistencyMaps", + "OffsetNumber", + "ResizeToFit", + "SaveFrame", + "WarpFrame" + ], + { + "title_aux": "ComfyWarp" + } + ], + "https://github.com/TGu-97/ComfyUI-TGu-utils": [ + [ + "MPNReroute", + "MPNSwitch", + "PNSwitch" + ], + { + "title_aux": "TGu Utilities" + } + ], + "https://github.com/THtianhao/ComfyUI-FaceChain": [ + [ + "FC CropAndPaste", + "FC CropBottom", + "FC CropToOrigin", + "FC FaceDetectCrop", + "FC FaceFusion", + "FC FaceSegAndReplace", + "FC FaceSegment", + "FC MaskOP", + "FC RemoveCannyFace", + "FC ReplaceByMask", + "FC StyleLoraLoad" + ], + { + "title_aux": "ComfyUI-FaceChain" + } + ], + "https://github.com/THtianhao/ComfyUI-Portrait-Maker": [ + [ + "PM_BoxCropImage", + "PM_ColorTransfer", + "PM_ExpandMaskBox", + "PM_FaceFusion", + "PM_FaceShapMatch", + "PM_FaceSkin", + "PM_GetImageInfo", + "PM_ImageResizeTarget", + "PM_ImageScaleShort", + "PM_MakeUpTransfer", + "PM_MaskDilateErode", + "PM_MaskMerge2Image", + "PM_PortraitEnhancement", + "PM_RatioMerge2Image", + "PM_ReplaceBoxImg", + "PM_RetinaFace", + "PM_Similarity", + "PM_SkinRetouching", + "PM_SuperColorTransfer", + "PM_SuperMakeUpTransfer" + ], + { + "title_aux": "ComfyUI-Portrait-Maker" + } + ], + "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": [ + [ + "EulerLightingNode" + ], + { + "title_aux": "comfyUI_TJ_NormalLighting" + } + ], + "https://github.com/TMElyralab/Comfyui-MusePose": [ + [ + "filenamestring", + "musepose", + "museposealign" + ], + { + "title_aux": "Comfyui-MusePose" + } + ], + "https://github.com/TRI3D-LC/ComfyUI-MiroBoard": [ + [ + "add-image-miro-board" + ], + { + "title_aux": "ComfyUI-MiroBoard" + } + ], + "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [ + [ + "get_histogram_limits", + "main_light_layer", + "main_scaled_paste", + "simple_rescale_histogram", + "tri3d-HistogramEqualization", + "tri3d-LAB_2_RGB", + "tri3d-RGB_2_LAB", + "tri3d-adjust-neck", + "tri3d-atr-parse", + "tri3d-atr-parse-batch", + "tri3d-bgremove-mega", + "tri3d-clear-memory", + "tri3d-clipdrop-bgremove-api", + "tri3d-clipdrop-bgreplace-api", + "tri3d-composite-image-splitter", + "tri3d-dwpose", + "tri3d-extract-hand", + "tri3d-extract-masks-batch", + "tri3d-extract-parts-batch", + "tri3d-extract-parts-batch2", + "tri3d-extract-parts-mask-batch", + "tri3d-extract-pascal-parts-batch", + "tri3d-face-recognise", + "tri3d-facer_face_segment", + "tri3d-flexible_color_extract", + "tri3d-float-to-image", + "tri3d-fuzzification", + "tri3d-get_histogram_limits", + "tri3d-get_mean_and_standard_deviation", + "tri3d-get_threshold_for_bg_swap", + "tri3d-image-mask-2-box", + "tri3d-image-mask-box-2-image", + "tri3d-interaction-canny", + "tri3d-levindabhi-cloth-seg", + "tri3d-load-pose-json", + "tri3d-load_AEMatter_Model", + "tri3d-load_MVANet_Model", + "tri3d-luminosity-match", + "tri3d-main_transparent_background", + "tri3d-photoroom-bgremove-api", + "tri3d-pose-adaption", + "tri3d-pose-to-image", + "tri3d-position-hands", + "tri3d-position-parts-batch", + "tri3d-position-pascal-parts-batch", + "tri3d-recolor-mask", + "tri3d-recolor-mask-LAB_space", + "tri3d-recolor-mask-LAB_space_manual", + "tri3d-recolor-mask-RGB_space", + "tri3d-renormalize_array", + "tri3d-run_AEMatter_inference", + "tri3d-run_MVANet_inference", + "tri3d-scaled-paste", + "tri3d-simple_bg_swap", + "tri3d-simple_rescale_histogram", + "tri3d-skin-feathered-padded-mask", + "tri3d-swap-pixels" + ], + { + "title_aux": "tri3d-comfyui-nodes" + } + ], + "https://github.com/TW-CUI/TW-CUI-Util": [ + [ + "TWCUI_Util_CommonSDXLResolutions", + "TWCUI_Util_FloatLiteral", + "TWCUI_Util_GenerationParameters", + "TWCUI_Util_GenerationPrompts", + "TWCUI_Util_IntLiteral", + "TWCUI_Util_ModelVAELORALoader", + "TWCUI_Util_ModelVAELoader", + "TWCUI_Util_MultilineStringLiteral", + "TWCUI_Util_SaveImage", + "TWCUI_Util_SaveImageAdvanced", + "TWCUI_Util_StringLiteral" + ], + { + "title_aux": "TW-CUI-Util" + } + ], + "https://github.com/TaiTair/comfyui-simswap": [ + [ + "Simswap", + "SimswapBuildFaceModel", + "SimswapFaceSwapOpt", + "SimswapImageDublicator", + "SimswapLoadFaceModel", + "SimswapMaskHelper", + "SimswapOptions", + "SimswapRestoreFace", + "SimswapSaveFaceModel" + ], + { + "title_aux": "Simswap Node for ComfyUI" + } + ], + "https://github.com/Taremin/comfyui-prompt-extranetworks": [ + [ + "PromptExtraNetworks" + ], + { + "title_aux": "ComfyUI Prompt ExtraNetworks" + } + ], + "https://github.com/Taremin/comfyui-string-tools": [ + [ + "StringToolsBalancedChoice", + "StringToolsConcat", + "StringToolsRandomChoice", + "StringToolsString", + "StringToolsText" + ], + { + "title_aux": "ComfyUI String Tools" + } + ], + "https://github.com/Taremin/webui-monaco-prompt": [ + [ + "WebuiMonacoPromptFind", + "WebuiMonacoPromptReplace" + ], + { + "title_aux": "WebUI Monaco Prompt" + } + ], + "https://github.com/TeaCrab/ComfyUI-TeaNodes": [ + [ + "TC_ColorFill", + "TC_CropTo", + "TC_EqualizeCLAHE", + "TC_ImageResize", + "TC_ImageScale", + "TC_KorniaGamma", + "TC_RandomColorFill", + "TC_SizeApproximation" + ], + { + "title_aux": "ComfyUI-TeaNodes" + } + ], + "https://github.com/TemryL/ComfyS3": [ + [ + "DownloadFileS3", + "LoadImageS3", + "SaveImageS3", + "SaveVideoFilesS3", + "UploadFileS3" + ], + { + "title_aux": "ComfyS3" + } + ], + "https://github.com/TemryL/ComfyUI-IDM-VTON": [ + [ + "IDM-VTON", + "PipelineLoader" + ], + { + "title_aux": "ComfyUI-IDM-VTON [WIP]" + } + ], + "https://github.com/TencentQQGYLab/ComfyUI-ELLA": [ + [ + "CombineClipEllaEmbeds", + "ConcatConditionEllaEmbeds", + "ConditionToEllaEmbeds", + "ELLALoader", + "EllaApply", + "EllaCombineEmbeds", + "EllaEncode", + "EllaTextEncode", + "SetEllaTimesteps", + "T5TextEncode #ELLA", + "T5TextEncoderLoader #ELLA" + ], + { + "title_aux": "ComfyUI-ELLA" + } + ], + "https://github.com/TheBarret/ZSuite": [ + [ + "ZSuite: Prompter", + "ZSuite: RF Noise", + "ZSuite: SeedMod" + ], + { + "title_aux": "ZSuite" + } + ], + "https://github.com/TheBill2001/comfyui-upscale-by-model": [ + [ + "UpscaleImageByUsingModel" + ], + { + "author": "Tr\u1ea7n Nam Tu\u1ea5n", + "description": "This custom node allow upscaling an image by a factor using a model.", + "nickname": "Upscale Image By (Using Model)", + "title": "Upscale Image By (Using Model)", + "title_aux": "comfyui-upscale-by-model" + } + ], + "https://github.com/TheMistoAI/ComfyUI-Anyline": [ + [ + "AnyLinePreprocessor" + ], + { + "title_aux": "Anyline" + } + ], + "https://github.com/ThereforeGames/ComfyUI-Unprompted": [ + [ + "Unprompted" + ], + { + "title_aux": "ComfyUI-Unprompted" + } + ], + "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": [ + [ + "ttN KSampler_v2", + "ttN advPlot combo", + "ttN advPlot range", + "ttN advPlot string", + "ttN advanced xyPlot", + "ttN compareInput", + "ttN concat", + "ttN conditioning", + "ttN debugInput", + "ttN float", + "ttN hiresfixScale", + "ttN imageOutput", + "ttN imageREMBG", + "ttN int", + "ttN multiModelMerge", + "ttN pipe2BASIC", + "ttN pipe2DETAILER", + "ttN pipeEDIT", + "ttN pipeEncodeConcat", + "ttN pipeIN", + "ttN pipeKSampler", + "ttN pipeKSamplerAdvanced", + "ttN pipeKSamplerAdvanced_v2", + "ttN pipeKSamplerSDXL", + "ttN pipeKSamplerSDXL_v2", + "ttN pipeKSampler_v2", + "ttN pipeLoader", + "ttN pipeLoaderSDXL", + "ttN pipeLoaderSDXL_v2", + "ttN pipeLoader_v2", + "ttN pipeLoraStack", + "ttN pipeOUT", + "ttN seed", + "ttN text", + "ttN text3BOX_3WAYconcat", + "ttN text7BOX_concat", + "ttN textCycleLine", + "ttN textDebug", + "ttN tinyLoader", + "ttN xyPlot" + ], + { + "author": "tinyterra", + "description": "This extension offers extensive xyPlot, various pipe nodes, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more.", + "nickname": "\ud83c\udf0f", + "nodename_pattern": "^ttN ", + "title": "tinyterraNodes", + "title_aux": "ComfyUI_tinyterraNodes" + } + ], + "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": [ + [ + "menus" + ], + { + "title_aux": "ComfyUI_MileHighStyler" + } + ], + "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": [ + [ + "EmbeddingPicker" + ], + { + "title_aux": "Embedding Picker" + } + ], + "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": [ + [ + "YARS", + "YARSAdv" + ], + { + "title_aux": "YARS: Yet Another Resolution Selector" + } + ], + "https://github.com/Trung0246/ComfyUI-0246": [ + [ + "0246.Beautify", + "0246.BoxRange", + "0246.CastReroute", + "0246.Cloud", + "0246.Convert", + "0246.Count", + "0246.Highway", + "0246.HighwayBatch", + "0246.Hold", + "0246.Hub", + "0246.Junction", + "0246.JunctionBatch", + "0246.Loop", + "0246.Merge", + "0246.Meta", + "0246.Pick", + "0246.RandomInt", + "0246.Script", + "0246.ScriptNode", + "0246.ScriptPile", + "0246.ScriptRule", + "0246.Stringify", + "0246.Switch", + "0246.Tag" + ], + { + "author": "Trung0246", + "description": "Random nodes for ComfyUI I made to solve my struggle with ComfyUI (ex: pipe, process). Have varying quality.", + "nickname": "ComfyUI-0246", + "title": "ComfyUI-0246", + "title_aux": "ComfyUI-0246" + } + ], + "https://github.com/Ttl/ComfyUi_NNLatentUpscale": [ + [ + "NNLatentUpscale" + ], + { + "preemptions": [ + "NNLatentUpscale" + ], + "title_aux": "ComfyUI Neural Network Latent Upscale" + } + ], + "https://github.com/TylerZoro/SD3-Scaling": [ + [ + "SD3ImageScaleToTotalPixels" + ], + { + "title_aux": "SD3-Scaling" + } + ], + "https://github.com/Umikaze-job/select_folder_path_easy": [ + [ + "SelectFolderPathEasy" + ], + { + "title_aux": "select_folder_path_easy" + } + ], + "https://github.com/VAST-AI-Research/ComfyUI-Tripo": [ + [ + "TripoAPIImageToMeshNode", + "TripoAPITextToMeshNode", + "TripoGLBViewer" + ], + { + "title_aux": "Tripo for ComfyUI" + } + ], + "https://github.com/WASasquatch/ASTERR": [ + [ + "ASTERR", + "SaveASTERR" + ], + { + "title_aux": "ASTERR" + } + ], + "https://github.com/WASasquatch/ComfyUI_Preset_Merger": [ + [ + "Preset_Model_Merge" + ], + { + "title_aux": "ComfyUI Preset Merger" + } + ], + "https://github.com/WASasquatch/FreeU_Advanced": [ + [ + "FreeU (Advanced)", + "FreeU_V2 (Advanced)" + ], + { + "title_aux": "FreeU_Advanced" + } + ], + "https://github.com/WASasquatch/PPF_Noise_ComfyUI": [ + [ + "Blend Latents (PPF Noise)", + "Cross-Hatch Power Fractal (PPF Noise)", + "Images as Latents (PPF Noise)", + "Perlin Power Fractal Latent (PPF Noise)" + ], + { + "title_aux": "PPF_Noise_ComfyUI" + } + ], + "https://github.com/WASasquatch/PowerNoiseSuite": [ + [ + "Blend Latents (PPF Noise)", + "Cross-Hatch Power Fractal (PPF Noise)", + "Cross-Hatch Power Fractal Settings (PPF Noise)", + "Images as Latents (PPF Noise)", + "Latent Adjustment (PPF Noise)", + "Latents to CPU (PPF Noise)", + "Linear Cross-Hatch Power Fractal (PPF Noise)", + "Perlin Power Fractal Latent (PPF Noise)", + "Perlin Power Fractal Settings (PPF Noise)", + "Power KSampler Advanced (PPF Noise)", + "Power-Law Noise (PPF Noise)" + ], + { + "title_aux": "Power Noise Suite for ComfyUI" + } + ], + "https://github.com/WASasquatch/WAS_Extras": [ + [ + "BLVAEEncode", + "CLIPTextEncodeList", + "CLIPTextEncodeSequence2", + "ConditioningBlend", + "DebugInput", + "KSamplerSeq", + "KSamplerSeq2", + "VAEEncodeForInpaint (WAS)", + "VividSharpen" + ], + { + "title_aux": "WAS_Extras" + } + ], + "https://github.com/WASasquatch/was-node-suite-comfyui": [ + [ + "BLIP Analyze Image", + "BLIP Model Loader", + "Blend Latents", + "Boolean To Text", + "Bounded Image Blend", + "Bounded Image Blend with Mask", + "Bounded Image Crop", + "Bounded Image Crop with Mask", + "Bus Node", + "CLIP Input Switch", + "CLIP Vision Input Switch", + "CLIPSeg Batch Masking", + "CLIPSeg Masking", + "CLIPSeg Model Loader", + "CLIPTextEncode (BlenderNeko Advanced + NSP)", + "CLIPTextEncode (NSP)", + "Cache Node", + "Checkpoint Loader", + "Checkpoint Loader (Simple)", + "Conditioning Input Switch", + "Constant Number", + "Control Net Model Input Switch", + "Convert Masks to Images", + "Create Grid Image", + "Create Grid Image from Batch", + "Create Morph Image", + "Create Morph Image from Path", + "Create Video from Path", + "Debug Number to Console", + "Dictionary to Console", + "Diffusers Hub Model Down-Loader", + "Diffusers Model Loader", + "Export API", + "HSL to Hex", + "Hex to HSL", + "Image Analyze", + "Image Aspect Ratio", + "Image Batch", + "Image Blank", + "Image Blend", + "Image Blend by Mask", + "Image Blending Mode", + "Image Bloom Filter", + "Image Bounds", + "Image Bounds to Console", + "Image Canny Filter", + "Image Chromatic Aberration", + "Image Color Palette", + "Image Crop Face", + "Image Crop Location", + "Image Crop Square Location", + "Image Displacement Warp", + "Image Dragan Photography Filter", + "Image Edge Detection Filter", + "Image Film Grain", + "Image Filter Adjustments", + "Image Flip", + "Image Generate Gradient", + "Image Gradient Map", + "Image High Pass Filter", + "Image History Loader", + "Image Input Switch", + "Image Levels Adjustment", + "Image Load", + "Image Lucy Sharpen", + "Image Median Filter", + "Image Mix RGB Channels", + "Image Monitor Effects Filter", + "Image Nova Filter", + "Image Padding", + "Image Paste Crop", + "Image Paste Crop by Location", + "Image Paste Face", + "Image Perlin Noise", + "Image Perlin Power Fractal", + "Image Pixelate", + "Image Power Noise", + "Image Rembg (Remove Background)", + "Image Remove Background (Alpha)", + "Image Remove Color", + "Image Resize", + "Image Rotate", + "Image Rotate Hue", + "Image SSAO (Ambient Occlusion)", + "Image SSDO (Direct Occlusion)", + "Image Save", + "Image Seamless Texture", + "Image Select Channel", + "Image Select Color", + "Image Send HTTP", + "Image Shadows and Highlights", + "Image Size to Number", + "Image Stitch", + "Image Style Filter", + "Image Threshold", + "Image Tiled", + "Image Transpose", + "Image Voronoi Noise Filter", + "Image fDOF Filter", + "Image to Latent Mask", + "Image to Noise", + "Image to Seed", + "Images to Linear", + "Images to RGB", + "Inset Image Bounds", + "Integer place counter", + "KSampler (WAS)", + "KSampler Cycle", + "Latent Batch", + "Latent Input Switch", + "Latent Noise Injection", + "Latent Size to Number", + "Latent Upscale by Factor (WAS)", + "Load Cache", + "Load Image Batch", + "Load Lora", + "Load Text File", + "Logic Boolean", + "Logic Boolean Primitive", + "Logic Comparison AND", + "Logic Comparison OR", + "Logic Comparison XOR", + "Logic NOT", + "Lora Input Switch", + "Lora Loader", + "Mask Arbitrary Region", + "Mask Batch", + "Mask Batch to Mask", + "Mask Ceiling Region", + "Mask Crop Dominant Region", + "Mask Crop Minority Region", + "Mask Crop Region", + "Mask Dilate Region", + "Mask Dominant Region", + "Mask Erode Region", + "Mask Fill Holes", + "Mask Floor Region", + "Mask Gaussian Region", + "Mask Invert", + "Mask Minority Region", + "Mask Paste Region", + "Mask Smooth Region", + "Mask Threshold Region", + "Masks Add", + "Masks Combine Batch", + "Masks Combine Regions", + "Masks Subtract", + "MiDaS Depth Approximation", + "MiDaS Mask Image", + "MiDaS Model Loader", + "Model Input Switch", + "Number Counter", + "Number Input Condition", + "Number Input Switch", + "Number Multiple Of", + "Number Operation", + "Number PI", + "Number to Float", + "Number to Int", + "Number to Seed", + "Number to String", + "Number to Text", + "Prompt Multiple Styles Selector", + "Prompt Styles Selector", + "Random Number", + "SAM Image Mask", + "SAM Model Loader", + "SAM Parameters", + "SAM Parameters Combine", + "Samples Passthrough (Stat System)", + "Save Text File", + "Seed", + "String to Text", + "Tensor Batch to Image", + "Text Add Token by Input", + "Text Add Tokens", + "Text Compare", + "Text Concatenate", + "Text Contains", + "Text Dictionary Convert", + "Text Dictionary Get", + "Text Dictionary Keys", + "Text Dictionary New", + "Text Dictionary To Text", + "Text Dictionary Update", + "Text File History Loader", + "Text Find", + "Text Find and Replace", + "Text Find and Replace Input", + "Text Find and Replace by Dictionary", + "Text Input Switch", + "Text List", + "Text List Concatenate", + "Text List to Text", + "Text Load Line From File", + "Text Multiline", + "Text Multiline (Code Compatible)", + "Text Parse A1111 Embeddings", + "Text Parse Noodle Soup Prompts", + "Text Parse Tokens", + "Text Random Line", + "Text Random Prompt", + "Text Shuffle", + "Text Sort", + "Text String", + "Text String Truncate", + "Text to Conditioning", + "Text to Console", + "Text to Number", + "Text to String", + "True Random.org Number Generator", + "Upscale Model Loader", + "Upscale Model Switch", + "VAE Input Switch", + "Video Dump Frames", + "Write to GIF", + "Write to Video", + "unCLIP Checkpoint Loader" + ], + { + "title_aux": "WAS Node Suite" + } + ], + "https://github.com/WebDev9000/WebDev9000-Nodes": [ + [ + "IgnoreBraces", + "SettingsSwitch" + ], + { + "title_aux": "WebDev9000-Nodes" + } + ], + "https://github.com/Wicloz/ComfyUI-Simply-Nodes": [ + [ + "WF_ConditionalLoraLoader", + "WF_MultilineText", + "WF_RandomStyle", + "WF_ResolutionSDXL", + "WF_TextFlow" + ], + { + "title_aux": "ComfyUI Simply Nodes" + } + ], + "https://github.com/XmYx/deforum-comfy-nodes": [ + [ + "DeforumAddNoiseNode", + "DeforumAnimParamsNode", + "DeforumAreaPromptNode", + "DeforumBaseParamsNode", + "DeforumCacheLatentNode", + "DeforumCadenceNode", + "DeforumCadenceParamsNode", + "DeforumColorMatchNode", + "DeforumColorParamsNode", + "DeforumConditioningBlendNode", + "DeforumDepthParamsNode", + "DeforumDiffusionParamsNode", + "DeforumFILMInterpolationNode", + "DeforumFrameWarpNode", + "DeforumGetCachedLatentNode", + "DeforumHybridMotionNode", + "DeforumHybridParamsNode", + "DeforumHybridScheduleNode", + "DeforumIteratorNode", + "DeforumKSampler", + "DeforumLoadVideo", + "DeforumNoiseParamsNode", + "DeforumPromptNode", + "DeforumSeedNode", + "DeforumSetVAEDownscaleRatioNode", + "DeforumSimpleInterpolationNode", + "DeforumSingleSampleNode", + "DeforumTranslationParamsNode", + "DeforumVideoSaveNode" + ], + { + "title_aux": "Deforum Nodes" + } + ], + "https://github.com/Xyem/Xycuno-Oobabooga": [ + [ + "Oobabooga" + ], + { + "title_aux": "Xycuno Oobabooga" + } + ], + "https://github.com/YMC-GitHub/ymc-node-suite-comfyui": [ + [ + "canvas-util-cal-size", + "conditioning-util-input-switch", + "cutoff-region-util", + "hks-util-cal-denoise-step", + "img-util-get-image-size", + "img-util-switch-input-image", + "io-image-save", + "io-text-save", + "io-util-file-list-get", + "io-util-file-list-get-text", + "number-util-random-num", + "pipe-util-to-basic-pipe", + "region-util-get-by-center-and-size", + "region-util-get-by-lt", + "region-util-get-crop-location-from-center-size-text", + "region-util-get-pad-out-location-by-size", + "text-preset-colors", + "text-util-join-text", + "text-util-loop-text", + "text-util-path-list", + "text-util-prompt-add-prompt", + "text-util-prompt-adv-dup", + "text-util-prompt-adv-search", + "text-util-prompt-del", + "text-util-prompt-dup", + "text-util-prompt-join", + "text-util-prompt-search", + "text-util-prompt-shuffle", + "text-util-prompt-std", + "text-util-prompt-unweight", + "text-util-random-text", + "text-util-search-text", + "text-util-show-text", + "text-util-switch-text", + "xyz-util-txt-to-int" + ], + { + "title_aux": "ymc-node-suite-comfyui" + } + ], + "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": [ + [ + "Example", + "TacoAnimatedLoader", + "TacoGifMaker", + "TacoImg2ImgAnimatedLoader", + "TacoImg2ImgAnimatedProcessor", + "TacoLatent" + ], + { + "title_aux": "ComfyUI-TacoNodes" + } + ], + "https://github.com/Yanick112/ComfyUI-ToSVG": [ + [ + "ConvertRasterToVector", + "SaveSVG" + ], + { + "title_aux": "ComfyUI-ToSVG" + } + ], + "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI": [ + [ + "MergeBlockWeighted" + ], + { + "title_aux": "MergeBlockWeighted_fo_ComfyUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": [ + [ + "APISR_Lterative_Zho", + "APISR_ModelLoader_Zho", + "APISR_Zho" + ], + { + "title_aux": "APISR IN COMFYUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": [ + [ + "AOI_Processing_Zho" + ], + { + "title_aux": "ComfyUI-Animated-optical-illusions" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": [ + [ + "ArtGallery_Zho", + "ArtistsImage_Zho", + "CamerasImage_Zho", + "FilmsImage_Zho", + "MovementsImage_Zho", + "StylesImage_Zho" + ], + { + "title_aux": "ComfyUI-ArtGallery" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": [ + [ + "BRIA_RMBG_ModelLoader_Zho", + "BRIA_RMBG_Zho" + ], + { + "title_aux": "ComfyUI-BRIA_AI-RMBG" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": [ + [ + "BiRefNet_ModelLoader_Zho", + "BiRefNet_Zho" + ], + { + "title_aux": "ComfyUI-BiRefNet-ZHO" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": [ + [ + "DepthFM_Literative_Zho", + "DepthFM_ModelLoader_Zho", + "DepthFM_Zho" + ], + { + "title_aux": "DepthFM IN COMFYUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": [ + [ + "ConcatText_Zho", + "DisplayText_Zho", + "Gemini_15P_API_S_Advance_Zho", + "Gemini_15P_API_S_Chat_Advance_Zho", + "Gemini_API_Chat_Zho", + "Gemini_API_S_Chat_Zho", + "Gemini_API_S_Vsion_ImgURL_Zho", + "Gemini_API_S_Zho", + "Gemini_API_Vsion_ImgURL_Zho", + "Gemini_API_Zho", + "Gemini_FileUpload_API_S_Zho", + "Gemini_File_API_S_Zho" + ], + { + "title_aux": "ComfyUI-Gemini" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": [ + [ + "IDBaseModelLoader_fromhub", + "IDBaseModelLoader_local", + "IDControlNetLoader", + "IDGenerationNode", + "ID_Prompt_Styler", + "InsightFaceLoader_Zho", + "Ipadapter_instantidLoader" + ], + { + "title_aux": "ComfyUI-InstantID" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": [ + [ + "Phi3mini_4k_Chat_Zho", + "Phi3mini_4k_ModelLoader_Zho", + "Phi3mini_4k_Zho" + ], + { + "title_aux": "Phi-3-mini in ComfyUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": [ + [ + "BaseModel_Loader_fromhub", + "BaseModel_Loader_local", + "LoRALoader", + "NEW_PhotoMaker_Generation", + "PhotoMakerAdapter_Loader_fromhub", + "PhotoMakerAdapter_Loader_local", + "PhotoMaker_Generation", + "Prompt_Styler", + "Ref_Image_Preprocessing" + ], + { + "title_aux": "ComfyUI PhotoMaker (ZHO)" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": [ + [ + "PA_BaseModelLoader_fromhub_Zho", + "PA_Generation_Zho", + "PA_Styler_Zho" + ], + { + "title_aux": "ComfyUI-PixArt-alpha-Diffusers" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": [ + [ + "QAlign_Zho" + ], + { + "title_aux": "ComfyUI-Q-Align" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": [ + [ + "Qwen2_Chat_Zho", + "Qwen2_ModelLoader_Zho", + "Qwen2_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-2" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [ + [ + "QWenVL_API_S_Multi_Zho", + "QWenVL_API_S_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-VL-API" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": [ + [ + "SVD_Aspect_Ratio_Zho", + "SVD_Steps_MotionStrength_Seed_Zho", + "SVD_Styler_Zho" + ], + { + "title_aux": "ComfyUI-SVD-ZHO (WIP)" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": [ + [ + "SMoE_Generation_Zho", + "SMoE_ModelLoader_Zho" + ], + { + "title_aux": "ComfyUI SegMoE" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": [ + [ + "AlphaChanelAddByMask", + "ImageCompositeBy_BG_Zho", + "ImageCompositeBy_Zho", + "ImageComposite_BG_Zho", + "ImageComposite_Zho", + "RGB_Image_Zho", + "Text_Image_Frame_Zho", + "Text_Image_Multiline_Zho", + "Text_Image_Zho" + ], + { + "title_aux": "ComfyUI-Text_Image-Composite [WIP]" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": [ + [ + "ESAM_ModelLoader_Zho", + "Yoloworld_ESAM_DetectorProvider_Zho", + "Yoloworld_ESAM_Zho", + "Yoloworld_ModelLoader_Zho" + ], + { + "title_aux": "ComfyUI YoloWorld-EfficientSAM" + } + ], + "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": [ + [ + "PortraitMaster_\u4e2d\u6587\u7248" + ], + { + "title_aux": "comfyui-portrait-master-zh-cn" + } + ], + "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ": [ + [ + "VideoFormatConverter" + ], + { + "title_aux": "ZZX Nodes" + } + ], + "https://github.com/ZaneA/ComfyUI-ImageReward": [ + [ + "ImageRewardLoader", + "ImageRewardScore" + ], + { + "title_aux": "ImageReward" + } + ], + "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": [ + [ + "EmbeddingsNameLoader", + "EmbendingList" + ], + { + "title_aux": "ComfyUI-Embeddings-Tools" + } + ], + "https://github.com/a1lazydog/ComfyUI-AudioScheduler": [ + [ + "AmplitudeToGraph", + "AmplitudeToNumber", + "AudioToAmplitudeGraph", + "AudioToFFTs", + "BatchAmplitudeSchedule", + "ClipAmplitude", + "FloatArrayToGraph", + "GateNormalizedAmplitude", + "LoadAudio", + "LoadVHSAudio", + "NormalizeAmplitude", + "NormalizedAmplitudeDrivenString", + "NormalizedAmplitudeToGraph", + "NormalizedAmplitudeToNumber", + "TransientAmplitudeBasic" + ], + { + "title_aux": "ComfyUI-AudioScheduler" + } + ], + "https://github.com/aburahamu/ComfyUI-IsNiceParts": [ + [ + "NiceHand" + ], + { + "title_aux": "ComfyUI-IsNiceParts" + } + ], + "https://github.com/aburahamu/ComfyUI-RequestsPoster": [ + [ + "GetImageFromSD3byI2I", + "GetImageFromSD3byT2I", + "PostImage2Discord", + "PostImage2X", + "PostText" + ], + { + "title_aux": "ComfyUI-RequestPoster" + } + ], + "https://github.com/abyz22/image_control": [ + [ + "abyz22_AddPrompt", + "abyz22_Convertpipe", + "abyz22_Editpipe", + "abyz22_FirstNonNull", + "abyz22_FromBasicPipe_v2", + "abyz22_Frompipe", + "abyz22_ImpactWildcardEncode", + "abyz22_ImpactWildcardEncode_GetPrompt", + "abyz22_Ksampler", + "abyz22_Padding Image", + "abyz22_RandomMask", + "abyz22_RemoveControlnet", + "abyz22_ResizeOpenpose", + "abyz22_SaveImage", + "abyz22_SetQueue", + "abyz22_ToBasicPipe", + "abyz22_Topipe", + "abyz22_blend_onecolor", + "abyz22_blendimages", + "abyz22_bypass", + "abyz22_censoring", + "abyz22_drawmask", + "abyz22_lamaInpaint", + "abyz22_lamaPreprocessor", + "abyz22_makecircles", + "abyz22_setimageinfo", + "abyz22_smallhead" + ], + { + "title_aux": "image_control" + } + ], + "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": [ + [ + "DownloadLinkChecker", + "ShowFileNames" + ], + { + "title_aux": "ComfyUI-TrashNodes-DownloadHuggingface" + } + ], + "https://github.com/adieyal/comfyui-dynamicprompts": [ + [ + "DPCombinatorialGenerator", + "DPFeelingLucky", + "DPJinja", + "DPMagicPrompt", + "DPOutput", + "DPRandomGenerator" + ], + { + "title_aux": "DynamicPrompts Custom Nodes" + } + ], + "https://github.com/adigayung/ComfyUI-Translator": [ + [ + "CLIP Text Encode (Auto Translate)" + ], + { + "title_aux": "ComfyUI-Translator" + } + ], + "https://github.com/adriflex/ComfyUI_Blender_Texdiff": [ + [ + "ViewportColor", + "ViewportDepth" + ], + { + "title_aux": "ComfyUI_Blender_Texdiff" + } + ], + "https://github.com/aegis72/aegisflow_utility_nodes": [ + [ + "Add Text To Image", + "Aegisflow CLIP Pass", + "Aegisflow Conditioning Pass", + "Aegisflow Image Pass", + "Aegisflow Latent Pass", + "Aegisflow Mask Pass", + "Aegisflow Model Pass", + "Aegisflow Pos/Neg Pass", + "Aegisflow SDXL Tuple Pass", + "Aegisflow VAE Pass", + "Aegisflow controlnet preprocessor bus", + "Apply Instagram Filter", + "Binary INT Switch", + "Brightness_Contrast_Ally", + "Flatten Colors", + "Gaussian Blur_Ally", + "GlitchThis Effect", + "Hue Rotation", + "Image Flip_ally", + "Placeholder Tuple", + "Swap Color Mode", + "aegisflow Multi_Pass", + "aegisflow Multi_Pass XL", + "af_pipe_in_15", + "af_pipe_in_xl", + "af_pipe_out_15", + "af_pipe_out_xl" + ], + { + "title_aux": "AegisFlow Utility Nodes" + } + ], + "https://github.com/aegis72/comfyui-styles-all": [ + [ + "menus" + ], + { + "title_aux": "ComfyUI-styles-all" + } + ], + "https://github.com/ai-liam/comfyui-liam": [ + [ + "AiStoreAzureGPTLiam", + "GetBetterDepthImage", + "LiamLibDisplayText", + "LiamLibFillImage", + "LiamLibImageToGray", + "LiamLibLoadImage", + "LiamLibMergeText", + "LiamLibSaveImg", + "LiamLibSaveText", + "OllamaApiTNodeLiam", + "PreviewReliefImage", + "SpeechRecognitionLiam", + "SpeechSynthesisLiam" + ], + { + "title_aux": "LiamUtil" + } + ], + "https://github.com/ai-liam/comfyui_liam_util": [ + [ + "LiamLoadImage" + ], + { + "title_aux": "LiamUtil (single node)" + } + ], + "https://github.com/aianimation55/ComfyUI-FatLabels": [ + [ + "FatLabels" + ], + { + "title_aux": "Comfy UI FatLabels" + } + ], + "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": [ + [ + "CascadeResolutions" + ], + { + "title_aux": "ComfyUI-CascadeResolutions" + } + ], + "https://github.com/alessandrozonta/ComfyUI-CenterNode": [ + [ + "BBoxCrop" + ], + { + "title_aux": "Bounding Box Crop Node for ComfyUI" + } + ], + "https://github.com/alessandrozonta/ComfyUI-Layers": [ + [ + "LayersSaver - Save Layer", + "LayersSaver - Save Layer From Images" + ], + { + "title_aux": "Save Layers Node for ComfyUI" + } + ], + "https://github.com/alessandrozonta/ComfyUI-OpenPose": [ + [ + "OpenPose - Get poses" + ], + { + "author": "joe", + "title_aux": "OpenPose Node" + } + ], + "https://github.com/alexopus/ComfyUI-Image-Saver": [ + [ + "Cfg Literal (Image Saver)", + "Checkpoint Loader with Name (Image Saver)", + "Float Literal (Image Saver)", + "Image Saver", + "Int Literal (Image Saver)", + "Sampler Selector (Image Saver)", + "Scheduler Selector (Comfy) (Image Saver)", + "Scheduler Selector (Image Saver)", + "SchedulerComfyToString (Image Saver)", + "SchedulerToString (Image Saver)", + "Seed Generator (Image Saver)", + "String Literal (Image Saver)", + "Width/Height Literal (Image Saver)" + ], + { + "title_aux": "ComfyUI Image Saver" + } + ], + "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": [ + [ + "InputText", + "OllamaImageDescriber", + "OllamaTextDescriber", + "ShowText", + "TextTransformer" + ], + { + "title_aux": "ComfyUI-Ollama-Describer" + } + ], + "https://github.com/alpertunga-bile/prompt-generator-comfyui": [ + [ + "Prompt Generator" + ], + { + "title_aux": "prompt-generator" + } + ], + "https://github.com/alsritter/asymmetric-tiling-comfyui": [ + [ + "Asymmetric_Tiling_KSampler" + ], + { + "title_aux": "asymmetric-tiling-comfyui" + } + ], + "https://github.com/alt-key-project/comfyui-dream-project": [ + [ + "Analyze Palette [Dream]", + "Beat Curve [Dream]", + "Big Float Switch [Dream]", + "Big Image Switch [Dream]", + "Big Int Switch [Dream]", + "Big Latent Switch [Dream]", + "Big Palette Switch [Dream]", + "Big Text Switch [Dream]", + "Boolean To Float [Dream]", + "Boolean To Int [Dream]", + "Build Prompt [Dream]", + "CSV Curve [Dream]", + "CSV Generator [Dream]", + "Calculation [Dream]", + "Common Frame Dimensions [Dream]", + "Compare Palettes [Dream]", + "FFMPEG Video Encoder [Dream]", + "File Count [Dream]", + "Finalize Prompt [Dream]", + "Float Input [Dream]", + "Float to Log Entry [Dream]", + "Frame Count Calculator [Dream]", + "Frame Counter (Directory) [Dream]", + "Frame Counter (Simple) [Dream]", + "Frame Counter Info [Dream]", + "Frame Counter Offset [Dream]", + "Frame Counter Time Offset [Dream]", + "Image Brightness Adjustment [Dream]", + "Image Color Shift [Dream]", + "Image Contrast Adjustment [Dream]", + "Image Motion [Dream]", + "Image Sequence Blend [Dream]", + "Image Sequence Loader [Dream]", + "Image Sequence Saver [Dream]", + "Image Sequence Tweening [Dream]", + "Int Input [Dream]", + "Int to Log Entry [Dream]", + "Laboratory [Dream]", + "Linear Curve [Dream]", + "Log Entry Joiner [Dream]", + "Log File [Dream]", + "Noise from Area Palettes [Dream]", + "Noise from Palette [Dream]", + "Palette Color Align [Dream]", + "Palette Color Shift [Dream]", + "Sample Image Area as Palette [Dream]", + "Sample Image as Palette [Dream]", + "Saw Curve [Dream]", + "Sine Curve [Dream]", + "Smooth Event Curve [Dream]", + "String Input [Dream]", + "String Tokenizer [Dream]", + "String to Log Entry [Dream]", + "Text Input [Dream]", + "Triangle Curve [Dream]", + "Triangle Event Curve [Dream]", + "WAV Curve [Dream]" + ], + { + "title_aux": "Dream Project Animation Nodes" + } + ], + "https://github.com/alt-key-project/comfyui-dream-video-batches": [ + [ + "Blended Transition [DVB]", + "Calculation [DVB]", + "Create Frame Set [DVB]", + "Divide [DVB]", + "Fade From Black [DVB]", + "Fade To Black [DVB]", + "Float Input [DVB]", + "For Each Done [DVB]", + "For Each Filename [DVB]", + "Frame Set Append [DVB]", + "Frame Set Frame Dimensions Scaled [DVB]", + "Frame Set Index Offset [DVB]", + "Frame Set Merger [DVB]", + "Frame Set Reindex [DVB]", + "Frame Set Repeat [DVB]", + "Frame Set Reverse [DVB]", + "Frame Set Split Beginning [DVB]", + "Frame Set Split End [DVB]", + "Frame Set Splitter [DVB]", + "Generate Inbetween Frames [DVB]", + "Int Input [DVB]", + "Linear Camera Pan [DVB]", + "Linear Camera Roll [DVB]", + "Linear Camera Zoom [DVB]", + "Load Image From Path [DVB]", + "Multiply [DVB]", + "Sine Camera Pan [DVB]", + "Sine Camera Roll [DVB]", + "Sine Camera Zoom [DVB]", + "String Input [DVB]", + "Text Input [DVB]", + "Trace Memory Allocation [DVB]", + "Unwrap Frame Set [DVB]" + ], + { + "title_aux": "Dream Video Batches" + } + ], + "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": [ + [ + "CLIPTextEncode (RE)", + "CLIPTextEncodeSDXL (RE)", + "CLIPTextEncodeSDXLRefiner (RE)", + "Int (RE)", + "RErouter <=", + "RErouter =>", + "String (RE)" + ], + { + "title_aux": "ComfyUI_RErouter_CustomNodes" + } + ], + "https://github.com/andersxa/comfyui-PromptAttention": [ + [ + "CLIPAttentionMaskEncode" + ], + { + "title_aux": "CLIP Directional Prompt Attention" + } + ], + "https://github.com/angeloshredder/StableCascadeResizer": [ + [ + "CascadeResize" + ], + { + "title_aux": "StableCascadeResizer" + } + ], + "https://github.com/ansonkao/comfyui-geometry": [ + [ + "TransformTemplateOntoFaceMask" + ], + { + "author": "Anson Kao", + "description": "A small collection of custom nodes for use with ComfyUI, by Discopixel", + "nickname": "ComfyUI Discopixel", + "title": "ComfyUI Discopixel", + "title_aux": "comfyui-geometry" + } + ], + "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": [ + [ + "composite", + "crop", + "paste", + "preview_mask", + "scale" + ], + { + "title_aux": "antrobots ComfyUI Nodepack" + } + ], + "https://github.com/asagi4/ComfyUI-Adaptive-Guidance": [ + [ + "AdaptiveGuidance" + ], + { + "title_aux": "Adaptive Guidance for ComfyUI" + } + ], + "https://github.com/asagi4/ComfyUI-CADS": [ + [ + "CADS" + ], + { + "title_aux": "ComfyUI-CADS" + } + ], + "https://github.com/asagi4/comfyui-prompt-control": [ + [ + "EditableCLIPEncode", + "FilterSchedule", + "LoRAScheduler", + "PCApplySettings", + "PCPromptFromSchedule", + "PCScheduleAddMasks", + "PCScheduleSettings", + "PCSplitSampling", + "PCWrapGuider", + "PromptControlSimple", + "PromptToSchedule", + "ScheduleToCond", + "ScheduleToModel" + ], + { + "title_aux": "ComfyUI prompt control" + } + ], + "https://github.com/asagi4/comfyui-utility-nodes": [ + [ + "MUForceCacheClear", + "MUJinjaRender", + "MUReplaceModelWeights", + "MUSimpleWildcard" + ], + { + "title_aux": "asagi4/comfyui-utility-nodes" + } + ], + "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": [ + [ + "Core ML Converter", + "Core ML LCM Converter", + "Core ML LoRA Loader", + "CoreMLModelAdapter", + "CoreMLSampler", + "CoreMLSamplerAdvanced", + "CoreMLUNetLoader" + ], + { + "title_aux": "Core ML Suite for ComfyUI" + } + ], + "https://github.com/audioscavenger/ComfyUI-Thumbnails": [ + [ + "LoadImageThumbnails" + ], + { + "author": "AudioscavengeR", + "description": "Load Image thumbnails and show input subfolders.", + "nickname": "ComfyUI Thumbnails", + "title": "ComfyUI Thumbnails", + "title_aux": "ComfyUI Thumbnails" + } + ], + "https://github.com/audioscavenger/save-image-extended-comfyui": [ + [ + "SaveImageExtended" + ], + { + "title_aux": "Save Image Extended for ComfyUI" + } + ], + "https://github.com/avatechai/avatar-graph-comfyui": [ + [ + "ApplyMeshTransformAsShapeKey", + "B_ENUM", + "B_VECTOR3", + "B_VECTOR4", + "Combine Points", + "CreateShapeFlow", + "ExportBlendshapes", + "ExportGLTF", + "Extract Boundary Points", + "Image Alpha Mask Merge", + "ImageBridge", + "LoadImageFromRequest", + "LoadImageWithAlpha", + "LoadValueFromRequest", + "SAM MultiLayer", + "Save Image With Workflow" + ], + { + "author": "Avatech Limited", + "description": "Include nodes for sam + bpy operation, that allows workflow creations for generative 2d character rig.", + "nickname": "Avatar Graph", + "title": "Avatar Graph", + "title_aux": "Avatar Graph" + } + ], + "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": [ + [ + "Bedrock - Claude", + "Bedrock - Claude Multimodal", + "Bedrock - SDXL", + "Bedrock - Titan Inpainting", + "Bedrock - Titan Outpainting", + "Bedrock - Titan Text to Image", + "Bedrock - Titan Variation", + "Image From S3", + "Image From URL", + "Image To S3", + "Prompt Regex Remove", + "Prompt Template" + ], + { + "title_aux": "Amazon Bedrock nodes for ComfyUI" + } + ], + "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": [ + [ + "HaojihuiClipScoreFakeImageProcessor", + "HaojihuiClipScoreImageProcessor", + "HaojihuiClipScoreImageScore", + "HaojihuiClipScoreLoader", + "HaojihuiClipScoreRealImageProcessor", + "HaojihuiClipScoreTextProcessor" + ], + { + "title_aux": "ComfyUI-ClipScore-Nodes" + } + ], + "https://github.com/badayvedat/ComfyUI-fal-Connector": [ + [ + "RemoteCheckpointLoader_fal", + "RemoteLoraLoader_fal" + ], + { + "title_aux": "ComfyUI-fal-Connector" + } + ], + "https://github.com/badjeff/comfyui_lora_tag_loader": [ + [ + "LoraTagLoader" + ], + { + "title_aux": "LoRA Tag Loader for ComfyUI" + } + ], + "https://github.com/baicai99/ComfyUI-FrameSkipping": [ + [ + "FrameSelector", + "FrameSkipping", + "FrameTruncating", + "IntOperationsNode", + "MaskFrameSkipping", + "MaskGenerator", + "MaskSelector" + ], + { + "title_aux": "ComfyUI-FrameSkipping" + } + ], + "https://github.com/banodoco/steerable-motion": [ + [ + "BatchCreativeInterpolation", + "IpaConfiguration", + "RemoveAndInterpolateFrames" + ], + { + "title_aux": "Steerable Motion" + } + ], + "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/node_text_to_speech.py": [ + [ + "TextToSpeech" + ], + { + "title_aux": "comfyUI_DaVinciResolve" + } + ], + "https://github.com/bash-j/mikey_nodes": [ + [ + "AddMetaData", + "Batch Crop Image", + "Batch Crop Resize Inplace", + "Batch Load Images", + "Batch Resize Image for SDXL", + "Checkpoint Loader Simple Mikey", + "CheckpointHash", + "CinematicLook", + "Empty Latent Ratio Custom SDXL", + "Empty Latent Ratio Select SDXL", + "EvalFloats", + "FaceFixerOpenCV", + "FileNamePrefix", + "FileNamePrefixDateDirFirst", + "Float to String", + "GetSubdirectories", + "HaldCLUT", + "Image Caption", + "ImageBorder", + "ImageOverlay", + "ImagePaste", + "Int to String", + "LMStudioPrompt", + "Load Image Based on Number", + "LoraSyntaxProcessor", + "Mikey Sampler", + "Mikey Sampler Base Only", + "Mikey Sampler Base Only Advanced", + "Mikey Sampler Tiled", + "Mikey Sampler Tiled Base Only", + "MikeyLatentTileSampler", + "MikeyLatentTileSamplerCustom", + "MikeySamplerTiledAdvanced", + "MikeySamplerTiledAdvancedBaseOnly", + "MosaicExpandImage", + "OobaPrompt", + "PresetRatioSelector", + "Prompt With SDXL", + "Prompt With Style", + "Prompt With Style V2", + "Prompt With Style V3", + "Range Float", + "Range Integer", + "Ratio Advanced", + "Resize Image for SDXL", + "SD3TextConditioningWithOptionsOnePrompt", + "SRFloatPromptInput", + "SRIntPromptInput", + "SRStringPromptInput", + "Save Image If True", + "Save Image With Prompt Data", + "Save Images Mikey", + "Save Images No Display", + "SaveMetaData", + "SearchAndReplace", + "Seed String", + "Style Conditioner", + "Style Conditioner Base Only", + "Text2InputOr3rdOption", + "TextCombinations", + "TextCombinations3", + "TextConcat", + "TextPadderMikey", + "TextPreserve", + "Upscale Tile Calculator", + "Wildcard Processor", + "WildcardAndLoraSyntaxProcessor", + "WildcardOobaPrompt" + ], + { + "title_aux": "Mikey Nodes" + } + ], + "https://github.com/bedovyy/ComfyUI_NAIDGenerator": [ + [ + "GenerateNAID", + "Img2ImgOptionNAID", + "InpaintingOptionNAID", + "MaskImageToNAID", + "ModelOptionNAID", + "PromptToNAID", + "VibeTransferOptionNAID" + ], + { + "title_aux": "ComfyUI_NAIDGenerator" + } + ], + "https://github.com/bilal-arikan/ComfyUI_TextAssets": [ + [ + "LoadTextAsset" + ], + { + "title_aux": "ComfyUI_TextAssets" + } + ], + "https://github.com/bitaffinity/ComfyUI_HF_Inference": [ + [ + "Classification", + "FeatureExtraction", + "Generation", + "ObjectDetection", + "QuestionAnswering", + "Segmentation", + "TextToImage", + "Translation" + ], + { + "title_aux": "ComfyUI_HF_Inference" + } + ], + "https://github.com/bkunbargi/BrevImage/raw/main/BrevLoadImage.py": [ + [ + "BrevImage" + ], + { + "title_aux": "BrevImage" + } + ], + "https://github.com/blepping/ComfyUI-bleh": [ + [ + "BlehBlockOps", + "BlehDeepShrink", + "BlehDisableNoise", + "BlehDiscardPenultimateSigma", + "BlehForceSeedSampler", + "BlehHyperTile", + "BlehInsaneChainSampler", + "BlehLatentOps", + "BlehLatentScaleBy", + "BlehModelPatchConditional", + "BlehPlug", + "BlehRefinerAfter" + ], + { + "title_aux": "ComfyUI-bleh" + } + ], + "https://github.com/blepping/ComfyUI-sonar": [ + [ + "NoisyLatentLike", + "SamplerConfigOverride", + "SamplerSonarDPMPPSDE", + "SamplerSonarEuler", + "SamplerSonarEulerA", + "SonarCompositeNoise", + "SonarCustomNoise", + "SonarGuidanceConfig", + "SonarGuidedNoise", + "SonarModulatedNoise", + "SonarRandomNoise", + "SonarRepeatedNoise", + "SonarScheduledNoise" + ], + { + "title_aux": "ComfyUI-sonar" + } + ], + "https://github.com/blepping/comfyui_jankhidiffusion": [ + [ + "ApplyMSWMSAAttention", + "ApplyMSWMSAAttentionSimple", + "ApplyRAUNet", + "ApplyRAUNetSimple" + ], + { + "title_aux": "ComfyUI jank HiDiffusion" + } + ], + "https://github.com/blueraincoatli/comfyUI_SillyNodes": [ + [ + "BooleanJumper|SillyNode", + "QueueSequence|SillyNode", + "Screenshots|SillyNode", + "dummyInput|SillyNode", + "dummyInput|blueraincoat" + ], + { + "title_aux": "comfyUI_SillyNodes" + } + ], + "https://github.com/bluevisor/ComfyUI_PS_Blend_Node": [ + [ + "PSBlendNode" + ], + { + "title_aux": "ComfyUI_PS_Blend_Node" + } + ], + "https://github.com/bmad4ever/comfyui_ab_samplercustom": [ + [ + "AB SamplerCustom (experimental)" + ], + { + "title_aux": "comfyui_ab_sampler" + } + ], + "https://github.com/bmad4ever/comfyui_bmad_nodes": [ + [ + "AdaptiveThresholding", + "Add String To Many", + "AddAlpha", + "AdjustRect", + "AnyToAny", + "BoundingRect (contours)", + "BuildColorRangeAdvanced (hsv)", + "BuildColorRangeHSV (hsv)", + "CLAHE", + "CLIPEncodeMultiple", + "CLIPEncodeMultipleAdvanced", + "ChameleonMask", + "CheckpointLoader (dirty)", + "CheckpointLoaderSimple (dirty)", + "Color (RGB)", + "Color (hexadecimal)", + "Color Clip", + "Color Clip (advanced)", + "Color Clip ADE20k", + "ColorDictionary", + "ColorDictionary (custom)", + "Conditioning (combine multiple)", + "Conditioning (combine selective)", + "Conditioning Grid (cond)", + "Conditioning Grid (string)", + "Conditioning Grid (string) Advanced", + "Contour To Mask", + "Contours", + "ControlNetHadamard", + "ControlNetHadamard (manual)", + "ConvertImg", + "CopyMakeBorder", + "CreateRequestMetadata", + "DistanceTransform", + "Draw Contour(s)", + "EqualizeHistogram", + "ExtendColorList", + "ExtendCondList", + "ExtendFloatList", + "ExtendImageList", + "ExtendIntList", + "ExtendLatentList", + "ExtendMaskList", + "ExtendModelList", + "ExtendStringList", + "FadeMaskEdges", + "Filter Contour", + "FindComplementaryColor", + "FindThreshold", + "FlatLatentsIntoSingleGrid", + "Framed Mask Grab Cut", + "Framed Mask Grab Cut 2", + "FromListGet1Color", + "FromListGet1Cond", + "FromListGet1Float", + "FromListGet1Image", + "FromListGet1Int", + "FromListGet1Latent", + "FromListGet1Mask", + "FromListGet1Model", + "FromListGet1String", + "FromListGetColors", + "FromListGetConds", + "FromListGetFloats", + "FromListGetImages", + "FromListGetInts", + "FromListGetLatents", + "FromListGetMasks", + "FromListGetModels", + "FromListGetStrings", + "Get Contour from list", + "Get Models", + "Get Prompt", + "HypernetworkLoader (dirty)", + "ImageBatchToList", + "InRange (hsv)", + "Inpaint", + "Input/String to Int Array", + "KMeansColor", + "Load 64 Encoded Image", + "LoraLoader (dirty)", + "MaskGrid N KSamplers Advanced", + "MaskOuterBlur", + "Merge Latent Batch Gridwise", + "MonoMerge", + "MorphologicOperation", + "MorphologicSkeletoning", + "NaiveAutoKMeansColor", + "OtsuThreshold", + "RGB to HSV", + "Rect Grab Cut", + "Remap", + "RemapBarrelDistortion", + "RemapFromInsideParabolas", + "RemapFromQuadrilateral (homography)", + "RemapInsideParabolas", + "RemapInsideParabolasAdvanced", + "RemapPinch", + "RemapReverseBarrelDistortion", + "RemapStretch", + "RemapToInnerCylinder", + "RemapToOuterCylinder", + "RemapToQuadrilateral", + "RemapWarpPolar", + "Repeat Into Grid (image)", + "Repeat Into Grid (latent)", + "RequestInputs", + "SampleColorHSV", + "Save Image (api)", + "SeamlessClone", + "SeamlessClone (simple)", + "SetRequestStateToComplete", + "String", + "String to Float", + "String to Integer", + "ToColorList", + "ToCondList", + "ToFloatList", + "ToImageList", + "ToIntList", + "ToLatentList", + "ToMaskList", + "ToModelList", + "ToStringList", + "UnGridify (image)", + "VAEEncodeBatch" + ], + { + "title_aux": "Bmad Nodes" + } + ], + "https://github.com/bmad4ever/comfyui_lists_cartesian_product": [ + [ + "AnyListCartesianProduct" + ], + { + "title_aux": "Lists Cartesian Product" + } + ], + "https://github.com/bmad4ever/comfyui_quilting": [ + [ + "ImageQuilting_Bmad", + "LatentQuilting_Bmad" + ], + { + "title_aux": "comfyui_quilting" + } + ], + "https://github.com/bmad4ever/comfyui_wfc_like": [ + [ + "WFC_CustomTemperature_Bmad", + "WFC_CustomValueWeights_Bmad", + "WFC_Decode_BMad", + "WFC_EmptyState_Bmad", + "WFC_Encode_BMad", + "WFC_Filter_Bmad", + "WFC_GenParallel_Bmad", + "WFC_Generate_BMad", + "WFC_SampleNode_BMad" + ], + { + "title_aux": "comfyui_wfc_like" + } + ], + "https://github.com/bobmagicii/comfykit-custom-nodes": [ + [ + "LoraThree", + "LoraWithMeta", + "TypecasterImage", + "TypecasterLatent" + ], + { + "title_aux": "ComfyKit Custom Nodes" + } + ], + "https://github.com/bradsec/ComfyUI_ResolutionSelector": [ + [ + "ResolutionSelector" + ], + { + "title_aux": "ResolutionSelector for ComfyUI" + } + ], + "https://github.com/bradsec/ComfyUI_StringTools": [ + [ + "ModifyStringNode", + "RandomStringNode", + "ReplaceStringNode", + "ShowStringNode", + "TextStringNode" + ], + { + "title_aux": "ComfyUI_StringTools" + } + ], + "https://github.com/braintacles/braintacles-comfyui-nodes": [ + [ + "CLIPTextEncodeSDXL-Multi-IO", + "CLIPTextEncodeSDXL-Pipe", + "Empty Latent Image from Aspect-Ratio", + "Interval Sampler", + "Random Find and Replace" + ], + { + "title_aux": "braintacles-nodes" + } + ], + "https://github.com/brianfitzgerald/style_aligned_comfy": [ + [ + "StyleAlignedBatchAlign", + "StyleAlignedReferenceSampler", + "StyleAlignedSampleReferenceLatents" + ], + { + "title_aux": "StyleAligned for ComfyUI" + } + ], + "https://github.com/bronkula/comfyui-fitsize": [ + [ + "FS: Crop Image Into Even Pieces", + "FS: Fit Image And Resize", + "FS: Fit Size From Image", + "FS: Fit Size From Int", + "FS: Image Region To Mask", + "FS: Load Image And Resize To Fit", + "FS: Pick Image From Batch", + "FS: Pick Image From Batches", + "FS: Pick Image From List" + ], + { + "title_aux": "comfyui-fitsize" + } + ], + "https://github.com/bruefire/ComfyUI-SeqImageLoader": [ + [ + "VFrame Loader With Mask Editor", + "Video Loader With Mask Editor" + ], + { + "title_aux": "ComfyUI Sequential Image Loader" + } + ], + "https://github.com/budihartono/comfyui_otonx_nodes": [ + [ + "OTX Integer Multiple Inputs 4", + "OTX Integer Multiple Inputs 5", + "OTX Integer Multiple Inputs 6", + "OTX KSampler Feeder", + "OTX Versatile Multiple Inputs 4", + "OTX Versatile Multiple Inputs 5", + "OTX Versatile Multiple Inputs 6" + ], + { + "title_aux": "Otonx's Custom Nodes" + } + ], + "https://github.com/bvhari/ComfyUI_ImageProcessing": [ + [ + "BilateralFilter", + "Brightness", + "Gamma", + "Hue", + "Saturation", + "SigmoidCorrection", + "UnsharpMask" + ], + { + "title_aux": "ImageProcessing" + } + ], + "https://github.com/bvhari/ComfyUI_PerpWeight": [ + [ + "CLIPTextEncodePerpWeight" + ], + { + "title_aux": "ComfyUI_PerpWeight" + } + ], + "https://github.com/bvhari/ComfyUI_SUNoise": [ + [ + "SUNoiseLatent", + "SamplerDPM2Ancestral_SUN", + "SamplerDPMPP2SAncestral_SUN", + "SamplerDPMPP_2M_SDE_SUN", + "SamplerDPMPP_3M_SDE_SUN", + "SamplerDPMPP_SDE_SUN", + "SamplerEulerAncestralCFGpp_SUN", + "SamplerEulerAncestral_SUN", + "SamplersSUNoise", + "SamplersSUNoiseAdvanced" + ], + { + "title_aux": "ComfyUI_SUNoise" + } + ], + "https://github.com/catscandrive/comfyui-imagesubfolders/raw/main/loadImageWithSubfolders.py": [ + [ + "LoadImagewithSubfolders" + ], + { + "title_aux": "Image loader with subfolders" + } + ], + "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": [ + [ + "BOPBTL_BlendFaces", + "BOPBTL_DetectEnhanceBlendFaces", + "BOPBTL_DetectFaces", + "BOPBTL_EnhanceFaces", + "BOPBTL_EnhanceFacesAdvanced", + "BOPBTL_LoadFaceDetectorModel", + "BOPBTL_LoadFaceEnhancerModel", + "BOPBTL_LoadRestoreOldPhotosModel", + "BOPBTL_LoadScratchMaskModel", + "BOPBTL_RestoreOldPhotos", + "BOPBTL_ScratchMask" + ], + { + "title_aux": "ComfyUI Bringing Old Photos Back to Life" + } + ], + "https://github.com/cdb-boop/comfyui-image-round": [ + [ + "ComfyUI_Image_Round__ImageCropAdvanced", + "ComfyUI_Image_Round__ImageRound", + "ComfyUI_Image_Round__ImageRoundAdvanced" + ], + { + "title_aux": "comfyui-image-round" + } + ], + "https://github.com/celsojr2013/comfyui_jamworks_client": [ + [ + "Jamworks_Download", + "Jamworks_Login", + "Shell_Command" + ], + { + "title_aux": "comfyui_jamworks_client" + } + ], + "https://github.com/celsojr2013/comfyui_simpletools": [ + [ + "GoogleTranslator", + "Parameters", + "ResolutionSolver" + ], + { + "title_aux": "ComfyUI SimpleTools Suit" + } + ], + "https://github.com/cerspense/ComfyUI_cspnodes": [ + [ + "ImageDirIterator", + "Modelscopet2v", + "Modelscopev2v", + "RemapRange", + "SplitImageChannels", + "TextFileLineIterator", + "VidDirIterator" + ], + { + "title_aux": "cspnodes" + } + ], + "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": [ + [ + "LlavaCaptioner" + ], + { + "title_aux": "ComfyUI LLaVA Captioner" + } + ], + "https://github.com/chakib-belgaid/ComfyUI-autosize": [ + [ + "CustomAutoSize", + "SDXLAutoSize" + ], + { + "title_aux": "ComfyUI-autosize" + } + ], + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": [ + [ + "Prompt_Styler" + ], + { + "title_aux": "ComfyUI Style Plugin" + } + ], + "https://github.com/chandlergis/ComfyUI-IMG_Query": [ + [ + "ImageRequestNode" + ], + { + "title_aux": "ComfyUI-IMG_Query" + } + ], + "https://github.com/chandlergis/ComfyUI_EmojiOverlay": [ + [ + "Image Emoji Overlay" + ], + { + "title_aux": "ComfyUI_EmojiOverlay" + } + ], + "https://github.com/chaojie/ComfyUI-AniPortrait": [ + [ + "AniPortraitLoader", + "AniPortraitRun", + "Box2Video", + "CoverVideo", + "MaskList2Video" + ], + { + "title_aux": "ComfyUI-AniPortrait" + } + ], + "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": [ + [ + "CameraBasic", + "CameraCombine", + "CameraCtrlLoader", + "CameraCtrlRun", + "CameraJoin", + "CameraTrajectory" + ], + { + "title_aux": "ComfyUI-CameraCtrl-Wrapper" + } + ], + "https://github.com/chaojie/ComfyUI-Champ": [ + [ + "ChampLoader", + "ChampRun", + "ImageCombineOneColumn", + "ImageCombineOneRow" + ], + { + "title_aux": "ComfyUI-Champ" + } + ], + "https://github.com/chaojie/ComfyUI-DragAnything": [ + [ + "DragAnythingLoader", + "DragAnythingPipelineRun", + "DragAnythingPipelineRunRandom", + "DragAnythingRun", + "DragAnythingRunRandom", + "LoadText", + "SaveText", + "VHS_FILENAMES_STRING" + ], + { + "title_aux": "ComfyUI-DragAnything" + } + ], + "https://github.com/chaojie/ComfyUI-DragNUWA": [ + [ + "BrushMotion", + "CompositeMotionBrush", + "CompositeMotionBrushWithoutModel", + "DragNUWA Run", + "DragNUWA Run MotionBrush", + "Get First Image", + "Get Last Image", + "InstantCameraMotionBrush", + "InstantObjectMotionBrush", + "Load CheckPoint DragNUWA", + "Load MotionBrush From Optical Flow", + "Load MotionBrush From Optical Flow Directory", + "Load MotionBrush From Optical Flow Without Model", + "Load MotionBrush From Tracking Points", + "Load MotionBrush From Tracking Points Without Model", + "Load Pose KeyPoints", + "Loop", + "LoopEnd_IMAGE", + "LoopStart_IMAGE", + "Split Tracking Points" + ], + { + "title_aux": "ComfyUI-DragNUWA" + } + ], + "https://github.com/chaojie/ComfyUI-DynamiCrafter": [ + [ + "DynamiCrafter Simple", + "DynamiCrafterInterp Simple", + "DynamiCrafterInterpLoader", + "DynamiCrafterLoader" + ], + { + "title_aux": "ComfyUI-DynamiCrafter" + } + ], + "https://github.com/chaojie/ComfyUI-EasyAnimate": [ + [ + "EasyAnimateLoader", + "EasyAnimateRun" + ], + { + "title_aux": "ComfyUI-EasyAnimate" + } + ], + "https://github.com/chaojie/ComfyUI-Gemma": [ + [ + "GemmaLoader", + "GemmaRun" + ], + { + "title_aux": "ComfyUI-Gemma" + } + ], + "https://github.com/chaojie/ComfyUI-I2VGEN-XL": [ + [ + "I2VGEN-XL Simple", + "Modelscope Pipeline Loader" + ], + { + "title_aux": "ComfyUI-I2VGEN-XL" + } + ], + "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": [ + [ + "Img2ImgTurboEdgeLoader", + "Img2ImgTurboEdgeRun", + "Img2ImgTurboSketchLoader", + "Img2ImgTurboSketchRun" + ], + { + "title_aux": "ComfyUI-Img2Img-Turbo" + } + ], + "https://github.com/chaojie/ComfyUI-LaVIT": [ + [ + "VHS_FILENAMES_STRING_LaVIT", + "VideoLaVITI2I", + "VideoLaVITI2V", + "VideoLaVITI2VLong", + "VideoLaVITLoader", + "VideoLaVITT2V", + "VideoLaVITT2VLong", + "VideoLaVITUnderstandingImage", + "VideoLaVITUnderstandingLoader", + "VideoLaVITUnderstandingVideo", + "VideoLaVITVideoDetokenizerLoader", + "VideoLaVITVideoReconstruction" + ], + { + "title_aux": "ComfyUI-LaVIT" + } + ], + "https://github.com/chaojie/ComfyUI-LightGlue": [ + [ + "LightGlue Loader", + "LightGlue Simple", + "LightGlue Simple Multi" + ], + { + "title_aux": "ComfyUI-LightGlue" + } + ], + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ + [ + "Moore-AnimateAnyone Denoising Unet", + "Moore-AnimateAnyone Image Encoder", + "Moore-AnimateAnyone Pipeline Loader", + "Moore-AnimateAnyone Pose Guider", + "Moore-AnimateAnyone Reference Unet", + "Moore-AnimateAnyone Simple", + "Moore-AnimateAnyone VAE" + ], + { + "title_aux": "ComfyUI-Moore-AnimateAnyone" + } + ], + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": [ + [ + "Motion Vector Extractor", + "VideoCombineThenPath" + ], + { + "title_aux": "ComfyUI-Motion-Vector-Extractor" + } + ], + "https://github.com/chaojie/ComfyUI-MotionCtrl": [ + [ + "Load Motion Camera Preset", + "Load Motion Traj Preset", + "Load Motionctrl Checkpoint", + "Motionctrl Cond", + "Motionctrl Sample", + "Motionctrl Sample Simple", + "Select Image Indices" + ], + { + "title_aux": "ComfyUI-MotionCtrl" + } + ], + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": [ + [ + "Load Motionctrl-SVD Camera Preset", + "Load Motionctrl-SVD Checkpoint", + "Motionctrl-SVD Sample Simple" + ], + { + "title_aux": "ComfyUI-MotionCtrl-SVD" + } + ], + "https://github.com/chaojie/ComfyUI-MuseTalk": [ + [ + "MuseTalkCupAudio", + "MuseTalkRun", + "VHS_FILENAMES_STRING_MuseTalk" + ], + { + "title_aux": "ComfyUI-MuseTalk" + } + ], + "https://github.com/chaojie/ComfyUI-MuseV": [ + [ + "MuseVRun", + "MuseVRunVid2Vid", + "VHS_FILENAMES_STRING_MuseV" + ], + { + "author": "infguo", + "title_aux": "ComfyUI-MuseV" + } + ], + "https://github.com/chaojie/ComfyUI-Open-Sora": [ + [ + "OpenSoraLoader", + "OpenSoraRun", + "OpenSoraSampler" + ], + { + "title_aux": "ComfyUI-Open-Sora" + } + ], + "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": [ + [ + "OpenSoraPlanDecode", + "OpenSoraPlanLoader", + "OpenSoraPlanRun", + "OpenSoraPlanSample" + ], + { + "title_aux": "ComfyUI-Open-Sora-Plan" + } + ], + "https://github.com/chaojie/ComfyUI-Panda3d": [ + [ + "Panda3dAmbientLight", + "Panda3dAttachNewNode", + "Panda3dBase", + "Panda3dDirectionalLight", + "Panda3dLoadDepthModel", + "Panda3dLoadModel", + "Panda3dLoadTexture", + "Panda3dModelMerge", + "Panda3dTest", + "Panda3dTextureMerge" + ], + { + "title_aux": "ComfyUI-Panda3d" + } + ], + "https://github.com/chaojie/ComfyUI-Pymunk": [ + [ + "PygameRun", + "PygameSurface", + "PymunkDynamicBox", + "PymunkDynamicCircle", + "PymunkRun", + "PymunkShapeMerge", + "PymunkSpace", + "PymunkStaticLine" + ], + { + "title_aux": "ComfyUI-Pymunk" + } + ], + "https://github.com/chaojie/ComfyUI-RAFT": [ + [ + "Load MotionBrush", + "RAFT Run", + "Save MotionBrush", + "VizMotionBrush" + ], + { + "title_aux": "ComfyUI-RAFT" + } + ], + "https://github.com/chaojie/ComfyUI-SimDA": [ + [ + "SimDALoader", + "SimDARun", + "SimDATrain", + "VHS_FILENAMES_STRING_SimDA" + ], + { + "title_aux": "ComfyUI-SimDA" + } + ], + "https://github.com/chaojie/ComfyUI-Trajectory": [ + [ + "Trajectory_Canvas_Tab" + ], + { + "author": "Lerc", + "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor.", + "nickname": "Canvas Tab", + "title": "Canvas Tab", + "title_aux": "ComfyUI-Trajectory" + } + ], + "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": [ + [ + "StringList", + "VEXAGuidance", + "VEXALoader", + "VEXARun" + ], + { + "title_aux": "ComfyUI-Video-Editing-X-Attention" + } + ], + "https://github.com/chaojie/ComfyUI-dust3r": [ + [ + "CameraPoseVideo", + "Dust3rLoader", + "Dust3rRun" + ], + { + "title_aux": "ComfyUI-dust3r" + } + ], + "https://github.com/chaojie/ComfyUI_StreamingT2V": [ + [ + "LoadText_StreamingT2V", + "PromptTravelIndex", + "SaveText_StreamingT2V", + "StreamingT2VLoaderAnimateDiff", + "StreamingT2VLoaderAnimateDiffModel", + "StreamingT2VLoaderEnhanceModel", + "StreamingT2VLoaderModelscopeModel", + "StreamingT2VLoaderModelscopeT2V", + "StreamingT2VLoaderSVD", + "StreamingT2VLoaderSVDModel", + "StreamingT2VLoaderStreamModel", + "StreamingT2VLoaderVidXTendModel", + "StreamingT2VRunEnhanceStep", + "StreamingT2VRunI2V", + "StreamingT2VRunLongStep", + "StreamingT2VRunLongStepVidXTendPipeline", + "StreamingT2VRunLongStepVidXTendPipelineCustomRef", + "StreamingT2VRunLongStepVidXTendPipelineCustomRefOutExtendOnly", + "StreamingT2VRunLongStepVidXTendPipelinePromptTravel", + "StreamingT2VRunShortStepAnimateDiff", + "StreamingT2VRunShortStepModelscopeT2V", + "StreamingT2VRunShortStepSVD", + "StreamingT2VRunT2V", + "VHS_FILENAMES_STRING_StreamingT2V" + ], + { + "title_aux": "ComfyUI_StreamingT2V" + } + ], + "https://github.com/chaosaiart/Chaosaiart-Nodes": [ + [ + "chaosaiart_Any_Switch", + "chaosaiart_Any_Switch_Big_Number", + "chaosaiart_Any_Switch_small", + "chaosaiart_CheckpointLoader", + "chaosaiart_CheckpointPrompt", + "chaosaiart_CheckpointPrompt2", + "chaosaiart_CheckpointPrompt_Frame", + "chaosaiart_CheckpointPrompt_FrameMixer", + "chaosaiart_ControlNetApply", + "chaosaiart_ControlNetApply2", + "chaosaiart_ControlNetApply3", + "chaosaiart_Denoising_Switch", + "chaosaiart_EmptyLatentImage", + "chaosaiart_FramePromptCLIPEncode", + "chaosaiart_Frame_Switch", + "chaosaiart_KSampler1", + "chaosaiart_KSampler2", + "chaosaiart_KSampler3", + "chaosaiart_KSampler4", + "chaosaiart_KSampler5", + "chaosaiart_KSampler7", + "chaosaiart_KSampler_a1", + "chaosaiart_KSampler_a1a", + "chaosaiart_KSampler_a2", + "chaosaiart_KSampler_expert_0", + "chaosaiart_KSampler_expert_1", + "chaosaiart_Ksampler_attribut", + "chaosaiart_Load_Image_Batch", + "chaosaiart_Load_Image_Batch_2img", + "chaosaiart_MainPromptCLIPEncode", + "chaosaiart_Number", + "chaosaiart_Number2", + "chaosaiart_Number_Counter", + "chaosaiart_Number_Switch", + "chaosaiart_Prompt", + "chaosaiart_Prompt_Frame", + "chaosaiart_Prompt_mixer_byFrame", + "chaosaiart_SaveImage", + "chaosaiart_Show_Info", + "chaosaiart_Simple_Prompt", + "chaosaiart_Style_Node", + "chaosaiart_TextCLIPEncode", + "chaosaiart_TextCLIPEncode_lora", + "chaosaiart_adjust_color", + "chaosaiart_any_array2input_1Input", + "chaosaiart_any_array2input_all_big", + "chaosaiart_any_array2input_all_small", + "chaosaiart_any_input2array_big", + "chaosaiart_any_input2array_small", + "chaosaiart_controlnet_weidgth", + "chaosaiart_convert", + "chaosaiart_convert_Prompt", + "chaosaiart_forPreview", + "chaosaiart_image_loop", + "chaosaiart_img2gif", + "chaosaiart_img2video", + "chaosaiart_lora", + "chaosaiart_lora_advanced", + "chaosaiart_merge_Folders", + "chaosaiart_oneNode", + "chaosaiart_reloadAny_Load", + "chaosaiart_reloadAny_Save", + "chaosaiart_reloadIMG_Load", + "chaosaiart_reloadIMG_Save", + "chaosaiart_reloadLatent_Load", + "chaosaiart_reloadLatent_Save", + "chaosaiart_restarter", + "chaosaiart_restarter_advanced", + "chaosaiart_video2img1", + "chaosaiart_zoom_frame" + ], + { + "title_aux": "Chaosaiart-Nodes" + } + ], + "https://github.com/chesnokovivan/ComfyUI-Novakid": [ + [ + "Novakid Styler" + ], + { + "title_aux": "ComfyUI-Novakid" + } + ], + "https://github.com/chflame163/ComfyUI_FaceSimilarity": [ + [ + "Face Similarity" + ], + { + "title_aux": "ComfyUI Face Similarity" + } + ], + "https://github.com/chflame163/ComfyUI_LayerStyle": [ + [ + "LayerColor: AutoAdjust", + "LayerColor: AutoBrightness", + "LayerColor: Brightness & Contrast", + "LayerColor: Color of Shadow & Highlight", + "LayerColor: ColorAdapter", + "LayerColor: ColorBalance", + "LayerColor: ColorTemperature", + "LayerColor: Exposure", + "LayerColor: Gamma", + "LayerColor: HSV", + "LayerColor: LAB", + "LayerColor: LUT Apply", + "LayerColor: Levels", + "LayerColor: RGB", + "LayerColor: YUV", + "LayerFilter: AddGrain", + "LayerFilter: ChannelShake", + "LayerFilter: ColorMap", + "LayerFilter: Film", + "LayerFilter: FilmV2", + "LayerFilter: GaussianBlur", + "LayerFilter: HDREffects", + "LayerFilter: LightLeak", + "LayerFilter: MotionBlur", + "LayerFilter: Sharp & Soft", + "LayerFilter: SkinBeauty", + "LayerFilter: SoftLight", + "LayerFilter: WaterColor", + "LayerMask: BiRefNetUltra", + "LayerMask: BlendIf Mask", + "LayerMask: CreateGradientMask", + "LayerMask: ImageToMask", + "LayerMask: MaskBoxDetect", + "LayerMask: MaskByColor", + "LayerMask: MaskByDifferent", + "LayerMask: MaskEdgeShrink", + "LayerMask: MaskEdgeUltraDetail", + "LayerMask: MaskEdgeUltraDetail V2", + "LayerMask: MaskGradient", + "LayerMask: MaskGrain", + "LayerMask: MaskGrow", + "LayerMask: MaskInvert", + "LayerMask: MaskMotionBlur", + "LayerMask: MaskPreview", + "LayerMask: MaskStroke", + "LayerMask: MediapipeFacialSegment", + "LayerMask: PersonMaskUltra", + "LayerMask: PersonMaskUltra V2", + "LayerMask: PixelSpread", + "LayerMask: RemBgUltra", + "LayerMask: RmBgUltra V2", + "LayerMask: SegformerB2ClothesUltra", + "LayerMask: SegmentAnythingUltra", + "LayerMask: SegmentAnythingUltra V2", + "LayerMask: Shadow & Highlight Mask", + "LayerMask: YoloV8Detect", + "LayerStyle: ColorOverlay", + "LayerStyle: ColorOverlay V2", + "LayerStyle: DropShadow", + "LayerStyle: DropShadow V2", + "LayerStyle: GradientOverlay", + "LayerStyle: GradientOverlay V2", + "LayerStyle: InnerGlow", + "LayerStyle: InnerGlow V2", + "LayerStyle: InnerShadow", + "LayerStyle: InnerShadow V2", + "LayerStyle: OuterGlow", + "LayerStyle: OuterGlow V2", + "LayerStyle: Stroke", + "LayerStyle: Stroke V2", + "LayerUtility: AddBlindWaterMark", + "LayerUtility: BatchSelector", + "LayerUtility: Boolean", + "LayerUtility: BooleanOperator", + "LayerUtility: BooleanOperatorV2", + "LayerUtility: CheckMask", + "LayerUtility: ColorImage", + "LayerUtility: ColorImage V2", + "LayerUtility: ColorPicker", + "LayerUtility: CreateQRCode", + "LayerUtility: CropBoxResolve", + "LayerUtility: CropByMask", + "LayerUtility: CropByMask V2", + "LayerUtility: DecodeQRCode", + "LayerUtility: ExtendCanvas", + "LayerUtility: ExtendCanvasV2", + "LayerUtility: Float", + "LayerUtility: GetColorTone", + "LayerUtility: GetColorToneV2", + "LayerUtility: GetImageSize", + "LayerUtility: GradientImage", + "LayerUtility: GradientImage V2", + "LayerUtility: HLFrequencyDetailRestore", + "LayerUtility: HSV Value", + "LayerUtility: If", + "LayerUtility: ImageAutoCrop", + "LayerUtility: ImageAutoCrop V2", + "LayerUtility: ImageBlend", + "LayerUtility: ImageBlend V2", + "LayerUtility: ImageBlendAdvance", + "LayerUtility: ImageBlendAdvance V2", + "LayerUtility: ImageChannelMerge", + "LayerUtility: ImageChannelSplit", + "LayerUtility: ImageCombineAlpha", + "LayerUtility: ImageHub", + "LayerUtility: ImageMaskScaleAs", + "LayerUtility: ImageOpacity", + "LayerUtility: ImageRemoveAlpha", + "LayerUtility: ImageRewardFilter", + "LayerUtility: ImageScaleByAspectRatio", + "LayerUtility: ImageScaleByAspectRatio V2", + "LayerUtility: ImageScaleRestore", + "LayerUtility: ImageScaleRestore V2", + "LayerUtility: ImageShift", + "LayerUtility: Integer", + "LayerUtility: LaMa", + "LayerUtility: LayerImageTransform", + "LayerUtility: LayerMaskTransform", + "LayerUtility: LoadPSD", + "LayerUtility: NumberCalculator", + "LayerUtility: NumberCalculatorV2", + "LayerUtility: PrintInfo", + "LayerUtility: PromptEmbellish", + "LayerUtility: PromptTagger", + "LayerUtility: PurgeVRAM", + "LayerUtility: QWenImage2Prompt", + "LayerUtility: QueueStop", + "LayerUtility: RGB Value", + "LayerUtility: RestoreCropBox", + "LayerUtility: SD3NegativeConditioning", + "LayerUtility: SaveImagePlus", + "LayerUtility: Seed", + "LayerUtility: ShowBlindWaterMark", + "LayerUtility: SimpleTextImage", + "LayerUtility: String", + "LayerUtility: StringCondition", + "LayerUtility: SwitchCase", + "LayerUtility: TextBox", + "LayerUtility: TextImage", + "LayerUtility: TextJoin", + "LayerUtility: XY to Percent" + ], + { + "author": "chflame", + "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.", + "nickname": "LayerStyle", + "title": "LayerStyle", + "title_aux": "ComfyUI Layer Style" + } + ], + "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [ + [ + "Input Trigger", + "MicrosoftSpeech_TTS", + "Play Sound", + "Play Sound (loop)" + ], + { + "title_aux": "ComfyUI_MSSpeech_TTS" + } + ], + "https://github.com/chflame163/ComfyUI_WordCloud": [ + [ + "ComfyWordCloud", + "LoadTextFile", + "RGB_Picker" + ], + { + "title_aux": "ComfyUI_WordCloud" + } + ], + "https://github.com/chibiace/ComfyUI-Chibi-Nodes": [ + [ + "ConditionText", + "ConditionTextMulti", + "ImageAddText", + "ImageSimpleResize", + "ImageSizeInfo", + "ImageTool", + "Int2String", + "LoadEmbedding", + "LoadImageExtended", + "Loader", + "Prompts", + "RandomResolutionLatent", + "SaveImages", + "SeedGenerator", + "SimpleSampler", + "TextSplit", + "Textbox", + "Wildcards" + ], + { + "title_aux": "ComfyUI-Chibi-Nodes" + } + ], + "https://github.com/choey/Comfy-Topaz": [ + [ + "TopazPhotoAI", + "TopazSharpenSettings", + "TopazUpscaleSettings" + ], + { + "title_aux": "Comfy-Topaz" + } + ], + "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI": [ + [ + "Embeddings Curve Editor" + ], + { + "title_aux": "EmbeddingsCurveEditor_ComfyUI" + } + ], + "https://github.com/chrisfreilich/virtuoso-nodes": [ + [ + "BlackAndWhite", + "BlendIf", + "BlendModes", + "ColorBalance", + "ColorBalanceAdvanced", + "GaussianBlur", + "GaussianBlurDepth", + "HueSat", + "HueSatAdvanced", + "LensBlur", + "LensBlurDepth", + "Levels", + "MergeRGB", + "MotionBlur", + "MotionBlurDepth", + "SelectiveColor", + "SolidColor", + "SolidColorHSV", + "SolidColorRGB", + "SplitRGB" + ], + { + "author": "Chris Freilich", + "description": "This extension provides a \"Blend If (BlendIf)\" node.", + "nickname": "Virtuoso Pack - Blend If", + "title": "Virtuoso Pack - Blend If", + "title_aux": "Virtuoso Nodes for ComfyUI" + } + ], + "https://github.com/chrisgoringe/cg-image-picker": [ + [ + "Preview Chooser", + "Preview Chooser Fabric" + ], + { + "author": "chrisgoringe", + "description": "Custom nodes that preview images and pause the workflow to allow the user to select one or more to progress", + "nickname": "Image Chooser", + "title": "Image Chooser", + "title_aux": "Image chooser" + } + ], + "https://github.com/chrisgoringe/cg-noise": [ + [ + "Hijack", + "KSampler Advanced with Variations", + "KSampler with Variations", + "UnHijack" + ], + { + "title_aux": "Variation seeds" + } + ], + "https://github.com/chrisgoringe/cg-use-everywhere": [ + [ + "Seed Everywhere" + ], + { + "nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)", + "title_aux": "Use Everywhere (UE Nodes)" + } + ], + "https://github.com/christian-byrne/audio-separation-nodes-comfyui": [ + [ + "AudioCombine", + "AudioCrop", + "AudioSeparation", + "AudioTempoMatch", + "AudioVideoCombine" + ], + { + "title_aux": "audio-separation-nodes-comfyui" + } + ], + "https://github.com/christian-byrne/img2colors-comfyui-node": [ + [ + "bmy_Img2ColorNode" + ], + { + "author": "christian-byrne", + "description": "", + "nickname": "img2color", + "title": "Img2Color Node - Detect and describe color palettes in images", + "title_aux": "img2colors-comfyui-node" + } + ], + "https://github.com/christian-byrne/size-match-compositing-nodes": [ + [ + "Composite Alpha Layer", + "Size Match Images/Masks" + ], + { + "title_aux": "Node - Size Matcher" + } + ], + "https://github.com/city96/ComfyUI_ColorMod": [ + [ + "CV2Tonemap", + "CV2TonemapDrago", + "CV2TonemapDurand", + "CV2TonemapMantiuk", + "CV2TonemapReinhard", + "ColorModCompress", + "ColorModEdges", + "ColorModMove", + "ColorModPivot", + "HDRCreate", + "HDRExposureFusion", + "LoadImageHDR", + "LoadImageHighPrec", + "PreviewImageHighPrec", + "SaveImageHDR", + "SaveImageHighPrec" + ], + { + "title_aux": "ComfyUI_ColorMod" + } + ], + "https://github.com/city96/ComfyUI_DiT": [ + [ + "DiTCheckpointLoader", + "DiTCheckpointLoaderSimple", + "DiTLabelCombine", + "DiTLabelSelect", + "DiTSampler" + ], + { + "title_aux": "ComfyUI_DiT [WIP]" + } + ], + "https://github.com/city96/ComfyUI_ExtraModels": [ + [ + "DiTCondLabelEmpty", + "DiTCondLabelSelect", + "DitCheckpointLoader", + "ExtraVAELoader", + "HYDiTCheckpointLoader", + "HYDiTSrcSizeCond", + "HYDiTTextEncode", + "HYDiTTextEncodeSimple", + "HYDiTTextEncoderLoader", + "MiaoBiCLIPLoader", + "MiaoBiDiffusersLoader", + "PixArtCheckpointLoader", + "PixArtCheckpointLoaderSimple", + "PixArtControlNetCond", + "PixArtLoraLoader", + "PixArtResolutionCond", + "PixArtResolutionSelect", + "PixArtT5FromSD3CLIP", + "PixArtT5TextEncode", + "T5TextEncode", + "T5v11Loader" + ], + { + "title_aux": "Extra Models for ComfyUI" + } + ], + "https://github.com/city96/ComfyUI_NetDist": [ + [ + "CombineImageBatch", + "FetchRemote", + "LoadCurrentWorkflowJSON", + "LoadDiskWorkflowJSON", + "LoadImageUrl", + "LoadLatentNumpy", + "LoadLatentUrl", + "RemoteChainEnd", + "RemoteChainStart", + "RemoteQueueSimple", + "RemoteQueueWorker", + "SaveDiskWorkflowJSON", + "SaveImageUrl", + "SaveLatentNumpy" + ], + { + "title_aux": "ComfyUI_NetDist" + } + ], + "https://github.com/city96/SD-Advanced-Noise": [ + [ + "LatentGaussianNoise", + "MathEncode" + ], + { + "title_aux": "SD-Advanced-Noise" + } + ], + "https://github.com/city96/SD-Latent-Interposer": [ + [ + "LatentInterposer" + ], + { + "title_aux": "Latent-Interposer" + } + ], + "https://github.com/city96/SD-Latent-Upscaler": [ + [ + "LatentUpscaler" + ], + { + "title_aux": "SD-Latent-Upscaler" + } + ], + "https://github.com/civitai/comfy-nodes": [ + [ + "CivitAI_Checkpoint_Loader", + "CivitAI_Lora_Loader" + ], + { + "title_aux": "comfy-nodes" + } + ], + "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": [ + [ + "CS Transform" + ], + { + "title_aux": "CS Transform Node for ComfyUI" + } + ], + "https://github.com/comfyanonymous/ComfyUI": [ + [ + "AddNoise", + "AlignYourStepsScheduler", + "BasicGuider", + "BasicScheduler", + "CFGGuider", + "CLIPAttentionMultiply", + "CLIPLoader", + "CLIPMergeAdd", + "CLIPMergeSimple", + "CLIPMergeSubtract", + "CLIPSave", + "CLIPSetLastLayer", + "CLIPTextEncode", + "CLIPTextEncodeControlnet", + "CLIPTextEncodeSD3", + "CLIPTextEncodeSDXL", + "CLIPTextEncodeSDXLRefiner", + "CLIPVisionEncode", + "CLIPVisionLoader", + "Canny", + "CheckpointLoader", + "CheckpointLoaderSimple", + "CheckpointSave", + "ConditioningAverage", + "ConditioningCombine", + "ConditioningConcat", + "ConditioningSetArea", + "ConditioningSetAreaPercentage", + "ConditioningSetAreaStrength", + "ConditioningSetMask", + "ConditioningSetTimestepRange", + "ConditioningZeroOut", + "ControlNetApply", + "ControlNetApplyAdvanced", + "ControlNetApplySD3", + "ControlNetLoader", + "CropMask", + "DiffControlNetLoader", + "DifferentialDiffusion", + "DiffusersLoader", + "DisableNoise", + "DualCFGGuider", + "DualCLIPLoader", + "EmptyImage", + "EmptyLatentAudio", + "EmptyLatentImage", + "EmptySD3LatentImage", + "ExponentialScheduler", + "FeatherMask", + "FlipSigmas", + "FreeU", + "FreeU_V2", + "GITSScheduler", + "GLIGENLoader", + "GLIGENTextBoxApply", + "GrowMask", + "HyperTile", + "HypernetworkLoader", + "ImageBatch", + "ImageBlend", + "ImageBlur", + "ImageColorToMask", + "ImageCompositeMasked", + "ImageCrop", + "ImageFromBatch", + "ImageInvert", + "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", + "ImagePadForOutpaint", + "ImageQuantize", + "ImageScale", + "ImageScaleBy", + "ImageScaleToTotalPixels", + "ImageSharpen", + "ImageToMask", + "ImageUpscaleWithModel", + "InpaintModelConditioning", + "InstructPixToPixConditioning", + "InvertMask", + "JoinImageWithAlpha", + "KSampler", + "KSamplerAdvanced", + "KSamplerSelect", + "KarrasScheduler", + "LatentAdd", + "LatentBatch", + "LatentBatchSeedBehavior", + "LatentBlend", + "LatentComposite", + "LatentCompositeMasked", + "LatentCrop", + "LatentFlip", + "LatentFromBatch", + "LatentInterpolate", + "LatentMultiply", + "LatentRotate", + "LatentSubtract", + "LatentUpscale", + "LatentUpscaleBy", + "LoadAudio", + "LoadImage", + "LoadImageMask", + "LoadLatent", + "LoraLoader", + "LoraLoaderModelOnly", + "MaskComposite", + "MaskToImage", + "ModelMergeAdd", + "ModelMergeBlocks", + "ModelMergeSD1", + "ModelMergeSD2", + "ModelMergeSD3_2B", + "ModelMergeSDXL", + "ModelMergeSimple", + "ModelMergeSubtract", + "ModelSamplingContinuousEDM", + "ModelSamplingContinuousV", + "ModelSamplingDiscrete", + "ModelSamplingSD3", + "ModelSamplingStableCascade", + "Morphology", + "PatchModelAddDownscale", + "PerpNeg", + "PerpNegGuider", + "PerturbedAttentionGuidance", + "PhotoMakerEncode", + "PhotoMakerLoader", + "PolyexponentialScheduler", + "PorterDuffImageComposite", + "PreviewAudio", + "PreviewImage", + "RandomNoise", + "RebatchImages", + "RebatchLatents", + "RepeatImageBatch", + "RepeatLatentBatch", + "RescaleCFG", + "SDTurboScheduler", + "SD_4XUpscale_Conditioning", + "SV3D_Conditioning", + "SVD_img2vid_Conditioning", + "SamplerCustom", + "SamplerCustomAdvanced", + "SamplerDPMAdaptative", + "SamplerDPMPP_2M_SDE", + "SamplerDPMPP_3M_SDE", + "SamplerDPMPP_SDE", + "SamplerEulerAncestral", + "SamplerEulerAncestralCFGPP", + "SamplerEulerCFGpp", + "SamplerLCMUpscale", + "SamplerLMS", + "SaveAnimatedPNG", + "SaveAnimatedWEBP", + "SaveAudio", + "SaveImage", + "SaveImageWebsocket", + "SaveLatent", + "SelfAttentionGuidance", + "SetLatentNoiseMask", + "SolidMask", + "SplitImageWithAlpha", + "SplitSigmas", + "SplitSigmasDenoise", + "StableCascade_EmptyLatentImage", + "StableCascade_StageB_Conditioning", + "StableCascade_StageC_VAEEncode", + "StableCascade_SuperResolutionControlnet", + "StableZero123_Conditioning", + "StableZero123_Conditioning_Batched", + "StyleModelApply", + "StyleModelLoader", + "ThresholdMask", + "TomePatchModel", + "TripleCLIPLoader", + "UNETLoader", + "UNetCrossAttentionMultiply", + "UNetSelfAttentionMultiply", + "UNetTemporalAttentionMultiply", + "UpscaleModelLoader", + "VAEDecode", + "VAEDecodeAudio", + "VAEDecodeTiled", + "VAEEncode", + "VAEEncodeAudio", + "VAEEncodeForInpaint", + "VAEEncodeTiled", + "VAELoader", + "VAESave", + "VPScheduler", + "VideoLinearCFGGuidance", + "VideoTriangleCFGGuidance", + "WebcamCapture", + "unCLIPCheckpointLoader", + "unCLIPConditioning" + ], + { + "title_aux": "ComfyUI" + } + ], + "https://github.com/comfyanonymous/ComfyUI_TensorRT": [ + [ + "DYNAMIC_TRT_MODEL_CONVERSION", + "STATIC_TRT_MODEL_CONVERSION", + "TensorRTLoader" + ], + { + "title_aux": "TensorRT Node for ComfyUI" + } + ], + "https://github.com/comfyanonymous/ComfyUI_experiments": [ + [ + "ModelMergeBlockNumber", + "ModelMergeSDXL", + "ModelMergeSDXLDetailedTransformers", + "ModelMergeSDXLTransformers", + "ModelSamplerTonemapNoiseTest", + "ReferenceOnlySimple", + "RescaleClassifierFreeGuidanceTest", + "TonemapNoiseWithRescaleCFG" + ], + { + "title_aux": "ComfyUI_experiments" + } + ], + "https://github.com/concarne000/ConCarneNode": [ + [ + "BingImageGrabber", + "Hermes", + "Zephyr" + ], + { + "title_aux": "ConCarneNode" + } + ], + "https://github.com/conquestace/ComfyUI-ImageUploader": [ + [ + "ImageUploader" + ], + { + "author": "ConquestAce", + "description": "Upload to temporary websites with API.", + "nickname": "Image Uploader", + "title": "Image Uploader", + "title_aux": "Image Uploader" + } + ], + "https://github.com/coreyryanhanson/ComfyQR": [ + [ + "comfy-qr-by-image-size", + "comfy-qr-by-module-size", + "comfy-qr-by-module-split", + "comfy-qr-mask_errors" + ], + { + "title_aux": "ComfyQR" + } + ], + "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": [ + [ + "comfy-qr-read", + "comfy-qr-validate" + ], + { + "title_aux": "ComfyQR-scanning-nodes" + } + ], + "https://github.com/cozymantis/cozy-utils-comfyui-nodes": [ + [ + "Cozy Sampler Options" + ], + { + "title_aux": "Cozy Utils" + } + ], + "https://github.com/cozymantis/human-parser-comfyui-node": [ + [ + "Cozy Human Parser ATR", + "Cozy Human Parser LIP", + "Cozy Human Parser Pascal" + ], + { + "title_aux": "Cozy Human Parser" + } + ], + "https://github.com/cozymantis/pose-generator-comfyui-node": [ + [ + "Cozy Pose Body Reference", + "Cozy Pose Face Reference" + ], + { + "title_aux": "Cozy Reference Pose Generator" + } + ], + "https://github.com/crystian/ComfyUI-Crystools": [ + [], + { + "author": "Crystian", + "description": "Plugins for multiples uses, mainly for debugging, you need them! IG: https://www.instagram.com/crystian.ia", + "nickname": "Crystools", + "nodename_pattern": " \\[Crystools\\]$", + "title": "Crystools", + "title_aux": "Crystools" + } + ], + "https://github.com/cubiq/ComfyUI_FaceAnalysis": [ + [ + "FaceAlign", + "FaceAnalysisModels", + "FaceBoundingBox", + "FaceEmbedDistance", + "FaceSegmentation", + "FaceWarp" + ], + { + "title_aux": "Face Analysis for ComfyUI" + } + ], + "https://github.com/cubiq/ComfyUI_IPAdapter_plus": [ + [ + "IPAAdapterFaceIDBatch", + "IPAdapter", + "IPAdapterAdvanced", + "IPAdapterBatch", + "IPAdapterCombineEmbeds", + "IPAdapterCombineParams", + "IPAdapterCombineWeights", + "IPAdapterEmbeds", + "IPAdapterEmbedsBatch", + "IPAdapterEncoder", + "IPAdapterFaceID", + "IPAdapterFromParams", + "IPAdapterInsightFaceLoader", + "IPAdapterLoadEmbeds", + "IPAdapterMS", + "IPAdapterModelLoader", + "IPAdapterNoise", + "IPAdapterPreciseStyleTransfer", + "IPAdapterPreciseStyleTransferBatch", + "IPAdapterPromptScheduleFromWeightsStrategy", + "IPAdapterRegionalConditioning", + "IPAdapterSaveEmbeds", + "IPAdapterStyleComposition", + "IPAdapterStyleCompositionBatch", + "IPAdapterTiled", + "IPAdapterTiledBatch", + "IPAdapterUnifiedLoader", + "IPAdapterUnifiedLoaderCommunity", + "IPAdapterUnifiedLoaderFaceID", + "IPAdapterWeights", + "IPAdapterWeightsFromStrategy", + "PrepImageForClipVision" + ], + { + "title_aux": "ComfyUI_IPAdapter_plus" + } + ], + "https://github.com/cubiq/ComfyUI_InstantID": [ + [ + "ApplyInstantID", + "ApplyInstantIDAdvanced", + "ApplyInstantIDControlNet", + "FaceKeypointsPreprocessor", + "InstantIDAttentionPatch", + "InstantIDFaceAnalysis", + "InstantIDModelLoader" + ], + { + "title_aux": "ComfyUI InstantID (Native Support)" + } + ], + "https://github.com/cubiq/ComfyUI_SimpleMath": [ + [ + "SimpleMath", + "SimpleMathDebug" + ], + { + "title_aux": "Simple Math" + } + ], + "https://github.com/cubiq/ComfyUI_essentials": [ + [ + "ApplyCLIPSeg+", + "BatchCount+", + "CLIPTextEncodeSDXL+", + "ConditioningCombineMultiple+", + "ConsoleDebug+", + "DebugTensorShape+", + "DrawText+", + "ExtractKeyframes+", + "GetImageSize+", + "ImageApplyLUT+", + "ImageBatchMultiple+", + "ImageCASharpening+", + "ImageColorMatch+", + "ImageCompositeFromMaskBatch+", + "ImageCrop+", + "ImageDesaturate+", + "ImageEnhanceDifference+", + "ImageExpandBatch+", + "ImageFlip+", + "ImageFromBatch+", + "ImageHistogramMatch+", + "ImageListToBatch+", + "ImagePosterize+", + "ImagePreviewFromLatent+", + "ImageRandomTransform+", + "ImageRemoveAlpha+", + "ImageRemoveBackground+", + "ImageResize+", + "ImageSeamCarving+", + "ImageTile+", + "ImageToDevice+", + "ImageUntile+", + "KSamplerVariationsStochastic+", + "KSamplerVariationsWithNoise+", + "LoadCLIPSegModels+", + "MaskBatch+", + "MaskBlur+", + "MaskBoundingBox+", + "MaskExpandBatch+", + "MaskFix+", + "MaskFlip+", + "MaskFromBatch+", + "MaskFromColor+", + "MaskFromList+", + "MaskFromRGBCMYBW+", + "MaskFromSegmentation+", + "MaskPreview+", + "MaskSmooth+", + "ModelCompile+", + "NoiseFromImage+", + "PixelOEPixelize+", + "RemBGSession+", + "RemoveLatentMask+", + "SD3NegativeConditioning+", + "SDXLEmptyLatentSizePicker+", + "SimpleMath+", + "TransitionMask+" + ], + { + "title_aux": "ComfyUI Essentials" + } + ], + "https://github.com/cubiq/PuLID_ComfyUI": [ + [ + "ApplyPulid", + "ApplyPulidAdvanced", + "PulidEvaClipLoader", + "PulidInsightFaceLoader", + "PulidModelLoader" + ], + { + "title_aux": "PuLID_ComfyUI" + } + ], + "https://github.com/cuongloveit/comfy_http_request": [ + [ + "Send Http Request", + "Send Http request" + ], + { + "title_aux": "comfy_http_request" + } + ], + "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": [ + [ + "CombinatorialDetailer", + "FlattenAgainstOriginal", + "PermuteMaskBatch" + ], + { + "title_aux": "ComfyUI-MaskBatchPermutations" + } + ], + "https://github.com/czcz1024/Comfyui-FaceCompare": [ + [ + "FaceCompare" + ], + { + "author": "czcz1024", + "description": "Face Compare", + "nickname": "Face Compare", + "title": "Face Compare", + "title_aux": "Face Compare" + } + ], + "https://github.com/da2el-ai/ComfyUI-d2-size-selector": [ + [ + "D2_SizeSelector" + ], + { + "author": "da2el", + "description": "Easy select image size", + "title": "D2 Size Selector", + "title_aux": "D2 Size Selector" + } + ], + "https://github.com/da2el-ai/ComfyUI-d2-steps": [ + [ + "D2 Refiner Steps", + "D2 Refiner Steps A1111", + "D2 Refiner Steps Tester" + ], + { + "author": "da2el", + "description": "Calculate the steps for the refiner", + "title": "D2 Steps", + "title_aux": "D2 Steps" + } + ], + "https://github.com/dagthomas/comfyui_dagthomas": [ + [ + "PGSD3LatentGenerator", + "PromptGenerator" + ], + { + "title_aux": "SDXL Auto Prompter" + } + ], + "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": [ + [ + "ProPainterInpaint", + "ProPainterOutpaint" + ], + { + "title_aux": "ComfyUI ProPainter Nodes" + } + ], + "https://github.com/daniel-lewis-ab/ComfyUI-Llama": [ + [ + "Call LLM Advanced", + "Call LLM Basic", + "LLM_Create_Completion Advanced", + "LLM_Detokenize", + "LLM_Embed", + "LLM_Eval", + "LLM_Load_State", + "LLM_Reset", + "LLM_Sample", + "LLM_Save_State", + "LLM_Token_BOS", + "LLM_Token_EOS", + "LLM_Tokenize", + "Load LLM Model Advanced", + "Load LLM Model Basic" + ], + { + "title_aux": "ComfyUI-Llama" + } + ], + "https://github.com/daniel-lewis-ab/ComfyUI-TTS": [ + [ + "Load_Piper_Model", + "Piper_Speak_Text" + ], + { + "title_aux": "ComfyUI-TTS" + } + ], + "https://github.com/darkpixel/darkprompts": [ + [ + "DarkCheckpointRandomizer", + "DarkCheckpointSwitcher", + "DarkCombine", + "DarkFaceIndexGenerator", + "DarkFaceIndexShuffle", + "DarkFolders", + "DarkLoRALoader", + "DarkPrompt" + ], + { + "title_aux": "DarkPrompts" + } + ], + "https://github.com/dave-palt/comfyui_DSP_imagehelpers": [ + [ + "dsp-imagehelpers-concat" + ], + { + "title_aux": "comfyui_DSP_imagehelpers" + } + ], + "https://github.com/dawangraoming/ComfyUI_ksampler_gpu/raw/main/ksampler_gpu.py": [ + [ + "KSamplerAdvancedGPU", + "KSamplerGPU" + ], + { + "title_aux": "KSampler GPU" + } + ], + "https://github.com/daxcay/ComfyUI-DataSet": [ + [ + "DataSet_ConceptManager", + "DataSet_CopyFiles", + "DataSet_FindAndReplace", + "DataSet_LoadImage", + "DataSet_OpenAIChat", + "DataSet_OpenAIChatImage", + "DataSet_OpenAIChatImageBatch", + "DataSet_PathSelector", + "DataSet_SaveImage", + "DataSet_TextFilesLoad", + "DataSet_TextFilesLoadFromList", + "DataSet_TextFilesSave", + "DataSet_TriggerWords", + "DataSet_Visualizer" + ], + { + "author": "Daxton Caylor", + "description": "Data Research, Preparation, and Manipulation Nodes for Model Trainers, Artists, Designers, and Animators.", + "nickname": "ComfyUI-DataSet", + "title": "ComfyUI-DataSet", + "title_aux": "ComfyUI-DataSet" + } + ], + "https://github.com/daxcay/ComfyUI-JDCN": [ + [ + "JDCN_AnyCheckpointLoader", + "JDCN_AnyFileList", + "JDCN_AnyFileListHelper", + "JDCN_AnyFileListRandom", + "JDCN_AnyFileSelector", + "JDCN_BatchCounter", + "JDCN_BatchCounterAdvance", + "JDCN_BatchImageLoadFromDir", + "JDCN_BatchImageLoadFromList", + "JDCN_BatchLatentLoadFromDir", + "JDCN_BatchLatentLoadFromList", + "JDCN_BatchSaveLatent", + "JDCN_BoolInt", + "JDCN_EnableDisable", + "JDCN_FileMover", + "JDCN_ImageSaver", + "JDCN_ListToString", + "JDCN_ReBatch", + "JDCN_SeamlessExperience", + "JDCN_ShowAny", + "JDCN_SplitString", + "JDCN_StringManipulator", + "JDCN_StringToList", + "JDCN_SwapInputs", + "JDCN_TXTFileSaver", + "JDCN_VHSFileMover" + ], + { + "author": "Daxton Caylor & Jerry Davos", + "description": "Custom Utility Nodes for Artists, Designers and Animators.", + "nickname": "ComfyUI-JDCN", + "title": "ComfyUI-JDCN", + "title_aux": "ComfyUI-JDCN" + } + ], + "https://github.com/daxthin/DZ-FaceDetailer": [ + [ + "DZ_Face_Detailer" + ], + { + "title_aux": "DZ-FaceDetailer" + } + ], + "https://github.com/dchatel/comfyui_facetools": [ + [ + "BiSeNetMask", + "CropFaces", + "DetectFaces", + "GenderFaceFilter", + "JonathandinuMask", + "MergeWarps", + "OrderedFaceFilter", + "WarpFacesBack" + ], + { + "title_aux": "comfyui_facetools" + } + ], + "https://github.com/denfrost/Den_ComfyUI_Workflow": [ + [ + "Den_BatchIndex_AS", + "Den_CropImage_AS", + "Den_Eval_AS", + "Den_FaceRestoreCFWithModel", + "Den_GPTLoaderSimple_llama", + "Den_GPTSampler_llama", + "Den_ImageMixMasked_As", + "Den_ImageToLatentSpace", + "Den_ImageToMask_AS", + "Den_Int2Any_AS", + "Den_LatentAdd_AS", + "Den_LatentMixMasked_As", + "Den_LatentMix_AS", + "Den_LatentToImages_AS", + "Den_LoadLatent_AS", + "Den_MapRange_AS", + "Den_MaskToImage_AS", + "Den_Math_AS", + "Den_NoiseImage_AS", + "Den_Number2Float_AS", + "Den_Number2Int_AS", + "Den_Number_AS", + "Den_SVD_img2vid", + "Den_SaveLatent_AS", + "Den_TextToImage_AS", + "Den_TextWildcardList_AS", + "Increment_AS" + ], + { + "title_aux": "Den_ComfyUI_Workflows" + } + ], + "https://github.com/deroberon/StableZero123-comfyui": [ + [ + "SDZero ImageSplit", + "Stablezero123", + "Stablezero123WithDepth" + ], + { + "title_aux": "StableZero123-comfyui" + } + ], + "https://github.com/deroberon/demofusion-comfyui": [ + [ + "Batch Unsampler", + "Demofusion", + "Demofusion From Single File", + "Iterative Mixing KSampler" + ], + { + "title_aux": "demofusion-comfyui" + } + ], + "https://github.com/dfl/comfyui-clip-with-break": [ + [ + "AdvancedCLIPTextEncodeWithBreak", + "CLIPTextEncodeWithBreak" + ], + { + "author": "dfl", + "description": "CLIP text encoder that does BREAK prompting like A1111", + "nickname": "CLIP with BREAK", + "title": "CLIP with BREAK syntax", + "title_aux": "CLIP with BREAK syntax" + } + ], + "https://github.com/dfl/comfyui-tcd-scheduler": [ + [ + "SamplerTCD", + "SamplerTCD EulerA", + "TCDScheduler" + ], + { + "title_aux": "ComfyUI-TCD-scheduler" + } + ], + "https://github.com/diStyApps/ComfyUI_FrameMaker": [ + [ + "FrameMaker", + "FrameMakerBatch" + ], + { + "title_aux": "ComfyUI Frame Maker" + } + ], + "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes": [ + [ + "DicksonColorMatch", + "TTPlanet_Tile_Preprocessor_GF", + "TTPlanet_Tile_Preprocessor_Simple", + "TTPlanet_Tile_Preprocessor_cufoff" + ], + { + "description": "This is a set of custom nodes that I've either written myself or adapted from other authors for my own convenience. Currently includes color matching node forked from StableSR and TTPlanet's controlnet preprocessor. https://github.com/dicksondickson", + "nickname": "Dickson Nodes", + "title": "Dickson Nodes", + "title_aux": "ComfyUI-Dickson-Nodes" + } + ], + "https://github.com/digitaljohn/comfyui-propost": [ + [ + "ProPostApplyLUT", + "ProPostDepthMapBlur", + "ProPostFilmGrain", + "ProPostRadialBlur", + "ProPostVignette" + ], + { + "title_aux": "ComfyUI-ProPost" + } + ], + "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": [ + [ + "PixelArtAddDitherPattern", + "PixelArtDetectorConverter", + "PixelArtDetectorSave", + "PixelArtDetectorToImage", + "PixelArtLoadPalettes" + ], + { + "title_aux": "ComfyUI PixelArt Detector" + } + ], + "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": [ + [ + "Add Text To Image", + "Apply Instagram Filter", + "Create Solid Color", + "Flatten Colors", + "Generate Noise Image", + "GlitchThis Effect", + "Hue Rotation", + "Load Picture Index", + "Pixel Sort", + "Play Sound At Execution", + "Prettify Prompt Using distilgpt2", + "Swap Color Mode" + ], + { + "title_aux": "ComfyUI-Vextra-Nodes" + } + ], + "https://github.com/discopixel-studio/comfyui-discopixel": [ + [ + "TransformTemplateOntoFaceMask" + ], + { + "author": "Anson Kao", + "description": "A small collection of custom nodes for use with ComfyUI, by Discopixel", + "nickname": "ComfyUI Discopixel", + "title": "ComfyUI Discopixel", + "title_aux": "ComfyUI Discopixel Nodes" + } + ], + "https://github.com/discus0434/comfyui-caching-embeddings": [ + [ + "CachingCLIPTextEncode" + ], + { + "title_aux": "ComfyUI Caching Embeddings" + } + ], + "https://github.com/djbielejeski/a-person-mask-generator": [ + [ + "APersonFaceLandmarkMaskGenerator", + "APersonMaskGenerator" + ], + { + "title_aux": "a-person-mask-generator" + } + ], + "https://github.com/dmMaze/sketch2manga": [ + [ + "BlendScreentone", + "EmptyLatentImageAdvanced" + ], + { + "title_aux": "Sketch2Manga" + } + ], + "https://github.com/dmarx/ComfyUI-AudioReactive": [ + [ + "OpAbs", + "OpBandpass", + "OpClamp", + "OpHarmonic", + "OpModulo", + "OpNormalize", + "OpNovelty", + "OpPercussive", + "OpPow", + "OpPow2", + "OpPredominant_pulse", + "OpQuantize", + "OpRms", + "OpSmoosh", + "OpSmooth", + "OpSqrt", + "OpStretch", + "OpSustain", + "OpThreshold" + ], + { + "title_aux": "ComfyUI-AudioReactive" + } + ], + "https://github.com/dmarx/ComfyUI-Keyframed": [ + [ + "Example", + "KfAddCurveToPGroup", + "KfAddCurveToPGroupx10", + "KfApplyCurveToCond", + "KfConditioningAdd", + "KfConditioningAddx10", + "KfCurveConstant", + "KfCurveDraw", + "KfCurveFromString", + "KfCurveFromYAML", + "KfCurveInverse", + "KfCurveToAcnLatentKeyframe", + "KfCurvesAdd", + "KfCurvesAddx10", + "KfCurvesDivide", + "KfCurvesMultiply", + "KfCurvesMultiplyx10", + "KfCurvesSubtract", + "KfDebug_Clip", + "KfDebug_Cond", + "KfDebug_Curve", + "KfDebug_Float", + "KfDebug_Image", + "KfDebug_Int", + "KfDebug_Latent", + "KfDebug_Model", + "KfDebug_Passthrough", + "KfDebug_Segs", + "KfDebug_String", + "KfDebug_Vae", + "KfDrawSchedule", + "KfEvaluateCurveAtT", + "KfGetCurveFromPGroup", + "KfGetScheduleConditionAtTime", + "KfGetScheduleConditionSlice", + "KfKeyframedCondition", + "KfKeyframedConditionWithText", + "KfPGroupCurveAdd", + "KfPGroupCurveMultiply", + "KfPGroupDraw", + "KfPGroupProd", + "KfPGroupSum", + "KfSetCurveLabel", + "KfSetKeyframe", + "KfSinusoidalAdjustAmplitude", + "KfSinusoidalAdjustFrequency", + "KfSinusoidalAdjustPhase", + "KfSinusoidalAdjustWavelength", + "KfSinusoidalEntangledZeroOneFromFrequencyx2", + "KfSinusoidalEntangledZeroOneFromFrequencyx3", + "KfSinusoidalEntangledZeroOneFromFrequencyx4", + "KfSinusoidalEntangledZeroOneFromFrequencyx5", + "KfSinusoidalEntangledZeroOneFromFrequencyx6", + "KfSinusoidalEntangledZeroOneFromFrequencyx7", + "KfSinusoidalEntangledZeroOneFromFrequencyx8", + "KfSinusoidalEntangledZeroOneFromFrequencyx9", + "KfSinusoidalEntangledZeroOneFromWavelengthx2", + "KfSinusoidalEntangledZeroOneFromWavelengthx3", + "KfSinusoidalEntangledZeroOneFromWavelengthx4", + "KfSinusoidalEntangledZeroOneFromWavelengthx5", + "KfSinusoidalEntangledZeroOneFromWavelengthx6", + "KfSinusoidalEntangledZeroOneFromWavelengthx7", + "KfSinusoidalEntangledZeroOneFromWavelengthx8", + "KfSinusoidalEntangledZeroOneFromWavelengthx9", + "KfSinusoidalGetAmplitude", + "KfSinusoidalGetFrequency", + "KfSinusoidalGetPhase", + "KfSinusoidalGetWavelength", + "KfSinusoidalWithFrequency", + "KfSinusoidalWithWavelength" + ], + { + "title_aux": "ComfyUI-Keyframed" + } + ], + "https://github.com/drago87/ComfyUI_Dragos_Nodes": [ + [ + "file_padding", + "image_info", + "lora_loader", + "vae_loader" + ], + { + "title_aux": "ComfyUI_Dragos_Nodes" + } + ], + "https://github.com/drustan-hawk/primitive-types": [ + [ + "float", + "int", + "string", + "string_multiline" + ], + { + "title_aux": "primitive-types" + } + ], + "https://github.com/e7mac/ComfyUI-ShadertoyGL": [ + [ + "ColorChannelOffset", + "Shader", + "Shadertoy" + ], + { + "title_aux": "ComfyUI-ShadertoyGL" + } + ], + "https://github.com/ealkanat/comfyui_easy_padding": [ + [ + "comfyui-easy-padding" + ], + { + "title_aux": "ComfyUI Easy Padding" + } + ], + "https://github.com/edenartlab/eden_comfy_pipelines": [ + [ + "Animation_RGB_Mask", + "CLIP_Interrogator", + "ConvertToGrayscale", + "Eden_Bool", + "Eden_Compare", + "Eden_DebugPrint", + "Eden_Float", + "Eden_Int", + "Eden_Lora_Loader", + "Eden_String", + "FolderScanner", + "GetRandomFile", + "Get_Prefixed_Imgs", + "HistogramMatching", + "IMG_blender", + "IMG_padder", + "IMG_resolution_multiple_of", + "IMG_scaler", + "IMG_unpadder", + "If ANY execute A else B", + "ImageDescriptionNode", + "LatentTypeConversion", + "Linear_Combine_IP_Embeds", + "LoadImagesByFilename", + "LoadRandomImage", + "Load_Embeddings_From_Folder", + "MaskFromRGB", + "MaskFromRGB_KMeans", + "Random_Style_Mixture", + "SaveImageAdvanced", + "SavePosEmbeds", + "VAEDecode_to_folder", + "VideoFrameSelector", + "WidthHeightPicker" + ], + { + "title_aux": "Various custom nodes by Eden.art" + } + ], + "https://github.com/evanspearman/ComfyMath": [ + [ + "CM_BoolBinaryOperation", + "CM_BoolToInt", + "CM_BoolUnaryOperation", + "CM_BreakoutVec2", + "CM_BreakoutVec3", + "CM_BreakoutVec4", + "CM_ComposeVec2", + "CM_ComposeVec3", + "CM_ComposeVec4", + "CM_FloatBinaryCondition", + "CM_FloatBinaryOperation", + "CM_FloatToInt", + "CM_FloatToNumber", + "CM_FloatUnaryCondition", + "CM_FloatUnaryOperation", + "CM_IntBinaryCondition", + "CM_IntBinaryOperation", + "CM_IntToBool", + "CM_IntToFloat", + "CM_IntToNumber", + "CM_IntUnaryCondition", + "CM_IntUnaryOperation", + "CM_NearestSDXLResolution", + "CM_NumberBinaryCondition", + "CM_NumberBinaryOperation", + "CM_NumberToFloat", + "CM_NumberToInt", + "CM_NumberUnaryCondition", + "CM_NumberUnaryOperation", + "CM_SDXLResolution", + "CM_Vec2BinaryCondition", + "CM_Vec2BinaryOperation", + "CM_Vec2ScalarOperation", + "CM_Vec2ToScalarBinaryOperation", + "CM_Vec2ToScalarUnaryOperation", + "CM_Vec2UnaryCondition", + "CM_Vec2UnaryOperation", + "CM_Vec3BinaryCondition", + "CM_Vec3BinaryOperation", + "CM_Vec3ScalarOperation", + "CM_Vec3ToScalarBinaryOperation", + "CM_Vec3ToScalarUnaryOperation", + "CM_Vec3UnaryCondition", + "CM_Vec3UnaryOperation", + "CM_Vec4BinaryCondition", + "CM_Vec4BinaryOperation", + "CM_Vec4ScalarOperation", + "CM_Vec4ToScalarBinaryOperation", + "CM_Vec4ToScalarUnaryOperation", + "CM_Vec4UnaryCondition", + "CM_Vec4UnaryOperation" + ], + { + "title_aux": "ComfyMath" + } + ], + "https://github.com/exdysa/comfyui-selector": [ + [ + "Fork", + "ForkClip", + "Recourse", + "Recourse+/-", + "RecourseCkpt", + "RecourseImage", + "Selector", + "Unite" + ], + { + "author": "\"\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6\"", + "description": "\"EXDYSA. Selector and Recourse. Presets & failsafes. Work flow.\"", + "nickname": "\"Selector\"", + "title": "\"Selector\"", + "title_aux": "comfyui-selector" + } + ], + "https://github.com/fablestudio/ComfyUI-Showrunner-Utils": [ + [ + "AlignFace" + ], + { + "title_aux": "ComfyUI-Showrunner-Utils" + } + ], + "https://github.com/fearnworks/ComfyUI_FearnworksNodes/raw/main/fw_nodes.py": [ + [ + "Count Files in Directory (FW)", + "Count Tokens (FW)", + "Token Count Ranker(FW)", + "Trim To Tokens (FW)" + ], + { + "title_aux": "Fearnworks Custom Nodes" + } + ], + "https://github.com/fexli/fexli-util-node-comfyui": [ + [ + "FEBCPrompt", + "FEBatchGenStringBCDocker", + "FEColor2Image", + "FEColorOut", + "FEDataInsertor", + "FEDataPacker", + "FEDataUnpacker", + "FEDeepClone", + "FEDictPacker", + "FEDictUnpacker", + "FEEncLoraLoader", + "FEExtraInfoAdd", + "FEGenStringBCDocker", + "FEGenStringGPT", + "FEImageNoiseGenerate", + "FEImagePadForOutpaint", + "FEImagePadForOutpaintByImage", + "FEOperatorIf", + "FEPythonStrOp", + "FERandomBool", + "FERandomLoraSelect", + "FERandomPrompt", + "FERandomizedColor2Image", + "FERandomizedColorOut", + "FERerouteWithName", + "FESaveEncryptImage", + "FETextCombine", + "FETextCombine2Any", + "FETextInput" + ], + { + "title_aux": "fexli-util-node-comfyui" + } + ], + "https://github.com/fexploit/ComfyUI-AutoLabel": [ + [ + "AutoLabel" + ], + { + "title_aux": "ComfyUI-AutoLabel" + } + ], + "https://github.com/fexploit/ComfyUI-AutoTrimBG": [ + [ + "RonLayers/TrimBg: RonLayersTrimBgUltraV2" + ], + { + "title_aux": "ComfyUI-AutoTrimBG" + } + ], + "https://github.com/fexploit/ComfyUI-Classifier": [ + [ + "ClassifierNode" + ], + { + "title_aux": "ComfyUI-Classifier" + } + ], + "https://github.com/filipemeneses/comfy_pixelization": [ + [ + "Pixelization" + ], + { + "title_aux": "Pixelization" + } + ], + "https://github.com/filliptm/ComfyUI_Fill-Nodes": [ + [ + "FL_Ascii", + "FL_AudioConverter", + "FL_AudioFrameCalculator", + "FL_AudioPreview", + "FL_BatchAlign", + "FL_CodeNode", + "FL_DirectoryCrawl", + "FL_Glitch", + "FL_HalftonePattern", + "FL_HexagonalPattern", + "FL_ImageCaptionSaver", + "FL_ImageCollage", + "FL_ImageDimensionDisplay", + "FL_ImageDurationSync", + "FL_ImageNotes", + "FL_ImagePixelator", + "FL_ImageRandomizer", + "FL_InfiniteZoom", + "FL_InpaintCrop", + "FL_Inpaint_Stitch", + "FL_KsamplerSettings", + "FL_NFTGenerator", + "FL_PaperDrawn", + "FL_PasteOnCanvas", + "FL_PixelArtShader", + "FL_PixelSort", + "FL_PromptSelector", + "FL_RandomNumber", + "FL_RetroEffect", + "FL_Ripple", + "FL_SDUltimate_Slices", + "FL_SeparateMaskComponents", + "FL_Shadertoy", + "FL_TD_Sampler", + "FL_VideoCropMask", + "FL_VideoRecompose" + ], + { + "title_aux": "ComfyUI_Fill-Nodes" + } + ], + "https://github.com/fitCorder/fcSuite/raw/main/fcSuite.py": [ + [ + "fcFloat", + "fcFloatMatic", + "fcHex", + "fcInteger" + ], + { + "title_aux": "fcSuite" + } + ], + "https://github.com/florestefano1975/ComfyUI-HiDiffusion": [ + [ + "HiDiffusionSD15", + "HiDiffusionSD21", + "HiDiffusionSDXL", + "HiDiffusionSDXLTurbo" + ], + { + "title_aux": "ComfyUI HiDiffusion" + } + ], + "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": [ + [ + "StabilityAI Suite - Creative Upscale", + "StabilityAI Suite - Creative Upscale Recover File", + "StabilityAI Suite - Image Core + Style Preset", + "StabilityAI Suite - Inpainting", + "StabilityAI Suite - Outpainting", + "StabilityAI Suite - Remove Background", + "StabilityAI Suite - SD3", + "StabilityAI Suite - Search and Replace" + ], + { + "title_aux": "ComfyUI StabilityAI Suite" + } + ], + "https://github.com/florestefano1975/comfyui-portrait-master": [ + [ + "PortraitMaster" + ], + { + "title_aux": "comfyui-portrait-master" + } + ], + "https://github.com/florestefano1975/comfyui-prompt-composer": [ + [ + "PromptComposerCustomLists", + "PromptComposerEffect", + "PromptComposerGrouping", + "PromptComposerMerge", + "PromptComposerStyler", + "PromptComposerTextSingle", + "promptComposerTextMultiple" + ], + { + "title_aux": "comfyui-prompt-composer" + } + ], + "https://github.com/flowtyone/ComfyUI-Flowty-CRM": [ + [ + "CCMSampler", + "CRMModelLoader", + "CRMModeler", + "CRMModelerCuda", + "CRMPoseSampler", + "CRMPoserConfig", + "CRMPreprocessForPoser", + "CRMViewer" + ], + { + "title_aux": "ComfyUI-Flowty-CRM" + } + ], + "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": [ + [ + "LDSRModelLoader", + "LDSRUpscale", + "LDSRUpscaler" + ], + { + "title_aux": "ComfyUI-Flowty-LDSR" + } + ], + "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": [ + [ + "TripoSRModelLoader", + "TripoSRSampler", + "TripoSRViewer" + ], + { + "title_aux": "ComfyUI-Flowty-TripoSR" + } + ], + "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": [ + [ + "BatchIndex_AS", + "CropImage_AS", + "Eval_AS", + "ImageMixMasked_As", + "ImageToMask_AS", + "Increment_AS", + "Int2Any_AS", + "LatentAdd_AS", + "LatentMixMasked_As", + "LatentMix_AS", + "LatentToImages_AS", + "LoadLatent_AS", + "MapRange_AS", + "MaskToImage_AS", + "Math_AS", + "NoiseImage_AS", + "Number2Float_AS", + "Number2Int_AS", + "Number_AS", + "SaveLatent_AS", + "TextToImage_AS", + "TextWildcardList_AS" + ], + { + "title_aux": "As_ComfyUI_CustomNodes" + } + ], + "https://github.com/fmatray/ComfyUI_BattlemapGrid": [ + [ + "Battlemap Grid", + "Compass", + "Map Generator", + "Map Generator(Outdoors)" + ], + { + "title_aux": "ComfyUI_BattlemapGrid" + } + ], + "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": [ + [ + "HyperSDXL1StepUnetScheduler" + ], + { + "title_aux": "ComfyUI-HyperSDXL1StepUnetScheduler (ByteDance)" + } + ], + "https://github.com/fofr/ComfyUI-Prompter-fofrAI": [ + [ + "List sampler \ud83e\udeb4", + "Prompt from template \ud83e\udeb4" + ], + { + "title_aux": "ComfyUI-Prompter-fofrAI" + } + ], + "https://github.com/forever22777/comfyui-self-guidance": [ + [ + "CLIPConditioning", + "CheckpointLoaderMixWithDiffusers", + "SelfGuidanceSampler" + ], + { + "title_aux": "Self-Guidance nodes" + } + ], + "https://github.com/foxtrot-roger/comfyui-rf-nodes": [ + [ + "LogBool", + "LogFloat", + "LogInt", + "LogNumber", + "LogString", + "LogVec2", + "LogVec3", + "RF_AtIndexString", + "RF_BoolToString", + "RF_FloatToString", + "RF_IntToString", + "RF_JsonStyleLoader", + "RF_MergeLines", + "RF_NumberToString", + "RF_OptionsString", + "RF_RangeFloat", + "RF_RangeInt", + "RF_RangeNumber", + "RF_SavePromptInfo", + "RF_SplitLines", + "RF_TextConcatenate", + "RF_TextInput", + "RF_TextReplace", + "RF_Timestamp", + "RF_ToString", + "RF_Vec2ToString", + "RF_Vec3ToString", + "TextLine" + ], + { + "title_aux": "RF Nodes" + } + ], + "https://github.com/frankchieng/ComfyUI_Aniportrait": [ + [ + "AniPortrait_Audio2Video", + "AniPortrait_Audio_Path", + "AniPortrait_LoadVideoPath", + "AniPortrait_Pose_Gen_Video", + "AniPortrait_Ref_Image_Path", + "AniPortrait_Video_Gen_Pose" + ], + { + "title_aux": "ComfyUI_Aniportrait" + } + ], + "https://github.com/frankchieng/ComfyUI_MagicClothing": [ + [ + "MagicClothing_Animatediff", + "MagicClothing_Generate", + "MagicClothing_Inpainting" + ], + { + "title_aux": "ComfyUI_MagicClothing" + } + ], + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": [ + [], + { + "nodename_pattern": "^FrankChiengEasyAnimate", + "title_aux": "ComfyUI_llm_easyanimiate" + } + ], + "https://github.com/fsdymy1024/ComfyUI_fsdymy": [ + [ + "IPAdapterLayerWeight", + "Preview Image Without Metadata", + "PreviewImageWithoutMetadata", + "Save Image Without Metadata", + "SaveImageWithoutMetadata", + "ShowText", + "ZhiPuAiNode" + ], + { + "title_aux": "ComfyUI_fsdymy" + } + ], + "https://github.com/gemell1/ComfyUI_GMIC": [ + [ + "GmicCliWrapper", + "GmicQtWrapper" + ], + { + "title_aux": "ComfyUI_GMIC" + } + ], + "https://github.com/get-salt-AI/SaltAI": [ + [ + "SAIPrimitiveConverter", + "SAIStringRegexSearchMatch", + "SAIStringRegexSearchReplace", + "SaltAIStableVideoDiffusion", + "SaltBatchCropDataExtractor", + "SaltCLIPSegLoader", + "SaltCLIPSegMasking", + "SaltCropImageLocation", + "SaltDisplayAny", + "SaltImagePasteCrop", + "SaltInfo", + "SaltInput", + "SaltLoadImageZip", + "SaltMaskCropRegion", + "SaltMasksToImages", + "SaltOutput", + "SaltRGBAFromMask", + "SaltWebsiteScreenshot" + ], + { + "title_aux": "SaltAI-Open-Resources" + } + ], + "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": [ + [ + "AddTool", + "ChangeSystemMessage", + "ClearMemory", + "ConversableAgentCreator", + "ConversableAgentCreatorAdvanced", + "ConvertAgentAsTool", + "ConvertAgentToLlamaindex", + "CreateTavilySearchTool", + "Example", + "GenerateReply", + "GroupChat", + "GroupChatAdvanced", + "GroupChatManagerCreator", + "LLMCSVReader", + "LLMChat", + "LLMChatBot", + "LLMChatEngine", + "LLMChatMessageConcat", + "LLMChatMessages", + "LLMChatMessagesAdv", + "LLMComplete", + "LLMCustomNodeComposer", + "LLMDirectoryReader", + "LLMDocumentListAppend", + "LLMDocxReader", + "LLMEpubReader", + "LLMFlatReader", + "LLMHTMLTagReader", + "LLMHWPReader", + "LLMHtmlComposer", + "LLMHtmlRepair", + "LLMIPYNBReader", + "LLMImageCaptionReader", + "LLMImageTabularChartReader", + "LLMImageTextReader", + "LLMImageVisionLLMReader", + "LLMInputToDocuments", + "LLMJsonComposer", + "LLMJsonRepair", + "LLMLLaVANextImageEvaluator", + "LLMLLaVANextModelLoader", + "LLMMarkdownComposer", + "LLMMarkdownReader", + "LLMMarkdownRepair", + "LLMMboxReader", + "LLMMultiModalImageEvaluation", + "LLMNotionReader", + "LLMOpenAIModel", + "LLMOpenAIModelOpts", + "LLMPDFReader", + "LLMPagedCSVReader", + "LLMPandasCSVReader", + "LLMParquetDatasetSearcher", + "LLMPostProcessDocuments", + "LLMPptxReader", + "LLMPyMuPDFReader", + "LLMQueryEngine", + "LLMQueryEngineAdv", + "LLMQueryEngineAsTool", + "LLMRTFReader", + "LLMRegexCreator", + "LLMRegexRepair", + "LLMRssReaderNode", + "LLMSaltWebCrawler", + "LLMScaleSERPSearch", + "LLMSemanticSplitterNodeParser", + "LLMSentenceSplitterNodeCreator", + "LLMServiceContextAdv", + "LLMServiceContextDefault", + "LLMSimpleWebPageReader", + "LLMSimpleWebPageReaderAdv", + "LLMSummaryIndex", + "LLMTavilyResearch", + "LLMTrafilaturaWebReader", + "LLMTrafilaturaWebReaderAdv", + "LLMTreeIndex", + "LLMUnstructuredReader", + "LLMVectorStoreIndex", + "LLMVectorStoreIndexAdv", + "LLMVideoAudioReader", + "LLMXMLReader", + "LLMYamlComposer", + "LLMYamlRepair", + "SaltJSONQueryEngine", + "SendMessage", + "SimpleChat" + ], + { + "title_aux": "SaltAI Language Toolkit" + } + ], + "https://github.com/get-salt-AI/SaltAI_LlamaIndex": [ + [ + "AddTool", + "ChangeSystemMessage", + "ClearMemory", + "ConversableAgentCreator", + "ConversableAgentCreatorAdvanced", + "ConvertAgentAsTool", + "ConvertAgentToLlamaindex", + "CreateTavilySearchTool", + "Example", + "GenerateReply", + "GroupChat", + "GroupChatAdvanced", + "GroupChatManagerCreator", + "LLMCSVReader", + "LLMChat", + "LLMChatBot", + "LLMChatEngine", + "LLMChatMessageConcat", + "LLMChatMessages", + "LLMChatMessagesAdv", + "LLMComplete", + "LLMCustomNodeComposer", + "LLMDirectoryReader", + "LLMDocumentListAppend", + "LLMDocxReader", + "LLMEpubReader", + "LLMFlatReader", + "LLMHTMLTagReader", + "LLMHWPReader", + "LLMHtmlComposer", + "LLMHtmlRepair", + "LLMIPYNBReader", + "LLMImageCaptionReader", + "LLMImageTabularChartReader", + "LLMImageTextReader", + "LLMImageVisionLLMReader", + "LLMInputToDocuments", + "LLMJsonComposer", + "LLMJsonRepair", + "LLMLLaVANextImageEvaluator", + "LLMLLaVANextModelLoader", + "LLMMarkdownComposer", + "LLMMarkdownReader", + "LLMMarkdownRepair", + "LLMMboxReader", + "LLMMultiModalImageEvaluation", + "LLMNotionReader", + "LLMOpenAIModel", + "LLMOpenAIModelOpts", + "LLMPDFReader", + "LLMPagedCSVReader", + "LLMPandasCSVReader", + "LLMParquetDatasetSearcher", + "LLMPostProcessDocuments", + "LLMPptxReader", + "LLMPyMuPDFReader", + "LLMQueryEngine", + "LLMQueryEngineAdv", + "LLMQueryEngineAsTool", + "LLMRTFReader", + "LLMRegexCreator", + "LLMRegexRepair", + "LLMRssReaderNode", + "LLMSaltWebCrawler", + "LLMScaleSERPSearch", + "LLMSemanticSplitterNodeParser", + "LLMSentenceSplitterNodeCreator", + "LLMServiceContextAdv", + "LLMServiceContextDefault", + "LLMSimpleWebPageReader", + "LLMSimpleWebPageReaderAdv", + "LLMSummaryIndex", + "LLMTavilyResearch", + "LLMTrafilaturaWebReader", + "LLMTrafilaturaWebReaderAdv", + "LLMTreeIndex", + "LLMUnstructuredReader", + "LLMVectorStoreIndex", + "LLMVectorStoreIndexAdv", + "LLMVideoAudioReader", + "LLMXMLReader", + "LLMYamlComposer", + "LLMYamlRepair", + "SaltJSONQueryEngine", + "SendMessage", + "SimpleChat" + ], + { + "title_aux": "SaltAI_LlamaIndex" + } + ], + "https://github.com/giriss/comfy-image-saver": [ + [ + "Cfg Literal", + "Checkpoint Selector", + "Int Literal", + "Sampler Selector", + "Save Image w/Metadata", + "Scheduler Selector", + "Seed Generator", + "String Literal", + "Width/Height Literal" + ], + { + "title_aux": "Save Image with Generation Metadata" + } + ], + "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": [ + [ + "ChangeImageBorder" + ], + { + "title_aux": "ComfyUI_Change_IMAGE_BOREDER" + } + ], + "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": [ + [ + "GetFileNameFromURL" + ], + { + "title_aux": "ComfyUI_GetFileNameFromURL" + } + ], + "https://github.com/githubYiheng/comfyui_kmeans_filter": [ + [ + "ImageKmeansFilter" + ], + { + "title_aux": "comfyui_kmeans_filter" + } + ], + "https://github.com/githubYiheng/comfyui_meanshift_filter": [ + [ + "ImageMeanshiftFilter" + ], + { + "title_aux": "comfyui_meanshift_filter" + } + ], + "https://github.com/githubYiheng/comfyui_private_postprocessor": [ + [ + "ImageCPostprocessor", + "PrivateImageMask" + ], + { + "title_aux": "comfyui_private_postprocessor" + } + ], + "https://github.com/glibsonoran/Plush-for-ComfyUI": [ + [ + "AI Chooser", + "AdvPromptEnhancer", + "DalleImage", + "Enhancer", + "ImgTextSwitch", + "Plush-Exif Wrangler", + "Tagger", + "mulTextSwitch" + ], + { + "title_aux": "Plush-for-ComfyUI" + } + ], + "https://github.com/glifxyz/ComfyUI-GlifNodes": [ + [ + "GlifConsistencyDecoder", + "GlifPatchConsistencyDecoderTiled", + "GlifVariable", + "HFHubEmbeddingLoader", + "HFHubLoraLoader", + "ImageToMultipleOf", + "SDXLAspectRatio" + ], + { + "title_aux": "ComfyUI-GlifNodes" + } + ], + "https://github.com/glowcone/comfyui-base64-to-image": [ + [ + "LoadImageFromBase64" + ], + { + "title_aux": "Load Image From Base64 URI" + } + ], + "https://github.com/godspede/ComfyUI_Substring": [ + [ + "SubstringTheory" + ], + { + "title_aux": "ComfyUI Substring" + } + ], + "https://github.com/gokayfem/ComfyUI-Depth-Visualization": [ + [ + "DepthViewer" + ], + { + "title_aux": "ComfyUI-Depth-Visualization" + } + ], + "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": [ + [ + "DreamViewer" + ], + { + "title_aux": "ComfyUI-Dream-Interpreter" + } + ], + "https://github.com/gokayfem/ComfyUI-Texture-Simple": [ + [ + "TextureViewer" + ], + { + "title_aux": "ComfyUI-Texture-Simple" + } + ], + "https://github.com/gokayfem/ComfyUI_VLM_nodes": [ + [ + "AudioLDM2Node", + "ChatMusician", + "CreativeArtPromptGenerator", + "Internlm", + "Joytag", + "JsonToText", + "KeywordExtraction", + "Kosmos2model", + "LLMLoader", + "LLMPromptGenerator", + "LLMSampler", + "LLava Loader Simple", + "LLavaOptionalMemoryFreeAdvanced", + "LLavaOptionalMemoryFreeSimple", + "LLavaPromptGenerator", + "LLavaSamplerAdvanced", + "LLavaSamplerSimple", + "LlavaClipLoader", + "MCLLaVAModel", + "MoonDream", + "Moondream2model", + "PlayMusic", + "PromptGenerateAPI", + "SaveAudioNode", + "SimpleText", + "StructuredOutput", + "Suggester", + "UformGen2QwenNode", + "ViewText" + ], + { + "title_aux": "VLM_nodes" + } + ], + "https://github.com/gonzalu/ComfyUI_YFG_Comical": [ + [ + "Image10Switcher_node", + "Image15Switcher_node", + "Image20Switcher_node", + "Image3Switcher_node", + "Image5Switcher_node", + "MonoClip_node", + "PixelArt_node", + "VAEDecodePreview_node", + "image2contrastMask_node", + "image2imbgg_node", + "image_halftone", + "image_histograms_node", + "image_histograms_node_compact", + "images_side_by_side", + "imgbbLoader_node", + "smartCheckpointLoader_node", + "storeURL_node", + "textMaskOverlay_node" + ], + { + "author": "Manny Gonzalez", + "description": "Utility custom nodes for special effects, image manipulation and quality of life tools.", + "nickname": "\ud83d\udc2f YFG Comical Nodes", + "title": "\ud83d\udc2f YFG Comical Nodes", + "title_aux": "\ud83d\ude38 YFG Comical Nodes" + } + ], + "https://github.com/griptape-ai/ComfyUI-Griptape": [ + [ + "Griptape Agent Config: Amazon Bedrock", + "Griptape Agent Config: Anthropic", + "Griptape Agent Config: Google", + "Griptape Agent Config: LM Studio", + "Griptape Agent Config: Ollama", + "Griptape Agent Config: OpenAI", + "Griptape Audio Driver: OpenAI", + "Griptape Combine: Merge Inputs", + "Griptape Combine: Merge Texts", + "Griptape Combine: Rules List", + "Griptape Combine: Tool List", + "Griptape Config: Environment Variables", + "Griptape Convert: Text to CLIP Encode", + "Griptape Convert: Text to Combo", + "Griptape Create: Agent", + "Griptape Create: CLIP Text Encode", + "Griptape Create: Image Variation", + "Griptape Create: Image from Text", + "Griptape Create: Rules", + "Griptape Create: Text", + "Griptape Display: Artifact", + "Griptape Display: Data as Text", + "Griptape Display: Image", + "Griptape Display: Text", + "Griptape Driver: Amazon Bedrock Stable Diffusion", + "Griptape Driver: Amazon Bedrock Titan", + "Griptape Driver: Leonardo.AI", + "Griptape Driver: OpenAI Image Generation", + "Griptape Expand: Agent Nodes", + "Griptape Load: Audio", + "Griptape Load: Image From URL", + "Griptape Run: Agent", + "Griptape Run: Audio Transcription", + "Griptape Run: Image Description", + "Griptape Run: Parallel Image Description", + "Griptape Run: Prompt Task", + "Griptape Run: Text Summary", + "Griptape Run: Tool Task", + "Griptape Run: Toolkit Task", + "Griptape Set: Default Agent", + "Griptape Tool: Audio Transcription", + "Griptape Tool: Calculator", + "Griptape Tool: DateTime", + "Griptape Tool: FileManager", + "Griptape Tool: Griptape Cloud KnowledgeBase", + "Griptape Tool: WebScraper", + "Griptape Tool: WebSearch" + ], + { + "author": "Jason Schleifer", + "description": "This extension offers various nodes that allow you to work with LLMs using the Griptape Python Framework (https://griptape.ai)", + "nickname": "ComfyUI-Griptape", + "title": "ComfyUI Griptape Nodes", + "title_aux": "ComfyUI Griptape Nodes" + } + ], + "https://github.com/guill/abracadabra-comfyui": [ + [ + "AbracadabraNode", + "AbracadabraNodeDefSummary" + ], + { + "title_aux": "abracadabra-comfyui" + } + ], + "https://github.com/guoyk93/yk-node-suite-comfyui": [ + [ + "YKImagePadForOutpaint", + "YKMaskToImage" + ], + { + "title_aux": "y.k.'s ComfyUI node suite" + } + ], + "https://github.com/hackkhai/ComfyUI-Image-Matting": [ + [ + "ApplyMatting", + "CreateTrimap", + "MattingModelLoader" + ], + { + "title_aux": "ComfyUI-Image-Matting" + } + ], + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": [ + [ + "Image Selector" + ], + { + "title_aux": "ComfyUI-HH-Image-Selector" + } + ], + "https://github.com/hay86/ComfyUI_AceNodes": [ + [ + "ACE_AnyInputSwitchBool", + "ACE_AudioLoad", + "ACE_AudioPlay", + "ACE_AudioSave", + "ACE_Expression_Eval", + "ACE_Float", + "ACE_ImageColorFix", + "ACE_ImageConstrain", + "ACE_ImageFaceCrop", + "ACE_ImageGetSize", + "ACE_ImageLoadFromCloud", + "ACE_ImageQA", + "ACE_ImageRemoveBackground", + "ACE_ImageSaveToCloud", + "ACE_Integer", + "ACE_MaskBlur", + "ACE_Seed", + "ACE_Text", + "ACE_TextConcatenate", + "ACE_TextGoogleTranslate", + "ACE_TextInputSwitch2Way", + "ACE_TextInputSwitch4Way", + "ACE_TextInputSwitch8Way", + "ACE_TextList", + "ACE_TextPreview", + "ACE_TextSelector", + "ACE_TextToResolution", + "ACE_TextTranslate" + ], + { + "title_aux": "ComfyUI AceNodes" + } + ], + "https://github.com/hay86/ComfyUI_DDColor": [ + [ + "D_DDColor" + ], + { + "title_aux": "ComfyUI DDColor" + } + ], + "https://github.com/hay86/ComfyUI_Dreamtalk": [ + [ + "D_DreamTalk" + ], + { + "title_aux": "ComfyUI Dreamtalk" + } + ], + "https://github.com/hay86/ComfyUI_Hallo": [ + [ + "D_HalloNode" + ], + { + "title_aux": "ComfyUI Hallo" + } + ], + "https://github.com/hay86/ComfyUI_MiniCPM-V": [ + [ + "D_MiniCPM_VQA" + ], + { + "title_aux": "ComfyUI MiniCPM-V" + } + ], + "https://github.com/hay86/ComfyUI_OpenVoice": [ + [ + "D_OpenVoice_STS", + "D_OpenVoice_TTS", + "D_OpenVoice_TTS_V2" + ], + { + "title_aux": "ComfyUI OpenVoice" + } + ], + "https://github.com/hben35096/ComfyUI-ToolBox": [ + [ + "AutoDLDownload", + "FolderDeleter", + "FolderViewe" + ], + { + "title_aux": "ComfyUI-ToolBox" + } + ], + "https://github.com/heshengtao/comfyui_LLM_party": [ + [ + "About_us", + "CLIPTextEncode_party", + "CosyVoice", + "Dingding", + "Dingding_tool", + "KG_csv_toolkit_developer", + "KG_csv_toolkit_user", + "KG_json_toolkit_developer", + "KG_json_toolkit_user", + "KG_neo_toolkit_developer", + "KG_neo_toolkit_user", + "KSampler_party", + "LLM", + "LLM_api_loader", + "LLM_local", + "LLM_local_loader", + "LLavaLoader", + "VAEDecode_party", + "accuweather_tool", + "api_tool", + "arxiv_tool", + "bing_tool", + "check_web_tool", + "classify_function", + "classify_function_plus", + "classify_persona", + "classify_persona_plus", + "custom_persona", + "ebd_tool", + "end_dialog", + "end_workflow", + "feishu", + "feishu_tool", + "file_combine", + "file_combine_plus", + "get_string", + "github_tool", + "google_tool", + "image_iterator", + "interpreter_tool", + "json_get_value", + "json_parser", + "keyword_tool", + "listen_audio", + "llama_guff_loader", + "load_embeddings", + "load_excel", + "load_file", + "load_file_folder", + "load_keyword", + "load_name", + "load_persona", + "load_url", + "load_wikipedia", + "new_interpreter_tool", + "omost_decode", + "omost_setting", + "openai_tts", + "openai_whisper", + "play_audio", + "replace_string", + "show_text_party", + "start_dialog", + "start_workflow", + "story_json_tool", + "string_logic", + "substring", + "text_iterator", + "time_tool", + "tool_combine", + "tool_combine_plus", + "translate_persona", + "weather_tool", + "weekday_tool", + "wikipedia_tool", + "work_wechat", + "work_wechat_tool", + "workflow_tool", + "workflow_transfer" + ], + { + "title_aux": "comfyui_LLM_party" + } + ], + "https://github.com/hhhzzyang/Comfyui_Lama": [ + [ + "LamaApply", + "LamaModelLoader", + "YamlConfigLoader" + ], + { + "title_aux": "Comfyui-Lama" + } + ], + "https://github.com/hiforce/comfyui-hiforce-plugin": [ + [ + "HfBoolSwitchKSampleStatus", + "HfImageAutoExpansionSquare", + "HfImageToRGB", + "HfImageToRGBA", + "HfInitImageWithMaxSize", + "HfIterativeLatentUpscale", + "HfLoadImageWithCropper", + "HfLookbackSamplerLoader", + "HfLoopback", + "HfResizeImage", + "HfSampler", + "HfSamplerLoader", + "HfSamplerLoopback", + "HfSaveImage", + "HfSwitchKSampleStatus", + "HfTwoSamplersForMask", + "HfTwoStepSamplers", + "LoadImageFromURL" + ], + { + "title_aux": "Comfyui HiFORCE Plugin" + } + ], + "https://github.com/hinablue/ComfyUI_3dPoseEditor": [ + [ + "Hina.PoseEditor3D" + ], + { + "title_aux": "ComfyUI 3D Pose Editor" + } + ], + "https://github.com/holchan/ComfyUI-ModelDownloader": [ + [ + "LoRADownloader", + "ModelDownloader" + ], + { + "title_aux": "ComfyUI-ModelDownloader" + } + ], + "https://github.com/huagetai/ComfyUI-Gaffer": [ + [ + "ApplyICLight", + "CalculateNormalMap", + "GrayScaler", + "ICLightModelLoader", + "LightSource" + ], + { + "title_aux": "comfyui's gaffer(ComfyUI native implementation of IC-Light. )" + } + ], + "https://github.com/huagetai/ComfyUI_LightGradient": [ + [ + "ImageGradient", + "MaskGradient" + ], + { + "title_aux": "Light Gradient for ComfyUI" + } + ], + "https://github.com/huchenlei/ComfyUI-IC-Light-Native": [ + [ + "ICLightApplyMaskGrey", + "ICLightAppply", + "VAEEncodeArgMax" + ], + { + "title_aux": "ComfyUI-IC-Light-Native" + } + ], + "https://github.com/huchenlei/ComfyUI-layerdiffuse": [ + [ + "LayeredDiffusionApply", + "LayeredDiffusionCondApply", + "LayeredDiffusionCondJointApply", + "LayeredDiffusionDecode", + "LayeredDiffusionDecodeRGBA", + "LayeredDiffusionDecodeSplit", + "LayeredDiffusionDiffApply", + "LayeredDiffusionJointApply" + ], + { + "title_aux": "ComfyUI-layerdiffuse (layerdiffusion)" + } + ], + "https://github.com/huchenlei/ComfyUI-openpose-editor": [ + [ + "huchenlei.LoadOpenposeJSON" + ], + { + "title_aux": "ComfyUI-openpose-editor" + } + ], + "https://github.com/huchenlei/ComfyUI_DanTagGen": [ + [ + "PromptDanTagGen" + ], + { + "title_aux": "ComfyUI_DanTagGen" + } + ], + "https://github.com/huchenlei/ComfyUI_densediffusion": [ + [ + "DenseDiffusionAddCondNode", + "DenseDiffusionApplyNode" + ], + { + "title_aux": "ComfyUI DenseDiffusion" + } + ], + "https://github.com/huchenlei/ComfyUI_omost": [ + [ + "OmostDenseDiffusionLayoutNode", + "OmostGreedyBagsTextEmbeddingNode", + "OmostLLMChatNode", + "OmostLLMHTTPServerNode", + "OmostLLMLoaderNode", + "OmostLayoutCondNode", + "OmostLoadCanvasConditioningNode", + "OmostLoadCanvasPythonCodeNode", + "OmostRenderCanvasConditioningNode" + ], + { + "title_aux": "ComfyUI_omost" + } + ], + "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": [ + [ + "Openpose Keypoint Extractor" + ], + { + "title_aux": "OpenPose Keypoint Extractor" + } + ], + "https://github.com/hustille/ComfyUI_Fooocus_KSampler": [ + [ + "KSampler With Refiner (Fooocus)" + ], + { + "title_aux": "ComfyUI_Fooocus_KSampler" + } + ], + "https://github.com/hustille/ComfyUI_hus_utils": [ + [ + "3way Prompt Styler", + "Batch State", + "Date Time Format", + "Debug Extra", + "Fetch widget value", + "Text Hash" + ], + { + "title_aux": "hus' utils for ComfyUI" + } + ], + "https://github.com/hwhaocool/ComfyUI-Select-Any": [ + [ + "SelectAnyValues" + ], + { + "title_aux": "ComfyUI-Select-Any" + } + ], + "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo": [ + [ + "EagleImageNode", + "SDXLPromptStyler", + "SDXLPromptStylerAdvanced", + "SDXLResolutionPresets" + ], + { + "title_aux": "Eagle PNGInfo" + } + ], + "https://github.com/hyunamy/comfy-ui-on-complete-email-me": [ + [ + "OnCompleteEmailMe", + "OnCompleteWebhook" + ], + { + "title_aux": "Comfy-UI on-complete-email-me" + } + ], + "https://github.com/iFREEGROUP/comfyui-undistort": [ + [ + "IG_LoadCheckerboardImageForCalibrateCamera", + "IG_MatrixAndDistCoefToText", + "IG_Undistort" + ], + { + "title_aux": "comfyui-undistort" + } + ], + "https://github.com/icesun963/ComfyUI_HFDownLoad": [ + [ + "HFDownLoad_Tool" + ], + { + "title_aux": "HFDownLoad Node for ComfyUI" + } + ], + "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": [ + [ + "FusionText", + "LoraListNames", + "LoraLoaderAdvanced", + "LoraLoaderStackedAdvanced", + "LoraLoaderStackedVanilla", + "LoraLoaderVanilla", + "LoraTagsOnly", + "Randomizer", + "TagsFormater", + "TagsSelector", + "TextInputBasic" + ], + { + "title_aux": "ComfyUI-Lora-Auto-Trigger-Words" + } + ], + "https://github.com/iemesowum/ComfyUI_IsaacNodes": [ + [ + "I_BinaryAmplitudeGate", + "I_UnmixAudio", + "I_WeightsListToWeights" + ], + { + "author": "Isaac Emesowum", + "description": "This extension offers automatic drums extraction from audio files, as well as a few helper nodes to support my audio synchronization AnimateDiff workflows.", + "nickname": "Isaac's Nodes", + "title": "Isaac's Nodes", + "title_aux": "Isaac's Nodes" + } + ], + "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": [ + [ + "IF_HFDownload", + "IF_HFDownloadNode" + ], + { + "title_aux": "ComfyUI-IF_AI_HFDownloaderNode" + } + ], + "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": [ + [ + "IF_WhisperSpeech" + ], + { + "title_aux": "ComfyUI-IF_AI_WishperSpeechNode" + } + ], + "https://github.com/if-ai/ComfyUI-IF_AI_tools": [ + [ + "IF_ChatPrompt", + "IF_DisplayText", + "IF_ImagePrompt", + "IF_PromptMkr", + "IF_SaveText", + "IF_saveText" + ], + { + "title_aux": "ComfyUI-IF_AI_tools" + } + ], + "https://github.com/imb101/ComfyUI-FaceSwap": [ + [ + "FaceSwapNode" + ], + { + "title_aux": "FaceSwap" + } + ], + "https://github.com/iwanders/ComfyUI_nodes": [ + [ + "IW_JsonPickItem", + "IW_ModelHook", + "IW_StringConcat", + "IW_StringNode", + "IW_StringPrint", + "IW_StringReplace", + "IW_StringSave", + "IW_TokenizerVocab" + ], + { + "title_aux": "iwanders/ComfyUI_nodes" + } + ], + "https://github.com/jags111/ComfyUI_Jags_Audiotools": [ + [ + "BatchJoinAudio", + "BatchToList", + "BitCrushAudioFX", + "BulkVariation", + "ChorusAudioFX", + "ClippingAudioFX", + "CompressorAudioFX", + "ConcatAudioList", + "ConvolutionAudioFX", + "CutAudio", + "DelayAudioFX", + "DistortionAudioFX", + "DuplicateAudio", + "GainAudioFX", + "GenerateAudioSample", + "GenerateAudioWave", + "GetAudioFromFolderIndex", + "GetSingle", + "GetStringByIndex", + "HighShelfFilter", + "HighpassFilter", + "ImageToSpectral", + "InvertAudioFX", + "JoinAudio", + "LadderFilter", + "LimiterAudioFX", + "ListToBatch", + "LoadAudioDir", + "LoadAudioFile", + "LoadAudioModel (DD)", + "LoadVST3", + "LowShelfFilter", + "LowpassFilter", + "MP3CompressorAudioFX", + "MixAudioTensors", + "NoiseGateAudioFX", + "OTTAudioFX", + "PeakFilter", + "PhaserEffectAudioFX", + "PitchShiftAudioFX", + "PlotSpectrogram", + "PreviewAudioFile", + "PreviewAudioTensor", + "ResampleAudio", + "ReverbAudioFX", + "ReverseAudio", + "SaveAudioTensor", + "SequenceVariation", + "SliceAudio", + "SoundPlayer", + "StretchAudio", + "samplerate" + ], + { + "author": "jags111", + "description": "This extension offers various audio generation tools", + "nickname": "Audiotools", + "title": "Jags_Audiotools", + "title_aux": "Jags_Audiotools" + } + ], + "https://github.com/jags111/ComfyUI_Jags_VectorMagic": [ + [ + "CircularVAEDecode", + "JagsCLIPSeg", + "JagsClipseg", + "JagsCombineMasks", + "SVG", + "YoloSEGdetectionNode", + "YoloSegNode", + "color_drop", + "xy_Tiling_KSampler" + ], + { + "author": "jags111", + "description": "This extension offers various vector manipulation and generation tools", + "nickname": "Jags_VectorMagic", + "title": "Jags_VectorMagic", + "title_aux": "Jags_VectorMagic" + } + ], + "https://github.com/jags111/efficiency-nodes-comfyui": [ + [ + "AnimateDiff Script", + "Apply ControlNet Stack", + "Control Net Stacker", + "Eff. Loader SDXL", + "Efficient Loader", + "HighRes-Fix Script", + "Image Overlay", + "Join XY Inputs of Same Type", + "KSampler (Efficient)", + "KSampler Adv. (Efficient)", + "KSampler SDXL (Eff.)", + "LatentUpscaler", + "LoRA Stack to String converter", + "LoRA Stacker", + "Manual XY Entry Info", + "NNLatentUpscale", + "Noise Control Script", + "Pack SDXL Tuple", + "Tiled Upscaler Script", + "Unpack SDXL Tuple", + "XY Input: Add/Return Noise", + "XY Input: Aesthetic Score", + "XY Input: CFG Scale", + "XY Input: Checkpoint", + "XY Input: Clip Skip", + "XY Input: Control Net", + "XY Input: Control Net Plot", + "XY Input: Denoise", + "XY Input: LoRA", + "XY Input: LoRA Plot", + "XY Input: LoRA Stacks", + "XY Input: Manual XY Entry", + "XY Input: Prompt S/R", + "XY Input: Refiner On/Off", + "XY Input: Sampler/Scheduler", + "XY Input: Seeds++ Batch", + "XY Input: Steps", + "XY Input: VAE", + "XY Plot" + ], + { + "title_aux": "Efficiency Nodes for ComfyUI Version 2.0+" + } + ], + "https://github.com/jakechai/ComfyUI-JakeUpgrade": [ + [ + "Animation Prompt JK", + "Animation Value JK", + "Base Image Parameters Extract JK", + "Base Model Parameters Extract JK", + "Base Model Parameters JK", + "Base Model Pipe Extract JK", + "Base Model Pipe JK", + "CM_BoolBinaryOperation JK", + "CM_BoolToInt JK", + "CM_BoolUnaryOperation JK", + "CM_BreakoutVec2 JK", + "CM_BreakoutVec3 JK", + "CM_BreakoutVec4 JK", + "CM_ComposeVec2 JK", + "CM_ComposeVec3 JK", + "CM_ComposeVec4 JK", + "CM_FloatBinaryCondition JK", + "CM_FloatBinaryOperation JK", + "CM_FloatToInt JK", + "CM_FloatToNumber JK", + "CM_FloatUnaryCondition JK", + "CM_FloatUnaryOperation JK", + "CM_IntBinaryCondition JK", + "CM_IntBinaryOperation JK", + "CM_IntToBool JK", + "CM_IntToFloat JK", + "CM_IntToNumber JK", + "CM_IntUnaryCondition JK", + "CM_IntUnaryOperation JK", + "CM_NumberBinaryCondition JK", + "CM_NumberBinaryOperation JK", + "CM_NumberToFloat JK", + "CM_NumberToInt JK", + "CM_NumberUnaryCondition JK", + "CM_NumberUnaryOperation JK", + "CM_Vec2BinaryCondition JK", + "CM_Vec2BinaryOperation JK", + "CM_Vec2FloatOperation_JK", + "CM_Vec2ToFloatBinaryOperation JK", + "CM_Vec2ToFloatUnaryOperation JK", + "CM_Vec2UnaryCondition JK", + "CM_Vec2UnaryOperation JK", + "CM_Vec3BinaryCondition JK", + "CM_Vec3BinaryOperation JK", + "CM_Vec3FloatOperation_JK", + "CM_Vec3ToFloatBinaryOperation JK", + "CM_Vec3ToFloatUnaryOperation JK", + "CM_Vec3UnaryCondition JK", + "CM_Vec3UnaryOperation JK", + "CM_Vec4BinaryCondition JK", + "CM_Vec4BinaryOperation JK", + "CM_Vec4FloatOperation_JK", + "CM_Vec4ToFloatBinaryOperation JK", + "CM_Vec4ToFloatUnaryOperation JK", + "CM_Vec4UnaryCondition JK", + "CM_Vec4UnaryOperation JK", + "CR Apply ControlNet JK", + "CR Apply Multi-ControlNet JK", + "CR Boolean JK", + "CR Clip Input Switch JK", + "CR Conditioning Input Switch JK", + "CR ControlNet Input Switch JK", + "CR Float Input Switch JK", + "CR Image Input Switch JK", + "CR Impact Pipe Input Switch JK", + "CR Int Input Switch JK", + "CR Latent Input Switch JK", + "CR LoRA Stack JK", + "CR Load LoRA JK", + "CR Mask Input Switch JK", + "CR Model Input Switch JK", + "CR Multi-ControlNet Stack JK", + "CR Pipe Input Switch JK", + "CR SD1.5 Aspect Ratio JK", + "CR SDXL Aspect Ratio JK", + "CR Switch Model and CLIP JK", + "CR Text Input Switch JK", + "CR VAE Input Switch JK", + "Ckpt Loader JK", + "Detailer Parameters JK", + "Embedding Picker JK", + "Embedding Picker Multi JK", + "Evaluate Examples JK", + "Evaluate Floats JK", + "Evaluate Ints JK", + "Evaluate Strings JK", + "HintImageEnchance JK", + "Image Upscale Parameters Extract JK", + "Ksampler Parameters JK", + "Latent Upscale Parameters Extract JK", + "Load Image With Metadata JK", + "Metadata Pipe Extract JK", + "Metadata Pipe JK", + "NodesState JK", + "Noise Injection Parameters JK", + "Orbit Poses JK", + "Pipe End JK", + "Project Setting JK", + "Refine 1 Parameters Extract JK", + "Refine 2 Parameters Extract JK", + "Refine Model Parameters JK", + "Refine Pipe Extract JK", + "Refine Pipe JK", + "Reroute Ckpt JK", + "Reroute List JK", + "Reroute Resize JK", + "Reroute Sampler JK", + "Reroute Upscale JK", + "Reroute Vae JK", + "SDXLPromptStylerAll", + "SDXLPromptStylerHorror", + "SDXLPromptStylerMisc", + "SDXLPromptStylerbyArtist", + "SDXLPromptStylerbyCamera", + "SDXLPromptStylerbyComposition", + "SDXLPromptStylerbyCyberpunkSurrealism", + "SDXLPromptStylerbyDepth", + "SDXLPromptStylerbyDiva", + "SDXLPromptStylerbyEnvironment", + "SDXLPromptStylerbyFantasySetting", + "SDXLPromptStylerbyFilter", + "SDXLPromptStylerbyFocus", + "SDXLPromptStylerbyFooocus", + "SDXLPromptStylerbyImpressionism", + "SDXLPromptStylerbyLighting", + "SDXLPromptStylerbyMarc", + "SDXLPromptStylerbyMileHigh", + "SDXLPromptStylerbyMood", + "SDXLPromptStylerbyMre", + "SDXLPromptStylerbyMythicalCreature", + "SDXLPromptStylerbyOriginal", + "SDXLPromptStylerbyQuantumRealism", + "SDXLPromptStylerbySai", + "SDXLPromptStylerbySteamPunkRealism", + "SDXLPromptStylerbySubject", + "SDXLPromptStylerbySurrealism", + "SDXLPromptStylerbyTheme", + "SDXLPromptStylerbyTimeofDay", + "SDXLPromptStylerbyTwri", + "SDXLPromptStylerbyWyvern", + "SDXLPromptbyCelticArt", + "SDXLPromptbyContemporaryNordicArt", + "SDXLPromptbyFashionArt", + "SDXLPromptbyGothicRevival", + "SDXLPromptbyIrishFolkArt", + "SDXLPromptbyRomanticNationalismArt", + "SDXLPromptbySportsArt", + "SDXLPromptbyStreetArt", + "SDXLPromptbyVikingArt", + "SDXLPromptbyWildlifeArt", + "Sampler Loader JK", + "Save Image with Metadata Flow JK", + "Save Image with Metadata JK", + "Upscale Model Loader JK", + "Upscale Model Parameters Extract JK", + "Upscale Model Parameters JK", + "Vae Loader JK" + ], + { + "title_aux": "ComfyUI-JakeUpgrade" + } + ], + "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": [ + [ + "RotateImage" + ], + { + "title_aux": "ComfyUI_rotate_image" + } + ], + "https://github.com/jamesWalker55/comfyui-p2ldgan": [ + [ + "P2LDGAN" + ], + { + "title_aux": "ComfyUI - P2LDGAN Node" + } + ], + "https://github.com/jamesWalker55/comfyui-various": [ + [ + "BatchLoadImage", + "BatchSaveImage", + "GroupInfoExtractFloat", + "GroupInfoExtractInt", + "GroupLoadBatchImages", + "GroupLoadImage", + "JWDatetimeString", + "JWImageBatchCount", + "JWImageContrast", + "JWImageExtractFromBatch", + "JWImageFlip", + "JWImageLevels", + "JWImageLoadRGB", + "JWImageLoadRGBA", + "JWImageLoadRGBIfExists", + "JWImageMix", + "JWImageResize", + "JWImageResizeByFactor", + "JWImageResizeByLongerSide", + "JWImageResizeByShorterSide", + "JWImageResizeToSquare", + "JWImageSaturation", + "JWImageSaveToPath", + "JWImageSequenceExtractFromBatch", + "JWImageStackChannels", + "JWInfoHashExtractFloat", + "JWInfoHashExtractInteger", + "JWInfoHashExtractString", + "JWInfoHashFromInfoHashList", + "JWInfoHashFromRangedInfo", + "JWInfoHashListExtractStringList", + "JWInfoHashListFromRangedInfo", + "JWInfoHashPrint", + "JWLoadImageSequence", + "JWLoadImagesFromString", + "JWLoopImageSequence", + "JWMaskLikeImageSize", + "JWMaskResize", + "JWMaskSequenceApplyToLatent", + "JWMaskSequenceFromMask", + "JWMaskSequenceJoin", + "JWPrintFloat", + "JWPrintImage", + "JWPrintInteger", + "JWPrintLatent", + "JWPrintMask", + "JWPrintString", + "JWRangedInfoCalculateSubBatch", + "JWReferenceOnly", + "JWSaveImageSequence", + "JWStringListCLIPEncode", + "JWStringListFromString", + "JWStringListFromStrings", + "JWStringListJoin", + "JWStringListRepeat", + "JWStringListToFormatedString", + "JWStringListToString", + "JWUncropCrop", + "JWUncropNewRect", + "JWUncropUncrop", + "JamesLoadImageGroup", + "RAFTEstimate", + "RAFTFlowToImage", + "RAFTLoadFlowFromEXRChannels", + "RCReceiveFloat", + "RCReceiveFloatList", + "RCReceiveInt", + "RCReceiveIntList", + "RCReceiveLatent", + "RCSendLatent" + ], + { + "nodename_pattern": "^JW", + "title_aux": "Various ComfyUI Nodes by Type" + } + ], + "https://github.com/jax-explorer/fast_video_comfyui": [ + [ + "FastImageListToImageBatch" + ], + { + "title_aux": "fast_video_comfyui" + } + ], + "https://github.com/jeffy5/comfyui-faceless-node": [ + [ + "FacelessFaceRestore", + "FacelessFaceSwap", + "FacelessLoadFrames", + "FacelessLoadImageUrl", + "FacelessLoadVideo", + "FacelessLoadVideoUrl", + "FacelessMergeVideos", + "FacelessRemoveBackground", + "FacelessSaveVideo", + "FacelessUploadVideo", + "FacelessVideoFaceRestore", + "FacelessVideoFaceSwap", + "FacelessVideoRemoveBackground" + ], + { + "title_aux": "Faceless Node for ComfyUI" + } + ], + "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": [ + [ + "StreamDiffusion_Loader", + "StreamDiffusion_Sampler" + ], + { + "title_aux": "ComfyUI_StreamDiffusion" + } + ], + "https://github.com/jiaxiangc/ComfyUI-ResAdapter": [ + [ + "ResAdapterLoader" + ], + { + "title_aux": "ResAdapter for ComfyUI" + } + ], + "https://github.com/jitcoder/lora-info": [ + [ + "ImageFromURL", + "LoraInfo" + ], + { + "title_aux": "LoraInfo" + } + ], + "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": [ + [ + "JjkConcat", + "JjkShowText", + "JjkText", + "SDXLRecommendedImageSize" + ], + { + "title_aux": "ComfyUI-Jjk-Nodes" + } + ], + "https://github.com/jkrauss82/ultools-comfyui": [ + [ + "CLIPTextEncodeWithStats", + "OpenPoseEditorAdv", + "SaveImgAdv", + "SolidMaskAdv" + ], + { + "title_aux": "ULTools for ComfyUI" + } + ], + "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": [ + [ + "LCMScheduler", + "SamplerLCMAlternative", + "SamplerLCMCycle", + "SamplerLCMDualNoise" + ], + { + "title_aux": "ComfyUI-sampler-lcm-alternative" + } + ], + "https://github.com/jordoh/ComfyUI-Deepface": [ + [ + "DeepfaceExtractFaces", + "DeepfaceVerify" + ], + { + "title_aux": "ComfyUI Deepface" + } + ], + "https://github.com/jroc22/ComfyUI-CSV-prompt-builder": [ + [ + "BuildPromptFromCSV" + ], + { + "title_aux": "ComfyUI-CSV-prompt-builder" + } + ], + "https://github.com/jtrue/ComfyUI-JaRue": [ + [ + "Text2Image_jru", + "YouTube2Prompt_jru" + ], + { + "nodename_pattern": "_jru$", + "title_aux": "ComfyUI-JaRue" + } + ], + "https://github.com/jtydhr88/ComfyUI-LayerDivider": [ + [ + "LayerDivider - Color Base", + "LayerDivider - Divide Layer", + "LayerDivider - Load SAM Mask Generator", + "LayerDivider - Segment Mask" + ], + { + "title_aux": "ComfyUI LayerDivider" + } + ], + "https://github.com/jtydhr88/ComfyUI-Unique3D": [ + [ + "Unique3DLoadPipeline", + "Unique3DRun - Geo Reconstruct", + "Unique3DRun - MVPrediction" + ], + { + "title_aux": "ComfyUI Unique3D" + } + ], + "https://github.com/ka-puna/comfyui-yanc": [ + [ + "YANC.ConcatStrings", + "YANC.FormatDatetimeString", + "YANC.GetWidgetValueString", + "YANC.IntegerCaster", + "YANC.MultilineString", + "YANC.TruncateString" + ], + { + "title_aux": "comfyui-yanc" + } + ], + "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": [ + [ + "ExtendedSaveImage" + ], + { + "title_aux": "Extended Image Formats for ComfyUI" + } + ], + "https://github.com/kadirnar/ComfyUI-Transformers": [ + [ + "DepthEstimationInference", + "ImageClassificationPipeline", + "ImageSegmentationPipeline", + "LoadDepthModel", + "ObjectDetectionPipeline" + ], + { + "title_aux": "ComfyUI-Transformers" + } + ], + "https://github.com/kadirnar/ComfyUI-YOLO": [ + [ + "BBoxToCoco", + "BBoxToXYWH", + "BBoxVisNode", + "CocoToNumber", + "ConvertToDict", + "CustomUltralyticsModelLoader", + "GetImageSize", + "ImageResizeAdvanced", + "UltralyticsInference", + "UltralyticsModelLoader", + "UltralyticsVisualization", + "ViewText" + ], + { + "title_aux": "ComfyUI-YOLO" + } + ], + "https://github.com/kale4eat/ComfyUI-path-util": [ + [ + "path_util_PathAbspath", + "path_util_PathBasename", + "path_util_PathDirname", + "path_util_PathExists", + "path_util_PathIsdir", + "path_util_PathIsfile", + "path_util_PathJoin", + "path_util_PathRelpath", + "path_util_PathSplitext" + ], + { + "title_aux": "ComfyUI_demucus" + } + ], + "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": [ + [ + "SDT_AudioProperty", + "SDT_ConcatAudio", + "SDT_CutAudio", + "SDT_DemucsApply", + "SDT_DemucsLoader", + "SDT_FasterWhisperListSegments", + "SDT_FasterWhisperLoader", + "SDT_FasterWhisperSegmentProperty", + "SDT_FasterWhisperTextFromSegments", + "SDT_FasterWhisperTranscribe", + "SDT_GriffinLim", + "SDT_JoinAudio", + "SDT_KotobaWhisperListSegments", + "SDT_KotobaWhisperLoaderLong", + "SDT_KotobaWhisperLoaderShort", + "SDT_KotobaWhisperSegmentProperty", + "SDT_KotobaWhisperTranscribeLong", + "SDT_KotobaWhisperTranscribeShort", + "SDT_LFCC", + "SDT_LoadAudio", + "SDT_LoadAudios", + "SDT_MFCC", + "SDT_MakeSilenceAudio", + "SDT_MelSpectrogram", + "SDT_NemoAsrListSegments", + "SDT_NemoAsrListSubwords", + "SDT_NemoAsrLoader", + "SDT_NemoAsrSegmentProperty", + "SDT_NemoAsrSubwordProperty", + "SDT_NemoAsrTranscribe", + "SDT_NueAsrLoader", + "SDT_NueAsrTranscribe", + "SDT_PlayAudio", + "SDT_PlotMelFilterBank", + "SDT_PlotPitch", + "SDT_PlotSpecgram", + "SDT_PlotSpectrogram", + "SDT_PlotWaveForm", + "SDT_ResampleAudio", + "SDT_SaveAudio", + "SDT_SaveAudioWithSequentialNumbering", + "SDT_SilenceAudio", + "SDT_SileroVADApply", + "SDT_SileroVADCollectChunks", + "SDT_SileroVADListTimestamps", + "SDT_SileroVADLoader", + "SDT_SileroVADTimestampProperty", + "SDT_Spectrogram", + "SDT_SpeechMOSLoader", + "SDT_SpeechMOSScore", + "SDT_SplitAudio", + "SDT_TrimAudio", + "SDT_TrimAudioBySample" + ], + { + "title_aux": "ComfyUI-speech-dataset-toolkit" + } + ], + "https://github.com/kale4eat/ComfyUI-string-util": [ + [ + "string_util_Str", + "string_util_StrConcat", + "string_util_StrCount", + "string_util_StrEndsWith", + "string_util_StrEqual", + "string_util_StrFind", + "string_util_StrFormat", + "string_util_StrJoin", + "string_util_StrLen", + "string_util_StrLower", + "string_util_StrLstrip", + "string_util_StrNotEqual", + "string_util_StrReplace", + "string_util_StrRstrip", + "string_util_StrSlice", + "string_util_StrSplit", + "string_util_StrStartsWith", + "string_util_StrStrip", + "string_util_StrUpper" + ], + { + "title_aux": "ComfyUI-string-util" + } + ], + "https://github.com/kale4eat/ComfyUI-text-file-util": [ + [ + "text_file_util_ReadAllLines", + "text_file_util_ReadAllText", + "text_file_util_WriteText", + "text_file_util_WriteTextLines", + "text_file_util_WriteTextWithSequentialNumbering" + ], + { + "title_aux": "ComfyUI-text-file-util" + } + ], + "https://github.com/katalist-ai/comfyUI-nsfw-detection": [ + [ + "NudenetDetector" + ], + { + "title_aux": "comfyUI-nsfw-detection" + } + ], + "https://github.com/kealiu/ComfyUI-S3-Tools": [ + [ + "Load Image From S3", + "Save Image To S3" + ], + { + "title_aux": "ComfyUI Load and Save file to S3" + } + ], + "https://github.com/kealiu/ComfyUI-Zero123-Porting": [ + [ + "Zero123: Image Preprocess", + "Zero123: Image Rotate in 3D" + ], + { + "title_aux": "ComfyUI-Zero123-Porting" + } + ], + "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": [ + [ + "ZeST: Grayout Subject" + ], + { + "title_aux": "ComfyUI-ZeroShot-MTrans" + } + ], + "https://github.com/kenjiqq/qq-nodes-comfyui": [ + [ + "Any List", + "Any List Iterator", + "Any To Any", + "Axis Pack", + "Axis To Any", + "Axis Unpack", + "Image Accumulator End", + "Image Accumulator Start", + "Load Lines From Text File", + "Slice List", + "Text Splitter", + "XY Grid Helper" + ], + { + "title_aux": "qq-nodes-comfyui" + } + ], + "https://github.com/kft334/Knodes": [ + [ + "Image(s) To Websocket (Base64)", + "ImageOutput", + "Load Image (Base64)", + "Load Images (Base64)" + ], + { + "title_aux": "Knodes" + } + ], + "https://github.com/kijai/ComfyUI-ADMotionDirector": [ + [ + "ADMD_AdditionalModelSelect", + "ADMD_CheckpointLoader", + "ADMD_ComfyModelLoader", + "ADMD_DiffusersLoader", + "ADMD_InitializeTraining", + "ADMD_LoadLora", + "ADMD_MakeBatchList", + "ADMD_SaveLora", + "ADMD_TrainLora", + "ADMD_ValidationSampler", + "ADMD_ValidationSettings" + ], + { + "title_aux": "Animatediff MotionLoRA Trainer" + } + ], + "https://github.com/kijai/ComfyUI-APISR-KJ": [ + [ + "APISR_upscale" + ], + { + "title_aux": "ComfyUI-APISR" + } + ], + "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": [ + [ + "brushnet_ella_loader", + "brushnet_ipadapter_matteo", + "brushnet_model_loader", + "brushnet_sampler", + "brushnet_sampler_ella", + "powerpaint_brushnet_sampler" + ], + { + "title_aux": "ComfyUI-BrushNet-Wrapper" + } + ], + "https://github.com/kijai/ComfyUI-CCSR": [ + [ + "CCSR_Model_Select", + "CCSR_Upscale", + "DownloadAndLoadCCSRModel" + ], + { + "title_aux": "ComfyUI-CCSR" + } + ], + "https://github.com/kijai/ComfyUI-DDColor": [ + [ + "DDColor_Colorize" + ], + { + "title_aux": "ComfyUI-DDColor" + } + ], + "https://github.com/kijai/ComfyUI-DepthAnythingV2": [ + [ + "DepthAnything_V2", + "DownloadAndLoadDepthAnythingV2Model" + ], + { + "title_aux": "ComfyUI-DepthAnythingV2" + } + ], + "https://github.com/kijai/ComfyUI-DiffusionLight": [ + [ + "chrome_ball_to_envmap", + "exposure_to_hdr" + ], + { + "title_aux": "DiffusionLight implementation for ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": [ + [ + "DownloadAndLoadCLIPModel", + "DownloadAndLoadCLIPVisionModel", + "DownloadAndLoadDynamiCrafterModel", + "DynamiCrafterBatchInterpolation", + "DynamiCrafterI2V", + "DynamiCrafterLoadInitNoise", + "DynamiCrafterModelLoader", + "ToonCrafterDecode", + "ToonCrafterInterpolation" + ], + { + "title_aux": "ComfyUI-DynamiCrafterWrapper" + } + ], + "https://github.com/kijai/ComfyUI-ELLA-wrapper": [ + [ + "diffusers_model_loader", + "diffusers_sampler", + "ella_model_loader", + "ella_sampler", + "ella_t5_embeds" + ], + { + "title_aux": "ComfyUI-ELLA-wrapper" + } + ], + "https://github.com/kijai/ComfyUI-Florence2": [ + [ + "DownloadAndLoadFlorence2Model", + "Florence2Run" + ], + { + "title_aux": "ComfyUI-Florence2" + } + ], + "https://github.com/kijai/ComfyUI-Geowizard": [ + [ + "geowizard_model_loader", + "geowizard_sampler" + ], + { + "title_aux": "Geowizard depth and normal estimation in ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-IC-Light": [ + [ + "BackgroundScaler", + "CalculateNormalsFromImages", + "DetailTransfer", + "ICLightConditioning", + "LightSource", + "LoadAndApplyICLightUnet", + "LoadHDRImage" + ], + { + "title_aux": "ComfyUI-IC-Light" + } + ], + "https://github.com/kijai/ComfyUI-KJNodes": [ + [ + "AddLabel", + "AppendInstanceDiffusionTracking", + "BatchCLIPSeg", + "BatchCropFromMask", + "BatchCropFromMaskAdvanced", + "BatchUncrop", + "BatchUncropAdvanced", + "BboxToInt", + "BboxVisualize", + "CameraPoseVisualizer", + "CheckpointPerturbWeights", + "ColorMatch", + "ColorToMask", + "CondPassThrough", + "ConditioningMultiCombine", + "ConditioningSetMaskAndCombine", + "ConditioningSetMaskAndCombine3", + "ConditioningSetMaskAndCombine4", + "ConditioningSetMaskAndCombine5", + "CreateAudioMask", + "CreateFadeMask", + "CreateFadeMaskAdvanced", + "CreateFluidMask", + "CreateGradientFromCoords", + "CreateGradientMask", + "CreateInstanceDiffusionTracking", + "CreateMagicMask", + "CreateShapeImageOnPath", + "CreateShapeMask", + "CreateShapeMaskOnPath", + "CreateTextMask", + "CreateTextOnPath", + "CreateVoronoiMask", + "CrossFadeImages", + "CustomSigmas", + "DownloadAndLoadCLIPSeg", + "DrawInstanceDiffusionTracking", + "DummyLatentOut", + "EmptyLatentImagePresets", + "FilterZeroMasksAndCorrespondingImages", + "FlipSigmasAdjusted", + "FloatConstant", + "FloatToMask", + "FloatToSigmas", + "GLIGENTextBoxApplyBatchCoords", + "GenerateNoise", + "GetImageRangeFromBatch", + "GetImageSizeAndCount", + "GetImagesFromBatchIndexed", + "GetLatentsFromBatchIndexed", + "GetMaskSizeAndCount", + "GradientToFloat", + "GrowMaskWithBlur", + "INTConstant", + "ImageAddMulti", + "ImageAndMaskPreview", + "ImageBatchMulti", + "ImageBatchRepeatInterleaving", + "ImageBatchTestPattern", + "ImageConcanate", + "ImageConcatMulti", + "ImageGrabPIL", + "ImageGridComposite2x2", + "ImageGridComposite3x3", + "ImageNormalize_Neg1_To_1", + "ImagePadForOutpaintMasked", + "ImagePadForOutpaintTargetSize", + "ImagePass", + "ImageResizeKJ", + "ImageTransformByNormalizedAmplitude", + "ImageUpscaleWithModelBatched", + "InjectNoiseToLatent", + "InsertImageBatchByIndexes", + "InsertImagesToBatchIndexed", + "InterpolateCoords", + "Intrinsic_lora_sampling", + "JoinStringMulti", + "JoinStrings", + "LoadAndResizeImage", + "LoadResAdapterNormalization", + "MaskBatchMulti", + "MaskOrImageToWeight", + "MergeImageChannels", + "ModelPassThrough", + "NormalizedAmplitudeToFloatList", + "NormalizedAmplitudeToMask", + "OffsetMask", + "OffsetMaskByNormalizedAmplitude", + "PlotCoordinates", + "PreviewAnimation", + "RemapImageRange", + "RemapMaskRange", + "ReplaceImagesInBatch", + "ResizeMask", + "ReverseImageBatch", + "RoundMask", + "SV3D_BatchSchedule", + "SaveImageWithAlpha", + "ScaleBatchPromptSchedule", + "Sleep", + "SomethingToString", + "SoundReactive", + "SplineEditor", + "SplitBboxes", + "SplitImageChannels", + "StabilityAPI_SD3", + "StableZero123_BatchSchedule", + "StringConstant", + "StringConstantMultiline", + "Superprompt", + "VRAM_Debug", + "WeightScheduleConvert", + "WeightScheduleExtend", + "WidgetToString" + ], + { + "title_aux": "KJNodes for ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper": [ + [ + "DownloadAndLoadChatGLM3", + "DownloadAndLoadKolorsModel", + "KolorsSampler", + "KolorsTextEncode", + "LoadChatGLM3" + ], + { + "title_aux": "ComfyUI-KwaiKolorsWrapper" + } + ], + "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": [ + [ + "lavi_bridge_llama_encoder", + "lavi_bridge_t5_encoder", + "lavibridge_model_loader", + "lavibridge_sampler" + ], + { + "title_aux": "ComfyUI-LaVi-Bridge-Wrapper" + } + ], + "https://github.com/kijai/ComfyUI-LivePortraitKJ": [ + [ + "DownloadAndLoadLivePortraitModels", + "LivePortraitProcess" + ], + { + "title_aux": "ComfyUI-LivePortraitKJ" + } + ], + "https://github.com/kijai/ComfyUI-LuminaWrapper": [ + [ + "DownloadAndLoadGemmaModel", + "DownloadAndLoadLuminaModel", + "GemmaSampler", + "LuminaGemmaTextEncode", + "LuminaGemmaTextEncodeArea", + "LuminaT2ISampler", + "LuminaTextAreaAppend" + ], + { + "title_aux": "ComfyUI-LuminaWrapper" + } + ], + "https://github.com/kijai/ComfyUI-Marigold": [ + [ + "ColorizeDepthmap", + "MarigoldDepthEstimation", + "MarigoldDepthEstimationVideo", + "MarigoldDepthEstimation_v2", + "MarigoldDepthEstimation_v2_video", + "MarigoldModelLoader", + "RemapDepth", + "SaveImageOpenEXR" + ], + { + "title_aux": "Marigold depth estimation in ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-MimicMotionWrapper": [ + [ + "DiffusersScheduler", + "DownloadAndLoadMimicMotionModel", + "MimicMotionDecode", + "MimicMotionGetPoses", + "MimicMotionSampler" + ], + { + "title_aux": "ComfyUI-MimicMotionWrapper" + } + ], + "https://github.com/kijai/ComfyUI-OpenDiTWrapper": [ + [ + "DownloadAndLoadOpenDiTT5Model", + "DownloadAndLoadOpenSoraModel", + "DownloadAndLoadOpenSoraVAE", + "OpenDiTConditioning", + "OpenDiTSampler", + "OpenSoraDecode", + "OpenSoraEncodeReference" + ], + { + "title_aux": "ComfyUI-OpenDiTWrapper" + } + ], + "https://github.com/kijai/ComfyUI-SUPIR": [ + [ + "SUPIR_Upscale", + "SUPIR_conditioner", + "SUPIR_decode", + "SUPIR_encode", + "SUPIR_first_stage", + "SUPIR_model_loader", + "SUPIR_model_loader_v2", + "SUPIR_model_loader_v2_clip", + "SUPIR_sample", + "SUPIR_tiles" + ], + { + "title_aux": "ComfyUI-SUPIR" + } + ], + "https://github.com/kijai/ComfyUI-depth-fm": [ + [ + "Depth_fm" + ], + { + "title_aux": "ComfyUI-depth-fm" + } + ], + "https://github.com/kijai/ComfyUI-moondream": [ + [ + "MoondreamQuery", + "MoondreamQueryCaptions" + ], + { + "title_aux": "ComfyUI-moondream" + } + ], + "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": [ + [ + "GradientPatchModelAddDownscale", + "GradientPatchModelAddDownscaleAdvanced" + ], + { + "title_aux": "ComfyUI_GradientDeepShrink" + } + ], + "https://github.com/kinfolk0117/ComfyUI_Pilgram": [ + [ + "Pilgram" + ], + { + "title_aux": "ComfyUI_Pilgram" + } + ], + "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": [ + [ + "DynamicTileMerge", + "DynamicTileSplit", + "TileCalc", + "TileMerge", + "TileSplit" + ], + { + "title_aux": "SimpleTiles" + } + ], + "https://github.com/klinter007/klinter_nodes": [ + [ + "Filter", + "Florence2Captions2IPA", + "PresentString", + "SingleString", + "SizeSelector", + "YellowBus", + "concat" + ], + { + "title_aux": "Klinter_nodes" + } + ], + "https://github.com/knuknX/ComfyUI-Image-Tools": [ + [ + "BatchImagePathLoader", + "ImageBgRemoveProcessor", + "ImageCheveretoUploader", + "ImageStandardResizeProcessor", + "JSONMessageNotifyTool", + "PreviewJSONNode", + "SingleImagePathLoader", + "SingleImageUrlLoader" + ], + { + "title_aux": "ComfyUI-Image-Tools" + } + ], + "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": [ + [ + "LLLiteLoader" + ], + { + "title_aux": "ControlNet-LLLite-ComfyUI" + } + ], + "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": [ + [ + "S3 Bucket LoRA", + "S3Bucket_Load_LoRA", + "XL DreamBooth LoRA", + "XLDB_LoRA" + ], + { + "title_aux": "ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes" + } + ], + "https://github.com/komojini/komojini-comfyui-nodes": [ + [ + "BatchCreativeInterpolationNodeDynamicSettings", + "CachedGetter", + "DragNUWAImageCanvas", + "FlowBuilder", + "FlowBuilder (adv)", + "FlowBuilder (advanced)", + "FlowBuilder (advanced) Setter", + "FlowBuilderSetter", + "FlowBuilderSetter (adv)", + "Getter", + "ImageCropByRatio", + "ImageCropByRatioAndResize", + "ImageGetter", + "ImageMerger", + "ImagesCropByRatioAndResizeBatch", + "KSamplerAdvancedCacheable", + "KSamplerCacheable", + "Setter", + "UltimateVideoLoader", + "UltimateVideoLoader (simple)", + "YouTubeVideoLoader" + ], + { + "title_aux": "komojini-comfyui-nodes" + } + ], + "https://github.com/kunieone/ComfyUI_alkaid": [ + [ + "A_EmptyLatentImageLongside", + "A_Face3DSwapper", + "A_FaceCrop", + "A_FacePaste", + "A_GetImageSize", + "A_OpenPosePreprocessor", + "AdapterFace", + "AdapterFaceLoader", + "AdapterStyle", + "AdapterStyleLoader", + "AlkaidLoader", + "ApplyAdapter", + "ApplyControlNet_KPS", + "CombineAdapterPatch", + "KSamplerHires" + ], + { + "title_aux": "ComfyUI_alkaid" + } + ], + "https://github.com/kwaroran/abg-comfyui": [ + [ + "Remove Image Background (abg)" + ], + { + "title_aux": "abg-comfyui" + } + ], + "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": [ + [ + "DownloadFileBLOB", + "LoadImageBLOB", + "SaveImageBLOB", + "SaveVideoFilesBLOB", + "UploadFileBLOB" + ], + { + "title_aux": "ComfyUI-Azure-Blob-Storage" + } + ], + "https://github.com/laksjdjf/Batch-Condition-ComfyUI": [ + [ + "Batch String", + "CLIP Text Encode (Batch)", + "String Input" + ], + { + "title_aux": "Batch-Condition-ComfyUI" + } + ], + "https://github.com/laksjdjf/LCMSampler-ComfyUI": [ + [ + "SamplerLCM", + "TAESDLoader" + ], + { + "title_aux": "LCMSampler-ComfyUI" + } + ], + "https://github.com/laksjdjf/LoRTnoC-ComfyUI": [ + [ + "LortnocLoader" + ], + { + "title_aux": "LoRTnoC-ComfyUI" + } + ], + "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [ + [ + "CDTuner", + "Negapip", + "Negpip" + ], + { + "title_aux": "cd-tuner_negpip-ComfyUI" + } + ], + "https://github.com/laksjdjf/cgem156-ComfyUI": [ + [ + "GradualLatentSampler", + "LCMSamplerRCFG", + "LoadAestheticShadow", + "PredictAesthetic", + "TCDSampler", + "TextScheduler" + ], + { + "title_aux": "cgem156-ComfyUI\ud83c\udf4c" + } + ], + "https://github.com/laksjdjf/pfg-ComfyUI": [ + [ + "PFG" + ], + { + "title_aux": "pfg-ComfyUI" + } + ], + "https://github.com/larsupb/LoRA-Merger-ComfyUI": [ + [ + "PM LoRA Apply", + "PM LoRA Loader", + "PM LoRA Merger", + "PM LoRA Resizer", + "PM LoRA SVD Merger", + "PM LoRA Save", + "XY: PM LoRA Modes", + "XY: PM LoRA SVD Rank", + "XY: PM LoRA Strengths" + ], + { + "title_aux": "LoRA Power-Merger ComfyUI" + } + ], + "https://github.com/latenightlabs/ComfyUI-LNL": [ + [ + "LNL_FrameSelector", + "LNL_FrameSelectorV2", + "LNL_FrameSelectorV3" + ], + { + "title_aux": "LNL Frame Selector" + } + ], + "https://github.com/leiweiqiang/ComfyUI-TRA": [ + [ + "TclEbSynth", + "TclEbSynthBatch", + "TclExtractFramesFromVideo", + "TclExtractFramesFromVideoFile", + "TclFrames2Video", + "TclSaveVideoFromFrames", + "TclYoloV8Segmentation", + "TclYoloV9Segmentation" + ], + { + "title_aux": "ComfyUI-TRA" + } + ], + "https://github.com/leoleelxh/ComfyUI-LLMs": [ + [ + "\ud83d\uddbc\ufe0f LLMs_Vison_Ali", + "\ud83d\uddbc\ufe0f LLMs_Vison_GLM4", + "\ud83d\uddbc\ufe0f LLMs_Vison_Gemini", + "\ud83d\ude00 LLMs_Chat", + "\ud83d\ude00 LLMs_Chat_GLM4_Only" + ], + { + "title_aux": "ComfyUI-LLMs" + } + ], + "https://github.com/linshier/comfyui-remote-tools": [ + [ + "LoadBase64(js)", + "LoadBase64FromRemote", + "SendBase64ToRemote" + ], + { + "title_aux": "comfyui-remote-tools" + } + ], + "https://github.com/liusida/ComfyUI-AutoCropFaces": [ + [ + "AutoCropFaces" + ], + { + "title_aux": "ComfyUI-AutoCropFaces" + } + ], + "https://github.com/liusida/ComfyUI-B-LoRA": [ + [ + "LoadBLoRA" + ], + { + "title_aux": "ComfyUI-B-LoRA" + } + ], + "https://github.com/liusida/ComfyUI-Debug": [ + [ + "DebugInspectorNode", + "DebugModelInspectorNode", + "DebugModelPrintOutNode" + ], + { + "title_aux": "ComfyUI-Debug" + } + ], + "https://github.com/liusida/ComfyUI-Login": [ + [ + "LoadImageIncognito" + ], + { + "title_aux": "ComfyUI-Login" + } + ], + "https://github.com/liusida/ComfyUI-SD3-nodes": [ + [ + "SD3EmptyLatent", + "SD3LoadCLIPs", + "SD3LoadCheckpoint" + ], + { + "title_aux": "ComfyUI-SD3-nodes" + } + ], + "https://github.com/ljleb/comfy-mecha": [ + [ + "Blocks Mecha Hyper", + "Float Mecha Hyper", + "Lora Mecha Recipe", + "Mecha Deserializer", + "Mecha Merger", + "Mecha Recipe List", + "Mecha Serializer", + "Model Mecha Recipe" + ], + { + "title_aux": "Mecha Merge Node Pack" + } + ], + "https://github.com/lks-ai/ComfyUI-StableAudioSampler": [ + [ + "StableAudioConditioning", + "StableAudioLoadModel", + "StableAudioPrompt", + "StableAudioSampler" + ], + { + "author": "lks-ai", + "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!", + "nickname": "stableaudio", + "title": "StableAudioSampler", + "title_aux": "ComfyUI Stable Audio Open 1.0 Sampler" + } + ], + "https://github.com/lks-ai/anynode": [ + [ + "AnyNode", + "AnyNodeAnthropic", + "AnyNodeCodeViewer", + "AnyNodeExport", + "AnyNodeGemini", + "AnyNodeLocal" + ], + { + "author": "newsbubbles", + "description": "This single node uses an LLM to generate a functionality based on your request. You can make the node do anything.", + "nickname": "AnyNode", + "title": "AnyNode v0.1.1", + "title_aux": "ComfyUI AnyNode: Any Node you ask for" + } + ], + "https://github.com/lldacing/comfyui-easyapi-nodes": [ + [ + "Base64ToImage", + "Base64ToMask", + "ColorPicker", + "GetImageBatchSize", + "ImageEqual", + "ImageToBase64", + "ImageToBase64Advanced", + "InsightFaceBBOXDetect", + "IntToList", + "IntToNumber", + "JoinList", + "ListMerge", + "LoadImageFromURL", + "LoadImageToBase64", + "LoadMaskFromURL", + "MaskImageToBase64", + "MaskToBase64", + "MaskToBase64Image", + "SDBaseVerNumber", + "SamAutoMaskSEGS", + "ShowBoolean", + "ShowFloat", + "ShowInt", + "ShowNumber", + "ShowString", + "StringToList" + ], + { + "title_aux": "comfyui-easyapi-nodes" + } + ], + "https://github.com/logtd/ComfyUI-FLATTEN": [ + [ + "ApplyFlattenAttentionNode", + "CreateFlowNoiseNode", + "FlattenCheckpointLoaderNode", + "KSamplerFlattenNode", + "TrajectoryNode", + "UnsamplerFlattenNode" + ], + { + "title_aux": "ComfyUI-FLATTEN" + } + ], + "https://github.com/logtd/ComfyUI-InstanceDiffusion": [ + [ + "ApplyScaleUModelNode", + "DownloadInstanceDiffusionModels", + "InstanceDiffusionTrackingPrompt", + "LoadInstanceFusersNode", + "LoadInstancePositionNetModel", + "LoadInstanceScaleUNode" + ], + { + "title_aux": "InstanceDiffusion Nodes" + } + ], + "https://github.com/logtd/ComfyUI-InversedNoise": [ + [ + "CombineNoiseLatentNode", + "MixNoiseNode", + "SamplerInversedEulerNode" + ], + { + "title_aux": "ComfyUI-InversedNoise" + } + ], + "https://github.com/logtd/ComfyUI-RAVE_ATTN": [ + [ + "ApplyRaveAttentionNode", + "AttentionOverrideSD15Node", + "AttentionOverrideSDXLNode" + ], + { + "title_aux": "ComfyUI-RAVE Attention" + } + ], + "https://github.com/logtd/ComfyUI-RefSampling": [ + [ + "ApplyRefContentNode", + "ApplyRefStyleNode", + "ApplyRefUNetNode" + ], + { + "title_aux": "ComfyUI-RefSampling" + } + ], + "https://github.com/logtd/ComfyUI-TrackingNodes": [ + [ + "OpenPoseTrackerNode", + "YOLOTrackerNode" + ], + { + "title_aux": "Tracking Nodes for Videos" + } + ], + "https://github.com/longgui0318/comfyui-common-util": [ + [ + "Added Layer Info To Array", + "Enhanced Random Light Source", + "Float Relay", + "Image Relay", + "Init Layer Info Array", + "Int Relay", + "Layer Image Seleted", + "Layer Images IPAdapter Advanced", + "Layer Info Array Fuse", + "Mask Relay", + "String Relay" + ], + { + "title_aux": "comfyui-common-util" + } + ], + "https://github.com/longgui0318/comfyui-llm-assistant": [ + [ + "Chat With LLM", + "Generate Stable Diffsution Prompt With LLM", + "Translate Text With LLM" + ], + { + "title_aux": "comfyui-llm-assistant" + } + ], + "https://github.com/longgui0318/comfyui-magic-clothing": [ + [ + "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", + "Change Pixel Value Normalization", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", + "Load Magic Clothing Model", + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" + ], + { + "title_aux": "comfyui-magic-clothing" + } + ], + "https://github.com/longgui0318/comfyui-mask-util": [ + [ + "Image Adaptive Crop M&R", + "Image Adaptive Crop With Mask", + "Image Change DType", + "Image Change Device", + "Image Resolution Adaptive With X", + "Image Resolution Limit With 8K", + "Load Image With Name", + "Mask Change DType", + "Mask Change Device", + "Mask Selection Of Masks", + "Model Change Device", + "Model Change Device Repeaters", + "Output Image To Input", + "Split Masks" + ], + { + "title_aux": "comfyui-mask-util" + } + ], + "https://github.com/longgui0318/comfyui-oms-diffusion": [ + [ + "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", + "Change Pixel Value Normalization", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", + "Load Magic Clothing Model", + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" + ], + { + "title_aux": "comfyui-oms-diffusion" + } + ], + "https://github.com/lordgasmic/ComfyUI-Wildcards/raw/master/wildcards.py": [ + [ + "CLIPTextEncodeWithWildcards" + ], + { + "title_aux": "Wildcards" + } + ], + "https://github.com/lordgasmic/comfyui_save_image_with_options": [ + [ + "SaveImageWithOptions" + ], + { + "title_aux": "comfyui_save_image_with_options" + } + ], + "https://github.com/lordgasmic/comfyui_wildcards": [ + [ + "CLIPTextEncodeWithWildcards" + ], + { + "title_aux": "comfyui_wildcards" + } + ], + "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": [ + [ + "InpaintCrop", + "InpaintExtendOutpaint", + "InpaintResize", + "InpaintStitch" + ], + { + "title_aux": "ComfyUI-Inpaint-CropAndStitch" + } + ], + "https://github.com/lquesada/ComfyUI-Prompt-Combinator": [ + [ + "PromptCombinator", + "PromptCombinatorExportGallery", + "PromptCombinatorMerger", + "PromptCombinatorRandomPrompt" + ], + { + "title_aux": "ComfyUI-Prompt-Combinator" + } + ], + "https://github.com/lrzjason/ComfyUIJasonNode/raw/main/SDXLMixSampler.py": [ + [ + "SDXLMixSampler" + ], + { + "title_aux": "ComfyUIJasonNode" + } + ], + "https://github.com/ltdrdata/ComfyUI-Impact-Pack": [ + [ + "AddMask", + "BasicPipeToDetailerPipe", + "BasicPipeToDetailerPipeSDXL", + "BboxDetectorCombined", + "BboxDetectorCombined_v2", + "BboxDetectorForEach", + "BboxDetectorSEGS", + "BitwiseAndMask", + "BitwiseAndMaskForEach", + "CLIPSegDetectorProvider", + "CfgScheduleHookProvider", + "CombineRegionalPrompts", + "CoreMLDetailerHookProvider", + "CustomNoiseDetailerHookProvider", + "DenoiseScheduleHookProvider", + "DenoiseSchedulerDetailerHookProvider", + "DetailerForEach", + "DetailerForEachDebug", + "DetailerForEachDebugPipe", + "DetailerForEachPipe", + "DetailerForEachPipeForAnimateDiff", + "DetailerHookCombine", + "DetailerPipeToBasicPipe", + "EditBasicPipe", + "EditDetailerPipe", + "EditDetailerPipeSDXL", + "EmptySegs", + "FaceDetailer", + "FaceDetailerPipe", + "FromBasicPipe", + "FromBasicPipe_v2", + "FromDetailerPipe", + "FromDetailerPipeSDXL", + "FromDetailerPipe_v2", + "GITSSchedulerFuncProvider", + "ImageListToImageBatch", + "ImageMaskSwitch", + "ImageReceiver", + "ImageSender", + "ImpactAssembleSEGS", + "ImpactCombineConditionings", + "ImpactCompare", + "ImpactConcatConditionings", + "ImpactConditionalBranch", + "ImpactConditionalBranchSelMode", + "ImpactConditionalStopIteration", + "ImpactControlBridge", + "ImpactControlNetApplyAdvancedSEGS", + "ImpactControlNetApplySEGS", + "ImpactControlNetClearSEGS", + "ImpactConvertDataType", + "ImpactCount_Elts_in_SEGS", + "ImpactDecomposeSEGS", + "ImpactDilateMask", + "ImpactDilateMaskInSEGS", + "ImpactDilate_Mask_SEG_ELT", + "ImpactDummyInput", + "ImpactEdit_SEG_ELT", + "ImpactFloat", + "ImpactFrom_SEG_ELT", + "ImpactFrom_SEG_ELT_bbox", + "ImpactFrom_SEG_ELT_crop_region", + "ImpactGaussianBlurMask", + "ImpactGaussianBlurMaskInSEGS", + "ImpactHFTransformersClassifierProvider", + "ImpactIPAdapterApplySEGS", + "ImpactIfNone", + "ImpactImageBatchToImageList", + "ImpactImageInfo", + "ImpactInt", + "ImpactInversedSwitch", + "ImpactIsNotEmptySEGS", + "ImpactKSamplerAdvancedBasicPipe", + "ImpactKSamplerBasicPipe", + "ImpactLatentInfo", + "ImpactLogger", + "ImpactLogicalOperators", + "ImpactMakeImageBatch", + "ImpactMakeImageList", + "ImpactMakeTileSEGS", + "ImpactMinMax", + "ImpactNeg", + "ImpactNodeSetMuteState", + "ImpactQueueTrigger", + "ImpactQueueTriggerCountdown", + "ImpactRemoteBoolean", + "ImpactRemoteInt", + "ImpactSEGSClassify", + "ImpactSEGSConcat", + "ImpactSEGSLabelAssign", + "ImpactSEGSLabelFilter", + "ImpactSEGSOrderedFilter", + "ImpactSEGSPicker", + "ImpactSEGSRangeFilter", + "ImpactSEGSToMaskBatch", + "ImpactSEGSToMaskList", + "ImpactScaleBy_BBOX_SEG_ELT", + "ImpactSchedulerAdapter", + "ImpactSegsAndMask", + "ImpactSegsAndMaskForEach", + "ImpactSetWidgetValue", + "ImpactSimpleDetectorSEGS", + "ImpactSimpleDetectorSEGSPipe", + "ImpactSimpleDetectorSEGS_for_AD", + "ImpactSleep", + "ImpactStringSelector", + "ImpactSwitch", + "ImpactValueReceiver", + "ImpactValueSender", + "ImpactWildcardEncode", + "ImpactWildcardProcessor", + "IterativeImageUpscale", + "IterativeLatentUpscale", + "KSamplerAdvancedProvider", + "KSamplerProvider", + "LatentPixelScale", + "LatentReceiver", + "LatentSender", + "LatentSwitch", + "MMDetDetectorProvider", + "MMDetLoader", + "MaskDetailerPipe", + "MaskListToMaskBatch", + "MaskPainter", + "MaskToSEGS", + "MaskToSEGS_for_AnimateDiff", + "MasksToMaskList", + "MediaPipeFaceMeshToSEGS", + "NoiseInjectionDetailerHookProvider", + "NoiseInjectionHookProvider", + "ONNXDetectorProvider", + "ONNXDetectorSEGS", + "PixelKSampleHookCombine", + "PixelKSampleUpscalerProvider", + "PixelKSampleUpscalerProviderPipe", + "PixelTiledKSampleUpscalerProvider", + "PixelTiledKSampleUpscalerProviderPipe", + "PreviewBridge", + "PreviewBridgeLatent", + "PreviewDetailerHookProvider", + "ReencodeLatent", + "ReencodeLatentPipe", + "RegionalPrompt", + "RegionalSampler", + "RegionalSamplerAdvanced", + "RemoveImageFromSEGS", + "RemoveNoiseMask", + "SAMDetectorCombined", + "SAMDetectorSegmented", + "SAMLoader", + "SEGSDetailer", + "SEGSDetailerForAnimateDiff", + "SEGSLabelFilterDetailerHookProvider", + "SEGSOrderedFilterDetailerHookProvider", + "SEGSPaste", + "SEGSPreview", + "SEGSPreviewCNet", + "SEGSRangeFilterDetailerHookProvider", + "SEGSSwitch", + "SEGSToImageList", + "SEGSUpscaler", + "SEGSUpscalerPipe", + "SegmDetectorCombined", + "SegmDetectorCombined_v2", + "SegmDetectorForEach", + "SegmDetectorSEGS", + "Segs Mask", + "Segs Mask ForEach", + "SegsMaskCombine", + "SegsToCombinedMask", + "SetDefaultImageForSEGS", + "StepsScheduleHookProvider", + "StringListToString", + "SubtractMask", + "SubtractMaskForEach", + "TiledKSamplerProvider", + "ToBasicPipe", + "ToBinaryMask", + "ToDetailerPipe", + "ToDetailerPipeSDXL", + "TwoAdvancedSamplersForMask", + "TwoSamplersForMask", + "TwoSamplersForMaskUpscalerProvider", + "TwoSamplersForMaskUpscalerProviderPipe", + "UltralyticsDetectorProvider", + "UnsamplerDetailerHookProvider", + "UnsamplerHookProvider", + "VariationNoiseDetailerHookProvider", + "WildcardPromptFromString" + ], + { + "author": "Dr.Lt.Data", + "description": "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.", + "nickname": "Impact Pack", + "preemptions": [ + "SAMLoader" + ], + "title": "Impact Pack", + "title_aux": "ComfyUI Impact Pack" + } + ], + "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": [ + [ + "AnimeLineArt_Preprocessor_Provider_for_SEGS //Inspire", + "ApplyRegionalIPAdapters //Inspire", + "BindImageListPromptList //Inspire", + "CLIPTextEncodeWithWeight //Inspire", + "CacheBackendData //Inspire", + "CacheBackendDataList //Inspire", + "CacheBackendDataNumberKey //Inspire", + "CacheBackendDataNumberKeyList //Inspire", + "Canny_Preprocessor_Provider_for_SEGS //Inspire", + "ChangeImageBatchSize //Inspire", + "ChangeLatentBatchSize //Inspire", + "CheckpointLoaderSimpleShared //Inspire", + "ColorMapToMasks //Inspire", + "ColorMaskToDepthMask //Inspire", + "Color_Preprocessor_Provider_for_SEGS //Inspire", + "CompositeNoise //Inspire", + "ConcatConditioningsWithMultiplier //Inspire", + "ConditioningStretch //Inspire", + "ConditioningUpscale //Inspire", + "DWPreprocessor_Provider_for_SEGS //Inspire", + "FakeScribblePreprocessor_Provider_for_SEGS //Inspire", + "FloatRange //Inspire", + "FromIPAdapterPipe //Inspire", + "GlobalSampler //Inspire", + "GlobalSeed //Inspire", + "HEDPreprocessor_Provider_for_SEGS //Inspire", + "HyperTile //Inspire", + "IPAdapterModelHelper //Inspire", + "ImageBatchSplitter //Inspire", + "InpaintPreprocessor_Provider_for_SEGS //Inspire", + "KSampler //Inspire", + "KSamplerAdvanced //Inspire", + "KSamplerAdvancedPipe //Inspire", + "KSamplerAdvancedProgress //Inspire", + "KSamplerPipe //Inspire", + "KSamplerProgress //Inspire", + "LatentBatchSplitter //Inspire", + "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", + "LineArt_Preprocessor_Provider_for_SEGS //Inspire", + "ListCounter //Inspire", + "LoadImage //Inspire", + "LoadImageListFromDir //Inspire", + "LoadImagesFromDir //Inspire", + "LoadPromptsFromDir //Inspire", + "LoadPromptsFromFile //Inspire", + "LoadSinglePromptFromFile //Inspire", + "LoraBlockInfo //Inspire", + "LoraLoaderBlockWeight //Inspire", + "MakeBasicPipe //Inspire", + "Manga2Anime_LineArt_Preprocessor_Provider_for_SEGS //Inspire", + "MediaPipeFaceMeshDetectorProvider //Inspire", + "MediaPipe_FaceMesh_Preprocessor_Provider_for_SEGS //Inspire", + "MeshGraphormerDepthMapPreprocessorProvider_for_SEGS //Inspire", + "MiDaS_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", + "OpenPose_Preprocessor_Provider_for_SEGS //Inspire", + "PromptBuilder //Inspire", + "PromptExtractor //Inspire", + "RGB_HexToHSV //Inspire", + "RandomGeneratorForList //Inspire", + "RandomNoise //Inspire", + "RegionalCFG //Inspire", + "RegionalConditioningColorMask //Inspire", + "RegionalConditioningSimple //Inspire", + "RegionalIPAdapterColorMask //Inspire", + "RegionalIPAdapterEncodedColorMask //Inspire", + "RegionalIPAdapterEncodedMask //Inspire", + "RegionalIPAdapterMask //Inspire", + "RegionalPromptColorMask //Inspire", + "RegionalPromptSimple //Inspire", + "RegionalSeedExplorerColorMask //Inspire", + "RegionalSeedExplorerMask //Inspire", + "RemoveBackendData //Inspire", + "RemoveBackendDataNumberKey //Inspire", + "RemoveControlNet //Inspire", + "RemoveControlNetFromRegionalPrompts //Inspire", + "RetrieveBackendData //Inspire", + "RetrieveBackendDataNumberKey //Inspire", + "ScheduledCFGGuider //Inspire", + "ScheduledPerpNegCFGGuider //Inspire", + "SeedExplorer //Inspire", + "SelectNthMask //Inspire", + "ShowCachedInfo //Inspire", + "StableCascade_CheckpointLoader //Inspire", + "TilePreprocessor_Provider_for_SEGS //Inspire", + "ToIPAdapterPipe //Inspire", + "UnzipPrompt //Inspire", + "WildcardEncode //Inspire", + "XY Input: Lora Block Weight //Inspire", + "ZipPrompt //Inspire", + "Zoe_DepthMap_Preprocessor_Provider_for_SEGS //Inspire" + ], + { + "author": "Dr.Lt.Data", + "description": "This extension provides various nodes to support Lora Block Weight and the Impact Pack.", + "nickname": "Inspire Pack", + "nodename_pattern": "Inspire$", + "title": "Inspire Pack", + "title_aux": "ComfyUI Inspire Pack" + } + ], + "https://github.com/luandev/ComfyUI-CrewAI": [ + [ + "\ud83d\udcceCrewAI Agent", + "\ud83d\udcceCrewAI Agent List", + "\ud83d\udcceCrewAI Crew", + "\ud83d\udcceCrewAI LLM Chat GPT", + "\ud83d\udcceCrewAI LLM Hugging Face", + "\ud83d\udcceCrewAI LLM OpenAI", + "\ud83d\udcceCrewAI Task", + "\ud83d\udcceCrewAI Task List" + ], + { + "title_aux": "ComfyUI CrewAI" + } + ], + "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": [ + [ + "Custom Date Format | sokes \ud83e\uddac", + "Latent Switch x9 | sokes \ud83e\uddac" + ], + { + "title_aux": "ComfyUI Sokes Nodes" + } + ], + "https://github.com/m957ymj75urz/ComfyUI-Custom-Nodes/raw/main/clip-text-encode-split/clip_text_encode_split.py": [ + [ + "RawText", + "RawTextCombine", + "RawTextEncode", + "RawTextReplace" + ], + { + "title_aux": "m957ymj75urz/ComfyUI-Custom-Nodes" + } + ], + "https://github.com/mape/ComfyUI-mape-Helpers": [ + [ + "mape Variable" + ], + { + "author": "mape", + "description": "Various QoL improvements like prompt tweaking, variable assignment, image preview, fuzzy search, error reporting, organizing and node navigation.", + "nickname": "\ud83d\udfe1 mape's helpers", + "title": "mape's helpers", + "title_aux": "mape's helpers" + } + ], + "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": [ + [ + "CSVPromptProcessor" + ], + { + "title_aux": "ComfyUI-SubjectStyle-CSV" + } + ], + "https://github.com/marduk191/comfyui-marnodes": [ + [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", + "marduk191_workflow_settings" + ], + { + "author": "\u02f6marduk191", + "description": "marduk191s nodes.", + "nickname": "marduk191 workflow settings", + "title": "marduk191 workflow settings", + "title_aux": "marduk191 workflow settings" + } + ], + "https://github.com/marhensa/sdxl-recommended-res-calc": [ + [ + "RecommendedResCalc" + ], + { + "title_aux": "Recommended Resolution Calculator" + } + ], + "https://github.com/martijnat/comfyui-previewlatent": [ + [ + "PreviewLatent", + "PreviewLatentAdvanced", + "PreviewLatentXL" + ], + { + "title_aux": "comfyui-previewlatent" + } + ], + "https://github.com/massao000/ComfyUI_aspect_ratios": [ + [ + "Aspect Ratios Node" + ], + { + "title_aux": "ComfyUI_aspect_ratios" + } + ], + "https://github.com/matan1905/ComfyUI-Serving-Toolkit": [ + [ + "DiscordServing", + "ServingInputNumber", + "ServingInputText", + "ServingOutput", + "WebSocketServing" + ], + { + "title_aux": "ComfyUI Serving toolkit" + } + ], + "https://github.com/mav-rik/facerestore_cf": [ + [ + "CropFace", + "FaceRestoreCFWithModel", + "FaceRestoreModelLoader" + ], + { + "title_aux": "Facerestore CF (Code Former)" + } + ], + "https://github.com/mbrostami/ComfyUI-HF": [ + [ + "GPT2Node" + ], + { + "title_aux": "ComfyUI-HF" + } + ], + "https://github.com/mbrostami/ComfyUI-TITrain": [ + [ + "TextualInversionTraining", + "TextualInversionTrainingSDXL" + ], + { + "title_aux": "ComfyUI-TITrain" + } + ], + "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": [ + [ + "DynamicThresholdingFull", + "DynamicThresholdingSimple" + ], + { + "title_aux": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)" + } + ], + "https://github.com/meap158/ComfyUI-Background-Replacement": [ + [ + "BackgroundReplacement", + "ImageComposite" + ], + { + "title_aux": "ComfyUI-Background-Replacement" + } + ], + "https://github.com/meap158/ComfyUI-GPU-temperature-protection": [ + [ + "GPUTemperatureProtection" + ], + { + "title_aux": "GPU temperature protection" + } + ], + "https://github.com/meap158/ComfyUI-Prompt-Expansion": [ + [ + "PromptExpansion" + ], + { + "title_aux": "ComfyUI-Prompt-Expansion" + } + ], + "https://github.com/melMass/comfy_mtb": [ + [ + "Animation Builder (mtb)", + "Any To String (mtb)", + "Batch Float (mtb)", + "Batch Float Assemble (mtb)", + "Batch Float Fill (mtb)", + "Batch Make (mtb)", + "Batch Merge (mtb)", + "Batch Shake (mtb)", + "Batch Shape (mtb)", + "Batch Transform (mtb)", + "Bbox (mtb)", + "Bbox From Mask (mtb)", + "Blur (mtb)", + "Color Correct (mtb)", + "Colored Image (mtb)", + "Concat Images (mtb)", + "Crop (mtb)", + "Debug (mtb)", + "Deep Bump (mtb)", + "Export With Ffmpeg (mtb)", + "Face Swap (mtb)", + "Film Interpolation (mtb)", + "Fit Number (mtb)", + "Float To Number (mtb)", + "Get Batch From History (mtb)", + "Image Compare (mtb)", + "Image Premultiply (mtb)", + "Image Remove Background Rembg (mtb)", + "Image Resize Factor (mtb)", + "Image Tile Offset (mtb)", + "Int To Bool (mtb)", + "Int To Number (mtb)", + "Interpolate Clip Sequential (mtb)", + "Latent Lerp (mtb)", + "Load Face Analysis Model (mtb)", + "Load Face Enhance Model (mtb)", + "Load Face Swap Model (mtb)", + "Load Film Model (mtb)", + "Load Image From Url (mtb)", + "Load Image Sequence (mtb)", + "Mask To Image (mtb)", + "Math Expression (mtb)", + "Model Patch Seamless (mtb)", + "Pick From Batch (mtb)", + "Qr Code (mtb)", + "Restore Face (mtb)", + "Save Gif (mtb)", + "Save Image Grid (mtb)", + "Save Image Sequence (mtb)", + "Save Tensors (mtb)", + "Sharpen (mtb)", + "Smart Step (mtb)", + "Stack Images (mtb)", + "String Replace (mtb)", + "Styles Loader (mtb)", + "Text To Image (mtb)", + "Transform Image (mtb)", + "Uncrop (mtb)", + "Unsplash Image (mtb)", + "Vae Decode (mtb)" + ], + { + "nodename_pattern": "\\(mtb\\)$", + "title_aux": "MTB Nodes" + } + ], + "https://github.com/mephisto83/petty-paint-comfyui-node": [ + [ + "PettyImageImageColorToMask", + "PettyPaintAppend", + "PettyPaintApplyLoRAStack", + "PettyPaintBlurs", + "PettyPaintComponent", + "PettyPaintConditioningSetMaskAndCombine", + "PettyPaintConvert", + "PettyPaintCountFiles", + "PettyPaintEnsureDirectory", + "PettyPaintExec", + "PettyPaintFakeConvert", + "PettyPaintFileExists", + "PettyPaintImageColorsToMasks", + "PettyPaintImageCompositeMasked", + "PettyPaintImageDims", + "PettyPaintImageMaskCropper", + "PettyPaintImagePlacement", + "PettyPaintImageSave", + "PettyPaintImageStore", + "PettyPaintImageToMask", + "PettyPaintImagesToMasks", + "PettyPaintJsonMap", + "PettyPaintJsonRead", + "PettyPaintJsonReadArray", + "PettyPaintKSampler", + "PettyPaintKSamplerAdvanced", + "PettyPaintLoRAStack", + "PettyPaintLoadImage", + "PettyPaintLoadImageMasks", + "PettyPaintLoadImages", + "PettyPaintMap", + "PettyPaintMasksToImages", + "PettyPaintNot", + "PettyPaintPassThroughNode", + "PettyPaintProcessor", + "PettyPaintRemoveAddText", + "PettyPaintSDTurboScheduler", + "PettyPaintStoryImage", + "PettyPaintText", + "PettyPaintTexts_to_Conditioning", + "PettyPaintToJson", + "PettyPaintVAEDecode" + ], + { + "title_aux": "petty-paint-comfyui-node" + } + ], + "https://github.com/meshmesh-io/ComfyUI-MeshMesh": [ + [ + "ColorPicker", + "MasksToColoredMasks" + ], + { + "title_aux": "ComfyUI-MeshMesh" + } + ], + "https://github.com/meshmesh-io/mm-comfyui-loopback": [ + [ + "Loop", + "LoopEnd", + "LoopEnd_SEGIMAGE", + "LoopStart", + "LoopStart_SEGIMAGE" + ], + { + "title_aux": "mm-comfyui-loopback" + } + ], + "https://github.com/meshmesh-io/mm-comfyui-megamask": [ + [ + "ColorListMaskToImage", + "FlattenAndCombineMaskImages" + ], + { + "title_aux": "mm-comfyui-megamask" + } + ], + "https://github.com/metncelik/comfyui_met_suite": [ + [ + "BBOXPadding", + "BBOXResize", + "ImageResizeKeepRatio", + "PrimitiveBBOX", + "RaiseError" + ], + { + "title_aux": "comfyui_met_suite" + } + ], + "https://github.com/mihaiiancu/ComfyUI_Inpaint": [ + [ + "InpaintMediapipe" + ], + { + "title_aux": "mihaiiancu/Inpaint" + } + ], + "https://github.com/mikkel/ComfyUI-text-overlay": [ + [ + "Image Text Overlay" + ], + { + "title_aux": "ComfyUI - Text Overlay Plugin" + } + ], + "https://github.com/mikkel/comfyui-mask-boundingbox": [ + [ + "Mask Bounding Box" + ], + { + "title_aux": "ComfyUI - Mask Bounding Box" + } + ], + "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq": [ + [ + "INSPY removebg Apply", + "INSPY removebg ModelLoader" + ], + { + "title_aux": "ComfyUI_InSPyResNet_zmq" + } + ], + "https://github.com/mirabarukaso/ComfyUI_Mira": [ + [ + "BooleanListInterpreter1", + "BooleanListInterpreter4", + "BooleanListInterpreter8", + "CanvasCreatorAdvanced", + "CanvasCreatorBasic", + "CanvasCreatorSimple", + "CircleCreator", + "CirclesGenerator", + "CreateCircleMask", + "CreateMaskWithCanvas", + "CreateNestedPNGMask", + "CreateSimpleMask", + "CreateTillingPNGMask", + "CreateWatermarkRemovalMask", + "EightBooleanTrigger", + "EightFloats", + "EvenOrOdd", + "EvenOrOddList", + "FloatListInterpreter1", + "FloatListInterpreter4", + "FloatListInterpreter8", + "FloatMultiplication", + "FourBooleanTrigger", + "FourFloats", + "FunctionSwap", + "IntMultiplication", + "IntSubtraction", + "IntToFloatMultiplication", + "LogicNot", + "NoneToZero", + "NumeralToString", + "OneFloat", + "PngColorMasksToMaskList", + "PngColorMasksToRGB", + "PngColorMasksToString", + "PngColorMasksToStringList", + "PngRectanglesToMask", + "PngRectanglesToMaskList", + "RandomNestedLayouts", + "RandomTillingLayouts", + "SN74HC1G86", + "SN74HC86", + "SN74LVC1G125", + "SeedGenerator", + "SingleBooleanTrigger", + "SixBooleanTrigger", + "StepsAndCfg", + "TextBox", + "TextCombinerSix", + "TextCombinerTwo", + "TextWithBooleanSwitchAndCommonTextInput", + "TwoBooleanTrigger", + "TwoFloats" + ], + { + "title_aux": "ComfyUI_Mira" + } + ], + "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": [ + [ + "DimensionProviderFree modusCell", + "DimensionProviderRatio modusCell", + "String Concat modusCell" + ], + { + "title_aux": "Preset Dimensions" + } + ], + "https://github.com/moyi7712/ComfyUI_Seamless_Patten": [ + [ + "SeamlessApply", + "SeamlessKSampler", + "SeamlessKSamplerAdvanced", + "SeamlessVae" + ], + { + "title_aux": "ComfyUI_Seamless_Patten" + } + ], + "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt": [ + [ + "Save IMG Prompt" + ], + { + "title_aux": "SaveImgPrompt" + } + ], + "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes": [ + [ + "ConcatStrings", + "FormatString", + "GetFiles", + "LoadImageByPath" + ], + { + "title_aux": "comfyui_dynamic_util_nodes" + } + ], + "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": [ + [ + "Image Brightness", + "Openpose Keypoint Mask" + ], + { + "title_aux": "PoseKeypoint Mask" + } + ], + "https://github.com/my-opencode/ComfyUI_IndustrialMagick": [ + [ + "IndustrialMagick", + "IndustrialMagickImageIngest" + ], + { + "title_aux": "ComfyUI_IndustrialMagick" + } + ], + "https://github.com/my-opencode/ComfyUI_KSamplerTimer": [ + [ + "KSamplerTimer" + ], + { + "author": "Ludovic Anterieur", + "description": "This extension provides a wrapper of the native KSampler which outputs generation time.", + "nickname": "\u23f1", + "title": "KSampler (timer)", + "title_aux": "ComfyUI_KSamplerTimer" + } + ], + "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": [ + [ + "FastLatentToImage" + ], + { + "title_aux": "ComfyUI_FastVAEDecorder_SDXL" + } + ], + "https://github.com/nagolinc/comfyui_openai_node": [ + [ + "OpenAINode" + ], + { + "title_aux": "comfyui_openai_node" + } + ], + "https://github.com/natto-maki/ComfyUI-NegiTools": [ + [ + "NegiTools_CompositeImages", + "NegiTools_DepthEstimationByMarigold", + "NegiTools_DetectFaceRotationForInpainting", + "NegiTools_ImageProperties", + "NegiTools_LatentProperties", + "NegiTools_NoiseImageGenerator", + "NegiTools_OpenAiDalle3", + "NegiTools_OpenAiGpt", + "NegiTools_OpenAiGpt4v", + "NegiTools_OpenAiTranslate", + "NegiTools_OpenPoseToPointList", + "NegiTools_PointListToMask", + "NegiTools_RandomImageLoader", + "NegiTools_SaveImageToDirectory", + "NegiTools_SeedGenerator", + "NegiTools_StereoImageGenerator", + "NegiTools_StringFunction" + ], + { + "title_aux": "ComfyUI-NegiTools" + } + ], + "https://github.com/nickve28/ComfyUI-Nich-Utils": [ + [ + "Image from Dir Selector (Nich)", + "Select Text with Regular Expression (Nich)" + ], + { + "title_aux": "ComfyUI Nich Utils" + } + ], + "https://github.com/nicolai256/comfyUI_Nodes_nicolai256/raw/main/yugioh-presets.py": [ + [ + "yugioh_Presets" + ], + { + "title_aux": "comfyUI_Nodes_nicolai256" + } + ], + "https://github.com/ningxiaoxiao/comfyui-NDI": [ + [ + "NDI_LoadImage", + "NDI_SendImage" + ], + { + "title_aux": "comfyui-NDI" + } + ], + "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": [ + [ + "ImageConcat", + "ImageCropMultEight", + "ImageCut", + "LightingPreprocessor" + ], + { + "title_aux": "ImgProcessing_ComfyUI" + } + ], + "https://github.com/nirex0/ComfyUI_pytorch_openpose": [ + [ + "pytorch_openpose" + ], + { + "title_aux": "ComfyUI_pytorch_openpose" + } + ], + "https://github.com/nkchocoai/ComfyUI-Dart": [ + [ + "DanbooruTagsTransformerBanTagsFromRegex", + "DanbooruTagsTransformerComposePrompt", + "DanbooruTagsTransformerComposePromptV2", + "DanbooruTagsTransformerDecode", + "DanbooruTagsTransformerDecodeBySplitedParts", + "DanbooruTagsTransformerGenerate", + "DanbooruTagsTransformerGenerateAdvanced", + "DanbooruTagsTransformerGenerationConfig", + "DanbooruTagsTransformerGetAspectRatio", + "DanbooruTagsTransformerLoader", + "DanbooruTagsTransformerRearrangedByAnimagine", + "DanbooruTagsTransformerRemoveTagToken" + ], + { + "title_aux": "ComfyUI-Dart" + } + ], + "https://github.com/nkchocoai/ComfyUI-PromptUtilities": [ + [ + "PromptUtilitiesConstString", + "PromptUtilitiesConstStringMultiLine", + "PromptUtilitiesFormatString", + "PromptUtilitiesJoinStringList", + "PromptUtilitiesLoadPreset", + "PromptUtilitiesLoadPresetAdvanced", + "PromptUtilitiesRandomPreset", + "PromptUtilitiesRandomPresetAdvanced" + ], + { + "title_aux": "ComfyUI-PromptUtilities" + } + ], + "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": [ + [ + "SaveImageWithMetaData" + ], + { + "title_aux": "ComfyUI-SaveImageWithMetaData" + } + ], + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": [ + [ + "EmptyLatentImageFromPresetsSD15", + "EmptyLatentImageFromPresetsSDXL", + "GetSimilarResolution", + "GetSimilarResolutionEmptyLatent", + "RandomEmptyLatentImageFromPresetsSD15", + "RandomEmptyLatentImageFromPresetsSDXL", + "RandomSizeFromPresetsSD15", + "RandomSizeFromPresetsSDXL", + "SizeFromPresetsSD15", + "SizeFromPresetsSDXL" + ], + { + "title_aux": "ComfyUI-SizeFromPresets" + } + ], + "https://github.com/nkchocoai/ComfyUI-TextOnSegs": [ + [ + "CalcMaxFontSize", + "ExtractDominantColor", + "GetComplementaryColor", + "SegsToRegion", + "TextOnSegsFloodFill" + ], + { + "title_aux": "ComfyUI-TextOnSegs" + } + ], + "https://github.com/noembryo/ComfyUI-noEmbryo": [ + [ + "PromptTermList1", + "PromptTermList2", + "PromptTermList3", + "PromptTermList4", + "PromptTermList5", + "PromptTermList6" + ], + { + "author": "noEmbryo", + "description": "Some useful nodes for ComfyUI", + "nickname": "noEmbryo", + "title": "noEmbryo nodes", + "title_aux": "noEmbryo nodes" + } + ], + "https://github.com/nosiu/comfyui-instantId-faceswap": [ + [ + "FaceEmbed", + "FaceSwapGenerationInpaint", + "FaceSwapSetupPipeline", + "LCMLora" + ], + { + "title_aux": "ComfyUI InstantID Faceswapper" + } + ], + "https://github.com/noxinias/ComfyUI_NoxinNodes": [ + [ + "NoxinChime", + "NoxinPromptLoad", + "NoxinPromptSave", + "NoxinScaledResolution", + "NoxinSimpleMath", + "NoxinSplitPrompt" + ], + { + "title_aux": "ComfyUI_NoxinNodes" + } + ], + "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": [ + [ + "Apply LoRA", + "DARE Merge LoRA Stack", + "Save LoRA" + ], + { + "title_aux": "ComfyUI - Apply LoRA Stacker with DARE" + } + ], + "https://github.com/ntdviet/comfyui-ext/raw/main/custom_nodes/gcLatentTunnel/gcLatentTunnel.py": [ + [ + "gcLatentTunnel" + ], + { + "title_aux": "ntdviet/comfyui-ext" + } + ], + "https://github.com/nuanarchy/ComfyUI-NuA-BIRD": [ + [ + "Bird_Deblurring_NuA", + "Bird_Denoising_NuA", + "Bird_Inpainting_NuA", + "Bird_Loader_NuA", + "Bird_Non_Uniform_Deblurring_NuA", + "Bird_Super_Resolution_NuA" + ], + { + "title_aux": "ComfyUI-NuA-BIRD" + } + ], + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": [ + [ + "FlashFace_Loader_NuA", + "FlashFace_Sampler_NuA" + ], + { + "title_aux": "ComfyUI-NuA-FlashFace" + } + ], + "https://github.com/nullquant/ComfyUI-BrushNet": [ + [ + "BlendInpaint", + "BrushNet", + "BrushNetLoader", + "CutForInpaint", + "PowerPaint", + "PowerPaintCLIPLoader", + "RAUNet", + "Terminal" + ], + { + "author": "nullquant", + "description": "These are custom nodes for ComfyUI native implementation of BrushNet, PowerPaint and RAUNet models", + "nickname": "BrushName nodes", + "title": "BrushNet", + "title_aux": "BrushNet" + } + ], + "https://github.com/olduvai-jp/ComfyUI-HfLoader": [ + [ + "Lora Loader From HF" + ], + { + "title_aux": "ComfyUI-HfLoader" + } + ], + "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": [ + [ + "CLIPStringEncode _O", + "Chat completion _O", + "ChatGPT Simple _O", + "ChatGPT _O", + "ChatGPT compact _O", + "Chat_Completion _O", + "Chat_Message _O", + "Chat_Message_fromString _O", + "Concat Text _O", + "ConcatRandomNSP_O", + "Debug String _O", + "Debug Text _O", + "Debug Text route _O", + "Edit_image _O", + "Equation1param _O", + "Equation2params _O", + "GetImage_(Width&Height) _O", + "GetLatent_(Width&Height) _O", + "ImageScaleFactor _O", + "ImageScaleFactorSimple _O", + "LatentUpscaleFactor _O", + "LatentUpscaleFactorSimple _O", + "LatentUpscaleMultiply", + "Note _O", + "RandomNSP _O", + "Replace Text _O", + "String _O", + "Text _O", + "Text2Image _O", + "Trim Text _O", + "VAEDecodeParallel _O", + "combine_chat_messages _O", + "compine_chat_messages _O", + "concat Strings _O", + "create image _O", + "create_image _O", + "debug Completeion _O", + "debug messages_O", + "float _O", + "floatToInt _O", + "floatToText _O", + "int _O", + "intToFloat _O", + "load_openAI _O", + "replace String _O", + "replace String advanced _O", + "saveTextToFile _O", + "seed _O", + "selectLatentFromBatch _O", + "string2Image _O", + "trim String _O", + "variation_image _O" + ], + { + "title_aux": "Quality of life Suit:V2" + } + ], + "https://github.com/opvelll/ComfyUI_TextListProduct": [ + [ + "ProductedString", + "TextListProduct", + "TextListProductWithSingleA", + "TextListProductWithSingleB", + "TextListProductWithSingleBoth" + ], + { + "title_aux": "Comfy UI Text List Product" + } + ], + "https://github.com/osi1880vr/prompt_quill_comfyui": [ + [ + "PromptQuillGenerate", + "PromptQuillGenerateConditioning", + "PromptQuillSail", + "PromptQuillSailConditioning" + ], + { + "title_aux": "ComfyUI_Prompt-Quill" + } + ], + "https://github.com/ostris/ostris_nodes_comfyui": [ + [ + "LLM Pipe Loader - Ostris", + "LLM Prompt Upsampling - Ostris", + "One Seed - Ostris", + "Text Box - Ostris" + ], + { + "nodename_pattern": "- Ostris$", + "title_aux": "Ostris Nodes ComfyUI" + } + ], + "https://github.com/ownimage/ComfyUI-ownimage": [ + [ + "Caching Image Loader" + ], + { + "title_aux": "ComfyUI-ownimage" + } + ], + "https://github.com/oyvindg/ComfyUI-TrollSuite": [ + [ + "BinaryImageMask", + "ImagePadding", + "LoadLastImage", + "RandomMask", + "TransparentImage" + ], + { + "title_aux": "ComfyUI-TrollSuite" + } + ], + "https://github.com/oztrkoguz/ComfyUI_StoryCreator": [ + [ + "Kosmos2SamplerSimple2", + "KosmosLoader2", + "StoryLoader", + "StorySamplerSimple", + "Write2" + ], + { + "title_aux": "ComfyUI StoryCreater" + } + ], + "https://github.com/palant/extended-saveimage-comfyui": [ + [ + "SaveImageExtended" + ], + { + "title_aux": "Extended Save Image for ComfyUI" + } + ], + "https://github.com/palant/image-resize-comfyui": [ + [ + "ImageResize" + ], + { + "title_aux": "Image Resize for ComfyUI" + } + ], + "https://github.com/pamparamm/ComfyUI-vectorscope-cc": [ + [ + "NormalizeLatent", + "VectorscopeCC" + ], + { + "title_aux": "ComfyUI Vectorscope CC" + } + ], + "https://github.com/pamparamm/sd-perturbed-attention": [ + [ + "PerturbedAttention" + ], + { + "title_aux": "Perturbed-Attention Guidance" + } + ], + "https://github.com/pants007/comfy-pants": [ + [ + "CLIPTextEncodeAIO", + "Image Make Square" + ], + { + "title_aux": "pants" + } + ], + "https://github.com/paulo-coronado/comfy_clip_blip_node": [ + [ + "CLIPTextEncodeBLIP", + "CLIPTextEncodeBLIP-2", + "Example" + ], + { + "title_aux": "comfy_clip_blip_node" + } + ], + "https://github.com/philz1337x/ComfyUI-ClarityAI": [ + [ + "Clarity AI Upscaler" + ], + { + "title_aux": "\u2728 Clarity AI - Creative Image Upscaler and Enhancer for ComfyUI" + } + ], + "https://github.com/picturesonpictures/comfy_PoP": [ + [ + "AdaptiveCannyDetector_PoP", + "AnyAspectRatio", + "ConditioningMultiplier_PoP", + "ConditioningNormalizer_PoP", + "DallE3_PoP", + "EfficientAttention", + "LoadImageResizer_PoP", + "LoraStackLoader10_PoP", + "LoraStackLoader_PoP", + "VAEDecoderPoP", + "VAEEncoderPoP" + ], + { + "title_aux": "comfy_PoP" + } + ], + "https://github.com/pkpkTech/ComfyUI-SaveAVIF": [ + [ + "SaveAvif" + ], + { + "title_aux": "ComfyUI-SaveAVIF" + } + ], + "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": [ + [ + "LoadTempCheckpoint", + "LoadTempLoRA", + "LoadTempMultiLoRA" + ], + { + "title_aux": "ComfyUI-TemporaryLoader" + } + ], + "https://github.com/portu-sim/comfyui_bmab": [ + [ + "BMAB Alpha Composit", + "BMAB Basic", + "BMAB Blend", + "BMAB Clip Text Encoder SDXL", + "BMAB Conditioning To Bind", + "BMAB Context", + "BMAB ControlNet", + "BMAB ControlNet IPAdapter", + "BMAB ControlNet Openpose", + "BMAB Crop", + "BMAB Detail Anything", + "BMAB Detect And Mask", + "BMAB Detection Crop", + "BMAB Detector", + "BMAB Edge", + "BMAB Extractor", + "BMAB Face Detailer", + "BMAB Google Gemini Prompt", + "BMAB Import Integrator", + "BMAB Integrator", + "BMAB KSampler", + "BMAB KSamplerHiresFix", + "BMAB KSamplerHiresFixWithUpscaler", + "BMAB KSamplerKohyaDeepShrink", + "BMAB Lama Inpaint", + "BMAB LoRA Loader", + "BMAB Load Image", + "BMAB Load Output Image", + "BMAB Masks To Images", + "BMAB Model To Bind", + "BMAB Noise Generator", + "BMAB Openpose Hand Detailer", + "BMAB Person Detailer", + "BMAB Preview Text", + "BMAB Prompt", + "BMAB Remove Background", + "BMAB Resize By Person", + "BMAB Resize By Ratio", + "BMAB Resize and Fill", + "BMAB SD-WebUI API BMAB Extension", + "BMAB SD-WebUI API ControlNet", + "BMAB SD-WebUI API I2I", + "BMAB SD-WebUI API Server", + "BMAB SD-WebUI API T2I", + "BMAB SD-WebUI API T2I Hires.Fix", + "BMAB Save Image", + "BMAB SeedGenerator", + "BMAB Segment Anything", + "BMAB Simple Hand Detailer", + "BMAB Subframe Hand Detailer", + "BMAB Text", + "BMAB Upscale With Model", + "BMAB Upscaler", + "BMAB Watermark" + ], + { + "title_aux": "comfyui_bmab" + } + ], + "https://github.com/prodogape/ComfyUI-EasyOCR": [ + [ + "Apply EasyOCR" + ], + { + "title_aux": "ComfyUI-EasyOCR" + } + ], + "https://github.com/prodogape/ComfyUI-Minio": [ + [ + "Load Image From Minio", + "Save Image To Minio", + "Set Minio Config" + ], + { + "title_aux": "Comfyui-Minio" + } + ], + "https://github.com/prodogape/ComfyUI-OmDet": [ + [ + "Apply OmDet" + ], + { + "title_aux": "ComfyUI-OmDet" + } + ], + "https://github.com/prodogape/Comfyui-Yolov8-JSON": [ + [ + "Apply Yolov8 Model", + "Apply Yolov8 Model Seg", + "Draw Labelme Json", + "Load Yolov8 Model", + "Load Yolov8 Model From Path", + "Save Labelme Json" + ], + { + "title_aux": "Comfyui-Yolov8-JSON" + } + ], + "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": [ + [ + "CheckpointLoader|pysssss", + "ConstrainImageforVideo|pysssss", + "ConstrainImage|pysssss", + "LoadText|pysssss", + "LoraLoader|pysssss", + "MathExpression|pysssss", + "MultiPrimitive|pysssss", + "PlaySound|pysssss", + "Repeater|pysssss", + "ReroutePrimitive|pysssss", + "SaveText|pysssss", + "ShowText|pysssss", + "StringFunction|pysssss", + "SystemNotification|pysssss" + ], + { + "title_aux": "pythongosssss/ComfyUI-Custom-Scripts" + } + ], + "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": [ + [ + "WD14Tagger|pysssss" + ], + { + "title_aux": "ComfyUI WD 1.4 Tagger" + } + ], + "https://github.com/qwixiwp/queuetools": [ + [ + "load images (queue tools)" + ], + { + "title_aux": "queuetools" + } + ], + "https://github.com/ramyma/A8R8_ComfyUI_nodes": [ + [ + "AttentionCouple", + "AttentionCoupleRegion", + "AttentionCoupleRegions", + "Base64ImageInput", + "Base64ImageOutput" + ], + { + "title_aux": "A8R8 ComfyUI Nodes" + } + ], + "https://github.com/randjtw/advance-aesthetic-score": [ + [ + "Adv_Scoring" + ], + { + "title_aux": "advance-aesthetic-score" + } + ], + "https://github.com/ratulrafsan/Comfyui-SAL-VTON": [ + [ + "SALVTON_Apply", + "SV_random" + ], + { + "title_aux": "Comfyui-SAL-VTON" + } + ], + "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": [ + [ + "Combine ZHGMasks", + "Cover ZHGMasks", + "From ZHG pip", + "GroundingDinoModelLoader (zhihuige)", + "GroundingDinoPIPESegment (zhihuige)", + "GroundingDinoSAMSegment (zhihuige)", + "InvertMask (zhihuige)", + "SAMModelLoader (zhihuige)", + "To ZHG pip", + "ZHG FaceIndex", + "ZHG GetMaskArea", + "ZHG Image Levels", + "ZHG SaveImage", + "ZHG SmoothEdge", + "ZHG UltimateSDUpscale" + ], + { + "title_aux": "zhihuige-nodes-comfyui" + } + ], + "https://github.com/rcsaquino/comfyui-custom-nodes": [ + [ + "BackgroundRemover | rcsaquino", + "VAELoader | rcsaquino", + "VAEProcessor | rcsaquino" + ], + { + "title_aux": "rcsaquino/comfyui-custom-nodes" + } + ], + "https://github.com/receyuki/comfyui-prompt-reader-node": [ + [ + "SDAnyConverter", + "SDBatchLoader", + "SDLoraLoader", + "SDLoraSelector", + "SDParameterExtractor", + "SDParameterGenerator", + "SDPromptMerger", + "SDPromptReader", + "SDPromptSaver", + "SDTypeConverter" + ], + { + "author": "receyuki", + "description": "The ultimate solution for managing image metadata and multi-tool compatibility. ComfyUI node version of the SD Prompt Reader", + "nickname": "SD Prompt Reader", + "title": "SD Prompt Reader", + "title_aux": "SD Prompt Reader" + } + ], + "https://github.com/redhottensors/ComfyUI-Prediction": [ + [ + "AvoidErasePrediction", + "CFGPrediction", + "CharacteristicGuidancePrediction", + "CombinePredictions", + "ConditionedPrediction", + "EarlyMiddleLatePrediction", + "InterpolatePredictions", + "LogSigmas", + "PerpNegPrediction", + "SamplerCustomPrediction", + "ScalePrediction", + "ScaledGuidancePrediction", + "SelectSigmas", + "SplitAtSigma", + "SwitchPredictions" + ], + { + "author": "RedHotTensors", + "description": "Fully customizable Classifer Free Guidance for ComfyUI", + "nickname": "ComfyUI-Prediction", + "title": "ComfyUI-Prediction", + "title_aux": "ComfyUI-Prediction" + } + ], + "https://github.com/rgthree/rgthree-comfy": [ + [], + { + "author": "rgthree", + "description": "A bunch of nodes I created that I also find useful.", + "nickname": "rgthree", + "nodename_pattern": " \\(rgthree\\)$", + "title": "Comfy Nodes", + "title_aux": "rgthree's ComfyUI Nodes" + } + ], + "https://github.com/rhdunn/comfyui-bus-plugin": [ + [ + "ComfyBus.CLIPEncodedPromptBusNode", + "ComfyBus.CheckpointBusNode", + "ComfyBus.ImageBusNode", + "ComfyBus.ImageParameterBusNode", + "ComfyBus.ImageScaleToSideParameterBusNode", + "ComfyBus.ImageSizeBusNode", + "ComfyBus.LatentImageBusNode", + "ComfyBus.LatentImageParameterBusNode", + "ComfyBus.PromptBusNode", + "ComfyBus.PromptSDXLBusNode" + ], + { + "title_aux": "comfyui-bus-plugin" + } + ], + "https://github.com/richinsley/Comfy-LFO": [ + [ + "LFO_Pulse", + "LFO_Sawtooth", + "LFO_Sine", + "LFO_Square", + "LFO_Triangle" + ], + { + "title_aux": "Comfy-LFO" + } + ], + "https://github.com/ricklove/comfyui-ricklove": [ + [ + "RL_Crop_Resize", + "RL_Crop_Resize_Batch", + "RL_Finetune_Analyze", + "RL_Finetune_Analyze_Batch", + "RL_Finetune_Variable", + "RL_Image_Shadow", + "RL_Image_Threshold_Channels", + "RL_Internet_Search", + "RL_LoadImageSequence", + "RL_Optical_Flow_Dip", + "RL_SaveImageSequence", + "RL_Uncrop", + "RL_Warp_Image", + "RL_Zoe_Depth_Map_Preprocessor", + "RL_Zoe_Depth_Map_Preprocessor_Raw_Infer", + "RL_Zoe_Depth_Map_Preprocessor_Raw_Process" + ], + { + "title_aux": "comfyui-ricklove" + } + ], + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": [ + [ + "FrequencyCombination", + "FrequencyCombinationHSV", + "FrequencySeparation", + "FrequencySeparationHSV" + ], + { + "title_aux": "comfyUI_FrequencySeparation_RGB-HSV" + } + ], + "https://github.com/rklaffehn/rk-comfy-nodes": [ + [ + "RK_CivitAIAddHashes", + "RK_CivitAIMetaChecker" + ], + { + "title_aux": "rk-comfy-nodes" + } + ], + "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": [ + [ + "SetMetadataAll", + "SetMetadataString" + ], + { + "title_aux": "ComfyUI PNG Metadata" + } + ], + "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": [ + [ + "TaraAdvancedComposition", + "TaraApiKeyLoader", + "TaraApiKeySaver", + "TaraDaisyChainNode", + "TaraLLMConfig", + "TaraPresetLLMConfig", + "TaraPrompter", + "TaraPrompterAdvanced" + ], + { + "title_aux": "ComfyUI-Tara-LLM-Integration" + } + ], + "https://github.com/royceschultz/ComfyUI-Notifications": [ + [ + "Notif-PlaySound", + "Notif-SystemNotification", + "Notif-UnifiedNotification", + "Notif-Webhook" + ], + { + "title_aux": "ComfyUI-Notifications" + } + ], + "https://github.com/royceschultz/ComfyUI-TranscriptionTools": [ + [ + "TT-AudioSink", + "TT-ConvertVhsAudioToAudio", + "TT-LoadAudio", + "TT-LoadBatch", + "TT-LoadVideoAudio", + "TT-LoadWhisperModel", + "TT-WhisperTranscription", + "TT-WhisperTranscriptionBatch" + ], + { + "title_aux": "ComfyUI-TranscriptionTools" + } + ], + "https://github.com/rui40000/RUI-Nodes": [ + [ + "ABCondition", + "CharacterCount" + ], + { + "title_aux": "RUI-Nodes" + } + ], + "https://github.com/ruiqutech/ComfyUI-RuiquNodes": [ + [ + "EvaluateListMultiple1", + "EvaluateListMultiple3", + "EvaluateListMultiple6", + "EvaluateListMultiple9", + "EvaluateMultiple1", + "EvaluateMultiple3", + "EvaluateMultiple6", + "EvaluateMultiple9", + "ImageDilate", + "ImageErode", + "ListPath", + "MaskDilate", + "MaskErode", + "PreviewMask", + "RangeSplit", + "SaveMask", + "StringAsAny", + "StringConcat1", + "StringConcat3", + "StringConcat6", + "StringConcat9", + "StringPathStem", + "TermsToList", + "VAEDecodeSave" + ], + { + "title_aux": "RuiquNodes for ComfyUI" + } + ], + "https://github.com/runtime44/comfyui_r44_nodes": [ + [ + "Runtime44ColorMatch", + "Runtime44DynamicKSampler", + "Runtime44FilmGrain", + "Runtime44ImageEnhance", + "Runtime44ImageOverlay", + "Runtime44ImageResizer", + "Runtime44ImageToNoise", + "Runtime44IterativeUpscaleFactor", + "Runtime44MaskSampler", + "Runtime44TiledMaskSampler", + "Runtime44Upscaler" + ], + { + "title_aux": "Runtime44 ComfyUI Nodes" + } + ], + "https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [ + [ + "MergingExecutionHelper" + ], + { + "title_aux": "comfy_meh" + } + ], + "https://github.com/saftle/suplex_comfy_nodes": [ + [ + "ControlNet Selector", + "ControlNetOptionalLoader", + "DiffusersSelector", + "SaveImageJPGNoMeta" + ], + { + "title_aux": "Suplex Misc ComfyUI Nodes" + } + ], + "https://github.com/sdfxai/SDFXBridgeForComfyUI": [ + [ + "SDFXClipTextEncode" + ], + { + "title_aux": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration" + } + ], + "https://github.com/seanlynch/comfyui-optical-flow": [ + [ + "Apply optical flow", + "Compute optical flow", + "Visualize optical flow" + ], + { + "title_aux": "ComfyUI Optical Flow" + } + ], + "https://github.com/seanlynch/srl-nodes": [ + [ + "SRL Conditional Interrrupt", + "SRL Eval", + "SRL Filter Image List", + "SRL Format String" + ], + { + "title_aux": "SRL's nodes" + } + ], + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py": [ + [ + "LibreTranslate" + ], + { + "title_aux": "ComfyUI_LibreTranslate" + } + ], + "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": [ + [ + "AdjustAndRoundDimensions", + "AspectRatioMobileDevices", + "ImageResizeAndCropNode", + "ImageSquareAdapterNode", + "PopularScreenResolutions" + ], + { + "title_aux": "ComfyUI_Nimbus-Pack" + } + ], + "https://github.com/shadowcz007/comfyui-Image-reward": [ + [ + "ImageBatchToList_", + "ImageRewardScore_" + ], + { + "title_aux": "comfyui-Image-reward" + } + ], + "https://github.com/shadowcz007/comfyui-consistency-decoder": [ + [ + "VAEDecodeConsistencyDecoder", + "VAELoaderConsistencyDecoder" + ], + { + "title_aux": "Consistency Decoder" + } + ], + "https://github.com/shadowcz007/comfyui-edit-mask": [ + [ + "EditMask" + ], + { + "title_aux": "comfyui-edit-mask" + } + ], + "https://github.com/shadowcz007/comfyui-liveportrait": [ + [ + "FaceCropInfo", + "LivePortraitNode", + "Retargeting" + ], + { + "title_aux": "comfyui-liveportrait" + } + ], + "https://github.com/shadowcz007/comfyui-mixlab-nodes": [ + [ + "3DImage", + "AppInfo", + "ApplyVisualStylePrompting_", + "AreaToMask", + "AudioPlay", + "CenterImage", + "CkptNames_", + "Color", + "ComparingTwoFrames_", + "CompositeImages_", + "DynamicDelayProcessor", + "EmbeddingPrompt", + "EnhanceImage", + "FaceToMask", + "FeatheredMask", + "FloatSlider", + "FloatingVideo", + "Font", + "GLIGENTextBoxApply_Advanced", + "GetImageSize_", + "GradientImage", + "GridDisplayAndSave", + "GridInput", + "GridOutput", + "ImageColorTransfer", + "ImageCropByAlpha", + "ImageListToBatch_", + "ImagesPrompt_", + "IncrementingListNode_", + "IntNumber", + "JoinWithDelimiter", + "LimitNumber", + "ListSplit_", + "LoadImagesFromPath", + "LoadImagesFromURL", + "LoadImagesToBatch", + "LoraNames_", + "LoraPrompt", + "MaskListMerge_", + "MaskListReplace_", + "MergeLayers", + "MirroredImage", + "MultiplicationNode", + "NewLayer", + "NoiseImage", + "OutlineMask", + "PreviewMask_", + "PromptImage", + "PromptSimplification", + "PromptSlide", + "RandomPrompt", + "ResizeImageMixlab", + "SamplerNames_", + "SaveImageAndMetadata_", + "SaveImageToLocal", + "ScreenShare", + "Seed_", + "ShowLayer", + "SmoothMask", + "SpeechRecognition", + "SpeechSynthesis", + "SplitImage", + "SplitLongMask", + "StyleAlignedBatchAlign_", + "StyleAlignedReferenceSampler_", + "StyleAlignedSampleReferenceLatents_", + "SvgImage", + "SwitchByIndex", + "TESTNODE_", + "TESTNODE_TOKEN", + "TextImage", + "TextInput_", + "TextToNumber", + "TransparentImage", + "VAEDecodeConsistencyDecoder", + "VAELoaderConsistencyDecoder" + ], + { + "title_aux": "comfyui-mixlab-nodes" + } + ], + "https://github.com/shadowcz007/comfyui-sound-lab": [ + [ + "AudioPlay", + "Musicgen_", + "StableAudio_" + ], + { + "title_aux": "comfyui-sound-lab" + } + ], + "https://github.com/shadowcz007/comfyui-ultralytics-yolo": [ + [ + "DetectByLabel" + ], + { + "title_aux": "comfyui-ultralytics-yolo" + } + ], + "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": [ + [ + "DallERender", + "GPT", + "MemeplexCustomSDXLRender", + "MemeplexRender", + "TextInput", + "TextSend" + ], + { + "title_aux": "ComfyUI_Memeplex_DALLE" + } + ], + "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": [ + [ + "PhotoMakerEncodePlus", + "PhotoMakerStyles", + "PrepImagesForClipVisionFromPath" + ], + { + "title_aux": "ComfyUI PhotoMaker Plus" + } + ], + "https://github.com/shiimizu/ComfyUI-TiledDiffusion": [ + [ + "NoiseInversion", + "TiledDiffusion", + "VAEDecodeTiled_TiledDiffusion", + "VAEEncodeTiled_TiledDiffusion" + ], + { + "title_aux": "Tiled Diffusion & VAE for ComfyUI" + } + ], + "https://github.com/shiimizu/ComfyUI_smZNodes": [ + [ + "smZ CLIPTextEncode", + "smZ Settings" + ], + { + "title_aux": "smZNodes" + } + ], + "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage": [ + [ + "SDXL Empty Latent Image" + ], + { + "title_aux": "ComfyUI-SDXL-EmptyLatentImage" + } + ], + "https://github.com/shingo1228/ComfyUI-send-eagle-slim": [ + [ + "Send Eagle with text", + "Send Webp Image to Eagle" + ], + { + "title_aux": "ComfyUI-send-Eagle(slim)" + } + ], + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [ + [ + "PlusMinusTextClip" + ], + { + "title_aux": "PlusMinusTextClip - Single node for Positive and Negative Prompts" + } + ], + "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": [ + [ + "OpenposePreprocessorInterpolate" + ], + { + "title_aux": "InterpolateEverything" + } + ], + "https://github.com/shockz0rz/comfy-easy-grids": [ + [ + "FloatToText", + "GridFloatList", + "GridFloats", + "GridIntList", + "GridInts", + "GridLoras", + "GridStringList", + "GridStrings", + "ImageGridCommander", + "IntToText", + "SaveImageGrid", + "TextConcatenator" + ], + { + "title_aux": "comfy-easy-grids" + } + ], + "https://github.com/sipherxyz/comfyui-art-venture": [ + [ + "AV_AwsBedrockClaudeApi", + "AV_AwsBedrockMistralApi", + "AV_CheckpointMerge", + "AV_CheckpointModelsToParametersPipe", + "AV_CheckpointSave", + "AV_ClaudeApi", + "AV_ControlNetEfficientLoader", + "AV_ControlNetEfficientLoaderAdvanced", + "AV_ControlNetEfficientStacker", + "AV_ControlNetEfficientStackerSimple", + "AV_ControlNetLoader", + "AV_ControlNetPreprocessor", + "AV_LLMApiConfig", + "AV_LLMChat", + "AV_LLMCompletion", + "AV_LLMMessage", + "AV_LoraListLoader", + "AV_LoraListStacker", + "AV_LoraLoader", + "AV_OpenAIApi", + "AV_ParametersPipeToCheckpointModels", + "AV_ParametersPipeToPrompts", + "AV_PromptsToParametersPipe", + "AV_SAMLoader", + "AV_VAELoader", + "AspectRatioSelector", + "BLIPCaption", + "BLIPLoader", + "BooleanPrimitive", + "CheckpointNameSelector", + "ColorBlend", + "ColorCorrect", + "DeepDanbooruCaption", + "DependenciesEdit", + "Fooocus_KSampler", + "Fooocus_KSamplerAdvanced", + "GetBoolFromJson", + "GetFloatFromJson", + "GetIntFromJson", + "GetObjectFromJson", + "GetSAMEmbedding", + "GetTextFromJson", + "ISNetLoader", + "ISNetSegment", + "ImageAlphaComposite", + "ImageApplyChannel", + "ImageExtractChannel", + "ImageGaussianBlur", + "ImageMuxer", + "ImageRepeat", + "ImageScaleDown", + "ImageScaleDownBy", + "ImageScaleDownToSize", + "ImageScaleToMegapixels", + "LaMaInpaint", + "LoadImageAsMaskFromUrl", + "LoadImageFromUrl", + "LoadJsonFromUrl", + "MergeModels", + "NumberScaler", + "OverlayInpaintedImage", + "OverlayInpaintedLatent", + "PrepareImageAndMaskForInpaint", + "QRCodeGenerator", + "RandomFloat", + "RandomInt", + "SAMEmbeddingToImage", + "SDXLAspectRatioSelector", + "SDXLPromptStyler", + "SeedSelector", + "StringToInt", + "StringToNumber" + ], + { + "title_aux": "comfyui-art-venture" + } + ], + "https://github.com/skfoo/ComfyUI-Coziness": [ + [ + "LoraTextExtractor-b1f83aa2", + "MultiLoraLoader-70bf3d77" + ], + { + "title_aux": "ComfyUI-Coziness" + } + ], + "https://github.com/slyt/comfyui-ollama-nodes": [ + [ + "BooleanToString", + "DownloadHuggingfaceModel", + "FloatToString", + "GenerateOllama", + "IntToString", + "ListModels", + "ListToString", + "PullModel" + ], + { + "title_aux": "comfyui-ollama-nodes" + } + ], + "https://github.com/smagnetize/kb-comfyui-nodes": [ + [ + "SingleImageDataUrlLoader" + ], + { + "title_aux": "kb-comfyui-nodes" + } + ], + "https://github.com/smthemex/ComfyUI_AnyDoor": [ + [ + "AnyDoor_LoadModel", + "AnyDoor_img2img" + ], + { + "title_aux": "ComfyUI_AnyDoor" + } + ], + "https://github.com/smthemex/ComfyUI_ChatGLM_API": [ + [ + "Glm_4_9b_Chat", + "Glm_4v_9b", + "Glm_Lcoal_Or_Repo", + "ZhipuaiApi_Character", + "ZhipuaiApi_Txt", + "ZhipuaiApi_img" + ], + { + "title_aux": "ComfyUI_ChatGLM_API" + } + ], + "https://github.com/smthemex/ComfyUI_CustomNet": [ + [ + "CustomNet_Plus" + ], + { + "title_aux": "ComfyUI_CustomNet" + } + ], + "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": [ + [ + "HI_Diffusers_Model_Loader", + "Hi_Sampler" + ], + { + "title_aux": "ComfyUI_HiDiffusion_Pro" + } + ], + "https://github.com/smthemex/ComfyUI_ID_Animator": [ + [ + "ID_Animator", + "ID_Repo_Choice" + ], + { + "title_aux": "ComfyUI_ID_Animator" + } + ], + "https://github.com/smthemex/ComfyUI_Llama3_8B": [ + [ + "ChatQA_1p5_8b", + "Local_Or_Repo_Choice", + "Meta_Llama3_8B", + "MiniCPM_Llama3_V25" + ], + { + "title_aux": "ComfyUI_Llama3_8B" + } + ], + "https://github.com/smthemex/ComfyUI_MS_Diffusion": [ + [ + "MS_Comic_Type", + "MSdiffusion_Model_Loader", + "MSdiffusion_Sampler" + ], + { + "title_aux": "ComfyUI_MS_Diffusion" + } + ], + "https://github.com/smthemex/ComfyUI_ParlerTTS": [ + [ + "PromptToAudio" + ], + { + "title_aux": "ComfyUI_ParlerTTS" + } + ], + "https://github.com/smthemex/ComfyUI_Pic2Story": [ + [ + "Pic2Story" + ], + { + "title_aux": "ComfyUI_Pic2Story" + } + ], + "https://github.com/smthemex/ComfyUI_Pipeline_Tool": [ + [ + "Pipeline_Tool" + ], + { + "title_aux": "ComfyUI_Pipeline_Tool" + } + ], + "https://github.com/smthemex/ComfyUI_Pops": [ + [ + "Imgae_To_Path", + "Pops_Prior_Embedding", + "Pops_Repo_Choice", + "Pops_Sampler" + ], + { + "title_aux": "ComfyUI_Pops" + } + ], + "https://github.com/smthemex/ComfyUI_StableAudio_Open": [ + [ + "StableAudio_Open", + "Use_LocalModel_Or_Repo" + ], + { + "title_aux": "ComfyUI_StableAudio_Open" + } + ], + "https://github.com/smthemex/ComfyUI_StoryDiffusion": [ + [ + "Comic_Type", + "Pre_Translate_prompt", + "Storydiffusion_Model_Loader", + "Storydiffusion_Sampler" + ], + { + "title_aux": "ComfyUI_StoryDiffusion" + } + ], + "https://github.com/smthemex/ComfyUI_Streamv2v_Plus": [ + [ + "Load_Stream", + "Text2IMG", + "Video2Video", + "WebCam2Video" + ], + { + "title_aux": "ComfyUI_Streamv2v_Plus" + } + ], + "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": [ + [ + "DiscoDiffusion_DiscoDiffusion", + "DiscoDiffusion_DiscoDiffusionExtraSettings", + "DiscoDiffusion_GuidedDiffusionLoader", + "DiscoDiffusion_OpenAICLIPLoader" + ], + { + "title_aux": "Disco Diffusion" + } + ], + "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": [ + [ + "Nui.OpenPoseEditor" + ], + { + "title_aux": "OpenPose Editor" + } + ], + "https://github.com/space-nuko/nui-suite": [ + [ + "Nui.DynamicPromptsTextGen", + "Nui.FeelingLuckyTextGen", + "Nui.OutputString" + ], + { + "title_aux": "nui suite" + } + ], + "https://github.com/spacepxl/ComfyUI-Florence-2": [ + [ + "Florence2", + "Florence2Postprocess", + "Florence2PostprocessAll", + "LoadFlorence2Model" + ], + { + "title_aux": "ComfyUI-Florence-2" + } + ], + "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": [ + [ + "LoadEXR", + "LoadEXRFrames", + "LoadLatentEXR", + "SaveEXR", + "SaveEXRFrames", + "SaveLatentEXR", + "SaveTiff" + ], + { + "title_aux": "ComfyUI-HQ-Image-Save" + } + ], + "https://github.com/spacepxl/ComfyUI-Image-Filters": [ + [ + "AdainFilterLatent", + "AdainImage", + "AdainLatent", + "AlphaClean", + "AlphaMatte", + "BatchAlign", + "BatchAverageImage", + "BatchAverageUnJittered", + "BatchNormalizeImage", + "BatchNormalizeLatent", + "BetterFilmGrain", + "BilateralFilterImage", + "BlurImageFast", + "BlurMaskFast", + "ClampOutliers", + "ColorMatchImage", + "ConvertNormals", + "DifferenceChecker", + "DilateErodeMask", + "EnhanceDetail", + "ExposureAdjust", + "FrequencyCombine", + "FrequencySeparate", + "GameOfLife", + "GuidedFilterAlpha", + "GuidedFilterImage", + "ImageConstant", + "ImageConstantHSV", + "InstructPixToPixConditioningAdvanced", + "JitterImage", + "Keyer", + "LatentNormalizeShuffle", + "LatentStats", + "MedianFilterImage", + "NormalMapSimple", + "OffsetLatentImage", + "PrintSigmas", + "RelightSimple", + "RemapRange", + "RestoreDetail", + "SharpenFilterLatent", + "ShuffleChannels", + "Tonemap", + "UnJitterImage", + "UnTonemap", + "VisualizeLatents" + ], + { + "title_aux": "ComfyUI-Image-Filters" + } + ], + "https://github.com/spacepxl/ComfyUI-RAVE": [ + [ + "ConditioningDebug", + "ImageGridCompose", + "ImageGridDecompose", + "KSamplerRAVE", + "LatentGridCompose", + "LatentGridDecompose" + ], + { + "title_aux": "ComfyUI-RAVE" + } + ], + "https://github.com/spacepxl/ComfyUI-StyleGan": [ + [ + "BatchAverageStyleGANLatents", + "BlendStyleGANLatents", + "GenerateStyleGANLatent", + "LoadStyleGAN", + "StyleGANInversion", + "StyleGANLatentFromBatch", + "StyleGANSampler" + ], + { + "title_aux": "ComfyUI-StyleGan" + } + ], + "https://github.com/spinagon/ComfyUI-seam-carving": [ + [ + "SeamCarving" + ], + { + "title_aux": "ComfyUI-seam-carving" + } + ], + "https://github.com/spinagon/ComfyUI-seamless-tiling": [ + [ + "CircularVAEDecode", + "MakeCircularVAE", + "OffsetImage", + "SeamlessTile" + ], + { + "title_aux": "Seamless tiling Node for ComfyUI" + } + ], + "https://github.com/spro/comfyui-mirror": [ + [ + "LatentMirror" + ], + { + "title_aux": "Latent Mirror node for ComfyUI" + } + ], + "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": [ + [ + "UltimateSDUpscale", + "UltimateSDUpscaleCustomSample", + "UltimateSDUpscaleNoUpscale" + ], + { + "title_aux": "UltimateSDUpscale" + } + ], + "https://github.com/ssitu/ComfyUI_fabric": [ + [ + "FABRICPatchModel", + "FABRICPatchModelAdv", + "KSamplerAdvFABRICAdv", + "KSamplerFABRIC", + "KSamplerFABRICAdv" + ], + { + "title_aux": "ComfyUI fabric" + } + ], + "https://github.com/ssitu/ComfyUI_restart_sampling": [ + [ + "KRestartSampler", + "KRestartSamplerAdv", + "KRestartSamplerCustom", + "KRestartSamplerSimple", + "RestartSampler", + "RestartScheduler" + ], + { + "title_aux": "Restart Sampling" + } + ], + "https://github.com/ssitu/ComfyUI_roop": [ + [ + "RoopImproved", + "roop" + ], + { + "title_aux": "ComfyUI roop" + } + ], + "https://github.com/stavsap/comfyui-ollama": [ + [ + "OllamaGenerate", + "OllamaGenerateAdvance", + "OllamaVision" + ], + { + "title_aux": "ComfyUI Ollama" + } + ], + "https://github.com/storyicon/comfyui_musev_evolved": [ + [ + "AnimationZoom (comfyui_musev_evolved)", + "ImageSelector (comfyui_musev_evolved)", + "MuseVImg2Vid V1 (comfyui_musev_evolved)", + "MuseVPredictor V1 (comfyui_musev_evolved)" + ], + { + "author": "infguo", + "title_aux": "ComfyUI MuseV Evolved" + } + ], + "https://github.com/storyicon/comfyui_segment_anything": [ + [ + "GroundingDinoModelLoader (segment anything)", + "GroundingDinoSAMSegment (segment anything)", + "InvertMask (segment anything)", + "IsMaskEmpty", + "SAMModelLoader (segment anything)" + ], + { + "title_aux": "segment anything" + } + ], + "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score": [ + [ + "AesthetlcScoreSorter", + "CalculateAestheticScore", + "LoadAesteticModel", + "ScoreToNumber" + ], + { + "title_aux": "ComfyUI_Strimmlarns_aesthetic_score" + } + ], + "https://github.com/styler00dollar/ComfyUI-deepcache": [ + [ + "DeepCache" + ], + { + "title_aux": "ComfyUI-deepcache" + } + ], + "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": [ + [ + "SudoLatentUpscale" + ], + { + "title_aux": "ComfyUI-sudo-latent-upscale" + } + ], + "https://github.com/sugarkwork/comfyui_cohere": [ + [ + "SimpleCohereNode" + ], + { + "title_aux": "comfyui_cohere" + } + ], + "https://github.com/sugarkwork/comfyui_tag_fillter": [ + [ + "TagFilter", + "TagMerger", + "TagRemover", + "TagReplace", + "TagSwitcher" + ], + { + "title_aux": "comfyui_tag_filter" + } + ], + "https://github.com/superyoman/comfyui_lumaAPI": [ + [ + "LUMA_API_YoC", + "LUMA_API_result_YoC" + ], + { + "title_aux": "comfyui_lumaAPI" + } + ], + "https://github.com/syllebra/bilbox-comfyui": [ + [ + "BilboXLut", + "BilboXPhotoPrompt", + "BilboXVignette" + ], + { + "title_aux": "BilboX's ComfyUI Custom Nodes" + } + ], + "https://github.com/sylym/comfy_vid2vid": [ + [ + "CheckpointLoaderSimpleSequence", + "DdimInversionSequence", + "KSamplerSequence", + "LoadImageMaskSequence", + "LoadImageSequence", + "LoraLoaderSequence", + "SetLatentNoiseSequence", + "TrainUnetSequence", + "VAEEncodeForInpaintSequence" + ], + { + "title_aux": "Vid2vid" + } + ], + "https://github.com/szhublox/ambw_comfyui": [ + [ + "Auto Merge Block Weighted", + "CLIPMergeSimple", + "CheckpointSave", + "ModelMergeBlocks", + "ModelMergeSimple" + ], + { + "title_aux": "Auto-MBW" + } + ], + "https://github.com/taabata/Comfy_Syrian_Falcon_Nodes/raw/main/SyrianFalconNodes.py": [ + [ + "CompositeImage", + "KSamplerAlternate", + "KSamplerPromptEdit", + "KSamplerPromptEditAndAlternate", + "LoopBack", + "QRGenerate", + "WordAsImage" + ], + { + "title_aux": "Syrian Falcon Nodes" + } + ], + "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": [ + [ + "ComfyNodesToSaveCanvas", + "FloatNumber", + "FreeU_LCM", + "ImageDims", + "ImageOutputToComfyNodes", + "ImageResize", + "ImageShuffle", + "ImageSwitch", + "LCMGenerate", + "LCMGenerate_ReferenceOnly", + "LCMGenerate_SDTurbo", + "LCMGenerate_img2img", + "LCMGenerate_img2img_IPAdapter", + "LCMGenerate_img2img_controlnet", + "LCMGenerate_inpaintv2", + "LCMGenerate_inpaintv3", + "LCMLoader", + "LCMLoader_RefInpaint", + "LCMLoader_ReferenceOnly", + "LCMLoader_SDTurbo", + "LCMLoader_controlnet", + "LCMLoader_controlnet_inpaint", + "LCMLoader_img2img", + "LCMLoraLoader_inpaint", + "LCMLoraLoader_ipadapter", + "LCMLora_inpaint", + "LCMLora_inpaintV2", + "LCMLora_ipadapter", + "LCMT2IAdapter", + "LCM_IPAdapter", + "LCM_IPAdapter_inpaint", + "LCM_outpaint_prep", + "LoadImageNode_LCM", + "Loader_SegmindVega", + "OutpaintCanvasTool", + "SaveImage_Canvas", + "SaveImage_LCM", + "SaveImage_Puzzle", + "SaveImage_PuzzleV2", + "SegmindVega", + "SettingsSwitch", + "stitch" + ], + { + "title_aux": "LCM_Inpaint-Outpaint_Comfy" + } + ], + "https://github.com/talesofai/comfyui-browser": [ + [ + "DifyTextGenerator //Browser", + "LoadImageByUrl //Browser", + "SelectInputs //Browser", + "UploadToRemote //Browser", + "XyzPlot //Browser" + ], + { + "title_aux": "ComfyUI Browser" + } + ], + "https://github.com/teward/ComfyUI-Helper-Nodes": [ + [ + "HelperNodes_CfgScale", + "HelperNodes_CheckpointSelector", + "HelperNodes_MultilineStringLiteral", + "HelperNodes_Prompt", + "HelperNodes_SDXLCommonResolutions", + "HelperNodes_SamplerSelector", + "HelperNodes_SaveImage", + "HelperNodes_SchedulerSelector", + "HelperNodes_SeedSelector", + "HelperNodes_Steps", + "HelperNodes_StringLiteral", + "HelperNodes_VAESelector", + "HelperNodes_WidthHeight" + ], + { + "title_aux": "ComfyUI-Helper-Nodes" + } + ], + "https://github.com/theUpsider/ComfyUI-Logic": [ + [ + "Bool-\ud83d\udd2c", + "Compare-\ud83d\udd2c", + "DebugPrint-\ud83d\udd2c", + "Float-\ud83d\udd2c", + "If ANY return A else B-\ud83d\udd2c", + "Int-\ud83d\udd2c", + "String-\ud83d\udd2c" + ], + { + "title_aux": "ComfyUI-Logic" + } + ], + "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": [ + [ + "Load Styles CSV" + ], + { + "title_aux": "Styles CSV Loader Extension for ComfyUI" + } + ], + "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": [ + [ + "MagicAnimate", + "MagicAnimateModelLoader" + ], + { + "title_aux": "ComfyUI-MagicAnimate" + } + ], + "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": [ + [ + "SVDDecoder", + "SVDModelLoader", + "SVDSampler", + "SVDSimpleImg2Vid" + ], + { + "title_aux": "ComfyUI Stable Video Diffusion" + } + ], + "https://github.com/tiankuan93/ComfyUI-V-Express": [ + [ + "Load_Audio_Path", + "Load_Audio_Path_From_Video", + "Load_Image_Path", + "Load_Kps_Path", + "Load_Kps_Path_From_Video", + "Load_Video_Path", + "VEINTConstant", + "VEPreview_Video", + "VEStringConstant", + "V_Express_Loader", + "V_Express_Sampler" + ], + { + "title_aux": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation" + } + ], + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": [ + [ + "ProjectorzControlnetInput", + "ProjectorzControlnetParameter", + "ProjectorzInitInput", + "ProjectorzOutput", + "ProjectorzParameter", + "ProjectorzStringToFloat", + "ProjectorzStringToInt" + ], + { + "title_aux": "Stable Projectorz Bridge" + } + ], + "https://github.com/time-river/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py": [ + [ + "CLIPSeg", + "CombineSegMasks" + ], + { + "title_aux": "CLIPSeg" + } + ], + "https://github.com/tmagara/ComfyUI-Prediction-Boost": [ + [ + "PredictionBoost" + ], + { + "title_aux": "ComfyUI-Prediction-Boost" + } + ], + "https://github.com/tocubed/ComfyUI-AudioReactor": [ + [ + "AudioFrameTransformBeats", + "AudioFrameTransformShadertoy", + "AudioLoadPath", + "Shadertoy" + ], + { + "title_aux": "ComfyUI-AudioReactor" + } + ], + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": [ + [ + "ToolYoloCropper" + ], + { + "title_aux": "Easy automatic (square) image cropper using Yolo" + } + ], + "https://github.com/toxicwind/ComfyUI-TTools": [ + [ + "TTools Extract JSON", + "TTools SD3 Resolution Solver" + ], + { + "title_aux": "TTools for ComfyUI" + } + ], + "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": [ + [ + "CaptureWebcam", + "ImageResize_Padding", + "LatentDelay", + "LoadWebcamImage", + "SaveImagetoPath" + ], + { + "title_aux": "ComfyUI_toyxyz_test_nodes" + } + ], + "https://github.com/traugdor/ComfyUI-quadMoons-nodes": [ + [ + "quadmoonCLIPTextEncode", + "quadmoonChangeBackground", + "quadmoonConvertBoolToString", + "quadmoonConvertFloatToString", + "quadmoonConvertIntToString", + "quadmoonConvertNormalizeHW", + "quadmoonConvertNumberToString", + "quadmoonINTConditionalOperation", + "quadmoonKSampler", + "quadmoonKSamplerAdvanced", + "quadmoonLoadConfigs", + "quadmoonModelLoader", + "quadmoonSaveNeg", + "quadmoonSavePrompt", + "quadmoonSmartNeg", + "quadmoonSmartPrompt", + "quadmoonThebutton" + ], + { + "author": "quadmoon (https://github.com/traugdor)", + "description": "These are just some nodes I wanted and couldn't find where anyone else had made them yet.", + "nickname": "quadmoon's Nodes", + "title": "quadmoon's ComfyUI nodes", + "title_aux": "quadmoon's ComfyUI nodes" + } + ], + "https://github.com/tritant/ComfyUI_CreaPrompt": [ + [ + "CreaPrompt", + "CreaPrompt List" + ], + { + "title_aux": "ComfyUI-CreaPrompt" + } + ], + "https://github.com/trojblue/trNodes": [ + [ + "trColorCorrection", + "trLayering", + "trRouter", + "trRouterLonger" + ], + { + "title_aux": "trNodes" + } + ], + "https://github.com/trumanwong/ComfyUI-NSFW-Detection": [ + [ + "NSFWDetection" + ], + { + "title_aux": "ComfyUI-NSFW-Detection" + } + ], + "https://github.com/tsogzark/ComfyUI-load-image-from-url": [ + [ + "LoadImageFromUrlOrPath" + ], + { + "title_aux": "ComfyUI-load-image-from-url" + } + ], + "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": [ + [ + "Batch Unsampler", + "Iterative Mixing KSampler", + "Iterative Mixing KSampler Advanced", + "IterativeMixingSampler", + "IterativeMixingScheduler", + "IterativeMixingSchedulerAdvanced", + "Latent Batch Comparison Plot", + "Latent Batch Statistics Plot", + "MixingMaskGenerator" + ], + { + "title_aux": "ComfyUI Iterative Mixing Nodes" + } + ], + "https://github.com/ttulttul/ComfyUI-Tensor-Operations": [ + [ + "Fast Image to Noise", + "Image Match Normalize", + "Latent Match Normalize" + ], + { + "title_aux": "ComfyUI-Tensor-Operations" + } + ], + "https://github.com/tudal/Hakkun-ComfyUI-nodes/raw/main/hakkun_nodes.py": [ + [ + "Any Converter", + "Calculate Upscale", + "Image Resize To Height", + "Image Resize To Width", + "Image size to string", + "Load Random Image", + "Load Text", + "Multi Text Merge", + "Prompt Parser", + "Random Line", + "Random Line 4" + ], + { + "title_aux": "Hakkun-ComfyUI-nodes" + } + ], + "https://github.com/tusharbhutt/Endless-Nodes": [ + [ + "ESS Aesthetic Scoring", + "ESS Combo Parameterizer", + "ESS Combo Parameterizer & Prompts", + "ESS Eight Input Text Switch", + "ESS Float to Integer", + "ESS Float to Number", + "ESS Float to String", + "ESS Float to X", + "ESS Image Reward", + "ESS Image Saver with JSON", + "ESS Integer to Float", + "ESS Integer to Number", + "ESS Integer to String", + "ESS Integer to X", + "ESS Number to Float", + "ESS Number to Integer", + "ESS Number to String", + "ESS Number to X", + "ESS Parameterizer", + "ESS Parameterizer & Prompts", + "ESS Six Float Output", + "ESS Six Input Text Switch", + "ESS Six Integer IO Switch", + "ESS Six Integer IO Widget", + "ESS String to Float", + "ESS String to Integer", + "ESS String to Num", + "ESS String to X", + "\u267e\ufe0f\ud83c\udf0a\u2728 Image Saver with JSON" + ], + { + "author": "BiffMunky", + "description": "A small set of nodes I created for various numerical and text inputs. Features image saver with ability to have JSON saved to separate folder, parameter collection nodes, two aesthetic scoring models, switches for text and numbers, and conversion of string to numeric and vice versa.", + "nickname": "\u267e\ufe0f\ud83c\udf0a\u2728", + "title": "Endless \ufe0f\ud83c\udf0a\u2728 Nodes", + "title_aux": "Endless \ufe0f\ud83c\udf0a\u2728 Nodes" + } + ], + "https://github.com/twri/sdxl_prompt_styler": [ + [ + "SDXLPromptStyler", + "SDXLPromptStylerAdvanced" + ], + { + "title_aux": "SDXL Prompt Styler" + } + ], + "https://github.com/ty0x2333/ComfyUI-Dev-Utils": [ + [ + "TY_ExecutionTime", + "TY_UploadAnything", + "TY_UrlDownload" + ], + { + "title_aux": "ComfyUI-Dev-Utils" + } + ], + "https://github.com/uarefans/ComfyUI-Fans": [ + [ + "Fans Prompt Styler Negative", + "Fans Prompt Styler Positive", + "Fans Styler", + "Fans Text Concatenate" + ], + { + "title_aux": "ComfyUI-Fans" + } + ], + "https://github.com/uetuluk/comfyui-webcam-node": [ + [ + "webcam_capture_node" + ], + { + "title_aux": "comfyui-webcam-node" + } + ], + "https://github.com/unwdef/unwdef-nodes-comfyui": [ + [ + "RandomTextFromMultiline", + "RandomizeLoras", + "RandomizeLorasStack", + "TextMultilineWithVariables" + ], + { + "title_aux": "unwdef-nodes" + } + ], + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [ + [ + "VC_Load_Video_Path_Unified_Output", + "VC_Load_Video_Upload_Unified_Output", + "VC_Video_Combine_Unified_Output", + "Waveform2Audio", + "\ud83d\ude0bAPI Request Node", + "\ud83d\ude0bJSON Parser Node", + "\ud83d\ude0bOld Photo Colorization Node", + "\ud83d\ude0bOllama Request Node", + "\ud83d\ude0bSave Image Unified Output" + ], + { + "title_aux": "ZMG PLUGIN" + } + ], + "https://github.com/vanillacode314/SimpleWildcardsComfyUI": [ + [ + "SimpleConcat", + "SimpleWildcard" + ], + { + "author": "VanillaCode314", + "description": "A simple wildcard node for ComfyUI. Can also be used a style prompt node.", + "nickname": "Simple Wildcard", + "title": "Simple Wildcard", + "title_aux": "Simple Wildcard" + } + ], + "https://github.com/veighnsche/comfyui_gr85": [ + [ + "GR85_ContainsWord", + "GR85_ElementsConcatenator", + "GR85_ImageDimensionResizer", + "GR85_ImageSizer", + "GR85_InsertCharacter", + "GR85_LlmEnhancer", + "GR85_NextSeed", + "GR85_RandomAtmLocOutfit", + "GR85_RandomRatio", + "GR85_RandomTitleCharacter", + "GR85_RandomWildcardTagPicker", + "GR85_ShowText", + "GR85_StrSafe", + "GR85_TagInjector" + ], + { + "title_aux": "comfyui_gr85" + } + ], + "https://github.com/victorchall/comfyui_webcamcapture": [ + [ + "WebcamCapture" + ], + { + "title_aux": "Comfyui Webcam capture node" + } + ], + "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": [ + [ + "ChatGptPrompt" + ], + { + "title_aux": "ComfyUI-Chat-GPT-Integration" + } + ], + "https://github.com/violet-chen/comfyui-psd2png": [ + [ + "Psd2Png" + ], + { + "title_aux": "comfyui-psd2png" + } + ], + "https://github.com/viperyl/ComfyUI-BiRefNet": [ + [ + "BiRefNet" + ], + { + "title_aux": "ComfyUI-BiRefNet" + } + ], + "https://github.com/viperyl/ComfyUI-RGT": [ + [ + "RGT_Upscale" + ], + { + "title_aux": "ComfyUI-RGT" + } + ], + "https://github.com/vivax3794/ComfyUI-Sub-Nodes": [ + [ + "VIV_Default", + "VIV_Subgraph", + "VIV_Subgraph_Inputs", + "VIV_Subgraph_Outputs" + ], + { + "title_aux": "ComfyUI-Sub-Nodes" + } + ], + "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": [ + [ + "Any String", + "Chunk Up", + "Get Chunk", + "Inspect", + "Join Chunks", + "Model From URL" + ], + { + "title_aux": "ComfyUI-Vivax-Nodes" + } + ], + "https://github.com/vsevolod-oparin/comfyui-kandinsky22": [ + [ + "comfy-kandinsky22-decoder-loader", + "comfy-kandinsky22-hint-combiner", + "comfy-kandinsky22-image-encoder", + "comfy-kandinsky22-img-latents", + "comfy-kandinsky22-latents", + "comfy-kandinsky22-movq-decoder", + "comfy-kandinsky22-positive-text-encoder", + "comfy-kandinsky22-prior-averaging-2", + "comfy-kandinsky22-prior-averaging-3", + "comfy-kandinsky22-prior-averaging-4", + "comfy-kandinsky22-prior-loader", + "comfy-kandinsky22-text-encoder", + "comfy-kandinsky22-unet-decoder" + ], + { + "title_aux": "Kandinsky 2.2 ComfyUI Plugin" + } + ], + "https://github.com/vxinhao/color2rgb/raw/main/color2rgb.py": [ + [ + "color2RGB" + ], + { + "title_aux": "color2rgb" + } + ], + "https://github.com/wTechArtist/ComfyUI-CustomNodes": [ + [ + "Image Blending Mode Mask" + ], + { + "title_aux": "ComfyUI-CustomNodes" + } + ], + "https://github.com/wallish77/wlsh_nodes": [ + [ + "Alternating KSampler (WLSH)", + "Build Filename String (WLSH)", + "CLIP +/- w/Text Unified (WLSH)", + "CLIP Positive-Negative (WLSH)", + "CLIP Positive-Negative XL (WLSH)", + "CLIP Positive-Negative XL w/Text (WLSH)", + "CLIP Positive-Negative w/Text (WLSH)", + "Checkpoint Loader w/Name (WLSH)", + "Empty Latent by Pixels (WLSH)", + "Empty Latent by Ratio (WLSH)", + "Empty Latent by Size (WLSH)", + "Generate Border Mask (WLSH)", + "Grayscale Image (WLSH)", + "Image Load with Metadata (WLSH)", + "Image Save with Prompt (WLSH)", + "Image Save with Prompt File (WLSH)", + "Image Save with Prompt/Info (WLSH)", + "Image Save with Prompt/Info File (WLSH)", + "Image Scale By Factor (WLSH)", + "Image Scale by Shortside (WLSH)", + "KSamplerAdvanced (WLSH)", + "Multiply Integer (WLSH)", + "Outpaint to Image (WLSH)", + "Prompt Weight (WLSH)", + "Quick Resolution Multiply (WLSH)", + "Resolutions by Ratio (WLSH)", + "SDXL Quick Empty Latent (WLSH)", + "SDXL Quick Image Scale (WLSH)", + "SDXL Resolutions (WLSH)", + "SDXL Steps (WLSH)", + "Save Positive Prompt(WLSH)", + "Save Prompt (WLSH)", + "Save Prompt/Info (WLSH)", + "Seed and Int (WLSH)", + "Seed to Number (WLSH)", + "Simple Pattern Replace (WLSH)", + "Simple String Combine (WLSH)", + "Time String (WLSH)", + "Upscale by Factor with Model (WLSH)", + "VAE Encode for Inpaint w/Padding (WLSH)" + ], + { + "title_aux": "wlsh_nodes" + } + ], + "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": [ + [ + "InvisibleWatermarkEncode" + ], + { + "title_aux": "ComfyUI Invisible Watermark" + } + ], + "https://github.com/whatbirdisthat/cyberdolphin": [ + [ + "\ud83d\udc2c Gradio ChatInterface", + "\ud83d\udc2c OpenAI Advanced", + "\ud83d\udc2c OpenAI Compatible", + "\ud83d\udc2c OpenAI DALL\u00b7E", + "\ud83d\udc2c OpenAI Simple" + ], + { + "title_aux": "cyberdolphin" + } + ], + "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": [ + [ + "CDL.OpenPoseEditorPlus" + ], + { + "title_aux": "ComfyUI-Openpose-Editor-Plus" + } + ], + "https://github.com/wmatson/easy-comfy-nodes": [ + [ + "EZAssocDictNode", + "EZAssocImgNode", + "EZAssocStrNode", + "EZEmptyDictNode", + "EZHttpPostNode", + "EZLoadImgBatchFromUrlsNode", + "EZLoadImgFromUrlNode", + "EZRemoveImgBackground", + "EZS3Uploader" + ], + { + "title_aux": "easy-comfy-nodes" + } + ], + "https://github.com/wolfden/ComfyUi_PromptStylers": [ + [ + "SDXLPromptStylerAll", + "SDXLPromptStylerHorror", + "SDXLPromptStylerMisc", + "SDXLPromptStylerbyArtist", + "SDXLPromptStylerbyCamera", + "SDXLPromptStylerbyComposition", + "SDXLPromptStylerbyCyberpunkSurrealism", + "SDXLPromptStylerbyDepth", + "SDXLPromptStylerbyEnvironment", + "SDXLPromptStylerbyFantasySetting", + "SDXLPromptStylerbyFilter", + "SDXLPromptStylerbyFocus", + "SDXLPromptStylerbyImpressionism", + "SDXLPromptStylerbyLighting", + "SDXLPromptStylerbyMileHigh", + "SDXLPromptStylerbyMood", + "SDXLPromptStylerbyMythicalCreature", + "SDXLPromptStylerbyOriginal", + "SDXLPromptStylerbyQuantumRealism", + "SDXLPromptStylerbySteamPunkRealism", + "SDXLPromptStylerbySubject", + "SDXLPromptStylerbySurrealism", + "SDXLPromptStylerbyTheme", + "SDXLPromptStylerbyTimeofDay", + "SDXLPromptStylerbyWyvern", + "SDXLPromptbyCelticArt", + "SDXLPromptbyContemporaryNordicArt", + "SDXLPromptbyFashionArt", + "SDXLPromptbyGothicRevival", + "SDXLPromptbyIrishFolkArt", + "SDXLPromptbyRomanticNationalismArt", + "SDXLPromptbySportsArt", + "SDXLPromptbyStreetArt", + "SDXLPromptbyVikingArt", + "SDXLPromptbyWildlifeArt" + ], + { + "title_aux": "SDXL Prompt Styler (customized version by wolfden)" + } + ], + "https://github.com/wolfden/ComfyUi_String_Function_Tree": [ + [ + "StringFunction" + ], + { + "title_aux": "ComfyUi_String_Function_Tree" + } + ], + "https://github.com/wsippel/comfyui_ws/raw/main/sdxl_utility.py": [ + [ + "SDXLResolutionPresets" + ], + { + "title_aux": "SDXLResolutionPresets" + } + ], + "https://github.com/wujm424606/ComfyUi-Ollama-YN": [ + [ + "OllamaGenerate", + "OllamaGenerateAdvance", + "OllamaSpecialGenerateAdvance", + "OllamaVision" + ], + { + "title_aux": "ComfyUi-Ollama-YN" + } + ], + "https://github.com/wutipong/ComfyUI-TextUtils": [ + [ + "Text Utils - Join N-Elements of String List", + "Text Utils - Join String List", + "Text Utils - Join Strings", + "Text Utils - Split String to List" + ], + { + "title_aux": "ComfyUI-TextUtils" + } + ], + "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": [ + [ + "SimpleAspectRatio" + ], + { + "title_aux": "ComfyUI-Simple-Aspect-Ratio" + } + ], + "https://github.com/xXAdonesXx/NodeGPT": [ + [ + "AppendAgent", + "Assistant", + "Chat", + "ChatGPT", + "CombineInput", + "Conditioning", + "CostumeAgent_1", + "CostumeAgent_2", + "CostumeMaster_1", + "Critic", + "DisplayString", + "DisplayTextAsImage", + "EVAL", + "Engineer", + "Executor", + "GroupChat", + "Image_generation_Conditioning", + "LM_Studio", + "LoadAPIconfig", + "LoadTXT", + "MemGPT", + "Memory_Excel", + "Model_1", + "Ollama", + "Output2String", + "Planner", + "Scientist", + "TextCombine", + "TextGeneration", + "TextGenerator", + "TextInput", + "TextOutput", + "UserProxy", + "llama-cpp", + "llava", + "oobaboogaOpenAI" + ], + { + "title_aux": "NodeGPT" + } + ], + "https://github.com/xiaoxiaodesha/hd_node": [ + [ + "Combine HDMasks", + "Cover HDMasks", + "HD FaceIndex", + "HD GetMaskArea", + "HD Image Levels", + "HD SmoothEdge", + "HD UltimateSDUpscale" + ], + { + "title_aux": "hd-nodes-comfyui" + } + ], + "https://github.com/xliry/ComfyUI_SendDiscord": [ + [ + "SendDiscord" + ], + { + "title_aux": "ComfyUI_SendDiscord" + } + ], + "https://github.com/xuhongming251/ComfyUI-GPEN": [ + [ + "FaceEnhancement" + ], + { + "title_aux": "ComfyUI-GPEN" + } + ], + "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": [ + [ + "MuseTalkPostprocess", + "MuseTalkPreprocess", + "MuseTalkTrain", + "MuseTalkTrainPreprocess", + "MuseTalkUncropMask" + ], + { + "title_aux": "ComfyUI-MuseTalkUtils" + } + ], + "https://github.com/yffyhk/comfyui_auto_danbooru": [ + [ + "GetDanbooru", + "TagEncode" + ], + { + "title_aux": "comfyui_auto_danbooru" + } + ], + "https://github.com/yiwangsimple/ComfyUI_GroqChat": [ + [ + "GroqChatNode", + "PaliGemmaPixelProse" + ], + { + "title_aux": "comfy-groqchat" + } + ], + "https://github.com/yolain/ComfyUI-Easy-Use": [ + [ + "dynamicThresholdingFull", + "easy LLLiteLoader", + "easy XYInputs: CFG Scale", + "easy XYInputs: Checkpoint", + "easy XYInputs: ControlNet", + "easy XYInputs: Denoise", + "easy XYInputs: Lora", + "easy XYInputs: ModelMergeBlocks", + "easy XYInputs: NegativeCond", + "easy XYInputs: NegativeCondList", + "easy XYInputs: PositiveCond", + "easy XYInputs: PositiveCondList", + "easy XYInputs: PromptSR", + "easy XYInputs: Sampler/Scheduler", + "easy XYInputs: Seeds++ Batch", + "easy XYInputs: Steps", + "easy XYPlot", + "easy XYPlotAdvanced", + "easy a1111Loader", + "easy applyBrushNet", + "easy applyFooocusInpaint", + "easy applyInpaint", + "easy applyPowerPaint", + "easy boolean", + "easy cascadeKSampler", + "easy cascadeLoader", + "easy ckptNames", + "easy cleanGpuUsed", + "easy clearCacheAll", + "easy clearCacheKey", + "easy comfyLoader", + "easy compare", + "easy controlnetLoader", + "easy controlnetLoaderADV", + "easy controlnetNames", + "easy controlnetStack", + "easy convertAnything", + "easy detailerFix", + "easy dynamiCrafterLoader", + "easy float", + "easy fullCascadeKSampler", + "easy fullLoader", + "easy fullkSampler", + "easy globalSeed", + "easy hiresFix", + "easy humanSegmentation", + "easy hunyuanDiTLoader", + "easy icLightApply", + "easy if", + "easy imageBatchToImageList", + "easy imageChooser", + "easy imageColorMatch", + "easy imageConcat", + "easy imageCount", + "easy imageCropFromMask", + "easy imageDetailTransfer", + "easy imageInsetCrop", + "easy imageInterrogator", + "easy imageListToImageBatch", + "easy imagePixelPerfect", + "easy imageRatio", + "easy imageRemBg", + "easy imageSave", + "easy imageScaleDown", + "easy imageScaleDownBy", + "easy imageScaleDownToSize", + "easy imageSize", + "easy imageSizeByLongerSide", + "easy imageSizeBySide", + "easy imageSplitGrid", + "easy imageSplitList", + "easy imageSwitch", + "easy imageToBase64", + "easy imageToMask", + "easy imageUncropFromBBOX", + "easy imagesSplitImage", + "easy injectNoiseToLatent", + "easy instantIDApply", + "easy instantIDApplyADV", + "easy int", + "easy ipadapterApply", + "easy ipadapterApplyADV", + "easy ipadapterApplyEmbeds", + "easy ipadapterApplyEncoder", + "easy ipadapterApplyFromParams", + "easy ipadapterApplyRegional", + "easy ipadapterStyleComposition", + "easy isSDXL", + "easy joinImageBatch", + "easy kSampler", + "easy kSamplerDownscaleUnet", + "easy kSamplerInpainting", + "easy kSamplerLayerDiffusion", + "easy kSamplerSDTurbo", + "easy kSamplerTiled", + "easy latentCompositeMaskedWithCond", + "easy latentNoisy", + "easy loadImageBase64", + "easy loraStack", + "easy negative", + "easy pipeBatchIndex", + "easy pipeEdit", + "easy pipeIn", + "easy pipeOut", + "easy pipeToBasicPipe", + "easy pixArtLoader", + "easy portraitMaster", + "easy poseEditor", + "easy positive", + "easy preDetailerFix", + "easy preMaskDetailerFix", + "easy preSampling", + "easy preSamplingAdvanced", + "easy preSamplingCascade", + "easy preSamplingCustom", + "easy preSamplingDynamicCFG", + "easy preSamplingLayerDiffusion", + "easy preSamplingLayerDiffusionADDTL", + "easy preSamplingNoiseIn", + "easy preSamplingSdTurbo", + "easy prompt", + "easy promptConcat", + "easy promptLine", + "easy promptList", + "easy promptReplace", + "easy pulIDApply", + "easy pulIDApplyADV", + "easy rangeFloat", + "easy rangeInt", + "easy removeLocalImage", + "easy samLoaderPipe", + "easy seed", + "easy showAnything", + "easy showLoaderSettingsNames", + "easy showSpentTime", + "easy showTensorShape", + "easy sliderControl", + "easy stableDiffusion3API", + "easy string", + "easy styleAlignedBatchAlign", + "easy stylesSelector", + "easy sv3dLoader", + "easy svdLoader", + "easy textSwitch", + "easy ultralyticsDetectorPipe", + "easy unSampler", + "easy wildcards", + "easy xyAny", + "easy zero123Loader" + ], + { + "title_aux": "ComfyUI Easy Use" + } + ], + "https://github.com/yolanother/DTAIComfyImageSubmit": [ + [ + "DTSimpleSubmitImage", + "DTSubmitImage" + ], + { + "title_aux": "Comfy AI DoubTech.ai Image Sumission Node" + } + ], + "https://github.com/yolanother/DTAIComfyLoaders": [ + [ + "DTCLIPLoader", + "DTCLIPVisionLoader", + "DTCheckpointLoader", + "DTCheckpointLoaderSimple", + "DTControlNetLoader", + "DTDiffControlNetLoader", + "DTDiffusersLoader", + "DTGLIGENLoader", + "DTLoadImage", + "DTLoadImageMask", + "DTLoadLatent", + "DTLoraLoader", + "DTLorasLoader", + "DTStyleModelLoader", + "DTUpscaleModelLoader", + "DTVAELoader", + "DTunCLIPCheckpointLoader" + ], + { + "title_aux": "Comfy UI Online Loaders" + } + ], + "https://github.com/yolanother/DTAIComfyPromptAgent": [ + [ + "DTPromptAgent", + "DTPromptAgentString" + ], + { + "title_aux": "Comfy UI Prompt Agent" + } + ], + "https://github.com/yolanother/DTAIComfyQRCodes": [ + [ + "QRCode" + ], + { + "title_aux": "Comfy UI QR Codes" + } + ], + "https://github.com/yolanother/DTAIComfyVariables": [ + [ + "DTCLIPTextEncode", + "DTSingleLineStringVariable", + "DTSingleLineStringVariableNoClip", + "FloatVariable", + "IntVariable", + "StringFormat", + "StringFormatSingleLine", + "StringVariable" + ], + { + "title_aux": "Variables for Comfy UI" + } + ], + "https://github.com/yolanother/DTAIImageToTextNode": [ + [ + "DTAIImageToTextNode", + "DTAIImageUrlToTextNode" + ], + { + "title_aux": "Image to Text Node" + } + ], + "https://github.com/youyegit/tdxh_node_comfyui": [ + [ + "TdxhBoolNumber", + "TdxhClipVison", + "TdxhControlNetApply", + "TdxhControlNetProcessor", + "TdxhFloatInput", + "TdxhImageToSize", + "TdxhImageToSizeAdvanced", + "TdxhImg2ImgLatent", + "TdxhIntInput", + "TdxhLoraLoader", + "TdxhOnOrOff", + "TdxhReference", + "TdxhStringInput", + "TdxhStringInputTranslator" + ], + { + "title_aux": "tdxh_node_comfyui" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": [ + [ + "DepthAnythingTensorrt" + ], + { + "title_aux": "ComfyUI Depth Anything TensorRT" + } + ], + "https://github.com/yuvraj108c/ComfyUI-PiperTTS": [ + [ + "PiperTTS" + ], + { + "title_aux": "ComfyUI PiperTTS" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Pronodes": [ + [ + "LoadImageFromOutputDirectoryNode", + "LoadYoutubeVideoNode", + "PreviewVHSAudioNode", + "SaveAndOverwriteImageNode", + "VHSFilenamesToPathNode" + ], + { + "title_aux": "ComfyUI-Pronodes" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": [ + [ + "UpscalerTensorrt" + ], + { + "title_aux": "ComfyUI Upscaler TensorRT" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Vsgan": [ + [ + "DepthAnythingTrtNode", + "TTSCapcutNode", + "UpscaleVideoTrtNode" + ], + { + "title_aux": "ComfyUI-Vsgan" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Whisper": [ + [ + "Add Subtitles To Background", + "Add Subtitles To Frames", + "Apply Whisper", + "Resize Cropped Subtitles" + ], + { + "title_aux": "ComfyUI Whisper" + } + ], + "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt": [ + [ + "YoloNasPoseTensorrt" + ], + { + "title_aux": "ComfyUI YoloNasPose Tensorrt" + } + ], + "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes": [ + [ + "ZwngLoadImagePathOrURL", + "ZwngPreviewImageAndMask", + "ZwngSimpleGoogleTranslater", + "ZwngSimplePhotoshopConnector" + ], + { + "title_aux": "ComfyUI_Zwng_Nodes" + } + ], + "https://github.com/zcfrank1st/Comfyui-Toolbox": [ + [ + "PreviewJson", + "PreviewVideo", + "SaveJson", + "TestJsonPreview" + ], + { + "title_aux": "Comfyui-Toolbox" + } + ], + "https://github.com/zcfrank1st/Comfyui-Yolov8": [ + [ + "Yolov8Detection", + "Yolov8Segmentation" + ], + { + "title_aux": "ComfyUI Yolov8" + } + ], + "https://github.com/zcfrank1st/comfyui_visual_anagrams": [ + [ + "VisualAnagramsAnimate", + "VisualAnagramsSample" + ], + { + "title_aux": "comfyui_visual_anagram" + } + ], + "https://github.com/zer0TF/cute-comfy": [ + [ + "Cute.Placeholder" + ], + { + "title_aux": "Cute Comfy" + } + ], + "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer": [ + [ + "FastStyleTransfer", + "TrainFastStyleTransfer" + ], + { + "title_aux": "ComfyUI-Fast-Style-Transfer" + } + ], + "https://github.com/zfkun/ComfyUI_zfkun": [ + [ + "ZFLoadImagePath", + "ZFPreviewText", + "ZFPreviewTextMultiline", + "ZFShareScreen", + "ZFTextTranslation" + ], + { + "title_aux": "ComfyUI_zfkun" + } + ], + "https://github.com/zhangp365/ComfyUI-utils-nodes": [ + [ + "CheckpointLoaderSimpleWithSwitch", + "ColorCorrectOfUtils", + "ConcatTextOfUtils", + "ImageBatchOneOrMore", + "ImageCompositeMaskedWithSwitch", + "ImageConcanateOfUtils", + "IntAndIntAddOffsetLiteral", + "IntMultipleAddLiteral", + "LoadImageMaskWithSwitch", + "LoadImageMaskWithoutListDir", + "LoadImageWithSwitch", + "LoadImageWithoutListDir", + "MaskAutoSelector", + "MaskFastGrow", + "ModifyTextGender", + "SplitMask" + ], + { + "title_aux": "zhangp365/Some Utils for ComfyUI" + } + ], + "https://github.com/zhongpei/ComfyUI-InstructIR": [ + [ + "InstructIRProcess", + "LoadInstructIRModel" + ], + { + "title_aux": "ComfyUI for InstructIR" + } + ], + "https://github.com/zhongpei/Comfyui_image2prompt": [ + [ + "CLIP AdvancedTextEncode|fofo", + "CLIP PromptConditioning|fofo", + "Image2Text", + "Image2TextWithTags", + "ImageBatchToList|fofo", + "ImageRewardScore|fofo", + "LoadImage2TextModel", + "LoadImageRewardScoreModel|fofo", + "LoadT5Model|fofo", + "LoadText2PromptModel", + "ShowText|fofo", + "T5QuantizationConfig|fofo", + "T5Text2Prompt|fofo", + "Text2GPTPrompt", + "Text2Prompt", + "TextBox|fofo", + "Translate2Chinese|fofo" + ], + { + "title_aux": "Comfyui_image2prompt" + } + ], + "https://github.com/zhuanqianfish/ComfyUI-EasyNode": [ + [ + "EasyCaptureNode", + "EasyVideoOutputNode", + "SendImageWebSocket" + ], + { + "title_aux": "EasyCaptureNode for ComfyUI" + } + ], + "https://github.com/zhulu111/ComfyUI_Bxb": [ + [ + "sdBxb", + "sdBxb_textInput" + ], + { + "title_aux": "ComfyUI_Bxb" + } + ], + "https://github.com/zohac/ComfyUI_ZC_DrawShape": [ + [ + "ZcDrawShape" + ], + { + "author": "Zohac", + "description": "nodes for artists, designers and animators.", + "nickname": "Zc DrawShape", + "title": "Zc DrawShape", + "title_aux": "ComfyUI_ZC_DrawShape" + } + ], + "https://github.com/zombieyang/sd-ppp": [ + [ + "Get Image From Photoshop Layer", + "Image Times Opacity", + "Mask Times Opacity", + "Send Images To Photoshop" + ], + { + "title_aux": "SD-PPP" + } + ], + "https://raw.githubusercontent.com/throttlekitty/SDXLCustomAspectRatio/main/SDXLAspectRatio.py": [ + [ + "SDXLAspectRatio" + ], + { + "title_aux": "SDXLCustomAspectRatio" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/git_helper.py b/custom_nodes/ComfyUI-Manager/git_helper.py new file mode 100644 index 000000000..38dd24f73 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/git_helper.py @@ -0,0 +1,426 @@ +import subprocess +import sys +import os +import traceback + +import git +import configparser +import re +import json +import yaml +from torchvision.datasets.utils import download_url +from tqdm.auto import tqdm +from git.remote import RemoteProgress + +config_path = os.path.join(os.path.dirname(__file__), "config.ini") +nodelist_path = os.path.join(os.path.dirname(__file__), "custom-node-list.json") +working_directory = os.getcwd() + +if os.path.basename(working_directory) != 'custom_nodes': + print(f"WARN: This script should be executed in custom_nodes dir") + print(f"DBG: INFO {working_directory}") + print(f"DBG: INFO {sys.argv}") + # exit(-1) + + +class GitProgress(RemoteProgress): + def __init__(self): + super().__init__() + self.pbar = tqdm(ascii=True) + + def update(self, op_code, cur_count, max_count=None, message=''): + self.pbar.total = max_count + self.pbar.n = cur_count + self.pbar.pos = 0 + self.pbar.refresh() + + +def gitclone(custom_nodes_path, url, target_hash=None): + repo_name = os.path.splitext(os.path.basename(url))[0] + repo_path = os.path.join(custom_nodes_path, repo_name) + + # Clone the repository from the remote URL + repo = git.Repo.clone_from(url, repo_path, recursive=True, progress=GitProgress()) + + if target_hash is not None: + print(f"CHECKOUT: {repo_name} [{target_hash}]") + repo.git.checkout(target_hash) + + repo.git.clear_cache() + repo.close() + + +def gitcheck(path, do_fetch=False): + try: + # Fetch the latest commits from the remote repository + repo = git.Repo(path) + + if repo.head.is_detached: + print("CUSTOM NODE CHECK: True") + return + + current_branch = repo.active_branch + branch_name = current_branch.name + + remote_name = current_branch.tracking_branch().remote_name + remote = repo.remote(name=remote_name) + + if do_fetch: + remote.fetch() + + # Get the current commit hash and the commit hash of the remote branch + commit_hash = repo.head.commit.hexsha + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + # Compare the commit hashes to determine if the local repository is behind the remote repository + if commit_hash != remote_commit_hash: + # Get the commit dates + commit_date = repo.head.commit.committed_datetime + remote_commit_date = repo.refs[f'{remote_name}/{branch_name}'].object.committed_datetime + + # Compare the commit dates to determine if the local repository is behind the remote repository + if commit_date < remote_commit_date: + print("CUSTOM NODE CHECK: True") + else: + print("CUSTOM NODE CHECK: False") + except Exception as e: + print(e) + print("CUSTOM NODE CHECK: Error") + + +def switch_to_default_branch(repo): + show_result = repo.git.remote("show", "origin") + matches = re.search(r"\s*HEAD branch:\s*(.*)", show_result) + if matches: + default_branch = matches.group(1) + repo.git.checkout(default_branch) + + +def gitpull(path): + # Check if the path is a git repository + if not os.path.exists(os.path.join(path, '.git')): + raise ValueError('Not a git repository') + + # Pull the latest changes from the remote repository + repo = git.Repo(path) + if repo.is_dirty(): + repo.git.stash() + + commit_hash = repo.head.commit.hexsha + try: + if repo.head.is_detached: + switch_to_default_branch(repo) + + current_branch = repo.active_branch + branch_name = current_branch.name + + remote_name = current_branch.tracking_branch().remote_name + remote = repo.remote(name=remote_name) + + remote.fetch() + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + if commit_hash == remote_commit_hash: + print("CUSTOM NODE PULL: None") # there is no update + repo.close() + return + + remote.pull() + + repo.git.submodule('update', '--init', '--recursive') + new_commit_hash = repo.head.commit.hexsha + + if commit_hash != new_commit_hash: + print("CUSTOM NODE PULL: Success") # update success + else: + print("CUSTOM NODE PULL: Fail") # update fail + except Exception as e: + print(e) + print("CUSTOM NODE PULL: Fail") # unknown git error + + repo.close() + + +def checkout_comfyui_hash(target_hash): + repo_path = os.path.abspath(os.path.join(working_directory, '..')) # ComfyUI dir + + repo = git.Repo(repo_path) + commit_hash = repo.head.commit.hexsha + + if commit_hash != target_hash: + try: + print(f"CHECKOUT: ComfyUI [{target_hash}]") + repo.git.checkout(target_hash) + except git.GitCommandError as e: + print(f"Error checking out the ComfyUI: {str(e)}") + + +def checkout_custom_node_hash(git_custom_node_infos): + repo_name_to_url = {} + + for url in git_custom_node_infos.keys(): + repo_name = url.split('/')[-1] + + if repo_name.endswith('.git'): + repo_name = repo_name[:-4] + + repo_name_to_url[repo_name] = url + + for path in os.listdir(working_directory): + if path.endswith("ComfyUI-Manager"): + continue + + fullpath = os.path.join(working_directory, path) + + if os.path.isdir(fullpath): + is_disabled = path.endswith(".disabled") + + try: + git_dir = os.path.join(fullpath, '.git') + if not os.path.exists(git_dir): + continue + + need_checkout = False + repo_name = os.path.basename(fullpath) + + if repo_name.endswith('.disabled'): + repo_name = repo_name[:-9] + + if repo_name not in repo_name_to_url: + if not is_disabled: + # should be disabled + print(f"DISABLE: {repo_name}") + new_path = fullpath + ".disabled" + os.rename(fullpath, new_path) + need_checkout = False + else: + item = git_custom_node_infos[repo_name_to_url[repo_name]] + if item['disabled'] and is_disabled: + pass + elif item['disabled'] and not is_disabled: + # disable + print(f"DISABLE: {repo_name}") + new_path = fullpath + ".disabled" + os.rename(fullpath, new_path) + + elif not item['disabled'] and is_disabled: + # enable + print(f"ENABLE: {repo_name}") + new_path = fullpath[:-9] + os.rename(fullpath, new_path) + fullpath = new_path + need_checkout = True + else: + need_checkout = True + + if need_checkout: + repo = git.Repo(fullpath) + commit_hash = repo.head.commit.hexsha + + if commit_hash != item['hash']: + print(f"CHECKOUT: {repo_name} [{item['hash']}]") + repo.git.checkout(item['hash']) + + except Exception: + print(f"Failed to restore snapshots for the custom node '{path}'") + + # clone missing + for k, v in git_custom_node_infos.items(): + if not v['disabled']: + repo_name = k.split('/')[-1] + if repo_name.endswith('.git'): + repo_name = repo_name[:-4] + + path = os.path.join(working_directory, repo_name) + if not os.path.exists(path): + print(f"CLONE: {path}") + gitclone(working_directory, k, v['hash']) + + +def invalidate_custom_node_file(file_custom_node_infos): + global nodelist_path + + enabled_set = set() + for item in file_custom_node_infos: + if not item['disabled']: + enabled_set.add(item['filename']) + + for path in os.listdir(working_directory): + fullpath = os.path.join(working_directory, path) + + if not os.path.isdir(fullpath) and fullpath.endswith('.py'): + if path not in enabled_set: + print(f"DISABLE: {path}") + new_path = fullpath+'.disabled' + os.rename(fullpath, new_path) + + elif not os.path.isdir(fullpath) and fullpath.endswith('.py.disabled'): + path = path[:-9] + if path in enabled_set: + print(f"ENABLE: {path}") + new_path = fullpath[:-9] + os.rename(fullpath, new_path) + + # download missing: just support for 'copy' style + py_to_url = {} + + with open(nodelist_path, 'r', encoding="UTF-8") as json_file: + info = json.load(json_file) + for item in info['custom_nodes']: + if item['install_type'] == 'copy': + for url in item['files']: + if url.endswith('.py'): + py = url.split('/')[-1] + py_to_url[py] = url + + for item in file_custom_node_infos: + filename = item['filename'] + if not item['disabled']: + target_path = os.path.join(working_directory, filename) + + if not os.path.exists(target_path) and filename in py_to_url: + url = py_to_url[filename] + print(f"DOWNLOAD: {filename}") + download_url(url, working_directory) + + +def apply_snapshot(target): + try: + path = os.path.join(os.path.dirname(__file__), 'snapshots', f"{target}") + if os.path.exists(path): + if not target.endswith('.json') and not target.endswith('.yaml'): + print(f"Snapshot file not found: `{path}`") + print("APPLY SNAPSHOT: False") + return None + + with open(path, 'r', encoding="UTF-8") as snapshot_file: + if target.endswith('.json'): + info = json.load(snapshot_file) + elif target.endswith('.yaml'): + info = yaml.load(snapshot_file, Loader=yaml.SafeLoader) + info = info['custom_nodes'] + else: + # impossible case + print("APPLY SNAPSHOT: False") + return None + + comfyui_hash = info['comfyui'] + git_custom_node_infos = info['git_custom_nodes'] + file_custom_node_infos = info['file_custom_nodes'] + + checkout_comfyui_hash(comfyui_hash) + checkout_custom_node_hash(git_custom_node_infos) + invalidate_custom_node_file(file_custom_node_infos) + + print("APPLY SNAPSHOT: True") + if 'pips' in info: + return info['pips'] + else: + return None + + print(f"Snapshot file not found: `{path}`") + print("APPLY SNAPSHOT: False") + + return None + except Exception as e: + print(e) + traceback.print_exc() + print("APPLY SNAPSHOT: False") + + return None + + +def restore_pip_snapshot(pips, options): + non_url = [] + local_url = [] + non_local_url = [] + for k, v in pips.items(): + if v == "": + non_url.append(k) + else: + if v.startswith('file:'): + local_url.append(v) + else: + non_local_url.append(v) + + failed = [] + if '--pip-non-url' in options: + # try all at once + res = 1 + try: + res = subprocess.check_call([sys.executable, '-m', 'pip', 'install'] + non_url) + except: + pass + + # fallback + if res != 0: + for x in non_url: + res = 1 + try: + res = subprocess.check_call([sys.executable, '-m', 'pip', 'install', x]) + except: + pass + + if res != 0: + failed.append(x) + + if '--pip-non-local-url' in options: + for x in non_local_url: + res = 1 + try: + res = subprocess.check_call([sys.executable, '-m', 'pip', 'install', x]) + except: + pass + + if res != 0: + failed.append(x) + + if '--pip-local-url' in options: + for x in local_url: + res = 1 + try: + res = subprocess.check_call([sys.executable, '-m', 'pip', 'install', x]) + except: + pass + + if res != 0: + failed.append(x) + + print(f"Installation failed for pip packages: {failed}") + + +def setup_environment(): + config = configparser.ConfigParser() + config.read(config_path) + if 'default' in config and 'git_exe' in config['default'] and config['default']['git_exe'] != '': + git.Git().update_environment(GIT_PYTHON_GIT_EXECUTABLE=config['default']['git_exe']) + + +setup_environment() + + +try: + if sys.argv[1] == "--clone": + gitclone(sys.argv[2], sys.argv[3]) + elif sys.argv[1] == "--check": + gitcheck(sys.argv[2], False) + elif sys.argv[1] == "--fetch": + gitcheck(sys.argv[2], True) + elif sys.argv[1] == "--pull": + gitpull(sys.argv[2]) + elif sys.argv[1] == "--apply-snapshot": + options = set() + for x in sys.argv: + if x in ['--pip-non-url', '--pip-local-url', '--pip-non-local-url']: + options.add(x) + + pips = apply_snapshot(sys.argv[2]) + + if pips and len(options) > 0: + restore_pip_snapshot(pips, options) + sys.exit(0) +except Exception as e: + print(e) + sys.exit(-1) + + diff --git a/custom_nodes/ComfyUI-Manager/github-stats.json b/custom_nodes/ComfyUI-Manager/github-stats.json new file mode 100644 index 000000000..22e023900 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/github-stats.json @@ -0,0 +1,5232 @@ +{ + "https://github.com/0xbitches/ComfyUI-LCM": { + "stars": 247, + "last_update": "2023-11-11 21:24:33", + "author_account_age_days": 547 + }, + "https://github.com/1038lab/ComfyUI-GPT2P": { + "stars": 3, + "last_update": "2024-06-10 16:56:29", + "author_account_age_days": 467 + }, + "https://github.com/1038lab/ComfyUI_LatentSizeSelector": { + "stars": 1, + "last_update": "2024-07-03 23:22:52", + "author_account_age_days": 467 + }, + "https://github.com/11cafe/comfyui-workspace-manager": { + "stars": 828, + "last_update": "2024-07-02 13:41:38", + "author_account_age_days": 220 + }, + "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant": { + "stars": 11, + "last_update": "2024-07-09 14:44:29", + "author_account_age_days": 140 + }, + "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": { + "stars": 21, + "last_update": "2024-05-23 00:08:39", + "author_account_age_days": 140 + }, + "https://github.com/11dogzi/Comfyui-ergouzi-samplers": { + "stars": 21, + "last_update": "2024-06-28 05:28:05", + "author_account_age_days": 140 + }, + "https://github.com/1mckw/Comfyui-Gelbooru": { + "stars": 2, + "last_update": "2024-05-27 07:45:00", + "author_account_age_days": 705 + }, + "https://github.com/42lux/ComfyUI-safety-checker": { + "stars": 20, + "last_update": "2024-05-22 22:11:59", + "author_account_age_days": 3714 + }, + "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": { + "stars": 20, + "last_update": "2024-06-13 05:51:56", + "author_account_age_days": 429 + }, + "https://github.com/54rt1n/ComfyUI-DareMerge": { + "stars": 47, + "last_update": "2024-07-09 16:29:23", + "author_account_age_days": 4066 + }, + "https://github.com/80sVectorz/ComfyUI-Static-Primitives": { + "stars": 10, + "last_update": "2024-05-23 11:20:57", + "author_account_age_days": 1486 + }, + "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": { + "stars": 0, + "last_update": "2024-05-23 00:26:10", + "author_account_age_days": 488 + }, + "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE": { + "stars": 7, + "last_update": "2024-06-02 14:57:59", + "author_account_age_days": 488 + }, + "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI": { + "stars": 70, + "last_update": "2024-06-23 14:56:16", + "author_account_age_days": 514 + }, + "https://github.com/AI2lab/comfyUI-DeepSeek-2lab": { + "stars": 3, + "last_update": "2024-07-03 04:07:46", + "author_account_age_days": 207 + }, + "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab": { + "stars": 3, + "last_update": "2024-06-29 18:08:21", + "author_account_age_days": 207 + }, + "https://github.com/AI2lab/comfyUI-tool-2lab": { + "stars": 9, + "last_update": "2024-07-08 07:12:32", + "author_account_age_days": 207 + }, + "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting": { + "stars": 6, + "last_update": "2024-06-19 13:59:49", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-AuraSR": { + "stars": 13, + "last_update": "2024-06-27 14:00:16", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio": { + "stars": 32, + "last_update": "2024-07-02 13:01:42", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-FishSpeech": { + "stars": 8, + "last_update": "2024-05-23 01:18:49", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": { + "stars": 161, + "last_update": "2024-06-14 07:05:01", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-Hallo": { + "stars": 229, + "last_update": "2024-06-24 06:43:23", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-I2V-Adapter": { + "stars": 7, + "last_update": "2024-07-02 01:59:49", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-IP_LAP": { + "stars": 24, + "last_update": "2024-06-14 07:05:39", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-Live2DViewer": { + "stars": 2, + "last_update": "2024-06-14 07:04:49", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-MARS5-TTS": { + "stars": 18, + "last_update": "2024-07-02 02:00:28", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-MimicBrush": { + "stars": 69, + "last_update": "2024-06-17 22:26:53", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-MimicMotion": { + "stars": 235, + "last_update": "2024-07-02 13:59:07", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": { + "stars": 9, + "last_update": "2024-06-14 07:05:19", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-RVC": { + "stars": 9, + "last_update": "2024-06-14 07:05:25", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-UVR5": { + "stars": 64, + "last_update": "2024-06-20 07:31:20", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-UniAnimate": { + "stars": 27, + "last_update": "2024-06-30 09:20:25", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-WhisperX": { + "stars": 21, + "last_update": "2024-06-14 07:05:31", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI-XTTS": { + "stars": 28, + "last_update": "2024-06-24 09:45:59", + "author_account_age_days": 246 + }, + "https://github.com/AIFSH/ComfyUI_V-Express": { + "stars": 77, + "last_update": "2024-06-23 09:54:57", + "author_account_age_days": 246 + }, + "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": { + "stars": 5, + "last_update": "2024-05-23 00:13:50", + "author_account_age_days": 225 + }, + "https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION": { + "stars": 1043, + "last_update": "2024-07-01 03:49:28", + "author_account_age_days": 516 + }, + "https://github.com/AIGODLIKE/AIGODLIKE-ComfyUI-Studio": { + "stars": 208, + "last_update": "2024-06-05 00:52:46", + "author_account_age_days": 516 + }, + "https://github.com/AIGODLIKE/ComfyUI-CUP": { + "stars": 6, + "last_update": "2024-06-21 03:43:20", + "author_account_age_days": 516 + }, + "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": { + "stars": 263, + "last_update": "2024-06-18 08:04:40", + "author_account_age_days": 516 + }, + "https://github.com/AInseven/ComfyUI-fastblend": { + "stars": 136, + "last_update": "2024-06-14 07:13:21", + "author_account_age_days": 1698 + }, + "https://github.com/AIrjen/OneButtonPrompt": { + "stars": 754, + "last_update": "2024-07-09 17:44:12", + "author_account_age_days": 458 + }, + "https://github.com/ALatentPlace/ComfyUI_yanc": { + "stars": 23, + "last_update": "2024-06-30 10:04:17", + "author_account_age_days": 1475 + }, + "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": { + "stars": 184, + "last_update": "2024-06-14 07:04:37", + "author_account_age_days": 3683 + }, + "https://github.com/AbyssYuan0/ComfyUI_BadgerTools": { + "stars": 6, + "last_update": "2024-06-19 11:46:19", + "author_account_age_days": 504 + }, + "https://github.com/Acly/comfyui-inpaint-nodes": { + "stars": 470, + "last_update": "2024-07-02 10:02:46", + "author_account_age_days": 3820 + }, + "https://github.com/Acly/comfyui-tooling-nodes": { + "stars": 216, + "last_update": "2024-06-24 15:56:37", + "author_account_age_days": 3820 + }, + "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": { + "stars": 0, + "last_update": "2024-06-20 17:26:02", + "author_account_age_days": 1291 + }, + "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": { + "stars": 681, + "last_update": "2024-06-28 14:06:48", + "author_account_age_days": 2715 + }, + "https://github.com/Alysondao/Comfyui-Yolov8-JSON": { + "stars": 12, + "last_update": "2024-07-03 03:59:38", + "author_account_age_days": 1045 + }, + "https://github.com/Amorano/Jovimetrix": { + "stars": 172, + "last_update": "2024-07-07 17:11:00", + "author_account_age_days": 5227 + }, + "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": { + "stars": 5, + "last_update": "2024-07-05 13:48:56", + "author_account_age_days": 4107 + }, + "https://github.com/AonekoSS/ComfyUI-SimpleCounter": { + "stars": 1, + "last_update": "2024-07-05 13:46:19", + "author_account_age_days": 4107 + }, + "https://github.com/ArcherFMY/Diffusion360_ComfyUI": { + "stars": 18, + "last_update": "2024-05-28 03:14:17", + "author_account_age_days": 3404 + }, + "https://github.com/ArdeniusAI/CPlus_Ardenius": { + "stars": 0, + "last_update": "2024-06-14 07:13:26", + "author_account_age_days": 142 + }, + "https://github.com/ArtBot2023/CharacterFaceSwap": { + "stars": 57, + "last_update": "2024-05-22 20:53:09", + "author_account_age_days": 308 + }, + "https://github.com/ArtVentureX/comfyui-animatediff": { + "stars": 644, + "last_update": "2024-05-22 18:16:43", + "author_account_age_days": 420 + }, + "https://github.com/AshMartian/ComfyUI-DirGir": { + "stars": 11, + "last_update": "2024-05-29 22:28:55", + "author_account_age_days": 4601 + }, + "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": { + "stars": 34, + "last_update": "2024-06-14 09:03:24", + "author_account_age_days": 405 + }, + "https://github.com/AuroBit/ComfyUI-OOTDiffusion": { + "stars": 356, + "last_update": "2024-06-14 08:11:00", + "author_account_age_days": 405 + }, + "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": { + "stars": 0, + "last_update": "2024-06-14 07:06:51", + "author_account_age_days": 4089 + }, + "https://github.com/AustinMroz/ComfyUI-SpliceTools": { + "stars": 7, + "last_update": "2024-06-14 07:07:21", + "author_account_age_days": 4089 + }, + "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing": { + "stars": 6, + "last_update": "2024-07-03 21:55:35", + "author_account_age_days": 4089 + }, + "https://github.com/Auttasak-L/ComfyUI-ImageCropper": { + "stars": 1, + "last_update": "2024-05-23 05:04:53", + "author_account_age_days": 2664 + }, + "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": { + "stars": 2, + "last_update": "2024-06-20 03:42:00", + "author_account_age_days": 505 + }, + "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": { + "stars": 3, + "last_update": "2024-05-23 00:08:50", + "author_account_age_days": 2458 + }, + "https://github.com/BadCafeCode/masquerade-nodes-comfyui": { + "stars": 314, + "last_update": "2024-06-19 04:16:54", + "author_account_age_days": 445 + }, + "https://github.com/Beinsezii/bsz-cui-extras": { + "stars": 21, + "last_update": "2024-05-22 20:46:45", + "author_account_age_days": 2241 + }, + "https://github.com/BenNarum/SigmaWaveFormNode": { + "stars": 5, + "last_update": "2024-06-20 15:20:35", + "author_account_age_days": 3087 + }, + "https://github.com/BennyKok/comfyui-deploy": { + "stars": 713, + "last_update": "2024-07-08 05:06:56", + "author_account_age_days": 3011 + }, + "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": { + "stars": 17, + "last_update": "2024-06-21 10:21:10", + "author_account_age_days": 887 + }, + "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": { + "stars": 50, + "last_update": "2024-06-21 10:13:50", + "author_account_age_days": 887 + }, + "https://github.com/Billius-AI/ComfyUI-Path-Helper": { + "stars": 14, + "last_update": "2024-05-22 23:25:08", + "author_account_age_days": 150 + }, + "https://github.com/BlakeOne/ComfyUI-CustomScheduler": { + "stars": 11, + "last_update": "2024-05-23 00:23:56", + "author_account_age_days": 2548 + }, + "https://github.com/BlakeOne/ComfyUI-NodePresets": { + "stars": 11, + "last_update": "2024-05-23 00:24:07", + "author_account_age_days": 2548 + }, + "https://github.com/BlakeOne/ComfyUI-NodeReset": { + "stars": 1, + "last_update": "2024-05-23 00:24:18", + "author_account_age_days": 2548 + }, + "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": { + "stars": 10, + "last_update": "2024-05-23 00:23:44", + "author_account_age_days": 2548 + }, + "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": { + "stars": 274, + "last_update": "2024-05-22 14:56:13", + "author_account_age_days": 493 + }, + "https://github.com/BlenderNeko/ComfyUI_Cutoff": { + "stars": 344, + "last_update": "2024-05-22 15:01:45", + "author_account_age_days": 493 + }, + "https://github.com/BlenderNeko/ComfyUI_Noise": { + "stars": 214, + "last_update": "2024-06-10 16:38:48", + "author_account_age_days": 493 + }, + "https://github.com/BlenderNeko/ComfyUI_SeeCoder": { + "stars": 36, + "last_update": "2024-05-22 14:57:04", + "author_account_age_days": 493 + }, + "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": { + "stars": 297, + "last_update": "2024-05-22 14:56:49", + "author_account_age_days": 493 + }, + "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": { + "stars": 13, + "last_update": "2024-06-14 07:13:34", + "author_account_age_days": 500 + }, + "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": { + "stars": 6, + "last_update": "2024-05-22 17:55:41", + "author_account_age_days": 265 + }, + "https://github.com/CavinHuang/comfyui-nodes-docs": { + "stars": 76, + "last_update": "2024-07-04 11:29:55", + "author_account_age_days": 2741 + }, + "https://github.com/Chan-0312/ComfyUI-EasyDeforum": { + "stars": 9, + "last_update": "2024-05-22 23:22:14", + "author_account_age_days": 1881 + }, + "https://github.com/Chan-0312/ComfyUI-IPAnimate": { + "stars": 66, + "last_update": "2024-05-22 23:22:03", + "author_account_age_days": 1881 + }, + "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": { + "stars": 19, + "last_update": "2024-06-14 09:01:37", + "author_account_age_days": 1881 + }, + "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": { + "stars": 13, + "last_update": "2024-04-05 11:14:24", + "author_account_age_days": 1894 + }, + "https://github.com/Clybius/ComfyUI-Extra-Samplers": { + "stars": 58, + "last_update": "2024-06-14 09:03:17", + "author_account_age_days": 1749 + }, + "https://github.com/Clybius/ComfyUI-Latent-Modifiers": { + "stars": 64, + "last_update": "2024-06-14 09:02:44", + "author_account_age_days": 1749 + }, + "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": { + "stars": 85, + "last_update": "2024-06-29 07:14:23", + "author_account_age_days": 3670 + }, + "https://github.com/Danand/ComfyUI-ComfyCouple": { + "stars": 21, + "last_update": "2024-07-03 22:22:08", + "author_account_age_days": 4304 + }, + "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": { + "stars": 3, + "last_update": "2024-05-26 08:00:23", + "author_account_age_days": 4455 + }, + "https://github.com/DataCTE/prompt_injection": { + "stars": 66, + "last_update": "2024-06-21 12:56:43", + "author_account_age_days": 793 + }, + "https://github.com/DeJoker/pipeline-parallel-comfy": { + "stars": 1, + "last_update": "2024-07-09 03:00:49", + "author_account_age_days": 3006 + }, + "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": { + "stars": 308, + "last_update": "2024-06-22 02:12:19", + "author_account_age_days": 1790 + }, + "https://github.com/DigitalIO/ComfyUI-stable-wildcards": { + "stars": 19, + "last_update": "2024-05-24 21:15:08", + "author_account_age_days": 4054 + }, + "https://github.com/DimaChaichan/LAizypainter-Exporter-ComfyUI": { + "stars": 7, + "last_update": "2024-05-22 23:14:06", + "author_account_age_days": 3088 + }, + "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes": { + "stars": 0, + "last_update": "2024-05-22 23:24:30", + "author_account_age_days": 3503 + }, + "https://github.com/DrJKL/ComfyUI-Anchors": { + "stars": 5, + "last_update": "2024-06-20 18:23:00", + "author_account_age_days": 5010 + }, + "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": { + "stars": 2, + "last_update": "2024-05-23 00:25:14", + "author_account_age_days": 1047 + }, + "https://github.com/Electrofried/ComfyUI-OpenAINode": { + "stars": 19, + "last_update": "2024-06-14 09:01:22", + "author_account_age_days": 2635 + }, + "https://github.com/EllangoK/ComfyUI-post-processing-nodes": { + "stars": 147, + "last_update": "2024-05-22 17:54:09", + "author_account_age_days": 2793 + }, + "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": { + "stars": 25, + "last_update": "2024-05-23 00:12:17", + "author_account_age_days": 1639 + }, + "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": { + "stars": 103, + "last_update": "2024-06-08 02:33:02", + "author_account_age_days": 1639 + }, + "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": { + "stars": 255, + "last_update": "2024-05-23 00:12:41", + "author_account_age_days": 1639 + }, + "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": { + "stars": 285, + "last_update": "2024-07-07 23:20:40", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/LoadLoraWithTags": { + "stars": 42, + "last_update": "2024-06-22 21:05:44", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": { + "stars": 33, + "last_update": "2024-07-07 13:37:55", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI": { + "stars": 38, + "last_update": "2024-07-08 20:33:15", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": { + "stars": 87, + "last_update": "2024-06-22 21:06:08", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/noise_latent_perlinpinpin": { + "stars": 23, + "last_update": "2024-06-22 21:05:57", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI": { + "stars": 0, + "last_update": "2024-07-09 23:23:27", + "author_account_age_days": 3165 + }, + "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": { + "stars": 46, + "last_update": "2024-06-22 21:05:34", + "author_account_age_days": 3165 + }, + "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": { + "stars": 357, + "last_update": "2024-06-20 16:25:59", + "author_account_age_days": 3147 + }, + "https://github.com/Fannovel16/ComfyUI-Loopchain": { + "stars": 30, + "last_update": "2023-12-15 14:25:35", + "author_account_age_days": 3147 + }, + "https://github.com/Fannovel16/ComfyUI-MagickWand": { + "stars": 73, + "last_update": "2024-06-20 16:23:15", + "author_account_age_days": 3147 + }, + "https://github.com/Fannovel16/ComfyUI-MotionDiff": { + "stars": 150, + "last_update": "2024-06-20 16:29:32", + "author_account_age_days": 3147 + }, + "https://github.com/Fannovel16/ComfyUI-Video-Matting": { + "stars": 151, + "last_update": "2024-06-20 16:14:38", + "author_account_age_days": 3147 + }, + "https://github.com/Fannovel16/comfyui_controlnet_aux": { + "stars": 1661, + "last_update": "2024-07-08 17:03:55", + "author_account_age_days": 3147 + }, + "https://github.com/Fantaxico/ComfyUI-GCP-Storage": { + "stars": 0, + "last_update": "2024-06-14 09:05:52", + "author_account_age_days": 551 + }, + "https://github.com/Feidorian/feidorian-ComfyNodes": { + "stars": 5, + "last_update": "2024-06-20 11:31:37", + "author_account_age_days": 2770 + }, + "https://github.com/Fictiverse/ComfyUI_Fictiverse": { + "stars": 7, + "last_update": "2024-06-05 19:03:21", + "author_account_age_days": 687 + }, + "https://github.com/Fihade/IC-Light-ComfyUI-Node": { + "stars": 6, + "last_update": "2024-07-02 03:47:17", + "author_account_age_days": 2762 + }, + "https://github.com/FizzleDorf/ComfyUI-AIT": { + "stars": 44, + "last_update": "2024-06-22 03:13:05", + "author_account_age_days": 1995 + }, + "https://github.com/FizzleDorf/ComfyUI_FizzNodes": { + "stars": 326, + "last_update": "2024-06-27 03:29:51", + "author_account_age_days": 1995 + }, + "https://github.com/FlyingFireCo/tiled_ksampler": { + "stars": 56, + "last_update": "2024-05-22 23:15:17", + "author_account_age_days": 648 + }, + "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": { + "stars": 182, + "last_update": "2024-05-29 18:29:05", + "author_account_age_days": 1259 + }, + "https://github.com/Franck-Demongin/NX_PromptStyler": { + "stars": 5, + "last_update": "2024-05-22 23:25:21", + "author_account_age_days": 1786 + }, + "https://github.com/FredBill1/comfyui-fb-utils": { + "stars": 0, + "last_update": "2024-05-23 01:41:02", + "author_account_age_days": 2332 + }, + "https://github.com/Fucci-Mateo/ComfyUI-Airtable": { + "stars": 0, + "last_update": "2024-06-25 13:35:18", + "author_account_age_days": 894 + }, + "https://github.com/FuouM/ComfyUI-FirstOrderMM": { + "stars": 2, + "last_update": "2024-07-01 10:46:26", + "author_account_age_days": 1696 + }, + "https://github.com/G-370/ComfyUI-SD3-Powerlab": { + "stars": 17, + "last_update": "2024-06-22 19:17:18", + "author_account_age_days": 1534 + }, + "https://github.com/GMapeSplat/ComfyUI_ezXY": { + "stars": 23, + "last_update": "2024-05-29 17:43:08", + "author_account_age_days": 1313 + }, + "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": { + "stars": 7, + "last_update": "2024-05-22 21:31:52", + "author_account_age_days": 2572 + }, + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": { + "stars": 9, + "last_update": "2024-06-19 11:01:41", + "author_account_age_days": 4583 + }, + "https://github.com/GentlemanHu/ComfyUI-SunoAI": { + "stars": 10, + "last_update": "2024-06-14 06:02:29", + "author_account_age_days": 2398 + }, + "https://github.com/Goktug/comfyui-saveimage-plus": { + "stars": 2, + "last_update": "2024-06-20 07:23:48", + "author_account_age_days": 4947 + }, + "https://github.com/Gourieff/comfyui-reactor-node": { + "stars": 1122, + "last_update": "2024-07-03 09:36:19", + "author_account_age_days": 1135 + }, + "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": { + "stars": 23, + "last_update": "2024-07-09 08:28:38", + "author_account_age_days": 178 + }, + "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS": { + "stars": 6, + "last_update": "2024-07-09 04:52:14", + "author_account_age_days": 1189 + }, + "https://github.com/GreenLandisaLie/AuraSR-ComfyUI": { + "stars": 68, + "last_update": "2024-07-04 00:07:10", + "author_account_age_days": 1213 + }, + "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": { + "stars": 3, + "last_update": "2024-06-14 08:59:42", + "author_account_age_days": 1495 + }, + "https://github.com/HAL41/ComfyUI-aichemy-nodes": { + "stars": 4, + "last_update": "2024-05-22 23:10:19", + "author_account_age_days": 2861 + }, + "https://github.com/HECer/ComfyUI-FilePathCreator": { + "stars": 2, + "last_update": "2024-07-09 22:02:15", + "author_account_age_days": 2995 + }, + "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream": { + "stars": 37, + "last_update": "2024-06-14 08:08:20", + "author_account_age_days": 625 + }, + "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": { + "stars": 33, + "last_update": "2024-06-14 08:08:28", + "author_account_age_days": 625 + }, + "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything": { + "stars": 16, + "last_update": "2024-06-14 08:10:52", + "author_account_age_days": 625 + }, + "https://github.com/Haoming02/comfyui-clear-screen": { + "stars": 1, + "last_update": "2024-07-09 08:49:03", + "author_account_age_days": 1346 + }, + "https://github.com/Haoming02/comfyui-diffusion-cg": { + "stars": 51, + "last_update": "2024-06-14 07:10:28", + "author_account_age_days": 1346 + }, + "https://github.com/Haoming02/comfyui-floodgate": { + "stars": 25, + "last_update": "2024-07-09 09:02:07", + "author_account_age_days": 1346 + }, + "https://github.com/Haoming02/comfyui-menu-anchor": { + "stars": 3, + "last_update": "2024-07-09 10:03:10", + "author_account_age_days": 1346 + }, + "https://github.com/Haoming02/comfyui-node-beautify": { + "stars": 3, + "last_update": "2024-07-09 09:25:46", + "author_account_age_days": 1346 + }, + "https://github.com/Haoming02/comfyui-prompt-format": { + "stars": 30, + "last_update": "2024-06-14 07:12:02", + "author_account_age_days": 1346 + }, + "https://github.com/Haoming02/comfyui-tab-handler": { + "stars": 4, + "last_update": "2024-07-09 08:41:44", + "author_account_age_days": 1346 + }, + "https://github.com/HaydenReeve/ComfyUI-Better-Strings": { + "stars": 0, + "last_update": "2024-05-22 23:20:05", + "author_account_age_days": 2257 + }, + "https://github.com/HebelHuber/comfyui-enhanced-save-node": { + "stars": 1, + "last_update": "2024-06-14 08:59:28", + "author_account_age_days": 2339 + }, + "https://github.com/Hiero207/ComfyUI-Hiero-Nodes": { + "stars": 6, + "last_update": "2024-06-24 03:38:50", + "author_account_age_days": 1714 + }, + "https://github.com/Hopping-Mad-Games/ComfyUI_LiteLLM": { + "stars": 3, + "last_update": "2024-06-29 19:44:47", + "author_account_age_days": 204 + }, + "https://github.com/IDGallagher/ComfyUI-IG-Nodes": { + "stars": 1, + "last_update": "2024-06-04 00:24:47", + "author_account_age_days": 5496 + }, + "https://github.com/ITurchenko/ComfyUI-SizeFromArray": { + "stars": 0, + "last_update": "2024-05-24 14:09:58", + "author_account_age_days": 3724 + }, + "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": { + "stars": 9, + "last_update": "2024-05-23 01:12:46", + "author_account_age_days": 2645 + }, + "https://github.com/Inzaniak/comfyui-ranbooru": { + "stars": 8, + "last_update": "2024-05-22 23:12:23", + "author_account_age_days": 3925 + }, + "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": { + "stars": 3, + "last_update": "2024-06-21 20:39:06", + "author_account_age_days": 127 + }, + "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": { + "stars": 39, + "last_update": "2024-05-22 20:39:14", + "author_account_age_days": 331 + }, + "https://github.com/Jannchie/ComfyUI-J": { + "stars": 64, + "last_update": "2024-06-20 12:08:09", + "author_account_age_days": 2568 + }, + "https://github.com/JaredTherriault/ComfyUI-JNodes": { + "stars": 25, + "last_update": "2024-06-27 23:37:38", + "author_account_age_days": 3587 + }, + "https://github.com/JayLyu/ComfyUI_BaiKong_Node": { + "stars": 0, + "last_update": "2024-07-03 15:07:04", + "author_account_age_days": 3283 + }, + "https://github.com/JcandZero/ComfyUI_GLM4Node": { + "stars": 25, + "last_update": "2024-05-22 23:12:46", + "author_account_age_days": 705 + }, + "https://github.com/Jcd1230/rembg-comfyui-node": { + "stars": 123, + "last_update": "2024-05-22 17:58:34", + "author_account_age_days": 4901 + }, + "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": { + "stars": 3, + "last_update": "2024-05-22 23:18:51", + "author_account_age_days": 171 + }, + "https://github.com/JettHu/ComfyUI-TCD": { + "stars": 93, + "last_update": "2024-06-03 11:40:18", + "author_account_age_days": 2373 + }, + "https://github.com/JettHu/ComfyUI_TGate": { + "stars": 49, + "last_update": "2024-05-26 08:29:23", + "author_account_age_days": 2373 + }, + "https://github.com/Jordach/comfy-plasma": { + "stars": 53, + "last_update": "2024-05-22 18:08:28", + "author_account_age_days": 4528 + }, + "https://github.com/Kaharos94/ComfyUI-Saveaswebp": { + "stars": 33, + "last_update": "2024-06-21 23:01:48", + "author_account_age_days": 1210 + }, + "https://github.com/Kangkang625/ComfyUI-paint-by-example": { + "stars": 14, + "last_update": "2024-05-22 22:20:27", + "author_account_age_days": 929 + }, + "https://github.com/KewkLW/ComfyUI-kewky_tools": { + "stars": 3, + "last_update": "2024-07-09 16:59:34", + "author_account_age_days": 1702 + }, + "https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler": { + "stars": 138, + "last_update": "2024-06-16 15:50:10", + "author_account_age_days": 1501 + }, + "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": { + "stars": 14, + "last_update": "2024-06-14 10:28:10", + "author_account_age_days": 3205 + }, + "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": { + "stars": 443, + "last_update": "2024-07-09 01:09:21", + "author_account_age_days": 3732 + }, + "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": { + "stars": 2323, + "last_update": "2024-07-09 22:56:21", + "author_account_age_days": 3732 + }, + "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": { + "stars": 417, + "last_update": "2024-07-09 22:08:17", + "author_account_age_days": 3732 + }, + "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": { + "stars": 3, + "last_update": "2024-05-23 00:21:43", + "author_account_age_days": 1795 + }, + "https://github.com/LEv145/images-grid-comfy-plugin": { + "stars": 130, + "last_update": "2024-05-30 17:54:32", + "author_account_age_days": 2223 + }, + "https://github.com/LZpenguin/ComfyUI-Text": { + "stars": 23, + "last_update": "2024-06-20 13:38:16", + "author_account_age_days": 1994 + }, + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": { + "stars": 32, + "last_update": "2024-06-06 20:45:43", + "author_account_age_days": 179 + }, + "https://github.com/LarryJane491/Lora-Training-in-Comfy": { + "stars": 282, + "last_update": "2024-06-09 05:24:00", + "author_account_age_days": 179 + }, + "https://github.com/Layer-norm/comfyui-lama-remover": { + "stars": 59, + "last_update": "2024-05-25 00:12:04", + "author_account_age_days": 347 + }, + "https://github.com/Lerc/canvas_tab": { + "stars": 144, + "last_update": "2024-05-22 20:48:45", + "author_account_age_days": 5383 + }, + "https://github.com/Limitex/ComfyUI-Calculation": { + "stars": 0, + "last_update": "2024-05-22 22:18:40", + "author_account_age_days": 1290 + }, + "https://github.com/Limitex/ComfyUI-Diffusers": { + "stars": 118, + "last_update": "2024-05-22 22:18:57", + "author_account_age_days": 1290 + }, + "https://github.com/Loewen-Hob/rembg-comfyui-node-better": { + "stars": 43, + "last_update": "2024-05-23 00:32:53", + "author_account_age_days": 486 + }, + "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": { + "stars": 23, + "last_update": "2024-05-22 21:29:02", + "author_account_age_days": 991 + }, + "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": { + "stars": 2, + "last_update": "2024-05-22 21:31:28", + "author_account_age_days": 991 + }, + "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": { + "stars": 14, + "last_update": "2024-06-21 06:43:02", + "author_account_age_days": 1048 + }, + "https://github.com/LyazS/comfyui-anime-seg": { + "stars": 4, + "last_update": "2024-05-22 23:21:49", + "author_account_age_days": 2872 + }, + "https://github.com/M1kep/ComfyLiterals": { + "stars": 13, + "last_update": "2024-05-22 20:31:38", + "author_account_age_days": 4273 + }, + "https://github.com/M1kep/ComfyUI-KepOpenAI": { + "stars": 26, + "last_update": "2024-05-22 20:33:54", + "author_account_age_days": 4273 + }, + "https://github.com/M1kep/ComfyUI-OtherVAEs": { + "stars": 2, + "last_update": "2024-05-22 20:33:41", + "author_account_age_days": 4273 + }, + "https://github.com/M1kep/Comfy_KepKitchenSink": { + "stars": 0, + "last_update": "2024-05-22 20:33:29", + "author_account_age_days": 4273 + }, + "https://github.com/M1kep/Comfy_KepListStuff": { + "stars": 28, + "last_update": "2024-06-22 00:51:28", + "author_account_age_days": 4273 + }, + "https://github.com/M1kep/Comfy_KepMatteAnything": { + "stars": 10, + "last_update": "2024-05-22 20:33:16", + "author_account_age_days": 4273 + }, + "https://github.com/M1kep/KepPromptLang": { + "stars": 5, + "last_update": "2024-05-22 20:32:56", + "author_account_age_days": 4273 + }, + "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": { + "stars": 28, + "last_update": "2024-06-04 23:56:25", + "author_account_age_days": 1620 + }, + "https://github.com/Makeezi/ComfyUI-promptLAB": { + "stars": 0, + "last_update": "2024-05-23 01:24:51", + "author_account_age_days": 1797 + }, + "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": { + "stars": 14, + "last_update": "2024-06-14 10:24:17", + "author_account_age_days": 397 + }, + "https://github.com/ManglerFTW/ComfyI2I": { + "stars": 146, + "last_update": "2024-06-14 11:01:01", + "author_account_age_days": 671 + }, + "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": { + "stars": 68, + "last_update": "2024-07-09 13:08:03", + "author_account_age_days": 4985 + }, + "https://github.com/MarcusNyne/m9-prompts-comfyui": { + "stars": 1, + "last_update": "2024-06-14 15:25:15", + "author_account_age_days": 1438 + }, + "https://github.com/MariusKM/ComfyUI-BadmanNodes": { + "stars": 1, + "last_update": "2024-06-21 15:20:22", + "author_account_age_days": 2246 + }, + "https://github.com/MarkoCa1/ComfyUI-Text": { + "stars": 2, + "last_update": "2024-05-23 00:15:39", + "author_account_age_days": 1648 + }, + "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": { + "stars": 16, + "last_update": "2024-05-23 00:15:51", + "author_account_age_days": 1648 + }, + "https://github.com/Mason-McGough/ComfyUI-Mosaica": { + "stars": 4, + "last_update": "2024-05-29 12:57:49", + "author_account_age_days": 3221 + }, + "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack": { + "stars": 3, + "last_update": "2024-06-24 22:04:33", + "author_account_age_days": 75 + }, + "https://github.com/Millyarde/Pomfy": { + "stars": 7, + "last_update": "2024-05-22 22:22:48", + "author_account_age_days": 922 + }, + "https://github.com/MinusZoneAI/ComfyUI-Prompt-MZ": { + "stars": 75, + "last_update": "2024-07-07 14:51:07", + "author_account_age_days": 81 + }, + "https://github.com/MinusZoneAI/ComfyUI-StylizePhoto-MZ": { + "stars": 17, + "last_update": "2024-05-23 01:13:32", + "author_account_age_days": 81 + }, + "https://github.com/MinusZoneAI/ComfyUI-TrainTools-MZ": { + "stars": 17, + "last_update": "2024-07-09 12:42:11", + "author_account_age_days": 81 + }, + "https://github.com/Miosp/ComfyUI-FBCNN": { + "stars": 5, + "last_update": "2024-05-24 12:13:08", + "author_account_age_days": 2531 + }, + "https://github.com/MitoshiroPJ/comfyui_slothful_attention": { + "stars": 6, + "last_update": "2024-05-22 22:09:15", + "author_account_age_days": 3983 + }, + "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": { + "stars": 16, + "last_update": "2024-07-08 18:34:18", + "author_account_age_days": 395 + }, + "https://github.com/MrForExample/ComfyUI-3D-Pack": { + "stars": 1749, + "last_update": "2024-07-09 23:18:25", + "author_account_age_days": 1576 + }, + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": { + "stars": 444, + "last_update": "2024-06-14 12:02:47", + "author_account_age_days": 1576 + }, + "https://github.com/MrSamSeen/ComfyUI_SSStereoscope": { + "stars": 5, + "last_update": "2024-07-08 20:40:49", + "author_account_age_days": 3606 + }, + "https://github.com/Munkyfoot/ComfyUI-TextOverlay": { + "stars": 5, + "last_update": "2024-06-28 05:57:03", + "author_account_age_days": 3060 + }, + "https://github.com/Nestorchik/NStor-ComfyUI-Translation": { + "stars": 1, + "last_update": "2024-06-14 10:25:32", + "author_account_age_days": 1340 + }, + "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": { + "stars": 57, + "last_update": "2024-05-23 00:22:08", + "author_account_age_days": 109 + }, + "https://github.com/Nevysha/ComfyUI-nevysha-top-menu": { + "stars": 5, + "last_update": "2024-05-23 00:17:31", + "author_account_age_days": 542 + }, + "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": { + "stars": 13, + "last_update": "2024-05-22 20:34:46", + "author_account_age_days": 5165 + }, + "https://github.com/NimaNzrii/comfyui-photoshop": { + "stars": 276, + "last_update": "2024-07-09 08:17:57", + "author_account_age_days": 260 + }, + "https://github.com/NimaNzrii/comfyui-popup_preview": { + "stars": 35, + "last_update": "2024-05-22 22:12:04", + "author_account_age_days": 260 + }, + "https://github.com/Niutonian/ComfyUi-NoodleWebcam": { + "stars": 28, + "last_update": "2024-05-22 21:30:40", + "author_account_age_days": 1057 + }, + "https://github.com/Nlar/ComfyUI_CartoonSegmentation": { + "stars": 10, + "last_update": "2024-05-22 23:15:37", + "author_account_age_days": 3846 + }, + "https://github.com/NotHarroweD/Harronode": { + "stars": 5, + "last_update": "2024-05-22 22:18:29", + "author_account_age_days": 1999 + }, + "https://github.com/Nourepide/ComfyUI-Allor": { + "stars": 180, + "last_update": "2024-05-22 18:11:17", + "author_account_age_days": 2861 + }, + "https://github.com/Nuked88/ComfyUI-N-Nodes": { + "stars": 177, + "last_update": "2024-05-21 19:52:44", + "author_account_age_days": 4495 + }, + "https://github.com/Nuked88/ComfyUI-N-Sidebar": { + "stars": 412, + "last_update": "2024-07-05 18:21:44", + "author_account_age_days": 4495 + }, + "https://github.com/Off-Live/ComfyUI-off-suite": { + "stars": 0, + "last_update": "2024-06-14 12:02:25", + "author_account_age_days": 1187 + }, + "https://github.com/OpenArt-AI/ComfyUI-Assistant": { + "stars": 14, + "last_update": "2024-05-22 22:16:57", + "author_account_age_days": 790 + }, + "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": { + "stars": 11, + "last_update": "2024-05-22 21:27:10", + "author_account_age_days": 1680 + }, + "https://github.com/ParisNeo/lollms_nodes_suite": { + "stars": 10, + "last_update": "2024-06-23 21:04:43", + "author_account_age_days": 4785 + }, + "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": { + "stars": 0, + "last_update": "2024-05-22 21:26:35", + "author_account_age_days": 3658 + }, + "https://github.com/Pfaeff/pfaeff-comfyui": { + "stars": 19, + "last_update": "2024-05-22 18:21:10", + "author_account_age_days": 3223 + }, + "https://github.com/PnthrLeo/comfyUI-image-search": { + "stars": 0, + "last_update": "2024-06-14 07:06:45", + "author_account_age_days": 2567 + }, + "https://github.com/Pos13/comfyui-cyclist": { + "stars": 31, + "last_update": "2024-06-19 09:21:53", + "author_account_age_days": 1533 + }, + "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": { + "stars": 2, + "last_update": "2024-05-23 20:29:30", + "author_account_age_days": 1266 + }, + "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD": { + "stars": 2, + "last_update": "2024-06-24 18:20:48", + "author_account_age_days": 1380 + }, + "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": { + "stars": 6, + "last_update": "2024-05-22 22:16:41", + "author_account_age_days": 202 + }, + "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": { + "stars": 16, + "last_update": "2024-06-21 07:29:14", + "author_account_age_days": 1397 + }, + "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": { + "stars": 2, + "last_update": "2024-06-28 19:36:30", + "author_account_age_days": 944 + }, + "https://github.com/Ryuukeisyou/comfyui_face_parsing": { + "stars": 52, + "last_update": "2024-07-03 12:48:31", + "author_account_age_days": 2428 + }, + "https://github.com/Ryuukeisyou/comfyui_io_helpers": { + "stars": 1, + "last_update": "2024-05-22 22:22:59", + "author_account_age_days": 2428 + }, + "https://github.com/SEkINVR/ComfyUI-Save-Multi-Format": { + "stars": 1, + "last_update": "2024-07-08 03:39:48", + "author_account_age_days": 672 + }, + "https://github.com/SEkINVR/ComfyUI-SaveAs": { + "stars": 1, + "last_update": "2024-07-08 03:39:48", + "author_account_age_days": 672 + }, + "https://github.com/SLAPaper/ComfyUI-Image-Selector": { + "stars": 61, + "last_update": "2024-05-24 17:03:46", + "author_account_age_days": 3713 + }, + "https://github.com/SLAPaper/ComfyUI-dpmpp_2m_alt-Sampler": { + "stars": 8, + "last_update": "2024-06-18 19:22:50", + "author_account_age_days": 3713 + }, + "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": { + "stars": 4, + "last_update": "2024-06-28 19:20:36", + "author_account_age_days": 4099 + }, + "https://github.com/SOELexicon/ComfyUI-LexTools": { + "stars": 25, + "last_update": "2024-06-28 19:25:13", + "author_account_age_days": 4099 + }, + "https://github.com/SamKhoze/ComfyUI-DeepFuze": { + "stars": 223, + "last_update": "2024-07-09 18:11:33", + "author_account_age_days": 1458 + }, + "https://github.com/SayanoAI/Comfy-RVC": { + "stars": 2, + "last_update": "2024-06-25 02:50:53", + "author_account_age_days": 2619 + }, + "https://github.com/Scholar01/ComfyUI-Keyframe": { + "stars": 10, + "last_update": "2024-06-14 09:01:30", + "author_account_age_days": 3211 + }, + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": { + "stars": 5, + "last_update": "2024-06-23 01:30:57", + "author_account_age_days": 1125 + }, + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": { + "stars": 5, + "last_update": "2024-06-26 00:07:10", + "author_account_age_days": 4521 + }, + "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": { + "stars": 63, + "last_update": "2024-06-14 08:08:26", + "author_account_age_days": 92 + }, + "https://github.com/SeargeDP/SeargeSDXL": { + "stars": 750, + "last_update": "2024-05-22 00:28:26", + "author_account_age_days": 4187 + }, + "https://github.com/Seedsa/Fooocus_Nodes": { + "stars": 43, + "last_update": "2024-07-03 07:51:13", + "author_account_age_days": 2623 + }, + "https://github.com/Shadetail/ComfyUI_Eagleshadow": { + "stars": 1, + "last_update": "2024-06-15 13:04:49", + "author_account_age_days": 3413 + }, + "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting": { + "stars": 3, + "last_update": "2024-07-03 03:39:49", + "author_account_age_days": 130 + }, + "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools": { + "stars": 8, + "last_update": "2024-07-04 02:22:10", + "author_account_age_days": 417 + }, + "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": { + "stars": 2, + "last_update": "2024-06-14 11:50:52", + "author_account_age_days": 1220 + }, + "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash": { + "stars": 9, + "last_update": "2024-06-15 17:12:05", + "author_account_age_days": 1220 + }, + "https://github.com/ShmuelRonen/ComfyUI_wav2lip": { + "stars": 55, + "last_update": "2024-07-03 11:25:27", + "author_account_age_days": 1220 + }, + "https://github.com/Shraknard/ComfyUI-Remover": { + "stars": 4, + "last_update": "2024-05-22 23:15:06", + "author_account_age_days": 2332 + }, + "https://github.com/Siberpone/lazy-pony-prompter": { + "stars": 25, + "last_update": "2024-07-08 15:39:40", + "author_account_age_days": 468 + }, + "https://github.com/Smirnov75/ComfyUI-mxToolkit": { + "stars": 60, + "last_update": "2024-06-21 19:22:42", + "author_account_age_days": 1527 + }, + "https://github.com/Smuzzies/comfyui_meme_maker": { + "stars": 0, + "last_update": "2024-07-05 22:01:41", + "author_account_age_days": 707 + }, + "https://github.com/SoftMeng/ComfyUI_ImageToText": { + "stars": 6, + "last_update": "2024-06-14 08:08:36", + "author_account_age_days": 3539 + }, + "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": { + "stars": 16, + "last_update": "2024-06-14 07:06:27", + "author_account_age_days": 3539 + }, + "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": { + "stars": 18, + "last_update": "2024-06-14 07:09:03", + "author_account_age_days": 3539 + }, + "https://github.com/Sorcerio/MBM-Music-Visualizer": { + "stars": 15, + "last_update": "2024-05-23 01:09:18", + "author_account_age_days": 4262 + }, + "https://github.com/SozeInc/ComfyUI-Mobile": { + "stars": 0, + "last_update": "2024-06-14 07:09:00", + "author_account_age_days": 95 + }, + "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid": { + "stars": 6, + "last_update": "2024-05-22 22:11:52", + "author_account_age_days": 223 + }, + "https://github.com/Stability-AI/ComfyUI-SAI_API": { + "stars": 41, + "last_update": "2024-06-06 14:18:15", + "author_account_age_days": 858 + }, + "https://github.com/Stability-AI/stability-ComfyUI-nodes": { + "stars": 183, + "last_update": "2024-05-22 15:30:47", + "author_account_age_days": 858 + }, + "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": { + "stars": 95, + "last_update": "2024-06-14 08:12:12", + "author_account_age_days": 2850 + }, + "https://github.com/StartHua/ComfyUI_PCDMs": { + "stars": 3, + "last_update": "2024-05-22 23:21:14", + "author_account_age_days": 2850 + }, + "https://github.com/StartHua/ComfyUI_Seg_VITON": { + "stars": 174, + "last_update": "2024-05-22 23:20:17", + "author_account_age_days": 2850 + }, + "https://github.com/StartHua/Comfyui_joytag": { + "stars": 19, + "last_update": "2024-05-22 23:20:28", + "author_account_age_days": 2850 + }, + "https://github.com/StartHua/Comfyui_segformer_b2_clothes": { + "stars": 42, + "last_update": "2024-05-22 23:20:39", + "author_account_age_days": 2850 + }, + "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": { + "stars": 111, + "last_update": "2024-06-01 20:27:53", + "author_account_age_days": 104 + }, + "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers": { + "stars": 1, + "last_update": "2024-06-20 15:06:51", + "author_account_age_days": 3593 + }, + "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": { + "stars": 502, + "last_update": "2024-07-09 14:21:47", + "author_account_age_days": 2165 + }, + "https://github.com/Sxela/ComfyWarp": { + "stars": 21, + "last_update": "2024-05-22 20:47:11", + "author_account_age_days": 3387 + }, + "https://github.com/TGu-97/ComfyUI-TGu-utils": { + "stars": 1, + "last_update": "2024-05-22 21:07:45", + "author_account_age_days": 545 + }, + "https://github.com/THtianhao/ComfyUI-FaceChain": { + "stars": 88, + "last_update": "2024-06-25 02:59:28", + "author_account_age_days": 3706 + }, + "https://github.com/THtianhao/ComfyUI-Portrait-Maker": { + "stars": 170, + "last_update": "2024-05-22 21:18:05", + "author_account_age_days": 3706 + }, + "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": { + "stars": 129, + "last_update": "2024-05-23 00:25:37", + "author_account_age_days": 2550 + }, + "https://github.com/TMElyralab/Comfyui-MusePose": { + "stars": 296, + "last_update": "2024-06-22 07:09:49", + "author_account_age_days": 112 + }, + "https://github.com/TRI3D-LC/ComfyUI-MiroBoard": { + "stars": 4, + "last_update": "2024-07-02 16:21:56", + "author_account_age_days": 454 + }, + "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": { + "stars": 19, + "last_update": "2024-07-05 08:16:25", + "author_account_age_days": 454 + }, + "https://github.com/TW-CUI/TW-CUI-Util": { + "stars": 1, + "last_update": "2024-06-17 03:03:57", + "author_account_age_days": 46 + }, + "https://github.com/TaiTair/comfyui-simswap": { + "stars": 9, + "last_update": "2024-05-28 21:58:53", + "author_account_age_days": 3582 + }, + "https://github.com/Taremin/comfyui-prompt-extranetworks": { + "stars": 2, + "last_update": "2024-05-22 23:08:34", + "author_account_age_days": 2230 + }, + "https://github.com/Taremin/comfyui-string-tools": { + "stars": 1, + "last_update": "2024-05-22 23:08:45", + "author_account_age_days": 2230 + }, + "https://github.com/Taremin/webui-monaco-prompt": { + "stars": 24, + "last_update": "2024-05-23 13:58:57", + "author_account_age_days": 2230 + }, + "https://github.com/TeaCrab/ComfyUI-TeaNodes": { + "stars": 4, + "last_update": "2024-05-22 20:44:05", + "author_account_age_days": 3233 + }, + "https://github.com/TemryL/ComfyS3": { + "stars": 18, + "last_update": "2024-07-09 02:43:13", + "author_account_age_days": 884 + }, + "https://github.com/TemryL/ComfyUI-IDM-VTON": { + "stars": 231, + "last_update": "2024-07-06 10:12:20", + "author_account_age_days": 884 + }, + "https://github.com/TencentQQGYLab/ComfyUI-ELLA": { + "stars": 298, + "last_update": "2024-05-07 03:07:38", + "author_account_age_days": 113 + }, + "https://github.com/TheBarret/ZSuite": { + "stars": 6, + "last_update": "2024-06-25 10:19:11", + "author_account_age_days": 2728 + }, + "https://github.com/TheBill2001/comfyui-upscale-by-model": { + "stars": 2, + "last_update": "2024-06-18 17:57:06", + "author_account_age_days": 1457 + }, + "https://github.com/TheMistoAI/ComfyUI-Anyline": { + "stars": 292, + "last_update": "2024-07-09 11:01:15", + "author_account_age_days": 180 + }, + "https://github.com/ThereforeGames/ComfyUI-Unprompted": { + "stars": 8, + "last_update": "2024-06-23 21:38:03", + "author_account_age_days": 950 + }, + "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": { + "stars": 334, + "last_update": "2024-07-01 23:43:02", + "author_account_age_days": 636 + }, + "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": { + "stars": 19, + "last_update": "2024-05-22 22:13:06", + "author_account_age_days": 876 + }, + "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": { + "stars": 28, + "last_update": "2024-05-24 20:02:20", + "author_account_age_days": 3869 + }, + "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": { + "stars": 8, + "last_update": "2024-05-24 19:48:43", + "author_account_age_days": 3869 + }, + "https://github.com/Trung0246/ComfyUI-0246": { + "stars": 93, + "last_update": "2024-05-24 03:45:59", + "author_account_age_days": 3395 + }, + "https://github.com/Ttl/ComfyUi_NNLatentUpscale": { + "stars": 173, + "last_update": "2024-05-22 20:50:03", + "author_account_age_days": 4937 + }, + "https://github.com/TylerZoro/SD3-Scaling": { + "stars": 1, + "last_update": "2024-06-15 16:59:22", + "author_account_age_days": 1301 + }, + "https://github.com/Umikaze-job/select_folder_path_easy": { + "stars": 4, + "last_update": "2024-05-22 21:30:13", + "author_account_age_days": 234 + }, + "https://github.com/VAST-AI-Research/ComfyUI-Tripo": { + "stars": 72, + "last_update": "2024-05-23 01:11:56", + "author_account_age_days": 257 + }, + "https://github.com/WASasquatch/ASTERR": { + "stars": 14, + "last_update": "2024-06-17 00:49:59", + "author_account_age_days": 4641 + }, + "https://github.com/WASasquatch/ComfyUI_Preset_Merger": { + "stars": 24, + "last_update": "2024-06-17 00:52:28", + "author_account_age_days": 4641 + }, + "https://github.com/WASasquatch/FreeU_Advanced": { + "stars": 102, + "last_update": "2024-06-17 04:40:22", + "author_account_age_days": 4641 + }, + "https://github.com/WASasquatch/PPF_Noise_ComfyUI": { + "stars": 20, + "last_update": "2024-06-14 10:27:23", + "author_account_age_days": 4641 + }, + "https://github.com/WASasquatch/PowerNoiseSuite": { + "stars": 57, + "last_update": "2024-06-17 01:40:44", + "author_account_age_days": 4641 + }, + "https://github.com/WASasquatch/WAS_Extras": { + "stars": 27, + "last_update": "2024-06-17 04:08:37", + "author_account_age_days": 4641 + }, + "https://github.com/WASasquatch/was-node-suite-comfyui": { + "stars": 968, + "last_update": "2024-07-09 19:34:38", + "author_account_age_days": 4641 + }, + "https://github.com/WebDev9000/WebDev9000-Nodes": { + "stars": 1, + "last_update": "2024-06-14 10:28:22", + "author_account_age_days": 3767 + }, + "https://github.com/Wicloz/ComfyUI-Simply-Nodes": { + "stars": 1, + "last_update": "2024-07-06 22:35:50", + "author_account_age_days": 3659 + }, + "https://github.com/XmYx/deforum-comfy-nodes": { + "stars": 125, + "last_update": "2024-07-08 19:39:48", + "author_account_age_days": 2621 + }, + "https://github.com/Xyem/Xycuno-Oobabooga": { + "stars": 3, + "last_update": "2024-05-23 00:14:14", + "author_account_age_days": 4340 + }, + "https://github.com/YMC-GitHub/ymc-node-suite-comfyui": { + "stars": 16, + "last_update": "2024-05-22 21:15:51", + "author_account_age_days": 2710 + }, + "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": { + "stars": 14, + "last_update": "2024-05-22 20:48:23", + "author_account_age_days": 3771 + }, + "https://github.com/Yanick112/ComfyUI-ToSVG": { + "stars": 15, + "last_update": "2024-06-14 14:00:22", + "author_account_age_days": 829 + }, + "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI": { + "stars": 14, + "last_update": "2024-07-01 09:03:34", + "author_account_age_days": 801 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": { + "stars": 319, + "last_update": "2024-05-22 14:14:46", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": { + "stars": 18, + "last_update": "2024-06-14 07:06:15", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": { + "stars": 366, + "last_update": "2024-06-12 04:40:50", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": { + "stars": 575, + "last_update": "2024-05-22 14:14:18", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": { + "stars": 159, + "last_update": "2024-06-27 03:38:19", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": { + "stars": 68, + "last_update": "2024-05-22 14:14:03", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": { + "stars": 605, + "last_update": "2024-05-22 14:15:11", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": { + "stars": 1225, + "last_update": "2024-05-22 13:57:55", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": { + "stars": 181, + "last_update": "2024-06-30 08:41:40", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": { + "stars": 755, + "last_update": "2024-05-22 14:13:49", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": { + "stars": 44, + "last_update": "2024-05-22 13:40:58", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": { + "stars": 3, + "last_update": "2024-05-22 14:15:52", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": { + "stars": 61, + "last_update": "2024-06-14 12:02:55", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": { + "stars": 182, + "last_update": "2024-05-22 14:14:57", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": { + "stars": 95, + "last_update": "2024-05-22 13:40:44", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": { + "stars": 74, + "last_update": "2024-05-22 13:41:14", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": { + "stars": 84, + "last_update": "2024-05-31 12:03:55", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": { + "stars": 488, + "last_update": "2024-05-22 13:01:07", + "author_account_age_days": 355 + }, + "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": { + "stars": 1495, + "last_update": "2024-06-14 09:00:04", + "author_account_age_days": 355 + }, + "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ": { + "stars": 3, + "last_update": "2024-07-09 12:37:59", + "author_account_age_days": 1288 + }, + "https://github.com/ZaneA/ComfyUI-ImageReward": { + "stars": 22, + "last_update": "2024-07-01 21:25:12", + "author_account_age_days": 5555 + }, + "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": { + "stars": 2, + "last_update": "2024-06-23 19:19:40", + "author_account_age_days": 1209 + }, + "https://github.com/Zuellni/ComfyUI-Custom-Nodes": { + "stars": 44, + "last_update": "2023-09-19 12:11:26", + "author_account_age_days": 538 + }, + "https://github.com/Zuellni/ComfyUI-ExLlama": { + "stars": 101, + "last_update": "2024-06-26 14:01:12", + "author_account_age_days": 538 + }, + "https://github.com/Zuellni/ComfyUI-ExLlama-Nodes": { + "stars": 101, + "last_update": "2024-06-26 14:01:12", + "author_account_age_days": 538 + }, + "https://github.com/Zuellni/ComfyUI-PickScore-Nodes": { + "stars": 25, + "last_update": "2024-06-15 08:23:16", + "author_account_age_days": 538 + }, + "https://github.com/a1lazydog/ComfyUI-AudioScheduler": { + "stars": 92, + "last_update": "2024-06-14 11:02:32", + "author_account_age_days": 4817 + }, + "https://github.com/aburahamu/ComfyUI-IsNiceParts": { + "stars": 2, + "last_update": "2024-06-14 12:01:40", + "author_account_age_days": 88 + }, + "https://github.com/aburahamu/ComfyUI-RequestsPoster": { + "stars": 2, + "last_update": "2024-06-14 13:59:24", + "author_account_age_days": 88 + }, + "https://github.com/abyz22/image_control": { + "stars": 14, + "last_update": "2024-05-22 23:10:07", + "author_account_age_days": 178 + }, + "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": { + "stars": 4, + "last_update": "2024-05-22 23:24:45", + "author_account_age_days": 719 + }, + "https://github.com/adieyal/comfyui-dynamicprompts": { + "stars": 190, + "last_update": "2024-07-09 14:21:09", + "author_account_age_days": 5032 + }, + "https://github.com/adigayung/ComfyUI-Translator": { + "stars": 0, + "last_update": "2024-07-09 11:47:13", + "author_account_age_days": 228 + }, + "https://github.com/adriflex/ComfyUI_Blender_Texdiff": { + "stars": 1, + "last_update": "2024-05-22 23:14:18", + "author_account_age_days": 2237 + }, + "https://github.com/aegis72/aegisflow_utility_nodes": { + "stars": 24, + "last_update": "2024-05-22 22:10:29", + "author_account_age_days": 599 + }, + "https://github.com/aegis72/comfyui-styles-all": { + "stars": 34, + "last_update": "2024-05-22 22:10:41", + "author_account_age_days": 599 + }, + "https://github.com/ai-liam/comfyui-liam": { + "stars": 2, + "last_update": "2024-06-22 03:27:52", + "author_account_age_days": 1536 + }, + "https://github.com/ai-liam/comfyui_liam_util": { + "stars": 2, + "last_update": "2024-05-22 22:21:23", + "author_account_age_days": 1536 + }, + "https://github.com/aianimation55/ComfyUI-FatLabels": { + "stars": 4, + "last_update": "2024-05-22 21:26:01", + "author_account_age_days": 289 + }, + "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": { + "stars": 2, + "last_update": "2024-06-29 17:12:23", + "author_account_age_days": 945 + }, + "https://github.com/alessandrozonta/ComfyUI-CenterNode": { + "stars": 3, + "last_update": "2024-05-23 01:17:52", + "author_account_age_days": 1212 + }, + "https://github.com/alessandrozonta/ComfyUI-Layers": { + "stars": 28, + "last_update": "2024-06-14 09:04:36", + "author_account_age_days": 1212 + }, + "https://github.com/alessandrozonta/ComfyUI-OpenPose": { + "stars": 2, + "last_update": "2024-06-14 13:59:36", + "author_account_age_days": 1212 + }, + "https://github.com/alexopus/ComfyUI-Image-Saver": { + "stars": 31, + "last_update": "2024-06-29 19:31:28", + "author_account_age_days": 2695 + }, + "https://github.com/ali1234/comfyui-job-iterator": { + "stars": 64, + "last_update": "2024-05-22 20:54:21", + "author_account_age_days": 4875 + }, + "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": { + "stars": 38, + "last_update": "2024-06-29 16:19:33", + "author_account_age_days": 616 + }, + "https://github.com/alpertunga-bile/prompt-generator-comfyui": { + "stars": 66, + "last_update": "2024-07-01 09:08:11", + "author_account_age_days": 1288 + }, + "https://github.com/alsritter/asymmetric-tiling-comfyui": { + "stars": 14, + "last_update": "2024-05-22 20:43:07", + "author_account_age_days": 2009 + }, + "https://github.com/alt-key-project/comfyui-dream-project": { + "stars": 73, + "last_update": "2024-07-01 05:34:14", + "author_account_age_days": 675 + }, + "https://github.com/alt-key-project/comfyui-dream-video-batches": { + "stars": 53, + "last_update": "2024-07-01 05:37:03", + "author_account_age_days": 675 + }, + "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": { + "stars": 0, + "last_update": "2024-05-22 22:21:00", + "author_account_age_days": 204 + }, + "https://github.com/andersxa/comfyui-PromptAttention": { + "stars": 22, + "last_update": "2024-06-20 11:09:25", + "author_account_age_days": 2968 + }, + "https://github.com/angeloshredder/StableCascadeResizer": { + "stars": 2, + "last_update": "2024-05-23 00:12:55", + "author_account_age_days": 1844 + }, + "https://github.com/ansonkao/comfyui-geometry": { + "stars": 7, + "last_update": "2024-06-14 09:03:19", + "author_account_age_days": 361 + }, + "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": { + "stars": 9, + "last_update": "2024-05-28 14:44:16", + "author_account_age_days": 2878 + }, + "https://github.com/aria1th/ComfyUI-LogicUtils": { + "stars": 21, + "last_update": "2024-05-23 01:27:16", + "author_account_age_days": 2360 + }, + "https://github.com/asagi4/ComfyUI-Adaptive-Guidance": { + "stars": 5, + "last_update": "2024-07-03 13:54:53", + "author_account_age_days": 456 + }, + "https://github.com/asagi4/ComfyUI-CADS": { + "stars": 33, + "last_update": "2024-05-23 18:14:56", + "author_account_age_days": 456 + }, + "https://github.com/asagi4/comfyui-prompt-control": { + "stars": 166, + "last_update": "2024-06-20 13:48:26", + "author_account_age_days": 456 + }, + "https://github.com/asagi4/comfyui-utility-nodes": { + "stars": 7, + "last_update": "2024-05-25 11:40:49", + "author_account_age_days": 456 + }, + "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": { + "stars": 93, + "last_update": "2024-07-04 06:44:42", + "author_account_age_days": 2742 + }, + "https://github.com/atmaranto/ComfyUI-SaveAsScript": { + "stars": 52, + "last_update": "2024-06-14 09:01:17", + "author_account_age_days": 2364 + }, + "https://github.com/audioscavenger/ComfyUI-Thumbnails": { + "stars": 10, + "last_update": "2024-06-07 07:19:30", + "author_account_age_days": 4136 + }, + "https://github.com/audioscavenger/save-image-extended-comfyui": { + "stars": 21, + "last_update": "2024-06-27 18:28:01", + "author_account_age_days": 4136 + }, + "https://github.com/avatechai/avatar-graph-comfyui": { + "stars": 219, + "last_update": "2024-05-22 21:14:14", + "author_account_age_days": 869 + }, + "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": { + "stars": 5, + "last_update": "2024-06-12 15:04:39", + "author_account_age_days": 3574 + }, + "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": { + "stars": 2, + "last_update": "2024-05-22 23:16:28", + "author_account_age_days": 316 + }, + "https://github.com/badayvedat/ComfyUI-fal-Connector": { + "stars": 12, + "last_update": "2024-07-01 07:54:24", + "author_account_age_days": 1786 + }, + "https://github.com/badjeff/comfyui_lora_tag_loader": { + "stars": 43, + "last_update": "2024-05-22 20:40:03", + "author_account_age_days": 5378 + }, + "https://github.com/baicai99/ComfyUI-FrameSkipping": { + "stars": 6, + "last_update": "2024-06-18 10:25:55", + "author_account_age_days": 846 + }, + "https://github.com/banodoco/steerable-motion": { + "stars": 752, + "last_update": "2024-06-15 23:01:54", + "author_account_age_days": 417 + }, + "https://github.com/bash-j/mikey_nodes": { + "stars": 83, + "last_update": "2024-06-15 10:31:20", + "author_account_age_days": 4202 + }, + "https://github.com/bedovyy/ComfyUI_NAIDGenerator": { + "stars": 18, + "last_update": "2024-06-14 09:04:39", + "author_account_age_days": 378 + }, + "https://github.com/bilal-arikan/ComfyUI_TextAssets": { + "stars": 2, + "last_update": "2024-05-22 23:23:50", + "author_account_age_days": 3523 + }, + "https://github.com/bitaffinity/ComfyUI_HF_Inference": { + "stars": 0, + "last_update": "2024-06-14 10:23:29", + "author_account_age_days": 72 + }, + "https://github.com/blepping/ComfyUI-bleh": { + "stars": 31, + "last_update": "2024-05-22 23:17:49", + "author_account_age_days": 169 + }, + "https://github.com/blepping/ComfyUI-sonar": { + "stars": 31, + "last_update": "2024-05-22 23:18:26", + "author_account_age_days": 169 + }, + "https://github.com/blepping/comfyui_jankhidiffusion": { + "stars": 93, + "last_update": "2024-05-22 23:18:40", + "author_account_age_days": 169 + }, + "https://github.com/blueraincoatli/comfyUI_SillyNodes": { + "stars": 3, + "last_update": "2024-06-09 13:30:57", + "author_account_age_days": 328 + }, + "https://github.com/bluevisor/ComfyUI_PS_Blend_Node": { + "stars": 1, + "last_update": "2024-07-08 12:38:26", + "author_account_age_days": 4582 + }, + "https://github.com/bmad4ever/ComfyUI-Bmad-DirtyUndoRedo": { + "stars": 50, + "last_update": "2024-05-22 18:11:51", + "author_account_age_days": 3552 + }, + "https://github.com/bmad4ever/comfyui_ab_samplercustom": { + "stars": 5, + "last_update": "2024-06-21 00:02:39", + "author_account_age_days": 3552 + }, + "https://github.com/bmad4ever/comfyui_bmad_nodes": { + "stars": 48, + "last_update": "2024-06-13 10:42:09", + "author_account_age_days": 3552 + }, + "https://github.com/bmad4ever/comfyui_lists_cartesian_product": { + "stars": 3, + "last_update": "2024-05-22 20:18:07", + "author_account_age_days": 3552 + }, + "https://github.com/bmad4ever/comfyui_quilting": { + "stars": 3, + "last_update": "2024-07-09 17:19:48", + "author_account_age_days": 3552 + }, + "https://github.com/bmad4ever/comfyui_wfc_like": { + "stars": 5, + "last_update": "2024-06-02 23:06:37", + "author_account_age_days": 3552 + }, + "https://github.com/bobmagicii/comfykit-custom-nodes": { + "stars": 1, + "last_update": "2024-06-04 20:04:00", + "author_account_age_days": 4760 + }, + "https://github.com/bradsec/ComfyUI_ResolutionSelector": { + "stars": 8, + "last_update": "2024-07-07 12:15:49", + "author_account_age_days": 3671 + }, + "https://github.com/bradsec/ComfyUI_StringTools": { + "stars": 0, + "last_update": "2024-07-08 10:20:27", + "author_account_age_days": 3671 + }, + "https://github.com/braintacles/braintacles-comfyui-nodes": { + "stars": 1, + "last_update": "2024-05-23 06:06:16", + "author_account_age_days": 446 + }, + "https://github.com/brianfitzgerald/style_aligned_comfy": { + "stars": 259, + "last_update": "2024-05-30 14:23:40", + "author_account_age_days": 4255 + }, + "https://github.com/bronkula/comfyui-fitsize": { + "stars": 35, + "last_update": "2024-05-22 21:32:34", + "author_account_age_days": 5170 + }, + "https://github.com/bruefire/ComfyUI-SeqImageLoader": { + "stars": 28, + "last_update": "2024-06-08 15:48:49", + "author_account_age_days": 2381 + }, + "https://github.com/budihartono/comfyui_otonx_nodes": { + "stars": 1, + "last_update": "2024-05-25 04:10:08", + "author_account_age_days": 4701 + }, + "https://github.com/bvhari/ComfyUI_ImageProcessing": { + "stars": 18, + "last_update": "2024-05-22 18:08:40", + "author_account_age_days": 1190 + }, + "https://github.com/bvhari/ComfyUI_LatentToRGB": { + "stars": 11, + "last_update": "2024-06-23 11:37:10", + "author_account_age_days": 1190 + }, + "https://github.com/bvhari/ComfyUI_PerpWeight": { + "stars": 12, + "last_update": "2024-05-22 18:09:06", + "author_account_age_days": 1190 + }, + "https://github.com/bvhari/ComfyUI_SUNoise": { + "stars": 6, + "last_update": "2024-07-06 13:37:18", + "author_account_age_days": 1190 + }, + "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": { + "stars": 250, + "last_update": "2024-06-21 15:05:26", + "author_account_age_days": 1220 + }, + "https://github.com/cdb-boop/comfyui-image-round": { + "stars": 0, + "last_update": "2024-05-23 00:09:02", + "author_account_age_days": 1220 + }, + "https://github.com/celsojr2013/comfyui_jamworks_client": { + "stars": 0, + "last_update": "2024-06-23 12:35:44", + "author_account_age_days": 3414 + }, + "https://github.com/celsojr2013/comfyui_simpletools": { + "stars": 2, + "last_update": "2024-06-22 11:35:40", + "author_account_age_days": 3414 + }, + "https://github.com/cerspense/ComfyUI_cspnodes": { + "stars": 24, + "last_update": "2024-06-27 22:39:06", + "author_account_age_days": 2697 + }, + "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": { + "stars": 78, + "last_update": "2024-05-22 22:17:55", + "author_account_age_days": 1169 + }, + "https://github.com/chakib-belgaid/ComfyUI-autosize": { + "stars": 0, + "last_update": "2024-06-14 07:13:20", + "author_account_age_days": 3851 + }, + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": { + "stars": 0, + "last_update": "2024-07-01 12:40:52", + "author_account_age_days": 3851 + }, + "https://github.com/chandlergis/ComfyUI-IMG_Query": { + "stars": 1, + "last_update": "2024-05-23 01:25:57", + "author_account_age_days": 371 + }, + "https://github.com/chandlergis/ComfyUI_EmojiOverlay": { + "stars": 0, + "last_update": "2024-06-14 09:05:03", + "author_account_age_days": 371 + }, + "https://github.com/chaojie/ComfyUI-AniPortrait": { + "stars": 230, + "last_update": "2024-05-22 22:26:03", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": { + "stars": 16, + "last_update": "2024-06-14 09:07:23", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Champ": { + "stars": 19, + "last_update": "2024-05-22 22:26:47", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-DragAnything": { + "stars": 66, + "last_update": "2024-06-14 10:23:53", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-DragNUWA": { + "stars": 364, + "last_update": "2024-06-14 10:25:01", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-DynamiCrafter": { + "stars": 112, + "last_update": "2024-06-14 10:23:59", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-EasyAnimate": { + "stars": 39, + "last_update": "2024-05-22 22:24:00", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Gemma": { + "stars": 5, + "last_update": "2024-05-22 22:27:47", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-I2VGEN-XL": { + "stars": 27, + "last_update": "2024-06-14 09:06:10", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": { + "stars": 36, + "last_update": "2024-05-22 22:26:30", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-LaVIT": { + "stars": 10, + "last_update": "2024-06-14 10:27:44", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-LightGlue": { + "stars": 48, + "last_update": "2024-01-20 16:53:51", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": { + "stars": 201, + "last_update": "2024-06-10 20:16:06", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": { + "stars": 1, + "last_update": "2024-06-14 10:26:15", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-MotionCtrl": { + "stars": 128, + "last_update": "2024-06-14 10:26:02", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": { + "stars": 79, + "last_update": "2024-06-14 10:26:30", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-MuseTalk": { + "stars": 151, + "last_update": "2024-05-22 22:25:07", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-MuseV": { + "stars": 125, + "last_update": "2024-05-22 22:25:31", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Open-Sora": { + "stars": 88, + "last_update": "2024-05-22 22:26:59", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": { + "stars": 49, + "last_update": "2024-05-29 16:15:10", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Panda3d": { + "stars": 13, + "last_update": "2024-06-14 10:28:47", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Pymunk": { + "stars": 16, + "last_update": "2024-06-14 12:02:32", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-RAFT": { + "stars": 25, + "last_update": "2024-06-14 11:02:00", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-SimDA": { + "stars": 13, + "last_update": "2024-06-14 12:02:39", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Trajectory": { + "stars": 5, + "last_update": "2024-05-22 22:27:12", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": { + "stars": 17, + "last_update": "2024-06-14 10:28:16", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI-dust3r": { + "stars": 15, + "last_update": "2024-05-22 22:27:33", + "author_account_age_days": 4849 + }, + "https://github.com/chaojie/ComfyUI_StreamingT2V": { + "stars": 26, + "last_update": "2024-06-14 10:26:21", + "author_account_age_days": 4849 + }, + "https://github.com/chaosaiart/Chaosaiart-Nodes": { + "stars": 47, + "last_update": "2024-05-27 10:55:18", + "author_account_age_days": 349 + }, + "https://github.com/chenpx976/ComfyUI-RunRunRun": { + "stars": 0, + "last_update": "2024-05-23 01:19:37", + "author_account_age_days": 3430 + }, + "https://github.com/chesnokovivan/ComfyUI-Novakid": { + "stars": 0, + "last_update": "2024-06-10 20:15:56", + "author_account_age_days": 1545 + }, + "https://github.com/chflame163/ComfyUI_FaceSimilarity": { + "stars": 13, + "last_update": "2024-05-23 12:48:18", + "author_account_age_days": 459 + }, + "https://github.com/chflame163/ComfyUI_LayerStyle": { + "stars": 693, + "last_update": "2024-06-29 06:38:45", + "author_account_age_days": 459 + }, + "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": { + "stars": 23, + "last_update": "2024-05-25 02:39:56", + "author_account_age_days": 459 + }, + "https://github.com/chflame163/ComfyUI_WordCloud": { + "stars": 71, + "last_update": "2024-05-25 02:41:06", + "author_account_age_days": 459 + }, + "https://github.com/chibiace/ComfyUI-Chibi-Nodes": { + "stars": 30, + "last_update": "2024-05-22 21:16:12", + "author_account_age_days": 2864 + }, + "https://github.com/choey/Comfy-Topaz": { + "stars": 26, + "last_update": "2024-06-20 13:52:32", + "author_account_age_days": 5538 + }, + "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI": { + "stars": 7, + "last_update": "2024-06-29 19:13:44", + "author_account_age_days": 1812 + }, + "https://github.com/chrisfreilich/virtuoso-nodes": { + "stars": 50, + "last_update": "2024-06-30 18:26:54", + "author_account_age_days": 747 + }, + "https://github.com/chrisgoringe/cg-image-picker": { + "stars": 191, + "last_update": "2024-06-12 18:50:30", + "author_account_age_days": 4080 + }, + "https://github.com/chrisgoringe/cg-noise": { + "stars": 25, + "last_update": "2024-06-14 08:10:52", + "author_account_age_days": 4080 + }, + "https://github.com/chrisgoringe/cg-prompt-info": { + "stars": 27, + "last_update": "2024-05-22 21:07:33", + "author_account_age_days": 4080 + }, + "https://github.com/chrisgoringe/cg-use-everywhere": { + "stars": 360, + "last_update": "2024-07-01 05:43:31", + "author_account_age_days": 4080 + }, + "https://github.com/chrish-slingshot/CrasHUtils": { + "stars": 11, + "last_update": "2024-06-20 12:53:00", + "author_account_age_days": 616 + }, + "https://github.com/christian-byrne/audio-separation-nodes-comfyui": { + "stars": 34, + "last_update": "2024-07-09 05:00:46", + "author_account_age_days": 1364 + }, + "https://github.com/christian-byrne/comfyui-default-values-manager": { + "stars": 4, + "last_update": "2024-07-08 13:59:42", + "author_account_age_days": 1364 + }, + "https://github.com/christian-byrne/comfyui-search-navigation": { + "stars": 5, + "last_update": "2024-06-26 04:41:12", + "author_account_age_days": 1364 + }, + "https://github.com/christian-byrne/img2colors-comfyui-node": { + "stars": 5, + "last_update": "2024-06-24 07:26:35", + "author_account_age_days": 1364 + }, + "https://github.com/christian-byrne/img2txt-comfyui-nodes": { + "stars": 30, + "last_update": "2024-06-23 22:15:59", + "author_account_age_days": 1364 + }, + "https://github.com/christian-byrne/size-match-compositing-nodes": { + "stars": 3, + "last_update": "2024-06-23 21:00:23", + "author_account_age_days": 1364 + }, + "https://github.com/city96/ComfyUI_ColorMod": { + "stars": 43, + "last_update": "2024-05-22 18:06:19", + "author_account_age_days": 513 + }, + "https://github.com/city96/ComfyUI_DiT": { + "stars": 3, + "last_update": "2024-05-22 18:06:05", + "author_account_age_days": 513 + }, + "https://github.com/city96/ComfyUI_ExtraModels": { + "stars": 315, + "last_update": "2024-07-06 18:26:29", + "author_account_age_days": 513 + }, + "https://github.com/city96/ComfyUI_NetDist": { + "stars": 238, + "last_update": "2024-05-22 18:05:10", + "author_account_age_days": 513 + }, + "https://github.com/city96/SD-Advanced-Noise": { + "stars": 19, + "last_update": "2024-05-22 18:05:35", + "author_account_age_days": 513 + }, + "https://github.com/city96/SD-Latent-Interposer": { + "stars": 186, + "last_update": "2024-06-17 05:27:08", + "author_account_age_days": 513 + }, + "https://github.com/city96/SD-Latent-Upscaler": { + "stars": 115, + "last_update": "2024-05-22 18:05:50", + "author_account_age_days": 513 + }, + "https://github.com/civitai/comfy-nodes": { + "stars": 87, + "last_update": "2024-06-23 03:35:42", + "author_account_age_days": 614 + }, + "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": { + "stars": 1, + "last_update": "2024-06-14 09:03:10", + "author_account_age_days": 2716 + }, + "https://github.com/comfyanonymous/ComfyUI": { + "stars": 41626, + "last_update": "2024-07-09 21:12:57", + "author_account_age_days": 564 + }, + "https://github.com/comfyanonymous/ComfyUI_TensorRT": { + "stars": 345, + "last_update": "2024-06-19 21:31:56", + "author_account_age_days": 564 + }, + "https://github.com/comfyanonymous/ComfyUI_experiments": { + "stars": 139, + "last_update": "2024-05-22 15:29:49", + "author_account_age_days": 564 + }, + "https://github.com/concarne000/ConCarneNode": { + "stars": 4, + "last_update": "2024-05-22 22:10:18", + "author_account_age_days": 1916 + }, + "https://github.com/conquestace/ComfyUI-ImageUploader": { + "stars": 2, + "last_update": "2024-05-23 01:25:49", + "author_account_age_days": 4624 + }, + "https://github.com/coolzilj/ComfyUI-LJNodes": { + "stars": 59, + "last_update": "2024-06-15 01:57:32", + "author_account_age_days": 4678 + }, + "https://github.com/coolzilj/ComfyUI-Photopea": { + "stars": 60, + "last_update": "2024-06-14 08:10:57", + "author_account_age_days": 4678 + }, + "https://github.com/coreyryanhanson/ComfyQR": { + "stars": 51, + "last_update": "2024-07-05 04:13:09", + "author_account_age_days": 3071 + }, + "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": { + "stars": 9, + "last_update": "2024-07-05 03:55:48", + "author_account_age_days": 3071 + }, + "https://github.com/cozymantis/cozy-utils-comfyui-nodes": { + "stars": 3, + "last_update": "2024-07-07 15:38:05", + "author_account_age_days": 124 + }, + "https://github.com/cozymantis/human-parser-comfyui-node": { + "stars": 54, + "last_update": "2024-07-07 15:31:17", + "author_account_age_days": 124 + }, + "https://github.com/cozymantis/pose-generator-comfyui-node": { + "stars": 30, + "last_update": "2024-07-07 15:22:45", + "author_account_age_days": 124 + }, + "https://github.com/crystian/ComfyUI-Crystools": { + "stars": 511, + "last_update": "2024-07-01 03:24:20", + "author_account_age_days": 4132 + }, + "https://github.com/crystian/ComfyUI-Crystools-save": { + "stars": 31, + "last_update": "2024-07-01 01:19:58", + "author_account_age_days": 4132 + }, + "https://github.com/cubiq/ComfyUI_FaceAnalysis": { + "stars": 231, + "last_update": "2024-06-14 08:08:35", + "author_account_age_days": 5026 + }, + "https://github.com/cubiq/ComfyUI_IPAdapter_plus": { + "stars": 3218, + "last_update": "2024-06-28 11:03:36", + "author_account_age_days": 5026 + }, + "https://github.com/cubiq/ComfyUI_InstantID": { + "stars": 967, + "last_update": "2024-07-04 03:04:24", + "author_account_age_days": 5026 + }, + "https://github.com/cubiq/ComfyUI_SimpleMath": { + "stars": 17, + "last_update": "2024-06-14 09:02:50", + "author_account_age_days": 5026 + }, + "https://github.com/cubiq/ComfyUI_essentials": { + "stars": 355, + "last_update": "2024-07-08 17:19:58", + "author_account_age_days": 5026 + }, + "https://github.com/cubiq/PuLID_ComfyUI": { + "stars": 435, + "last_update": "2024-06-25 06:37:25", + "author_account_age_days": 5026 + }, + "https://github.com/cuongloveit/comfy_http_request": { + "stars": 0, + "last_update": "2024-06-14 11:00:11", + "author_account_age_days": 3267 + }, + "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": { + "stars": 4, + "last_update": "2024-05-28 13:09:32", + "author_account_age_days": 1945 + }, + "https://github.com/czcz1024/Comfyui-FaceCompare": { + "stars": 0, + "last_update": "2024-06-14 07:13:32", + "author_account_age_days": 4249 + }, + "https://github.com/da2el-ai/ComfyUI-d2-size-selector": { + "stars": 2, + "last_update": "2024-05-23 01:16:17", + "author_account_age_days": 405 + }, + "https://github.com/da2el-ai/ComfyUI-d2-steps": { + "stars": 5, + "last_update": "2024-05-23 01:16:06", + "author_account_age_days": 405 + }, + "https://github.com/dagthomas/comfyui_dagthomas": { + "stars": 83, + "last_update": "2024-07-07 16:56:46", + "author_account_age_days": 4087 + }, + "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": { + "stars": 168, + "last_update": "2024-07-08 21:59:15", + "author_account_age_days": 2420 + }, + "https://github.com/daniel-lewis-ab/ComfyUI-Llama": { + "stars": 26, + "last_update": "2024-06-29 19:55:42", + "author_account_age_days": 3367 + }, + "https://github.com/daniel-lewis-ab/ComfyUI-TTS": { + "stars": 13, + "last_update": "2024-06-14 08:09:49", + "author_account_age_days": 3367 + }, + "https://github.com/darkpixel/darkprompts": { + "stars": 6, + "last_update": "2024-05-23 19:48:02", + "author_account_age_days": 5339 + }, + "https://github.com/dave-palt/comfyui_DSP_imagehelpers": { + "stars": 0, + "last_update": "2024-05-22 23:12:11", + "author_account_age_days": 173 + }, + "https://github.com/daxcay/ComfyUI-DRMN": { + "stars": 19, + "last_update": "2024-07-08 08:25:29", + "author_account_age_days": 110 + }, + "https://github.com/daxcay/ComfyUI-DataSet": { + "stars": 19, + "last_update": "2024-07-08 08:25:29", + "author_account_age_days": 110 + }, + "https://github.com/daxcay/ComfyUI-JDCN": { + "stars": 66, + "last_update": "2024-07-08 14:02:49", + "author_account_age_days": 110 + }, + "https://github.com/daxcay/ComfyUI-NODEJS": { + "stars": 5, + "last_update": "2024-06-13 14:30:45", + "author_account_age_days": 110 + }, + "https://github.com/daxthin/DZ-FaceDetailer": { + "stars": 102, + "last_update": "2024-06-17 10:00:30", + "author_account_age_days": 1246 + }, + "https://github.com/dchatel/comfyui_facetools": { + "stars": 46, + "last_update": "2024-06-26 10:26:43", + "author_account_age_days": 4551 + }, + "https://github.com/denfrost/Den_ComfyUI_Workflow": { + "stars": 4, + "last_update": "2024-06-20 14:57:57", + "author_account_age_days": 3512 + }, + "https://github.com/deroberon/StableZero123-comfyui": { + "stars": 136, + "last_update": "2024-05-22 22:09:53", + "author_account_age_days": 5311 + }, + "https://github.com/deroberon/demofusion-comfyui": { + "stars": 83, + "last_update": "2024-05-22 22:09:42", + "author_account_age_days": 5311 + }, + "https://github.com/dfl/comfyui-clip-with-break": { + "stars": 10, + "last_update": "2024-05-22 23:23:15", + "author_account_age_days": 5990 + }, + "https://github.com/dfl/comfyui-tcd-scheduler": { + "stars": 80, + "last_update": "2024-05-22 23:23:28", + "author_account_age_days": 5990 + }, + "https://github.com/diStyApps/ComfyUI_FrameMaker": { + "stars": 10, + "last_update": "2024-05-23 00:11:33", + "author_account_age_days": 4220 + }, + "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes": { + "stars": 4, + "last_update": "2024-06-29 21:27:03", + "author_account_age_days": 4006 + }, + "https://github.com/digitaljohn/comfyui-propost": { + "stars": 109, + "last_update": "2024-07-02 15:28:37", + "author_account_age_days": 4533 + }, + "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": { + "stars": 170, + "last_update": "2024-07-06 10:15:30", + "author_account_age_days": 3430 + }, + "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": { + "stars": 61, + "last_update": "2024-06-20 16:48:44", + "author_account_age_days": 4786 + }, + "https://github.com/discopixel-studio/comfyui-discopixel": { + "stars": 7, + "last_update": "2024-06-14 09:03:19", + "author_account_age_days": 361 + }, + "https://github.com/discus0434/comfyui-aesthetic-predictor-v2-5": { + "stars": 5, + "last_update": "2024-06-14 08:12:05", + "author_account_age_days": 1485 + }, + "https://github.com/discus0434/comfyui-caching-embeddings": { + "stars": 1, + "last_update": "2024-06-14 08:59:36", + "author_account_age_days": 1485 + }, + "https://github.com/djbielejeski/a-person-mask-generator": { + "stars": 240, + "last_update": "2024-06-15 04:06:44", + "author_account_age_days": 4299 + }, + "https://github.com/dmMaze/sketch2manga": { + "stars": 27, + "last_update": "2024-06-30 03:27:55", + "author_account_age_days": 1865 + }, + "https://github.com/dmarx/ComfyUI-AudioReactive": { + "stars": 10, + "last_update": "2024-05-22 22:12:53", + "author_account_age_days": 4520 + }, + "https://github.com/dmarx/ComfyUI-Keyframed": { + "stars": 81, + "last_update": "2024-07-01 01:41:23", + "author_account_age_days": 4520 + }, + "https://github.com/drago87/ComfyUI_Dragos_Nodes": { + "stars": 3, + "last_update": "2024-05-22 21:32:15", + "author_account_age_days": 3785 + }, + "https://github.com/drustan-hawk/primitive-types": { + "stars": 5, + "last_update": "2024-06-30 06:10:23", + "author_account_age_days": 304 + }, + "https://github.com/e7mac/ComfyUI-ShadertoyGL": { + "stars": 2, + "last_update": "2024-06-20 14:52:42", + "author_account_age_days": 4819 + }, + "https://github.com/ealkanat/comfyui_easy_padding": { + "stars": 13, + "last_update": "2024-05-22 21:58:52", + "author_account_age_days": 2478 + }, + "https://github.com/edenartlab/eden_comfy_pipelines": { + "stars": 40, + "last_update": "2024-07-08 09:44:46", + "author_account_age_days": 288 + }, + "https://github.com/evanspearman/ComfyMath": { + "stars": 55, + "last_update": "2023-08-27 03:29:04", + "author_account_age_days": 4254 + }, + "https://github.com/exdysa/comfyui-selector": { + "stars": 3, + "last_update": "2024-07-04 01:38:33", + "author_account_age_days": 1011 + }, + "https://github.com/fablestudio/ComfyUI-Showrunner-Utils": { + "stars": 0, + "last_update": "2024-06-24 14:27:05", + "author_account_age_days": 2064 + }, + "https://github.com/failfa-st/failfast-comfyui-extensions": { + "stars": 134, + "last_update": "2024-06-17 10:01:12", + "author_account_age_days": 289 + }, + "https://github.com/fexli/fexli-util-node-comfyui": { + "stars": 3, + "last_update": "2024-05-22 21:27:36", + "author_account_age_days": 1574 + }, + "https://github.com/fexploit/ComfyUI-AutoLabel": { + "stars": 6, + "last_update": "2024-06-14 08:09:41", + "author_account_age_days": 5059 + }, + "https://github.com/fexploit/ComfyUI-AutoTrimBG": { + "stars": 2, + "last_update": "2024-05-24 20:38:15", + "author_account_age_days": 5059 + }, + "https://github.com/fexploit/ComfyUI-Classifier": { + "stars": 1, + "last_update": "2024-06-14 16:58:31", + "author_account_age_days": 5059 + }, + "https://github.com/filipemeneses/comfy_pixelization": { + "stars": 31, + "last_update": "2024-05-22 20:59:16", + "author_account_age_days": 3492 + }, + "https://github.com/filliptm/ComfyUI_Fill-Nodes": { + "stars": 120, + "last_update": "2024-07-09 05:50:58", + "author_account_age_days": 1752 + }, + "https://github.com/florestefano1975/ComfyUI-HiDiffusion": { + "stars": 135, + "last_update": "2024-05-22 00:33:06", + "author_account_age_days": 209 + }, + "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": { + "stars": 2, + "last_update": "2024-06-14 09:05:46", + "author_account_age_days": 209 + }, + "https://github.com/florestefano1975/comfyui-portrait-master": { + "stars": 774, + "last_update": "2024-06-19 16:30:07", + "author_account_age_days": 209 + }, + "https://github.com/florestefano1975/comfyui-prompt-composer": { + "stars": 214, + "last_update": "2024-05-22 00:34:06", + "author_account_age_days": 209 + }, + "https://github.com/flowtyone/ComfyUI-Flowty-CRM": { + "stars": 128, + "last_update": "2024-06-14 10:23:09", + "author_account_age_days": 289 + }, + "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": { + "stars": 168, + "last_update": "2024-06-14 09:04:51", + "author_account_age_days": 289 + }, + "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": { + "stars": 369, + "last_update": "2024-06-16 00:53:22", + "author_account_age_days": 289 + }, + "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": { + "stars": 8, + "last_update": "2024-05-22 18:07:19", + "author_account_age_days": 3510 + }, + "https://github.com/fmatray/ComfyUI_BattlemapGrid": { + "stars": 0, + "last_update": "2024-06-05 22:35:06", + "author_account_age_days": 3637 + }, + "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": { + "stars": 12, + "last_update": "2024-06-20 11:51:50", + "author_account_age_days": 5123 + }, + "https://github.com/fofr/ComfyUI-Prompter-fofrAI": { + "stars": 35, + "last_update": "2024-06-29 22:10:29", + "author_account_age_days": 5123 + }, + "https://github.com/fofr/comfyui-replicate": { + "stars": 34, + "last_update": "2024-07-02 17:58:30", + "author_account_age_days": 1624 + }, + "https://github.com/forever22777/comfyui-self-guidance": { + "stars": 6, + "last_update": "2024-06-14 07:12:02", + "author_account_age_days": 340 + }, + "https://github.com/foxtrot-roger/comfyui-rf-nodes": { + "stars": 1, + "last_update": "2024-05-22 23:09:13", + "author_account_age_days": 2336 + }, + "https://github.com/frankchieng/ComfyUI_Aniportrait": { + "stars": 48, + "last_update": "2024-06-26 03:06:51", + "author_account_age_days": 456 + }, + "https://github.com/frankchieng/ComfyUI_MagicClothing": { + "stars": 426, + "last_update": "2024-06-24 07:48:07", + "author_account_age_days": 456 + }, + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": { + "stars": 10, + "last_update": "2024-06-26 03:13:32", + "author_account_age_days": 456 + }, + "https://github.com/fsdymy1024/ComfyUI_fsdymy": { + "stars": 6, + "last_update": "2024-07-01 17:58:52", + "author_account_age_days": 2221 + }, + "https://github.com/gemell1/ComfyUI_GMIC": { + "stars": 6, + "last_update": "2024-05-22 21:28:51", + "author_account_age_days": 1972 + }, + "https://github.com/get-salt-AI/SaltAI": { + "stars": 61, + "last_update": "2024-06-26 00:32:47", + "author_account_age_days": 131 + }, + "https://github.com/get-salt-AI/SaltAI_AudioViz": { + "stars": 13, + "last_update": "2024-06-29 16:16:46", + "author_account_age_days": 131 + }, + "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": { + "stars": 19, + "last_update": "2024-06-25 23:49:29", + "author_account_age_days": 131 + }, + "https://github.com/get-salt-AI/SaltAI_LlamaIndex": { + "stars": 19, + "last_update": "2024-06-25 23:49:29", + "author_account_age_days": 131 + }, + "https://github.com/ginlov/segment_to_mask_comfyui": { + "stars": 1, + "last_update": "2024-06-14 10:23:23", + "author_account_age_days": 2027 + }, + "https://github.com/giriss/comfy-image-saver": { + "stars": 151, + "last_update": "2024-05-22 20:40:55", + "author_account_age_days": 4253 + }, + "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": { + "stars": 0, + "last_update": "2024-05-23 01:20:09", + "author_account_age_days": 3918 + }, + "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": { + "stars": 0, + "last_update": "2024-05-23 01:19:47", + "author_account_age_days": 3918 + }, + "https://github.com/githubYiheng/comfyui_kmeans_filter": { + "stars": 0, + "last_update": "2024-06-14 09:01:24", + "author_account_age_days": 3918 + }, + "https://github.com/githubYiheng/comfyui_meanshift_filter": { + "stars": 0, + "last_update": "2024-06-14 10:59:43", + "author_account_age_days": 3918 + }, + "https://github.com/githubYiheng/comfyui_private_postprocessor": { + "stars": 0, + "last_update": "2024-06-14 08:09:39", + "author_account_age_days": 3918 + }, + "https://github.com/glibsonoran/Plush-for-ComfyUI": { + "stars": 111, + "last_update": "2024-07-07 15:47:16", + "author_account_age_days": 2513 + }, + "https://github.com/glifxyz/ComfyUI-GlifNodes": { + "stars": 18, + "last_update": "2024-07-05 12:12:47", + "author_account_age_days": 589 + }, + "https://github.com/glowcone/comfyui-base64-to-image": { + "stars": 8, + "last_update": "2024-07-08 22:53:25", + "author_account_age_days": 3761 + }, + "https://github.com/godspede/ComfyUI_Substring": { + "stars": 0, + "last_update": "2024-07-01 01:05:38", + "author_account_age_days": 3128 + }, + "https://github.com/gokayfem/ComfyUI-Depth-Visualization": { + "stars": 49, + "last_update": "2024-05-21 00:37:05", + "author_account_age_days": 1073 + }, + "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": { + "stars": 66, + "last_update": "2024-05-21 00:36:50", + "author_account_age_days": 1073 + }, + "https://github.com/gokayfem/ComfyUI-Texture-Simple": { + "stars": 30, + "last_update": "2024-05-21 00:19:53", + "author_account_age_days": 1073 + }, + "https://github.com/gokayfem/ComfyUI_VLM_nodes": { + "stars": 298, + "last_update": "2024-07-04 01:40:04", + "author_account_age_days": 1073 + }, + "https://github.com/gonzalu/ComfyUI_YFG_Comical": { + "stars": 20, + "last_update": "2024-07-02 02:05:08", + "author_account_age_days": 2476 + }, + "https://github.com/griptape-ai/ComfyUI-Griptape": { + "stars": 50, + "last_update": "2024-07-09 23:19:26", + "author_account_age_days": 536 + }, + "https://github.com/guill/abracadabra-comfyui": { + "stars": 1, + "last_update": "2024-06-14 08:12:07", + "author_account_age_days": 4208 + }, + "https://github.com/guoyk93/yk-node-suite-comfyui": { + "stars": 10, + "last_update": "2024-06-17 10:00:36", + "author_account_age_days": 1504 + }, + "https://github.com/hackkhai/ComfyUI-Image-Matting": { + "stars": 15, + "last_update": "2024-06-20 11:25:12", + "author_account_age_days": 1866 + }, + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": { + "stars": 0, + "last_update": "2024-07-08 22:02:55", + "author_account_age_days": 121 + }, + "https://github.com/hay86/ComfyUI_AceNodes": { + "stars": 9, + "last_update": "2024-07-02 08:17:41", + "author_account_age_days": 4682 + }, + "https://github.com/hay86/ComfyUI_DDColor": { + "stars": 2, + "last_update": "2024-06-14 08:12:13", + "author_account_age_days": 4682 + }, + "https://github.com/hay86/ComfyUI_Dreamtalk": { + "stars": 8, + "last_update": "2024-07-02 08:15:01", + "author_account_age_days": 4682 + }, + "https://github.com/hay86/ComfyUI_Hallo": { + "stars": 19, + "last_update": "2024-07-02 08:19:11", + "author_account_age_days": 4682 + }, + "https://github.com/hay86/ComfyUI_MiniCPM-V": { + "stars": 10, + "last_update": "2024-07-02 08:09:38", + "author_account_age_days": 4682 + }, + "https://github.com/hay86/ComfyUI_OpenVoice": { + "stars": 7, + "last_update": "2024-07-02 08:16:20", + "author_account_age_days": 4682 + }, + "https://github.com/hayden-fr/ComfyUI-Image-Browsing": { + "stars": 2, + "last_update": "2024-05-22 20:54:07", + "author_account_age_days": 1952 + }, + "https://github.com/hayden-fr/ComfyUI-Model-Manager": { + "stars": 26, + "last_update": "2024-05-22 20:53:55", + "author_account_age_days": 1952 + }, + "https://github.com/hben35096/ComfyUI-ToolBox": { + "stars": 0, + "last_update": "2024-06-26 18:27:22", + "author_account_age_days": 363 + }, + "https://github.com/heshengtao/comfyui_LLM_party": { + "stars": 177, + "last_update": "2024-07-09 17:00:35", + "author_account_age_days": 2910 + }, + "https://github.com/hhhzzyang/Comfyui_Lama": { + "stars": 39, + "last_update": "2024-05-22 21:13:19", + "author_account_age_days": 522 + }, + "https://github.com/hiforce/comfyui-hiforce-plugin": { + "stars": 3, + "last_update": "2024-06-14 08:13:24", + "author_account_age_days": 1817 + }, + "https://github.com/hinablue/ComfyUI_3dPoseEditor": { + "stars": 127, + "last_update": "2024-06-21 17:38:40", + "author_account_age_days": 5127 + }, + "https://github.com/holchan/ComfyUI-ModelDownloader": { + "stars": 2, + "last_update": "2024-06-14 08:59:42", + "author_account_age_days": 1607 + }, + "https://github.com/huagetai/ComfyUI-Gaffer": { + "stars": 36, + "last_update": "2024-06-19 00:58:38", + "author_account_age_days": 4647 + }, + "https://github.com/huagetai/ComfyUI_LightGradient": { + "stars": 8, + "last_update": "2024-05-23 01:21:27", + "author_account_age_days": 4647 + }, + "https://github.com/huchenlei/ComfyUI-IC-Light-Native": { + "stars": 415, + "last_update": "2024-06-21 21:49:44", + "author_account_age_days": 2891 + }, + "https://github.com/huchenlei/ComfyUI-layerdiffuse": { + "stars": 1293, + "last_update": "2024-07-05 12:52:34", + "author_account_age_days": 2891 + }, + "https://github.com/huchenlei/ComfyUI-openpose-editor": { + "stars": 27, + "last_update": "2024-06-26 21:15:34", + "author_account_age_days": 2891 + }, + "https://github.com/huchenlei/ComfyUI_DanTagGen": { + "stars": 50, + "last_update": "2024-06-21 21:46:47", + "author_account_age_days": 2891 + }, + "https://github.com/huchenlei/ComfyUI_densediffusion": { + "stars": 86, + "last_update": "2024-06-11 00:39:28", + "author_account_age_days": 2891 + }, + "https://github.com/huchenlei/ComfyUI_omost": { + "stars": 347, + "last_update": "2024-06-26 21:16:52", + "author_account_age_days": 2891 + }, + "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": { + "stars": 6, + "last_update": "2024-06-14 09:04:25", + "author_account_age_days": 5656 + }, + "https://github.com/humgate/simplecomfy": { + "stars": 0, + "last_update": "2024-06-14 08:58:21", + "author_account_age_days": 1382 + }, + "https://github.com/hustille/ComfyUI_Fooocus_KSampler": { + "stars": 60, + "last_update": "2024-05-22 20:39:48", + "author_account_age_days": 455 + }, + "https://github.com/hustille/ComfyUI_hus_utils": { + "stars": 6, + "last_update": "2024-05-22 20:39:34", + "author_account_age_days": 455 + }, + "https://github.com/hwhaocool/ComfyUI-Select-Any": { + "stars": 3, + "last_update": "2024-07-03 14:16:01", + "author_account_age_days": 2903 + }, + "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo": { + "stars": 8, + "last_update": "2024-06-28 04:43:18", + "author_account_age_days": 3928 + }, + "https://github.com/hyunamy/comfy-ui-on-complete-email-me": { + "stars": 1, + "last_update": "2024-07-01 18:44:18", + "author_account_age_days": 3126 + }, + "https://github.com/iFREEGROUP/comfyui-undistort": { + "stars": 2, + "last_update": "2024-06-14 08:59:52", + "author_account_age_days": 1572 + }, + "https://github.com/icesun963/ComfyUI_HFDownLoad": { + "stars": 0, + "last_update": "2024-06-14 08:59:58", + "author_account_age_days": 4121 + }, + "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": { + "stars": 101, + "last_update": "2024-06-20 15:56:56", + "author_account_age_days": 3065 + }, + "https://github.com/iemesowum/ComfyUI_IsaacNodes": { + "stars": 0, + "last_update": "2024-06-14 09:00:05", + "author_account_age_days": 5307 + }, + "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": { + "stars": 10, + "last_update": "2024-07-07 09:55:48", + "author_account_age_days": 2877 + }, + "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": { + "stars": 28, + "last_update": "2024-05-22 22:02:55", + "author_account_age_days": 2877 + }, + "https://github.com/if-ai/ComfyUI-IF_AI_tools": { + "stars": 384, + "last_update": "2024-06-26 13:16:20", + "author_account_age_days": 2877 + }, + "https://github.com/imb101/ComfyUI-FaceSwap": { + "stars": 28, + "last_update": "2024-05-22 18:22:29", + "author_account_age_days": 904 + }, + "https://github.com/iwanders/ComfyUI_nodes": { + "stars": 0, + "last_update": "2024-07-07 16:30:05", + "author_account_age_days": 4441 + }, + "https://github.com/jags111/ComfyUI_Jags_Audiotools": { + "stars": 38, + "last_update": "2024-05-19 18:54:12", + "author_account_age_days": 3886 + }, + "https://github.com/jags111/ComfyUI_Jags_VectorMagic": { + "stars": 52, + "last_update": "2024-05-19 18:49:42", + "author_account_age_days": 3886 + }, + "https://github.com/jags111/efficiency-nodes-comfyui": { + "stars": 735, + "last_update": "2024-06-23 09:42:43", + "author_account_age_days": 3886 + }, + "https://github.com/jakechai/ComfyUI-JakeUpgrade": { + "stars": 6, + "last_update": "2024-07-07 09:22:17", + "author_account_age_days": 1587 + }, + "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": { + "stars": 0, + "last_update": "2024-05-22 23:19:02", + "author_account_age_days": 992 + }, + "https://github.com/jamesWalker55/comfyui-p2ldgan": { + "stars": 12, + "last_update": "2024-05-22 18:19:04", + "author_account_age_days": 2542 + }, + "https://github.com/jamesWalker55/comfyui-various": { + "stars": 33, + "last_update": "2024-05-22 18:19:17", + "author_account_age_days": 2542 + }, + "https://github.com/jax-explorer/fast_video_comfyui": { + "stars": 0, + "last_update": "2024-05-23 01:17:35", + "author_account_age_days": 592 + }, + "https://github.com/jeffy5/comfyui-faceless-node": { + "stars": 20, + "last_update": "2024-06-14 04:11:28", + "author_account_age_days": 2946 + }, + "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": { + "stars": 107, + "last_update": "2024-05-23 02:40:36", + "author_account_age_days": 3667 + }, + "https://github.com/jiaxiangc/ComfyUI-ResAdapter": { + "stars": 271, + "last_update": "2024-05-23 00:22:23", + "author_account_age_days": 1301 + }, + "https://github.com/jitcoder/lora-info": { + "stars": 46, + "last_update": "2024-06-20 13:04:19", + "author_account_age_days": 4056 + }, + "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": { + "stars": 4, + "last_update": "2024-05-22 20:44:56", + "author_account_age_days": 3664 + }, + "https://github.com/jkrauss82/ultools-comfyui": { + "stars": 5, + "last_update": "2024-06-23 15:33:07", + "author_account_age_days": 4227 + }, + "https://github.com/jmkl/ComfyUI-ricing": { + "stars": 9, + "last_update": "2024-05-22 20:54:35", + "author_account_age_days": 4612 + }, + "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": { + "stars": 113, + "last_update": "2024-07-08 19:16:55", + "author_account_age_days": 4813 + }, + "https://github.com/jordoh/ComfyUI-Deepface": { + "stars": 12, + "last_update": "2024-07-08 14:25:46", + "author_account_age_days": 5009 + }, + "https://github.com/jroc22/ComfyUI-CSV-prompt-builder": { + "stars": 2, + "last_update": "2024-07-03 01:20:35", + "author_account_age_days": 705 + }, + "https://github.com/jtrue/ComfyUI-JaRue": { + "stars": 6, + "last_update": "2024-06-14 09:01:12", + "author_account_age_days": 3945 + }, + "https://github.com/jtydhr88/ComfyUI-LayerDivider": { + "stars": 50, + "last_update": "2024-07-06 01:43:45", + "author_account_age_days": 4768 + }, + "https://github.com/jtydhr88/ComfyUI-Unique3D": { + "stars": 123, + "last_update": "2024-07-04 04:27:01", + "author_account_age_days": 4768 + }, + "https://github.com/jtydhr88/ComfyUI-Workflow-Encrypt": { + "stars": 16, + "last_update": "2024-06-28 03:16:19", + "author_account_age_days": 4768 + }, + "https://github.com/juehackr/comfyui_fk_server": { + "stars": 52, + "last_update": "2024-07-08 02:48:37", + "author_account_age_days": 1127 + }, + "https://github.com/justUmen/Bjornulf_custom_nodes": { + "stars": 0, + "last_update": "2024-07-06 10:05:31", + "author_account_age_days": 2804 + }, + "https://github.com/ka-puna/comfyui-yanc": { + "stars": 6, + "last_update": "2024-05-22 21:29:37", + "author_account_age_days": 2222 + }, + "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": { + "stars": 2, + "last_update": "2024-06-03 13:20:01", + "author_account_age_days": 1282 + }, + "https://github.com/kadirnar/ComfyUI-Transformers": { + "stars": 19, + "last_update": "2024-06-22 22:44:39", + "author_account_age_days": 2345 + }, + "https://github.com/kadirnar/ComfyUI-YOLO": { + "stars": 18, + "last_update": "2024-07-08 18:33:07", + "author_account_age_days": 2345 + }, + "https://github.com/kale4eat/ComfyUI-path-util": { + "stars": 0, + "last_update": "2024-05-25 05:44:11", + "author_account_age_days": 1627 + }, + "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": { + "stars": 7, + "last_update": "2024-05-23 00:25:02", + "author_account_age_days": 1627 + }, + "https://github.com/kale4eat/ComfyUI-string-util": { + "stars": 1, + "last_update": "2024-05-23 00:24:40", + "author_account_age_days": 1627 + }, + "https://github.com/kale4eat/ComfyUI-text-file-util": { + "stars": 0, + "last_update": "2024-05-23 00:24:51", + "author_account_age_days": 1627 + }, + "https://github.com/katalist-ai/comfyUI-nsfw-detection": { + "stars": 1, + "last_update": "2024-05-23 01:23:32", + "author_account_age_days": 769 + }, + "https://github.com/kealiu/ComfyUI-S3-Tools": { + "stars": 2, + "last_update": "2024-07-04 10:13:07", + "author_account_age_days": 4143 + }, + "https://github.com/kealiu/ComfyUI-Zero123-Porting": { + "stars": 14, + "last_update": "2024-07-04 10:11:13", + "author_account_age_days": 4143 + }, + "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": { + "stars": 133, + "last_update": "2024-07-04 10:12:32", + "author_account_age_days": 4143 + }, + "https://github.com/kenjiqq/qq-nodes-comfyui": { + "stars": 23, + "last_update": "2024-05-22 21:34:53", + "author_account_age_days": 4905 + }, + "https://github.com/kft334/Knodes": { + "stars": 3, + "last_update": "2024-06-14 08:12:06", + "author_account_age_days": 974 + }, + "https://github.com/kijai/ComfyUI-ADMotionDirector": { + "stars": 132, + "last_update": "2024-06-19 09:13:35", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-APISR-KJ": { + "stars": 56, + "last_update": "2024-05-21 16:30:21", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": { + "stars": 113, + "last_update": "2024-06-20 12:15:16", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-CCSR": { + "stars": 157, + "last_update": "2024-06-28 11:13:33", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-DDColor": { + "stars": 81, + "last_update": "2024-05-21 16:04:26", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-DepthAnythingV2": { + "stars": 121, + "last_update": "2024-06-28 20:46:46", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-DiffusionLight": { + "stars": 51, + "last_update": "2024-05-21 16:16:52", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": { + "stars": 510, + "last_update": "2024-07-09 13:16:42", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-ELLA-wrapper": { + "stars": 104, + "last_update": "2024-05-21 16:47:28", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-Florence2": { + "stars": 328, + "last_update": "2024-07-09 15:18:00", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-Geowizard": { + "stars": 83, + "last_update": "2024-05-28 14:08:34", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-IC-Light": { + "stars": 483, + "last_update": "2024-06-19 09:18:06", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-KJNodes": { + "stars": 363, + "last_update": "2024-07-07 16:28:35", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper": { + "stars": 238, + "last_update": "2024-07-07 22:56:24", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": { + "stars": 19, + "last_update": "2024-05-21 16:41:18", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-LivePortraitKJ": { + "stars": 514, + "last_update": "2024-07-09 22:17:30", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-LuminaWrapper": { + "stars": 162, + "last_update": "2024-06-28 16:33:51", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-Marigold": { + "stars": 399, + "last_update": "2024-06-19 09:10:03", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-MimicMotionWrapper": { + "stars": 126, + "last_update": "2024-07-08 11:18:03", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-OpenDiTWrapper": { + "stars": 33, + "last_update": "2024-07-03 14:59:13", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-SUPIR": { + "stars": 1240, + "last_update": "2024-07-06 23:45:09", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-SVD": { + "stars": 152, + "last_update": "2024-05-22 21:09:54", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-depth-fm": { + "stars": 54, + "last_update": "2024-05-22 21:10:15", + "author_account_age_days": 2198 + }, + "https://github.com/kijai/ComfyUI-moondream": { + "stars": 81, + "last_update": "2024-05-22 21:10:33", + "author_account_age_days": 2198 + }, + "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": { + "stars": 23, + "last_update": "2024-05-22 21:25:13", + "author_account_age_days": 484 + }, + "https://github.com/kinfolk0117/ComfyUI_Pilgram": { + "stars": 7, + "last_update": "2024-05-22 21:25:24", + "author_account_age_days": 484 + }, + "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": { + "stars": 35, + "last_update": "2024-05-22 21:25:01", + "author_account_age_days": 484 + }, + "https://github.com/klinter007/klinter_nodes": { + "stars": 6, + "last_update": "2024-06-25 05:15:24", + "author_account_age_days": 441 + }, + "https://github.com/knuknX/ComfyUI-Image-Tools": { + "stars": 3, + "last_update": "2024-06-14 09:05:58", + "author_account_age_days": 215 + }, + "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": { + "stars": 150, + "last_update": "2024-05-22 20:44:44", + "author_account_age_days": 1824 + }, + "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": { + "stars": 3, + "last_update": "2024-05-22 21:34:27", + "author_account_age_days": 598 + }, + "https://github.com/komojini/komojini-comfyui-nodes": { + "stars": 65, + "last_update": "2024-05-22 21:34:39", + "author_account_age_days": 598 + }, + "https://github.com/kunieone/ComfyUI_alkaid": { + "stars": 0, + "last_update": "2024-05-23 01:10:21", + "author_account_age_days": 2535 + }, + "https://github.com/kwaroran/abg-comfyui": { + "stars": 22, + "last_update": "2024-05-22 18:19:51", + "author_account_age_days": 623 + }, + "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": { + "stars": 2, + "last_update": "2024-06-22 16:53:47", + "author_account_age_days": 1182 + }, + "https://github.com/laksjdjf/Batch-Condition-ComfyUI": { + "stars": 1, + "last_update": "2024-05-22 20:42:42", + "author_account_age_days": 2846 + }, + "https://github.com/laksjdjf/LCMSampler-ComfyUI": { + "stars": 15, + "last_update": "2024-05-22 20:42:17", + "author_account_age_days": 2846 + }, + "https://github.com/laksjdjf/LoRTnoC-ComfyUI": { + "stars": 13, + "last_update": "2024-05-22 20:42:29", + "author_account_age_days": 2846 + }, + "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": { + "stars": 20, + "last_update": "2024-05-22 20:42:04", + "author_account_age_days": 2846 + }, + "https://github.com/laksjdjf/cgem156-ComfyUI": { + "stars": 32, + "last_update": "2024-06-08 01:09:03", + "author_account_age_days": 2846 + }, + "https://github.com/laksjdjf/pfg-ComfyUI": { + "stars": 10, + "last_update": "2024-05-22 20:41:41", + "author_account_age_days": 2846 + }, + "https://github.com/larsupb/LoRA-Merger-ComfyUI": { + "stars": 13, + "last_update": "2024-07-02 05:55:23", + "author_account_age_days": 3091 + }, + "https://github.com/latenightlabs/ComfyUI-LNL": { + "stars": 19, + "last_update": "2024-06-28 17:27:55", + "author_account_age_days": 166 + }, + "https://github.com/leiweiqiang/ComfyUI-TRA": { + "stars": 5, + "last_update": "2024-07-09 23:36:24", + "author_account_age_days": 2626 + }, + "https://github.com/leoleelxh/ComfyUI-LLMs": { + "stars": 7, + "last_update": "2024-06-14 10:24:23", + "author_account_age_days": 4090 + }, + "https://github.com/licyk/ComfyUI-Restart-Sampler": { + "stars": 2, + "last_update": "2024-06-29 03:36:00", + "author_account_age_days": 1283 + }, + "https://github.com/lilly1987/ComfyUI_node_Lilly": { + "stars": 50, + "last_update": "2024-05-22 17:53:19", + "author_account_age_days": 2925 + }, + "https://github.com/linshier/comfyui-remote-tools": { + "stars": 1, + "last_update": "2024-05-28 07:44:23", + "author_account_age_days": 3807 + }, + "https://github.com/liusida/ComfyUI-AutoCropFaces": { + "stars": 26, + "last_update": "2024-07-05 03:24:00", + "author_account_age_days": 3223 + }, + "https://github.com/liusida/ComfyUI-B-LoRA": { + "stars": 20, + "last_update": "2024-06-18 03:17:46", + "author_account_age_days": 3223 + }, + "https://github.com/liusida/ComfyUI-Debug": { + "stars": 6, + "last_update": "2024-06-14 10:25:26", + "author_account_age_days": 3223 + }, + "https://github.com/liusida/ComfyUI-Login": { + "stars": 45, + "last_update": "2024-06-27 13:31:34", + "author_account_age_days": 3223 + }, + "https://github.com/liusida/ComfyUI-SD3-nodes": { + "stars": 4, + "last_update": "2024-06-14 13:01:41", + "author_account_age_days": 3223 + }, + "https://github.com/ljleb/comfy-mecha": { + "stars": 29, + "last_update": "2024-07-07 03:15:02", + "author_account_age_days": 2479 + }, + "https://github.com/lks-ai/ComfyUI-StableAudioSampler": { + "stars": 185, + "last_update": "2024-06-17 18:54:17", + "author_account_age_days": 115 + }, + "https://github.com/lks-ai/anynode": { + "stars": 435, + "last_update": "2024-07-07 03:45:48", + "author_account_age_days": 115 + }, + "https://github.com/lldacing/comfyui-easyapi-nodes": { + "stars": 31, + "last_update": "2024-05-24 02:51:26", + "author_account_age_days": 2108 + }, + "https://github.com/logtd/ComfyUI-FLATTEN": { + "stars": 91, + "last_update": "2024-06-14 18:00:19", + "author_account_age_days": 137 + }, + "https://github.com/logtd/ComfyUI-InstanceDiffusion": { + "stars": 145, + "last_update": "2024-05-22 00:02:08", + "author_account_age_days": 137 + }, + "https://github.com/logtd/ComfyUI-InversedNoise": { + "stars": 6, + "last_update": "2024-05-22 00:10:18", + "author_account_age_days": 137 + }, + "https://github.com/logtd/ComfyUI-RAVE_ATTN": { + "stars": 10, + "last_update": "2024-05-22 00:20:03", + "author_account_age_days": 137 + }, + "https://github.com/logtd/ComfyUI-RefSampling": { + "stars": 4, + "last_update": "2024-05-22 00:04:40", + "author_account_age_days": 137 + }, + "https://github.com/logtd/ComfyUI-TrackingNodes": { + "stars": 15, + "last_update": "2024-05-22 00:03:27", + "author_account_age_days": 137 + }, + "https://github.com/longgui0318/comfyui-common-util": { + "stars": 0, + "last_update": "2024-07-08 08:57:06", + "author_account_age_days": 4180 + }, + "https://github.com/longgui0318/comfyui-llm-assistant": { + "stars": 5, + "last_update": "2024-06-27 03:50:46", + "author_account_age_days": 4180 + }, + "https://github.com/longgui0318/comfyui-magic-clothing": { + "stars": 24, + "last_update": "2024-06-27 03:48:38", + "author_account_age_days": 4180 + }, + "https://github.com/longgui0318/comfyui-mask-util": { + "stars": 6, + "last_update": "2024-06-30 03:43:58", + "author_account_age_days": 4180 + }, + "https://github.com/longgui0318/comfyui-oms-diffusion": { + "stars": 24, + "last_update": "2024-06-27 03:48:38", + "author_account_age_days": 4180 + }, + "https://github.com/lordgasmic/comfyui_save_image_with_options": { + "stars": 0, + "last_update": "2024-06-20 16:39:23", + "author_account_age_days": 4782 + }, + "https://github.com/lordgasmic/comfyui_wildcards": { + "stars": 5, + "last_update": "2024-06-20 16:52:14", + "author_account_age_days": 4782 + }, + "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": { + "stars": 165, + "last_update": "2024-06-21 10:54:35", + "author_account_age_days": 4066 + }, + "https://github.com/lquesada/ComfyUI-Prompt-Combinator": { + "stars": 21, + "last_update": "2024-06-30 15:37:31", + "author_account_age_days": 4066 + }, + "https://github.com/ltdrdata/ComfyUI-Impact-Pack": { + "stars": 1451, + "last_update": "2024-07-06 09:25:25", + "author_account_age_days": 477 + }, + "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": { + "stars": 300, + "last_update": "2024-07-09 11:07:42", + "author_account_age_days": 477 + }, + "https://github.com/ltdrdata/ComfyUI-Manager": { + "stars": 4667, + "last_update": "2024-07-09 19:59:22", + "author_account_age_days": 477 + }, + "https://github.com/luandev/ComfyUI-CrewAI": { + "stars": 13, + "last_update": "2024-06-27 17:53:19", + "author_account_age_days": 3823 + }, + "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": { + "stars": 1, + "last_update": "2024-05-22 20:36:07", + "author_account_age_days": 331 + }, + "https://github.com/madtunebk/ComfyUI-ControlnetAux": { + "stars": 10, + "last_update": "2024-06-28 16:16:51", + "author_account_age_days": 476 + }, + "https://github.com/mape/ComfyUI-mape-Helpers": { + "stars": 135, + "last_update": "2024-06-27 16:30:32", + "author_account_age_days": 5770 + }, + "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": { + "stars": 3, + "last_update": "2024-06-24 13:53:39", + "author_account_age_days": 1182 + }, + "https://github.com/marduk191/comfyui-marnodes": { + "stars": 0, + "last_update": "2024-06-30 21:20:15", + "author_account_age_days": 4430 + }, + "https://github.com/marhensa/sdxl-recommended-res-calc": { + "stars": 56, + "last_update": "2024-07-07 09:20:15", + "author_account_age_days": 4790 + }, + "https://github.com/martijnat/comfyui-previewlatent": { + "stars": 29, + "last_update": "2024-05-22 21:28:39", + "author_account_age_days": 2847 + }, + "https://github.com/massao000/ComfyUI_aspect_ratios": { + "stars": 7, + "last_update": "2024-05-22 22:23:10", + "author_account_age_days": 1422 + }, + "https://github.com/matan1905/ComfyUI-Serving-Toolkit": { + "stars": 39, + "last_update": "2024-06-04 19:15:36", + "author_account_age_days": 2755 + }, + "https://github.com/mav-rik/facerestore_cf": { + "stars": 158, + "last_update": "2024-05-22 20:53:23", + "author_account_age_days": 2936 + }, + "https://github.com/mbrostami/ComfyUI-HF": { + "stars": 16, + "last_update": "2024-05-27 21:45:33", + "author_account_age_days": 4337 + }, + "https://github.com/mbrostami/ComfyUI-TITrain": { + "stars": 7, + "last_update": "2024-05-27 21:50:06", + "author_account_age_days": 4337 + }, + "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": { + "stars": 1070, + "last_update": "2024-05-24 16:09:17", + "author_account_age_days": 2117 + }, + "https://github.com/meap158/ComfyUI-Background-Replacement": { + "stars": 42, + "last_update": "2024-05-22 20:43:52", + "author_account_age_days": 3218 + }, + "https://github.com/meap158/ComfyUI-GPU-temperature-protection": { + "stars": 3, + "last_update": "2024-05-22 20:43:21", + "author_account_age_days": 3218 + }, + "https://github.com/meap158/ComfyUI-Prompt-Expansion": { + "stars": 62, + "last_update": "2024-05-22 20:43:37", + "author_account_age_days": 3218 + }, + "https://github.com/melMass/comfy_mtb": { + "stars": 358, + "last_update": "2024-07-07 18:40:33", + "author_account_age_days": 3761 + }, + "https://github.com/mephisto83/petty-paint-comfyui-node": { + "stars": 2, + "last_update": "2024-07-05 19:04:04", + "author_account_age_days": 3688 + }, + "https://github.com/meshmesh-io/ComfyUI-MeshMesh": { + "stars": 0, + "last_update": "2024-05-23 00:10:09", + "author_account_age_days": 244 + }, + "https://github.com/meshmesh-io/mm-comfyui-loopback": { + "stars": 1, + "last_update": "2024-05-23 00:09:57", + "author_account_age_days": 244 + }, + "https://github.com/meshmesh-io/mm-comfyui-megamask": { + "stars": 0, + "last_update": "2024-05-23 00:09:47", + "author_account_age_days": 244 + }, + "https://github.com/metncelik/comfyui_met_suit": { + "stars": 0, + "last_update": "2024-07-07 13:40:26", + "author_account_age_days": 638 + }, + "https://github.com/metncelik/comfyui_met_suite": { + "stars": 0, + "last_update": "2024-07-07 13:40:26", + "author_account_age_days": 638 + }, + "https://github.com/mihaiiancu/ComfyUI_Inpaint": { + "stars": 9, + "last_update": "2024-05-22 18:19:38", + "author_account_age_days": 2677 + }, + "https://github.com/mikkel/ComfyUI-text-overlay": { + "stars": 29, + "last_update": "2024-05-22 21:13:59", + "author_account_age_days": 5932 + }, + "https://github.com/mikkel/comfyui-mask-boundingbox": { + "stars": 25, + "last_update": "2024-05-22 21:26:23", + "author_account_age_days": 5932 + }, + "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq": { + "stars": 0, + "last_update": "2024-06-28 15:59:20", + "author_account_age_days": 2609 + }, + "https://github.com/mirabarukaso/ComfyUI_Mira": { + "stars": 24, + "last_update": "2024-06-14 11:01:10", + "author_account_age_days": 1236 + }, + "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": { + "stars": 1, + "last_update": "2024-05-22 22:08:50", + "author_account_age_days": 4619 + }, + "https://github.com/moyi7712/ComfyUI_Seamless_Patten": { + "stars": 10, + "last_update": "2024-06-22 02:18:14", + "author_account_age_days": 2316 + }, + "https://github.com/mozman/ComfyUI_mozman_nodes": { + "stars": 0, + "last_update": "2024-05-22 22:13:32", + "author_account_age_days": 4095 + }, + "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt": { + "stars": 16, + "last_update": "2023-08-14 11:27:09", + "author_account_age_days": 2624 + }, + "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes": { + "stars": 0, + "last_update": "2024-07-09 10:26:31", + "author_account_age_days": 3953 + }, + "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": { + "stars": 6, + "last_update": "2024-06-14 13:26:02", + "author_account_age_days": 2961 + }, + "https://github.com/my-opencode/ComfyUI_IndustrialMagick": { + "stars": 1, + "last_update": "2024-07-08 12:25:30", + "author_account_age_days": 1395 + }, + "https://github.com/my-opencode/ComfyUI_KSamplerTimer": { + "stars": 1, + "last_update": "2024-07-08 12:22:33", + "author_account_age_days": 1395 + }, + "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": { + "stars": 2, + "last_update": "2024-05-22 20:44:17", + "author_account_age_days": 3689 + }, + "https://github.com/nagolinc/comfyui_openai_node": { + "stars": 0, + "last_update": "2024-06-15 15:59:07", + "author_account_age_days": 3689 + }, + "https://github.com/nat-chan/ComfyUI-graphToPrompt": { + "stars": 0, + "last_update": "2024-05-23 01:16:40", + "author_account_age_days": 3008 + }, + "https://github.com/nat-chan/comfyui-paint": { + "stars": 2, + "last_update": "2024-06-14 11:01:38", + "author_account_age_days": 3008 + }, + "https://github.com/nat-chan/comfyui-transceiver": { + "stars": 3, + "last_update": "2024-05-23 01:16:28", + "author_account_age_days": 3008 + }, + "https://github.com/nathannlu/ComfyUI-Cloud": { + "stars": 156, + "last_update": "2024-06-30 06:18:52", + "author_account_age_days": 2741 + }, + "https://github.com/nathannlu/ComfyUI-Pets": { + "stars": 37, + "last_update": "2024-06-14 11:00:42", + "author_account_age_days": 2741 + }, + "https://github.com/natto-maki/ComfyUI-NegiTools": { + "stars": 26, + "last_update": "2024-05-22 21:31:17", + "author_account_age_days": 293 + }, + "https://github.com/nickve28/ComfyUI-Nich-Utils": { + "stars": 8, + "last_update": "2024-06-22 05:29:37", + "author_account_age_days": 4044 + }, + "https://github.com/ningxiaoxiao/comfyui-NDI": { + "stars": 36, + "last_update": "2024-07-02 09:03:11", + "author_account_age_days": 3003 + }, + "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": { + "stars": 0, + "last_update": "2024-06-14 12:01:14", + "author_account_age_days": 351 + }, + "https://github.com/nirex0/ComfyUI_pytorch_openpose": { + "stars": 2, + "last_update": "2024-06-14 12:01:07", + "author_account_age_days": 3518 + }, + "https://github.com/nkchocoai/ComfyUI-Dart": { + "stars": 18, + "last_update": "2024-06-23 04:56:49", + "author_account_age_days": 175 + }, + "https://github.com/nkchocoai/ComfyUI-PromptUtilities": { + "stars": 6, + "last_update": "2024-06-23 04:58:30", + "author_account_age_days": 175 + }, + "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": { + "stars": 9, + "last_update": "2024-06-23 04:57:38", + "author_account_age_days": 175 + }, + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": { + "stars": 4, + "last_update": "2024-06-23 04:40:00", + "author_account_age_days": 175 + }, + "https://github.com/nkchocoai/ComfyUI-TextOnSegs": { + "stars": 7, + "last_update": "2024-06-23 04:52:29", + "author_account_age_days": 175 + }, + "https://github.com/noembryo/ComfyUI-noEmbryo": { + "stars": 13, + "last_update": "2024-06-04 11:27:45", + "author_account_age_days": 2758 + }, + "https://github.com/nosiu/comfyui-instantId-faceswap": { + "stars": 176, + "last_update": "2024-05-22 23:21:38", + "author_account_age_days": 3920 + }, + "https://github.com/noxinias/ComfyUI_NoxinNodes": { + "stars": 7, + "last_update": "2024-05-22 21:24:24", + "author_account_age_days": 2576 + }, + "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": { + "stars": 24, + "last_update": "2024-05-22 22:22:14", + "author_account_age_days": 1733 + }, + "https://github.com/nuanarchy/ComfyUI-NuA-BIRD": { + "stars": 4, + "last_update": "2024-06-18 05:35:49", + "author_account_age_days": 1107 + }, + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": { + "stars": 14, + "last_update": "2024-06-17 15:29:15", + "author_account_age_days": 1107 + }, + "https://github.com/nullquant/ComfyUI-BrushNet": { + "stars": 404, + "last_update": "2024-06-19 16:24:00", + "author_account_age_days": 1192 + }, + "https://github.com/olduvai-jp/ComfyUI-HfLoader": { + "stars": 3, + "last_update": "2024-05-23 00:14:52", + "author_account_age_days": 891 + }, + "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": { + "stars": 111, + "last_update": "2024-06-03 11:02:37", + "author_account_age_days": 4522 + }, + "https://github.com/opvelll/ComfyUI_TextListProduct": { + "stars": 0, + "last_update": "2024-06-22 02:11:26", + "author_account_age_days": 1570 + }, + "https://github.com/osi1880vr/prompt_quill_comfyui": { + "stars": 10, + "last_update": "2024-06-13 17:24:12", + "author_account_age_days": 1092 + }, + "https://github.com/ostris/ostris_nodes_comfyui": { + "stars": 19, + "last_update": "2024-05-22 21:23:24", + "author_account_age_days": 2418 + }, + "https://github.com/ownimage/ComfyUI-ownimage": { + "stars": 0, + "last_update": "2024-05-22 22:22:37", + "author_account_age_days": 2798 + }, + "https://github.com/oyvindg/ComfyUI-TrollSuite": { + "stars": 0, + "last_update": "2024-05-22 21:32:03", + "author_account_age_days": 2345 + }, + "https://github.com/oztrkoguz/ComfyUI_StoryCreator": { + "stars": 19, + "last_update": "2024-05-23 12:18:45", + "author_account_age_days": 857 + }, + "https://github.com/palant/extended-saveimage-comfyui": { + "stars": 11, + "last_update": "2024-03-27 14:08:21", + "author_account_age_days": 5068 + }, + "https://github.com/palant/image-resize-comfyui": { + "stars": 62, + "last_update": "2024-01-18 20:59:55", + "author_account_age_days": 5068 + }, + "https://github.com/palant/integrated-nodes-comfyui": { + "stars": 32, + "last_update": "2023-12-27 22:52:00", + "author_account_age_days": 5068 + }, + "https://github.com/pamparamm/ComfyUI-vectorscope-cc": { + "stars": 2, + "last_update": "2024-07-08 16:05:59", + "author_account_age_days": 2146 + }, + "https://github.com/pamparamm/sd-perturbed-attention": { + "stars": 183, + "last_update": "2024-06-29 05:44:18", + "author_account_age_days": 2146 + }, + "https://github.com/pants007/comfy-pants": { + "stars": 2, + "last_update": "2024-05-22 18:16:04", + "author_account_age_days": 2332 + }, + "https://github.com/paulo-coronado/comfy_clip_blip_node": { + "stars": 25, + "last_update": "2024-05-22 17:39:09", + "author_account_age_days": 2702 + }, + "https://github.com/philz1337x/ComfyUI-ClarityAI": { + "stars": 47, + "last_update": "2024-05-23 01:19:05", + "author_account_age_days": 679 + }, + "https://github.com/phineas-pta/comfyui-auto-nodes-layout": { + "stars": 26, + "last_update": "2024-06-19 21:38:47", + "author_account_age_days": 2304 + }, + "https://github.com/picturesonpictures/comfy_PoP": { + "stars": 15, + "last_update": "2024-07-05 07:32:50", + "author_account_age_days": 602 + }, + "https://github.com/pkpkTech/ComfyUI-SaveAVIF": { + "stars": 0, + "last_update": "2024-05-22 22:19:21", + "author_account_age_days": 1518 + }, + "https://github.com/pkpkTech/ComfyUI-SaveQueues": { + "stars": 1, + "last_update": "2024-05-22 22:19:54", + "author_account_age_days": 1518 + }, + "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": { + "stars": 1, + "last_update": "2024-05-22 22:19:44", + "author_account_age_days": 1518 + }, + "https://github.com/pkpkTech/ComfyUI-ngrok": { + "stars": 3, + "last_update": "2024-05-22 22:19:32", + "author_account_age_days": 1518 + }, + "https://github.com/portu-sim/comfyui_bmab": { + "stars": 39, + "last_update": "2024-06-09 14:22:04", + "author_account_age_days": 337 + }, + "https://github.com/prodogape/ComfyUI-EasyOCR": { + "stars": 8, + "last_update": "2024-07-03 05:54:03", + "author_account_age_days": 1045 + }, + "https://github.com/prodogape/ComfyUI-Minio": { + "stars": 2, + "last_update": "2024-05-23 00:13:38", + "author_account_age_days": 1045 + }, + "https://github.com/prodogape/ComfyUI-OmDet": { + "stars": 2, + "last_update": "2024-06-14 13:01:34", + "author_account_age_days": 1045 + }, + "https://github.com/prodogape/Comfyui-Yolov8-JSON": { + "stars": 12, + "last_update": "2024-07-03 03:59:38", + "author_account_age_days": 1045 + }, + "https://github.com/prozacgod/comfyui-pzc-multiworkspace": { + "stars": 7, + "last_update": "2024-05-22 23:11:46", + "author_account_age_days": 5583 + }, + "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": { + "stars": 1387, + "last_update": "2024-06-29 20:47:22", + "author_account_age_days": 513 + }, + "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": { + "stars": 444, + "last_update": "2024-06-20 05:38:50", + "author_account_age_days": 513 + }, + "https://github.com/qwixiwp/queuetools": { + "stars": 0, + "last_update": "2024-06-14 10:27:57", + "author_account_age_days": 626 + }, + "https://github.com/ramyma/A8R8_ComfyUI_nodes": { + "stars": 40, + "last_update": "2024-06-29 01:20:57", + "author_account_age_days": 3232 + }, + "https://github.com/randjtw/advance-aesthetic-score": { + "stars": 0, + "last_update": "2024-05-23 01:14:47", + "author_account_age_days": 776 + }, + "https://github.com/ratulrafsan/Comfyui-SAL-VTON": { + "stars": 61, + "last_update": "2024-06-30 02:23:06", + "author_account_age_days": 4509 + }, + "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": { + "stars": 0, + "last_update": "2024-05-22 22:13:55", + "author_account_age_days": 3440 + }, + "https://github.com/rcsaquino/comfyui-custom-nodes": { + "stars": 1, + "last_update": "2024-05-22 22:13:43", + "author_account_age_days": 1526 + }, + "https://github.com/receyuki/comfyui-prompt-reader-node": { + "stars": 215, + "last_update": "2024-06-28 07:20:59", + "author_account_age_days": 2608 + }, + "https://github.com/redhottensors/ComfyUI-ODE": { + "stars": 24, + "last_update": "2024-06-23 22:16:53", + "author_account_age_days": 154 + }, + "https://github.com/redhottensors/ComfyUI-Prediction": { + "stars": 10, + "last_update": "2024-06-14 10:25:44", + "author_account_age_days": 154 + }, + "https://github.com/rgthree/rgthree-comfy": { + "stars": 750, + "last_update": "2024-07-06 18:08:21", + "author_account_age_days": 4990 + }, + "https://github.com/rhdunn/comfyui-bus-plugin": { + "stars": 1, + "last_update": "2024-06-26 17:38:32", + "author_account_age_days": 5652 + }, + "https://github.com/richinsley/Comfy-LFO": { + "stars": 5, + "last_update": "2024-05-22 20:46:30", + "author_account_age_days": 2696 + }, + "https://github.com/ricklove/comfyui-ricklove": { + "stars": 0, + "last_update": "2024-05-22 23:21:25", + "author_account_age_days": 4848 + }, + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": { + "stars": 12, + "last_update": "2024-06-14 10:28:04", + "author_account_age_days": 662 + }, + "https://github.com/rklaffehn/rk-comfy-nodes": { + "stars": 2, + "last_update": "2024-06-14 10:24:43", + "author_account_age_days": 308 + }, + "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": { + "stars": 4, + "last_update": "2024-05-22 21:29:25", + "author_account_age_days": 306 + }, + "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": { + "stars": 75, + "last_update": "2024-06-25 09:06:23", + "author_account_age_days": 4170 + }, + "https://github.com/royceschultz/ComfyUI-Notifications": { + "stars": 6, + "last_update": "2024-05-23 01:23:16", + "author_account_age_days": 2545 + }, + "https://github.com/royceschultz/ComfyUI-TranscriptionTools": { + "stars": 12, + "last_update": "2024-05-23 01:10:10", + "author_account_age_days": 2545 + }, + "https://github.com/rui40000/RUI-Nodes": { + "stars": 15, + "last_update": "2024-05-22 22:12:26", + "author_account_age_days": 489 + }, + "https://github.com/ruiqutech/ComfyUI-RuiquNodes": { + "stars": 0, + "last_update": "2024-05-23 01:21:50", + "author_account_age_days": 85 + }, + "https://github.com/runtime44/comfyui_r44_nodes": { + "stars": 32, + "last_update": "2024-07-01 08:02:04", + "author_account_age_days": 183 + }, + "https://github.com/saftle/suplex_comfy_nodes": { + "stars": 0, + "last_update": "2024-05-29 13:09:25", + "author_account_age_days": 4773 + }, + "https://github.com/sdfxai/SDFXBridgeForComfyUI": { + "stars": 8, + "last_update": "2024-06-14 10:26:56", + "author_account_age_days": 250 + }, + "https://github.com/seanlynch/comfyui-optical-flow": { + "stars": 26, + "last_update": "2024-05-22 20:52:17", + "author_account_age_days": 5320 + }, + "https://github.com/seanlynch/srl-nodes": { + "stars": 3, + "last_update": "2024-06-30 13:47:38", + "author_account_age_days": 5320 + }, + "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": { + "stars": 2, + "last_update": "2024-05-22 21:34:15", + "author_account_age_days": 3348 + }, + "https://github.com/shadowcz007/comfyui-Image-reward": { + "stars": 21, + "last_update": "2024-06-14 10:24:49", + "author_account_age_days": 3330 + }, + "https://github.com/shadowcz007/comfyui-consistency-decoder": { + "stars": 2, + "last_update": "2024-06-14 10:23:35", + "author_account_age_days": 3330 + }, + "https://github.com/shadowcz007/comfyui-edit-mask": { + "stars": 6, + "last_update": "2024-06-20 01:42:48", + "author_account_age_days": 3330 + }, + "https://github.com/shadowcz007/comfyui-liveportrait": { + "stars": 190, + "last_update": "2024-07-07 15:59:06", + "author_account_age_days": 3330 + }, + "https://github.com/shadowcz007/comfyui-mixlab-nodes": { + "stars": 928, + "last_update": "2024-07-07 16:03:59", + "author_account_age_days": 3330 + }, + "https://github.com/shadowcz007/comfyui-sound-lab": { + "stars": 65, + "last_update": "2024-07-04 12:53:38", + "author_account_age_days": 3330 + }, + "https://github.com/shadowcz007/comfyui-ultralytics-yolo": { + "stars": 18, + "last_update": "2024-06-22 09:06:04", + "author_account_age_days": 3330 + }, + "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": { + "stars": 2, + "last_update": "2024-05-23 00:14:25", + "author_account_age_days": 5108 + }, + "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": { + "stars": 144, + "last_update": "2024-04-17 09:02:51", + "author_account_age_days": 1780 + }, + "https://github.com/shiimizu/ComfyUI-TiledDiffusion": { + "stars": 217, + "last_update": "2024-05-14 22:01:41", + "author_account_age_days": 1780 + }, + "https://github.com/shiimizu/ComfyUI_smZNodes": { + "stars": 158, + "last_update": "2024-06-18 07:30:24", + "author_account_age_days": 1780 + }, + "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage": { + "stars": 27, + "last_update": "2024-05-22 20:41:29", + "author_account_age_days": 2238 + }, + "https://github.com/shingo1228/ComfyUI-send-eagle-slim": { + "stars": 22, + "last_update": "2024-05-22 20:41:15", + "author_account_age_days": 2238 + }, + "https://github.com/shinich39/comfyui-load-image-in-seq": { + "stars": 3, + "last_update": "2024-07-03 03:40:21", + "author_account_age_days": 328 + }, + "https://github.com/shinich39/comfyui-local-db": { + "stars": 1, + "last_update": "2024-07-03 03:42:46", + "author_account_age_days": 328 + }, + "https://github.com/shinich39/comfyui-ramdom-node": { + "stars": 2, + "last_update": "2024-07-03 03:11:28", + "author_account_age_days": 328 + }, + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": { + "stars": 3, + "last_update": "2024-06-20 13:57:29", + "author_account_age_days": 4323 + }, + "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": { + "stars": 23, + "last_update": "2024-05-22 18:13:49", + "author_account_age_days": 1641 + }, + "https://github.com/shockz0rz/comfy-easy-grids": { + "stars": 12, + "last_update": "2024-05-22 18:14:05", + "author_account_age_days": 1641 + }, + "https://github.com/siliconflow/onediff_comfy_nodes": { + "stars": 14, + "last_update": "2024-06-24 10:08:11", + "author_account_age_days": 321 + }, + "https://github.com/sipherxyz/comfyui-art-venture": { + "stars": 92, + "last_update": "2024-06-28 02:06:23", + "author_account_age_days": 1122 + }, + "https://github.com/skfoo/ComfyUI-Coziness": { + "stars": 22, + "last_update": "2024-05-27 18:24:29", + "author_account_age_days": 2097 + }, + "https://github.com/slyt/comfyui-ollama-nodes": { + "stars": 0, + "last_update": "2024-06-25 03:31:41", + "author_account_age_days": 3955 + }, + "https://github.com/smagnetize/kb-comfyui-nodes": { + "stars": 0, + "last_update": "2024-06-14 12:00:45", + "author_account_age_days": 2730 + }, + "https://github.com/smthemex/ComfyUI_AnyDoor": { + "stars": 19, + "last_update": "2024-07-09 07:37:40", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_ChatGLM_API": { + "stars": 18, + "last_update": "2024-06-25 04:10:29", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_CustomNet": { + "stars": 4, + "last_update": "2024-06-25 01:04:17", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": { + "stars": 31, + "last_update": "2024-07-04 11:51:49", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_ID_Animator": { + "stars": 20, + "last_update": "2024-06-27 08:32:11", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_Llama3_8B": { + "stars": 18, + "last_update": "2024-06-25 00:49:01", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_MS_Diffusion": { + "stars": 7, + "last_update": "2024-07-09 13:42:13", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_ParlerTTS": { + "stars": 21, + "last_update": "2024-06-25 00:38:01", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_Pic2Story": { + "stars": 3, + "last_update": "2024-06-25 01:16:30", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_Pipeline_Tool": { + "stars": 8, + "last_update": "2024-06-25 01:13:53", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_Pops": { + "stars": 16, + "last_update": "2024-07-04 13:09:15", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_StableAudio_Open": { + "stars": 7, + "last_update": "2024-06-25 00:56:09", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_StoryDiffusion": { + "stars": 69, + "last_update": "2024-07-09 12:11:17", + "author_account_age_days": 369 + }, + "https://github.com/smthemex/ComfyUI_Streamv2v_Plus": { + "stars": 0, + "last_update": "2024-06-25 00:52:41", + "author_account_age_days": 369 + }, + "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": { + "stars": 42, + "last_update": "2024-05-22 18:10:36", + "author_account_age_days": 2740 + }, + "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": { + "stars": 155, + "last_update": "2024-05-22 18:10:49", + "author_account_age_days": 2740 + }, + "https://github.com/space-nuko/nui-suite": { + "stars": 10, + "last_update": "2024-05-22 18:11:04", + "author_account_age_days": 2740 + }, + "https://github.com/spacepxl/ComfyUI-Florence-2": { + "stars": 39, + "last_update": "2024-06-29 13:13:01", + "author_account_age_days": 310 + }, + "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": { + "stars": 32, + "last_update": "2024-06-21 04:42:58", + "author_account_age_days": 310 + }, + "https://github.com/spacepxl/ComfyUI-Image-Filters": { + "stars": 85, + "last_update": "2024-06-22 01:19:31", + "author_account_age_days": 310 + }, + "https://github.com/spacepxl/ComfyUI-RAVE": { + "stars": 83, + "last_update": "2024-05-22 20:56:19", + "author_account_age_days": 310 + }, + "https://github.com/spacepxl/ComfyUI-StyleGan": { + "stars": 5, + "last_update": "2024-06-10 20:16:34", + "author_account_age_days": 310 + }, + "https://github.com/spinagon/ComfyUI-seam-carving": { + "stars": 15, + "last_update": "2024-05-23 05:07:00", + "author_account_age_days": 4756 + }, + "https://github.com/spinagon/ComfyUI-seamless-tiling": { + "stars": 78, + "last_update": "2024-05-23 05:03:42", + "author_account_age_days": 4756 + }, + "https://github.com/spro/comfyui-mirror": { + "stars": 4, + "last_update": "2024-05-22 20:50:25", + "author_account_age_days": 5247 + }, + "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": { + "stars": 656, + "last_update": "2024-06-27 04:16:12", + "author_account_age_days": 1704 + }, + "https://github.com/ssitu/ComfyUI_fabric": { + "stars": 84, + "last_update": "2024-05-22 18:10:19", + "author_account_age_days": 1704 + }, + "https://github.com/ssitu/ComfyUI_restart_sampling": { + "stars": 78, + "last_update": "2024-05-22 18:09:49", + "author_account_age_days": 1704 + }, + "https://github.com/ssitu/ComfyUI_roop": { + "stars": 61, + "last_update": "2024-05-22 18:10:03", + "author_account_age_days": 1704 + }, + "https://github.com/stavsap/comfyui-ollama": { + "stars": 206, + "last_update": "2024-06-28 04:00:40", + "author_account_age_days": 4099 + }, + "https://github.com/storyicon/comfyui_musev_evolved": { + "stars": 14, + "last_update": "2024-06-14 11:02:40", + "author_account_age_days": 2567 + }, + "https://github.com/storyicon/comfyui_segment_anything": { + "stars": 545, + "last_update": "2024-05-31 07:36:30", + "author_account_age_days": 2567 + }, + "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score": { + "stars": 25, + "last_update": "2024-06-17 10:01:44", + "author_account_age_days": 2642 + }, + "https://github.com/styler00dollar/ComfyUI-deepcache": { + "stars": 8, + "last_update": "2024-05-22 22:18:18", + "author_account_age_days": 1861 + }, + "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": { + "stars": 27, + "last_update": "2024-05-22 22:18:07", + "author_account_age_days": 1861 + }, + "https://github.com/subtleGradient/TinkerBot-tech-for-ComfyUI-Touchpad": { + "stars": 20, + "last_update": "2024-06-19 04:30:39", + "author_account_age_days": 5946 + }, + "https://github.com/sugarkwork/comfyui_cohere": { + "stars": 0, + "last_update": "2024-06-14 13:59:30", + "author_account_age_days": 891 + }, + "https://github.com/sugarkwork/comfyui_tag_fillter": { + "stars": 18, + "last_update": "2024-07-02 00:21:03", + "author_account_age_days": 891 + }, + "https://github.com/superyoman/comfyui_lumaAPI": { + "stars": 13, + "last_update": "2024-06-17 21:00:05", + "author_account_age_days": 464 + }, + "https://github.com/syllebra/bilbox-comfyui": { + "stars": 82, + "last_update": "2024-05-22 20:40:43", + "author_account_age_days": 3151 + }, + "https://github.com/sylym/comfy_vid2vid": { + "stars": 58, + "last_update": "2024-05-22 17:53:40", + "author_account_age_days": 1913 + }, + "https://github.com/szhublox/ambw_comfyui": { + "stars": 13, + "last_update": "2024-05-22 18:04:57", + "author_account_age_days": 1022 + }, + "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": { + "stars": 227, + "last_update": "2024-06-17 10:01:50", + "author_account_age_days": 1698 + }, + "https://github.com/talesofai/comfyui-browser": { + "stars": 430, + "last_update": "2024-07-01 12:41:20", + "author_account_age_days": 571 + }, + "https://github.com/teward/ComfyUI-Helper-Nodes": { + "stars": 4, + "last_update": "2024-05-23 01:22:01", + "author_account_age_days": 5113 + }, + "https://github.com/theUpsider/ComfyUI-Logic": { + "stars": 112, + "last_update": "2024-07-02 09:38:11", + "author_account_age_days": 2738 + }, + "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": { + "stars": 29, + "last_update": "2024-07-01 08:45:52", + "author_account_age_days": 2738 + }, + "https://github.com/thecooltechguy/ComfyUI-ComfyRun": { + "stars": 78, + "last_update": "2024-05-22 21:33:11", + "author_account_age_days": 2438 + }, + "https://github.com/thecooltechguy/ComfyUI-ComfyWorkflows": { + "stars": 33, + "last_update": "2024-05-22 21:33:47", + "author_account_age_days": 2438 + }, + "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": { + "stars": 203, + "last_update": "2024-05-22 21:33:35", + "author_account_age_days": 2438 + }, + "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": { + "stars": 291, + "last_update": "2024-05-24 22:14:42", + "author_account_age_days": 2438 + }, + "https://github.com/tiankuan93/ComfyUI-V-Express": { + "stars": 87, + "last_update": "2024-06-26 02:41:00", + "author_account_age_days": 2965 + }, + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": { + "stars": 9, + "last_update": "2024-07-09 10:09:44", + "author_account_age_days": 3340 + }, + "https://github.com/tmagara/ComfyUI-Prediction-Boost": { + "stars": 1, + "last_update": "2024-06-21 05:28:58", + "author_account_age_days": 4390 + }, + "https://github.com/tocubed/ComfyUI-AudioReactor": { + "stars": 8, + "last_update": "2024-05-22 22:21:57", + "author_account_age_days": 3875 + }, + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": { + "stars": 6, + "last_update": "2024-06-14 13:59:48", + "author_account_age_days": 4333 + }, + "https://github.com/toxicwind/ComfyUI-TTools": { + "stars": 1, + "last_update": "2024-07-04 20:07:35", + "author_account_age_days": 4385 + }, + "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": { + "stars": 472, + "last_update": "2024-06-18 15:27:19", + "author_account_age_days": 3665 + }, + "https://github.com/traugdor/ComfyUI-quadMoons-nodes": { + "stars": 9, + "last_update": "2024-06-22 14:28:25", + "author_account_age_days": 3835 + }, + "https://github.com/tritant/ComfyUI_CreaPrompt": { + "stars": 10, + "last_update": "2024-07-07 11:36:51", + "author_account_age_days": 3156 + }, + "https://github.com/trojblue/trNodes": { + "stars": 8, + "last_update": "2024-05-22 18:04:36", + "author_account_age_days": 2273 + }, + "https://github.com/trumanwong/ComfyUI-NSFW-Detection": { + "stars": 19, + "last_update": "2024-05-23 01:27:29", + "author_account_age_days": 2975 + }, + "https://github.com/tsogzark/ComfyUI-load-image-from-url": { + "stars": 7, + "last_update": "2024-06-14 13:59:05", + "author_account_age_days": 1544 + }, + "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": { + "stars": 100, + "last_update": "2024-07-09 14:56:02", + "author_account_age_days": 4773 + }, + "https://github.com/ttulttul/ComfyUI-Tensor-Operations": { + "stars": 5, + "last_update": "2024-06-12 21:55:39", + "author_account_age_days": 4773 + }, + "https://github.com/tusharbhutt/Endless-Nodes": { + "stars": 22, + "last_update": "2024-06-14 12:02:17", + "author_account_age_days": 2680 + }, + "https://github.com/twri/sdxl_prompt_styler": { + "stars": 636, + "last_update": "2024-05-22 18:16:58", + "author_account_age_days": 4083 + }, + "https://github.com/txt2any/ComfyUI-PromptOrganizer": { + "stars": 0, + "last_update": "2024-05-23 01:10:33", + "author_account_age_days": 100 + }, + "https://github.com/ty0x2333/ComfyUI-Dev-Utils": { + "stars": 43, + "last_update": "2024-06-03 15:06:13", + "author_account_age_days": 3718 + }, + "https://github.com/tzwm/comfyui-profiler": { + "stars": 43, + "last_update": "2024-07-06 14:03:08", + "author_account_age_days": 4784 + }, + "https://github.com/uarefans/ComfyUI-Fans": { + "stars": 12, + "last_update": "2024-05-22 20:34:07", + "author_account_age_days": 1287 + }, + "https://github.com/uetuluk/comfyui-webcam-node": { + "stars": 2, + "last_update": "2024-06-14 08:25:13", + "author_account_age_days": 2329 + }, + "https://github.com/unwdef/unwdef-nodes-comfyui": { + "stars": 1, + "last_update": "2024-06-27 23:14:09", + "author_account_age_days": 89 + }, + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": { + "stars": 3, + "last_update": "2024-06-25 04:48:19", + "author_account_age_days": 2973 + }, + "https://github.com/vanillacode314/SimpleWildcardsComfyUI": { + "stars": 3, + "last_update": "2024-06-28 10:57:45", + "author_account_age_days": 872 + }, + "https://github.com/veighnsche/comfyui_gr85": { + "stars": 1, + "last_update": "2024-06-27 15:00:08", + "author_account_age_days": 3115 + }, + "https://github.com/victorchall/comfyui_webcamcapture": { + "stars": 6, + "last_update": "2024-06-22 18:59:10", + "author_account_age_days": 3161 + }, + "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": { + "stars": 27, + "last_update": "2024-05-22 22:11:14", + "author_account_age_days": 3442 + }, + "https://github.com/violet-chen/comfyui-psd2png": { + "stars": 16, + "last_update": "2024-06-12 15:30:14", + "author_account_age_days": 1413 + }, + "https://github.com/viperyl/ComfyUI-BiRefNet": { + "stars": 162, + "last_update": "2024-06-20 15:25:49", + "author_account_age_days": 2048 + }, + "https://github.com/viperyl/ComfyUI-RGT": { + "stars": 5, + "last_update": "2024-06-20 15:33:50", + "author_account_age_days": 2048 + }, + "https://github.com/vivax3794/ComfyUI-Sub-Nodes": { + "stars": 78, + "last_update": "2024-07-08 13:59:24", + "author_account_age_days": 1854 + }, + "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": { + "stars": 3, + "last_update": "2024-07-07 21:44:01", + "author_account_age_days": 1854 + }, + "https://github.com/vsevolod-oparin/comfyui-kandinsky22": { + "stars": 8, + "last_update": "2024-05-23 00:14:03", + "author_account_age_days": 4999 + }, + "https://github.com/wTechArtist/ComfyUI-CustomNodes": { + "stars": 0, + "last_update": "2024-07-08 13:59:30", + "author_account_age_days": 1376 + }, + "https://github.com/wallish77/wlsh_nodes": { + "stars": 84, + "last_update": "2024-06-19 12:01:29", + "author_account_age_days": 2235 + }, + "https://github.com/wandbrandon/comfyui-pixel": { + "stars": 4, + "last_update": "2024-06-14 07:07:09", + "author_account_age_days": 3399 + }, + "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": { + "stars": 1, + "last_update": "2024-05-23 01:16:54", + "author_account_age_days": 983 + }, + "https://github.com/wei30172/comfygen": { + "stars": 5, + "last_update": "2024-05-23 00:21:19", + "author_account_age_days": 1628 + }, + "https://github.com/whatbirdisthat/cyberdolphin": { + "stars": 14, + "last_update": "2024-05-23 03:43:08", + "author_account_age_days": 5502 + }, + "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": { + "stars": 30, + "last_update": "2024-06-20 13:52:34", + "author_account_age_days": 467 + }, + "https://github.com/wmatson/easy-comfy-nodes": { + "stars": 13, + "last_update": "2024-07-08 22:05:26", + "author_account_age_days": 4133 + }, + "https://github.com/wolfden/ComfyUi_PromptStylers": { + "stars": 65, + "last_update": "2024-05-22 18:17:46", + "author_account_age_days": 5736 + }, + "https://github.com/wolfden/ComfyUi_String_Function_Tree": { + "stars": 8, + "last_update": "2024-05-22 18:29:16", + "author_account_age_days": 5736 + }, + "https://github.com/wujm424606/ComfyUi-Ollama-YN": { + "stars": 18, + "last_update": "2024-06-26 05:50:44", + "author_account_age_days": 2278 + }, + "https://github.com/wutipong/ComfyUI-TextUtils": { + "stars": 1, + "last_update": "2024-06-14 09:34:31", + "author_account_age_days": 4200 + }, + "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": { + "stars": 1, + "last_update": "2024-05-22 22:22:25", + "author_account_age_days": 5065 + }, + "https://github.com/xXAdonesXx/NodeGPT": { + "stars": 326, + "last_update": "2024-06-20 11:41:30", + "author_account_age_days": 1494 + }, + "https://github.com/xiaoxiaodesha/hd_node": { + "stars": 7, + "last_update": "2024-06-11 02:36:48", + "author_account_age_days": 2890 + }, + "https://github.com/xliry/ComfyUI_SendDiscord": { + "stars": 0, + "last_update": "2024-05-23 02:21:38", + "author_account_age_days": 1289 + }, + "https://github.com/xuhongming251/ComfyUI-GPEN": { + "stars": 2, + "last_update": "2024-06-15 14:33:37", + "author_account_age_days": 4121 + }, + "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": { + "stars": 12, + "last_update": "2024-06-15 14:32:32", + "author_account_age_days": 4121 + }, + "https://github.com/yffyhk/comfyui_auto_danbooru": { + "stars": 1, + "last_update": "2024-05-22 23:23:03", + "author_account_age_days": 3737 + }, + "https://github.com/yiwangsimple/ComfyUI_GroqChat": { + "stars": 20, + "last_update": "2024-07-07 04:16:08", + "author_account_age_days": 567 + }, + "https://github.com/yolain/ComfyUI-Easy-Use": { + "stars": 552, + "last_update": "2024-07-08 09:25:13", + "author_account_age_days": 1356 + }, + "https://github.com/yolanother/DTAIComfyImageSubmit": { + "stars": 1, + "last_update": "2024-05-22 18:14:56", + "author_account_age_days": 4879 + }, + "https://github.com/yolanother/DTAIComfyLoaders": { + "stars": 1, + "last_update": "2024-05-22 18:14:44", + "author_account_age_days": 4879 + }, + "https://github.com/yolanother/DTAIComfyPromptAgent": { + "stars": 5, + "last_update": "2024-05-22 18:14:18", + "author_account_age_days": 4879 + }, + "https://github.com/yolanother/DTAIComfyQRCodes": { + "stars": 2, + "last_update": "2024-05-22 18:15:09", + "author_account_age_days": 4879 + }, + "https://github.com/yolanother/DTAIComfyVariables": { + "stars": 8, + "last_update": "2024-05-22 18:15:21", + "author_account_age_days": 4879 + }, + "https://github.com/yolanother/DTAIImageToTextNode": { + "stars": 15, + "last_update": "2024-05-22 18:14:31", + "author_account_age_days": 4879 + }, + "https://github.com/youyegit/tdxh_node_comfyui": { + "stars": 2, + "last_update": "2024-05-23 17:55:42", + "author_account_age_days": 444 + }, + "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": { + "stars": 67, + "last_update": "2024-07-02 08:09:45", + "author_account_age_days": 2168 + }, + "https://github.com/yuvraj108c/ComfyUI-PiperTTS": { + "stars": 26, + "last_update": "2024-05-22 23:17:27", + "author_account_age_days": 2168 + }, + "https://github.com/yuvraj108c/ComfyUI-Pronodes": { + "stars": 1, + "last_update": "2024-05-22 23:16:51", + "author_account_age_days": 2168 + }, + "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": { + "stars": 42, + "last_update": "2024-05-31 05:50:59", + "author_account_age_days": 2168 + }, + "https://github.com/yuvraj108c/ComfyUI-Vsgan": { + "stars": 2, + "last_update": "2024-05-22 23:17:02", + "author_account_age_days": 2168 + }, + "https://github.com/yuvraj108c/ComfyUI-Whisper": { + "stars": 57, + "last_update": "2024-05-31 05:59:22", + "author_account_age_days": 2168 + }, + "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt": { + "stars": 5, + "last_update": "2024-06-28 15:59:14", + "author_account_age_days": 2168 + }, + "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes": { + "stars": 3, + "last_update": "2024-07-02 14:57:01", + "author_account_age_days": 603 + }, + "https://github.com/zcfrank1st/Comfyui-Toolbox": { + "stars": 4, + "last_update": "2024-05-22 22:08:07", + "author_account_age_days": 4430 + }, + "https://github.com/zcfrank1st/Comfyui-Yolov8": { + "stars": 17, + "last_update": "2024-06-14 07:08:40", + "author_account_age_days": 4430 + }, + "https://github.com/zcfrank1st/comfyui_visual_anagrams": { + "stars": 5, + "last_update": "2024-06-14 07:07:27", + "author_account_age_days": 4430 + }, + "https://github.com/zer0TF/cute-comfy": { + "stars": 29, + "last_update": "2024-05-22 21:18:53", + "author_account_age_days": 2685 + }, + "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer": { + "stars": 55, + "last_update": "2024-06-30 14:31:09", + "author_account_age_days": 2458 + }, + "https://github.com/zfkun/ComfyUI_zfkun": { + "stars": 14, + "last_update": "2024-05-27 11:21:51", + "author_account_age_days": 4878 + }, + "https://github.com/zhangp365/ComfyUI-utils-nodes": { + "stars": 6, + "last_update": "2024-07-09 09:02:11", + "author_account_age_days": 306 + }, + "https://github.com/zhongpei/ComfyUI-InstructIR": { + "stars": 60, + "last_update": "2024-05-22 23:19:43", + "author_account_age_days": 3474 + }, + "https://github.com/zhongpei/Comfyui_image2prompt": { + "stars": 245, + "last_update": "2024-05-22 23:19:30", + "author_account_age_days": 3474 + }, + "https://github.com/zhuanqianfish/ComfyUI-EasyNode": { + "stars": 59, + "last_update": "2024-06-14 07:10:18", + "author_account_age_days": 4250 + }, + "https://github.com/zhulu111/ComfyUI_Bxb": { + "stars": 89, + "last_update": "2024-07-08 23:57:50", + "author_account_age_days": 54 + }, + "https://github.com/zohac/ComfyUI_ZC_DrawShape": { + "stars": 3, + "last_update": "2024-06-25 15:05:28", + "author_account_age_days": 2677 + }, + "https://github.com/zombieyang/sd-ppp": { + "stars": 20, + "last_update": "2024-07-08 01:25:47", + "author_account_age_days": 3933 + } +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/glob/cm_global.py b/custom_nodes/ComfyUI-Manager/glob/cm_global.py new file mode 100644 index 000000000..4041bcb6d --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/glob/cm_global.py @@ -0,0 +1,112 @@ +import traceback + +# +# Global Var +# +# Usage: +# import cm_global +# cm_global.variables['comfyui.revision'] = 1832 +# print(f"log mode: {cm_global.variables['logger.enabled']}") +# +variables = {} + + +# +# Global API +# +# Usage: +# [register API] +# import cm_global +# +# def api_hello(msg): +# print(f"hello: {msg}") +# return msg +# +# cm_global.register_api('hello', api_hello) +# +# [use API] +# import cm_global +# +# test = cm_global.try_call(api='hello', msg='an example') +# print(f"'{test}' is returned") +# + +APIs = {} + + +def register_api(k, f): + global APIs + APIs[k] = f + + +def try_call(**kwargs): + if 'api' in kwargs: + api_name = kwargs['api'] + try: + api = APIs.get(api_name) + if api is not None: + del kwargs['api'] + return api(**kwargs) + else: + print(f"WARN: The '{kwargs['api']}' API has not been registered.") + except Exception as e: + print(f"ERROR: An exception occurred while calling the '{api_name}' API.") + raise e + else: + return None + + +# +# Extension Info +# +# Usage: +# import cm_global +# +# cm_global.extension_infos['my_extension'] = {'version': [0, 1], 'name': 'me', 'description': 'example extension', } +# +extension_infos = {} + +on_extension_registered_handlers = {} + + +def register_extension(extension_name, v): + global extension_infos + global on_extension_registered_handlers + extension_infos[extension_name] = v + + if extension_name in on_extension_registered_handlers: + for k, f in on_extension_registered_handlers[extension_name]: + try: + f(extension_name, v) + except Exception: + print(f"[ERROR] '{k}' on_extension_registered_handlers") + traceback.print_exc() + + del on_extension_registered_handlers[extension_name] + + +def add_on_extension_registered(k, extension_name, f): + global on_extension_registered_handlers + if extension_name in extension_infos: + try: + v = extension_infos[extension_name] + f(extension_name, v) + except Exception: + print(f"[ERROR] '{k}' on_extension_registered_handler") + traceback.print_exc() + else: + if extension_name not in on_extension_registered_handlers: + on_extension_registered_handlers[extension_name] = [] + + on_extension_registered_handlers[extension_name].append((k, f)) + + +def add_on_revision_detected(k, f): + if 'comfyui.revision' in variables: + try: + f(variables['comfyui.revision']) + except Exception: + print(f"[ERROR] '{k}' on_revision_detected_handler") + traceback.print_exc() + else: + variables['cm.on_revision_detected_handler'].append((k, f)) diff --git a/custom_nodes/ComfyUI-Manager/glob/manager_core.py b/custom_nodes/ComfyUI-Manager/glob/manager_core.py new file mode 100644 index 000000000..d9db77827 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/glob/manager_core.py @@ -0,0 +1,1217 @@ +import os +import sys +import subprocess +import re +import shutil +import configparser +import platform +from datetime import datetime +import git +from git.remote import RemoteProgress +from urllib.parse import urlparse +from tqdm.auto import tqdm +import aiohttp +import threading +import json +import time +import yaml +import zipfile + +glob_path = os.path.join(os.path.dirname(__file__)) # ComfyUI-Manager/glob +sys.path.append(glob_path) + +import cm_global +from manager_util import * + +version = [2, 46, 2] +version_str = f"V{version[0]}.{version[1]}" + (f'.{version[2]}' if len(version) > 2 else '') + + +comfyui_manager_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) +custom_nodes_path = os.path.abspath(os.path.join(comfyui_manager_path, '..')) + +comfy_path = os.environ.get('COMFYUI_PATH') +if comfy_path is None: + comfy_path = os.path.abspath(os.path.join(custom_nodes_path, '..')) + +channel_list_path = os.path.join(comfyui_manager_path, 'channels.list') +config_path = os.path.join(comfyui_manager_path, "config.ini") +startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts") +git_script_path = os.path.join(comfyui_manager_path, "git_helper.py") +cache_dir = os.path.join(comfyui_manager_path, '.cache') +cached_config = None +js_path = None + +comfy_ui_required_revision = 1930 +comfy_ui_required_commit_datetime = datetime(2024, 1, 24, 0, 0, 0) + +comfy_ui_revision = "Unknown" +comfy_ui_commit_datetime = datetime(1900, 1, 1, 0, 0, 0) + + +cache_lock = threading.Lock() + + +channel_dict = None +channel_list = None +pip_map = None + + +def remap_pip_package(pkg): + if pkg in cm_global.pip_overrides: + res = cm_global.pip_overrides[pkg] + print(f"[ComfyUI-Manager] '{pkg}' is remapped to '{res}'") + return res + else: + return pkg + + +def get_installed_packages(): + global pip_map + + if pip_map is None: + try: + result = subprocess.check_output([sys.executable, '-m', 'pip', 'list'], universal_newlines=True) + + pip_map = {} + for line in result.split('\n'): + x = line.strip() + if x: + y = line.split() + if y[0] == 'Package' or y[0].startswith('-'): + continue + + pip_map[y[0]] = y[1] + except subprocess.CalledProcessError as e: + print(f"[ComfyUI-Manager] Failed to retrieve the information of installed pip packages.") + return set() + + return pip_map + + +def clear_pip_cache(): + global pip_map + pip_map = None + + +def is_blacklisted(name): + name = name.strip() + + pattern = r'([^<>!=]+)([<>!=]=?)(.*)' + match = re.search(pattern, name) + + if match: + name = match.group(1) + + if name in cm_global.pip_downgrade_blacklist: + pips = get_installed_packages() + + if match is None: + if name in pips: + return True + elif match.group(2) in ['<=', '==', '<']: + if name in pips: + if StrictVersion(pips[name]) >= StrictVersion(match.group(3)): + return True + + return False + + +def is_installed(name): + name = name.strip() + + if name.startswith('#'): + return True + + pattern = r'([^<>!=]+)([<>!=]=?)(.*)' + match = re.search(pattern, name) + + if match: + name = match.group(1) + + if name in cm_global.pip_downgrade_blacklist: + pips = get_installed_packages() + + if match is None: + if name in pips: + return True + elif match.group(2) in ['<=', '==', '<']: + if name in pips: + if StrictVersion(pips[name]) >= StrictVersion(match.group(3)): + print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'") + return True + + return name.lower() in get_installed_packages() + + +def get_channel_dict(): + global channel_dict + + if channel_dict is None: + channel_dict = {} + + if not os.path.exists(channel_list_path): + shutil.copy(channel_list_path+'.template', channel_list_path) + + with open(os.path.join(comfyui_manager_path, 'channels.list'), 'r') as file: + channels = file.read() + for x in channels.split('\n'): + channel_info = x.split("::") + if len(channel_info) == 2: + channel_dict[channel_info[0]] = channel_info[1] + + return channel_dict + + +def get_channel_list(): + global channel_list + + if channel_list is None: + channel_list = [] + for k, v in get_channel_dict().items(): + channel_list.append(f"{k}::{v}") + + return channel_list + + +class ManagerFuncs: + def __init__(self): + pass + + def get_current_preview_method(self): + return "none" + + def run_script(self, cmd, cwd='.'): + if len(cmd) > 0 and cmd[0].startswith("#"): + print(f"[ComfyUI-Manager] Unexpected behavior: `{cmd}`") + return 0 + + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + subprocess.check_call(cmd, cwd=cwd, env=new_env) + + return 0 + + +manager_funcs = ManagerFuncs() + + +def write_config(): + config = configparser.ConfigParser() + config['default'] = { + 'preview_method': manager_funcs.get_current_preview_method(), + 'badge_mode': get_config()['badge_mode'], + 'git_exe': get_config()['git_exe'], + 'channel_url': get_config()['channel_url'], + 'share_option': get_config()['share_option'], + 'bypass_ssl': get_config()['bypass_ssl'], + "file_logging": get_config()['file_logging'], + 'default_ui': get_config()['default_ui'], + 'component_policy': get_config()['component_policy'], + 'double_click_policy': get_config()['double_click_policy'], + 'windows_selector_event_loop_policy': get_config()['windows_selector_event_loop_policy'], + 'model_download_by_agent': get_config()['model_download_by_agent'], + 'downgrade_blacklist': get_config()['downgrade_blacklist'], + 'security_level': get_config()['security_level'], + } + with open(config_path, 'w') as configfile: + config.write(configfile) + + +def read_config(): + try: + config = configparser.ConfigParser() + config.read(config_path) + default_conf = config['default'] + + # policy migration: disable_unsecure_features -> security_level + if 'disable_unsecure_features' in default_conf: + if default_conf['disable_unsecure_features'].lower() == 'true': + security_level = 'strong' + else: + security_level = 'normal' + else: + security_level = default_conf['security_level'] if 'security_level' in default_conf else 'normal' + + return { + 'preview_method': default_conf['preview_method'] if 'preview_method' in default_conf else manager_funcs.get_current_preview_method(), + 'badge_mode': default_conf['badge_mode'] if 'badge_mode' in default_conf else 'none', + 'git_exe': default_conf['git_exe'] if 'git_exe' in default_conf else '', + 'channel_url': default_conf['channel_url'] if 'channel_url' in default_conf else 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', + 'share_option': default_conf['share_option'] if 'share_option' in default_conf else 'all', + 'bypass_ssl': default_conf['bypass_ssl'].lower() == 'true' if 'bypass_ssl' in default_conf else False, + 'file_logging': default_conf['file_logging'].lower() == 'true' if 'file_logging' in default_conf else True, + 'default_ui': default_conf['default_ui'] if 'default_ui' in default_conf else 'none', + 'component_policy': default_conf['component_policy'] if 'component_policy' in default_conf else 'workflow', + 'double_click_policy': default_conf['double_click_policy'] if 'double_click_policy' in default_conf else 'copy-all', + 'windows_selector_event_loop_policy': default_conf['windows_selector_event_loop_policy'].lower() == 'true' if 'windows_selector_event_loop_policy' in default_conf else False, + 'model_download_by_agent': default_conf['model_download_by_agent'].lower() == 'true' if 'model_download_by_agent' in default_conf else False, + 'downgrade_blacklist': default_conf['downgrade_blacklist'] if 'downgrade_blacklist' in default_conf else '', + 'security_level': security_level + } + + except Exception: + return { + 'preview_method': manager_funcs.get_current_preview_method(), + 'badge_mode': 'none', + 'git_exe': '', + 'channel_url': 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main', + 'share_option': 'all', + 'bypass_ssl': False, + 'file_logging': True, + 'default_ui': 'none', + 'component_policy': 'workflow', + 'double_click_policy': 'copy-all', + 'windows_selector_event_loop_policy': False, + 'model_download_by_agent': False, + 'downgrade_blacklist': '', + 'security_level': 'normal', + } + + +def get_config(): + global cached_config + + if cached_config is None: + cached_config = read_config() + + return cached_config + + +def switch_to_default_branch(repo): + show_result = repo.git.remote("show", "origin") + matches = re.search(r"\s*HEAD branch:\s*(.*)", show_result) + if matches: + default_branch = matches.group(1) + repo.git.checkout(default_branch) + + +def try_install_script(url, repo_path, install_cmd, instant_execution=False): + if not instant_execution and ((len(install_cmd) > 0 and install_cmd[0].startswith('#')) or (platform.system() == "Windows" and comfy_ui_commit_datetime.date() >= comfy_ui_required_commit_datetime.date())): + if not os.path.exists(startup_script_path): + os.makedirs(startup_script_path) + + script_path = os.path.join(startup_script_path, "install-scripts.txt") + with open(script_path, "a") as file: + obj = [repo_path] + install_cmd + file.write(f"{obj}\n") + + return True + else: + if len(install_cmd) == 5 and install_cmd[2:4] == ['pip', 'install']: + if is_blacklisted(install_cmd[4]): + print(f"[ComfyUI-Manager] skip black listed pip installation: '{install_cmd[4]}'") + return True + + print(f"\n## ComfyUI-Manager: EXECUTE => {install_cmd}") + code = manager_funcs.run_script(install_cmd, cwd=repo_path) + + if platform.system() != "Windows": + try: + if comfy_ui_commit_datetime.date() < comfy_ui_required_commit_datetime.date(): + print("\n\n###################################################################") + print(f"[WARN] ComfyUI-Manager: Your ComfyUI version ({comfy_ui_revision})[{comfy_ui_commit_datetime.date()}] is too old. Please update to the latest version.") + print(f"[WARN] The extension installation feature may not work properly in the current installed ComfyUI version on Windows environment.") + print("###################################################################\n\n") + except: + pass + + if code != 0: + if url is None: + url = os.path.dirname(repo_path) + print(f"install script failed: {url}") + return False + + +# use subprocess to avoid file system lock by git (Windows) +def __win_check_git_update(path, do_fetch=False, do_update=False): + if do_fetch: + command = [sys.executable, git_script_path, "--fetch", path] + elif do_update: + command = [sys.executable, git_script_path, "--pull", path] + else: + command = [sys.executable, git_script_path, "--check", path] + + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=custom_nodes_path) + output, _ = process.communicate() + output = output.decode('utf-8').strip() + + if 'detected dubious' in output: + # fix and try again + safedir_path = path.replace('\\', '/') + try: + print(f"[ComfyUI-Manager] Try fixing 'dubious repository' error on '{safedir_path}' repo") + process = subprocess.Popen(['git', 'config', '--global', '--add', 'safe.directory', safedir_path], env=new_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, _ = process.communicate() + + process = subprocess.Popen(command, env=new_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, _ = process.communicate() + output = output.decode('utf-8').strip() + except Exception: + print(f'[ComfyUI-Manager] failed to fixing') + + if 'detected dubious' in output: + print(f'\n[ComfyUI-Manager] Failed to fixing repository setup. Please execute this command on cmd: \n' + f'-----------------------------------------------------------------------------------------\n' + f'git config --global --add safe.directory "{safedir_path}"\n' + f'-----------------------------------------------------------------------------------------\n') + + if do_update: + if "CUSTOM NODE PULL: Success" in output: + process.wait() + print(f"\rUpdated: {path}") + return True, True # updated + elif "CUSTOM NODE PULL: None" in output: + process.wait() + return False, True # there is no update + else: + print(f"\rUpdate error: {path}") + process.wait() + return False, False # update failed + else: + if "CUSTOM NODE CHECK: True" in output: + process.wait() + return True, True + elif "CUSTOM NODE CHECK: False" in output: + process.wait() + return False, True + else: + print(f"\rFetch error: {path}") + print(f"\n{output}\n") + process.wait() + return False, True + + +def __win_check_git_pull(path): + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + command = [sys.executable, git_script_path, "--pull", path] + process = subprocess.Popen(command, env=new_env, cwd=custom_nodes_path) + process.wait() + + +def execute_install_script(url, repo_path, lazy_mode=False, instant_execution=False): + install_script_path = os.path.join(repo_path, "install.py") + requirements_path = os.path.join(repo_path, "requirements.txt") + + if lazy_mode: + install_cmd = ["#LAZY-INSTALL-SCRIPT", sys.executable] + try_install_script(url, repo_path, install_cmd) + else: + if os.path.exists(requirements_path): + print("Install: pip packages") + with open(requirements_path, "r") as requirements_file: + for line in requirements_file: + 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 package_name.strip() != "" and not package_name.startswith('#'): + try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution) + + if os.path.exists(install_script_path): + print(f"Install: install script") + install_cmd = [sys.executable, "install.py"] + try_install_script(url, repo_path, install_cmd, instant_execution=instant_execution) + + return True + + +def git_repo_has_updates(path, do_fetch=False, do_update=False): + if do_fetch: + print(f"\x1b[2K\rFetching: {path}", end='') + elif do_update: + print(f"\x1b[2K\rUpdating: {path}", end='') + + # Check if the path is a git repository + if not os.path.exists(os.path.join(path, '.git')): + raise ValueError('Not a git repository') + + if platform.system() == "Windows": + updated, success = __win_check_git_update(path, do_fetch, do_update) + if updated and success: + execute_install_script(None, path, lazy_mode=True) + return updated, success + else: + # Fetch the latest commits from the remote repository + repo = git.Repo(path) + + current_branch = repo.active_branch + branch_name = current_branch.name + + remote_name = 'origin' + remote = repo.remote(name=remote_name) + + # Get the current commit hash + commit_hash = repo.head.commit.hexsha + + if do_fetch or do_update: + remote.fetch() + + if do_update: + if repo.head.is_detached: + switch_to_default_branch(repo) + + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + if commit_hash == remote_commit_hash: + repo.close() + return False, True + + try: + remote.pull() + repo.git.submodule('update', '--init', '--recursive') + new_commit_hash = repo.head.commit.hexsha + + if commit_hash != new_commit_hash: + execute_install_script(None, path) + print(f"\x1b[2K\rUpdated: {path}") + return True, True + else: + return False, False + + except Exception as e: + print(f"\nUpdating failed: {path}\n{e}", file=sys.stderr) + return False, False + + if repo.head.is_detached: + repo.close() + return True, True + + # Get commit hash of the remote branch + current_branch = repo.active_branch + branch_name = current_branch.name + + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + # Compare the commit hashes to determine if the local repository is behind the remote repository + if commit_hash != remote_commit_hash: + # Get the commit dates + commit_date = repo.head.commit.committed_datetime + remote_commit_date = repo.refs[f'{remote_name}/{branch_name}'].object.committed_datetime + + # Compare the commit dates to determine if the local repository is behind the remote repository + if commit_date < remote_commit_date: + repo.close() + return True, True + + repo.close() + + return False, True + + +class GitProgress(RemoteProgress): + def __init__(self): + super().__init__() + self.pbar = tqdm() + + def update(self, op_code, cur_count, max_count=None, message=''): + self.pbar.total = max_count + self.pbar.n = cur_count + self.pbar.pos = 0 + self.pbar.refresh() + + +def is_valid_url(url): + try: + # Check for HTTP/HTTPS URL format + result = urlparse(url) + if all([result.scheme, result.netloc]): + return True + finally: + # Check for SSH git URL format + pattern = re.compile(r"^(.+@|ssh:\/\/).+:.+$") + if pattern.match(url): + return True + return False + + +def gitclone_install(files, instant_execution=False, msg_prefix=''): + print(f"{msg_prefix}Install: {files}") + for url in files: + if not is_valid_url(url): + print(f"Invalid git url: '{url}'") + return False + + if url.endswith("/"): + url = url[:-1] + try: + print(f"Download: git clone '{url}'") + repo_name = os.path.splitext(os.path.basename(url))[0] + repo_path = os.path.join(custom_nodes_path, repo_name) + + # Clone the repository from the remote URL + if not instant_execution and platform.system() == 'Windows': + res = manager_funcs.run_script([sys.executable, git_script_path, "--clone", custom_nodes_path, url], cwd=custom_nodes_path) + if res != 0: + return False + else: + repo = git.Repo.clone_from(url, repo_path, recursive=True, progress=GitProgress()) + repo.git.clear_cache() + repo.close() + + if not execute_install_script(url, repo_path, instant_execution=instant_execution): + return False + + except Exception as e: + print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr) + return False + + print("Installation was successful.") + return True + + +def git_pull(path): + # Check if the path is a git repository + if not os.path.exists(os.path.join(path, '.git')): + raise ValueError('Not a git repository') + + # Pull the latest changes from the remote repository + if platform.system() == "Windows": + return __win_check_git_pull(path) + else: + repo = git.Repo(path) + + if repo.is_dirty(): + repo.git.stash() + + if repo.head.is_detached: + switch_to_default_branch(repo) + + current_branch = repo.active_branch + remote_name = current_branch.tracking_branch().remote_name + remote = repo.remote(name=remote_name) + + remote.pull() + repo.git.submodule('update', '--init', '--recursive') + + repo.close() + + return True + + +async def get_data(uri, silent=False): + if not silent: + print(f"FETCH DATA from: {uri}", end="") + + if uri.startswith("http"): + async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session: + async with session.get(uri) as resp: + json_text = await resp.text() + else: + with cache_lock: + with open(uri, "r", encoding="utf-8") as f: + json_text = f.read() + + json_obj = json.loads(json_text) + if not silent: + print(f" [DONE]") + return json_obj + + +def simple_hash(input_string): + hash_value = 0 + for char in input_string: + hash_value = (hash_value * 31 + ord(char)) % (2**32) + + return hash_value + + +def is_file_created_within_one_day(file_path): + if not os.path.exists(file_path): + return False + + file_creation_time = os.path.getctime(file_path) + current_time = datetime.now().timestamp() + time_difference = current_time - file_creation_time + + return time_difference <= 86400 + + +async def get_data_by_mode(mode, filename, channel_url=None): + if channel_url in get_channel_dict(): + channel_url = get_channel_dict()[channel_url] + + try: + if mode == "local": + uri = os.path.join(comfyui_manager_path, filename) + json_obj = await get_data(uri) + else: + if channel_url is None: + uri = get_config()['channel_url'] + '/' + filename + else: + uri = channel_url + '/' + filename + + cache_uri = str(simple_hash(uri))+'_'+filename + cache_uri = os.path.join(cache_dir, cache_uri) + + if mode == "cache": + if is_file_created_within_one_day(cache_uri): + json_obj = await get_data(cache_uri) + else: + json_obj = await get_data(uri) + with cache_lock: + with open(cache_uri, "w", encoding='utf-8') as file: + json.dump(json_obj, file, indent=4, sort_keys=True) + else: + json_obj = await get_data(uri) + with cache_lock: + with open(cache_uri, "w", encoding='utf-8') as file: + json.dump(json_obj, file, indent=4, sort_keys=True) + except Exception as e: + print(f"[ComfyUI-Manager] Due to a network error, switching to local mode.\n=> {filename}\n=> {e}") + uri = os.path.join(comfyui_manager_path, filename) + json_obj = await get_data(uri) + + return json_obj + + +def gitclone_fix(files, instant_execution=False): + print(f"Try fixing: {files}") + for url in files: + if not is_valid_url(url): + print(f"Invalid git url: '{url}'") + return False + + if url.endswith("/"): + url = url[:-1] + try: + repo_name = os.path.splitext(os.path.basename(url))[0] + repo_path = os.path.join(custom_nodes_path, repo_name) + + if os.path.exists(repo_path+'.disabled'): + repo_path = repo_path+'.disabled' + + if not execute_install_script(url, repo_path, instant_execution=instant_execution): + return False + + except Exception as e: + print(f"Install(git-clone) error: {url} / {e}", file=sys.stderr) + return False + + print(f"Attempt to fixing '{files}' is done.") + return True + + +def pip_install(packages): + install_cmd = ['#FORCE', sys.executable, "-m", "pip", "install", '-U'] + packages + try_install_script('pip install via manager', '..', install_cmd) + + +def rmtree(path): + retry_count = 3 + + while True: + try: + retry_count -= 1 + + if platform.system() == "Windows": + manager_funcs.run_script(['attrib', '-R', path + '\\*', '/S']) + shutil.rmtree(path) + + return True + + except Exception as ex: + print(f"ex: {ex}") + time.sleep(3) + + if retry_count < 0: + raise ex + + print(f"Uninstall retry({retry_count})") + + +def gitclone_uninstall(files): + import os + + print(f"Uninstall: {files}") + for url in files: + if url.endswith("/"): + url = url[:-1] + try: + dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_path, dir_name) + + # safety check + if dir_path == '/' or dir_path[1:] == ":/" or dir_path == '': + print(f"Uninstall(git-clone) error: invalid path '{dir_path}' for '{url}'") + return False + + install_script_path = os.path.join(dir_path, "uninstall.py") + disable_script_path = os.path.join(dir_path, "disable.py") + if os.path.exists(install_script_path): + uninstall_cmd = [sys.executable, "uninstall.py"] + code = manager_funcs.run_script(uninstall_cmd, cwd=dir_path) + + if code != 0: + print(f"An error occurred during the execution of the uninstall.py script. Only the '{dir_path}' will be deleted.") + elif os.path.exists(disable_script_path): + disable_script = [sys.executable, "disable.py"] + code = manager_funcs.run_script(disable_script, cwd=dir_path) + if code != 0: + print(f"An error occurred during the execution of the disable.py script. Only the '{dir_path}' will be deleted.") + + if os.path.exists(dir_path): + rmtree(dir_path) + elif os.path.exists(dir_path + ".disabled"): + rmtree(dir_path + ".disabled") + except Exception as e: + print(f"Uninstall(git-clone) error: {url} / {e}", file=sys.stderr) + return False + + print("Uninstallation was successful.") + return True + + +def gitclone_set_active(files, is_disable): + import os + + if is_disable: + action_name = "Disable" + else: + action_name = "Enable" + + print(f"{action_name}: {files}") + for url in files: + if url.endswith("/"): + url = url[:-1] + try: + dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_path, dir_name) + + # safety check + if dir_path == '/' or dir_path[1:] == ":/" or dir_path == '': + print(f"{action_name}(git-clone) error: invalid path '{dir_path}' for '{url}'") + return False + + if is_disable: + current_path = dir_path + new_path = dir_path + ".disabled" + else: + current_path = dir_path + ".disabled" + new_path = dir_path + + os.rename(current_path, new_path) + + if is_disable: + if os.path.exists(os.path.join(new_path, "disable.py")): + disable_script = [sys.executable, "disable.py"] + try_install_script(url, new_path, disable_script) + else: + if os.path.exists(os.path.join(new_path, "enable.py")): + enable_script = [sys.executable, "enable.py"] + try_install_script(url, new_path, enable_script) + + except Exception as e: + print(f"{action_name}(git-clone) error: {url} / {e}", file=sys.stderr) + return False + + print(f"{action_name} was successful.") + return True + + +def gitclone_update(files, instant_execution=False, skip_script=False, msg_prefix=""): + import os + + print(f"{msg_prefix}Update: {files}") + for url in files: + if url.endswith("/"): + url = url[:-1] + try: + repo_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + repo_path = os.path.join(custom_nodes_path, repo_name) + + if os.path.exists(repo_path+'.disabled'): + repo_path = repo_path+'.disabled' + + git_pull(repo_path) + + if not skip_script: + if instant_execution: + if not execute_install_script(url, repo_path, lazy_mode=False, instant_execution=True): + return False + else: + if not execute_install_script(url, repo_path, lazy_mode=True): + return False + + except Exception as e: + print(f"Update(git-clone) error: {url} / {e}", file=sys.stderr) + return False + + if not skip_script: + print("Update was successful.") + return True + + +def update_path(repo_path, instant_execution=False): + if not os.path.exists(os.path.join(repo_path, '.git')): + return "fail" + + # version check + repo = git.Repo(repo_path) + + if repo.head.is_detached: + switch_to_default_branch(repo) + + current_branch = repo.active_branch + branch_name = current_branch.name + + if current_branch.tracking_branch() is None: + print(f"[ComfyUI-Manager] There is no tracking branch ({current_branch})") + remote_name = 'origin' + else: + remote_name = current_branch.tracking_branch().remote_name + remote = repo.remote(name=remote_name) + + try: + remote.fetch() + except Exception as e: + if 'detected dubious' in str(e): + print(f"[ComfyUI-Manager] Try fixing 'dubious repository' error on 'ComfyUI' repository") + safedir_path = comfy_path.replace('\\', '/') + subprocess.run(['git', 'config', '--global', '--add', 'safe.directory', safedir_path]) + try: + remote.fetch() + except Exception: + print(f"\n[ComfyUI-Manager] Failed to fixing repository setup. Please execute this command on cmd: \n" + f"-----------------------------------------------------------------------------------------\n" + f'git config --global --add safe.directory "{safedir_path}"\n' + f"-----------------------------------------------------------------------------------------\n") + + commit_hash = repo.head.commit.hexsha + remote_commit_hash = repo.refs[f'{remote_name}/{branch_name}'].object.hexsha + + if commit_hash != remote_commit_hash: + git_pull(repo_path) + execute_install_script("ComfyUI", repo_path, instant_execution=instant_execution) + return "updated" + else: + return "skipped" + + +def lookup_customnode_by_url(data, target): + for x in data['custom_nodes']: + if target in x['files']: + dir_name = os.path.splitext(os.path.basename(target))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_path, dir_name) + if os.path.exists(dir_path): + x['installed'] = 'True' + elif os.path.exists(dir_path + ".disabled"): + x['installed'] = 'Disabled' + return x + + return None + + +def simple_check_custom_node(url): + dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_path, dir_name) + if os.path.exists(dir_path): + return 'installed' + elif os.path.exists(dir_path+'.disabled'): + return 'disabled' + + return 'not-installed' + + +def check_a_custom_node_installed(item, do_fetch=False, do_update_check=True, do_update=False): + item['installed'] = 'None' + + if item['install_type'] == 'git-clone' and len(item['files']) == 1: + url = item['files'][0] + + if url.endswith("/"): + url = url[:-1] + + dir_name = os.path.splitext(os.path.basename(url))[0].replace(".git", "") + dir_path = os.path.join(custom_nodes_path, dir_name) + if os.path.exists(dir_path): + try: + item['installed'] = 'True' # default + + if cm_global.try_call(api="cm.is_import_failed_extension", name=dir_name): + item['installed'] = 'Fail' + + if do_update_check: + update_state, success = git_repo_has_updates(dir_path, do_fetch, do_update) + if (do_update_check or do_update) and update_state: + item['installed'] = 'Update' + elif do_update and not success: + item['installed'] = 'Fail' + except: + if cm_global.try_call(api="cm.is_import_failed_extension", name=dir_name): + item['installed'] = 'Fail' + else: + item['installed'] = 'True' + + elif os.path.exists(dir_path + ".disabled"): + item['installed'] = 'Disabled' + + else: + item['installed'] = 'False' + + elif item['install_type'] == 'copy' and len(item['files']) == 1: + dir_name = os.path.basename(item['files'][0]) + + if item['files'][0].endswith('.py'): + base_path = custom_nodes_path + elif 'js_path' in item: + base_path = os.path.join(js_path, item['js_path']) + else: + base_path = js_path + + file_path = os.path.join(base_path, dir_name) + if os.path.exists(file_path): + if cm_global.try_call(api="cm.is_import_failed_extension", name=dir_name): + item['installed'] = 'Fail' + else: + item['installed'] = 'True' + elif os.path.exists(file_path + ".disabled"): + item['installed'] = 'Disabled' + else: + item['installed'] = 'False' + + +def get_installed_pip_packages(): + # extract pip package infos + pips = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'], text=True).split('\n') + + res = {} + for x in pips: + if x.strip() == "": + continue + + if ' @ ' in x: + spec_url = x.split(' @ ') + res[spec_url[0]] = spec_url[1] + else: + res[x] = "" + + return res + + +def get_current_snapshot(): + # Get ComfyUI hash + repo_path = comfy_path + + if not os.path.exists(os.path.join(repo_path, '.git')): + print(f"ComfyUI update fail: The installed ComfyUI does not have a Git repository.") + return {} + + repo = git.Repo(repo_path) + comfyui_commit_hash = repo.head.commit.hexsha + + git_custom_nodes = {} + file_custom_nodes = [] + + # Get custom nodes hash + for path in os.listdir(custom_nodes_path): + fullpath = os.path.join(custom_nodes_path, path) + + if os.path.isdir(fullpath): + is_disabled = path.endswith(".disabled") + + try: + git_dir = os.path.join(fullpath, '.git') + + if not os.path.exists(git_dir): + continue + + repo = git.Repo(fullpath) + commit_hash = repo.head.commit.hexsha + url = repo.remotes.origin.url + git_custom_nodes[url] = { + 'hash': commit_hash, + 'disabled': is_disabled + } + + except: + print(f"Failed to extract snapshots for the custom node '{path}'.") + + elif path.endswith('.py'): + is_disabled = path.endswith(".py.disabled") + filename = os.path.basename(path) + item = { + 'filename': filename, + 'disabled': is_disabled + } + + file_custom_nodes.append(item) + + pip_packages = get_installed_pip_packages() + + return { + 'comfyui': comfyui_commit_hash, + 'git_custom_nodes': git_custom_nodes, + 'file_custom_nodes': file_custom_nodes, + 'pips': pip_packages, + } + + +def save_snapshot_with_postfix(postfix, path=None): + if path is None: + now = datetime.now() + + date_time_format = now.strftime("%Y-%m-%d_%H-%M-%S") + file_name = f"{date_time_format}_{postfix}" + + path = os.path.join(comfyui_manager_path, 'snapshots', f"{file_name}.json") + else: + file_name = path.replace('\\', '/').split('/')[-1] + file_name = file_name.split('.')[-2] + + snapshot = get_current_snapshot() + if path.endswith('.json'): + with open(path, "w") as json_file: + json.dump(snapshot, json_file, indent=4) + + return file_name + '.json' + + elif path.endswith('.yaml'): + with open(path, "w") as yaml_file: + snapshot = {'custom_nodes': snapshot} + yaml.dump(snapshot, yaml_file, allow_unicode=True) + + return path + + +async def extract_nodes_from_workflow(filepath, mode='local', channel_url='default'): + # prepare json data + workflow = None + if filepath.endswith('.json'): + with open(filepath, "r", encoding="UTF-8", errors="ignore") as json_file: + try: + workflow = json.load(json_file) + except: + print(f"Invalid workflow file: {filepath}") + exit(-1) + + elif filepath.endswith('.png'): + from PIL import Image + with Image.open(filepath) as img: + if 'workflow' not in img.info: + print(f"The specified .png file doesn't have a workflow: {filepath}") + exit(-1) + else: + try: + workflow = json.loads(img.info['workflow']) + except: + print(f"This is not a valid .png file containing a ComfyUI workflow: {filepath}") + exit(-1) + + if workflow is None: + print(f"Invalid workflow file: {filepath}") + exit(-1) + + # extract nodes + used_nodes = set() + + def extract_nodes(sub_workflow): + for x in sub_workflow['nodes']: + node_name = x.get('type') + + # skip virtual nodes + if node_name in ['Reroute', 'Note']: + continue + + if node_name is not None and not node_name.startswith('workflow/'): + used_nodes.add(node_name) + + if 'nodes' in workflow: + extract_nodes(workflow) + + if 'extra' in workflow: + if 'groupNodes' in workflow['extra']: + for x in workflow['extra']['groupNodes'].values(): + extract_nodes(x) + + # lookup dependent custom nodes + ext_map = await get_data_by_mode(mode, 'extension-node-map.json', channel_url) + + rext_map = {} + preemption_map = {} + patterns = [] + for k, v in ext_map.items(): + if k == 'https://github.com/comfyanonymous/ComfyUI': + for x in v[0]: + if x not in preemption_map: + preemption_map[x] = [] + + preemption_map[x] = k + continue + + for x in v[0]: + if x not in rext_map: + rext_map[x] = [] + + rext_map[x].append(k) + + if 'preemptions' in v[1]: + for x in v[1]['preemptions']: + if x not in preemption_map: + preemption_map[x] = [] + + preemption_map[x] = k + + if 'nodename_pattern' in v[1]: + patterns.append((v[1]['nodename_pattern'], k)) + + # identify used extensions + used_exts = set() + unknown_nodes = set() + + for node_name in used_nodes: + ext = preemption_map.get(node_name) + + if ext is None: + ext = rext_map.get(node_name) + if ext is not None: + ext = ext[0] + + if ext is None: + for pat_ext in patterns: + if re.search(pat_ext[0], node_name): + ext = pat_ext[1] + break + + if ext == 'https://github.com/comfyanonymous/ComfyUI': + pass + elif ext is not None: + if 'Fooocus' in ext: + print(f">> {node_name}") + + used_exts.add(ext) + else: + unknown_nodes.add(node_name) + + return used_exts, unknown_nodes + + +def unzip(model_path): + if not os.path.exists(model_path): + print(f"[ComfyUI-Manager] unzip: File not found: {model_path}") + return False + + base_dir = os.path.dirname(model_path) + filename = os.path.basename(model_path) + target_dir = os.path.join(base_dir, filename[:-4]) + + os.makedirs(target_dir, exist_ok=True) + + with zipfile.ZipFile(model_path, 'r') as zip_ref: + zip_ref.extractall(target_dir) + + # Check if there's only one directory inside the target directory + contents = os.listdir(target_dir) + if len(contents) == 1 and os.path.isdir(os.path.join(target_dir, contents[0])): + nested_dir = os.path.join(target_dir, contents[0]) + # Move each file and sub-directory in the nested directory up to the target directory + for item in os.listdir(nested_dir): + shutil.move(os.path.join(nested_dir, item), os.path.join(target_dir, item)) + # Remove the now empty nested directory + os.rmdir(nested_dir) + + os.remove(model_path) + return True + diff --git a/custom_nodes/ComfyUI-Manager/glob/manager_downloader.py b/custom_nodes/ComfyUI-Manager/glob/manager_downloader.py new file mode 100644 index 000000000..8a8c73c03 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/glob/manager_downloader.py @@ -0,0 +1,70 @@ +import os +from urllib.parse import urlparse + +aria2 = os.getenv('COMFYUI_MANAGER_ARIA2_SERVER') +HF_ENDPOINT = os.getenv('HF_ENDPOINT') + +if aria2 is not None: + secret = os.getenv('COMFYUI_MANAGER_ARIA2_SECRET') + url = urlparse(aria2) + port = url.port + host = url.scheme + '://' + url.hostname + import aria2p + + aria2 = aria2p.API(aria2p.Client(host=host, port=port, secret=secret)) + + +def download_url(model_url: str, model_dir: str, filename: str): + if aria2: + return aria2_download_url(model_url, model_dir, filename) + else: + from torchvision.datasets.utils import download_url as torchvision_download_url + + return torchvision_download_url(model_url, model_dir, filename) + + +def aria2_find_task(dir: str, filename: str): + target = os.path.join(dir, filename) + + downloads = aria2.get_downloads() + + for download in downloads: + for file in download.files: + if file.is_metadata: + continue + if str(file.path) == target: + return download + + +def aria2_download_url(model_url: str, model_dir: str, filename: str): + import manager_core as core + import tqdm + import time + + if model_dir.startswith(core.comfy_path): + model_dir = model_dir[len(core.comfy_path) :] + + if HF_ENDPOINT: + model_url = model_url.replace('https://huggingface.co', HF_ENDPOINT) + + download_dir = model_dir if model_dir.startswith('/') else os.path.join('/models', model_dir) + + download = aria2_find_task(download_dir, filename) + if download is None: + options = {'dir': download_dir, 'out': filename} + download = aria2.add(model_url, options)[0] + + if download.is_active: + with tqdm.tqdm( + total=download.total_length, + bar_format='{l_bar}{bar}{r_bar}', + desc=filename, + unit='B', + unit_scale=True, + ) as progress_bar: + while download.is_active: + if progress_bar.total == 0 and download.total_length != 0: + progress_bar.reset(download.total_length) + progress_bar.update(download.completed_length - progress_bar.n) + time.sleep(1) + download.update() diff --git a/custom_nodes/ComfyUI-Manager/glob/manager_server.py b/custom_nodes/ComfyUI-Manager/glob/manager_server.py new file mode 100644 index 000000000..f157fca79 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/glob/manager_server.py @@ -0,0 +1,1707 @@ +import mimetypes +import traceback + +import folder_paths +import locale +import subprocess # don't remove this +import concurrent +import nodes +import hashlib +import os +import sys +import threading +import re +import shutil +import git + +from server import PromptServer +import manager_core as core +import cm_global + +print(f"### Loading: ComfyUI-Manager ({core.version_str})") + +comfy_ui_hash = "-" + + +def handle_stream(stream, prefix): + stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace') + for msg in stream: + if prefix == '[!]' and ('it/s]' in msg or 's/it]' in msg) and ('%|' in msg or 'it [' in msg): + if msg.startswith('100%'): + print('\r' + msg, end="", file=sys.stderr), + else: + print('\r' + msg[:-1], end="", file=sys.stderr), + else: + if prefix == '[!]': + print(prefix, msg, end="", file=sys.stderr) + else: + print(prefix, msg, end="") + + +from comfy.cli_args import args +import latent_preview + + +is_local_mode = args.listen.startswith('127.') or args.listen.startswith('local.') + + +def is_allowed_security_level(level): + if level == 'high': + if is_local_mode: + return core.get_config()['security_level'].lower() in ['weak', 'normal'] + else: + return core.get_config()['security_level'].lower() == 'weak' + elif level == 'middle': + return core.get_config()['security_level'].lower() in ['weak', 'normal'] + else: + return True + + +async def get_risky_level(files): + 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/custom-node-list.json') + + all_urls = set() + for x in json_data1['custom_nodes'] + json_data2['custom_nodes']: + all_urls.update(x['files']) + + for x in files: + if x not in all_urls: + return "high" + + return "middle" + + +class ManagerFuncsInComfyUI(core.ManagerFuncs): + def get_current_preview_method(self): + if args.preview_method == latent_preview.LatentPreviewMethod.Auto: + return "auto" + elif args.preview_method == latent_preview.LatentPreviewMethod.Latent2RGB: + return "latent2rgb" + elif args.preview_method == latent_preview.LatentPreviewMethod.TAESD: + return "taesd" + else: + return "none" + + def run_script(self, cmd, cwd='.'): + if len(cmd) > 0 and cmd[0].startswith("#"): + print(f"[ComfyUI-Manager] Unexpected behavior: `{cmd}`") + return 0 + + process = subprocess.Popen(cmd, cwd=cwd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1) + + stdout_thread = threading.Thread(target=handle_stream, args=(process.stdout, "")) + stderr_thread = threading.Thread(target=handle_stream, args=(process.stderr, "[!]")) + + stdout_thread.start() + stderr_thread.start() + + stdout_thread.join() + stderr_thread.join() + + return process.wait() + + +core.manager_funcs = ManagerFuncsInComfyUI() + +sys.path.append('../..') + +from manager_downloader import download_url + +core.comfy_path = os.path.dirname(folder_paths.__file__) +core.js_path = os.path.join(core.comfy_path, "web", "extensions") + +local_db_model = os.path.join(core.comfyui_manager_path, "model-list.json") +local_db_alter = os.path.join(core.comfyui_manager_path, "alter-list.json") +local_db_custom_node_list = os.path.join(core.comfyui_manager_path, "custom-node-list.json") +local_db_extension_node_mappings = os.path.join(core.comfyui_manager_path, "extension-node-map.json") +components_path = os.path.join(core.comfyui_manager_path, 'components') + + +def set_preview_method(method): + if method == 'auto': + args.preview_method = latent_preview.LatentPreviewMethod.Auto + elif method == 'latent2rgb': + args.preview_method = latent_preview.LatentPreviewMethod.Latent2RGB + elif method == 'taesd': + args.preview_method = latent_preview.LatentPreviewMethod.TAESD + else: + args.preview_method = latent_preview.LatentPreviewMethod.NoPreviews + + core.get_config()['preview_method'] = args.preview_method + + +set_preview_method(core.get_config()['preview_method']) + + +def set_badge_mode(mode): + core.get_config()['badge_mode'] = mode + + +def set_default_ui_mode(mode): + core.get_config()['default_ui'] = mode + + +def set_component_policy(mode): + core.get_config()['component_policy'] = mode + + +def set_double_click_policy(mode): + core.get_config()['double_click_policy'] = mode + + +def print_comfyui_version(): + global comfy_ui_hash + + is_detached = False + try: + repo = git.Repo(os.path.dirname(folder_paths.__file__)) + core.comfy_ui_revision = len(list(repo.iter_commits('HEAD'))) + + comfy_ui_hash = repo.head.commit.hexsha + cm_global.variables['comfyui.revision'] = core.comfy_ui_revision + + core.comfy_ui_commit_datetime = repo.head.commit.committed_datetime + cm_global.variables['comfyui.commit_datetime'] = core.comfy_ui_commit_datetime + + is_detached = repo.head.is_detached + current_branch = repo.active_branch.name + + try: + if core.comfy_ui_commit_datetime.date() < core.comfy_ui_required_commit_datetime.date(): + print(f"\n\n## [WARN] ComfyUI-Manager: Your ComfyUI version ({core.comfy_ui_revision})[{core.comfy_ui_commit_datetime.date()}] is too old. Please update to the latest version. ##\n\n") + except: + pass + + # process on_revision_detected --> + if 'cm.on_revision_detected_handler' in cm_global.variables: + for k, f in cm_global.variables['cm.on_revision_detected_handler']: + try: + f(core.comfy_ui_revision) + except Exception: + print(f"[ERROR] '{k}' on_revision_detected_handler") + traceback.print_exc() + + del cm_global.variables['cm.on_revision_detected_handler'] + else: + print(f"[ComfyUI-Manager] Some features are restricted due to your ComfyUI being outdated.") + # <-- + + if current_branch == "master": + print(f"### ComfyUI Revision: {core.comfy_ui_revision} [{comfy_ui_hash[:8]}] | Released on '{core.comfy_ui_commit_datetime.date()}'") + else: + print(f"### ComfyUI Revision: {core.comfy_ui_revision} on '{current_branch}' [{comfy_ui_hash[:8]}] | Released on '{core.comfy_ui_commit_datetime.date()}'") + except: + if is_detached: + print(f"### ComfyUI Revision: {core.comfy_ui_revision} [{comfy_ui_hash[:8]}] *DETACHED | Released on '{core.comfy_ui_commit_datetime.date()}'") + else: + print("### ComfyUI Revision: UNKNOWN (The currently installed ComfyUI is not a Git repository)") + + +print_comfyui_version() + + +async def populate_github_stats(json_obj, json_obj_github): + if 'custom_nodes' in json_obj: + for i, node in enumerate(json_obj['custom_nodes']): + url = node['reference'] + if url in json_obj_github: + json_obj['custom_nodes'][i]['stars'] = json_obj_github[url]['stars'] + json_obj['custom_nodes'][i]['last_update'] = json_obj_github[url]['last_update'] + json_obj['custom_nodes'][i]['trust'] = json_obj_github[url]['author_account_age_days'] > 180 + else: + json_obj['custom_nodes'][i]['stars'] = -1 + json_obj['custom_nodes'][i]['last_update'] = -1 + json_obj['custom_nodes'][i]['trust'] = False + return json_obj + + +def setup_environment(): + git_exe = core.get_config()['git_exe'] + + if git_exe != '': + git.Git().update_environment(GIT_PYTHON_GIT_EXECUTABLE=git_exe) + + +setup_environment() + +# Expand Server api + +import server +from aiohttp import web +import aiohttp +import json +import zipfile +import urllib.request + + +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" + else: + if data['save_path'].startswith("custom_nodes"): + base_model = os.path.join(core.comfy_path, data['save_path']) + else: + base_model = os.path.join(folder_paths.models_dir, data['save_path']) + else: + model_type = data['type'] + if model_type == "checkpoints": + 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 == "VAE": + base_model = folder_paths.folder_names_and_paths["vae"][0][0] + elif model_type == "lora": + base_model = folder_paths.folder_names_and_paths["loras"][0][0] + elif model_type == "T2I-Adapter": + base_model = folder_paths.folder_names_and_paths["controlnet"][0][0] + elif model_type == "T2I-Style": + base_model = folder_paths.folder_names_and_paths["controlnet"][0][0] + elif model_type == "controlnet": + base_model = folder_paths.folder_names_and_paths["controlnet"][0][0] + elif model_type == "clip_vision": + base_model = folder_paths.folder_names_and_paths["clip_vision"][0][0] + elif model_type == "gligen": + base_model = folder_paths.folder_names_and_paths["gligen"][0][0] + elif model_type == "upscale": + 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] + else: + base_model = "etc" + + return base_model + + +def get_model_path(data): + base_model = get_model_dir(data) + return os.path.join(base_model, data['filename']) + + +def check_custom_nodes_installed(json_obj, do_fetch=False, do_update_check=True, do_update=False): + if do_fetch: + print("Start fetching...", end="") + elif do_update: + print("Start updating...", end="") + elif do_update_check: + print("Start update check...", end="") + + def process_custom_node(item): + core.check_a_custom_node_installed(item, do_fetch, do_update_check, do_update) + + with concurrent.futures.ThreadPoolExecutor(4) as executor: + for item in json_obj['custom_nodes']: + executor.submit(process_custom_node, item) + + if do_fetch: + print(f"\x1b[2K\rFetching done.") + elif do_update: + update_exists = any(item['installed'] == 'Update' for item in json_obj['custom_nodes']) + if update_exists: + print(f"\x1b[2K\rUpdate done.") + else: + print(f"\x1b[2K\rAll extensions are already up-to-date.") + elif do_update_check: + print(f"\x1b[2K\rUpdate check done.") + + +def nickname_filter(json_obj): + preemptions_map = {} + + for k, x in json_obj.items(): + if 'preemptions' in x[1]: + for y in x[1]['preemptions']: + preemptions_map[y] = k + elif k.endswith("/ComfyUI"): + for y in x[0]: + preemptions_map[y] = k + + updates = {} + for k, x in json_obj.items(): + removes = set() + for y in x[0]: + k2 = preemptions_map.get(y) + if k2 is not None and k != k2: + removes.add(y) + + if len(removes) > 0: + updates[k] = [y for y in x[0] if y not in removes] + + for k, v in updates.items(): + json_obj[k][0] = v + + return json_obj + + +@PromptServer.instance.routes.get("/customnode/getmappings") +async def fetch_customnode_mappings(request): + mode = request.rel_url.query["mode"] + + nickname_mode = False + if mode == "nickname": + mode = "local" + nickname_mode = True + + json_obj = await core.get_data_by_mode(mode, 'extension-node-map.json') + + if nickname_mode: + json_obj = nickname_filter(json_obj) + + all_nodes = set() + patterns = [] + for k, x in json_obj.items(): + all_nodes.update(set(x[0])) + + if 'nodename_pattern' in x[1]: + patterns.append((x[1]['nodename_pattern'], x[0])) + + missing_nodes = set(nodes.NODE_CLASS_MAPPINGS.keys()) - all_nodes + + for x in missing_nodes: + for pat, item in patterns: + if re.match(pat, x): + item.append(x) + + return web.json_response(json_obj, content_type='application/json') + + +@PromptServer.instance.routes.get("/customnode/fetch_updates") +async def fetch_updates(request): + try: + json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') + + check_custom_nodes_installed(json_obj, True) + + update_exists = any('custom_nodes' in json_obj and 'installed' in node and node['installed'] == 'Update' for node in + json_obj['custom_nodes']) + + if update_exists: + return web.Response(status=201) + + return web.Response(status=200) + except: + return web.Response(status=400) + + +@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.") + return web.Response(status=403) + + try: + core.save_snapshot_with_postfix('autosave') + + json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') + + check_custom_nodes_installed(json_obj, do_update=True) + + updated = [item['title'] for item in json_obj['custom_nodes'] if item['installed'] == 'Update'] + failed = [item['title'] for item in json_obj['custom_nodes'] if item['installed'] == 'Fail'] + + res = {'updated': updated, 'failed': failed} + + if len(updated) == 0 and len(failed) == 0: + status = 200 + else: + status = 201 + + return web.json_response(res, status=status, content_type='application/json') + except: + return web.Response(status=400) + finally: + core.clear_pip_cache() + + +def convert_markdown_to_html(input_text): + pattern_a = re.compile(r'\[a/([^]]+)\]\(([^)]+)\)') + pattern_w = re.compile(r'\[w/([^]]+)\]') + pattern_i = re.compile(r'\[i/([^]]+)\]') + pattern_bold = re.compile(r'\*\*([^*]+)\*\*') + pattern_white = re.compile(r'%%([^*]+)%%') + + def replace_a(match): + return f"{match.group(1)}" + + def replace_w(match): + return f"

{match.group(1)}

" + + def replace_i(match): + return f"

{match.group(1)}

" + + def replace_bold(match): + return f"{match.group(1)}" + + def replace_white(match): + return f"{match.group(1)}" + + input_text = input_text.replace('\\[', '[').replace('\\]', ']').replace('<', '<').replace('>', '>') + + result_text = re.sub(pattern_a, replace_a, input_text) + result_text = re.sub(pattern_w, replace_w, result_text) + result_text = re.sub(pattern_i, replace_i, result_text) + result_text = re.sub(pattern_bold, replace_bold, result_text) + result_text = re.sub(pattern_white, replace_white, result_text) + + return result_text.replace("\n", "
") + + +def populate_markdown(x): + if 'description' in x: + x['description'] = convert_markdown_to_html(x['description']) + + if 'name' in x: + x['name'] = x['name'].replace('<', '<').replace('>', '>') + + if 'title' in x: + x['title'] = x['title'].replace('<', '<').replace('>', '>') + + +@PromptServer.instance.routes.get("/customnode/getlist") +async def fetch_customnode_list(request): + if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": + skip_update = True + else: + skip_update = False + + if request.rel_url.query["mode"] == "local": + channel = 'local' + else: + channel = core.get_config()['channel_url'] + + json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') + json_obj_github = await core.get_data_by_mode(request.rel_url.query["mode"], 'github-stats.json', 'default') + json_obj = await populate_github_stats(json_obj, json_obj_github) + + def is_ignored_notice(code): + if code is not None and code.startswith('#NOTICE_'): + try: + notice_version = [int(x) for x in code[8:].split('.')] + return notice_version[0] < core.version[0] or (notice_version[0] == core.version[0] and notice_version[1] <= core.version[1]) + except Exception: + return False + else: + return False + + json_obj['custom_nodes'] = [record for record in json_obj['custom_nodes'] if not is_ignored_notice(record.get('author'))] + + check_custom_nodes_installed(json_obj, False, not skip_update) + + for x in json_obj['custom_nodes']: + populate_markdown(x) + + if channel != 'local': + found = 'custom' + + for name, url in core.get_channel_dict().items(): + if url == channel: + found = name + break + + channel = found + + json_obj['channel'] = channel + + return web.json_response(json_obj, content_type='application/json') + + +@PromptServer.instance.routes.get("/customnode/alternatives") +async def fetch_customnode_alternatives(request): + alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json') + + for item in alter_json['items']: + populate_markdown(item) + + return web.json_response(alter_json, content_type='application/json') + + +@PromptServer.instance.routes.get("/alternatives/getlist") +async def fetch_alternatives_list(request): + if "skip_update" in request.rel_url.query and request.rel_url.query["skip_update"] == "true": + skip_update = True + else: + skip_update = False + + alter_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'alter-list.json') + custom_node_json = await core.get_data_by_mode(request.rel_url.query["mode"], 'custom-node-list.json') + + fileurl_to_custom_node = {} + + for item in custom_node_json['custom_nodes']: + for fileurl in item['files']: + fileurl_to_custom_node[fileurl] = item + + for item in alter_json['items']: + fileurl = item['id'] + if fileurl in fileurl_to_custom_node: + custom_node = fileurl_to_custom_node[fileurl] + core.check_a_custom_node_installed(custom_node, not skip_update) + + populate_markdown(item) + populate_markdown(custom_node) + item['custom_node'] = custom_node + + return web.json_response(alter_json, content_type='application/json') + + +def check_model_installed(json_obj): + def process_model(item): + model_path = get_model_path(item) + item['installed'] = 'None' + + if model_path is not None: + if model_path.endswith('.zip'): + if os.path.exists(model_path[:-4]): + item['installed'] = 'True' + else: + item['installed'] = 'False' + elif os.path.exists(model_path): + item['installed'] = 'True' + else: + item['installed'] = 'False' + + with concurrent.futures.ThreadPoolExecutor(8) as executor: + for item in json_obj['models']: + executor.submit(process_model, item) + + +@PromptServer.instance.routes.get("/externalmodel/getlist") +async def fetch_externalmodel_list(request): + json_obj = await core.get_data_by_mode(request.rel_url.query["mode"], 'model-list.json') + + check_model_installed(json_obj) + + for x in json_obj['models']: + populate_markdown(x) + + return web.json_response(json_obj, content_type='application/json') + + +@PromptServer.instance.routes.get("/snapshot/get_current") +async def get_snapshot_list(request): + json_obj = core.get_current_snapshot() + return web.json_response(json_obj, content_type='application/json') + + +@PromptServer.instance.routes.get("/snapshot/getlist") +async def get_snapshot_list(request): + snapshots_directory = os.path.join(core.comfyui_manager_path, 'snapshots') + items = [f[:-5] for f in os.listdir(snapshots_directory) if f.endswith('.json')] + items.sort(reverse=True) + return web.json_response({'items': items}, content_type='application/json') + + +@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.") + return web.Response(status=403) + + try: + target = request.rel_url.query["target"] + + path = os.path.join(core.comfyui_manager_path, 'snapshots', f"{target}.json") + if os.path.exists(path): + os.remove(path) + + return web.Response(status=200) + except: + return web.Response(status=400) + + +@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.") + return web.Response(status=403) + + try: + target = request.rel_url.query["target"] + + path = os.path.join(core.comfyui_manager_path, 'snapshots', f"{target}.json") + if os.path.exists(path): + if not os.path.exists(core.startup_script_path): + os.makedirs(core.startup_script_path) + + target_path = os.path.join(core.startup_script_path, "restore-snapshot.json") + shutil.copy(path, target_path) + + print(f"Snapshot restore scheduled: `{target}`") + return web.Response(status=200) + + print(f"Snapshot file not found: `{path}`") + return web.Response(status=400) + except: + return web.Response(status=400) + + +@PromptServer.instance.routes.get("/snapshot/get_current") +async def get_current_snapshot_api(request): + try: + return web.json_response(core.get_current_snapshot(), content_type='application/json') + except: + return web.Response(status=400) + + +@PromptServer.instance.routes.get("/snapshot/save") +async def save_snapshot(request): + try: + core.save_snapshot_with_postfix('snapshot') + return web.Response(status=200) + except: + return web.Response(status=400) + + +def unzip_install(files): + temp_filename = 'manager-temp.zip' + for url in files: + if url.endswith("/"): + url = url[:-1] + try: + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} + + req = urllib.request.Request(url, headers=headers) + response = urllib.request.urlopen(req) + data = response.read() + + with open(temp_filename, 'wb') as f: + f.write(data) + + with zipfile.ZipFile(temp_filename, 'r') as zip_ref: + zip_ref.extractall(core.custom_nodes_path) + + os.remove(temp_filename) + except Exception as e: + print(f"Install(unzip) error: {url} / {e}", file=sys.stderr) + return False + + print("Installation was successful.") + return True + + +def download_url_with_agent(url, save_path): + try: + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} + + req = urllib.request.Request(url, headers=headers) + response = urllib.request.urlopen(req) + data = response.read() + + if not os.path.exists(os.path.dirname(save_path)): + os.makedirs(os.path.dirname(save_path)) + + with open(save_path, 'wb') as f: + f.write(data) + + except Exception as e: + print(f"Download error: {url} / {e}", file=sys.stderr) + return False + + print("Installation was successful.") + return True + + +def copy_install(files, js_path_name=None): + for url in files: + if url.endswith("/"): + url = url[:-1] + try: + filename = os.path.basename(url) + if url.endswith(".py"): + download_url(url, core.custom_nodes_path, filename) + else: + path = os.path.join(core.js_path, js_path_name) if js_path_name is not None else core.js_path + if not os.path.exists(path): + os.makedirs(path) + download_url(url, path, filename) + + except Exception as e: + print(f"Install(copy) error: {url} / {e}", file=sys.stderr) + return False + + print("Installation was successful.") + return True + + +def copy_uninstall(files, js_path_name='.'): + for url in files: + if url.endswith("/"): + url = url[:-1] + dir_name = os.path.basename(url) + base_path = core.custom_nodes_path if url.endswith('.py') else os.path.join(core.js_path, js_path_name) + file_path = os.path.join(base_path, dir_name) + + try: + if os.path.exists(file_path): + os.remove(file_path) + elif os.path.exists(file_path + ".disabled"): + os.remove(file_path + ".disabled") + except Exception as e: + print(f"Uninstall(copy) error: {url} / {e}", file=sys.stderr) + return False + + print("Uninstallation was successful.") + return True + + +def copy_set_active(files, is_disable, js_path_name='.'): + if is_disable: + action_name = "Disable" + else: + action_name = "Enable" + + for url in files: + if url.endswith("/"): + url = url[:-1] + dir_name = os.path.basename(url) + base_path = core.custom_nodes_path if url.endswith('.py') else os.path.join(core.js_path, js_path_name) + file_path = os.path.join(base_path, dir_name) + + try: + if is_disable: + current_name = file_path + new_name = file_path + ".disabled" + else: + current_name = file_path + ".disabled" + new_name = file_path + + os.rename(current_name, new_name) + + except Exception as e: + print(f"{action_name}(copy) error: {url} / {e}", file=sys.stderr) + + return False + + print(f"{action_name} was successful.") + return True + + +@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.") + return web.Response(status=403) + + json_data = await request.json() + + risky_level = await get_risky_level(json_data['files']) + if not is_allowed_security_level(risky_level): + print(f"ERROR: This installation is not allowed in this security_level. Please contact the administrator.") + return web.Response(status=404) + + install_type = json_data['install_type'] + + print(f"Install custom node '{json_data['title']}'") + + res = False + + if len(json_data['files']) == 0: + return web.Response(status=400) + + if install_type == "unzip": + res = unzip_install(json_data['files']) + + if install_type == "copy": + js_path_name = json_data['js_path'] if 'js_path' in json_data else '.' + res = copy_install(json_data['files'], js_path_name) + + elif install_type == "git-clone": + res = core.gitclone_install(json_data['files']) + + if 'pip' in json_data: + for pname in json_data['pip']: + pkg = core.remap_pip_package(pname) + install_cmd = [sys.executable, "-m", "pip", "install", pkg] + core.try_install_script(json_data['files'][0], ".", install_cmd) + + core.clear_pip_cache() + + if res: + print(f"After restarting ComfyUI, please refresh the browser.") + return web.json_response({}, content_type='application/json') + + return web.Response(status=400) + + +@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.") + return web.Response(status=403) + + json_data = await request.json() + + install_type = json_data['install_type'] + + print(f"Install custom node '{json_data['title']}'") + + res = False + + if len(json_data['files']) == 0: + return web.Response(status=400) + + if install_type == "git-clone": + res = core.gitclone_fix(json_data['files']) + else: + return web.Response(status=400) + + if 'pip' in json_data: + for pname in json_data['pip']: + install_cmd = [sys.executable, "-m", "pip", "install", '-U', pname] + 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') + + return web.Response(status=400) + + +@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 set '--listen' to a local IP and set the security level to 'middle' or 'weak'. Please contact the administrator.") + return web.Response(status=403) + + url = await request.text() + res = core.gitclone_install([url]) + + if res: + print(f"After restarting ComfyUI, please refresh the browser.") + return web.Response(status=200) + + return web.Response(status=400) + + +@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 set '--listen' to a local IP and set the security level to 'middle' or 'weak'. Please contact the administrator.") + return web.Response(status=403) + + packages = await request.text() + core.pip_install(packages.split(' ')) + + return web.Response(status=200) + + +@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.") + return web.Response(status=403) + + json_data = await request.json() + + install_type = json_data['install_type'] + + print(f"Uninstall custom node '{json_data['title']}'") + + res = False + + if install_type == "copy": + js_path_name = json_data['js_path'] if 'js_path' in json_data else '.' + res = copy_uninstall(json_data['files'], js_path_name) + + elif install_type == "git-clone": + res = core.gitclone_uninstall(json_data['files']) + + if res: + print(f"After restarting ComfyUI, please refresh the browser.") + return web.json_response({}, content_type='application/json') + + return web.Response(status=400) + + +@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.") + return web.Response(status=403) + + json_data = await request.json() + + install_type = json_data['install_type'] + + print(f"Update custom node '{json_data['title']}'") + + res = False + + if install_type == "git-clone": + res = core.gitclone_update(json_data['files']) + + core.clear_pip_cache() + + if res: + print(f"After restarting ComfyUI, please refresh the browser.") + return web.json_response({}, content_type='application/json') + + return web.Response(status=400) + + +@PromptServer.instance.routes.get("/comfyui_manager/update_comfyui") +async def update_comfyui(request): + print(f"Update ComfyUI") + + try: + repo_path = os.path.dirname(folder_paths.__file__) + res = core.update_path(repo_path) + if res == "fail": + print(f"ComfyUI update fail: The installed ComfyUI does not have a Git repository.") + return web.Response(status=400) + elif res == "updated": + return web.Response(status=201) + else: # skipped + return web.Response(status=200) + except Exception as e: + print(f"ComfyUI update fail: {e}", file=sys.stderr) + + return web.Response(status=400) + + +@PromptServer.instance.routes.post("/customnode/toggle_active") +async def toggle_active(request): + json_data = await request.json() + + install_type = json_data['install_type'] + is_disabled = json_data['installed'] == "Disabled" + + print(f"Update custom node '{json_data['title']}'") + + res = False + + if install_type == "git-clone": + res = core.gitclone_set_active(json_data['files'], not is_disabled) + elif install_type == "copy": + res = copy_set_active(json_data['files'], not is_disabled, json_data.get('js_path', None)) + + if res: + return web.json_response({}, content_type='application/json') + + return web.Response(status=400) + + +@PromptServer.instance.routes.post("/model/install") +async def install_model(request): + json_data = await request.json() + + model_path = get_model_path(json_data) + + res = False + + try: + if model_path is not None: + print(f"Install model '{json_data['name']}' into '{model_path}'") + + model_url = json_data['url'] + if not core.get_config()['model_download_by_agent'] and ( + model_url.startswith('https://github.com') or model_url.startswith('https://huggingface.co') or model_url.startswith('https://heibox.uni-heidelberg.de')): + model_dir = get_model_dir(json_data) + download_url(model_url, model_dir, filename=json_data['filename']) + if model_path.endswith('.zip'): + res = core.unzip(model_path) + else: + res = True + + if res: + return web.json_response({}, content_type='application/json') + else: + res = download_url_with_agent(model_url, model_path) + if res and model_path.endswith('.zip'): + res = core.unzip(model_path) + else: + print(f"Model installation error: invalid model type - {json_data['type']}") + + if res: + return web.json_response({}, content_type='application/json') + except Exception as e: + print(f"[ERROR] {e}", file=sys.stderr) + + return web.Response(status=400) + + +class ManagerTerminalHook: + def write_stderr(self, msg): + PromptServer.instance.send_sync("manager-terminal-feedback", {"data": msg}) + + def write_stdout(self, msg): + PromptServer.instance.send_sync("manager-terminal-feedback", {"data": msg}) + + +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 action, a security_level of `weak` is required. Please contact the administrator.") + return web.Response(status=403) + + if "mode" in request.rel_url.query: + if request.rel_url.query['mode'] == 'true': + sys.__comfyui_manager_terminal_hook.add_hook('cm', manager_terminal_hook) + else: + sys.__comfyui_manager_terminal_hook.remove_hook('cm') + + return web.Response(status=200) + + +@PromptServer.instance.routes.get("/manager/preview_method") +async def preview_method(request): + if "value" in request.rel_url.query: + set_preview_method(request.rel_url.query['value']) + core.write_config() + else: + return web.Response(text=core.manager_funcs.get_current_preview_method(), status=200) + + return web.Response(status=200) + + +@PromptServer.instance.routes.get("/manager/badge_mode") +async def badge_mode(request): + if "value" in request.rel_url.query: + set_badge_mode(request.rel_url.query['value']) + core.write_config() + else: + return web.Response(text=core.get_config()['badge_mode'], status=200) + + return web.Response(status=200) + + +@PromptServer.instance.routes.get("/manager/default_ui") +async def default_ui_mode(request): + if "value" in request.rel_url.query: + set_default_ui_mode(request.rel_url.query['value']) + core.write_config() + else: + return web.Response(text=core.get_config()['default_ui'], status=200) + + return web.Response(status=200) + + +@PromptServer.instance.routes.get("/manager/component/policy") +async def component_policy(request): + if "value" in request.rel_url.query: + set_component_policy(request.rel_url.query['value']) + core.write_config() + else: + return web.Response(text=core.get_config()['component_policy'], status=200) + + return web.Response(status=200) + + +@PromptServer.instance.routes.get("/manager/dbl_click/policy") +async def dbl_click_policy(request): + if "value" in request.rel_url.query: + set_double_click_policy(request.rel_url.query['value']) + core.write_config() + else: + return web.Response(text=core.get_config()['double_click_policy'], status=200) + + return web.Response(status=200) + + +@PromptServer.instance.routes.get("/manager/channel_url_list") +async def channel_url_list(request): + channels = core.get_channel_dict() + if "value" in request.rel_url.query: + channel_url = channels.get(request.rel_url.query['value']) + if channel_url is not None: + core.get_config()['channel_url'] = channel_url + core.write_config() + else: + selected = 'custom' + selected_url = core.get_config()['channel_url'] + + for name, url in channels.items(): + if url == selected_url: + selected = name + break + + res = {'selected': selected, + 'list': core.get_channel_list()} + return web.json_response(res, status=200) + + return web.Response(status=200) + + +def add_target_blank(html_text): + pattern = r'(]*)(>)' + + def add_target(match): + if 'target=' not in match.group(1): + return match.group(1) + ' target="_blank"' + match.group(2) + return match.group(0) + + modified_html = re.sub(pattern, add_target, html_text) + + return modified_html + + +@PromptServer.instance.routes.get("/manager/notice") +async def get_notice(request): + url = "github.com" + path = "/ltdrdata/ltdrdata.github.io/wiki/News" + + async with aiohttp.ClientSession(trust_env=True, connector=aiohttp.TCPConnector(verify_ssl=False)) as session: + async with session.get(f"https://{url}{path}") as response: + if response.status == 200: + # html_content = response.read().decode('utf-8') + html_content = await response.text() + + pattern = re.compile(r'
([\s\S]*?)
') + match = pattern.search(html_content) + + if match: + markdown_content = match.group(1) + markdown_content += f"
ComfyUI: {core.comfy_ui_revision}[{comfy_ui_hash[:6]}]({core.comfy_ui_commit_datetime.date()})" + # markdown_content += f"
         ()" + markdown_content += f"
Manager: {core.version_str}" + + markdown_content = add_target_blank(markdown_content) + + try: + if core.comfy_ui_required_commit_datetime.date() > core.comfy_ui_commit_datetime.date(): + markdown_content = f'

Your ComfyUI is too OUTDATED!!!

' + markdown_content + except: + pass + + return web.Response(text=markdown_content, status=200) + else: + return web.Response(text="Unable to retrieve Notice", status=200) + else: + return web.Response(text="Unable to retrieve Notice", status=200) + + +@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.") + return web.Response(status=403) + + try: + sys.stdout.close_log() + except Exception as e: + pass + + if '__COMFY_CLI_SESSION__' in os.environ: + with open(os.path.join(os.environ['__COMFY_CLI_SESSION__'] + '.reboot'), 'w') as file: + pass + + print(f"\nRestarting...\n\n") + exit(0) + + print(f"\nRestarting... [Legacy Mode]\n\n") + if sys.platform.startswith('win32'): + return os.execv(sys.executable, ['"' + sys.executable + '"', '"' + sys.argv[0] + '"'] + sys.argv[1:]) + else: + return os.execv(sys.executable, [sys.executable] + sys.argv) + + +def sanitize_filename(input_string): + # 알파벳, 숫자, 및 밑줄 이외의 문자를 밑줄로 대체 + result_string = re.sub(r'[^a-zA-Z0-9_]', '_', input_string) + return result_string + + +@PromptServer.instance.routes.post("/manager/component/save") +async def save_component(request): + try: + data = await request.json() + name = data['name'] + workflow = data['workflow'] + + if not os.path.exists(components_path): + os.mkdir(components_path) + + if 'packname' in workflow and workflow['packname'] != '': + sanitized_name = sanitize_filename(workflow['packname']) + '.pack' + else: + sanitized_name = sanitize_filename(name) + '.json' + + filepath = os.path.join(components_path, sanitized_name) + components = {} + if os.path.exists(filepath): + with open(filepath) as f: + components = json.load(f) + + components[name] = workflow + + with open(filepath, 'w') as f: + json.dump(components, f, indent=4, sort_keys=True) + return web.Response(text=filepath, status=200) + except: + return web.Response(status=400) + + +@PromptServer.instance.routes.post("/manager/component/loads") +async def load_components(request): + try: + json_files = [f for f in os.listdir(components_path) if f.endswith('.json')] + pack_files = [f for f in os.listdir(components_path) if f.endswith('.pack')] + + components = {} + for json_file in json_files + pack_files: + file_path = os.path.join(components_path, json_file) + with open(file_path, 'r') as file: + try: + # When there is a conflict between the .pack and the .json, the pack takes precedence and overrides. + components.update(json.load(file)) + except json.JSONDecodeError as e: + print(f"[ComfyUI-Manager] Error decoding component file in file {json_file}: {e}") + + return web.json_response(components) + except Exception as e: + print(f"[ComfyUI-Manager] failed to load components\n{e}") + 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 + cors_middleware = server.create_cors_middleware(args.enable_cors_header) + 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("<", "<").replace(">", ">") + + +async def _confirm_try_install(sender, custom_node_url, msg): + json_obj = await core.get_data_by_mode('default', 'custom-node-list.json') + + sender = sanitize(sender) + msg = sanitize(msg) + target = core.lookup_customnode_by_url(json_obj, custom_node_url) + + if target is not None: + PromptServer.instance.send_sync("cm-api-try-install-customnode", + {"sender": sender, "target": target, "msg": msg}) + else: + print(f"[ComfyUI Manager API] Failed to try install - Unknown custom node url '{custom_node_url}'") + + +def confirm_try_install(sender, custom_node_url, msg): + asyncio.run(_confirm_try_install(sender, custom_node_url, msg)) + + +cm_global.register_api('cm.try-install-custom-node', confirm_try_install) + +import asyncio + + +async def default_cache_update(): + async def get_cache(filename): + uri = 'https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/' + filename + cache_uri = str(core.simple_hash(uri)) + '_' + filename + cache_uri = os.path.join(core.cache_dir, cache_uri) + + json_obj = await core.get_data(uri, True) + + with core.cache_lock: + with open(cache_uri, "w", encoding='utf-8') as file: + json.dump(json_obj, file, indent=4, sort_keys=True) + print(f"[ComfyUI-Manager] default cache updated: {uri}") + + a = get_cache("custom-node-list.json") + b = get_cache("extension-node-map.json") + c = get_cache("model-list.json") + d = get_cache("alter-list.json") + e = get_cache("github-stats.json") + + await asyncio.gather(a, b, c, d, e) + + +threading.Thread(target=lambda: asyncio.run(default_cache_update())).start() + +if not os.path.exists(core.config_path): + core.get_config() + core.write_config() + + +cm_global.register_extension('ComfyUI-Manager', + {'version': core.version, + 'name': 'ComfyUI Manager', + 'nodes': {'Terminal Log //CM'}, + 'description': 'It provides the ability to manage custom nodes in ComfyUI.', }) + diff --git a/custom_nodes/ComfyUI-Manager/glob/manager_util.py b/custom_nodes/ComfyUI-Manager/glob/manager_util.py new file mode 100644 index 000000000..5dc66b538 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/glob/manager_util.py @@ -0,0 +1,63 @@ +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") + + 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] + + 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 __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 + + def __le__(self, other): + return self == other or self < other + + def __gt__(self, other): + return not self <= other + + def __ge__(self, other): + return not self < other + + def __ne__(self, other): + return not self == other + diff --git a/custom_nodes/ComfyUI-Manager/glob/security_check.py b/custom_nodes/ComfyUI-Manager/glob/security_check.py new file mode 100644 index 000000000..1c6fdf6fc --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/glob/security_check.py @@ -0,0 +1,80 @@ +import sys +import subprocess +import os + + +def security_check(): + print("[START] Security scan") + + custom_nodes_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..')) + comfyui_path = os.path.abspath(os.path.join(custom_nodes_path, '..')) + + guide = { + "ComfyUI_LLMVISION": """ +0.Remove ComfyUI\\custom_nodes\\ComfyUI_LLMVISION. +1.Remove pip packages: openai-1.16.3.dist-info, anthropic-0.21.4.dist-info, openai-1.30.2.dist-info, anthropic-0.26.1.dist-info, %LocalAppData%\\rundll64.exe + (For portable versions, it is recommended to reinstall. If you are using a venv, it is advised to recreate the venv.) +2.Remove these files in your system: lib/browser/admin.py, Cadmino.py, Fadmino.py, VISION-D.exe, BeamNG.UI.exe +3.Check your Windows registry for the key listed above and remove it. + (HKEY_CURRENT_USER\\Software\\OpenAICLI) +4.Run a malware scanner. +5.Change all of your passwords, everywhere. + +(Reinstall OS is recommended.) +\n +Detailed information: https://old.reddit.com/r/comfyui/comments/1dbls5n/psa_if_youve_used_the_comfyui_llmvision_node_from/ + """, + "lolMiner": """ +1. Remove pip packages: lolMiner* +2. Remove files: lolMiner*, 4G_Ethash_Linux_Readme.txt, mine* in ComfyUI dir. + +(Reinstall ComfyUI is recommended.) + """ + } + + node_blacklist = {"ComfyUI_LLMVISION": "ComfyUI_LLMVISION"} + + pip_blacklist = {"AppleBotzz": "ComfyUI_LLMVISION"} + + file_blacklist = { + "ComfyUI_LLMVISION": ["%LocalAppData%\\rundll64.exe"], + "lolMiner": [os.path.join(comfyui_path, 'lolMiner')] + } + + installed_pips = subprocess.check_output([sys.executable, '-m', "pip", "freeze"], text=True) + + detected = set() + for k, v in node_blacklist.items(): + if os.path.exists(os.path.join(custom_nodes_path, k)): + print(f"[SECURITY ALERT] custom node '{k}' is dangerous.") + detected.add(v) + + for k, v in pip_blacklist.items(): + if k in installed_pips: + detected.add(v) + break + + for k, v in file_blacklist.items(): + for x in v: + if os.path.exists(os.path.expandvars(x)): + detected.add(k) + break + + if len(detected) > 0: + for line in installed_pips.split('\n'): + for k, v in pip_blacklist.items(): + if k in line: + print(f"[SECURITY ALERT] '{line}' is dangerous.") + + print("\n########################################################################") + print(" Malware has been detected, forcibly terminating ComfyUI execution.") + print("########################################################################\n") + + for x in detected: + print(f"\n======== TARGET: {x} =========") + print(f"\nTODO:") + print(guide.get(x)) + + exit(-1) + + print("[DONE] Security scan") diff --git a/custom_nodes/ComfyUI-Manager/js/cm-api.js b/custom_nodes/ComfyUI-Manager/js/cm-api.js new file mode 100644 index 000000000..1a6309d38 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/cm-api.js @@ -0,0 +1,63 @@ +import { api } from "../../scripts/api.js"; +import { app } from "../../scripts/app.js"; +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. `; + + if(event.detail.target.installed == 'Disabled') { + msg += 'However, the extension is currently disabled. Would you like to enable it and reboot?' + } + else if(event.detail.target.installed == 'True') { + msg += 'However, it seems that the extension is in an import-fail state or is not compatible with the current version. Please address this issue.'; + } + else { + msg += `Would you like to install it and reboot?`; + } + + msg += `\n\nRequest message:\n${event.detail.msg}`; + + if(event.detail.target.installed == 'True') { + alert(msg); + return; + } + + let res = confirm(msg); + if(res) { + if(event.detail.target.installed == 'Disabled') { + const response = await api.fetchApi(`/customnode/toggle_active`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(event.detail.target) + }); + } + else { + await sleep(300); + app.ui.dialog.show(`Installing... '${event.detail.target.title}'`); + + const response = await api.fetchApi(`/customnode/install`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(event.detail.target) + }); + + if(response.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return false; + } + } + + let response = await api.fetchApi("/manager/reboot"); + if(response.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return false; + } + + await sleep(300); + + app.ui.dialog.show(`Rebooting...`); + } +} + +api.addEventListener("cm-api-try-install-customnode", tryInstallCustomNode); diff --git a/custom_nodes/ComfyUI-Manager/js/comfyui-manager.js b/custom_nodes/ComfyUI-Manager/js/comfyui-manager.js new file mode 100644 index 000000000..ee825bdef --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/comfyui-manager.js @@ -0,0 +1,1513 @@ +import { api } from "../../scripts/api.js"; +import { app } from "../../scripts/app.js"; +import { $el, ComfyDialog } from "../../scripts/ui.js"; +import { + SUPPORTED_OUTPUT_NODE_TYPES, + ShareDialog, + ShareDialogChooser, + getPotentialOutputsAndOutputNodes, + showOpenArtShareDialog, + showShareDialog, + showYouMLShareDialog +} from "./comfyui-share-common.js"; +import { OpenArtShareDialog } from "./comfyui-share-openart.js"; +import { free_models, install_pip, install_via_git_url, manager_instance, rebootAPI, setManagerInstance, show_message } from "./common.js"; +import { ComponentBuilderDialog, getPureName, load_components, set_component_policy } from "./components-manager.js"; +import { CustomNodesManager } from "./custom-nodes-manager.js"; +import { ModelManager } from "./model-manager.js"; +import { set_double_click_policy } from "./node_fixer.js"; +import { SnapshotManager } from "./snapshot.js"; + +var docStyle = document.createElement('style'); +docStyle.innerHTML = ` +.comfy-toast { + position: fixed; + bottom: 20px; + left: 50%; + transform: translateX(-50%); + background-color: rgba(0, 0, 0, 0.7); + color: white; + padding: 10px 20px; + border-radius: 5px; + z-index: 1000; + transition: opacity 0.5s; +} + +.comfy-toast-fadeout { + opacity: 0; +} + +#cm-manager-dialog { + width: 1000px; + height: 520px; + box-sizing: content-box; + z-index: 10000; + overflow-y: auto; +} + +.cb-widget { + width: 400px; + height: 25px; + box-sizing: border-box; + z-index: 10000; + margin-top: 10px; + margin-bottom: 5px; +} + +.cb-widget-input { + width: 305px; + height: 25px; + box-sizing: border-box; +} +.cb-widget-input:disabled { + background-color: #444444; + color: white; +} + +.cb-widget-input-label { + width: 90px; + height: 25px; + box-sizing: border-box; + color: white; + text-align: right; + display: inline-block; + margin-right: 5px; +} + +.cm-menu-container { + column-gap: 20px; + display: flex; + flex-wrap: wrap; + justify-content: center; + box-sizing: content-box; +} + +.cm-menu-column { + display: flex; + flex-direction: column; + flex: 1 1 auto; + width: 300px; + box-sizing: content-box; +} + +.cm-title { + background-color: black; + text-align: center; + height: 40px; + width: calc(100% - 10px); + font-weight: bold; + justify-content: center; + align-content: center; + vertical-align: middle; +} + +#cm-channel-badge { + color: white; + background-color: #AA0000; + width: 220px; + height: 23px; + font-size: 13px; + border-radius: 5px; + left: 5px; + top: 5px; + align-content: center; + justify-content: center; + text-align: center; + font-weight: bold; + float: left; + vertical-align: middle; + position: relative; +} + +#custom-nodes-grid a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +#custom-nodes-grid a:hover { + color: #7777FF; + text-decoration: underline; +} + +#external-models-grid a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +#external-models-grid a:hover { + color: #7777FF; + text-decoration: underline; +} + +#alternatives-grid a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +#alternatives-grid a:hover { + color: #7777FF; + text-decoration: underline; +} + +.cm-notice-board { + width: 290px; + height: 270px; + overflow: auto; + color: var(--input-text); + border: 1px solid var(--descrip-text); + padding: 5px 10px; + overflow-x: hidden; + box-sizing: content-box; +} + +.cm-notice-board > ul { + display: block; + list-style-type: disc; + margin-block-start: 1em; + margin-block-end: 1em; + margin-inline-start: 0px; + margin-inline-end: 0px; + padding-inline-start: 40px; +} + +.cm-conflicted-nodes-text { + background-color: #CCCC55 !important; + color: #AA3333 !important; + font-size: 10px; + border-radius: 5px; + padding: 10px; +} + +.cm-warn-note { + background-color: #101010 !important; + color: #FF3800 !important; + font-size: 13px; + border-radius: 5px; + padding: 10px; + overflow-x: hidden; + overflow: auto; +} + +.cm-info-note { + background-color: #101010 !important; + color: #FF3800 !important; + font-size: 13px; + border-radius: 5px; + padding: 10px; + overflow-x: hidden; + overflow: auto; +} +`; + +document.head.appendChild(docStyle); + +var update_comfyui_button = null; +var fetch_updates_button = null; +var update_all_button = null; +var badge_mode = "none"; +let share_option = 'all'; + +// copied style from https://github.com/pythongosssss/ComfyUI-Custom-Scripts +const style = ` +#workflowgallery-button { + width: 310px; + height: 27px; + padding: 0px !important; + position: relative; + overflow: hidden; + font-size: 17px !important; +} +#cm-nodeinfo-button { + width: 310px; + height: 27px; + padding: 0px !important; + position: relative; + overflow: hidden; + font-size: 17px !important; +} +#cm-manual-button { + width: 310px; + height: 27px; + position: relative; + overflow: hidden; +} + +.cm-button { + width: 310px; + height: 30px; + position: relative; + overflow: hidden; + font-size: 17px !important; +} + +.cm-button-red { + width: 310px; + height: 30px; + position: relative; + overflow: hidden; + font-size: 17px !important; + background-color: #500000 !important; + color: white !important; +} + +.cm-experimental-button { + width: 290px; + height: 30px; + position: relative; + overflow: hidden; + font-size: 17px !important; +} + +.cm-experimental { + width: 310px; + border: 1px solid #555; + border-radius: 5px; + padding: 10px; + align-items: center; + text-align: center; + justify-content: center; + box-sizing: border-box; +} + +.cm-experimental-legend { + margin-top: -20px; + margin-left: 50%; + width:auto; + height:20px; + font-size: 13px; + font-weight: bold; + background-color: #990000; + color: #CCFFFF; + border-radius: 5px; + text-align: center; + transform: translateX(-50%); + display: block; +} + +.cm-menu-combo { + cursor: pointer; + width: 310px; + box-sizing: border-box; +} + +.cm-small-button { + width: 120px; + height: 30px; + position: relative; + overflow: hidden; + box-sizing: border-box; + font-size: 17px !important; +} + +#cm-install-customnodes-button { + width: 200px; + height: 30px; + position: relative; + overflow: hidden; + box-sizing: border-box; + font-size: 17px !important; +} + +.cm-search-filter { + width: 200px; + height: 30px !important; + position: relative; + overflow: hidden; + box-sizing: border-box; +} + +.cb-node-label { + width: 400px; + height:28px; + color: black; + background-color: #777777; + font-size: 18px; + text-align: center; + font-weight: bold; +} + +#cm-close-button { + width: calc(100% - 65px); + bottom: 10px; + position: absolute; + overflow: hidden; +} + +#cm-save-button { + width: calc(100% - 65px); + bottom:40px; + position: absolute; + overflow: hidden; +} +#cm-save-button:disabled { + background-color: #444444; +} + +.pysssss-workflow-arrow-2 { + position: absolute; + top: 0; + bottom: 0; + right: 0; + font-size: 12px; + display: flex; + align-items: center; + width: 24px; + justify-content: center; + background: rgba(255,255,255,0.1); + content: "▼"; +} +.pysssss-workflow-arrow-2:after { + content: "▼"; + } + .pysssss-workflow-arrow-2:hover { + filter: brightness(1.6); + background-color: var(--comfy-menu-bg); + } +.pysssss-workflow-popup-2 ~ .litecontextmenu { + transform: scale(1.3); +} +#workflowgallery-button-menu { + z-index: 10000000000 !important; +} +#cm-manual-button-menu { + z-index: 10000000000 !important; +} +`; + + + +async function init_badge_mode() { + api.fetchApi('/manager/badge_mode') + .then(response => response.text()) + .then(data => { badge_mode = data; }) +} + +async function init_share_option() { + api.fetchApi('/manager/share_option') + .then(response => response.text()) + .then(data => { + share_option = data || 'all'; + }); +} + +async function init_notice(notice) { + api.fetchApi('/manager/notice') + .then(response => response.text()) + .then(data => { + notice.innerHTML = data; + }) +} + +await init_badge_mode(); +await init_share_option(); + +async function fetchNicknames() { + const response1 = await api.fetchApi(`/customnode/getmappings?mode=nickname`); + const mappings = await response1.json(); + + let result = {}; + let nickname_patterns = []; + + for (let i in mappings) { + let item = mappings[i]; + var nickname; + if (item[1].nickname) { + nickname = item[1].nickname; + } + else if (item[1].title) { + nickname = item[1].title; + } + else { + nickname = item[1].title_aux; + } + + for (let j in item[0]) { + result[item[0][j]] = nickname; + } + + if(item[1].nodename_pattern) { + nickname_patterns.push([item[1].nodename_pattern, nickname]); + } + } + + return [result, nickname_patterns]; +} + +const [nicknames, nickname_patterns] = await fetchNicknames(); + +function getNickname(node, nodename) { + if(node.nickname) { + return node.nickname; + } + else { + if (nicknames[nodename]) { + node.nickname = nicknames[nodename]; + } + else if(node.getInnerNodes) { + let pure_name = getPureName(node); + let groupNode = app.graph.extra?.groupNodes?.[pure_name]; + if(groupNode) { + let packname = groupNode.packname; + node.nickname = packname; + } + return node.nickname; + } + else { + for(let i in nickname_patterns) { + let item = nickname_patterns[i]; + if(nodename.match(item[0])) { + node.nickname = item[1]; + } + } + } + + return node.nickname; + } +} + +function drawBadge(node, orig, restArgs) { + let ctx = restArgs[0]; + const r = orig?.apply?.(node, restArgs); + + if (!node.flags.collapsed && badge_mode != 'none' && node.constructor.title_mode != LiteGraph.NO_TITLE) { + let text = ""; + if (badge_mode.startsWith('id_nick')) + text = `#${node.id} `; + + let nick = node.getNickname(); + if (nick) { + if (nick == 'ComfyUI') { + if(badge_mode.endsWith('hide')) { + nick = ""; + } + else { + nick = "🦊" + } + } + + if (nick.length > 25) { + text += nick.substring(0, 23) + ".."; + } + else { + text += nick; + } + } + + if (text != "") { + let fgColor = "white"; + let bgColor = "#0F1F0F"; + let visible = true; + + ctx.save(); + ctx.font = "12px sans-serif"; + const sz = ctx.measureText(text); + ctx.fillStyle = bgColor; + ctx.beginPath(); + ctx.roundRect(node.size[0] - sz.width - 12, -LiteGraph.NODE_TITLE_HEIGHT - 20, sz.width + 12, 20, 5); + ctx.fill(); + + ctx.fillStyle = fgColor; + ctx.fillText(text, node.size[0] - sz.width - 6, -LiteGraph.NODE_TITLE_HEIGHT - 6); + ctx.restore(); + + if (node.has_errors) { + ctx.save(); + ctx.font = "bold 14px sans-serif"; + const sz2 = ctx.measureText(node.type); + ctx.fillStyle = 'white'; + ctx.fillText(node.type, node.size[0] / 2 - sz2.width / 2, node.size[1] / 2); + ctx.restore(); + } + } + } + return r; +} + + +async function updateComfyUI() { + let prev_text = update_comfyui_button.innerText; + update_comfyui_button.innerText = "Updating ComfyUI..."; + update_comfyui_button.disabled = true; + update_comfyui_button.style.backgroundColor = "gray"; + + try { + const response = await api.fetchApi('/comfyui_manager/update_comfyui'); + + if (response.status == 400) { + show_message('Failed to update ComfyUI.'); + return false; + } + + if (response.status == 201) { + show_message('ComfyUI has been successfully updated.'); + } + else { + show_message('ComfyUI is already up to date with the latest version.'); + } + + return true; + } + catch (exception) { + show_message(`Failed to update ComfyUI / ${exception}`); + return false; + } + finally { + update_comfyui_button.disabled = false; + update_comfyui_button.innerText = prev_text; + update_comfyui_button.style.backgroundColor = ""; + } +} + +async function fetchUpdates(update_check_checkbox) { + let prev_text = fetch_updates_button.innerText; + fetch_updates_button.innerText = "Fetching updates..."; + fetch_updates_button.disabled = true; + fetch_updates_button.style.backgroundColor = "gray"; + + try { + var mode = manager_instance.datasrc_combo.value; + + const response = await api.fetchApi(`/customnode/fetch_updates?mode=${mode}`); + + if (response.status != 200 && response.status != 201) { + show_message('Failed to fetch updates.'); + return false; + } + + if (response.status == 201) { + show_message("There is an updated extension available.

NOTE:
Fetch Updates is not an update.
Please update from

"); + + const button = document.getElementById('cm-install-customnodes-button'); + button.addEventListener("click", + async function() { + app.ui.dialog.close(); + + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + await CustomNodesManager.instance.show(CustomNodesManager.ShowMode.UPDATE); + } + ); + + update_check_checkbox.checked = false; + } + else { + show_message('All extensions are already up-to-date with the latest versions.'); + } + + return true; + } + catch (exception) { + show_message(`Failed to update custom nodes / ${exception}`); + return false; + } + finally { + fetch_updates_button.disabled = false; + fetch_updates_button.innerText = prev_text; + fetch_updates_button.style.backgroundColor = ""; + } +} + +async function updateAll(update_check_checkbox, manager_dialog) { + let prev_text = update_all_button.innerText; + update_all_button.innerText = "Updating all...(ComfyUI)"; + update_all_button.disabled = true; + update_all_button.style.backgroundColor = "gray"; + + try { + var mode = manager_instance.datasrc_combo.value; + + update_all_button.innerText = "Updating all..."; + const response1 = await api.fetchApi('/comfyui_manager/update_comfyui'); + const response2 = await api.fetchApi(`/customnode/update_all?mode=${mode}`); + + if (response2.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return false; + } + + if (response1.status == 400 || response2.status == 400) { + show_message('Failed to update ComfyUI or several extensions.

See terminal log.
'); + return false; + } + + if(response1.status == 201 || response2.status == 201) { + const update_info = await response2.json(); + + let failed_list = ""; + if(update_info.failed.length > 0) { + failed_list = "
FAILED: "+update_info.failed.join(", "); + } + + let updated_list = ""; + if(update_info.updated.length > 0) { + updated_list = "
UPDATED: "+update_info.updated.join(", "); + } + + show_message( + "ComfyUI and all extensions have been updated to the latest version.
To apply the updated custom node, please ComfyUI. And refresh browser.
" + +failed_list + +updated_list + ); + + const rebootButton = document.getElementById('cm-reboot-button5'); + rebootButton.addEventListener("click", + function() { + if(rebootAPI()) { + manager_dialog.close(); + } + }); + } + else { + show_message('ComfyUI and all extensions are already up-to-date with the latest versions.'); + } + + return true; + } + catch (exception) { + show_message(`Failed to update ComfyUI or several extensions / ${exception}`); + return false; + } + finally { + update_all_button.disabled = false; + update_all_button.innerText = prev_text; + update_all_button.style.backgroundColor = ""; + } +} + +function newDOMTokenList(initialTokens) { + const tmp = document.createElement(`div`); + + const classList = tmp.classList; + if (initialTokens) { + initialTokens.forEach(token => { + classList.add(token); + }); + } + + return classList; + } + +/** + * Check whether the node is a potential output node (img, gif or video output) + */ +const isOutputNode = (node) => { + return SUPPORTED_OUTPUT_NODE_TYPES.includes(node.type); +} + +// ----------- +class ManagerMenuDialog extends ComfyDialog { + createControlsMid() { + let self = this; + + update_comfyui_button = + $el("button.cm-button", { + type: "button", + textContent: "Update ComfyUI", + onclick: + () => updateComfyUI() + }); + + fetch_updates_button = + $el("button.cm-button", { + type: "button", + textContent: "Fetch Updates", + onclick: + () => fetchUpdates(this.update_check_checkbox) + }); + + update_all_button = + $el("button.cm-button", { + type: "button", + textContent: "Update All", + onclick: + () => updateAll(this.update_check_checkbox, self) + }); + + const res = + [ + $el("button.cm-button", { + type: "button", + textContent: "Custom Nodes Manager", + onclick: + () => { + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.NORMAL); + } + }), + + $el("button.cm-button", { + type: "button", + textContent: "Install Missing Custom Nodes", + onclick: + () => { + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.MISSING); + } + }), + + + $el("button.cm-button", { + type: "button", + textContent: "Model Manager", + onclick: + () => { + if(!ModelManager.instance) { + ModelManager.instance = new ModelManager(app, self); + } + ModelManager.instance.show(); + } + }), + + $el("button.cm-button", { + type: "button", + textContent: "Install via Git URL", + onclick: () => { + var url = prompt("Please enter the URL of the Git repository to install", ""); + + if (url !== null) { + install_via_git_url(url, self); + } + } + }), + + $el("br", {}, []), + update_all_button, + update_comfyui_button, + fetch_updates_button, + + $el("br", {}, []), + $el("button.cm-button", { + type: "button", + textContent: "Alternatives of A1111", + onclick: + () => { + if(!CustomNodesManager.instance) { + CustomNodesManager.instance = new CustomNodesManager(app, self); + } + CustomNodesManager.instance.show(CustomNodesManager.ShowMode.ALTERNATIVES); + } + }), + + $el("br", {}, []), + $el("button.cm-button-red", { + type: "button", + textContent: "Restart", + onclick: () => rebootAPI() + }), + ]; + + return res; + } + + createControlsLeft() { + let self = this; + + this.update_check_checkbox = $el("input",{type:'checkbox', id:"skip_update_check"},[]) + const uc_checkbox_text = $el("label",{for:"skip_update_check"},[" Skip update check"]) + uc_checkbox_text.style.color = "var(--fg-color)"; + uc_checkbox_text.style.cursor = "pointer"; + this.update_check_checkbox.checked = true; + + // db mode + this.datasrc_combo = document.createElement("select"); + this.datasrc_combo.setAttribute("title", "Configure where to retrieve node/model information. If set to 'local,' the channel is ignored, and if set to 'channel (remote),' it fetches the latest information each time the list is opened."); + this.datasrc_combo.className = "cm-menu-combo"; + this.datasrc_combo.appendChild($el('option', { value: 'cache', text: 'DB: Channel (1day cache)' }, [])); + this.datasrc_combo.appendChild($el('option', { value: 'local', text: 'DB: Local' }, [])); + this.datasrc_combo.appendChild($el('option', { value: 'url', text: 'DB: Channel (remote)' }, [])); + + // preview method + let preview_combo = document.createElement("select"); + preview_combo.setAttribute("title", "Configure how latent variables will be decoded during preview in the sampling process."); + preview_combo.className = "cm-menu-combo"; + preview_combo.appendChild($el('option', { value: 'auto', text: 'Preview method: Auto' }, [])); + preview_combo.appendChild($el('option', { value: 'taesd', text: 'Preview method: TAESD (slow)' }, [])); + preview_combo.appendChild($el('option', { value: 'latent2rgb', text: 'Preview method: Latent2RGB (fast)' }, [])); + preview_combo.appendChild($el('option', { value: 'none', text: 'Preview method: None (very fast)' }, [])); + + api.fetchApi('/manager/preview_method') + .then(response => response.text()) + .then(data => { preview_combo.value = data; }); + + preview_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/preview_method?value=${event.target.value}`); + }); + + // 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)' }, [])); + + 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); + }); + + // channel + let channel_combo = document.createElement("select"); + channel_combo.setAttribute("title", "Configure the channel for retrieving data from the Custom Node list (including missing nodes) or the Model list. Note that the badge utilizes local information."); + channel_combo.className = "cm-menu-combo"; + api.fetchApi('/manager/channel_url_list') + .then(response => response.json()) + .then(async data => { + try { + let urls = data.list; + for (let i in urls) { + if (urls[i] != '') { + let name_url = urls[i].split('::'); + channel_combo.appendChild($el('option', { value: name_url[0], text: `Channel: ${name_url[0]}` }, [])); + } + } + + channel_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/channel_url_list?value=${event.target.value}`); + }); + + channel_combo.value = data.selected; + } + catch (exception) { + + } + }); + + // default ui state + let default_ui_combo = document.createElement("select"); + default_ui_combo.setAttribute("title", "Set the default state to be displayed in the main menu when the browser starts."); + default_ui_combo.className = "cm-menu-combo"; + default_ui_combo.appendChild($el('option', { value: 'none', text: 'Default UI: None' }, [])); + default_ui_combo.appendChild($el('option', { value: 'history', text: 'Default UI: History' }, [])); + default_ui_combo.appendChild($el('option', { value: 'queue', text: 'Default UI: Queue' }, [])); + api.fetchApi('/manager/default_ui') + .then(response => response.text()) + .then(data => { default_ui_combo.value = data; }); + + default_ui_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/default_ui?value=${event.target.value}`); + }); + + + // share + let share_combo = document.createElement("select"); + share_combo.setAttribute("title", "Hide the share button in the main menu or set the default action upon clicking it. Additionally, configure the default share site when sharing via the context menu's share button."); + share_combo.className = "cm-menu-combo"; + const share_options = [ + ['none', 'None'], + ['openart', 'OpenArt AI'], + ['youml', 'YouML'], + ['matrix', 'Matrix Server'], + ['comfyworkflows', 'ComfyWorkflows'], + ['copus', 'Copus'], + ['all', 'All'], + ]; + for (const option of share_options) { + share_combo.appendChild($el('option', { value: option[0], text: `Share: ${option[1]}` }, [])); + } + + // default ui state + let component_policy_combo = document.createElement("select"); + component_policy_combo.setAttribute("title", "When loading the workflow, configure which version of the component to use."); + component_policy_combo.className = "cm-menu-combo"; + component_policy_combo.appendChild($el('option', { value: 'workflow', text: 'Component: Use workflow version' }, [])); + component_policy_combo.appendChild($el('option', { value: 'higher', text: 'Component: Use higher version' }, [])); + component_policy_combo.appendChild($el('option', { value: 'mine', text: 'Component: Use my version' }, [])); + api.fetchApi('/manager/component/policy') + .then(response => response.text()) + .then(data => { + component_policy_combo.value = data; + set_component_policy(data); + }); + + component_policy_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/component/policy?value=${event.target.value}`); + set_component_policy(event.target.value); + }); + + let dbl_click_policy_combo = document.createElement("select"); + dbl_click_policy_combo.setAttribute("title", "Sets the behavior when you double-click the title area of a node."); + dbl_click_policy_combo.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-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)' }, [])); + + api.fetchApi('/manager/dbl_click/policy') + .then(response => response.text()) + .then(data => { + dbl_click_policy_combo.value = data; + set_double_click_policy(data); + }); + + dbl_click_policy_combo.addEventListener('change', function (event) { + api.fetchApi(`/manager/dbl_click/policy?value=${event.target.value}`); + set_double_click_policy(event.target.value); + }); + + api.fetchApi('/manager/share_option') + .then(response => response.text()) + .then(data => { + share_combo.value = data || 'all'; + share_option = data || 'all'; + }); + + share_combo.addEventListener('change', function (event) { + const value = event.target.value; + share_option = value; + api.fetchApi(`/manager/share_option?value=${value}`); + const shareButton = document.getElementById("shareButton"); + if (value === 'none') { + shareButton.style.display = "none"; + } else { + shareButton.style.display = "inline-block"; + } + }); + + return [ + $el("div", {}, [this.update_check_checkbox, uc_checkbox_text]), + $el("br", {}, []), + this.datasrc_combo, + channel_combo, + preview_combo, + badge_combo, + default_ui_combo, + share_combo, + component_policy_combo, + dbl_click_policy_combo, + $el("br", {}, []), + + $el("br", {}, []), + $el("filedset.cm-experimental", {}, [ + $el("legend.cm-experimental-legend", {}, ["EXPERIMENTAL"]), + $el("button.cm-experimental-button", { + type: "button", + textContent: "Snapshot Manager", + onclick: + () => { + if(!SnapshotManager.instance) + SnapshotManager.instance = new SnapshotManager(app, self); + SnapshotManager.instance.show(); + } + }), + $el("button.cm-experimental-button", { + type: "button", + textContent: "Install PIP packages", + onclick: + () => { + var url = prompt("Please enumerate the pip packages to be installed.\n\nExample: insightface opencv-python-headless>=4.1.1\n", ""); + + if (url !== null) { + install_pip(url, self); + } + } + }), + $el("button.cm-experimental-button", { + type: "button", + textContent: "Unload models", + onclick: () => { free_models(); } + }) + ]), + ]; + } + + createControlsRight() { + const elts = [ + $el("button.cm-button", { + id: 'cm-manual-button', + type: "button", + textContent: "Community Manual", + onclick: () => { window.open("https://blenderneko.github.io/ComfyUI-docs/", "comfyui-community-manual"); } + }, [ + $el("div.pysssss-workflow-arrow-2", { + id: `cm-manual-button-arrow`, + onclick: (e) => { + e.preventDefault(); + e.stopPropagation(); + + LiteGraph.closeAllContextMenus(); + const menu = new LiteGraph.ContextMenu( + [ + { + title: "Comfy Custom Node How To", + callback: () => { window.open("https://github.com/chrisgoringe/Comfy-Custom-Node-How-To/wiki/aaa_index", "comfyui-community-manual1"); }, + }, + { + title: "ComfyUI Guide To Making Custom Nodes", + callback: () => { window.open("https://github.com/Suzie1/ComfyUI_Guide_To_Making_Custom_Nodes/wiki", "comfyui-community-manual2"); }, + }, + { + title: "ComfyUI Examples", + callback: () => { window.open("https://comfyanonymous.github.io/ComfyUI_examples", "comfyui-community-manual3"); }, + }, + { + title: "Close", + callback: () => { + LiteGraph.closeAllContextMenus(); + }, + } + ], + { + event: e, + scale: 1.3, + }, + window + ); + // set the id so that we can override the context menu's z-index to be above the comfyui manager menu + menu.root.id = "cm-manual-button-menu"; + menu.root.classList.add("pysssss-workflow-popup-2"); + }, + }) + ]), + + $el("button", { + id: 'workflowgallery-button', + type: "button", + style: { + ...(localStorage.getItem("wg_last_visited") ? {height: '50px'} : {}) + }, + onclick: (e) => { + const last_visited_site = localStorage.getItem("wg_last_visited") + if (!!last_visited_site) { + window.open(last_visited_site, last_visited_site); + } else { + this.handleWorkflowGalleryButtonClick(e) + } + }, + }, [ + $el("p", { + textContent: 'Workflow Gallery', + style: { + 'text-align': 'center', + 'color': 'white', + 'font-size': '18px', + 'margin': 0, + 'padding': 0, + } + }, [ + $el("p", { + id: 'workflowgallery-button-last-visited-label', + textContent: `(${localStorage.getItem("wg_last_visited") ? localStorage.getItem("wg_last_visited").split('/')[2] : ''})`, + style: { + 'text-align': 'center', + 'color': 'white', + 'font-size': '12px', + 'margin': 0, + 'padding': 0, + } + }) + ]), + $el("div.pysssss-workflow-arrow-2", { + id: `comfyworkflows-button-arrow`, + onclick: this.handleWorkflowGalleryButtonClick + }) + ]), + + $el("button.cm-button", { + id: 'cm-nodeinfo-button', + type: "button", + textContent: "Nodes Info", + onclick: () => { window.open("https://ltdrdata.github.io/", "comfyui-node-info"); } + }), + $el("br", {}, []), + ]; + + var textarea = document.createElement("div"); + textarea.className = "cm-notice-board"; + elts.push(textarea); + + init_notice(textarea); + + return elts; + } + + constructor() { + super(); + + const close_button = $el("button", { id: "cm-close-button", type: "button", textContent: "Close", onclick: () => this.close() }); + + const content = + $el("div.comfy-modal-content", + [ + $el("tr.cm-title", {}, [ + $el("font", {size:6, color:"white"}, [`ComfyUI Manager Menu`])] + ), + $el("br", {}, []), + $el("div.cm-menu-container", + [ + $el("div.cm-menu-column", [...this.createControlsLeft()]), + $el("div.cm-menu-column", [...this.createControlsMid()]), + $el("div.cm-menu-column", [...this.createControlsRight()]) + ]), + + $el("br", {}, []), + close_button, + ] + ); + + content.style.width = '100%'; + content.style.height = '100%'; + + this.element = $el("div.comfy-modal", { id:'cm-manager-dialog', parent: document.body }, [ content ]); + } + + show() { + this.element.style.display = "block"; + } + + handleWorkflowGalleryButtonClick(e) { + e.preventDefault(); + e.stopPropagation(); + LiteGraph.closeAllContextMenus(); + + // Modify the style of the button so that the UI can indicate the last + // visited site right away. + const modifyButtonStyle = (url) => { + const workflowGalleryButton = document.getElementById('workflowgallery-button'); + workflowGalleryButton.style.height = '50px'; + const lastVisitedLabel = document.getElementById('workflowgallery-button-last-visited-label'); + lastVisitedLabel.textContent = `(${url.split('/')[2]})`; + } + + const menu = new LiteGraph.ContextMenu( + [ + { + title: "Share your art", + callback: () => { + if (share_option === 'openart') { + showOpenArtShareDialog(); + return; + } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { + showShareDialog(share_option); + return; + } else if (share_option === 'youml') { + showYouMLShareDialog(); + return; + } + + if (!ShareDialogChooser.instance) { + ShareDialogChooser.instance = new ShareDialogChooser(); + } + ShareDialogChooser.instance.show(); + }, + }, + { + title: "Open 'openart.ai'", + callback: () => { + const url = "https://openart.ai/workflows/dev"; + localStorage.setItem("wg_last_visited", url); + window.open(url, url); + modifyButtonStyle(url); + }, + }, + { + title: "Open 'youml.com'", + callback: () => { + const url = "https://youml.com/?from=comfyui-share"; + localStorage.setItem("wg_last_visited", url); + window.open(url, url); + modifyButtonStyle(url); + }, + }, + { + title: "Open 'comfyworkflows.com'", + callback: () => { + const url = "https://comfyworkflows.com/"; + localStorage.setItem("wg_last_visited", url); + window.open(url, url); + modifyButtonStyle(url); + }, + }, + { + title: "Open 'flowt.ai'", + callback: () => { + const url = "https://flowt.ai/"; + localStorage.setItem("wg_last_visited", url); + window.open(url, url); + modifyButtonStyle(url); + }, + }, + { + title: "Open 'esheep'", + callback: () => { + const url = "https://www.esheep.com"; + localStorage.setItem("wg_last_visited", url); + window.open(url, url); + modifyButtonStyle(url); + }, + }, + { + title: "Open 'Copus.io'", + callback: () => { + const url = "https://www.copus.io"; + localStorage.setItem("wg_last_visited", url); + window.open(url, url); + modifyButtonStyle(url); + }, + }, + { + title: "Close", + callback: () => { + LiteGraph.closeAllContextMenus(); + }, + } + ], + { + event: e, + scale: 1.3, + }, + window + ); + // set the id so that we can override the context menu's z-index to be above the comfyui manager menu + menu.root.id = "workflowgallery-button-menu"; + menu.root.classList.add("pysssss-workflow-popup-2"); + } +} + + +app.registerExtension({ + name: "Comfy.ManagerMenu", + init() { + $el("style", { + textContent: style, + parent: document.head, + }); + }, + async setup() { + let orig_clear = app.graph.clear; + app.graph.clear = function () { + orig_clear.call(app.graph); + load_components(); + }; + + load_components(); + + const menu = document.querySelector(".comfy-menu"); + const separator = document.createElement("hr"); + + separator.style.margin = "20px 0"; + separator.style.width = "100%"; + menu.append(separator); + + try { + // new style Manager buttons + + // unload models button into new style Manager button + let cmGroup = new (await import("../../scripts/ui/components/buttonGroup.js")).ComfyButtonGroup( + new(await import("../../scripts/ui/components/button.js")).ComfyButton({ + icon: "puzzle", + action: () => { + if(!manager_instance) + setManagerInstance(new ManagerMenuDialog()); + manager_instance.show(); + }, + tooltip: "ComfyUI Manager", + content: "Manager", + classList: "comfyui-button comfyui-menu-mobile-collapse primary" + }).element, + new(await import("../../scripts/ui/components/button.js")).ComfyButton({ + icon: "vacuum-outline", + action: () => { + free_models(); + }, + tooltip: "Unload Models" + }).element, + new(await import("../../scripts/ui/components/button.js")).ComfyButton({ + icon: "vacuum", + action: () => { + free_models(true); + }, + tooltip: "Free model and node cache" + }).element, + new(await import("../../scripts/ui/components/button.js")).ComfyButton({ + icon: "share", + action: () => { + if (share_option === 'openart') { + showOpenArtShareDialog(); + return; + } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { + showShareDialog(share_option); + return; + } else if (share_option === 'youml') { + showYouMLShareDialog(); + return; + } + + if(!ShareDialogChooser.instance) { + ShareDialogChooser.instance = new ShareDialogChooser(); + } + ShareDialogChooser.instance.show(); + }, + tooltip: "Share" + }).element + ); + + app.menu?.settingsGroup.element.before(cmGroup.element); + } + catch(exception) { + console.log('ComfyUI is outdated. New style menu based features are disabled.'); + } + + // old style Manager button + const managerButton = document.createElement("button"); + managerButton.textContent = "Manager"; + managerButton.onclick = () => { + if(!manager_instance) + setManagerInstance(new ManagerMenuDialog()); + manager_instance.show(); + } + menu.append(managerButton); + + const shareButton = document.createElement("button"); + shareButton.id = "shareButton"; + shareButton.textContent = "Share"; + shareButton.onclick = () => { + if (share_option === 'openart') { + showOpenArtShareDialog(); + return; + } else if (share_option === 'matrix' || share_option === 'comfyworkflows') { + showShareDialog(share_option); + return; + } else if (share_option === 'youml') { + showYouMLShareDialog(); + return; + } + + if(!ShareDialogChooser.instance) { + ShareDialogChooser.instance = new ShareDialogChooser(); + } + ShareDialogChooser.instance.show(); + } + // make the background color a gradient of blue to green + shareButton.style.background = "linear-gradient(90deg, #00C9FF 0%, #92FE9D 100%)"; + shareButton.style.color = "black"; + + // Load share option from local storage to determine whether to show + // the share button. + const shouldShowShareButton = share_option !== 'none'; + shareButton.style.display = shouldShowShareButton ? "inline-block" : "none"; + + menu.append(shareButton); + }, + + async beforeRegisterNodeDef(nodeType, nodeData, app) { + this._addExtraNodeContextMenu(nodeType, app); + }, + + 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; + + 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) }; + } + }, + + _addExtraNodeContextMenu(node, app) { + const origGetExtraMenuOptions = node.prototype.getExtraMenuOptions; + node.prototype.cm_menu_added = true; + node.prototype.getExtraMenuOptions = function (_, options) { + origGetExtraMenuOptions?.apply?.(this, arguments); + + if (node.category.startsWith('group nodes/')) { + options.push({ + content: "Save As Component", + callback: (obj) => { + if (!ComponentBuilderDialog.instance) { + ComponentBuilderDialog.instance = new ComponentBuilderDialog(); + } + ComponentBuilderDialog.instance.target_node = node; + ComponentBuilderDialog.instance.show(); + } + }, null); + } + + if (isOutputNode(node)) { + const { potential_outputs } = getPotentialOutputsAndOutputNodes([this]); + const hasOutput = potential_outputs.length > 0; + + // Check if the previous menu option is `null`. If it's not, + // then we need to add a `null` as a separator. + if (options[options.length - 1] !== null) { + options.push(null); + } + + options.push({ + content: "🏞️ Share Output", + disabled: !hasOutput, + callback: (obj) => { + if (!ShareDialog.instance) { + ShareDialog.instance = new ShareDialog(); + } + const shareButton = document.getElementById("shareButton"); + if (shareButton) { + const currentNode = this; + if (!OpenArtShareDialog.instance) { + OpenArtShareDialog.instance = new OpenArtShareDialog(); + } + OpenArtShareDialog.instance.selectedNodeId = currentNode.id; + if (!ShareDialog.instance) { + ShareDialog.instance = new ShareDialog(share_option); + } + ShareDialog.instance.selectedNodeId = currentNode.id; + shareButton.click(); + } + } + }, null); + } + } + }, +}); + + +async function set_default_ui() +{ + let res = await api.fetchApi('/manager/default_ui'); + if(res.status == 200) { + let mode = await res.text(); + switch(mode) { + case 'history': + app.ui.queue.hide(); + app.ui.history.show(); + break; + case 'queue': + app.ui.queue.show(); + app.ui.history.hide(); + break; + default: + // do nothing + break; + } + } +} + +set_default_ui(); \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/js/comfyui-share-common.js b/custom_nodes/ComfyUI-Manager/js/comfyui-share-common.js new file mode 100644 index 000000000..1fbf0485b --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/comfyui-share-common.js @@ -0,0 +1,1064 @@ +import { api } from "../../scripts/api.js"; +import { app } from "../../scripts/app.js"; +import { $el, ComfyDialog } from "../../scripts/ui.js"; +import { CopusShareDialog } from "./comfyui-share-copus.js"; +import { OpenArtShareDialog } from "./comfyui-share-openart.js"; +import { YouMLShareDialog } from "./comfyui-share-youml.js"; + +export const SUPPORTED_OUTPUT_NODE_TYPES = [ + "PreviewImage", + "SaveImage", + "VHS_VideoCombine", + "ADE_AnimateDiffCombine", + "SaveAnimatedWEBP", + "CR Image Output" +] + +var docStyle = document.createElement('style'); +docStyle.innerHTML = ` +.cm-menu-container { + column-gap: 20px; + display: flex; + flex-wrap: wrap; + justify-content: center; +} + +.cm-menu-column { + display: flex; + flex-direction: column; +} + +.cm-title { + padding: 10px 10px 0 10p; + background-color: black; + text-align: center; + height: 45px; +} +`; +document.head.appendChild(docStyle); + +export function getPotentialOutputsAndOutputNodes(nodes) { + const potential_outputs = []; + const potential_output_nodes = []; + + // iterate over the array of nodes to find the ones that are marked as SaveImage + // TODO: Add support for AnimateDiffCombine, etc. nodes that save videos/gifs, etc. + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + if (!SUPPORTED_OUTPUT_NODE_TYPES.includes(node.type)) { + continue; + } + + if (node.type === "SaveImage" || node.type === "CR Image Output") { + // check if node has an 'images' array property + if (node.hasOwnProperty("images") && Array.isArray(node.images)) { + // iterate over the images array and add each image to the potential_outputs array + for (let j = 0; j < node.images.length; j++) { + potential_output_nodes.push(node); + potential_outputs.push({ "type": "image", "image": node.images[j], "title": node.title, "node_id": node.id }); + } + } + } + else if (node.type === "PreviewImage") { + // check if node has an 'images' array property + if (node.hasOwnProperty("images") && Array.isArray(node.images)) { + // iterate over the images array and add each image to the potential_outputs array + for (let j = 0; j < node.images.length; j++) { + potential_output_nodes.push(node); + potential_outputs.push({ "type": "image", "image": node.images[j], "title": node.title, "node_id": node.id }); + } + } + } + else if (node.type === "VHS_VideoCombine") { + // check if node has a 'widgets' array property, with type 'image' + if (node.hasOwnProperty("widgets") && Array.isArray(node.widgets)) { + // iterate over the widgets array and add each image to the potential_outputs array + for (let j = 0; j < node.widgets.length; j++) { + if (node.widgets[j].type === "image") { + const widgetValue = node.widgets[j].value; + const parsedURLVals = parseURLPath(widgetValue); + + // ensure that the parsedURLVals have 'filename', 'subfolder', 'type', and 'format' properties + if (parsedURLVals.hasOwnProperty("filename") && parsedURLVals.hasOwnProperty("subfolder") && parsedURLVals.hasOwnProperty("type") && parsedURLVals.hasOwnProperty("format")) { + if (parsedURLVals.type !== "output") { + // TODO + } + potential_output_nodes.push(node); + potential_outputs.push({ "type": "output", 'title': node.title, "node_id": node.id , "output": { "filename": parsedURLVals.filename, "subfolder": parsedURLVals.subfolder, "value": widgetValue, "format": parsedURLVals.format } }); + } + } else if (node.widgets[j].type === "preview") { + const widgetValue = node.widgets[j].value; + const parsedURLVals = widgetValue.params; + + if(!parsedURLVals.format?.startsWith('image')) { + // video isn't supported format + continue; + } + + // ensure that the parsedURLVals have 'filename', 'subfolder', 'type', and 'format' properties + if (parsedURLVals.hasOwnProperty("filename") && parsedURLVals.hasOwnProperty("subfolder") && parsedURLVals.hasOwnProperty("type") && parsedURLVals.hasOwnProperty("format")) { + if (parsedURLVals.type !== "output") { + // TODO + } + potential_output_nodes.push(node); + potential_outputs.push({ "type": "output", 'title': node.title, "node_id": node.id , "output": { "filename": parsedURLVals.filename, "subfolder": parsedURLVals.subfolder, "value": `/view?filename=${parsedURLVals.filename}&subfolder=${parsedURLVals.subfolder}&type=${parsedURLVals.type}&format=${parsedURLVals.format}`, "format": parsedURLVals.format } }); + } + } + } + } + } + else if (node.type === "ADE_AnimateDiffCombine") { + // check if node has a 'widgets' array property, with type 'image' + if (node.hasOwnProperty("widgets") && Array.isArray(node.widgets)) { + // iterate over the widgets array and add each image to the potential_outputs array + for (let j = 0; j < node.widgets.length; j++) { + if (node.widgets[j].type === "image") { + const widgetValue = node.widgets[j].value; + const parsedURLVals = parseURLPath(widgetValue); + // ensure that the parsedURLVals have 'filename', 'subfolder', 'type', and 'format' properties + if (parsedURLVals.hasOwnProperty("filename") && parsedURLVals.hasOwnProperty("subfolder") && parsedURLVals.hasOwnProperty("type") && parsedURLVals.hasOwnProperty("format")) { + if (parsedURLVals.type !== "output") { + // TODO + continue; + } + potential_output_nodes.push(node); + potential_outputs.push({ "type": "output", 'title': node.title, "output": { "filename": parsedURLVals.filename, "subfolder": parsedURLVals.subfolder, "type": parsedURLVals.type, "value": widgetValue, "format": parsedURLVals.format } }); + } + } + } + } + } + else if (node.type === "SaveAnimatedWEBP") { + // check if node has an 'images' array property + if (node.hasOwnProperty("images") && Array.isArray(node.images)) { + // iterate over the images array and add each image to the potential_outputs array + for (let j = 0; j < node.images.length; j++) { + potential_output_nodes.push(node); + potential_outputs.push({ "type": "image", "image": node.images[j], "title": node.title }); + } + } + } + } + + // Note: make sure that two arrays are the same length + return { potential_outputs, potential_output_nodes }; +} + + +export function parseURLPath(urlPath) { + // Extract the query string from the URL path + var queryString = urlPath.split('?')[1]; + + // Use the URLSearchParams API to parse the query string + var params = new URLSearchParams(queryString); + + // Create an object to store the parsed parameters + var parsedParams = {}; + + // Iterate over each parameter and add it to the object + for (var pair of params.entries()) { + parsedParams[pair[0]] = pair[1]; + } + + // Return the object with the parsed parameters + return parsedParams; +} + + +export const shareToEsheep= () => { + app.graphToPrompt() + .then(prompt => { + const nodes = app.graph._nodes + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + const workflow = prompt['workflow'] + api.fetchApi(`/manager/set_esheep_workflow_and_images`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + workflow: workflow, + images: potential_outputs + }) + }).then(response => { + var domain = window.location.hostname; + var port = window.location.port; + port = port || (window.location.protocol === 'http:' ? '80' : window.location.protocol === 'https:' ? '443' : ''); + var full_domin = domain + ':' + port + window.open('https://www.esheep.com/app/workflow_upload?from_local='+ full_domin, '_blank'); + }); + }) +} + +export const showCopusShareDialog = () => { + if (!CopusShareDialog.instance) { + CopusShareDialog.instance = new CopusShareDialog(); + } + + return app.graphToPrompt() + .then(prompt => { + return app.graph._nodes; + }) + .then(nodes => { + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + CopusShareDialog.instance.show({ potential_outputs, potential_output_nodes}); + }) +} + +export const showOpenArtShareDialog = () => { + if (!OpenArtShareDialog.instance) { + OpenArtShareDialog.instance = new OpenArtShareDialog(); + } + + return app.graphToPrompt() + .then(prompt => { + // console.log({ prompt }) + return app.graph._nodes; + }) + .then(nodes => { + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + OpenArtShareDialog.instance.show({ potential_outputs, potential_output_nodes}); + }) +} + + +export const showYouMLShareDialog = () => { + if (!YouMLShareDialog.instance) { + YouMLShareDialog.instance = new YouMLShareDialog(); + } + + return app.graphToPrompt() + .then(prompt => { + return app.graph._nodes; + }) + .then(nodes => { + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + YouMLShareDialog.instance.show(potential_outputs, potential_output_nodes); + }) +} + + +export const showShareDialog = async (share_option) => { + if (!ShareDialog.instance) { + ShareDialog.instance = new ShareDialog(share_option); + } + return app.graphToPrompt() + .then(prompt => { + // console.log({ prompt }) + return app.graph._nodes; + }) + .then(nodes => { + // console.log({ nodes }); + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + if (potential_outputs.length === 0) { + if (potential_output_nodes.length === 0) { + // todo: add support for other output node types (animatediff combine, etc.) + const supported_nodes_string = SUPPORTED_OUTPUT_NODE_TYPES.join(", "); + alert(`No supported output node found (${supported_nodes_string}). To share this workflow, please add an output node to your graph and re-run your prompt.`); + } else { + alert("To share this, first run a prompt. Once it's done, click 'Share'.\n\nNOTE: Images of the Share target can only be selected in the PreviewImage, SaveImage, and VHS_VideoCombine nodes. In the case of VHS_VideoCombine, only the image/gif and image/webp formats are supported."); + } + return false; + } + ShareDialog.instance.show({ potential_outputs, potential_output_nodes, share_option }); + return true; + }); +} + +export class ShareDialogChooser extends ComfyDialog { + static instance = null; + constructor() { + super(); + this.element = $el("div.comfy-modal", { + parent: document.body, style: { + 'overflow-y': "auto", + } + }, + [$el("div.comfy-modal-content", + {}, + [...this.createButtons()]), + ]); + this.selectedNodeId = null; + } + createButtons() { + const buttons = [ + { + key: "openart", + textContent: "OpenArt AI", + website: "https://openart.ai/workflows/", + description: "Share ComfyUI workflows and art on OpenArt.ai", + onclick: () => { + showOpenArtShareDialog(); + this.close(); + } + }, + { + key: "youml", + textContent: "YouML", + website: "https://youml.com", + description: "Share your workflow or transform it into an interactive app on YouML.com", + onclick: () => { + showYouMLShareDialog(); + this.close(); + } + }, + { + key: "matrix", + textContent: "Matrix Server", + website: "https://app.element.io/#/room/%23comfyui_space%3Amatrix.org", + description: "Share your art on the official ComfyUI matrix server", + onclick: async () => { + showShareDialog('matrix').then((suc) => { + suc && this.close(); + }) + } + }, + { + key: "comfyworkflows", + textContent: "ComfyWorkflows", + website: "https://comfyworkflows.com", + description: "Share & browse thousands of ComfyUI workflows and art 🎨

ComfyWorkflows.com", + onclick: () => { + showShareDialog('comfyworkflows').then((suc) => { + suc && this.close(); + }) + } + }, + { + key: "esheep", + textContent: "eSheep", + website: "https://www.esheep.com", + description: "Share & download thousands of ComfyUI workflows on esheep.com", + onclick: () => { + shareToEsheep(); + this.close(); + } + }, + { + key: "Copus", + textContent: "Copus", + website: "https://www.copus.io", + description: "🔴 Permanently store and secure ownership of your workflow on the open-source platform: Copus.io", + onclick: () => { + showCopusShareDialog(); + this.close(); + } + }, + ]; + + function createShareButtonsWithDescriptions() { + // Responsive container + const container = $el("div", { + style: { + display: "flex", + 'flex-wrap': 'wrap', + 'justify-content': 'space-around', + 'padding': '10px', + } + }); + + buttons.forEach(b => { + const button = $el("button", { + type: "button", + textContent: b.textContent, + onclick: b.onclick, + style: { + 'width': '25%', + 'minWidth': '200px', + 'background-color': b.backgroundColor || '', + 'border-radius': '5px', + 'cursor': 'pointer', + 'padding': '5px 5px', + 'margin-bottom': '5px', + 'transition': 'background-color 0.3s', + } + }); + button.addEventListener('mouseover', () => { + button.style.backgroundColor = '#007BFF'; // Change color on hover + }); + button.addEventListener('mouseout', () => { + button.style.backgroundColor = b.backgroundColor || ''; + }); + + const description = $el("p", { + innerHTML: b.description, + style: { + 'text-align': 'left', + color: 'white', + 'font-size': '14px', + 'margin-bottom': '0', + }, + }); + + const websiteLink = $el("a", { + textContent: "🌐 Website", + href: b.website, + target: "_blank", + style: { + color: 'white', + 'margin-left': '10px', + 'font-size': '12px', + 'text-decoration': 'none', + 'align-self': 'center', + }, + }); + + // Add highlight to the website link + websiteLink.addEventListener('mouseover', () => { + websiteLink.style.opacity = '0.7'; + }); + + websiteLink.addEventListener('mouseout', () => { + websiteLink.style.opacity = '1'; + }); + + const buttonLinkContainer = $el("div", { + style: { + display: 'flex', + 'align-items': 'center', + 'margin-bottom': '10px', + } + }, [button, websiteLink]); + + const column = $el("div", { + style: { + 'flex-basis': '100%', + 'margin': '10px', + 'padding': '10px 20px', + 'border': '1px solid #ddd', + 'border-radius': '5px', + 'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.1)', + } + }, [buttonLinkContainer, description]); + + container.appendChild(column); + }); + + return container; + } + + return [ + $el("p", { + textContent: 'Choose a platform to share your workflow', + style: { + 'text-align': 'center', + 'color': 'white', + 'font-size': '18px', + 'margin-bottom': '10px', + }, + } + ), + + $el("div.cm-menu-container", { + id: "comfyui-share-container" + }, [ + $el("div.cm-menu-column", [ + createShareButtonsWithDescriptions(), + $el("br", {}, []), + ]), + ]), + $el("div.cm-menu-container", { + id: "comfyui-share-container" + }, [ + $el("button", { + type: "button", + style: { + margin: "0 25px", + width: "100%", + }, + textContent: "Close", + onclick: () => { + this.close() + } + }), + $el("br", {}, []), + ]), + ]; + } + show() { + this.element.style.display = "block"; + this.element.style.zIndex = 10001; + } +} +export class ShareDialog extends ComfyDialog { + static instance = null; + static matrix_auth = { homeserver: "matrix.org", username: "", password: "" }; + static cw_sharekey = ""; + + constructor(share_option) { + super(); + this.share_option = share_option; + this.element = $el("div.comfy-modal", { + parent: document.body, style: { + 'overflow-y': "auto", + } + }, + [$el("div.comfy-modal-content", + {}, + [...this.createButtons()]), + ]); + this.selectedOutputIndex = 0; + } + + createButtons() { + this.radio_buttons = $el("div", { + id: "selectOutputImages", + }, []); + + this.is_nsfw_checkbox = $el("input", { type: 'checkbox', id: "is_nsfw" }, []) + const is_nsfw_checkbox_text = $el("label", { + }, [" Is this NSFW?"]) + this.is_nsfw_checkbox.style.color = "var(--fg-color)"; + this.is_nsfw_checkbox.checked = false; + + this.matrix_destination_checkbox = $el("input", { type: 'checkbox', id: "matrix_destination" }, []) + const matrix_destination_checkbox_text = $el("label", {}, [" ComfyUI Matrix server"]) + this.matrix_destination_checkbox.style.color = "var(--fg-color)"; + this.matrix_destination_checkbox.checked = this.share_option === 'matrix'; //true; + + this.comfyworkflows_destination_checkbox = $el("input", { type: 'checkbox', id: "comfyworkflows_destination" }, []) + const comfyworkflows_destination_checkbox_text = $el("label", {}, [" ComfyWorkflows.com"]) + this.comfyworkflows_destination_checkbox.style.color = "var(--fg-color)"; + this.comfyworkflows_destination_checkbox.checked = this.share_option !== 'matrix'; + + this.matrix_homeserver_input = $el("input", { type: 'text', id: "matrix_homeserver", placeholder: "matrix.org", value: ShareDialog.matrix_auth.homeserver || 'matrix.org' }, []); + this.matrix_username_input = $el("input", { type: 'text', placeholder: "Username", value: ShareDialog.matrix_auth.username || '' }, []); + this.matrix_password_input = $el("input", { type: 'password', placeholder: "Password", value: ShareDialog.matrix_auth.password || '' }, []); + + this.cw_sharekey_input = $el("input", { type: 'text', placeholder: "Share key (found on your profile page)", value: ShareDialog.cw_sharekey || '' }, []); + this.cw_sharekey_input.style.width = "100%"; + + this.credits_input = $el("input", { + type: "text", + placeholder: "This will be used to give credits", + required: false, + }, []); + + this.title_input = $el("input", { + type: "text", + placeholder: "ex: My awesome art", + required: false + }, []); + + this.description_input = $el("textarea", { + placeholder: "ex: Trying out a new workflow... ", + required: false, + }, []); + + this.share_button = $el("button", { + type: "submit", + textContent: "Share", + style: { + backgroundColor: "blue" + } + }, []); + + this.final_message = $el("div", { + style: { + color: "white", + textAlign: "center", + // marginTop: "10px", + // backgroundColor: "black", + padding: "10px", + } + }, []); + + this.share_finalmessage_container = $el("div.cm-menu-container", { + id: "comfyui-share-finalmessage-container", + style: { + display: "none", + } + }, [ + $el("div.cm-menu-column", [ + this.final_message, + $el("button", { + type: "button", + textContent: "Close", + onclick: () => { + // Reset state + this.matrix_destination_checkbox.checked = this.share_option === 'matrix'; + this.comfyworkflows_destination_checkbox.checked = this.share_option !== 'matrix'; + this.share_button.textContent = "Share"; + this.share_button.style.display = "inline-block"; + this.final_message.innerHTML = ""; + this.final_message.style.color = "white"; + this.credits_input.value = ""; + this.title_input.value = ""; + this.description_input.value = ""; + this.is_nsfw_checkbox.checked = false; + this.selectedOutputIndex = 0; + + // hide the final message + this.share_finalmessage_container.style.display = "none"; + + // show the share container + this.share_container.style.display = "flex"; + + this.close() + } + }), + ]) + ]); + this.share_container = $el("div.cm-menu-container", { + id: "comfyui-share-container" + }, [ + $el("div.cm-menu-column", [ + $el("details", { + style: { + border: "1px solid #999", + padding: "5px", + borderRadius: "5px", + backgroundColor: "#222" + } + }, [ + $el("summary", { + style: { + color: "white", + cursor: "pointer", + } + }, [`Matrix account`]), + $el("div", { + style: { + display: "flex", + flexDirection: "row", + } + }, [ + $el("div", { + textContent: "Homeserver", + style: { + marginRight: "10px", + } + }, []), + this.matrix_homeserver_input, + ]), + + $el("div", { + style: { + display: "flex", + flexDirection: "row", + } + }, [ + $el("div", { + textContent: "Username", + style: { + marginRight: "10px", + } + }, []), + this.matrix_username_input, + ]), + + $el("div", { + style: { + display: "flex", + flexDirection: "row", + } + }, [ + $el("div", { + textContent: "Password", + style: { + marginRight: "10px", + } + }, []), + this.matrix_password_input, + ]), + + ]), + $el("details", { + style: { + border: "1px solid #999", + marginTop: "10px", + padding: "5px", + borderRadius: "5px", + backgroundColor: "#222" + }, + }, [ + $el("summary", { + style: { + color: "white", + cursor: "pointer", + } + }, [`Comfyworkflows.com account`]), + $el("h4", { + textContent: "Share key (found on your profile page)", + }, []), + $el("p", { size: 3, color: "white" }, ["If provided, your art will be saved to your account. Otherwise, it will be shared anonymously."]), + this.cw_sharekey_input, + ]), + + $el("div", {}, [ + $el("p", { + size: 3, color: "white", style: { + color: 'white' + } + }, [`Select where to share your art:`]), + this.matrix_destination_checkbox, + matrix_destination_checkbox_text, + $el("br", {}, []), + this.comfyworkflows_destination_checkbox, + comfyworkflows_destination_checkbox_text, + ]), + + $el("h4", { + textContent: "Credits (optional)", + size: 3, + color: "white", + style: { + color: 'white' + } + }, []), + this.credits_input, + // $el("br", {}, []), + + $el("h4", { + textContent: "Title (optional)", + size: 3, + color: "white", + style: { + color: 'white' + } + }, []), + this.title_input, + // $el("br", {}, []), + + $el("h4", { + textContent: "Description (optional)", + size: 3, + color: "white", + style: { + color: 'white' + } + }, []), + this.description_input, + $el("br", {}, []), + + $el("div", {}, [this.is_nsfw_checkbox, is_nsfw_checkbox_text]), + // $el("br", {}, []), + + // this.final_message, + // $el("br", {}, []), + ]), + $el("div.cm-menu-column", [ + this.radio_buttons, + $el("br", {}, []), + + this.share_button, + + $el("button", { + type: "button", + textContent: "Close", + onclick: () => { + // Reset state + this.matrix_destination_checkbox.checked = this.share_option === 'matrix'; + this.comfyworkflows_destination_checkbox.checked = this.share_option !== 'matrix'; + this.share_button.textContent = "Share"; + this.share_button.style.display = "inline-block"; + this.final_message.innerHTML = ""; + this.final_message.style.color = "white"; + this.credits_input.value = ""; + this.title_input.value = ""; + this.description_input.value = ""; + this.is_nsfw_checkbox.checked = false; + this.selectedOutputIndex = 0; + + // hide the final message + this.share_finalmessage_container.style.display = "none"; + + // show the share container + this.share_container.style.display = "flex"; + + this.close() + } + }), + $el("br", {}, []), + ]), + ]); + + // get the user's existing matrix auth and share key + ShareDialog.matrix_auth = { homeserver: "matrix.org", username: "", password: "" }; + try { + api.fetchApi(`/manager/get_matrix_auth`) + .then(response => response.json()) + .then(data => { + ShareDialog.matrix_auth = data; + this.matrix_homeserver_input.value = ShareDialog.matrix_auth.homeserver; + this.matrix_username_input.value = ShareDialog.matrix_auth.username; + this.matrix_password_input.value = ShareDialog.matrix_auth.password; + }) + .catch(error => { + // console.log(error); + }); + } catch (error) { + // console.log(error); + } + + // get the user's existing comfyworkflows share key + ShareDialog.cw_sharekey = ""; + try { + // console.log("Fetching comfyworkflows share key") + api.fetchApi(`/manager/get_comfyworkflows_auth`) + .then(response => response.json()) + .then(data => { + ShareDialog.cw_sharekey = data.comfyworkflows_sharekey; + this.cw_sharekey_input.value = ShareDialog.cw_sharekey; + }) + .catch(error => { + // console.log(error); + }); + } catch (error) { + // console.log(error); + } + + this.share_button.onclick = async () => { + const prompt = await app.graphToPrompt(); + const nodes = app.graph._nodes; + + // console.log({ prompt, nodes }); + + const destinations = []; + if (this.matrix_destination_checkbox.checked) { + destinations.push("matrix"); + } + if (this.comfyworkflows_destination_checkbox.checked) { + destinations.push("comfyworkflows"); + } + + // if destinations includes matrix, make an api call to /manager/check_matrix to ensure that the user has configured their matrix settings + if (destinations.includes("matrix")) { + let definedMatrixAuth = !!this.matrix_homeserver_input.value && !!this.matrix_username_input.value && !!this.matrix_password_input.value; + if (!definedMatrixAuth) { + alert("Please set your Matrix account details."); + return; + } + } + + if (destinations.includes("comfyworkflows") && !this.cw_sharekey_input.value && false) { //!confirm("You have NOT set your ComfyWorkflows.com share key. Your art will NOT be connected to your account (it will be shared anonymously). Continue?")) { + return; + } + + const { potential_outputs, potential_output_nodes } = getPotentialOutputsAndOutputNodes(nodes); + + // console.log({ potential_outputs, potential_output_nodes }) + + if (potential_outputs.length === 0) { + if (potential_output_nodes.length === 0) { + // todo: add support for other output node types (animatediff combine, etc.) + const supported_nodes_string = SUPPORTED_OUTPUT_NODE_TYPES.join(", "); + alert(`No supported output node found (${supported_nodes_string}). To share this workflow, please add an output node to your graph and re-run your prompt.`); + } else { + alert("To share this, first run a prompt. Once it's done, click 'Share'.\n\nNOTE: Images of the Share target can only be selected in the PreviewImage, SaveImage, and VHS_VideoCombine nodes. In the case of VHS_VideoCombine, only the image/gif and image/webp formats are supported."); + } + this.selectedOutputIndex = 0; + this.close(); + return; + } + + // Change the text of the share button to "Sharing..." to indicate that the share process has started + this.share_button.textContent = "Sharing..."; + + const response = await api.fetchApi(`/manager/share`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + matrix_auth: { + homeserver: this.matrix_homeserver_input.value, + username: this.matrix_username_input.value, + password: this.matrix_password_input.value, + }, + cw_auth: { + cw_sharekey: this.cw_sharekey_input.value, + }, + share_destinations: destinations, + credits: this.credits_input.value, + title: this.title_input.value, + description: this.description_input.value, + is_nsfw: this.is_nsfw_checkbox.checked, + prompt, + potential_outputs, + selected_output_index: this.selectedOutputIndex, + // potential_output_nodes + }) + }); + + if (response.status != 200) { + try { + const response_json = await response.json(); + if (response_json.error) { + alert(response_json.error); + this.close(); + return; + } else { + alert("Failed to share your art. Please try again."); + this.close(); + return; + } + } catch (e) { + alert("Failed to share your art. Please try again."); + this.close(); + return; + } + } + + const response_json = await response.json(); + + if (response_json.comfyworkflows.url) { + this.final_message.innerHTML = "Your art has been shared: " + response_json.comfyworkflows.url + ""; + if (response_json.matrix.success) { + this.final_message.innerHTML += "
Your art has been shared in the ComfyUI Matrix server's #share channel!"; + } + } else { + if (response_json.matrix.success) { + this.final_message.innerHTML = "Your art has been shared in the ComfyUI Matrix server's #share channel!"; + } + } + + this.final_message.style.color = "green"; + + // hide #comfyui-share-container and show #comfyui-share-finalmessage-container + this.share_container.style.display = "none"; + this.share_finalmessage_container.style.display = "block"; + + // hide the share button + this.share_button.textContent = "Shared!"; + this.share_button.style.display = "none"; + // this.close(); + } + + const res = + [ + $el("tr.td", { width: "100%" }, [ + $el("font", { size: 6, color: "white" }, [`Share your art`]), + ]), + $el("br", {}, []), + + this.share_finalmessage_container, + this.share_container, + ]; + + res[0].style.padding = "10px 10px 10px 10px"; + res[0].style.backgroundColor = "black"; //"linear-gradient(90deg, #00C9FF 0%, #92FE9D 100%)"; + res[0].style.textAlign = "center"; + res[0].style.height = "45px"; + return res; + } + + show({potential_outputs, potential_output_nodes, share_option}) { + // Sort `potential_output_nodes` by node ID to make the order always + // consistent, but we should also keep `potential_outputs` in the same + // order as `potential_output_nodes`. + const potential_output_to_order = {}; + potential_output_nodes.forEach((node, index) => { + if (node.id in potential_output_to_order) { + potential_output_to_order[node.id][1].push(potential_outputs[index]); + } else { + potential_output_to_order[node.id] = [node, [potential_outputs[index]]]; + } + }) + // Sort the object `potential_output_to_order` by key (node ID) + const sorted_potential_output_to_order = Object.fromEntries( + Object.entries(potential_output_to_order).sort((a, b) => a[0].id - b[0].id) + ); + const sorted_potential_outputs = [] + const sorted_potential_output_nodes = [] + for (const [key, value] of Object.entries(sorted_potential_output_to_order)) { + sorted_potential_output_nodes.push(value[0]); + sorted_potential_outputs.push(...value[1]); + } + potential_output_nodes = sorted_potential_output_nodes; + potential_outputs = sorted_potential_outputs; + + // console.log({ potential_outputs, potential_output_nodes }) + this.radio_buttons.innerHTML = ""; // clear the radio buttons + let is_radio_button_checked = false; // only check the first radio button if multiple images from the same node + const new_radio_buttons = $el("div", { + id: "selectOutput-Options", + style: { + 'overflow-y': 'scroll', + 'max-height': '400px', + } + }, potential_outputs.map((output, index) => { + const {node_id} = output; + const radio_button = $el("input", { type: 'radio', name: "selectOutputImages", value: index, required: index === 0 }, []) + let radio_button_img; + if (output.type === "image" || output.type === "temp") { + radio_button_img = $el("img", { src: `/view?filename=${output.image.filename}&subfolder=${output.image.subfolder}&type=${output.image.type}`, style: { width: "auto", height: "100px" } }, []); + } else if (output.type === "output") { + radio_button_img = $el("img", { src: output.output.value, style: { width: "auto", height: "100px" } }, []); + } else { + // unsupported output type + // this should never happen + // TODO + radio_button_img = $el("img", { src: "", style: { width: "auto", height: "100px" } }, []); + } + const radio_button_text = $el("label", { + // style: { + // color: 'white' + // } + }, [output.title]) + radio_button.style.color = "var(--fg-color)"; + + // Make the radio button checked if it's the selected node, + // otherwise make the first radio button checked. + if (this.selectedNodeId) { + if (this.selectedNodeId === node_id && !is_radio_button_checked) { + radio_button.checked = true; + is_radio_button_checked = true; + } + } else { + radio_button.checked = index === 0; + } + + if (radio_button.checked) { + this.selectedOutputIndex = index; + } + + radio_button.onchange = () => { + this.selectedOutputIndex = parseInt(radio_button.value); + }; + + return $el("div", { + style: { + display: "flex", + 'align-items': 'center', + 'justify-content': 'space-between', + 'margin-bottom': '10px', + } + }, [radio_button, radio_button_text, radio_button_img]); + })); + const header = $el("h3", { + textContent: "Select an image to share", + size: 3, + color: "white", + style: { + 'text-align': 'center', + color: 'white', + backgroundColor: 'black', + padding: '10px', + 'margin-top': '0px', + } + }, [ + $el("p", { + textContent: "Scroll to see all outputs", + size: 2, + color: "white", + style: { + 'text-align': 'center', + color: 'white', + 'margin-bottom': '5px', + 'font-style': 'italic', + 'font-size': '12px', + }, + }, []) + ]); + this.radio_buttons.appendChild(header); + // this.radio_buttons.appendChild(subheader); + this.radio_buttons.appendChild(new_radio_buttons); + this.element.style.display = "block"; + + share_option = share_option || this.share_option; + if (share_option === 'comfyworkflows') { + this.matrix_destination_checkbox.checked = false; + this.comfyworkflows_destination_checkbox.checked = true; + } else { + this.matrix_destination_checkbox.checked = true; + this.comfyworkflows_destination_checkbox.checked = false; + } + } +} diff --git a/custom_nodes/ComfyUI-Manager/js/comfyui-share-copus.js b/custom_nodes/ComfyUI-Manager/js/comfyui-share-copus.js new file mode 100644 index 000000000..318b1fe5d --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/comfyui-share-copus.js @@ -0,0 +1,892 @@ +import { app } from "../../scripts/app.js"; +import { $el, ComfyDialog } from "../../scripts/ui.js"; +const env = "prod"; + +let DEFAULT_HOMEPAGE_URL = "https://copus.io"; + +let API_ENDPOINT = "https://api.client.prod.copus.io/copus-client"; + +if (env !== "prod") { + API_ENDPOINT = "https://api.dev.copus.io/copus-client"; + DEFAULT_HOMEPAGE_URL = "https://test.copus.io"; +} + +const style = ` + .copus-share-dialog a { + color: #f8f8f8; + } + .copus-share-dialog a:hover { + color: #007bff; + } + .output_label { + border: 5px solid transparent; + } + .output_label:hover { + border: 5px solid #59E8C6; + } + .output_label.checked { + border: 5px solid #59E8C6; + } +`; + +// Shared component styles +const sectionStyle = { + marginBottom: 0, + padding: 0, + borderRadius: "8px", + boxShadow: "0 2px 4px rgba(0, 0, 0, 0.05)", + display: "flex", + flexDirection: "column", + justifyContent: "center", + position: "relative", +}; + +export class CopusShareDialog extends ComfyDialog { + static instance = null; + + constructor() { + super(); + $el("style", { + textContent: style, + parent: document.head, + }); + this.element = $el( + "div.comfy-modal.copus-share-dialog", + { + parent: document.body, + style: { + "overflow-y": "auto", + }, + }, + [$el("div.comfy-modal-content", {}, [...this.createButtons()])] + ); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.uploadedImages = []; + this.allFilesImages = []; + this.selectedFile = null; + this.allFiles = []; + this.titleNum = 0; + } + + createButtons() { + const inputStyle = { + display: "block", + minWidth: "500px", + width: "100%", + padding: "10px", + margin: "10px 0", + borderRadius: "4px", + border: "1px solid #ddd", + boxSizing: "border-box", + }; + + const textAreaStyle = { + display: "block", + minWidth: "500px", + width: "100%", + padding: "10px", + margin: "10px 0", + borderRadius: "4px", + border: "1px solid #ddd", + boxSizing: "border-box", + minHeight: "100px", + background: "#222", + resize: "vertical", + color: "#f2f2f2", + fontFamily: "Arial", + fontWeight: "400", + fontSize: "15px", + }; + + const hyperLinkStyle = { + display: "block", + marginBottom: "15px", + fontWeight: "bold", + fontSize: "14px", + }; + + const labelStyle = { + color: "#f8f8f8", + display: "block", + margin: "10px 0 0 0", + fontWeight: "bold", + textDecoration: "none", + }; + + const buttonStyle = { + padding: "10px 80px", + margin: "10px 5px", + borderRadius: "4px", + border: "none", + cursor: "pointer", + color: "#fff", + backgroundColor: "#007bff", + }; + + // upload images input + this.uploadImagesInput = $el("input", { + type: "file", + multiple: false, + style: inputStyle, + accept: "image/*", + }); + + this.uploadImagesInput.addEventListener("change", async (e) => { + const file = e.target.files[0]; + if (!file) { + this.previewImage.src = ""; + this.previewImage.style.display = "none"; + return; + } + const reader = new FileReader(); + reader.onload = async (e) => { + const imgData = e.target.result; + this.previewImage.src = imgData; + this.previewImage.style.display = "block"; + this.selectedFile = null; + // Once user uploads an image, we uncheck all radio buttons + this.radioButtons.forEach((ele) => { + ele.checked = false; + ele.parentElement.classList.remove("checked"); + }); + + // Add the opacity style toggle here to indicate that they only need + // to upload one image or choose one from the outputs. + this.outputsSection.style.opacity = 0.35; + this.uploadImagesInput.style.opacity = 1; + }; + reader.readAsDataURL(file); + }); + + // preview image + this.previewImage = $el("img", { + src: "", + style: { + width: "100%", + maxHeight: "100px", + objectFit: "contain", + display: "none", + marginTop: "10px", + }, + }); + + this.keyInput = $el("input", { + type: "password", + placeholder: "Copy & paste your API key", + style: inputStyle, + }); + this.TitleInput = $el("input", { + type: "text", + placeholder: "Title (Required)", + style: inputStyle, + maxLength: "70", + oninput: () => { + const titleNum = this.TitleInput.value.length; + titleNumDom.textContent = `${titleNum}/70`; + }, + }); + this.SubTitleInput = $el("input", { + type: "text", + placeholder: "Subtitle (Optional)", + style: inputStyle, + maxLength: "70", + oninput: () => { + const titleNum = this.SubTitleInput.value.length; + subTitleNumDom.textContent = `${titleNum}/70`; + }, + }); + this.descriptionInput = $el("textarea", { + placeholder: "Content (Optional)", + style: { + ...textAreaStyle, + minHeight: "100px", + }, + }); + + // Header Section + const headerSection = $el("h3", { + textContent: "Share your workflow to Copus", + size: 3, + color: "white", + style: { + "text-align": "center", + color: "white", + margin: "0 0 10px 0", + }, + }); + this.getAPIKeyLink = $el( + "a", + { + style: { + ...hyperLinkStyle, + color: "#59E8C6", + }, + href: `${DEFAULT_HOMEPAGE_URL}?fromPage=comfyUI`, + target: "_blank", + }, + ["👉 Get your API key here"] + ); + const linkSection = $el( + "div", + { + style: { + marginTop: "10px", + display: "flex", + flexDirection: "column", + }, + }, + [ + // this.communityLink, + this.getAPIKeyLink, + ] + ); + + // Account Section + const accountSection = $el("div", { style: sectionStyle }, [ + $el("label", { style: labelStyle }, ["1️⃣ Copus API Key"]), + this.keyInput, + ]); + + // Output Upload Section + const outputUploadSection = $el("div", { style: sectionStyle }, [ + $el( + "label", + { + style: { + ...labelStyle, + margin: "10px 0 0 0", + }, + }, + ["2️⃣ Image/Thumbnail (Required)"] + ), + this.previewImage, + this.uploadImagesInput, + ]); + + // Outputs Section + this.outputsSection = $el( + "div", + { + id: "selectOutputs", + }, + [] + ); + + const titleNumDom = $el( + "label", + { + style: { + fontSize: "12px", + position: "absolute", + right: "10px", + bottom: "-10px", + color: "#999", + }, + }, + ["0/70"] + ); + const subTitleNumDom = $el( + "label", + { + style: { + fontSize: "12px", + position: "absolute", + right: "10px", + bottom: "-10px", + color: "#999", + }, + }, + ["0/70"] + ); + const descriptionNumDom = $el( + "label", + { + style: { + fontSize: "12px", + position: "absolute", + right: "10px", + bottom: "-10px", + color: "#999", + }, + }, + ["0/70"] + ); + // Additional Inputs Section + const additionalInputsSection = $el( + "div", + { style: { ...sectionStyle, } }, + [ + $el("label", { style: labelStyle }, ["3️⃣ Title "]), + this.TitleInput, + titleNumDom, + ] + ); + const SubtitleSection = $el("div", { style: sectionStyle }, [ + $el("label", { style: labelStyle }, ["4️⃣ Subtitle "]), + this.SubTitleInput, + subTitleNumDom, + ]); + const DescriptionSection = $el("div", { style: sectionStyle }, [ + $el("label", { style: labelStyle }, ["5️⃣ Description "]), + this.descriptionInput, + // descriptionNumDom, + ]); + // switch between outputs section and additional inputs section + this.radioButtons = []; + + this.radioButtonsCheck = $el("input", { + type: "radio", + name: "output_type", + value: "0", + id: "blockchain1", + checked: true, + }); + this.radioButtonsCheckOff = $el("input", { + type: "radio", + name: "output_type", + value: "1", + id: "blockchain", + }); + + const blockChainSection = $el("div", { style: sectionStyle }, [ + $el("label", { style: labelStyle }, ["6️⃣ Store on blockchain "]), + $el( + "label", + { + style: { + marginTop: "10px", + display: "flex", + alignItems: "center", + cursor: "pointer", + }, + }, + [ + this.radioButtonsCheck, + $el("span", { style: { marginLeft: "5px" } }, ["ON"]), + ] + ), + $el( + "label", + { style: { display: "flex", alignItems: "center", cursor: "pointer" } }, + [ + this.radioButtonsCheckOff, + $el("span", { style: { marginLeft: "5px" } }, ["OFF"]), + ] + ), + $el( + "p", + { style: { fontSize: "16px", color: "#fff", margin: "10px 0 0 0" } }, + ["Secure ownership with a permanent & decentralized storage"] + ), + ]); + // Message Section + this.message = $el( + "div", + { + style: { + color: "#ff3d00", + textAlign: "center", + padding: "10px", + fontSize: "20px", + }, + }, + [] + ); + + this.shareButton = $el("button", { + type: "submit", + textContent: "Share", + style: buttonStyle, + onclick: () => { + this.handleShareButtonClick(); + }, + }); + + // Share and Close Buttons + const buttonsSection = $el( + "div", + { + style: { + textAlign: "right", + marginTop: "20px", + display: "flex", + justifyContent: "space-between", + }, + }, + [ + $el("button", { + type: "button", + textContent: "Close", + style: { + ...buttonStyle, + backgroundColor: undefined, + }, + onclick: () => { + this.close(); + }, + }), + this.shareButton, + ] + ); + + // Composing the full layout + const layout = [ + headerSection, + linkSection, + accountSection, + outputUploadSection, + this.outputsSection, + additionalInputsSection, + SubtitleSection, + DescriptionSection, + // contestSection, + blockChainSection, + this.message, + buttonsSection, + ]; + + return layout; + } + /** + * api + * @param {url} path + * @param {params} options + * @param {statusText} statusText + * @returns + */ + async fetchApi(path, options, statusText) { + if (statusText) { + this.message.textContent = statusText; + } + const fullPath = new URL(API_ENDPOINT + path); + const response = await fetch(fullPath, options); + if (!response.ok) { + throw new Error(response.statusText); + } + if (statusText) { + this.message.textContent = ""; + } + const data = await response.json(); + return { + ok: response.ok, + statusText: response.statusText, + status: response.status, + data, + }; + } + /** + * @param {file} uploadFile + */ + async uploadThumbnail(uploadFile, type) { + const form = new FormData(); + form.append("file", uploadFile); + form.append("apiToken", this.keyInput.value); + try { + const res = await this.fetchApi( + `/client/common/opus/uploadImage`, + { + method: "POST", + body: form, + }, + "Uploading thumbnail..." + ); + if (res.status && res.data.status && res.data) { + const { data } = res.data; + if (type) { + this.allFilesImages.push({ + url: data, + }); + } + this.uploadedImages.push({ + url: data, + }); + } else { + throw new Error("make sure your API key is correct and try again later"); + } + } catch (e) { + if (e?.response?.status === 413) { + throw new Error("File size is too large (max 20MB)"); + } else { + throw new Error("Error uploading thumbnail: " + e.message); + } + } + } + + async handleShareButtonClick() { + this.message.textContent = ""; + try { + this.shareButton.disabled = true; + this.shareButton.textContent = "Sharing..."; + await this.share(); + } catch (e) { + alert(e.message); + } + this.shareButton.disabled = false; + this.shareButton.textContent = "Share"; + } + /** + * share + * @param {string} title + * @param {string} subtitle + * @param {string} content + * @param {boolean} storeOnChain + * @param {string} coverUrl + * @param {string[]} imageUrls + * @param {string} apiToken + */ + async share() { + const prompt = await app.graphToPrompt(); + const workflowJSON = prompt["workflow"]; + const form_values = { + title: this.TitleInput.value, + subTitle: this.SubTitleInput.value, + content: this.descriptionInput.value, + storeOnChain: this.radioButtonsCheck.checked ? true : false, + }; + + if (!this.keyInput.value) { + throw new Error("API key is required"); + } + + if (!this.uploadImagesInput.files[0] && !this.selectedFile) { + throw new Error("Thumbnail is required"); + } + + if (!form_values.title) { + throw new Error("Title is required"); + } + + if (!this.uploadedImages.length) { + if (this.selectedFile) { + await this.uploadThumbnail(this.selectedFile); + } else { + for (const file of this.uploadImagesInput.files) { + try { + await this.uploadThumbnail(file); + } catch (e) { + this.uploadedImages = []; + throw new Error(e.message); + } + } + + if (this.uploadImagesInput.files.length === 0) { + throw new Error("No thumbnail uploaded"); + } + } + } + if (this.allFiles.length > 0) { + for (const file of this.allFiles) { + try { + await this.uploadThumbnail(file, true); + } catch (e) { + this.allFilesImages = []; + throw new Error(e.message); + } + } + } + try { + const res = await this.fetchApi( + "/client/common/opus/shareFromComfyUI", + { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + workflowJson: workflowJSON, + apiToken: this.keyInput.value, + coverUrl: this.uploadedImages[0].url, + imageUrls: this.allFilesImages.map((image) => image.url), + ...form_values, + }), + }, + "Uploading workflow..." + ); + + if (res.status && res.data.status && res.data) { + localStorage.setItem("copus_token",this.keyInput.value); + const { data } = res.data; + if (data) { + const url = `${DEFAULT_HOMEPAGE_URL}/work/${data}`; + this.message.innerHTML = `Workflow has been shared successfully. Click here to view it.`; + this.previewImage.src = ""; + this.previewImage.style.display = "none"; + this.uploadedImages = []; + this.allFilesImages = []; + this.allFiles = []; + this.TitleInput.value = ""; + this.SubTitleInput.value = ""; + this.descriptionInput.value = ""; + this.selectedFile = null; + } + } + } catch (e) { + throw new Error("Error sharing workflow: " + e.message); + } + } + + async fetchImageBlob(url) { + const response = await fetch(url); + const blob = await response.blob(); + return blob; + } + + async show({ potential_outputs, potential_output_nodes } = {}) { + // Sort `potential_output_nodes` by node ID to make the order always + // consistent, but we should also keep `potential_outputs` in the same + // order as `potential_output_nodes`. + const potential_output_to_order = {}; + potential_output_nodes.forEach((node, index) => { + if (node.id in potential_output_to_order) { + potential_output_to_order[node.id][1].push(potential_outputs[index]); + } else { + potential_output_to_order[node.id] = [node, [potential_outputs[index]]]; + } + }); + // Sort the object `potential_output_to_order` by key (node ID) + const sorted_potential_output_to_order = Object.fromEntries( + Object.entries(potential_output_to_order).sort( + (a, b) => a[0].id - b[0].id + ) + ); + const sorted_potential_outputs = []; + const sorted_potential_output_nodes = []; + for (const [key, value] of Object.entries( + sorted_potential_output_to_order + )) { + sorted_potential_output_nodes.push(value[0]); + sorted_potential_outputs.push(...value[1]); + } + potential_output_nodes = sorted_potential_output_nodes; + potential_outputs = sorted_potential_outputs; + const apiToken = localStorage.getItem("copus_token"); + this.message.innerHTML = ""; + this.message.textContent = ""; + this.element.style.display = "block"; + this.previewImage.src = ""; + this.previewImage.style.display = "none"; + this.keyInput.value = apiToken!=null?apiToken:""; + this.uploadedImages = []; + this.allFilesImages = []; + this.allFiles = []; + // If `selectedNodeId` is provided, we will select the corresponding radio + // button for the node. In addition, we move the selected radio button to + // the top of the list. + if (this.selectedNodeId) { + const index = potential_output_nodes.findIndex( + (node) => node.id === this.selectedNodeId + ); + if (index >= 0) { + this.selectedOutputIndex = index; + } + } + + this.radioButtons = []; + const new_radio_buttons = $el( + "div", + { + id: "selectOutput-Options", + style: { + "overflow-y": "scroll", + "max-height": "200px", + display: "grid", + "grid-template-columns": "repeat(auto-fit, minmax(100px, 1fr))", + "grid-template-rows": "auto", + "grid-column-gap": "10px", + "grid-row-gap": "10px", + "margin-bottom": "10px", + padding: "10px", + "border-radius": "8px", + "box-shadow": "0 2px 4px rgba(0, 0, 0, 0.05)", + "background-color": "var(--bg-color)", + }, + }, + potential_outputs.map((output, index) => { + const { node_id } = output; + const radio_button = $el( + "input", + { + type: "radio", + name: "selectOutputImages", + value: index, + required: index === 0, + }, + [] + ); + let radio_button_img; + let filename; + if (output.type === "image" || output.type === "temp") { + radio_button_img = $el( + "img", + { + src: `/view?filename=${output.image.filename}&subfolder=${output.image.subfolder}&type=${output.image.type}`, + style: { + width: "100px", + height: "100px", + objectFit: "cover", + borderRadius: "5px", + }, + }, + [] + ); + filename = output.image.filename; + } else if (output.type === "output") { + radio_button_img = $el( + "img", + { + src: output.output.value, + style: { + width: "auto", + height: "100px", + objectFit: "cover", + borderRadius: "5px", + }, + }, + [] + ); + filename = output.filename; + } else { + // unsupported output type + // this should never happen + radio_button_img = $el( + "img", + { + src: "", + style: { width: "auto", height: "100px" }, + }, + [] + ); + } + const radio_button_text = $el( + "span", + { + style: { + color: "gray", + display: "block", + fontSize: "12px", + overflowX: "hidden", + textOverflow: "ellipsis", + textWrap: "nowrap", + maxWidth: "100px", + }, + }, + [output.title] + ); + const node_id_chip = $el( + "span", + { + style: { + color: "#FBFBFD", + display: "block", + backgroundColor: "rgba(0, 0, 0, 0.5)", + fontSize: "12px", + overflowX: "hidden", + padding: "2px 3px", + textOverflow: "ellipsis", + textWrap: "nowrap", + maxWidth: "100px", + position: "absolute", + top: "3px", + left: "3px", + borderRadius: "3px", + }, + }, + [`Node: ${node_id}`] + ); + radio_button.style.color = "var(--fg-color)"; + radio_button.checked = this.selectedOutputIndex === index; + + radio_button.onchange = async () => { + this.selectedOutputIndex = parseInt(radio_button.value); + + // Remove the "checked" class from all radio buttons + this.radioButtons.forEach((ele) => { + ele.parentElement.classList.remove("checked"); + }); + radio_button.parentElement.classList.add("checked"); + + this.fetchImageBlob(radio_button_img.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.previewImage.src = radio_button_img.src; + this.previewImage.style.display = "block"; + this.selectedFile = file; + }); + + // Add the opacity style toggle here to indicate that they only need + // to upload one image or choose one from the outputs. + this.outputsSection.style.opacity = 1; + this.uploadImagesInput.style.opacity = 0.35; + }; + + if (radio_button.checked) { + this.fetchImageBlob(radio_button_img.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.previewImage.src = radio_button_img.src; + this.previewImage.style.display = "block"; + this.selectedFile = file; + }); + // Add the opacity style toggle here to indicate that they only need + // to upload one image or choose one from the outputs. + this.outputsSection.style.opacity = 1; + this.uploadImagesInput.style.opacity = 0.35; + } + this.radioButtons.push(radio_button); + let src = ""; + if (output.type === "image" || output.type === "temp") { + filename = output.image.filename; + src = `/view?filename=${output.image.filename}&subfolder=${output.image.subfolder}&type=${output.image.type}`; + } else if (output.type === "output") { + src = output.output.value; + filename = output.filename; + } + if (src) { + this.fetchImageBlob(src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.allFiles.push(file); + }); + } + return $el( + `label.output_label${radio_button.checked ? ".checked" : ""}`, + { + style: { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + marginBottom: "10px", + cursor: "pointer", + position: "relative", + }, + }, + [radio_button_img, radio_button_text, radio_button, node_id_chip] + ); + }) + ); + + const header = $el( + "p", + { + textContent: + this.radioButtons.length === 0 + ? "Queue Prompt to see the outputs" + : "Or choose one from the outputs (scroll to see all)", + size: 2, + color: "white", + style: { + color: "white", + margin: "0 0 5px 0", + fontSize: "12px", + }, + }, + [] + ); + this.outputsSection.innerHTML = ""; + this.outputsSection.appendChild(header); + this.outputsSection.appendChild(new_radio_buttons); + } +} diff --git a/custom_nodes/ComfyUI-Manager/js/comfyui-share-openart.js b/custom_nodes/ComfyUI-Manager/js/comfyui-share-openart.js new file mode 100644 index 000000000..96460fe79 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/comfyui-share-openart.js @@ -0,0 +1,745 @@ +import {app} from "../../scripts/app.js"; +import {api} from "../../scripts/api.js"; +import {ComfyDialog, $el} from "../../scripts/ui.js"; + +const LOCAL_STORAGE_KEY = "openart_comfy_workflow_key"; +const DEFAULT_HOMEPAGE_URL = "https://openart.ai/workflows/dev?developer=true"; +//const DEFAULT_HOMEPAGE_URL = "http://localhost:8080/workflows/dev?developer=true"; + +const API_ENDPOINT = "https://openart.ai/api"; +//const API_ENDPOINT = "http://localhost:8080/api"; + +const style = ` + .openart-share-dialog a { + color: #f8f8f8; + } + .openart-share-dialog a:hover { + color: #007bff; + } + .output_label { + border: 5px solid transparent; + } + .output_label:hover { + border: 5px solid #59E8C6; + } + .output_label.checked { + border: 5px solid #59E8C6; + } +`; + +// Shared component styles +const sectionStyle = { + marginBottom: 0, + padding: 0, + borderRadius: "8px", + boxShadow: "0 2px 4px rgba(0, 0, 0, 0.05)", + display: "flex", + flexDirection: "column", + justifyContent: "center", +}; + +export class OpenArtShareDialog extends ComfyDialog { + static instance = null; + + constructor() { + super(); + $el("style", { + textContent: style, + parent: document.head, + }); + this.element = $el( + "div.comfy-modal.openart-share-dialog", + { + parent: document.body, + style: { + "overflow-y": "auto", + }, + }, + [$el("div.comfy-modal-content", {}, [...this.createButtons()])] + ); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.uploadedImages = []; + this.selectedFile = null; + } + + async readKey() { + let key = "" + try { + key = await api.fetchApi(`/manager/get_openart_auth`) + .then(response => response.json()) + .then(data => { + return data.openart_key; + }) + .catch(error => { + // console.log(error); + }); + } catch (error) { + // console.log(error); + } + return key || ""; + } + + async saveKey(value) { + await api.fetchApi(`/manager/set_openart_auth`, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + openart_key: value + }) + }); + } + + createButtons() { + const inputStyle = { + display: "block", + minWidth: "500px", + width: "100%", + padding: "10px", + margin: "10px 0", + borderRadius: "4px", + border: "1px solid #ddd", + boxSizing: "border-box", + }; + + const hyperLinkStyle = { + display: "block", + marginBottom: "15px", + fontWeight: "bold", + fontSize: "14px", + }; + + const labelStyle = { + color: "#f8f8f8", + display: "block", + margin: "10px 0 0 0", + fontWeight: "bold", + textDecoration: "none", + }; + + const buttonStyle = { + padding: "10px 80px", + margin: "10px 5px", + borderRadius: "4px", + border: "none", + cursor: "pointer", + color: "#fff", + backgroundColor: "#007bff", + }; + + // upload images input + this.uploadImagesInput = $el("input", { + type: "file", + multiple: false, + style: inputStyle, + accept: "image/*", + }); + + this.uploadImagesInput.addEventListener("change", async (e) => { + const file = e.target.files[0]; + if (!file) { + this.previewImage.src = ""; + this.previewImage.style.display = "none"; + return; + } + const reader = new FileReader(); + reader.onload = async (e) => { + const imgData = e.target.result; + this.previewImage.src = imgData; + this.previewImage.style.display = "block"; + this.selectedFile = null + // Once user uploads an image, we uncheck all radio buttons + this.radioButtons.forEach((ele) => { + ele.checked = false; + ele.parentElement.classList.remove("checked"); + }); + + // Add the opacity style toggle here to indicate that they only need + // to upload one image or choose one from the outputs. + this.outputsSection.style.opacity = 0.35; + this.uploadImagesInput.style.opacity = 1; + }; + reader.readAsDataURL(file); + }); + + // preview image + this.previewImage = $el("img", { + src: "", + style: { + width: "100%", + maxHeight: "100px", + objectFit: "contain", + display: "none", + marginTop: '10px', + }, + }); + + this.keyInput = $el("input", { + type: "password", + placeholder: "Copy & paste your API key", + style: inputStyle, + }); + this.NameInput = $el("input", { + type: "text", + placeholder: "Title (required)", + style: inputStyle, + }); + this.descriptionInput = $el("textarea", { + placeholder: "Description (optional)", + style: { + ...inputStyle, + minHeight: "100px", + }, + }); + + // Header Section + const headerSection = $el("h3", { + textContent: "Share your workflow to OpenArt", + size: 3, + color: "white", + style: { + 'text-align': 'center', + color: 'white', + margin: '0 0 10px 0', + } + }); + + // LinkSection + this.communityLink = $el("a", { + style: hyperLinkStyle, + href: DEFAULT_HOMEPAGE_URL, + target: "_blank" + }, ["👉 Check out thousands of workflows shared from the community"]) + this.getAPIKeyLink = $el("a", { + style: { + ...hyperLinkStyle, + color: "#59E8C6" + }, + href: DEFAULT_HOMEPAGE_URL, + target: "_blank" + }, ["👉 Get your API key here"]) + const linkSection = $el( + "div", + { + style: { + marginTop: "10px", + display: "flex", + flexDirection: "column", + }, + }, + [ + this.communityLink, + this.getAPIKeyLink, + ] + ); + + // Account Section + const accountSection = $el("div", {style: sectionStyle}, [ + $el("label", {style: labelStyle}, ["1️⃣ OpenArt API Key"]), + this.keyInput, + ]); + + // Output Upload Section + const outputUploadSection = $el("div", {style: sectionStyle}, [ + $el("label", { + style: { + ...labelStyle, + margin: "10px 0 0 0" + } + }, ["2️⃣ Image/Thumbnail (Required)"]), + this.previewImage, + this.uploadImagesInput, + ]); + + // Outputs Section + this.outputsSection = $el("div", { + id: "selectOutputs", + }, []); + + // Additional Inputs Section + const additionalInputsSection = $el("div", {style: sectionStyle}, [ + $el("label", {style: labelStyle}, ["3️⃣ Workflow Information"]), + this.NameInput, + this.descriptionInput, + ]); + + // OpenArt Contest Section + /* + this.joinContestCheckbox = $el("input", { + type: 'checkbox', + id: "join_contest"s + }, []) + this.joinContestDescription = $el("a", { + style: { + ...hyperLinkStyle, + display: 'inline-block', + color: "#59E8C6", + fontSize: '12px', + marginLeft: '10px', + marginBottom: 0, + }, + href: "https://contest.openart.ai/", + target: "_blank" + }, ["🏆 I'm participating in the OpenArt workflow contest"]) + this.joinContestLabel = $el("label", { + style: { + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + } + }, [this.joinContestCheckbox, this.joinContestDescription]) + const contestSection = $el("div", {style: sectionStyle}, [ + this.joinContestLabel, + ]); + */ + + // Message Section + this.message = $el( + "div", + { + style: { + color: "#ff3d00", + textAlign: "center", + padding: "10px", + fontSize: "20px", + }, + }, + [] + ); + + this.shareButton = $el("button", { + type: "submit", + textContent: "Share", + style: buttonStyle, + onclick: () => { + this.handleShareButtonClick(); + }, + }); + + // Share and Close Buttons + const buttonsSection = $el( + "div", + { + style: { + textAlign: "right", + marginTop: "20px", + display: "flex", + justifyContent: "space-between", + }, + }, + [ + $el("button", { + type: "button", + textContent: "Close", + style: { + ...buttonStyle, + backgroundColor: undefined, + }, + onclick: () => { + this.close(); + }, + }), + this.shareButton, + ] + ); + + // Composing the full layout + const layout = [ + headerSection, + linkSection, + accountSection, + outputUploadSection, + this.outputsSection, + additionalInputsSection, + // contestSection, + this.message, + buttonsSection, + ]; + + return layout; + } + + async fetchApi(path, options, statusText) { + if (statusText) { + this.message.textContent = statusText; + } + const addSearchParams = (url, params = {}) => + new URL( + `${url.origin}${url.pathname}?${new URLSearchParams([ + ...Array.from(url.searchParams.entries()), + ...Object.entries(params), + ])}` + ); + + const fullPath = addSearchParams(new URL(API_ENDPOINT + path), { + workflow_api_key: this.keyInput.value, + }); + + const response = await fetch(fullPath, options); + + if (!response.ok) { + throw new Error(response.statusText); + } + + if (statusText) { + this.message.textContent = ""; + } + const data = await response.json(); + return { + ok: response.ok, + statusText: response.statusText, + status: response.status, + data, + }; + } + + async uploadThumbnail(uploadFile) { + const form = new FormData(); + form.append("file", uploadFile); + try { + const res = await this.fetchApi( + `/workflows/upload_thumbnail`, + { + method: "POST", + body: form, + }, + "Uploading thumbnail..." + ); + + if (res.ok && res.data) { + const {image_url, width, height} = res.data; + this.uploadedImages.push({ + url: image_url, + width, + height, + }); + } + } catch (e) { + if (e?.response?.status === 413) { + throw new Error("File size is too large (max 20MB)"); + } else { + throw new Error("Error uploading thumbnail: " + e.message); + } + } + } + + async handleShareButtonClick() { + this.message.textContent = ""; + await this.saveKey(this.keyInput.value); + try { + this.shareButton.disabled = true; + this.shareButton.textContent = "Sharing..."; + await this.share(); + } catch (e) { + alert(e.message); + } + this.shareButton.disabled = false; + this.shareButton.textContent = "Share"; + } + + async share() { + const prompt = await app.graphToPrompt(); + const workflowJSON = prompt["workflow"]; + const workflowAPIJSON = prompt["output"]; + const form_values = { + name: this.NameInput.value, + description: this.descriptionInput.value, + }; + + if (!this.keyInput.value) { + throw new Error("API key is required"); + } + + if (!this.uploadImagesInput.files[0] && !this.selectedFile) { + throw new Error("Thumbnail is required"); + } + + if (!form_values.name) { + throw new Error("Title is required"); + } + + const current_snapshot = await api.fetchApi(`/snapshot/get_current`) + .then(response => response.json()) + .catch(error => { + // console.log(error); + }); + + + if (!this.uploadedImages.length) { + if (this.selectedFile) { + await this.uploadThumbnail(this.selectedFile); + } else { + for (const file of this.uploadImagesInput.files) { + try { + await this.uploadThumbnail(file); + } catch (e) { + this.uploadedImages = []; + throw new Error(e.message); + } + } + + if (this.uploadImagesInput.files.length === 0) { + throw new Error("No thumbnail uploaded"); + } + } + } + + // const join_contest = this.joinContestCheckbox.checked; + + try { + const response = await this.fetchApi( + "/workflows/publish", + { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify({ + workflow_json: workflowJSON, + upload_images: this.uploadedImages, + form_values, + advanced_config: { + workflow_api_json: workflowAPIJSON, + snapshot: current_snapshot, + }, + // join_contest, + }), + }, + "Uploading workflow..." + ); + + if (response.ok) { + const {workflow_id} = response.data; + if (workflow_id) { + const url = `https://openart.ai/workflows/-/-/${workflow_id}`; + this.message.innerHTML = `Workflow has been shared successfully. Click here to view it.`; + this.previewImage.src = ""; + this.previewImage.style.display = "none"; + this.uploadedImages = []; + this.NameInput.value = ""; + this.descriptionInput.value = ""; + this.radioButtons.forEach((ele) => { + ele.checked = false; + ele.parentElement.classList.remove("checked"); + }); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.selectedFile = null; + } + } + } catch (e) { + throw new Error("Error sharing workflow: " + e.message); + } + } + + async fetchImageBlob(url) { + const response = await fetch(url); + const blob = await response.blob(); + return blob; + } + + async show({potential_outputs, potential_output_nodes} = {}) { + // Sort `potential_output_nodes` by node ID to make the order always + // consistent, but we should also keep `potential_outputs` in the same + // order as `potential_output_nodes`. + const potential_output_to_order = {}; + potential_output_nodes.forEach((node, index) => { + if (node.id in potential_output_to_order) { + potential_output_to_order[node.id][1].push(potential_outputs[index]); + } else { + potential_output_to_order[node.id] = [node, [potential_outputs[index]]]; + } + }) + // Sort the object `potential_output_to_order` by key (node ID) + const sorted_potential_output_to_order = Object.fromEntries( + Object.entries(potential_output_to_order).sort((a, b) => a[0].id - b[0].id) + ); + const sorted_potential_outputs = [] + const sorted_potential_output_nodes = [] + for (const [key, value] of Object.entries(sorted_potential_output_to_order)) { + sorted_potential_output_nodes.push(value[0]); + sorted_potential_outputs.push(...value[1]); + } + potential_output_nodes = sorted_potential_output_nodes; + potential_outputs = sorted_potential_outputs; + + this.message.innerHTML = ""; + this.message.textContent = ""; + this.element.style.display = "block"; + this.previewImage.src = ""; + this.previewImage.style.display = "none"; + const key = await this.readKey(); + this.keyInput.value = key; + this.uploadedImages = []; + + // If `selectedNodeId` is provided, we will select the corresponding radio + // button for the node. In addition, we move the selected radio button to + // the top of the list. + if (this.selectedNodeId) { + const index = potential_output_nodes.findIndex(node => node.id === this.selectedNodeId); + if (index >= 0) { + this.selectedOutputIndex = index; + } + } + + this.radioButtons = []; + const new_radio_buttons = $el("div", + { + id: "selectOutput-Options", + style: { + 'overflow-y': 'scroll', + 'max-height': '200px', + + 'display': 'grid', + 'grid-template-columns': 'repeat(auto-fit, minmax(100px, 1fr))', + 'grid-template-rows': 'auto', + 'grid-column-gap': '10px', + 'grid-row-gap': '10px', + 'margin-bottom': '10px', + 'padding': '10px', + 'border-radius': '8px', + 'box-shadow': '0 2px 4px rgba(0, 0, 0, 0.05)', + 'background-color': 'var(--bg-color)', + } + }, + potential_outputs.map((output, index) => { + const {node_id} = output; + const radio_button = $el("input", { + type: 'radio', + name: "selectOutputImages", + value: index, + required: index === 0 + }, []) + let radio_button_img; + let filename; + if (output.type === "image" || output.type === "temp") { + radio_button_img = $el("img", { + src: `/view?filename=${output.image.filename}&subfolder=${output.image.subfolder}&type=${output.image.type}`, + style: { + width: "100px", + height: "100px", + objectFit: "cover", + borderRadius: "5px" + } + }, []); + filename = output.image.filename + } else if (output.type === "output") { + radio_button_img = $el("img", { + src: output.output.value, + style: { + width: "auto", + height: "100px", + objectFit: "cover", + borderRadius: "5px" + } + }, []); + filename = output.filename + } else { + // unsupported output type + // this should never happen + // TODO + radio_button_img = $el("img", { + src: "", + style: {width: "auto", height: "100px"} + }, []); + } + const radio_button_text = $el("span", { + style: { + color: 'gray', + display: 'block', + fontSize: '12px', + overflowX: 'hidden', + textOverflow: 'ellipsis', + textWrap: 'nowrap', + maxWidth: '100px', + } + }, [output.title]) + const node_id_chip = $el("span", { + style: { + color: '#FBFBFD', + display: 'block', + backgroundColor: 'rgba(0, 0, 0, 0.5)', + fontSize: '12px', + overflowX: 'hidden', + padding: '2px 3px', + textOverflow: 'ellipsis', + textWrap: 'nowrap', + maxWidth: '100px', + position: 'absolute', + top: '3px', + left: '3px', + borderRadius: '3px', + } + }, [`Node: ${node_id}`]) + radio_button.style.color = "var(--fg-color)"; + radio_button.checked = this.selectedOutputIndex === index; + + radio_button.onchange = async () => { + this.selectedOutputIndex = parseInt(radio_button.value); + + // Remove the "checked" class from all radio buttons + this.radioButtons.forEach((ele) => { + ele.parentElement.classList.remove("checked"); + }); + radio_button.parentElement.classList.add("checked"); + + this.fetchImageBlob(radio_button_img.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.previewImage.src = radio_button_img.src; + this.previewImage.style.display = "block"; + this.selectedFile = file; + }) + + // Add the opacity style toggle here to indicate that they only need + // to upload one image or choose one from the outputs. + this.outputsSection.style.opacity = 1; + this.uploadImagesInput.style.opacity = 0.35; + }; + + if (radio_button.checked) { + this.fetchImageBlob(radio_button_img.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.previewImage.src = radio_button_img.src; + this.previewImage.style.display = "block"; + this.selectedFile = file; + }) + // Add the opacity style toggle here to indicate that they only need + // to upload one image or choose one from the outputs. + this.outputsSection.style.opacity = 1; + this.uploadImagesInput.style.opacity = 0.35; + } + + this.radioButtons.push(radio_button); + + return $el(`label.output_label${radio_button.checked ? '.checked' : ''}`, { + style: { + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + marginBottom: "10px", + cursor: "pointer", + position: 'relative', + } + }, [radio_button_img, radio_button_text, radio_button, node_id_chip]); + }) + ); + + const header = + $el("p", { + textContent: this.radioButtons.length === 0 ? "Queue Prompt to see the outputs" : "Or choose one from the outputs (scroll to see all)", + size: 2, + color: "white", + style: { + color: 'white', + margin: '0 0 5px 0', + fontSize: '12px', + }, + }, []) + this.outputsSection.innerHTML = ""; + this.outputsSection.appendChild(header); + this.outputsSection.appendChild(new_radio_buttons); + } +} diff --git a/custom_nodes/ComfyUI-Manager/js/comfyui-share-youml.js b/custom_nodes/ComfyUI-Manager/js/comfyui-share-youml.js new file mode 100644 index 000000000..80077b25a --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/comfyui-share-youml.js @@ -0,0 +1,568 @@ +import {app} from "../../scripts/app.js"; +import {api} from "../../scripts/api.js"; +import {ComfyDialog, $el} from "../../scripts/ui.js"; + +const BASE_URL = "https://youml.com"; +//const BASE_URL = "http://localhost:3000"; +const DEFAULT_HOMEPAGE_URL = `${BASE_URL}/?from=comfyui`; +const TOKEN_PAGE_URL = `${BASE_URL}/my-token`; +const API_ENDPOINT = `${BASE_URL}/api`; + +const style = ` + .youml-share-dialog { + overflow-y: auto; + } + .youml-share-dialog .dialog-header { + text-align: center; + color: white; + margin: 0 0 10px 0; + } + .youml-share-dialog .dialog-section { + margin-bottom: 0; + padding: 0; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + display: flex; + flex-direction: column; + justify-content: center; + } + .youml-share-dialog input, .youml-share-dialog textarea { + display: block; + min-width: 500px; + width: 100%; + padding: 10px; + margin: 10px 0; + border-radius: 4px; + border: 1px solid #ddd; + box-sizing: border-box; + } + .youml-share-dialog textarea { + color: var(--input-text); + background-color: var(--comfy-input-bg); + } + .youml-share-dialog .workflow-description { + min-height: 75px; + } + .youml-share-dialog label { + color: #f8f8f8; + display: block; + margin: 5px 0 0 0; + font-weight: bold; + text-decoration: none; + } + .youml-share-dialog .action-button { + padding: 10px 80px; + margin: 10px 5px; + border-radius: 4px; + border: none; + cursor: pointer; + } + .youml-share-dialog .share-button { + color: #fff; + background-color: #007bff; + } + .youml-share-dialog .close-button { + background-color: none; + } + .youml-share-dialog .action-button-panel { + text-align: right; + display: flex; + justify-content: space-between; + } + .youml-share-dialog .status-message { + color: #fd7909; + text-align: center; + padding: 5px; + font-size: 18px; + } + .youml-share-dialog .status-message a { + color: white; + } + .youml-share-dialog .output-panel { + overflow: auto; + max-height: 180px; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); + grid-template-rows: auto; + grid-column-gap: 10px; + grid-row-gap: 10px; + margin-bottom: 10px; + padding: 10px; + border-radius: 8px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + background-color: var(--bg-color); + } + .youml-share-dialog .output-panel .output-image { + width: 100px; + height: 100px; + objectFit: cover; + borderRadius: 5px; + } + + .youml-share-dialog .output-panel .radio-button { + color:var(--fg-color); + } + .youml-share-dialog .output-panel .radio-text { + color: gray; + display: block; + font-size: 12px; + overflow-x: hidden; + text-overflow: ellipsis; + text-wrap: nowrap; + max-width: 100px; + } + .youml-share-dialog .output-panel .node-id { + color: #FBFBFD; + display: block; + background-color: rgba(0, 0, 0, 0.5); + font-size: 12px; + overflow-x: hidden; + padding: 2px 3px; + text-overflow: ellipsis; + text-wrap: nowrap; + max-width: 100px; + position: absolute; + top: 3px; + left: 3px; + border-radius: 3px; + } + .youml-share-dialog .output-panel .output-label { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + margin-bottom: 10px; + cursor: pointer; + position: relative; + border: 5px solid transparent; + } + .youml-share-dialog .output-panel .output-label:hover { + border: 5px solid #007bff; + } + .youml-share-dialog .output-panel .output-label.checked { + border: 5px solid #007bff; + } + .youml-share-dialog .missing-output-message{ + color: #fd7909; + font-size: 16px; + margin-bottom:10px + } + .youml-share-dialog .select-output-message{ + color: white; + margin-bottom:5px + } +`; + +export class YouMLShareDialog extends ComfyDialog { + static instance = null; + + constructor() { + super(); + $el("style", { + textContent: style, + parent: document.head, + }); + this.element = $el( + "div.comfy-modal.youml-share-dialog", + { + parent: document.body, + }, + [$el("div.comfy-modal-content", {}, [...this.createLayout()])] + ); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.uploadedImages = []; + this.selectedFile = null; + } + + async loadToken() { + let key = "" + try { + const response = await api.fetchApi(`/manager/youml/settings`) + const settings = await response.json() + return settings.token + } catch (error) { + } + return key || ""; + } + + async saveToken(value) { + await api.fetchApi(`/manager/youml/settings`, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({ + token: value + }) + }); + } + + createLayout() { + // Header Section + const headerSection = $el("h3.dialog-header", { + textContent: "Share your workflow to YouML.com", + size: 3, + }); + + // Workflow Info Section + this.nameInput = $el("input", { + type: "text", + placeholder: "Name (required)", + }); + this.descriptionInput = $el("textarea.workflow-description", { + placeholder: "Description (optional, markdown supported)", + }); + const workflowMetadata = $el("div.dialog-section", {}, [ + $el("label", {}, ["Workflow info"]), + this.nameInput, + this.descriptionInput, + ]); + + // Outputs Section + this.outputsSection = $el("div.dialog-section", { + id: "selectOutputs", + }, []); + + const outputUploadSection = $el("div.dialog-section", {}, [ + $el("label", {}, ["Thumbnail"]), + this.outputsSection, + ]); + + // API Token Section + this.apiTokenInput = $el("input", { + type: "password", + placeholder: "Copy & paste your API token", + }); + const getAPITokenButton = $el("button", { + href: DEFAULT_HOMEPAGE_URL, + target: "_blank", + onclick: () => window.open(TOKEN_PAGE_URL, "_blank"), + }, ["Get your API Token"]) + + const apiTokenSection = $el("div.dialog-section", {}, [ + $el("label", {}, ["YouML API Token"]), + this.apiTokenInput, + getAPITokenButton, + ]); + + // Message Section + this.message = $el("div.status-message", {}, []); + + // Share and Close Buttons + this.shareButton = $el("button.action-button.share-button", { + type: "submit", + textContent: "Share", + onclick: () => { + this.handleShareButtonClick(); + }, + }); + + const buttonsSection = $el( + "div.action-button-panel", + {}, + [ + $el("button.action-button.close-button", { + type: "button", + textContent: "Close", + onclick: () => { + this.close(); + }, + }), + this.shareButton, + ] + ); + + // Composing the full layout + const layout = [ + headerSection, + workflowMetadata, + outputUploadSection, + apiTokenSection, + this.message, + buttonsSection, + ]; + + return layout; + } + + async fetchYoumlApi(path, options, statusText) { + if (statusText) { + this.message.textContent = statusText; + } + + const fullPath = new URL(API_ENDPOINT + path) + + const fetchOptions = Object.assign({}, options) + + fetchOptions.headers = { + ...fetchOptions.headers, + "Authorization": `Bearer ${this.apiTokenInput.value}`, + "User-Agent": "ComfyUI-Manager-Youml/1.0.0", + } + + const response = await fetch(fullPath, fetchOptions); + + if (!response.ok) { + throw new Error(response.statusText + " " + (await response.text())); + } + + if (statusText) { + this.message.textContent = ""; + } + const data = await response.json(); + return { + ok: response.ok, + statusText: response.statusText, + status: response.status, + data, + }; + } + + async uploadThumbnail(uploadFile, recipeId) { + const form = new FormData(); + form.append("file", uploadFile, uploadFile.name); + try { + const res = await this.fetchYoumlApi( + `/v1/comfy/recipes/${recipeId}/thumbnail`, + { + method: "POST", + body: form, + }, + "Uploading thumbnail..." + ); + + } catch (e) { + if (e?.response?.status === 413) { + throw new Error("File size is too large (max 20MB)"); + } else { + throw new Error("Error uploading thumbnail: " + e.message); + } + } + } + + async handleShareButtonClick() { + this.message.textContent = ""; + await this.saveToken(this.apiTokenInput.value); + try { + this.shareButton.disabled = true; + this.shareButton.textContent = "Sharing..."; + await this.share(); + } catch (e) { + alert(e.message); + } finally { + this.shareButton.disabled = false; + this.shareButton.textContent = "Share"; + } + } + + async share() { + const prompt = await app.graphToPrompt(); + const workflowJSON = prompt["workflow"]; + const workflowAPIJSON = prompt["output"]; + const form_values = { + name: this.nameInput.value, + description: this.descriptionInput.value, + }; + + if (!this.apiTokenInput.value) { + throw new Error("API token is required"); + } + + if (!this.selectedFile) { + throw new Error("Thumbnail is required"); + } + + if (!form_values.name) { + throw new Error("Title is required"); + } + + + try { + let snapshotData = null; + try { + const snapshot = await api.fetchApi(`/snapshot/get_current`) + snapshotData = await snapshot.json() + } catch (e) { + console.error("Failed to get snapshot", e) + } + + const request = { + name: this.nameInput.value, + description: this.descriptionInput.value, + workflowUiJson: JSON.stringify(workflowJSON), + workflowApiJson: JSON.stringify(workflowAPIJSON), + } + + if (snapshotData) { + request.snapshotJson = JSON.stringify(snapshotData) + } + + const response = await this.fetchYoumlApi( + "/v1/comfy/recipes", + { + method: "POST", + headers: {"Content-Type": "application/json"}, + body: JSON.stringify(request), + }, + "Uploading workflow..." + ); + + if (response.ok) { + const {id, recipePageUrl, editorPageUrl} = response.data; + if (id) { + let messagePrefix = "Workflow has been shared." + if (this.selectedFile) { + try { + await this.uploadThumbnail(this.selectedFile, id); + } catch (e) { + console.error("Thumbnail upload failed: ", e); + messagePrefix = "Workflow has been shared, but thumbnail upload failed. You can create a thumbnail on YouML later." + } + } + this.message.innerHTML = `${messagePrefix} To turn your workflow into an interactive app, ` + + `visit it on YouML`; + + this.uploadedImages = []; + this.nameInput.value = ""; + this.descriptionInput.value = ""; + this.radioButtons.forEach((ele) => { + ele.checked = false; + ele.parentElement.classList.remove("checked"); + }); + this.selectedOutputIndex = 0; + this.selectedNodeId = null; + this.selectedFile = null; + } + } + } catch (e) { + throw new Error("Error sharing workflow: " + e.message); + } + } + + async fetchImageBlob(url) { + const response = await fetch(url); + const blob = await response.blob(); + return blob; + } + + async show(potentialOutputs, potentialOutputNodes) { + const potentialOutputsToOrder = {}; + potentialOutputNodes.forEach((node, index) => { + if (node.id in potentialOutputsToOrder) { + potentialOutputsToOrder[node.id][1].push(potentialOutputs[index]); + } else { + potentialOutputsToOrder[node.id] = [node, [potentialOutputs[index]]]; + } + }) + const sortedPotentialOutputsToOrder = Object.fromEntries( + Object.entries(potentialOutputsToOrder).sort((a, b) => a[0].id - b[0].id) + ); + const sortedPotentialOutputs = [] + const sortedPotentiaOutputNodes = [] + for (const [key, value] of Object.entries(sortedPotentialOutputsToOrder)) { + sortedPotentiaOutputNodes.push(value[0]); + sortedPotentialOutputs.push(...value[1]); + } + potentialOutputNodes = sortedPotentiaOutputNodes; + potentialOutputs = sortedPotentialOutputs; + + + // If `selectedNodeId` is provided, we will select the corresponding radio + // button for the node. In addition, we move the selected radio button to + // the top of the list. + if (this.selectedNodeId) { + const index = potentialOutputNodes.findIndex(node => node.id === this.selectedNodeId); + if (index >= 0) { + this.selectedOutputIndex = index; + } + } + + this.radioButtons = []; + const newRadioButtons = $el("div.output-panel", + { + id: "selectOutput-Options", + }, + potentialOutputs.map((output, index) => { + const {node_id: nodeId} = output; + const radioButton = $el("input.radio-button", { + type: "radio", + name: "selectOutputImages", + value: index, + required: index === 0 + }, []) + let radioButtonImage; + let filename; + if (output.type === "image" || output.type === "temp") { + radioButtonImage = $el("img.output-image", { + src: `/view?filename=${output.image.filename}&subfolder=${output.image.subfolder}&type=${output.image.type}`, + }, []); + filename = output.image.filename + } else if (output.type === "output") { + radioButtonImage = $el("img.output-image", { + src: output.output.value, + }, []); + filename = output.output.filename + } else { + radioButtonImage = $el("img.output-image", { + src: "", + }, []); + } + const radioButtonText = $el("span.radio-text", {}, [output.title]) + const nodeIdChip = $el("span.node-id", {}, [`Node: ${nodeId}`]) + radioButton.checked = this.selectedOutputIndex === index; + + radioButton.onchange = async () => { + this.selectedOutputIndex = parseInt(radioButton.value); + + // Remove the "checked" class from all radio buttons + this.radioButtons.forEach((ele) => { + ele.parentElement.classList.remove("checked"); + }); + radioButton.parentElement.classList.add("checked"); + + this.fetchImageBlob(radioButtonImage.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.selectedFile = file; + }) + }; + + if (radioButton.checked) { + this.fetchImageBlob(radioButtonImage.src).then((blob) => { + const file = new File([blob], filename, { + type: blob.type, + }); + this.selectedFile = file; + }) + } + + this.radioButtons.push(radioButton); + + return $el(`label.output-label${radioButton.checked ? '.checked' : ''}`, {}, + [radioButtonImage, radioButtonText, radioButton, nodeIdChip]); + }) + ); + + let header; + if (this.radioButtons.length === 0) { + header = $el("div.missing-output-message", {textContent: "Queue Prompt to see the outputs and select a thumbnail"}, []) + } else { + header = $el("div.select-output-message", {textContent: "Choose one from the outputs (scroll to see all)"}, []) + } + + this.outputsSection.innerHTML = ""; + this.outputsSection.appendChild(header); + if (this.radioButtons.length > 0) { + this.outputsSection.appendChild(newRadioButtons); + } + + this.message.innerHTML = ""; + this.message.textContent = ""; + + const token = await this.loadToken(); + this.apiTokenInput.value = token; + this.uploadedImages = []; + + this.element.style.display = "block"; + } +} diff --git a/custom_nodes/ComfyUI-Manager/js/common.js b/custom_nodes/ComfyUI-Manager/js/common.js new file mode 100644 index 000000000..49a47d6f5 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/common.js @@ -0,0 +1,240 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js"; +import { $el, ComfyDialog } from "../../scripts/ui.js"; + +export function show_message(msg) { + app.ui.dialog.show(msg); + app.ui.dialog.element.style.zIndex = 10010; +} + +export async function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export function rebootAPI() { + if (confirm("Are you sure you'd like to reboot the server?")) { + try { + api.fetchApi("/manager/reboot"); + } + catch(exception) { + + } + return true; + } + + return false; +} + +export var manager_instance = null; + +export function setManagerInstance(obj) { + manager_instance = obj; +} + +export function showToast(message, duration = 3000) { + const toast = $el("div.comfy-toast", {textContent: message}); + document.body.appendChild(toast); + setTimeout(() => { + toast.classList.add("comfy-toast-fadeout"); + setTimeout(() => toast.remove(), 500); + }, duration); +} + +function isValidURL(url) { + if(url.includes('&')) + return false; + + const http_pattern = /^(https?|ftp):\/\/[^\s$?#]+$/; + const ssh_pattern = /^(.+@|ssh:\/\/).+:.+$/; + return http_pattern.test(url) || ssh_pattern.test(url); +} + +export async function install_pip(packages) { + if(packages.includes('&')) + app.ui.dialog.show(`Invalid PIP package enumeration: '${packages}'`); + + const res = await api.fetchApi("/customnode/install/pip", { + method: "POST", + body: packages, + }); + + if(res.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return; + } + + if(res.status == 200) { + show_message(`PIP package installation is processed.
To apply the pip packages, please click the button in ComfyUI.`); + + const rebootButton = document.getElementById('cm-reboot-button3'); + const self = this; + + rebootButton.addEventListener("click", rebootAPI); + } + else { + show_message(`Failed to install '${packages}'
See terminal log.`); + } +} + +export async function install_via_git_url(url, manager_dialog) { + if(!url) { + return; + } + + if(!isValidURL(url)) { + show_message(`Invalid Git url '${url}'`); + return; + } + + show_message(`Wait...

Installing '${url}'`); + + const res = await api.fetchApi("/customnode/install/git_url", { + method: "POST", + body: url, + }); + + if(res.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return; + } + + if(res.status == 200) { + show_message(`'${url}' is installed
To apply the installed custom node, please ComfyUI.`); + + const rebootButton = document.getElementById('cm-reboot-button4'); + const self = this; + + rebootButton.addEventListener("click", + function() { + if(rebootAPI()) { + manager_dialog.close(); + } + }); + } + else { + show_message(`Failed to install '${url}'
See terminal log.`); + } +} + +export async function free_models(free_execution_cache) { + try { + let mode = ""; + if(free_execution_cache) { + mode = '{"unload_models": true, "free_memory": true}'; + } + else { + mode = '{"unload_models": true}'; + } + + let res = await api.fetchApi(`/free`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: mode + }); + + if (res.status == 200) { + if(free_execution_cache) { + showToast("'Models' and 'Execution Cache' have been cleared.", 3000); + } + else { + showToast("Models' have been unloaded.", 3000); + } + } else { + showToast('Unloading of models failed. Installed ComfyUI may be an outdated version.', 5000); + } + } catch (error) { + showToast('An error occurred while trying to unload models.', 5000); + } +} + +export function md5(inputString) { + const hc = '0123456789abcdef'; + const rh = n => {let j,s='';for(j=0;j<=3;j++) s+=hc.charAt((n>>(j*8+4))&0x0F)+hc.charAt((n>>(j*8))&0x0F);return s;} + const ad = (x,y) => {let l=(x&0xFFFF)+(y&0xFFFF);let m=(x>>16)+(y>>16)+(l>>16);return (m<<16)|(l&0xFFFF);} + const rl = (n,c) => (n<>>(32-c)); + const cm = (q,a,b,x,s,t) => ad(rl(ad(ad(a,q),ad(x,t)),s),b); + const ff = (a,b,c,d,x,s,t) => cm((b&c)|((~b)&d),a,b,x,s,t); + const gg = (a,b,c,d,x,s,t) => cm((b&d)|(c&(~d)),a,b,x,s,t); + const hh = (a,b,c,d,x,s,t) => cm(b^c^d,a,b,x,s,t); + const ii = (a,b,c,d,x,s,t) => cm(c^(b|(~d)),a,b,x,s,t); + const sb = x => { + let i;const nblk=((x.length+8)>>6)+1;const blks=[];for(i=0;i>2]|=x.charCodeAt(i)<<((i%4)*8);} + blks[i>>2]|=0x80<<((i%4)*8);blks[nblk*16-2]=x.length*8;return blks; + } + let i,x=sb(inputString),a=1732584193,b=-271733879,c=-1732584194,d=271733878,olda,oldb,oldc,oldd; + for(i=0;i { + err = e; + }); + + if (!res) { + return { + status: 400, + error: new Error("Unknown Error") + } + } + + const { status, statusText } = res; + if (err) { + return { + status, + error: err + } + } + + if (status !== 200) { + return { + status, + error: new Error(statusText || "Unknown Error") + } + } + + const data = await res.json(); + if (!data) { + return { + status, + error: new Error(`Failed to load data: ${route}`) + } + } + return { + status, + data + } +} + +export const icons = { + search: '', + extensions: '', + conflicts: '', + passed: '', + download: '' +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/js/components-manager.js b/custom_nodes/ComfyUI-Manager/js/components-manager.js new file mode 100644 index 000000000..248a74d25 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/components-manager.js @@ -0,0 +1,809 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js" +import { sleep, show_message } from "./common.js"; +import { GroupNodeConfig, GroupNodeHandler } from "../../extensions/core/groupNode.js"; +import { ComfyDialog, $el } from "../../scripts/ui.js"; + +let pack_map = {}; +let rpack_map = {}; + +export function getPureName(node) { + // group nodes/ + let category = null; + if(node.category) { + category = node.category.substring(12); + } + else { + category = node.constructor.category?.substring(12); + } + if(category) { + let purename = node.comfyClass.substring(category.length+1); + return purename; + } + else if(node.comfyClass.startsWith('workflow/')) { + return node.comfyClass.substring(9); + } + else { + return node.comfyClass; + } +} + +function isValidVersionString(version) { + const versionPattern = /^(\d+)\.(\d+)(\.(\d+))?$/; + + const match = version.match(versionPattern); + + return match !== null && + parseInt(match[1], 10) >= 0 && + parseInt(match[2], 10) >= 0 && + (!match[3] || parseInt(match[4], 10) >= 0); +} + +function register_pack_map(name, data) { + if(data.packname) { + pack_map[data.packname] = name; + rpack_map[name] = data; + } + else { + rpack_map[name] = data; + } +} + +function storeGroupNode(name, data, register=true) { + let extra = app.graph.extra; + if (!extra) app.graph.extra = extra = {}; + let groupNodes = extra.groupNodes; + if (!groupNodes) extra.groupNodes = groupNodes = {}; + groupNodes[name] = data; + + if(register) { + register_pack_map(name, data); + } +} + +export async function load_components() { + let data = await api.fetchApi('/manager/component/loads', {method: "POST"}); + let components = await data.json(); + + let start_time = Date.now(); + let failed = []; + let failed2 = []; + + for(let name in components) { + if(app.graph.extra?.groupNodes?.[name]) { + if(data) { + let data = components[name]; + + let category = data.packname; + if(data.category) { + category += "/" + data.category; + } + if(category == '') { + category = 'components'; + } + + const config = new GroupNodeConfig(name, data); + await config.registerType(category); + + register_pack_map(name, data); + continue; + } + } + + let nodeData = components[name]; + + storeGroupNode(name, nodeData); + + const config = new GroupNodeConfig(name, nodeData); + + while(true) { + try { + let category = nodeData.packname; + if(nodeData.category) { + category += "/" + nodeData.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + register_pack_map(name, nodeData); + break; + } + catch { + let elapsed_time = Date.now() - start_time; + if (elapsed_time > 5000) { + failed.push(name); + break; + } else { + await sleep(100); + } + } + } + } + + // fallback1 + for(let i in failed) { + let name = failed[i]; + + if(app.graph.extra?.groupNodes?.[name]) { + continue; + } + + let nodeData = components[name]; + + storeGroupNode(name, nodeData); + + const config = new GroupNodeConfig(name, nodeData); + while(true) { + try { + let category = nodeData.packname; + if(nodeData.workflow.category) { + category += "/" + nodeData.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + register_pack_map(name, nodeData); + break; + } + catch { + let elapsed_time = Date.now() - start_time; + if (elapsed_time > 10000) { + failed2.push(name); + break; + } else { + await sleep(100); + } + } + } + } + + // fallback2 + for(let name in failed2) { + let name = failed2[i]; + + let nodeData = components[name]; + + storeGroupNode(name, nodeData); + + const config = new GroupNodeConfig(name, nodeData); + while(true) { + try { + let category = nodeData.workflow.packname; + if(nodeData.workflow.category) { + category += "/" + nodeData.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + register_pack_map(name, nodeData); + break; + } + catch { + let elapsed_time = Date.now() - start_time; + if (elapsed_time > 30000) { + failed.push(name); + break; + } else { + await sleep(100); + } + } + } + } +} + +async function save_as_component(node, version, author, prefix, nodename, packname, category) { + let component_name = `${prefix}::${nodename}`; + + let subgraph = app.graph.extra?.groupNodes?.[component_name]; + if(!subgraph) { + subgraph = app.graph.extra?.groupNodes?.[getPureName(node)]; + } + + subgraph.version = version; + subgraph.author = author; + subgraph.datetime = Date.now(); + subgraph.packname = packname; + subgraph.category = category; + + let body = + { + name: component_name, + workflow: subgraph + }; + + pack_map[packname] = component_name; + rpack_map[component_name] = subgraph; + + const res = await api.fetchApi('/manager/component/save', { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(body), + }); + + if(res.status == 200) { + storeGroupNode(component_name, subgraph); + const config = new GroupNodeConfig(component_name, subgraph); + + let category = body.workflow.packname; + if(body.workflow.category) { + category += "/" + body.workflow.category; + } + if(category == '') { + category = 'components'; + } + + await config.registerType(category); + + let path = await res.text(); + show_message(`Component '${component_name}' is saved into:\n${path}`); + } + else + show_message(`Failed to save component.`); +} + +async function import_component(component_name, component, mode) { + if(mode) { + let body = + { + name: component_name, + workflow: component + }; + + const res = await api.fetchApi('/manager/component/save', { + method: "POST", + headers: { "Content-Type": "application/json", }, + body: JSON.stringify(body) + }); + } + + let category = component.packname; + if(component.category) { + category += "/" + component.category; + } + if(category == '') { + category = 'components'; + } + + storeGroupNode(component_name, component); + const config = new GroupNodeConfig(component_name, component); + await config.registerType(category); +} + +function restore_to_loaded_component(component_name) { + if(rpack_map[component_name]) { + let component = rpack_map[component_name]; + storeGroupNode(component_name, component, false); + const config = new GroupNodeConfig(component_name, component); + config.registerType(component.category); + } +} + +// Using a timestamp prevents duplicate pastes and ensures the prevention of re-deletion of litegrapheditor_clipboard. +let last_paste_timestamp = null; + +function versionCompare(v1, v2) { + let ver1; + let ver2; + if(v1 && v1 != '') { + ver1 = v1.split('.'); + ver1[0] = parseInt(ver1[0]); + ver1[1] = parseInt(ver1[1]); + if(ver1.length == 2) + ver1.push(0); + else + ver1[2] = parseInt(ver2[2]); + } + else { + ver1 = [0,0,0]; + } + + if(v2 && v2 != '') { + ver2 = v2.split('.'); + ver2[0] = parseInt(ver2[0]); + ver2[1] = parseInt(ver2[1]); + if(ver2.length == 2) + ver2.push(0); + else + ver2[2] = parseInt(ver2[2]); + } + else { + ver2 = [0,0,0]; + } + + if(ver1[0] > ver2[0]) + return -1; + else if(ver1[0] < ver2[0]) + return 1; + + if(ver1[1] > ver2[1]) + return -1; + else if(ver1[1] < ver2[1]) + return 1; + + if(ver1[2] > ver2[2]) + return -1; + else if(ver1[2] < ver2[2]) + return 1; + + return 0; +} + +function checkVersion(name, component) { + let msg = ''; + if(rpack_map[name]) { + let old_version = rpack_map[name].version; + if(!old_version || old_version == '') { + msg = ` '${name}' Upgrade (V0.0 -> V${component.version})`; + } + else { + let c = versionCompare(old_version, component.version); + if(c < 0) { + msg = ` '${name}' Downgrade (V${old_version} -> V${component.version})`; + } + else if(c > 0) { + msg = ` '${name}' Upgrade (V${old_version} -> V${component.version})`; + } + else { + msg = ` '${name}' Same version (V${component.version})`; + } + } + } + else { + msg = `'${name}' NEW (V${component.version})`; + } + + return msg; +} + +function handle_import_components(components) { + let msg = 'Components:\n'; + let cnt = 0; + for(let name in components) { + let component = components[name]; + let v = checkVersion(name, component); + + if(cnt < 10) { + msg += v + '\n'; + } + else if (cnt == 10) { + msg += '...\n'; + } + else { + // do nothing + } + + cnt++; + } + + let last_name = null; + msg += '\nWill you load components?\n'; + if(confirm(msg)) { + let mode = confirm('\nWill you save components?\n(cancel=load without save)'); + + for(let name in components) { + let component = components[name]; + import_component(name, component, mode); + last_name = name; + } + + if(mode) { + show_message('Components are saved.'); + } + else { + show_message('Components are loaded.'); + } + } + + if(cnt == 1 && last_name) { + const node = LiteGraph.createNode(`workflow/${last_name}`); + node.pos = [app.canvas.graph_mouse[0], app.canvas.graph_mouse[1]]; + app.canvas.graph.add(node, false); + } +} + +function handlePaste(e) { + let data = (e.clipboardData || window.clipboardData); + const items = data.items; + for(const item of items) { + if(item.kind == 'string' && item.type == 'text/plain') { + data = data.getData("text/plain"); + try { + let json_data = JSON.parse(data); + if(json_data.kind == 'ComfyUI Components' && last_paste_timestamp != json_data.timestamp) { + last_paste_timestamp = json_data.timestamp; + handle_import_components(json_data.components); + + // disable paste node + localStorage.removeItem("litegrapheditor_clipboard", null); + } + else { + console.log('This components are already pasted: ignored'); + } + } + catch { + // nothing to do + } + } + } +} + +document.addEventListener("paste", handlePaste); + + +export class ComponentBuilderDialog extends ComfyDialog { + constructor() { + super(); + } + + clear() { + while (this.element.children.length) { + this.element.removeChild(this.element.children[0]); + } + } + + show() { + this.invalidateControl(); + + this.element.style.display = "block"; + this.element.style.zIndex = 10001; + this.element.style.width = "500px"; + this.element.style.height = "480px"; + } + + invalidateControl() { + this.clear(); + + let self = this; + + const close_button = $el("button", { id: "cm-close-button", type: "button", textContent: "Close", onclick: () => self.close() }); + this.save_button = $el("button", + { id: "cm-save-button", type: "button", textContent: "Save", onclick: () => + { + save_as_component(self.target_node, self.version_string.value.trim(), self.author.value.trim(), self.node_prefix.value.trim(), + self.getNodeName(), self.getPackName(), self.category.value.trim()); + } + }); + + let default_nodename = getPureName(this.target_node).trim(); + + let groupNode = app.graph.extra.groupNodes[default_nodename]; + let default_packname = groupNode.packname; + if(!default_packname) { + default_packname = ''; + } + + let default_category = groupNode.category; + if(!default_category) { + default_category = ''; + } + + this.default_ver = groupNode.version; + if(!this.default_ver) { + this.default_ver = '0.0'; + } + + let default_author = groupNode.author; + if(!default_author) { + default_author = ''; + } + + let delimiterIndex = default_nodename.indexOf('::'); + let default_prefix = ""; + if(delimiterIndex != -1) { + default_prefix = default_nodename.substring(0, delimiterIndex); + default_nodename = default_nodename.substring(delimiterIndex + 2); + } + + if(!default_prefix) { + this.save_button.disabled = true; + } + + this.pack_list = this.createPackListCombo(); + + let version_string = this.createLabeledInput('input version (e.g. 1.0)', '*Version : ', this.default_ver); + this.version_string = version_string[1]; + this.version_string.disabled = true; + + let author = this.createLabeledInput('input author (e.g. Dr.Lt.Data)', 'Author : ', default_author); + this.author = author[1]; + + let node_prefix = this.createLabeledInput('input node prefix (e.g. mypack)', '*Prefix : ', default_prefix); + this.node_prefix = node_prefix[1]; + + let manual_nodename = this.createLabeledInput('input node name (e.g. MAKE_BASIC_PIPE)', 'Nodename : ', default_nodename); + this.manual_nodename = manual_nodename[1]; + + let manual_packname = this.createLabeledInput('input pack name (e.g. mypack)', 'Packname : ', default_packname); + this.manual_packname = manual_packname[1]; + + let category = this.createLabeledInput('input category (e.g. util/pipe)', 'Category : ', default_category); + this.category = category[1]; + + this.node_label = this.createNodeLabel(); + + let author_mode = this.createAuthorModeCheck(); + this.author_mode = author_mode[0]; + + const content = + $el("div.comfy-modal-content", + [ + $el("tr.cm-title", {}, [ + $el("font", {size:6, color:"white"}, [`ComfyUI-Manager: Component Builder`])] + ), + $el("br", {}, []), + $el("div.cm-menu-container", + [ + author_mode[0], + author_mode[1], + category[0], + author[0], + node_prefix[0], + manual_nodename[0], + manual_packname[0], + version_string[0], + this.pack_list, + $el("br", {}, []), + this.node_label + ]), + + $el("br", {}, []), + this.save_button, + close_button, + ] + ); + + content.style.width = '100%'; + content.style.height = '100%'; + + this.element = $el("div.comfy-modal", { id:'cm-manager-dialog', parent: document.body }, [ content ]); + } + + validateInput() { + let msg = ""; + + if(!isValidVersionString(this.version_string.value)) { + msg += 'Invalid version string: '+event.value+"\n"; + } + + if(this.node_prefix.value.trim() == '') { + msg += 'Node prefix cannot be empty\n'; + } + + if(this.manual_nodename.value.trim() == '') { + msg += 'Node name cannot be empty\n'; + } + + if(msg != '') { +// alert(msg); + } + + this.save_button.disabled = msg != ""; + } + + getPackName() { + if(this.pack_list.selectedIndex == 0) { + return this.manual_packname.value.trim(); + } + + return this.pack_list.value.trim(); + } + + getNodeName() { + if(this.manual_nodename.value.trim() != '') { + return this.manual_nodename.value.trim(); + } + + return getPureName(this.target_node); + } + + createAuthorModeCheck() { + let check = $el("input",{type:'checkbox', id:"author-mode"},[]) + const check_label = $el("label",{for:"author-mode"},["Enable author mode"]); + check_label.style.color = "var(--fg-color)"; + check_label.style.cursor = "pointer"; + check.checked = false; + + let self = this; + check.onchange = () => { + self.version_string.disabled = !check.checked; + + if(!check.checked) { + self.version_string.value = self.default_ver; + } + else { + alert('If you are not the author, it is not recommended to change the version, as it may cause component update issues.'); + } + }; + + return [check, check_label]; + } + + createNodeLabel() { + let label = $el('p'); + label.className = 'cb-node-label'; + if(this.target_node.comfyClass.includes('::')) + label.textContent = getPureName(this.target_node); + else + label.textContent = " _::" + getPureName(this.target_node); + return label; + } + + createLabeledInput(placeholder, label, value) { + let textbox = $el('input.cb-widget-input', {type:'text', placeholder:placeholder, value:value}, []); + + let self = this; + textbox.onchange = () => { + this.validateInput.call(self); + this.node_label.textContent = this.node_prefix.value + "::" + this.manual_nodename.value; + } + let row = $el('span.cb-widget', {}, [ $el('span.cb-widget-input-label', label), textbox]); + + return [row, textbox]; + } + + createPackListCombo() { + let combo = document.createElement("select"); + combo.className = "cb-widget"; + let default_packname_option = { value: '##manual', text: 'Packname: Manual' }; + + combo.appendChild($el('option', default_packname_option, [])); + for(let name in pack_map) { + combo.appendChild($el('option', { value: name, text: 'Packname: '+ name }, [])); + } + + let self = this; + combo.onchange = function () { + if(combo.selectedIndex == 0) { + self.manual_packname.disabled = false; + } + else { + self.manual_packname.disabled = true; + } + }; + + return combo; + } +} + +let orig_handleFile = app.handleFile; + +function handleFile(file) { + if (file.name?.endsWith(".json") || file.name?.endsWith(".pack")) { + const reader = new FileReader(); + reader.onload = async () => { + let is_component = false; + const jsonContent = JSON.parse(reader.result); + for(let name in jsonContent) { + let cand = jsonContent[name]; + is_component = cand.datetime && cand.version; + break; + } + + if(is_component) { + handle_import_components(jsonContent); + } + else { + orig_handleFile.call(app, file); + } + }; + reader.readAsText(file); + + return; + } + + orig_handleFile.call(app, file); +} + +app.handleFile = handleFile; + +let current_component_policy = 'workflow'; +try { + api.fetchApi('/manager/component/policy') + .then(response => response.text()) + .then(data => { current_component_policy = data; }); +} +catch {} + +function getChangedVersion(groupNodes) { + if(!Object.keys(pack_map).length || !groupNodes) + return null; + + let res = {}; + for(let component_name in groupNodes) { + let data = groupNodes[component_name]; + + if(rpack_map[component_name]) { + let v = versionCompare(data.version, rpack_map[component_name].version); + res[component_name] = v; + } + } + + return res; +} + +const loadGraphData = app.loadGraphData; +app.loadGraphData = async function () { + if(arguments.length == 0) + return await loadGraphData.apply(this, arguments); + + let graphData = arguments[0]; + let groupNodes = graphData.extra?.groupNodes; + let res = getChangedVersion(groupNodes); + + if(res) { + let target_components = null; + switch(current_component_policy) { + case 'higher': + target_components = Object.keys(res).filter(key => res[key] == 1); + break; + + case 'mine': + target_components = Object.keys(res); + break; + + default: + // do nothing + } + + if(target_components) { + for(let i in target_components) { + let component_name = target_components[i]; + let component = rpack_map[component_name]; + if(component && graphData.extra?.groupNodes) { + graphData.extra.groupNodes[component_name] = component; + } + } + } + } + else { + console.log('Empty components: policy ignored'); + } + + arguments[0] = graphData; + return await loadGraphData.apply(this, arguments); +}; + +export function set_component_policy(v) { + current_component_policy = v; +} + +let graphToPrompt = app.graphToPrompt; +app.graphToPrompt = async function () { + let p = await graphToPrompt.call(app); + try { + let groupNodes = p.workflow.extra?.groupNodes; + if(groupNodes) { + p.workflow.extra = { ... p.workflow.extra}; + + // get used group nodes + let used_group_nodes = new Set(); + for(let node of p.workflow.nodes) { + if(node.type.startsWith('workflow/')) { + used_group_nodes.add(node.type.substring(9)); + } + } + + // remove unused group nodes + let new_groupNodes = {}; + for (let key in p.workflow.extra.groupNodes) { + if (used_group_nodes.has(key)) { + new_groupNodes[key] = p.workflow.extra.groupNodes[key]; + } + } + p.workflow.extra.groupNodes = new_groupNodes; + } + } + catch(e) { + console.log(`Failed to filtering group nodes: ${e}`); + } + + return p; +} diff --git a/custom_nodes/ComfyUI-Manager/js/custom-nodes-manager.js b/custom_nodes/ComfyUI-Manager/js/custom-nodes-manager.js new file mode 100644 index 000000000..eccdd6839 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/custom-nodes-manager.js @@ -0,0 +1,1381 @@ +import { app } from "../../scripts/app.js"; +import { $el } from "../../scripts/ui.js"; +import { + manager_instance, rebootAPI, install_via_git_url, + fetchData, md5, icons +} from "./common.js"; + +// https://cenfun.github.io/turbogrid/api.html +import TG from "./turbogrid.esm.js"; + +const pageCss = ` +.cn-manager { + --grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + z-index: 10001; + width: 80%; + height: 80%; + display: flex; + flex-direction: column; + gap: 10px; + color: var(--fg-color); + font-family: arial, sans-serif; +} + +.cn-manager .cn-flex-auto { + flex: auto; +} + +.cn-manager button { + font-size: 16px; + color: var(--input-text); + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + margin: 0; + padding: 4px 8px; + min-width: 100px; +} + +.cn-manager button:disabled, +.cn-manager input:disabled, +.cn-manager select:disabled { + color: gray; +} + +.cn-manager button:disabled { + background-color: var(--comfy-input-bg); +} + +.cn-manager .cn-manager-restart { + display: none; + background-color: #500000; + color: white; +} + +.cn-manager-header { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + padding: 0 5px; +} + +.cn-manager-header label { + display: flex; + gap: 5px; + align-items: center; +} + +.cn-manager-filter { + height: 28px; + line-height: 28px; +} + +.cn-manager-keywords { + height: 28px; + line-height: 28px; + padding: 0 5px 0 26px; + background-size: 16px; + background-position: 5px center; + background-repeat: no-repeat; + background-image: url("data:image/svg+xml;charset=utf8,${encodeURIComponent(icons.search.replace("currentColor", "#888"))}"); +} + +.cn-manager-status { + padding-left: 10px; +} + +.cn-manager-grid { + flex: auto; + border: 1px solid var(--border-color); + overflow: hidden; +} + +.cn-manager-selection { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cn-manager-message { + +} + +.cn-manager-footer { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cn-manager-grid .tg-turbogrid { + font-family: var(--grid-font); + font-size: 15px; + background: var(--bg-color); +} + +.cn-manager-grid .cn-node-name a { + color: skyblue; + text-decoration: none; + word-break: break-word; +} + +.cn-manager-grid .cn-node-desc a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +.cn-manager-grid .tg-cell a:hover { + text-decoration: underline; +} + +.cn-manager-grid .cn-extensions-button, +.cn-manager-grid .cn-conflicts-button { + display: inline-block; + width: 20px; + height: 20px; + color: green; + border: none; + padding: 0; + margin: 0; + background: none; + min-width: 20px; +} + +.cn-manager-grid .cn-conflicts-button { + color: orange; +} + +.cn-manager-grid .cn-extensions-list, +.cn-manager-grid .cn-conflicts-list { + line-height: normal; + text-align: left; + max-height: 80%; + min-height: 200px; + min-width: 300px; + overflow-y: auto; + font-size: 12px; + border-radius: 5px; + padding: 10px; + filter: drop-shadow(2px 5px 5px rgb(0 0 0 / 30%)); + white-space: normal; +} + +.cn-manager-grid .cn-extensions-list { + border-color: var(--bg-color); +} + +.cn-manager-grid .cn-conflicts-list { + background-color: #CCCC55; + color: #AA3333; +} + +.cn-manager-grid .cn-extensions-list h3, +.cn-manager-grid .cn-conflicts-list h3 { + margin: 0; + padding: 5px 0; + color: #000; +} + +.cn-tag-list { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + margin-bottom: 5px; +} + +.cn-tag-list > div { + background-color: var(--border-color); + border-radius: 5px; + padding: 0 5px; +} + +.cn-install-buttons { + display: flex; + flex-direction: column; + gap: 3px; + padding: 3px; + align-items: center; + justify-content: center; + height: 100%; +} + +.cn-selected-buttons { + display: flex; + gap: 5px; + align-items: center; + padding-right: 20px; +} + +.cn-manager .cn-btn-enable { + background-color: blue; + color: white; +} + +.cn-manager .cn-btn-disable { + background-color: MediumSlateBlue; + color: white; +} + +.cn-manager .cn-btn-update { + background-color: blue; + color: white; +} + +.cn-manager .cn-btn-try-update { + background-color: Gray; + color: white; +} + +.cn-manager .cn-btn-try-fix { + background-color: #6495ED; + color: white; +} + +.cn-manager .cn-btn-install { + background-color: black; + color: white; +} + +.cn-manager .cn-btn-try-install { + background-color: Gray; + color: white; +} + +.cn-manager .cn-btn-uninstall { + background-color: red; + color: white; +} + +@keyframes cn-btn-loading-bg { + 0% { + left: 0; + } + 100% { + left: -105px; + } +} + +.cn-manager button.cn-btn-loading { + position: relative; + overflow: hidden; + border-color: rgb(0 119 207 / 80%); + background-color: var(--comfy-input-bg); +} + +.cn-manager button.cn-btn-loading::after { + position: absolute; + top: 0; + left: 0; + content: ""; + width: 500px; + height: 100%; + background-image: repeating-linear-gradient( + -45deg, + rgb(0 119 207 / 30%), + rgb(0 119 207 / 30%) 10px, + transparent 10px, + transparent 15px + ); + animation: cn-btn-loading-bg 2s linear infinite; +} + +.cn-manager-light .cn-node-name a { + color: blue; +} + +.cn-manager-light .cm-warn-note { + background-color: #ccc !important; +} + +.cn-manager-light .cn-btn-install { + background-color: #333; +} + +`; + +const pageHtml = ` +
+ + +
+
+
+
+
+
+
+ +`; + +const ShowMode = { + NORMAL: "Normal", + UPDATE: "Update", + MISSING: "Missing", + ALTERNATIVES: "Alternatives" +}; + +export class CustomNodesManager { + static instance = null; + static ShowMode = ShowMode; + + constructor(app, manager_dialog) { + this.app = app; + this.manager_dialog = manager_dialog; + this.id = "cn-manager"; + + app.registerExtension({ + name: "Comfy.CustomNodesManager", + afterConfigureGraph: (missingNodeTypes) => { + const item = this.getFilterItem(ShowMode.MISSING); + if (item) { + item.hasData = false; + item.hashMap = null; + } + } + }); + + this.filter = ''; + this.keywords = ''; + this.restartMap = {}; + + this.init(); + } + + init() { + + if (!document.querySelector(`style[context="${this.id}"]`)) { + const $style = document.createElement("style"); + $style.setAttribute("context", this.id); + $style.innerHTML = pageCss; + document.head.appendChild($style); + } + + this.element = $el("div", { + parent: document.body, + className: "comfy-modal cn-manager" + }); + this.element.innerHTML = pageHtml; + this.initFilter(); + this.bindEvents(); + this.initGrid(); + } + + initFilter() { + const $filter = this.element.querySelector(".cn-manager-filter"); + const filterList = [{ + label: "All", + value: "", + hasData: true + }, { + label: "Installed", + value: "True", + hasData: true + }, { + label: "Disabled", + value: "Disabled", + hasData: true + }, { + label: "Import Failed", + value: "Fail", + hasData: true + }, { + label: "Not Installed", + value: "False", + hasData: true + }, { + label: "Unknown", + value: "None", + hasData: true + }, { + label: "Update", + value: ShowMode.UPDATE, + hasData: false + }, { + label: "Missing", + value: ShowMode.MISSING, + hasData: false + }, { + label: "Alternatives of A1111", + value: ShowMode.ALTERNATIVES, + hasData: false + }]; + this.filterList = filterList; + $filter.innerHTML = filterList.map(item => { + return `` + }).join(""); + } + + getFilterItem(filter) { + return this.filterList.find(it => it.value === filter) + } + + getInstallButtons(installed, title) { + + const buttons = { + "enable": { + label: "Enable", + mode: "toggle_active" + }, + "disable": { + label: "Disable", + mode: "toggle_active" + }, + + "update": { + label: "Update", + mode: "update" + }, + "try-update": { + label: "Try update", + mode: "update" + }, + + "try-fix": { + label: "Try fix", + mode: "fix" + }, + + "install": { + label: "Install", + mode: "install" + }, + "try-install": { + label: "Try install", + mode: "install" + }, + "uninstall": { + label: "Uninstall", + mode: "uninstall" + } + } + + const installGroups = { + "Disabled": ["enable", "uninstall"], + "Update": ["update", "disable", "uninstall"], + "Fail": ["try-fix", "uninstall"], + "True": ["try-update", "disable", "uninstall"], + "False": ["install"], + 'None': ["try-install"] + } + + if (!manager_instance.update_check_checkbox.checked) { + installGroups.True = installGroups.True.filter(it => it !== "try-update"); + } + + if (title === "ComfyUI-Manager") { + installGroups.True = installGroups.True.filter(it => it !== "disable"); + } + + const list = installGroups[installed]; + if (!list) { + return ""; + } + + return list.map(id => { + const bt = buttons[id]; + return ``; + }).join(""); + } + + getButton(target) { + if(!target) { + return; + } + const mode = target.getAttribute("mode"); + if (!mode) { + return; + } + const group = target.getAttribute("group"); + if (!group) { + return; + } + return { + group, + mode, + target, + label: target.innerText + } + } + + bindEvents() { + const eventsMap = { + ".cn-manager-filter": { + change: (e) => { + + if (this.grid) { + this.grid.selectAll(false); + } + + const value = e.target.value + this.filter = value; + const item = this.getFilterItem(value); + if (item && !item.hasData) { + this.loadData(value); + return; + } + this.updateGrid(); + } + }, + + ".cn-manager-keywords": { + input: (e) => { + const keywords = `${e.target.value}`.trim(); + if (keywords !== this.keywords) { + this.keywords = keywords; + this.updateGrid(); + } + }, + focus: (e) => e.target.select() + }, + + ".cn-manager-selection": { + click: (e) => { + const btn = this.getButton(e.target); + if (btn) { + const nodes = this.selectedMap[btn.group]; + if (nodes) { + this.installNodes(nodes, btn); + } + } + } + }, + + ".cn-manager-close": { + click: (e) => this.close() + }, + + ".cn-manager-restart": { + click: () => { + if(rebootAPI()) { + this.close(); + this.manager_dialog.close(); + } + } + }, + + ".cn-manager-check-update": { + click: (e) => { + e.target.classList.add("cn-btn-loading"); + this.setFilter(ShowMode.UPDATE); + this.loadData(ShowMode.UPDATE); + } + }, + + ".cn-manager-check-missing": { + click: (e) => { + e.target.classList.add("cn-btn-loading"); + this.setFilter(ShowMode.MISSING); + this.loadData(ShowMode.MISSING); + } + }, + + ".cn-manager-install-url": { + click: (e) => { + const url = prompt("Please enter the URL of the Git repository to install", ""); + if (url !== null) { + install_via_git_url(url, this.manager_dialog); + } + } + } + }; + Object.keys(eventsMap).forEach(selector => { + const target = this.element.querySelector(selector); + if (target) { + const events = eventsMap[selector]; + if (events) { + Object.keys(events).forEach(type => { + target.addEventListener(type, events[type]); + }); + } + } + }); + } + + // =========================================================================================== + + initGrid() { + const container = this.element.querySelector(".cn-manager-grid"); + const grid = new TG.Grid(container); + this.grid = grid; + + let prevViewRowsLength = -1; + grid.bind('onUpdated', (e, d) => { + + const viewRows = grid.viewRows; + if (viewRows.length !== prevViewRowsLength) { + prevViewRowsLength = viewRows.length; + this.showStatus(`${prevViewRowsLength.toLocaleString()} custom nodes`); + } + + }); + + grid.bind('onSelectChanged', (e, changes) => { + this.renderSelected(); + }); + + grid.bind('onClick', (e, d) => { + const btn = this.getButton(d.e.target); + if (btn) { + this.installNodes([d.rowItem.hash], btn, d.rowItem.title); + } + }); + + grid.setOption({ + theme: 'dark', + selectVisible: true, + selectMultiple: true, + selectAllVisible: true, + + textSelectable: true, + scrollbarRound: true, + + frozenColumn: 1, + rowNotFound: "No Results", + + rowHeight: 40, + bindWindowResize: true, + bindContainerResize: true, + + cellResizeObserver: (rowItem, columnItem) => { + const autoHeightColumns = ['title', 'installed', 'description', "alternatives"]; + return autoHeightColumns.includes(columnItem.id) + }, + + // updateGrid handler for filter and keywords + rowFilter: (rowItem) => { + + const searchableColumns = ["title", "author", "description"]; + if (this.hasAlternatives()) { + searchableColumns.push("alternatives"); + } + + let shouldShown = grid.highlightKeywordsFilter(rowItem, searchableColumns, this.keywords); + + if (shouldShown) { + if(this.filter && rowItem.filterTypes) { + shouldShown = rowItem.filterTypes.includes(this.filter); + } + } + + return shouldShown; + } + }); + + } + + hasAlternatives() { + return this.filter === ShowMode.ALTERNATIVES + } + + renderGrid() { + + // update theme + const colorPalette = this.app.ui.settings.settingsValues['Comfy.ColorPalette']; + Array.from(this.element.classList).forEach(cn => { + if (cn.startsWith("cn-manager-")) { + this.element.classList.remove(cn); + } + }); + this.element.classList.add(`cn-manager-${colorPalette}`); + + const options = { + theme: colorPalette === "light" ? "" : "dark" + }; + + const rows = this.custom_nodes || []; + rows.forEach((item, i) => { + item.id = i + 1; + const nodeKey = item.files[0]; + const extensionInfo = this.extension_mappings[nodeKey]; + if(extensionInfo) { + const { extensions, conflicts } = extensionInfo; + if (extensions.length) { + item.extensions = extensions.length; + item.extensionsList = extensions; + } + if (conflicts) { + item.conflicts = conflicts.length; + item.conflictsList = conflicts; + } + } + }); + + const columns = [{ + id: 'id', + name: 'ID', + width: 50, + align: 'center' + }, { + id: 'title', + name: 'Title', + width: 200, + minWidth: 100, + maxWidth: 500, + classMap: 'cn-node-name', + formatter: (title, rowItem, columnItem) => { + return `${rowItem.installed === 'Fail' ? '(IMPORT FAILED)' : ''} + ${title}`; + } + }, { + id: 'installed', + name: 'Install', + width: 130, + minWidth: 110, + maxWidth: 200, + sortable: false, + align: 'center', + formatter: (installed, rowItem, columnItem) => { + if (rowItem.restart) { + return `Restart Required`; + } + const buttons = this.getInstallButtons(installed, rowItem.title); + return `
${buttons}
`; + } + }, { + id: "alternatives", + name: "Alternatives", + width: 400, + maxWidth: 5000, + invisible: !this.hasAlternatives(), + classMap: 'cn-node-desc' + }, { + id: 'description', + name: 'Description', + width: 400, + maxWidth: 5000, + classMap: 'cn-node-desc' + }, { + id: "extensions", + name: "Extensions", + width: 80, + align: 'center', + formatter: (extensions, rowItem, columnItem) => { + const extensionsList = rowItem.extensionsList; + if (!extensionsList) { + return; + } + const list = []; + const eId = `popover_extensions_${columnItem.id}_${rowItem.tg_index}`; + list.push(``) + list.push(`
`) + list.push(`

【${rowItem.title}】Extension Nodes (${extensionsList.length})

`); + extensionsList.forEach(en => { + list.push(`
  • ${en}
  • `); + }) + list.push("
    "); + return list.join(""); + } + }, { + id: "conflicts", + name: "Conflicts", + width: 80, + align: 'center', + formatter: (conflicts, rowItem, columnItem) => { + const conflictsList = rowItem.conflictsList; + if (!conflictsList) { + return; + } + const list = []; + const cId = `popover_conflicts_${columnItem.id}_${rowItem.tg_index}`; + list.push(``) + list.push(`
    `) + list.push(`

    【${rowItem.title}】Conflicted Nodes (${conflictsList.length})

    `); + conflictsList.forEach(en => { + let [node_name, extension_name] = en; + extension_name = extension_name.split('/').filter(it => it).pop(); + if(extension_name.endsWith('.git')) { + extension_name = extension_name.slice(0, -4); + } + list.push(`
  • ${node_name} [${extension_name}]
  • `); + }) + list.push("
    "); + return list.join(""); + } + }, { + id: 'author', + name: 'Author', + width: 120, + classMap: "cn-node-author", + formatter: (author, rowItem, columnItem) => { + if (rowItem.trust) { + return `✅ ${author}`; + } + return author; + } + }, { + id: 'stars', + name: '★', + align: 'center', + classMap: "cn-node-stars", + formatter: (stars) => { + if (stars < 0) { + return 'N/A'; + } + if (typeof stars === 'number') { + return stars.toLocaleString(); + } + return stars; + } + }, { + id: 'last_update', + name: 'Last Update', + align: 'center', + type: 'date', + width: 100, + classMap: "cn-node-last-update", + formatter: (last_update) => { + if (last_update < 0) { + return 'N/A'; + } + return `${last_update}`.split(' ')[0]; + } + }]; + + this.grid.setData({ + options, + rows, + columns + }); + + this.grid.render(); + + } + + updateGrid() { + if (this.grid) { + this.grid.update(); + if (this.hasAlternatives()) { + this.grid.showColumn("alternatives"); + } else { + this.grid.hideColumn("alternatives"); + } + } + } + + // =========================================================================================== + + renderSelected() { + const selectedList = this.grid.getSelectedRows(); + if (!selectedList.length) { + this.showSelection(""); + return; + } + + const selectedMap = {}; + selectedList.forEach(item => { + let type = item.installed; + if (item.restart) { + type = "Restart Required"; + } + if (selectedMap[type]) { + selectedMap[type].push(item.hash); + } else { + selectedMap[type] = [item.hash]; + } + }); + + this.selectedMap = selectedMap; + + const list = []; + Object.keys(selectedMap).forEach(v => { + const filterItem = this.getFilterItem(v); + list.push(`
    + Selected ${selectedMap[v].length} ${filterItem ? filterItem.label : v} + ${this.grid.hasMask ? "" : this.getInstallButtons(v)} +
    `); + }); + + this.showSelection(list.join("")); + } + + focusInstall(item, mode) { + const cellNode = this.grid.getCellNode(item, "installed"); + if (cellNode) { + const cellBtn = cellNode.querySelector(`button[mode="${mode}"]`); + if (cellBtn) { + cellBtn.classList.add("cn-btn-loading"); + return true + } + } + } + + async installNodes(list, btn, title) { + + const { target, label, mode} = btn; + + if(mode === "uninstall") { + title = title || `${list.length} custom nodes`; + if (!confirm(`Are you sure uninstall ${title}?`)) { + return; + } + } + + target.classList.add("cn-btn-loading"); + this.showLoading(); + this.showError(""); + + let needRestart = false; + let errorMsg = ""; + for (const hash of list) { + + const item = this.grid.getRowItemBy("hash", hash); + if (!item) { + errorMsg = `Not found custom node: ${hash}`; + break; + } + + this.grid.scrollRowIntoView(item); + + if (!this.focusInstall(item, mode)) { + this.grid.onNextUpdated(() => { + this.focusInstall(item, mode); + }); + } + + this.showStatus(`${label} ${item.title} ...`); + + const data = item.originalData; + const res = await fetchData(`/customnode/${mode}`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + + if (res.error) { + + errorMsg = `${item.title} ${mode} failed: `; + if(res.status == 403) { + errorMsg += `This action is not allowed with this security level configuration.`; + } else if(res.status == 404) { + errorMsg += `With the current security level configuration, only custom nodes from the "default channel" can be installed.`; + } else { + errorMsg += res.error.message; + } + + break; + } + + needRestart = true; + + this.grid.setRowSelected(item, false); + item.restart = true; + this.restartMap[item.hash] = true; + this.grid.updateCell(item, "installed"); + + //console.log(res.data); + + } + + this.hideLoading(); + target.classList.remove("cn-btn-loading"); + + if (errorMsg) { + this.showError(errorMsg); + } else { + this.showStatus(`${label} ${list.length} custom node(s) successfully`); + } + + if (needRestart) { + this.showRestart(); + this.showMessage(`To apply the installed/updated/disabled/enabled custom node, please restart ComfyUI. And refresh browser.`, "red") + } + + } + + // =========================================================================================== + + async getExtensionMappings() { + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading extension mappings (${mode}) ...`); + const res = await fetchData(`/customnode/getmappings?mode=${mode}`); + if (res.error) { + console.log(res.error); + return {} + } + + const data = res.data; + + const extension_mappings = {}; + const conflicts_map = {}; + Object.keys(data).forEach(k => { + const [extensions, metadata] = data[k]; + extension_mappings[k] = { + extensions, + metadata + } + extensions.forEach(node => { + let l = conflicts_map[node]; + if(!l) { + l = []; + conflicts_map[node] = l; + } + l.push(k); + }) + }) + + Object.keys(conflicts_map).forEach(node => { + const list = conflicts_map[node]; + if(list.length > 1) { + list.forEach(k => { + const item = extension_mappings[k]; + if(!item) { + console.log(`not found ${k}`) + return; + } + + if (!item.conflicts) { + item.conflicts = []; + } + list.forEach(key => { + if(k !== key) { + item.conflicts.push([node, key]) + } + }) + }) + } + }) + + return extension_mappings; + } + + async getMissingNodes() { + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading missing nodes (${mode}) ...`); + const res = await fetchData(`/customnode/getmappings?mode=${mode}`); + if (res.error) { + this.showError(`Failed to get custom node mappings: ${res.error}`); + return; + } + + const mappings = res.data; + + // build regex->url map + const regex_to_url = []; + this.custom_nodes.forEach(node => { + if(node.nodename_pattern) { + regex_to_url.push({ + regex: new RegExp(node.nodename_pattern), + url: node.files[0] + }); + } + }); + + // build name->url map + const name_to_urls = {}; + for (const url in mappings) { + const names = mappings[url]; + + for(const name in names[0]) { + let v = name_to_urls[names[0][name]]; + if(v == undefined) { + v = []; + name_to_urls[names[0][name]] = v; + } + v.push(url); + } + } + + const registered_nodes = new Set(); + for (let i in LiteGraph.registered_node_types) { + registered_nodes.add(LiteGraph.registered_node_types[i].type); + } + + const missing_nodes = new Set(); + const workflow = app.graph.serialize(); + const group_nodes = workflow.extra && workflow.extra.groupNodes ? workflow.extra.groupNodes : []; + let nodes = workflow.nodes; + + for (let i in group_nodes) { + let group_node = group_nodes[i]; + nodes = nodes.concat(group_node.nodes); + } + + for (let i in nodes) { + const node_type = nodes[i].type; + if(node_type.startsWith('workflow/')) + continue; + + if (!registered_nodes.has(node_type)) { + const urls = name_to_urls[node_type.trim()]; + if(urls) + urls.forEach(url => { + missing_nodes.add(url); + }); + else { + for(let j in regex_to_url) { + if(regex_to_url[j].regex.test(node_type)) { + missing_nodes.add(regex_to_url[j].url); + } + } + } + } + } + + const resUnresolved = await fetchData(`/component/get_unresolved`); + const unresolved = resUnresolved.data; + if (unresolved && unresolved.nodes) { + unresolved.nodes.forEach(node_type => { + const url = name_to_urls[node_type]; + if(url) { + missing_nodes.add(url); + } + }); + } + + const hashMap = {}; + this.custom_nodes.forEach(item => { + if (item.files.some(file => missing_nodes.has(file))) { + hashMap[item.hash] = true; + } + }); + return hashMap; + } + + async getAlternatives() { + + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading alternatives (${mode}) ...`); + const res = await fetchData(`/customnode/alternatives?mode=${mode}`); + if (res.error) { + this.showError(`Failed to get alternatives: ${res.error}`); + return []; + } + + const hashMap = {}; + const { items } = res.data; + + items.forEach(item => { + + const custom_node = this.custom_nodes.find(node => node.files.find(file => file === item.id)); + if (!custom_node) { + console.log(`Not found custom node: ${item.id}`); + return; + } + + const tags = `${item.tags}`.split(",").map(tag => { + return `
    ${tag.trim()}
    `; + }).join("") + + hashMap[custom_node.hash] = { + alternatives: `
    ${tags}
    ${item.description}` + } + + }); + + return hashMap + } + + async loadData(show_mode = ShowMode.NORMAL) { + this.show_mode = show_mode; + console.log("Show mode:", show_mode); + + this.showLoading(); + + this.extension_mappings = await this.getExtensionMappings(); + + const mode = manager_instance.datasrc_combo.value; + this.showStatus(`Loading custom nodes (${mode}) ...`); + + const skip_update = this.show_mode === ShowMode.UPDATE ? "" : "&skip_update=true"; + const res = await fetchData(`/customnode/getlist?mode=${mode}${skip_update}`); + if (res.error) { + this.showError("Failed to get custom node list."); + this.hideLoading(); + return + } + + const { channel, custom_nodes} = res.data; + this.channel = channel; + this.custom_nodes = custom_nodes; + + if(this.channel !== 'default') { + this.element.querySelector(".cn-manager-channel").innerHTML = `Channel: ${this.channel} (Incomplete list)`; + } + + for (const item of custom_nodes) { + item.originalData = JSON.parse(JSON.stringify(item)); + const message = item.title + item.files[0]; + item.hash = md5(message); + } + + const filterItem = this.getFilterItem(this.show_mode); + if(filterItem) { + let hashMap; + if(this.show_mode == ShowMode.UPDATE) { + hashMap = {}; + custom_nodes.forEach(it => { + if (it.installed === "Update") { + hashMap[it.hash] = true; + } + }); + } else if(this.show_mode == ShowMode.MISSING) { + hashMap = await this.getMissingNodes(); + } else if(this.show_mode == ShowMode.ALTERNATIVES) { + hashMap = await this.getAlternatives(); + } + filterItem.hashMap = hashMap; + filterItem.hasData = true; + } + + custom_nodes.forEach(nodeItem => { + if (this.restartMap[nodeItem.hash]) { + nodeItem.restart = true; + } + const filterTypes = new Set(); + this.filterList.forEach(filterItem => { + const { value, hashMap } = filterItem; + if (hashMap) { + const hashData = hashMap[nodeItem.hash] + if (hashData) { + filterTypes.add(value); + if (value === ShowMode.UPDATE) { + nodeItem.installed = "Update"; + } + if (typeof hashData === "object") { + Object.assign(nodeItem, hashData); + } + } + } else { + if (nodeItem.installed === value) { + filterTypes.add(value); + } + const map = { + "Update": "True", + "Disabled": "True", + "Fail": "True", + "None": "False" + } + if (map[nodeItem.installed]) { + filterTypes.add(map[nodeItem.installed]); + } + } + }); + nodeItem.filterTypes = Array.from(filterTypes); + }); + + this.renderGrid(); + + this.hideLoading(); + + } + + // =========================================================================================== + + showSelection(msg) { + this.element.querySelector(".cn-manager-selection").innerHTML = msg; + } + + showError(err) { + this.showMessage(err, "red"); + } + + showMessage(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cn-manager-message").innerHTML = msg; + } + + showStatus(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cn-manager-status").innerHTML = msg; + } + + showLoading() { + this.setDisabled(true); + if (this.grid) { + this.grid.showLoading(); + this.grid.showMask({ + opacity: 0.05 + }); + } + } + + hideLoading() { + this.setDisabled(false); + if (this.grid) { + this.grid.hideLoading(); + this.grid.hideMask(); + } + } + + setDisabled(disabled) { + + const $close = this.element.querySelector(".cn-manager-close"); + const $restart = this.element.querySelector(".cn-manager-restart"); + + const list = [ + ".cn-manager-header input", + ".cn-manager-header select", + ".cn-manager-footer button", + ".cn-manager-selection button" + ].map(s => { + return Array.from(this.element.querySelectorAll(s)); + }) + .flat() + .filter(it => { + return it !== $close && it !== $restart; + }); + + list.forEach($elem => { + if (disabled) { + $elem.setAttribute("disabled", "disabled"); + } else { + $elem.removeAttribute("disabled"); + } + }); + + Array.from(this.element.querySelectorAll(".cn-btn-loading")).forEach($elem => { + $elem.classList.remove("cn-btn-loading"); + }); + + } + + showRestart() { + this.element.querySelector(".cn-manager-restart").style.display = "block"; + } + + setFilter(filterValue) { + let filter = ""; + const filterItem = this.getFilterItem(filterValue); + if(filterItem) { + filter = filterItem.value; + } + this.filter = filter; + this.element.querySelector(".cn-manager-filter").value = filter; + } + + setKeywords(keywords = "") { + this.keywords = keywords; + this.element.querySelector(".cn-manager-keywords").value = keywords; + } + + show(show_mode) { + this.element.style.display = "flex"; + this.setFilter(show_mode); + this.setKeywords(""); + this.showSelection(""); + this.showMessage(""); + this.loadData(show_mode); + } + + close() { + this.element.style.display = "none"; + } +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/js/model-manager.js b/custom_nodes/ComfyUI-Manager/js/model-manager.js new file mode 100644 index 000000000..d92b46d05 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/model-manager.js @@ -0,0 +1,891 @@ +import { $el } from "../../scripts/ui.js"; +import { + manager_instance, rebootAPI, + fetchData, md5, icons +} from "./common.js"; + +// https://cenfun.github.io/turbogrid/api.html +import TG from "./turbogrid.esm.js"; + +const pageCss = ` +.cmm-manager { + --grid-font: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + z-index: 10001; + width: 80%; + height: 80%; + display: flex; + flex-direction: column; + gap: 10px; + color: var(--fg-color); + font-family: arial, sans-serif; +} + +.cmm-manager .cmm-flex-auto { + flex: auto; +} + +.cmm-manager button { + font-size: 16px; + color: var(--input-text); + background-color: var(--comfy-input-bg); + border-radius: 8px; + border-color: var(--border-color); + border-style: solid; + margin: 0; + padding: 4px 8px; + min-width: 100px; +} + +.cmm-manager button:disabled, +.cmm-manager input:disabled, +.cmm-manager select:disabled { + color: gray; +} + +.cmm-manager button:disabled { + background-color: var(--comfy-input-bg); +} + +.cmm-manager-header { + display: flex; + flex-wrap: wrap; + gap: 5px; + align-items: center; + padding: 0 5px; +} + +.cmm-manager-header label { + display: flex; + gap: 5px; + align-items: center; +} + +.cmm-manager-type, +.cmm-manager-base, +.cmm-manager-filter { + height: 28px; + line-height: 28px; +} + +.cmm-manager-keywords { + height: 28px; + line-height: 28px; + padding: 0 5px 0 26px; + background-size: 16px; + background-position: 5px center; + background-repeat: no-repeat; + background-image: url("data:image/svg+xml;charset=utf8,${encodeURIComponent(icons.search.replace("currentColor", "#888"))}"); +} + +.cmm-manager-status { + padding-left: 10px; +} + +.cmm-manager-grid { + flex: auto; + border: 1px solid var(--border-color); + overflow: hidden; +} + +.cmm-manager-selection { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cmm-manager-message { + +} + +.cmm-manager-footer { + display: flex; + flex-wrap: wrap; + gap: 10px; + align-items: center; +} + +.cmm-manager-grid .tg-turbogrid { + font-family: var(--grid-font); + font-size: 15px; + background: var(--bg-color); +} + +.cmm-manager-grid .cmm-node-name a { + color: skyblue; + text-decoration: none; + word-break: break-word; +} + +.cmm-manager-grid .cmm-node-desc a { + color: #5555FF; + font-weight: bold; + text-decoration: none; +} + +.cmm-manager-grid .tg-cell a:hover { + text-decoration: underline; +} + +.cmm-icon-passed { + width: 20px; + height: 20px; + position: absolute; + left: calc(50% - 10px); + top: calc(50% - 10px); +} + +.cmm-manager .cmm-btn-enable { + background-color: blue; + color: white; +} + +.cmm-manager .cmm-btn-disable { + background-color: MediumSlateBlue; + color: white; +} + +.cmm-manager .cmm-btn-install { + background-color: black; + color: white; +} + +.cmm-btn-download { + width: 18px; + height: 18px; + position: absolute; + left: calc(50% - 10px); + top: calc(50% - 10px); + cursor: pointer; + opacity: 0.8; + color: #fff; +} + +.cmm-btn-download:hover { + opacity: 1; +} + +.cmm-manager-light .cmm-btn-download { + color: #000; +} + +@keyframes cmm-btn-loading-bg { + 0% { + left: 0; + } + 100% { + left: -105px; + } +} + +.cmm-manager button.cmm-btn-loading { + position: relative; + overflow: hidden; + border-color: rgb(0 119 207 / 80%); + background-color: var(--comfy-input-bg); +} + +.cmm-manager button.cmm-btn-loading::after { + position: absolute; + top: 0; + left: 0; + content: ""; + width: 500px; + height: 100%; + background-image: repeating-linear-gradient( + -45deg, + rgb(0 119 207 / 30%), + rgb(0 119 207 / 30%) 10px, + transparent 10px, + transparent 15px + ); + animation: cmm-btn-loading-bg 2s linear infinite; +} + +.cmm-manager-light .cmm-node-name a { + color: blue; +} + +.cmm-manager-light .cm-warn-note { + background-color: #ccc !important; +} + +.cmm-manager-light .cmm-btn-install { + background-color: #333; +} + +`; + +const pageHtml = ` +
    + + + + +
    +
    +
    +
    +
    +
    + +`; + +export class ModelManager { + static instance = null; + + constructor(app, manager_dialog) { + this.app = app; + this.manager_dialog = manager_dialog; + this.id = "cmm-manager"; + + this.filter = ''; + this.type = ''; + this.base = ''; + this.keywords = ''; + + this.init(); + } + + init() { + + if (!document.querySelector(`style[context="${this.id}"]`)) { + const $style = document.createElement("style"); + $style.setAttribute("context", this.id); + $style.innerHTML = pageCss; + document.head.appendChild($style); + } + + this.element = $el("div", { + parent: document.body, + className: "comfy-modal cmm-manager" + }); + this.element.innerHTML = pageHtml; + this.initFilter(); + this.bindEvents(); + this.initGrid(); + } + + initFilter() { + + this.filterList = [{ + label: "All", + value: "" + }, { + label: "Installed", + value: "True" + }, { + label: "Not Installed", + value: "False" + }]; + + this.typeList = [{ + label: "All", + value: "" + }]; + + this.baseList = [{ + label: "All", + value: "" + }]; + + this.updateFilter(); + + } + + updateFilter() { + const $filter = this.element.querySelector(".cmm-manager-filter"); + $filter.innerHTML = this.filterList.map(item => { + const selected = item.value === this.filter ? " selected" : ""; + return `` + }).join(""); + + const $type = this.element.querySelector(".cmm-manager-type"); + $type.innerHTML = this.typeList.map(item => { + const selected = item.value === this.type ? " selected" : ""; + return `` + }).join(""); + + const $base = this.element.querySelector(".cmm-manager-base"); + $base.innerHTML = this.baseList.map(item => { + const selected = item.value === this.base ? " selected" : ""; + return `` + }).join(""); + + } + + bindEvents() { + const eventsMap = { + ".cmm-manager-filter": { + change: (e) => { + this.filter = e.target.value; + this.updateGrid(); + } + }, + ".cmm-manager-type": { + change: (e) => { + this.type = e.target.value; + this.updateGrid(); + } + }, + ".cmm-manager-base": { + change: (e) => { + this.base = e.target.value; + this.updateGrid(); + } + }, + + ".cmm-manager-keywords": { + input: (e) => { + const keywords = `${e.target.value}`.trim(); + if (keywords !== this.keywords) { + this.keywords = keywords; + this.updateGrid(); + } + }, + focus: (e) => e.target.select() + }, + + ".cmm-manager-selection": { + click: (e) => { + const target = e.target; + const mode = target.getAttribute("mode"); + if (mode === "install") { + this.installModels(this.selectedModels, target); + } + } + }, + + ".cmm-manager-close": { + click: (e) => this.close() + }, + + }; + Object.keys(eventsMap).forEach(selector => { + const target = this.element.querySelector(selector); + if (target) { + const events = eventsMap[selector]; + if (events) { + Object.keys(events).forEach(type => { + target.addEventListener(type, events[type]); + }); + } + } + }); + } + + // =========================================================================================== + + initGrid() { + const container = this.element.querySelector(".cmm-manager-grid"); + const grid = new TG.Grid(container); + this.grid = grid; + + grid.bind('onUpdated', (e, d) => { + + this.showStatus(`${grid.viewRows.length.toLocaleString()} external models`); + + }); + + grid.bind('onSelectChanged', (e, changes) => { + this.renderSelected(); + }); + + grid.bind('onClick', (e, d) => { + const { rowItem } = d; + const target = d.e.target; + const mode = target.getAttribute("mode"); + if (mode === "install") { + this.installModels([rowItem], target); + } + + }); + + grid.setOption({ + theme: 'dark', + + selectVisible: true, + selectMultiple: true, + selectAllVisible: true, + + textSelectable: true, + scrollbarRound: true, + + frozenColumn: 1, + rowNotFound: "No Results", + + rowHeight: 40, + bindWindowResize: true, + bindContainerResize: true, + + cellResizeObserver: (rowItem, columnItem) => { + const autoHeightColumns = ['name', 'description']; + return autoHeightColumns.includes(columnItem.id) + }, + + // updateGrid handler for filter and keywords + rowFilter: (rowItem) => { + + const searchableColumns = ["name", "type", "base", "description", "filename", "save_path"]; + + let shouldShown = grid.highlightKeywordsFilter(rowItem, searchableColumns, this.keywords); + + if (shouldShown) { + if(this.filter && rowItem.installed !== this.filter) { + return false; + } + + if(this.type && rowItem.type !== this.type) { + return false; + } + + if(this.base && rowItem.base !== this.base) { + return false; + } + + } + + return shouldShown; + } + }); + + } + + renderGrid() { + + // update theme + const colorPalette = this.app.ui.settings.settingsValues['Comfy.ColorPalette']; + Array.from(this.element.classList).forEach(cn => { + if (cn.startsWith("cmm-manager-")) { + this.element.classList.remove(cn); + } + }); + this.element.classList.add(`cmm-manager-${colorPalette}`); + + const options = { + theme: colorPalette === "light" ? "" : "dark" + }; + + const rows = this.modelList || []; + + const columns = [{ + id: 'id', + name: 'ID', + width: 50, + align: 'center' + }, { + id: 'name', + name: 'Name', + width: 200, + minWidth: 100, + maxWidth: 500, + classMap: 'cmm-node-name', + formatter: function(name, rowItem, columnItem, cellNode) { + return `${name}`; + } + }, { + id: 'installed', + name: 'Install', + width: 130, + minWidth: 110, + maxWidth: 200, + sortable: false, + align: 'center', + formatter: (installed, rowItem, columnItem) => { + if (rowItem.refresh) { + return `Refresh Required`; + } + if (installed === "True") { + return `
    ${icons.passed}
    `; + } + return ``; + } + }, { + id: 'url', + name: '', + width: 50, + sortable: false, + align: 'center', + formatter: (url, rowItem, columnItem) => { + return `${icons.download}`; + } + }, { + id: 'size', + name: 'Size', + width: 100, + formatter: (size) => { + if (typeof size === "number") { + return this.formatSize(size); + } + return size; + } + }, { + id: 'type', + name: 'Type', + width: 100 + }, { + id: 'base', + name: 'Base' + }, { + id: 'description', + name: 'Description', + width: 400, + maxWidth: 5000, + classMap: 'cmm-node-desc' + }, { + id: "save_path", + name: 'Save Path', + width: 200 + }, { + id: 'filename', + name: 'Filename', + width: 200 + }]; + + this.grid.setData({ + options, + rows, + columns + }); + + this.grid.render(); + + } + + updateGrid() { + if (this.grid) { + this.grid.update(); + } + } + + // =========================================================================================== + + renderSelected() { + const selectedList = this.grid.getSelectedRows(); + if (!selectedList.length) { + this.showSelection(""); + this.selectedModels = []; + return; + } + + this.selectedModels = selectedList; + this.showSelection(`Selected ${selectedList.length} models `); + } + + focusInstall(item) { + const cellNode = this.grid.getCellNode(item, "installed"); + if (cellNode) { + const cellBtn = cellNode.querySelector(`button[mode="install"]`); + if (cellBtn) { + cellBtn.classList.add("cmm-btn-loading"); + return true + } + } + } + + async installModels(list, btn) { + + btn.classList.add("cmm-btn-loading"); + this.showLoading(); + this.showError(""); + + let needRestart = false; + let errorMsg = ""; + + for (const item of list) { + + this.grid.scrollRowIntoView(item); + + if (!this.focusInstall(item)) { + this.grid.onNextUpdated(() => { + this.focusInstall(item); + }); + } + + this.showStatus(`Install ${item.name} ...`); + + const data = item.originalData; + const res = await fetchData('/model/install', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + + + if (res.error) { + errorMsg = `Install failed: ${item.name} ${res.error.message}`; + break;; + } + + needRestart = true; + + this.grid.setRowSelected(item, false); + + item.refresh = true; + item.selectable = false; + this.grid.updateCell(item, "installed"); + this.grid.updateCell(item, "tg-column-select"); + + this.showStatus(`Install ${item.name} successfully`); + + } + + this.hideLoading(); + btn.classList.remove("cmm-btn-loading"); + + if (errorMsg) { + this.showError(errorMsg); + } else { + this.showStatus(`Install ${list.length} models successfully`); + } + + if (needRestart) { + this.showMessage(`To apply the installed model, please click the 'Refresh' button on the main menu.`, "red") + } + + } + + getModelList(models) { + + const typeMap = new Map(); + const baseMap = new Map(); + + models.forEach((item, i) => { + const { type, base, name, reference, installed } = item; + item.originalData = JSON.parse(JSON.stringify(item)); + item.size = this.sizeToBytes(item.size); + item.hash = md5(name + reference); + item.id = i + 1; + + if (installed === "True") { + item.selectable = false; + } + + typeMap.set(type, type); + baseMap.set(base, base); + + }); + + const typeList = []; + typeMap.forEach(type => { + typeList.push({ + label: type, + value: type + }); + }); + typeList.sort((a,b)=> { + const au = a.label.toUpperCase(); + const bu = b.label.toUpperCase(); + if (au !== bu) { + return au > bu ? 1 : -1; + } + return 0; + }); + this.typeList = [{ + label: "All", + value: "" + }].concat(typeList); + + + const baseList = []; + baseMap.forEach(base => { + baseList.push({ + label: base, + value: base + }); + }); + baseList.sort((a,b)=> { + const au = a.label.toUpperCase(); + const bu = b.label.toUpperCase(); + if (au !== bu) { + return au > bu ? 1 : -1; + } + return 0; + }); + this.baseList = [{ + label: "All", + value: "" + }].concat(baseList); + + return models; + } + + // =========================================================================================== + + async loadData() { + + this.showLoading(); + + this.showStatus(`Loading external model list ...`); + + const mode = manager_instance.datasrc_combo.value; + + const res = await fetchData(`/externalmodel/getlist?mode=${mode}`); + if (res.error) { + this.showError("Failed to get external model list."); + this.hideLoading(); + return + } + + const { models } = res.data; + + this.modelList = this.getModelList(models); + // console.log("models", this.modelList); + + this.updateFilter(); + + this.renderGrid(); + + this.hideLoading(); + + } + + // =========================================================================================== + + formatSize(v) { + const base = 1000; + const units = ['', 'K', 'M', 'G', 'T', 'P']; + const space = ''; + const postfix = 'B'; + if (v <= 0) { + return `0${space}${postfix}`; + } + for (let i = 0, l = units.length; i < l; i++) { + const min = Math.pow(base, i); + const max = Math.pow(base, i + 1); + if (v > min && v <= max) { + const unit = units[i]; + if (unit) { + const n = v / min; + const nl = n.toString().split('.')[0].length; + const fl = Math.max(3 - nl, 1); + v = n.toFixed(fl); + } + v = v + space + unit + postfix; + break; + } + } + return v; + } + + // for size sort + sizeToBytes(v) { + if (typeof v === "number") { + return v; + } + if (typeof v === "string") { + const n = parseFloat(v); + const unit = v.replace(/[0-9.B]+/g, "").trim().toUpperCase(); + if (unit === "K") { + return n * 1000; + } + if (unit === "M") { + return n * 1000 * 1000; + } + if (unit === "G") { + return n * 1000 * 1000 * 1000; + } + if (unit === "T") { + return n * 1000 * 1000 * 1000 * 1000; + } + } + return v; + } + + showSelection(msg) { + this.element.querySelector(".cmm-manager-selection").innerHTML = msg; + } + + showError(err) { + this.showMessage(err, "red"); + } + + showMessage(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cmm-manager-message").innerHTML = msg; + } + + showStatus(msg, color) { + if (color) { + msg = `${msg}`; + } + this.element.querySelector(".cmm-manager-status").innerHTML = msg; + } + + showLoading() { + this.setDisabled(true); + if (this.grid) { + this.grid.showLoading(); + this.grid.showMask({ + opacity: 0.05 + }); + } + } + + hideLoading() { + this.setDisabled(false); + if (this.grid) { + this.grid.hideLoading(); + this.grid.hideMask(); + } + } + + setDisabled(disabled) { + + const $close = this.element.querySelector(".cmm-manager-close"); + + const list = [ + ".cmm-manager-header input", + ".cmm-manager-header select", + ".cmm-manager-footer button", + ".cmm-manager-selection button" + ].map(s => { + return Array.from(this.element.querySelectorAll(s)); + }) + .flat() + .filter(it => { + return it !== $close; + }); + + list.forEach($elem => { + if (disabled) { + $elem.setAttribute("disabled", "disabled"); + } else { + $elem.removeAttribute("disabled"); + } + }); + + Array.from(this.element.querySelectorAll(".cmm-btn-loading")).forEach($elem => { + $elem.classList.remove("cmm-btn-loading"); + }); + + } + + setKeywords(keywords = "") { + this.keywords = keywords; + this.element.querySelector(".cmm-manager-keywords").value = keywords; + } + + show() { + this.element.style.display = "flex"; + this.setKeywords(""); + this.showSelection(""); + this.showMessage(""); + this.loadData(); + } + + close() { + this.element.style.display = "none"; + } +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/js/node_fixer.js b/custom_nodes/ComfyUI-Manager/js/node_fixer.js new file mode 100644 index 000000000..94b4c7477 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/node_fixer.js @@ -0,0 +1,211 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js"; + +let double_click_policy = "copy-all"; + +api.fetchApi('/manager/dbl_click/policy') + .then(response => response.text()) + .then(data => set_double_click_policy(data)); + +export function set_double_click_policy(mode) { + double_click_policy = mode; +} + +function addMenuHandler(nodeType, cb) { + const getOpts = nodeType.prototype.getExtraMenuOptions; + nodeType.prototype.getExtraMenuOptions = function () { + const r = getOpts.apply(this, arguments); + cb.apply(this, arguments); + return r; + }; +} + +function distance(node1, node2) { + let dx = (node1.pos[0] + node1.size[0]/2) - (node2.pos[0] + node2.size[0]/2); + let dy = (node1.pos[1] + node1.size[1]/2) - (node2.pos[1] + node2.size[1]/2); + return Math.sqrt(dx * dx + dy * dy); +} + +function lookup_nearest_nodes(node) { + let nearest_distance = Infinity; + let nearest_node = null; + for(let other of app.graph._nodes) { + if(other === node) + continue; + + let dist = distance(node, other); + if (dist < nearest_distance && dist < 1000) { + nearest_distance = dist; + nearest_node = other; + } + } + + return nearest_node; +} + +function lookup_nearest_inputs(node) { + let input_map = {}; + + for(let i in node.inputs) { + let input = node.inputs[i]; + + if(input.link || input_map[input.type]) + continue; + + input_map[input.type] = {distance: Infinity, input_name: input.name, node: null, slot: null}; + } + + let x = node.pos[0]; + let y = node.pos[1] + node.size[1]/2; + + for(let other of app.graph._nodes) { + if(other === node || !other.outputs) + continue; + + let dx = x - (other.pos[0] + other.size[0]); + let dy = y - (other.pos[1] + other.size[1]/2); + + if(dx < 0) + continue; + + let dist = Math.sqrt(dx * dx + dy * dy); + + for(let input_type in input_map) { + for(let j in other.outputs) { + let output = other.outputs[j]; + if(output.type == input_type) { + if(input_map[input_type].distance > dist) { + input_map[input_type].distance = dist; + input_map[input_type].node = other; + input_map[input_type].slot = parseInt(j); + } + } + } + } + } + + let res = {}; + for (let i in input_map) { + if (input_map[i].node) { + res[i] = input_map[i]; + } + } + + return res; +} + +function connect_inputs(nearest_inputs, node) { + for(let i in nearest_inputs) { + let info = nearest_inputs[i]; + info.node.connect(info.slot, node.id, info.input_name); + } +} + +function node_info_copy(src, dest, connect_both) { + // copy input connections + for(let i in src.inputs) { + let input = src.inputs[i]; + if(input.link) { + let link = app.graph.links[input.link]; + let src_node = app.graph.getNodeById(link.origin_id); + src_node.connect(link.origin_slot, dest.id, input.name); + } + } + + // copy output connections + if(connect_both) { + let output_links = {}; + for(let i in src.outputs) { + let output = src.outputs[i]; + if(output.links) { + let links = []; + for(let j in output.links) { + links.push(app.graph.links[output.links[j]]); + } + output_links[output.name] = links; + } + } + + for(let i in dest.outputs) { + let links = output_links[dest.outputs[i].name]; + if(links) { + for(let j in links) { + let link = links[j]; + let target_node = app.graph.getNodeById(link.target_id); + dest.connect(parseInt(i), target_node, link.target_slot); + } + } + } + } + + app.graph.afterChange(); +} + +app.registerExtension({ + name: "Comfy.Manager.NodeFixer", + + async nodeCreated(node, app) { + let orig_dblClick = node.onDblClick; + node.onDblClick = function (e, pos, self) { + orig_dblClick?.apply?.(this, arguments); + + if((!node.inputs && !node.outputs) || pos[1] > 0) + return; + + switch(double_click_policy) { + case "copy-all": + case "copy-input": + { + if(node.inputs?.some(x => x.link != null) || node.outputs?.some(x => x.links != null && x.links.length > 0) ) + return; + + let src_node = lookup_nearest_nodes(node); + if(src_node) + node_info_copy(src_node, node, double_click_policy == "copy-all"); + } + break; + case "possible-input": + { + let nearest_inputs = lookup_nearest_inputs(node); + if(nearest_inputs) + connect_inputs(nearest_inputs, node); + } + break; + case "dual": + { + if(pos[0] < node.size[0]/2) { + // left: possible-input + let nearest_inputs = lookup_nearest_inputs(node); + if(nearest_inputs) + connect_inputs(nearest_inputs, node); + } + else { + // right: copy-all + if(node.inputs?.some(x => x.link != null) || node.outputs?.some(x => x.links != null && x.links.length > 0) ) + return; + + let src_node = lookup_nearest_nodes(node); + if(src_node) + node_info_copy(src_node, node, true); + } + } + break; + } + } + }, + + beforeRegisterNodeDef(nodeType, nodeData, app) { + addMenuHandler(nodeType, function (_, options) { + options.push({ + content: "Fix node (recreate)", + callback: () => { + let new_node = LiteGraph.createNode(nodeType.comfyClass); + new_node.pos = [this.pos[0], this.pos[1]]; + app.canvas.graph.add(new_node, false); + node_info_copy(this, new_node); + app.canvas.graph.remove(this); + }, + }); + }); + } +}); diff --git a/custom_nodes/ComfyUI-Manager/js/snapshot.js b/custom_nodes/ComfyUI-Manager/js/snapshot.js new file mode 100644 index 000000000..01e544f7e --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/snapshot.js @@ -0,0 +1,300 @@ +import { app } from "../../scripts/app.js"; +import { api } from "../../scripts/api.js" +import { ComfyDialog, $el } from "../../scripts/ui.js"; +import { manager_instance, rebootAPI, show_message } from "./common.js"; + + +async function restore_snapshot(target) { + if(SnapshotManager.instance) { + try { + const response = await api.fetchApi(`/snapshot/restore?target=${target}`, { cache: "no-store" }); + + if(response.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return false; + } + + if(response.status == 400) { + show_message(`Restore snapshot failed: ${target.title} / ${exception}`); + } + + app.ui.dialog.close(); + return true; + } + catch(exception) { + show_message(`Restore snapshot failed: ${target.title} / ${exception}`); + return false; + } + finally { + await SnapshotManager.instance.invalidateControl(); + SnapshotManager.instance.updateMessage("
    To apply the snapshot, please ComfyUI. And refresh browser.", 'cm-reboot-button2'); + } + } +} + +async function remove_snapshot(target) { + if(SnapshotManager.instance) { + try { + const response = await api.fetchApi(`/snapshot/remove?target=${target}`, { cache: "no-store" }); + + if(response.status == 403) { + show_message('This action is not allowed with this security level configuration.'); + return false; + } + + if(response.status == 400) { + show_message(`Remove snapshot failed: ${target.title} / ${exception}`); + } + + app.ui.dialog.close(); + return true; + } + catch(exception) { + show_message(`Restore snapshot failed: ${target.title} / ${exception}`); + return false; + } + finally { + await SnapshotManager.instance.invalidateControl(); + } + } +} + +async function save_current_snapshot() { + try { + const response = await api.fetchApi('/snapshot/save', { cache: "no-store" }); + app.ui.dialog.close(); + return true; + } + catch(exception) { + show_message(`Backup snapshot failed: ${exception}`); + return false; + } + finally { + await SnapshotManager.instance.invalidateControl(); + SnapshotManager.instance.updateMessage("
    Current snapshot saved."); + } +} + +async function getSnapshotList() { + const response = await api.fetchApi(`/snapshot/getlist`); + const data = await response.json(); + return data; +} + +export class SnapshotManager extends ComfyDialog { + static instance = null; + + restore_buttons = []; + message_box = null; + data = null; + + clear() { + this.restore_buttons = []; + this.message_box = null; + this.data = null; + } + + constructor(app, manager_dialog) { + super(); + this.manager_dialog = manager_dialog; + this.search_keyword = ''; + this.element = $el("div.comfy-modal", { parent: document.body }, []); + } + + async remove_item() { + caller.disableButtons(); + + await caller.invalidateControl(); + } + + createControls() { + return [ + $el("button.cm-small-button", { + type: "button", + textContent: "Close", + onclick: () => { this.close(); } + }) + ]; + } + + startRestore(target) { + const self = SnapshotManager.instance; + + self.updateMessage(`
    Restore snapshot '${target.name}'`); + + for(let i in self.restore_buttons) { + self.restore_buttons[i].disabled = true; + self.restore_buttons[i].style.backgroundColor = 'gray'; + } + } + + async invalidateControl() { + this.clear(); + this.data = (await getSnapshotList()).items; + + while (this.element.children.length) { + this.element.removeChild(this.element.children[0]); + } + + await this.createGrid(); + await this.createBottomControls(); + } + + updateMessage(msg, btn_id) { + this.message_box.innerHTML = msg; + if(btn_id) { + const rebootButton = document.getElementById(btn_id); + const self = this; + rebootButton.onclick = function() { + if(rebootAPI()) { + self.close(); + self.manager_dialog.close(); + } + }; + } + } + + async createGrid(models_json) { + var grid = document.createElement('table'); + grid.setAttribute('id', 'snapshot-list-grid'); + + var thead = document.createElement('thead'); + var tbody = document.createElement('tbody'); + + var headerRow = document.createElement('tr'); + thead.style.position = "sticky"; + thead.style.top = "0px"; + thead.style.borderCollapse = "collapse"; + thead.style.tableLayout = "fixed"; + + var header1 = document.createElement('th'); + header1.innerHTML = '  ID  '; + header1.style.width = "20px"; + var header2 = document.createElement('th'); + header2.innerHTML = 'Datetime'; + header2.style.width = "100%"; + var header_button = document.createElement('th'); + header_button.innerHTML = 'Action'; + header_button.style.width = "100px"; + + thead.appendChild(headerRow); + headerRow.appendChild(header1); + headerRow.appendChild(header2); + headerRow.appendChild(header_button); + + headerRow.style.backgroundColor = "Black"; + headerRow.style.color = "White"; + headerRow.style.textAlign = "center"; + headerRow.style.width = "100%"; + headerRow.style.padding = "0"; + + grid.appendChild(thead); + grid.appendChild(tbody); + + this.grid_rows = {}; + + if(this.data) + for (var i = 0; i < this.data.length; i++) { + const data = this.data[i]; + var dataRow = document.createElement('tr'); + var data1 = document.createElement('td'); + data1.style.textAlign = "center"; + data1.innerHTML = i+1; + var data2 = document.createElement('td'); + data2.innerHTML = ` ${data}`; + var data_button = document.createElement('td'); + data_button.style.textAlign = "center"; + + var restoreBtn = document.createElement('button'); + restoreBtn.innerHTML = 'Restore'; + restoreBtn.style.width = "100px"; + restoreBtn.style.backgroundColor = 'blue'; + + restoreBtn.addEventListener('click', function() { + restore_snapshot(data); + }); + + var removeBtn = document.createElement('button'); + removeBtn.innerHTML = 'Remove'; + removeBtn.style.width = "100px"; + removeBtn.style.backgroundColor = 'red'; + + removeBtn.addEventListener('click', function() { + remove_snapshot(data); + }); + + data_button.appendChild(restoreBtn); + data_button.appendChild(removeBtn); + + dataRow.style.backgroundColor = "var(--bg-color)"; + dataRow.style.color = "var(--fg-color)"; + dataRow.style.textAlign = "left"; + + dataRow.appendChild(data1); + dataRow.appendChild(data2); + dataRow.appendChild(data_button); + tbody.appendChild(dataRow); + + this.grid_rows[i] = {data:data, control:dataRow}; + } + + let self = this; + const panel = document.createElement('div'); + panel.style.width = "100%"; + panel.appendChild(grid); + + function handleResize() { + const parentHeight = self.element.clientHeight; + const gridHeight = parentHeight - 200; + + grid.style.height = gridHeight + "px"; + } + window.addEventListener("resize", handleResize); + + grid.style.position = "relative"; + grid.style.display = "inline-block"; + grid.style.width = "100%"; + grid.style.height = "100%"; + grid.style.overflowY = "scroll"; + this.element.style.height = "85%"; + this.element.style.width = "80%"; + this.element.appendChild(panel); + + handleResize(); + } + + async createBottomControls() { + var close_button = document.createElement("button"); + close_button.className = "cm-small-button"; + close_button.innerHTML = "Close"; + close_button.onclick = () => { this.close(); } + close_button.style.display = "inline-block"; + + var save_button = document.createElement("button"); + save_button.className = "cm-small-button"; + save_button.innerHTML = "Save snapshot"; + save_button.onclick = () => { save_current_snapshot(); } + save_button.style.display = "inline-block"; + save_button.style.horizontalAlign = "right"; + save_button.style.width = "170px"; + + this.message_box = $el('div', {id:'custom-download-message'}, [$el('br'), '']); + this.message_box.style.height = '60px'; + this.message_box.style.verticalAlign = 'middle'; + + this.element.appendChild(this.message_box); + this.element.appendChild(close_button); + this.element.appendChild(save_button); + } + + async show() { + try { + this.invalidateControl(); + this.element.style.display = "block"; + this.element.style.zIndex = 10001; + } + catch(exception) { + app.ui.dialog.show(`Failed to get external model list. / ${exception}`); + } + } +} diff --git a/custom_nodes/ComfyUI-Manager/js/terminal.js b/custom_nodes/ComfyUI-Manager/js/terminal.js new file mode 100644 index 000000000..091959fa5 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/terminal.js @@ -0,0 +1,81 @@ +import {app} from "../../scripts/app.js"; +import {ComfyWidgets} from "../../scripts/widgets.js"; +// Node that add notes to your project + +let terminal_node; +let log_mode = false; + +app.registerExtension({ + name: "Comfy.Manager.Terminal", + + registerCustomNodes() { + class TerminalNode { + color = "#222222"; + bgcolor = "#000000"; + groupcolor = LGraphCanvas.node_colors.black.groupcolor; + constructor() { + this.logs = []; + + if (!this.properties) { + this.properties = {}; + this.properties.text=""; + } + + ComfyWidgets.STRING(this, "", ["", {default:this.properties.text, multiline: true}], app) + ComfyWidgets.BOOLEAN(this, "mode", ["", {default:true, label_on:'Logging', label_off:'Stop'}], app) + ComfyWidgets.INT(this, "lines", ["", {default:500, min:10, max:10000, steps:1}], app) + + let self = this; + Object.defineProperty(this.widgets[1], 'value', { + set: (v) => { + api.fetchApi(`/manager/terminal?mode=${v}`, {}); + log_mode = v; + }, + get: () => { + return log_mode; + } + }); + + this.serialize_widgets = false; + this.isVirtualNode = true; + + if(terminal_node) { + try { + terminal_node.widgets[0].value = 'The output of this node is disabled because another terminal node has appeared.'; + } + catch {} + } + terminal_node = this; + } + } + + // Load default visibility + LiteGraph.registerNodeType( + "Terminal Log //CM", + Object.assign(TerminalNode, { + title_mode: LiteGraph.NORMAL_TITLE, + title: "Terminal Log (Manager)", + collapsable: true, + }) + ); + + TerminalNode.category = "utils"; + }, +}); + + +import { api } from "../../scripts/api.js"; + +function terminalFeedback(event) { + if(terminal_node) { + terminal_node.logs.push(event.detail.data); + if(terminal_node.logs.length > terminal_node.widgets[2].value) { + terminal_node.logs.shift(); + if(terminal_node.logs[0] == '' || terminal_node.logs[0] == '\n') + terminal_node.logs.shift(); + } + terminal_node.widgets[0].value = [...terminal_node.logs].reverse().join('').trim(); + } +} + +api.addEventListener("manager-terminal-feedback", terminalFeedback); diff --git a/custom_nodes/ComfyUI-Manager/js/turbogrid.esm.js b/custom_nodes/ComfyUI-Manager/js/turbogrid.esm.js new file mode 100644 index 000000000..fd0bfb57d --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/js/turbogrid.esm.js @@ -0,0 +1 @@ +var t={915:(t,e,i)=>{i.d(e,{A:()=>l});var o=i(256),n=i.n(o),s=i(505),r=i.n(s)()(n());r.push([t.id,'.tg-turbogrid{position:relative;z-index:0;width:100%;height:100%;margin:0;padding:0;box-sizing:border-box;font-size:14px;font-family:arial,sans-serif;outline:0;cursor:default;overflow:hidden}.tg-turbogrid *,.tg-turbogrid *::before,.tg-turbogrid *::after{box-sizing:border-box}.tg-text-unselectable.tg-turbogrid{user-select:none}.tg-turbogrid svg{display:block;pointer-events:none}.tg-turbogrid .tg-symbols{font-family:webdings,sans-serif}.tg-turbogrid .tg-nowrap{white-space:nowrap}.tg-turbogrid .tg-align-left{text-align:left}.tg-turbogrid .tg-align-center{text-align:center}.tg-turbogrid .tg-align-right{text-align:right}@keyframes tg-fade-in{from{opacity:0}to{opacity:1}}@keyframes tg-fade-out{from{opacity:1}to{opacity:0}}.tg-turbogrid .tg-fade-in{animation-name:tg-fade-in;animation-duration:.2s;animation-fill-mode:both}.tg-turbogrid .tg-fade-in .tg-scrollbar-track{display:none}.tg-turbogrid .tg-fade-out{animation-name:tg-fade-out;animation-duration:.2s;animation-fill-mode:both}.tg-turbogrid .tg-fade-out .tg-scrollbar-track{display:none}.tg-turbogrid .tg-mask{position:absolute;top:0;left:0;z-index:200;display:none;width:100%;height:100%;background-color:#000;opacity:.1}@keyframes tg-loading-animation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.tg-turbogrid .tg-loading{position:absolute;top:50%;left:50%;z-index:300;display:none;transform:translate(-50%, -50%);pointer-events:none}.tg-turbogrid .tg-loading-default{width:35px;height:35px;color:#0077cf;animation:1s tg-loading-animation linear infinite}.tg-turbogrid .tg-loading-fast{animation:.382s tg-loading-animation linear infinite}.tg-turbogrid .tg-checkbox{width:100%;height:100%;cursor:pointer;overflow:hidden}.tg-turbogrid .tg-checkbox:hover .tg-checkbox-item{fill:#005ba1}.tg-turbogrid .tg-checkbox.tg-select-icon-all{height:18px}.tg-turbogrid .tg-checkbox .tg-icon-checkbox{position:absolute;top:50%;left:50%;display:block;width:16px;height:16px;transform:translate(-50%, -50%)}.tg-turbogrid .tg-checkbox .tg-checkbox-item{display:none;fill:gray}.tg-turbogrid .tg-checkbox .tg-checkbox-none{display:block}.tg-turbogrid .tg-checkbox.tg-selected .tg-checkbox-selected{display:block;fill:#0077cf}.tg-turbogrid .tg-checkbox.tg-mixed .tg-checkbox-mixed{display:block;fill:#0077cf}.tg-turbogrid .tg-radio{cursor:pointer;overflow:hidden}.tg-turbogrid .tg-radio:hover .tg-icon-radio::before{border-color:#005ba1}.tg-turbogrid .tg-radio .tg-icon-radio{position:absolute;top:50%;left:50%;width:16px;height:16px;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio .tg-icon-radio::before{position:absolute;top:50%;left:50%;content:"";display:block;width:16px;height:16px;border:thin solid gray;border-radius:50%;background:#fff;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio .tg-icon-radio::after{position:absolute;top:50%;left:50%;content:"";display:none;width:10px;height:10px;border-radius:50%;background:#0077cf;transform:translate(-50%, -50%)}.tg-turbogrid .tg-radio.tg-selected .tg-icon-radio::after{display:block;border-color:#0077cf}.tg-turbogrid .tg-scrollbar{position:absolute;z-index:100;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-v{top:0;right:0}.tg-turbogrid .tg-scrollbar-h{left:0;bottom:0}.tg-turbogrid .tg-scrollbar-track{position:relative;width:100%;height:100%;background:#f9f9f9;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-thumb{position:absolute;top:0;left:0;border-radius:1px;background:#999;overflow:hidden;user-select:none}.tg-turbogrid .tg-scrollbar-thumb:hover{background:#888}.tg-turbogrid .tg-scrollbar-thumb-hold{background:#666}.tg-turbogrid .tg-scrollbar-thumb-hold:hover{background:#666}.tg-turbogrid .tg-scrollbar-round .tg-scrollbar-track{border-radius:10px}.tg-turbogrid .tg-scrollbar-round .tg-scrollbar-thumb{border-radius:10px}.tg-turbogrid .tg-scroll-pane{position:relative;margin:0;padding:0;border:none;outline:none;overflow:hidden}.tg-turbogrid .tg-scroll-view{position:relative;width:100%;height:100%;margin:0;padding:0;border:none;overflow:hidden}.tg-turbogrid .tg-scroll-body{position:absolute}.tg-turbogrid .tg-header{position:relative;width:10000px;border-left:0;overflow:hidden}.tg-turbogrid .tg-header-table{position:relative;color:#5e5e5e;font-weight:bold;font-size:14px;line-height:16px;border-bottom:thin solid #e5e5e5;overflow:hidden}.tg-turbogrid .tg-header-item{position:absolute;bottom:0}.tg-turbogrid .tg-header-group-item{overflow:hidden}.tg-turbogrid .tg-header-group-item::after{position:absolute;left:5px;bottom:0;content:"";display:block;width:calc(100% - 10px);height:1px;border-bottom:thin solid #ccc}.tg-turbogrid .tg-column-header{position:absolute;bottom:0;overflow:hidden}.tg-turbogrid .tg-column-header .tg-column-name{padding:10px 5px;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-column-header .tg-column-name.tg-header-group-name{margin:0 5px;padding:5px 0}.tg-turbogrid .tg-column-resizing{position:absolute;top:0;right:-5px;z-index:100;width:10px;height:100%;background:#ccc;cursor:ew-resize;opacity:0}.tg-turbogrid .tg-header-column-last .tg-column-resizing{right:0}.tg-turbogrid .tg-column-sortable .tg-column-name{cursor:pointer}.tg-turbogrid .tg-column-sortable .tg-sort-indicator{cursor:pointer}.tg-turbogrid .tg-column-sorted{color:#000}.tg-turbogrid .tg-header-sort-h .tg-column-name{padding:12px 5px 15px}.tg-turbogrid .tg-header-sort-h .tg-column-sort{width:100%;height:15px;margin-top:-15px;padding:0 5px;overflow:hidden}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator{position:relative;display:none;width:100%;height:100%}.tg-turbogrid .tg-header-sort-h .tg-column-sorted .tg-column-sort .tg-sort-indicator{display:block}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-line{position:absolute;top:1px;width:100%;height:0;border-top:thin solid #1e1e1e;overflow:hidden}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon{position:absolute;top:5px;left:0;right:inherit}.tg-turbogrid .tg-header-sort-h .tg-align-right .tg-sort-indicator-icon{left:inherit;right:0}.tg-turbogrid .tg-header-sort-h .tg-align-center .tg-sort-indicator-icon{left:50%;transform:translateX(-50%)}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-sort-h{display:block;width:19px;height:6px}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item{display:none;fill:#1e1e1e}.tg-turbogrid .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-column-sort-v{display:flex;flex-direction:row;align-items:center}.tg-turbogrid .tg-column-sort-v .tg-column-name{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-column-sort-v.tg-align-right{justify-content:right}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator{position:relative;width:16px;height:16px}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon{position:absolute}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-sort-v{display:block;width:10px;height:16px}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item{fill:#ababab}.tg-turbogrid .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item{fill:#1e1e1e}.tg-turbogrid .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item-light{fill:#ababab}.tg-turbogrid .tg-sort-desc .tg-sort-indicator .tg-sort-indicator-icon .tg-desc{display:block}.tg-turbogrid .tg-sort-desc .tg-sort-indicator .tg-sort-indicator-icon .tg-asc{display:none}.tg-turbogrid .tg-sort-asc .tg-sort-indicator .tg-sort-indicator-icon .tg-desc{display:none}.tg-turbogrid .tg-sort-asc .tg-sort-indicator .tg-sort-indicator-icon .tg-asc{display:block}.tg-turbogrid .tg-column-line{position:absolute;top:0;left:0;z-index:100;display:none;height:100%;pointer-events:none}.tg-turbogrid .tg-column-line-item{position:absolute;top:0;bottom:0;display:block;width:0;height:100%;border-left:thin solid #ccc}.tg-turbogrid .tg-column-line-item.tg-active{border-left:thin solid #0077cf}.tg-turbogrid .tg-column-dragging{cursor:ew-resize}.tg-turbogrid .tg-column-dragging .tg-column-name{cursor:ew-resize}.tg-turbogrid .tg-column-dragging .tg-column-resizing:not(.tg-resizing-active){display:none}.tg-turbogrid .tg-tree{position:relative;display:flex;flex-direction:row;place-items:center left;width:100%;height:100%;overflow:hidden}.tg-turbogrid .tg-tree-icon{position:relative;width:15px;height:100%;min-height:9px;text-align:left;cursor:pointer;overflow:hidden}.tg-turbogrid .tg-tree-icon .tg-icon-tree{position:absolute;top:50%;left:0;display:block;width:9px;height:9px;transform:translate(0, -50%);overflow:hidden}.tg-turbogrid .tg-tree-icon .tg-tree-item{display:none}.tg-turbogrid .tg-tree-icon-collapsed .tg-tree-collapsed{display:block}.tg-turbogrid .tg-tree-icon-empty .tg-tree-collapsed{opacity:.5}.tg-turbogrid .tg-tree-icon-expanded .tg-tree-expanded{display:block}.tg-turbogrid .tg-tree-name{flex:1;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-tree-header .tg-tree .tg-tree-icon{display:none}.tg-turbogrid .tg-tree-icon-all{position:relative;height:17px}.tg-turbogrid .tg-tree-header-indent .tg-tree{padding-left:5px}.tg-turbogrid .tg-tree-header-indent .tg-tree .tg-tree-icon{display:block}.tg-turbogrid .tg-tree-header-indent.tg-column-sort-h .tg-column-sort{width:calc(100% - 20px);margin-left:20px}.tg-turbogrid .tg-pane{position:absolute;width:100%;outline:0;overflow:hidden}.tg-turbogrid .tg-header-frame{position:relative;display:block;outline:0;overflow:hidden}.tg-turbogrid .tg-header-frame .tg-pane{height:100%}.tg-turbogrid .tg-body-frame{position:relative;width:100%;outline:0}.tg-turbogrid .tg-body-message{position:absolute;display:none;width:100%;height:100%;padding:10px;overflow:hidden}.tg-turbogrid .tg-body-message img,.tg-turbogrid .tg-body-message div{position:absolute;top:50%;left:50%;transform:translate(-50%, -50%)}.tg-turbogrid .tg-body{position:absolute;outline:0}.tg-turbogrid .tg-cell-hover-icon{display:none}.tg-touch-device.tg-turbogrid .tg-cell-hover-icon{display:inherit}.tg-turbogrid .tg-cell-row-number{font-weight:normal}.tg-turbogrid .tg-cell-row-drag .tg-row-drag-icon{position:absolute;top:50%;left:50%;width:24px;height:24px;cursor:move;opacity:.8;transform:translate(-50%, -50%)}.tg-turbogrid .tg-cell-row-drag .tg-row-drag-icon:hover{opacity:1}.tg-turbogrid .tg-cell{position:absolute;z-index:1;height:100%;margin:0;padding:0 5px;color:#1e1e1e;white-space:nowrap;text-overflow:ellipsis;vertical-align:middle;overflow:hidden}.tg-turbogrid .tg-cell:focus{outline:none}.tg-turbogrid .tg-cell.tg-flashing{border:1px solid red !important}.tg-turbogrid .tg-cell.tg-selected{background-color:beige}.tg-turbogrid .tg-cell.tg-align-left.tg-cell-negative{padding-left:1px}.tg-turbogrid .tg-cell.tg-align-right.tg-cell-negative{padding-right:1px}.tg-turbogrid .tg-cell.tg-cell-observer{display:flex;flex-direction:column;justify-content:center;padding:5px;line-height:normal;white-space:normal;text-overflow:ellipsis;overflow:hidden}.tg-turbogrid .tg-cell.tg-cell-observer .tg-observer{position:relative;margin:0;padding:0;border:none}.tg-turbogrid .tg-row{position:absolute;width:100%;border:0;border-bottom:thin solid #e5e5e5}.tg-turbogrid .tg-row.tg-group-line{border-bottom:thin solid #999}.tg-turbogrid .tg-row.tg-none-line{border-bottom:none}.tg-turbogrid .tg-row.tg-top-line{border-top:thin solid #e5e5e5}.tg-turbogrid .tg-row.tg-group{font-weight:bold;overflow:hidden}.tg-turbogrid .tg-row.tg-group .tg-cell.tg-align-left.tg-cell-negative{padding-left:0}.tg-turbogrid .tg-row.tg-group .tg-cell.tg-align-right.tg-cell-negative{padding-right:0}.tg-turbogrid .tg-row.tg-hover .tg-cell .tg-cell-hover-icon{display:inherit}.tg-turbogrid .tg-row.tg-dragging{opacity:.3}.tg-turbogrid .tg-row.tg-clone{z-index:1000;border:1px dashed #ccc;border-right:none;border-left:none;background:#fff;cursor:move;opacity:.5}.tg-turbogrid .tg-row.tg-clone *{cursor:move}.tg-turbogrid .tg-row-placeholder{position:absolute;z-index:9999;width:100%;border-top:2px solid #00a8e1;pointer-events:none}.tg-turbogrid .tg-row::before,.tg-turbogrid .tg-row::after{position:absolute;top:0;left:0;content:"";z-index:100;display:none;width:100%;height:100%;pointer-events:none}.tg-turbogrid .tg-hover.tg-row::before{display:block;background:rgba(0,0,0,.08)}.tg-turbogrid .tg-selected.tg-row::after{display:block;background:rgba(0,0,0,.13)}.tg-lightblue .tg-header-item{border-top:thin solid #e8eaf0;border-right:thin solid #e8eaf0}.tg-lightblue .tg-column-name{padding:5px;color:#304265}.tg-lightblue .tg-header-group-item::after{display:none}.tg-lightblue .tg-checkbox .tg-icon-item{fill:#d4d7e0}.tg-lightblue .tg-checkbox:hover .tg-icon-item{fill:#107fff}.tg-lightblue .tg-checkbox.tg-selected .tg-select-checkbox{fill:#107fff}.tg-lightblue .tg-checkbox.tg-mixed .tg-select-mixed{fill:#107fff}.tg-lightblue .tg-cell{color:#304265;border-right:thin solid #e8eaf0}.tg-lightblue .tg-row{border-bottom:thin solid #e8eaf0}.tg-lightblue .tg-row.tg-group-line{border-bottom:thin solid #c9ccd8}.tg-lightblue .tg-row.tg-selected{background:rgba(58,116,213,.05)}.tg-lightblue .tg-row.tg-hover{background:rgba(58,116,213,.05)}.tg-lightblue .tg-row.tg-even{background:#fbfcfe}.tg-lightblue .tg-row.tg-odd{background:#fff}.tg-lightblue .tg-hover.tg-row::before{background:rgba(58,116,213,.05)}.tg-lightblue .tg-selected.tg-row::after{background:rgba(58,116,213,.1)}.tg-lightblue .tg-header-frame{border-bottom:thin solid #e8eaf0}.tg-lightblue .tg-row-not-found .tg-frozen-line-v{border-right:none}.tg-lightblue .tg-scrollbar-track{background:#fff}.tg-lightblue .tg-scrollbar-thumb{background:rgba(48,66,101,.35)}.tg-lightblue .tg-scrollbar-thumb:hover{background-color:#a8a8a8}.tg-lightblue .tg-scrollbar-thumb:active{background-color:#787878}.tg-dark{background:#1e1e1e}.tg-dark .tg-checkbox .tg-icon-item{fill:#ababab}.tg-dark .tg-header-table{color:#ccc;border-bottom:thin solid #333}.tg-dark .tg-header-group-item::after{border-bottom:1px solid #999}.tg-dark .tg-column-sorted{color:#fff}.tg-dark .tg-column-sorted .tg-tree-icon-all .tg-icon-item{fill:#fff}.tg-dark .tg-header-sort-h .tg-sort-indicator-line{border-top:thin solid #eee}.tg-dark .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item{fill:#eee}.tg-dark .tg-header-sort-h .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item{fill:#666}.tg-dark .tg-column-sort-v .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item{fill:#fff}.tg-dark .tg-column-sort-v.tg-column-sorted .tg-sort-indicator-icon .tg-icon-item-light{fill:#666}.tg-dark .tg-tree-icon .tg-icon-item{fill:#fff}.tg-dark .tg-tree-icon-all .tg-icon-item{fill:#999}.tg-dark .tg-header-item .tg-tree-icon .tg-icon-item{fill:#999}.tg-dark .tg-header-item .tg-column-sorted .tg-tree-icon .tg-icon-item{fill:#fff}.tg-dark .tg-row{border-bottom:thin solid #333}.tg-dark .tg-row.tg-group-line{border-bottom:thin solid #666}.tg-dark .tg-row.tg-clone{border:1px dashed #1e1e1e;opacity:.1}.tg-dark .tg-cell{color:#eee}.tg-dark .tg-body-message{color:#eee}.tg-dark .tg-hover.tg-row::before{background:rgba(255,255,255,.1)}.tg-dark .tg-selected.tg-row::after{background:rgba(255,255,255,.2)}.tg-dark .tg-mask{background-color:#fff}.tg-dark .tg-scrollbar-track{background:#333}.tg-dark .tg-scrollbar-thumb{background:#bbb}.tg-dark .tg-scrollbar-thumb:hover{background:#ddd}.tg-dark .tg-scrollbar-thumb-hold{background:#eee}.tg-dark .tg-scrollbar-thumb-hold:hover{background:#eee}.tg-pointer-events-none{pointer-events:none}',""]);const l=r},505:t=>{t.exports=function(t){var e=[];return e.toString=function(){return this.map((function(e){var i="",o=void 0!==e[5];return e[4]&&(i+="@supports (".concat(e[4],") {")),e[2]&&(i+="@media ".concat(e[2]," {")),o&&(i+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),i+=t(e),o&&(i+="}"),e[2]&&(i+="}"),e[4]&&(i+="}"),i})).join("")},e.i=function(t,i,o,n,s){"string"==typeof t&&(t=[[null,t,void 0]]);var r={};if(o)for(var l=0;l0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=s),i&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=i):c[2]=i),n&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=n):c[4]="".concat(n)),e.push(c))}},e}},256:t=>{t.exports=function(t){return t[1]}}},e={};function i(o){var n=e[o];if(void 0!==n)return n.exports;var s=e[o]={id:o,exports:{}};return t[o](s,s.exports,i),s.exports}i.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var o in e)i.o(e,o)&&!i.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var o={};(()=>{i.d(o,{$:()=>w,MP:()=>e,_d:()=>k,xA:()=>Xt,In:()=>X,T8:()=>B,Gr:()=>kt,ht:()=>Kt,J0:()=>d,xv:()=>Yt,Ay:()=>qt});const t="turbogrid",e={ID:t,NS:`tg-${t}`,VERSION:"3.2.0",TIMESTAMP:"2024-06-20T10:33:49.165Z",UP:"up",DOWN:"down",LEFT:"left",RIGHT:"right",TREE_INDENT:15},n=function(t){if(!t||"object"!=typeof t)return!1;const e=Object.prototype.toString.call(t);return!!["[object Object]","[object Array]"].includes(e)&&(!t.constructor||!![Object,Array].includes(t.constructor))},s=function(t,e){let i;return t.forEach((t=>{n(t)&&(i||(i=t instanceof Array?[]:{}),t instanceof Array?function(t,e,i){const o=e.length;for(let s=0;s{this.execute()})):Promise.resolve().then((()=>{this.execute()}))}execute(){if(!this.started)return;this.started=!1;const t=this.callback;this.callback=null,"function"==typeof t&&t.call(this)}cancel(){this.started=!1,this.callback=null}}const a=new WeakMap,c={isObject:n,merge:l,hasOwn:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},uid:function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:8;const e="0123456789abcdefghijklmnopqrstuvwxyz";let i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";for(;t--;)i+=e[36*Math.random()|0];return i},isNum:function(t){if("number"!=typeof t||isNaN(t))return!1;return(e=t)!==Number.MAX_VALUE&&e!==Number.MIN_VALUE&&e!==Number.NEGATIVE_INFINITY&&e!==Number.POSITIVE_INFINITY;var e},toNum:function(t,e){return"number"!=typeof t&&(t=parseFloat(t)),isNaN(t)&&(t=0),e&&!Number.isInteger(t)&&(t=Math.round(t)),t},convertNum:function(t){if("string"==typeof t){if(/^[-+]?\d+(\.\d+)?$/gi.test(t))return parseFloat(t)}return t},clamp:function(t,e,i){return Math.max(Math.min(t,i),e)},per:function(t){return t=c.toNum(t),t=c.clamp(t,0,1)},replace:function(t,e){return t=`${t}`,e?t=t.replace(/\{([^}]+)\}/g,(function(t,i){return c.hasOwn(e,i)?e[i]:t})):t},isArray:function(t){return!!(t&&t instanceof Array)},toList:function(t){return t instanceof Array?t:void 0===t?[]:"string"==typeof t?[t]:t&&c.hasOwn(t,"length")?Array.from(t):[t]},isList:function(t){return!!(c.isArray(t)&&t.length>0)},inList:function(t,e){if(!c.isList(e))return!1;for(let i=0,o=e.length;i{if(!c.isList(t))return;let n=0;const s=t.length;for(;nt.startsWith(e))).forEach((e=>{t[e]=null}))},hasShiftKey:function(t){let e=!1;return t&&(e=t.shiftKey),e},isTouchDevice:function(){return"ontouchstart"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0},contains:function(t,e){if(!t||!e)return!1;if(t===e)return!0;if("function"==typeof t.contains)return t.contains(e);let i=e.parentNode;for(;i;){if(i===t)return!0;i=i.parentNode}return!1},isNarrowCharacter:function(t){const e=t.codePointAt(0);return e>=32&&e<=126||162===e||163===e||165===e||166===e||172===e||175===e||8361===e||e>=10214&&e<=10221||10629===e||10630===e||e>=65377&&e<=65470||e>=65474&&e<=65479||e>=65482&&e<=65487||e>=65490&&e<=65495||e>=65498&&e<=65500||e>=65512&&e<=65518},getCharLen:function(t){let e=0;if(!t)return e;for(const i of String(t))e+=c.isNarrowCharacter(i)?1:2;return e},pascalToKebabCase:function(t){return`${t}`.trim().replace(/([a-z])([A-Z])/g,"$1-$2").replace(/\W/g,(t=>/[À-ž]/.test(t)?t:"-")).replace(/^-+|-+$/g,"").replace(/-{2,}/g,"-").toLowerCase()},classMap:function(t){if("string"==typeof t)return t.trim();if(Array.isArray(t)){let e=t.filter((t=>t));return e=e.map((t=>t&&"object"==typeof t?c.classMap(t):String(t).trim())),e=e.filter((t=>t)),e=Array.from(new Set(e)),e.join(" ")}if(t&&"object"==typeof t){const e=[];return Object.keys(t).forEach((i=>{t[i]&&e.push(i)})),e.join(" ")}return""},styleMap:function(t){if("string"==typeof t)return t.trim();if(Array.isArray(t)){let e=t.filter((t=>t));return e=e.map((t=>{const e=String(t).trim();return e?-1===e.indexOf(":")?"":e.endsWith(";")?e:`${e};`:""})),e=e.filter((t=>t)),e=Array.from(new Set(e)),e.join(" ")}if(t&&"object"==typeof t){const e=[];return Object.keys(t).forEach((i=>{const o=t[i];if(o||0===o){const t=String(o).trim();t&&e.push(`${c.pascalToKebabCase(i)}: ${t};`)}})),e.join(" ")}return""},getInstance:function(t){if(t){const e=document.getElementById(t);if(e)return a.get(e)}},setInstance:function(t,e){t&&a.set(t,e)},bindEvents:function(t,e){t&&(c.unbindEvents(t),Object.keys(t).forEach((i=>{const o=t[i];o.target=o.target||e,o.target.addEventListener(i,o.handler,o.options)})))},unbindEvents:function(t){t&&Object.keys(t).forEach((e=>{const i=t[e];i.target&&i.target.removeEventListener(e,i.handler,i.options)}))},preventDefault:function(t){t&&"function"==typeof t.preventDefault&&t.cancelable&&t.preventDefault()},debounce:function(t){let e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100;const o=function(){clearTimeout(e),e=setTimeout((()=>{t.apply(this,arguments)}),i)};return o.cancel=()=>{clearTimeout(e)},o},throttle:function(t){let e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,o=0;const n=function(){const n=Date.now();if(n>o+i)return clearTimeout(e),o=n,void t.apply(this,arguments);clearTimeout(e),e=setTimeout((()=>{o=n,t.apply(this,arguments)}),i)};return n.cancel=()=>{clearTimeout(e),o=0},n},microtask:function(t){const e=new h,i=function(){e.start((()=>{t.apply(this,arguments)}))};return i.cancel=()=>{e.cancel()},i},nextTick:function(t){"function"==typeof window.queueMicrotask?window.queueMicrotask((()=>{t()})):Promise.resolve().then((()=>{t()}))},cancelAsync:function(t){t&&(Object.keys(t).filter((e=>e.startsWith("async")&&"function"==typeof t[e])).forEach((e=>{const i=t[e];"function"==typeof i.cancel&&(i.cancel(),t[e]=null)})),Object.keys(t).filter((t=>t.startsWith("timeout"))).forEach((e=>{clearTimeout(t[e])})))}},d=c,u={animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},g=function(t){return null!==t&&1===t.nodeType},f=function(t){let e=t.ownerDocument.defaultView;return e&&e.opener||(e=window),e.getComputedStyle(t)},p={},m=function(t,e){return null!=(i=t)&&i===i.window?t[`inner${e}`]:(function(t){return null!==t&&9===t.nodeType}(t)&&(t=t.body),t[`client${e}`]);var i},b=function(t){return this.list=[],t?this.create(t):this};function w(t){return new b(t)}b.prototype={constructor:b,Query:"Query",list:[],create:function(t){return t instanceof b?t:"string"==typeof t?this.createFromString(t):((t.nodeType||t===window)&&(this.list=[t]),this)},createFromString:function(t){if("<"===(t=t.trim())[0]&&">"===t[t.length-1]&&t.length>=3)this.parseHTML(t);else{const e=document.querySelectorAll(t);for(let t=0,i=e.length;t{this.css(e,t[e])}))}var i;return this.each((function(i){let o=e;"number"!=typeof o||u[t]||(o+="px"),i.style[t]=o})),this},attr:function(t,e){if(!t)return this;if(1===arguments.length){if("object"==typeof t)return Object.keys(t).forEach((e=>{this.attr(e,t[e])})),this;const e=this.get(0);return e?e.getAttribute(t):void 0}return this.each((function(i){i.setAttribute(t,e)})),this},removeAttr:function(t){return t?(this.each((function(e){e.hasAttribute(t)&&e.removeAttribute(t)})),this):this},removeClass:function(t){if(!arguments.length)return this.each((function(t){t.className=""})),this;if(!t||"string"!=typeof t)return this;const e=t.split(" ");return this.each((function(t){e.forEach((function(e){e&&t.classList.remove(e)}))})),this},addClass:function(t){if(!t||"string"!=typeof t)return this;const e=t.split(" ");return this.each((function(t){e.forEach((function(e){e&&t.classList.add(e)}))})),this},hasClass:function(t){if(!t||"string"!=typeof t)return!1;let e=!1;return this.each((function(i){if(i.classList.contains(t))return e=!0,!1})),e},show:function(){return this.each((function(t){if(!g(t))return;const e=function(t){if(!p[t]){const e=document.createElement(t);document.body.appendChild(e);const i=f(e).display;e.parentNode.removeChild(e),p[t]=i}return p[t]}(t.nodeName);t.style.display=e})),this},hide:function(){return this.each((function(t){if(!g(t))return;"none"!==t.style.display&&(t.style.display="none")})),this},click:function(){const t=this.get(0);return t&&"function"==typeof t.click&&t.click(),this},offset:function(){const t={left:0,top:0},e=this.get(0);if(e){const i=e.getBoundingClientRect();t.left=i.left+window.scrollX,t.top=i.top+window.scrollY}return t},clone:function(){const t=new b;return this.each((function(e){if(e&&e.cloneNode){const i=e.cloneNode(!0);t.add(i)}})),t},children:function(){const t=new b;return this.each((function(e){let i=e.firstChild;for(;i;)t.add(i),i=i.nextSibling})),t},parent:function(){const t=this.get(0);return t?new b(t.parentNode):new b},is:function(t){if(!t)return!1;const e=t.split(",");let i=!0;return this.each((function(t){if(!t.nodeName)return i=!1,!1;const o=t.nodeName.toLowerCase();return d.inList(o,e)?void 0:(i=!1,!1)})),i}},Object.defineProperty(b.prototype,"length",{get:function(){return this.list.length}});const v={createCache:function(){this.headerCache=new Map,this.rowsCache=new Map,this.dataCache=new WeakMap,this.cellResizeObserver=this.createResizeObserver((t=>{this.cellResizeHandler(t)}))},setHeaderCache:function(t,e){this.headerCache.set(t,e)},getHeaderCache:function(t){return this.headerCache.get(t)},clearHeaderCache:function(){this.headerCache.clear()},setRowCache:function(t,e){this.rowsCache.set(t,{rowNodes:e,cellNodes:new Map,observerNodes:new Map})},getRowCache:function(t){return this.rowsCache.get(t)},deleteRowCache:function(t){const e=this.getRowCache(t);if(!e)return;this.rowsCache.delete(t);const i=e.observerNodes;i&&i.forEach((t=>{t&&this.cellResizeObserver.unobserve(t)}));const o=e.rowNodes;o&&o.each((t=>{this.removeNode(t)}))},deleteCellCache:function(t,e,i){if(i){const e=i.get(t);e&&this.cellResizeObserver.unobserve(e),i.delete(t)}e&&(this.removeNode(e.get(t)),e.delete(t))},getRowNodesByIndex:function(t){const e=this.getRowCache(t);if(e)return e.rowNodes},getCellNodeByIndex:function(t,e){const i=this.getRowCache(t);if(i)return i.cellNodes.get(e)},forEachRowsCache:function(t){this.rowsCache.forEach(((e,i)=>{t.call(this,i,e.rowNodes,e.cellNodes,e.observerNodes)}))},updateRowCacheTopOffset:function(){const t=this.frozenInfo.row;this.forEachRowsCache(((e,i)=>{if(!(e<=t)&&i){const t=this.getViewRowItem(e),o=this.getViewRowTop(t);i.css("top",o)}}))},updateRowCacheTopAndHeight:function(){this.forEachRowsCache(((t,e)=>{if(e){const i=this.getViewRowItem(t),o=this.getViewRowTop(i),n=this.getRowHeight(i);e.css({top:o,height:n,"line-height":n})}}))},setNodeDataCache:function(t,e){if(t)return this.dataCache.set(t,e)},getNodeDataCache:function(t){if(t)return this.dataCache.get(t)},removeCache:function(){this.headerCache=null,this.rowsCache=null,this.dataCache=null,this.cellResizeObserver&&(this.cellResizeObserver.disconnect(),this.cellResizeObserver=null)}},H=["onUpdated","onFirstUpdated","onHeaderUpdated","onSort","onColumnAdded","onColumnRemoved","onColumnWidthChanged","onRowAdded","onRowRemoved","onRowExpanded","onRowCollapsed","onRowSubsRequest","onRowDragged","onRowDropped","onRowMoved","onRowMouseEnter","onRowMouseLeave","onSelectChanged","onCellUpdated","onCellMouseEnter","onCellMouseLeave","onClick","onDblClick","onContextMenu","onMouseOver","onMouseOut","onTouchStart","onTouchMove","onTouchEnd","onScroll","onScrollStateChanged","onMouseWheel","onResize","onLayout","onKeyDown","onDestroy"],C={};H.forEach((t=>{C[t]=t}));const y=C,R={renderCells:function(t,e){t.forEach((t=>{this.drawRowCells(t,e)}))},getCellValue:function(t,e){return t[e.id]},renderCell:function(t){const{rowItem:e,columnItem:i,cellNode:o,observerNode:n}=t,s=this.getCellValue(e,i);let r=s;this.nullFormatter&&(r=this.nullFormatter.call(this,r,e,i,o,n));const l=e.tg_formatter||i.tg_formatter;"function"==typeof l&&(r=l.call(this,r,e,i,o,n));const h=n||o;this.renderNodeContent(h,r);const{highlightKey:a}=this.options.highlightKeywords;e[a+i.id]&&this.renderSettings.highlightCells.push(o),this.trigger(y.onCellUpdated,{value:s,rowItem:e,columnItem:i,node:o})},getPreRenderColumnList:function(t,e){const i=[];if(!e.length)return i;for(let o=0,n=e.length;o{this.createCellNode(t,e)}))},getCellClass:function(t,e,i){const o=e.tg_view_index,n=["tg-cell"];return i&&n.push("tg-cell-observer"),n.push(`tg-c-${o}`),e.align&&n.push(`tg-align-${e.align}`),0===e.tg_list_index&&n.push("tg-list-first"),e.tg_list_last&&n.push("tg-list-last"),n.push(d.classMap(e.classMap)),n.push(d.classMap(t[`${e.id}ClassMap`])),d.classMap(n)},cellResizeObserverHandler:function(t,e){const i=this.options.cellResizeObserver;if("function"==typeof i)return i.apply(this,[t,e])},cellResizeHandler:function(t){const e=new Map;t.forEach((t=>{const{target:i}=t,o=this.getNodeDataCache(i.parentNode);if(!o)return;const{row:n,rowItem:s}=o;e.set(n,s)}));let i=!1;e.forEach(((t,e)=>{const o=this.getRowCache(e);if(!o)return;const n=o.observerNodes;if(!n)return;const{rowHeight:s,rowMinHeight:r}=this.options;let l=Math.max(r||s,1);n.forEach((t=>{if(t){const e=t.clientHeight+11;e>l&&(l=e)}}));this.getRowHeight(t)!==l&&(t.tg_height=l,i=!0)})),i&&this.render("rows_cache")},createCellNode:function(t,e){const i=this.getRowCache(t);if(!i)return;const o=this.getViewRowItem(t),n=this.getViewColumnItem(e);if(!o||!n)return;const s=this.cellResizeObserverHandler(o,n),r=document.createElement("div");r.setAttribute("column",e);const l=this.getCellClass(o,n,s);r.className=l;const h=d.styleMap(n.styleMap)+d.styleMap(o[`${n.id}StyleMap`]);h&&(r.style.cssText=h);const a=i.rowNodes,c=n.tg_frozen,u=this.getCellRowNode(a,c);let g;this.appendNode(u,r),s&&(g=document.createElement("div"),g.className="tg-observer",r.appendChild(g),this.cellResizeObserver.observe(g),i.observerNodes.set(e,g));const f={row:t,rowItem:o,rowNode:u,column:e,columnItem:n,cellNode:r,observerNode:g};this.setNodeDataCache(r,f),i.cellNodes.set(e,r),this.renderCell(f)},getCellRowNode:function(t,e){const i=t.get(0);if(this.frozenInfo.columns){const o=t.get(1);return this.frozenInfo.right?e?o:i:e?i:o}return i}},S={addColumn:function(t,e,i){let o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getColumnItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.columns),l=[this.getToBeAddedPositionIndex(i,r),0].concat(n);r.splice.apply(r,l),this.onNextUpdated((function(){this.trigger(y.onColumnAdded,n)}));const h={type:"columns"};return o&&(h.scrollColumn=n[n.length-1]),this.render(h),!0},deleteColumn:function(t){const e=this.toColumnItemList(t,(t=>!t.private));return!!e.length&&(this.removeColumnsHandler(e),this.onNextUpdated((function(){this.trigger(y.onColumnRemoved,e)})),this.render("columns"),!0)},removeColumnsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index})),e.forEach((t=>{let e;if(t===this.sortColumn&&this.removeSortColumn(),t.tg_parent)e=t.tg_parent.subs,e.splice(t.tg_sub_index,1);else{e=this.columns;const i=e.findIndex((e=>e===t));-1!==i&&e.splice(i,1)}!e.length&&t.tg_parent&&(t.tg_parent.subs=null)}))}},T={setColumnWidth:function(t,e){return this.updateColumnWidth(t,e)?(this.resize(),this):this},updateColumnWidth:function(t,e){const i=this.getColumnItem(t);return!!i&&(!!d.isNum(e)&&(e=Math.round(e),e=Math.max(0,e),i.tg_width!==e&&(i.width=e,i.minWidth=Math.min(i.minWidth,e),i.maxWidth=Math.max(i.maxWidth,e),this.updateViewColumnWidth(i),!0)))},showColumn:function(t){return this.updateColumnsInvisible(this.toColumnItemList(t),!1)},hideColumn:function(t){return this.updateColumnsInvisible(this.toColumnItemList(t),!0)},updateColumnsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.render("columns"),!0)}},E={showColumnLine:function(t){t&&(this.$columnLineContainer.show(),this.renderColumnLine(t))},hideColumnLine:function(){this.previousColumnLineActive||this.$columnLineContainer.hide()},setColumnLineActive:function(t){this.setTextSelectable(!t),this.rowHoverable=!t,t!==this.previousColumnLineActive&&(this.previousColumnLineActive=t,t?this.$columnLineItem.addClass("tg-active"):this.$columnLineItem.removeClass("tg-active"))},getColumnLineLeft:function(t){let e=t.tg_left;return t.tg_frozen||(e-=this.scrollLeft),this.frozenInfo.right&&(t.tg_frozen?e=t.tg_left+this.paneWidthL:e-=this.columnsWidthR),e},renderColumnLine:function(t){const e=this.getHeaderItemNode(t).offsetTop,i=t.tg_width,o=this.getColumnLineLeft(t);this.$columnLineItemL.css({top:e,left:o}),this.$columnLineItemR.css({top:e,left:o+i-1}),this.frozenInfo.right||(this.frozenInfo.columns&&!t.tg_frozen&&o{this.renderColumnLine(e.columnItem)})),this.resize()},columnWidthTouchStartHandler:function(t,e){d.preventDefault(e.e);const i=e.columnItem;this.showColumnLine(i),this.setColumnLineActive(!0),e.index=i.tg_index;const o=this.getColumnHeaderNode(i);e.width=o.clientWidth},columnWidthTouchMoveHandler:function(t,e){d.preventDefault(e.e);const i=e.columnItem;let o=e.width+e.offsetX;o=d.clamp(o,i.minWidth,i.maxWidth),i.tg_width!==o&&(i.width=o,this.updateViewColumnWidth(i),this.renderColumnLine(i))},columnWidthTouchEndHandler:function(t,e){d.preventDefault(e.e),this.setColumnLineActive(!1),this.hideColumnLine(),this.resize()}},I={getColumnItem:function(t){return d.isNum(t)?(t<0&&(t=this.columnsInfo.length+t),this.columnsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getColumnItemById(t.id||t):void 0},getColumnItemById:function(t){return this.getColumnItemBy("id",t)},getColumnItemBy:function(t,e){if(void 0!==e)return this.columnsInfo.indexCache.find((i=>i[t]===e))},getColumnsLength:function(t){return t?this.columnsInfo.length:this.viewColumns.length},getViewColumnItem:function(t){return this.viewAllColumns[t]},isColumnSortable:function(t){return!!t&&(!t.tg_group&&(!(!t.name||!t.id)&&this.isSortable(t)))},isColumnResizable:function(t){return!!t&&(!t.tg_group&&(!d.hasOwn(t,"resizable")||Boolean(t.resizable)))},updateViewColumnWidth:function(t){return t.tg_width=t.width,this.updateColumnHeaderSize(t),this.updateTotalColumnsWidth(),this.updateHeaderLayerHeight(),this.cssRulesInvalid=!0,this.resizeBodyHandler(),this.trigger(y.onColumnWidthChanged,t),!0},updateTotalColumnsWidth:function(){this.blankColumn.tg_width=0;const t=this.viewColumns;let e=0,i=0;const o=this.frozenInfo.columns,n=t.length;let s=0;for(let r=0;r0&&(s+=l,o&&r>=o?i+=l:e+=l)}if(this.frozenInfo.right){const t=e;e=i,i=t}this.columnsWidthL=e,this.columnsWidthR=i,this.columnsWidth=e+i},updateColumnHeaderSize:function(t){this.updateColumnHeaderWidth(t),this.updateColumnHeaderHeight(t,!0),this.updateColumnGroupWidth(t)},updateColumnHeaderWidth:function(t){const e=this.getColumnHeaderNode(t);if(!e)return;const i=t.tg_width;this.isInvisible(t)||i<=0?e.style.display="none":(e.style.display="",e.style.width=`${i}px`)},updateColumnHeaderHeight:function(t,e){if(t.tg_height=0,t.tg_width<=0)return;if(this.isInvisible(t))return;e&&(t.tg_element_height=0);const i=t.tg_element_height;if(i)return void(t.tg_height=i);const o=this.getColumnHeaderHeight(t);t.tg_height=o,t.tg_element_height=o},getColumnHeaderHeight:function(t){const e=this.getColumnHeaderNode(t);return e?e.clientHeight:0},updateColumnGroupWidth:function(t){const e=t.tg_parent;if(!e)return;const i=this.getColumnGroupWidth(e);e.tg_width!==i&&(e.tg_width=i,this.updateColumnHeaderSize(e))},getColumnGroupWidth:function(t){if(this.isInvisible(t))return 0;let e=0;return t.subs&&t.subs.forEach((t=>{this.isInvisible(t)||d.isNum(t.tg_width)&&(e+=t.tg_width)})),e}},L={initTreeInfo:function(t,e){const i=[];let o=!1,n=0,s=0;const r=function(t,r,l){(t=>{t.invisible?t.tg_invisible=!0:t.tg_invisible&&(t.tg_invisible=!1)})(t),((t,i)=>{if(e>=0&&!t.tg_invisible)return t.tg_frozen=!0,void(e-=1);t.tg_frozen&&(t.tg_frozen=!1)})(t),(t=>{if(d.hasOwn(t,"subs")){if(Array.isArray(t.subs))return o=!0,t.tg_group=!0,void(t.tg_subs_length=t.subs.length);t.subs=null}t.tg_group&&(t.tg_group=!1)})(t),((t,e)=>{t.tg_parent=e;let i=0;e&&(i=e.tg_level+1,i>n&&(n=i)),t.tg_level=i})(t,l),t.tg_index=s,t.tg_sub_index=r,i.push(t),s+=1},l=function(t,e){let i=0;const o=t.length;for(;i{if(!this.isInvisible(e))return this.isRowSelectable(e)?t(e,i,o):void 0})),this},toRowItemList:function(t,e){let i=d.toList(t).map((t=>this.getRowItem(t))).filter((t=>t));return"function"==typeof e&&(i=i.filter(e)),i},toColumnItemList:function(t,e){let i=d.toList(t).map((t=>this.getColumnItem(t))).filter((t=>t));return"function"==typeof e&&(i=i.filter(e)),i},isRowLeaf:function(t){return!!t&&("blank"!==t.formatter&&(!t.tg_frozen&&!t.tg_group))},isRowSelectable:function(t){return!!t&&(d.hasOwn(t,"selectable")?Boolean(t.selectable):this.isRowLeaf(t))},isEmptyGroup:function(t){return!(!t||!t.tg_group||0!==t.tg_subs_length)},isInvisible:function(t){return!!t&&(!(!t.tg_filtered&&!t.tg_invisible)||!!this.isInvisible(t.tg_parent))},isSortable:function(t){return!!t&&(!d.hasOwn(t,"sortable")||Boolean(t.sortable))},isCollapsedChanged:function(t,e){return Boolean(t.collapsed)!==e},isSelectedChanged:function(t,e){return Boolean(t.selected)!==e}},x={updateCssRules:function(){this.cssRulesInvalid&&(this.cssRulesInvalid=!1,this.initCssRules(),this.updateColumnsCssRules(),this.updateHeadersCssRules(),this.updateStyleElement())},initCssRules:function(){this.removeCssRules(),this.cssList={},this.cssDisplayCache={};const t=this.getRowHeight(),e=this.createCssRule(".tg-row");e.height=`${t}px`,e["line-height"]=`${t}px`},resetCssDisplay:function(t){if(this.cssDisplayCache){t=t||"";for(const e in this.cssDisplayCache)if(d.hasOwn(this.cssDisplayCache,e)){this.cssDisplayCache[e].style.display=t}}},updateColumnsCssRules:function(){const t=this.viewColumns,e=this.frozenInfo.column,i={};let o=0;for(let n=0,s=t.length;n=0;i--){const e=this.headerLayerHeight[i],o=this.createCssRule(`.tg-h-${i}`);o.bottom=`${t}px`,o.height=`${e}px`,t+=e}this.getLayerCombinations(e).forEach((t=>{const e=this.createCssRule(`.tg-h-${t}`);let i=0;t.split("").forEach((t=>{i+=this.headerLayerHeight[t]||0})),e.height=`${i}px`}))},getLayerCombinations:function(t){let e="";for(;t>=0;)e+=t,t--;if(e.length<2)return[];const i=[],o=function(t,e){const n=t.length;let s=e+2;for(;s<=n;){const o=t.substring(e,s);i.push(o),s++}e=i){let t="Possible Event memory leak detected. ";return t+=`More than ${i} (max limit) listeners added. `,t+="Use setMaxListeners(n) to increase limit.",void console.warn(t,e)}t.events.push(e)},addEvents:function(t,e,i){e.forEach((function(e){const o=e.type;t[o]||(t[o]={events:[]});if("function"!=typeof e.handler)return;const n=t[o];N.addEvent(n,e,i)}))},removeEventByNamespace:function(t,e){Object.keys(t).forEach((function(i){const o=t[i],n=[];o.events.forEach((function(t){t&&t.namespace!==e&&n.push(t)})),o.events=n}))},removeEventByHandler:function(t,e,i){const o=t[e];if(!o)return;const n=[];o.events.forEach((function(t){t&&t.handler!==i&&n.push(t)})),o.events=n},removeEventByType:function(t,e){const i=t[e];i&&(i.events=[])},removeEvent:function(t,e){const i=e.type,o=e.namespace;if(!i&&o)return void N.removeEventByNamespace(t,o);const n=e.handler;"function"!=typeof n?N.removeEventByType(t,i):N.removeEventByHandler(t,i,n)},removeEvents:function(t,e){e.forEach((function(e){N.removeEvent(t,e)}))},removeAllEvents:function(t){Object.keys(t).forEach((function(e){N.removeEventByType(t,e)}))},sendEventList:function(t,e,i,o){const n=e.events;for(let e=0;e!t.onceCalled))},sendEvent:function(t,e,i,o){const n=e[i];if(!n)return;const s=new P({type:i,target:t,currentTarget:t,data:o});N.sendEventList(t,n,s,o)}},_=N;class k{maxListeners=10;setMaxListeners(t){this.maxListeners=Number(t)||10}getMaxListeners(){return this.maxListeners}getEventListeners(){return this.eventListeners||(this.eventListeners={}),this.eventListeners}delEventListeners(){this.eventListeners=null}bind(t,e,i){const o=_.getEventList(this,t,e,i);if(!o.length)return this;const n=this.getEventListeners();return _.addEvents(n,o,this.maxListeners),this}once(t,e){return this.bind(t,e,{once:!0})}unbind(t,e,i){const o=this.getEventListeners();if(!arguments.length)return _.removeAllEvents(o),this;const n=_.getEventList(this,t,e,i);return n.length?(_.removeEvents(o,n),this):this}trigger(t,e){const i=this.getEventListeners();return _.sendEvent(this,i,t,e),this}}const V={DRAG_START:"drag_start",DRAG_MOVE:"drag_move",DRAG_END:"drag_end"};class O extends k{static EVENT=V;generateOptions(t){return d.merge({type:"mouse",startX:0,startY:0,previousX:0,previousY:0,currentX:0,currentY:0,moveX:0,moveY:0,offsetX:0,offsetY:0,changed:!1},t)}start(t,e){t&&(this.unbindEvents(),this.bindEvents(),this.options=this.generateOptions(e),this.startHandler(t))}bindEvents(){this.windowEvents={mousemove:{handler:t=>{this.iframeHandler(t),this.mouseMoveHandler(t)},options:!0},mouseup:{handler:t=>{this.mouseUpHandler(t)},options:{once:!0}}},d.bindEvents(this.windowEvents,window)}unbindEvents(){d.unbindEvents(this.windowEvents),this.windowEvents=null,this.previousIframe&&(this.previousIframe.classList.remove("tg-pointer-events-none"),this.previousIframe=null)}iframeHandler(t){const e=t.target;"IFRAME"===e.nodeName&&e!==this.previousIframe&&(this.previousIframe&&this.previousIframe.classList.remove("tg-pointer-events-none"),e.classList.add("tg-pointer-events-none"),this.previousIframe=e)}startHandler(t){const e=this.options;e.e=t,e.startX=t.pageX,e.startY=t.pageY,e.currentX=e.startX,e.currentY=e.startY,this.hasMoved=!1}mouseMoveHandler(t){d.preventDefault(t);const e=this.options;e.e=t,e.previousX=e.currentX,e.previousY=e.currentY,e.currentX=t.pageX,e.currentY=t.pageY,e.moveX=e.currentX-e.previousX,e.moveY=e.currentY-e.previousY,e.offsetX=e.currentX-e.startX,e.offsetY=e.currentY-e.startY,e.changed=!(0===e.offsetX&&0===e.offsetY),this.hasMoved?this.trigger(V.DRAG_MOVE,e):(this.hasMoved=!0,this.trigger(V.DRAG_START,e))}mouseUpHandler(t){this.unbindEvents();const e=this.options;this.hasMoved&&(e.e=t,d.preventDefault(t),this.trigger(V.DRAG_END,e))}destroy(){this.unbindEvents(),this.unbind()}}const $={Linear:{None:function(t){return t}}},D={MOTION_START:"motion_start",MOTION_MOVE:"motion_move",MOTION_END:"motion_end",MOTION_STOP:"motion_stop"};class B extends k{static EVENT=D;constructor(t){super(),this.constructorOptions=t,this.stopped=!0}generateOptions(t){return d.merge({easing:null,duration:100,from:0,till:1,data:0},this.constructorOptions,t)}stop(){return this.stopped||(this.stopped=!0,this.cancelAnimationFrame(),this.trigger(D.MOTION_STOP,this.data)),this}start(t){return this.stop(),this.stopped=!1,this.options=this.generateOptions(t),this.initCalculation(),this.data=this.calculateHandler(0),this.trigger(D.MOTION_START,this.data),this.stopped||(this.time=Date.now(),this.requestAnimationFrame(this.moveHandler)),this}requestAnimationFrame(t){this.requestId=window.requestAnimationFrame((()=>{t.apply(this)}))}cancelAnimationFrame(){window.cancelAnimationFrame(this.requestId)}getEasing(t){return"function"!=typeof t&&(t=d.getValue($,t,$.Linear.None)),t}moveHandler(){const t=Date.now()-this.time,e=this.duration;if(t{o[n]=this.calculateNumber(t,e[n],i[n])})),o):(this.calculateKeys=[],Object.keys(e).forEach((n=>{const s=e[n],r=i[n];d.isNum(s)&&d.isNum(r)&&(o[n]=this.calculateNumber(t,s,r),this.calculateKeys.push(n))})),o)}calculateNumber(t,e,i){return(i-e)*t+e}calculateNone(t,e,i){return e}destroy(){this.stop(),this.unbind()}}const A={TOUCH_START:"touch_start",TOUCH_MOVE:"touch_move",TOUCH_END:"touch_end",TOUCH_INERTIA:"touch_inertia"};class W extends k{static EVENT=A;generateOptions(t){return d.merge({type:"touch",startX:0,startY:0,previousX:0,previousY:0,currentX:0,currentY:0,moveX:0,moveY:0,offsetX:0,offsetY:0,changed:!1,touchLength:0,direction:"",inertia:!1,inertiaTime:200},t)}start(t,e){t&&(this.unbindEvents(),this.bindEvents(),this.options=this.generateOptions(e),this.startHandler(t))}bindEvents(){this.touchEvents={touchmove:{handler:t=>{this.touchMoveHandler(t)},options:{passive:!1}},touchend:{handler:t=>{this.touchEndHandler(t)},options:{passive:!1,once:!0}},touchcancel:{handler:t=>{this.touchCancelHandler(t)},options:{passive:!1,once:!0}}},d.bindEvents(this.touchEvents,document.body)}unbindEvents(){this.motionStop(),d.unbindEvents(this.touchEvents),this.touchEvents=null}startHandler(t){this.trackingPoints=[];const e=t.touches,i=e[0];if(!i)return;const o=this.options;o.e=t,o.startX=i.clientX,o.startY=i.clientY,o.currentX=o.startX,o.currentY=o.startY,o.touchLength=e.length,this.addTrackingPoint(o),this.trigger(A.TOUCH_START,o)}touchMoveHandler(t){const e=t.touches,i=e[0];if(!i)return;const o=this.options;o.e=t,o.previousX=o.currentX,o.previousY=o.currentY,o.currentX=i.clientX,o.currentY=i.clientY,o.moveX=o.currentX-o.previousX,o.moveY=o.currentY-o.previousY,o.offsetX=o.currentX-o.startX,o.offsetY=o.currentY-o.startY,o.changed=!(0===o.offsetX&&0===o.offsetY),o.touchLength=e.length,o.direction=this.getDirection(o),this.addTrackingPoint(o),this.trigger(A.TOUCH_MOVE,o)}touchEndHandler(t){this.unbindEvents();const e=this.options;e.e=t,this.trigger(A.TOUCH_END,e);const i=t.changedTouches[0];if(!i)return;const o=t.touches;e.touchLength=o.length,e.touchLength>0||(e.currentX=i.clientX,e.currentY=i.clientY,this.addTrackingPoint(e),this.motionStart())}touchCancelHandler(t){this.unbindEvents(),this.trigger(A.TOUCH_END,this.options)}getMotionInfo(){const t=this.trackingPoints;if(t.length<2)return;if(this.filterTrackingPoints(t),t.length<2)return;const e=t[0],i=t[t.length-1],o=i.t-e.t;if(o<=0)return;let n=i.x-e.x,s=i.y-e.y;const r=Math.abs(n),l=Math.abs(s);r>l?s=0:n=0;return{offsetDistance:Math.max(r,l),offsetTime:o,offsetX:n,offsetY:s}}motionStart(){const t=this.options;if(!t.inertia)return;const e=this.getMotionInfo();if(!e)return;const i=500*e.offsetDistance/50,o=d.clamp(i,20,2e3),n={x:20*(e.offsetX/e.offsetTime),y:20*(e.offsetY/e.offsetTime)};this.motion=new B,this.motion.bind(B.EVENT.MOTION_MOVE,((e,i)=>{t.touchInertiaX=i.x,t.touchInertiaY=i.y,this.trigger(A.TOUCH_INERTIA,t)})),this.motion.start({duration:o,from:n,till:{x:0,y:0}})}motionStop(){this.motion&&(this.motion.destroy(),this.motion=null)}getDirection(t){const i=t.offsetX,o=t.offsetY,n=Math.abs(i),s=Math.abs(o);if(n0)return e.UP;if(o<0)return e.DOWN}if(n>s){if(i>0)return e.LEFT;if(i<0)return e.RIGHT}return""}filterTrackingPoints(t){t.reverse();const e=t.length,i=Date.now(),o=this.options.inertiaTime;for(let n=0;no){t.length=n;break}t.reverse()}addTrackingPoint(t){if(!t.inertia)return;const e=t.currentX,i=t.currentY,o=Date.now(),n=this.trackingPoints;n.push({x:e,y:i,t:o}),n.length>100&&this.filterTrackingPoints(n)}destroy(){this.unbindEvents(),this.unbind()}}const F={getAllEvents:function(){return[].concat(H)},bindEvents:function(){this.unbindEvents(),this.containerEvents={mousedown:{handler:t=>{this.containerMouseDownHandler(t)},options:!0},mousemove:{handler:t=>{this.containerMouseMoveHandler(t)},options:!0},mouseover:{handler:t=>{this.containerMouseOverOutHandler(t,!0)},options:!0},mouseout:{handler:t=>{this.containerMouseOverOutHandler(t,!1)},options:!0},mouseenter:{handler:t=>{this.containerMouseEnterLeaveHandler(t,!0)},options:!0},mouseleave:{handler:t=>{this.containerMouseEnterLeaveHandler(t,!1)},options:!0},touchstart:{handler:t=>{this.containerTouchStartHandler(t)},options:{passive:!1}},touchmove:{handler:t=>{this.containerTouchMoveHandler(t)},options:{passive:!1}},touchend:{handler:t=>{this.containerTouchEndHandler(t)},options:{passive:!1}},touchcancel:{handler:t=>{this.containerTouchCancelHandler(t)},options:{passive:!1}},wheel:{handler:t=>{this.containerWheelHandler(t)},options:{passive:!1}},click:{handler:t=>{this.containerClickHandler(t)},options:!0},dblclick:{handler:t=>{this.containerDblClickHandler(t)},options:!0},contextmenu:{handler:t=>{this.containerContextMenuHandler(t)},options:!0},selectstart:{handler:t=>{this.containerSelectStartHandler(t)},options:!0},keydown:{handler:t=>{this.containerKeyDownHandler(t)},options:!0}},d.bindEvents(this.containerEvents,this.container),this.columnWidthDrag=new O,this.columnWidthDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.columnWidthDragStartHandler(t,e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.columnWidthDragMoveHandler(t,e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.columnWidthDragEndHandler(t,e)})),this.columnWidthTouch=new W,this.columnWidthTouch.bind(W.EVENT.TOUCH_START,((t,e)=>{this.columnWidthTouchStartHandler(t,e)})).bind(W.EVENT.TOUCH_MOVE,((t,e)=>{this.columnWidthTouchMoveHandler(t,e)})).bind(W.EVENT.TOUCH_END,((t,e)=>{this.columnWidthTouchEndHandler(t,e)})),this.rowDrag=new O,this.rowDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.rowDragStartHandler(t,e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.rowDragMoveHandler(t,e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.rowDragEndHandler(t,e)})),this.rowTouch=new W,this.rowTouch.bind(W.EVENT.TOUCH_START,((t,e)=>{this.rowDragStartHandler(t,e)})).bind(W.EVENT.TOUCH_MOVE,((t,e)=>{this.rowDragMoveHandler(t,e)})).bind(W.EVENT.TOUCH_END,((t,e)=>{this.rowDragEndHandler(t,e)})),this.scrollTouch=new W,this.scrollTouch.bind(W.EVENT.TOUCH_START,((t,e)=>{this.scrollTouchStartHandler(t,e)})).bind(W.EVENT.TOUCH_MOVE,((t,e)=>{this.scrollTouchMoveHandler(t,e)})).bind(W.EVENT.TOUCH_END,((t,e)=>{this.scrollTouchEndHandler(t,e)})).bind(W.EVENT.TOUCH_INERTIA,((t,e)=>{this.scrollTouchInertiaHandler(t,e)}))},isDefaultPrevented:function(t){if(t){if(t.defaultPrevented)return!0;if(t.e&&t.e.defaultPrevented)return!0}return!1},getEventClosestNode:function(t,e){if(t&&t!==this.container)return t.classList.contains(e)?t:this.getEventClosestNode(t.parentNode,e)},getEventClosestData:function(t){if(!t||t===this.container)return;const e=this.getNodeDataCache(t);return e||this.getEventClosestData(t.parentNode)},getEventData:function(t){const e=this.getEventClosestData(t.target);if(e)return e.e=t,e},getWheelDelta:function(t,e,i){let o=t.deltaX,n=t.deltaY;return d.isNum(o)||(o=d.toNum(t.wheelDeltaX)),d.isNum(n)||(n=d.toNum(t.wheelDeltaY||t.wheelDelta)),1===t.deltaMode?(n*=e,o*=e):2===t.deltaMode&&(n*=i,o*=i),{deltaX:o,deltaY:n}},columnResizingMouseDownHandler:function(t){const e=this.getEventData(t);e&&this.columnWidthDrag.start(t,{columnItem:e.columnItem})},columnResizingTouchStartHandler:function(t){const e=this.getEventData(t);e&&this.columnWidthTouch.start(t,{columnItem:e.columnItem})},columnResizingMouseEnterLeaveHandler:function(t,e){const i=this.getEventData(t);i&&(e?this.showColumnLine(i.columnItem):this.hideColumnLine())},rowDragMouseDownHandler:function(t){const e=this.getEventData(t);e&&this.rowDrag.start(t,{rowItem:e.rowItem})},rowDragTouchStartHandler:function(t){const e=this.getEventData(t);e&&(this.protectedItem=e,this.rowTouch.start(t,{rowItem:e.rowItem}))},scrollPaneTouchStartHandler:function(t){if(!this.hasHScroll&&!this.hasVScroll)return;const e=this.getEventData(t);this.protectedItem=e,this.scrollTouch.start(t,{inertia:!0})},sortHandler:function(t,e){const i=e.columnItem;if(!this.isColumnSortable(i))return;const o=this.getEventClosestNode(t.target,"tg-column-name"),n=this.getEventClosestNode(t.target,"tg-column-sort");(o||n)&&(this.trigger(y.onSort,e),this.isDefaultPrevented(e)||this.setSortColumn(i))},selectIconAllClickHandler:function(t){const e=w(t);let i=!1;(e.hasClass("tg-selected")||e.hasClass("tg-mixed"))&&(i=!0),i=!i,this.selectAll(i)},cellEnterLeaveHandler:function(t,e){const i=this.getEventData(t);i&&(e?this.trigger(y.onCellMouseEnter,i):this.trigger(y.onCellMouseLeave,i))},rowEnterLeaveHandler:function(t,e){const i=this.getEventData(t);if(i&&(e?this.trigger(y.onRowMouseEnter,i):this.trigger(y.onRowMouseLeave,i),!this.isDefaultPrevented(i)))return this.renderRowHover(i.rowItem,e),this},containerMouseDownHandler:function(t){if(this.getEventClosestNode(t.target,"tg-column-resizing"))this.columnResizingMouseDownHandler(t);else if(this.options.rowDragVisible){this.getEventClosestNode(t.target,"tg-row-drag-icon")&&this.rowDragMouseDownHandler(t)}},containerMouseMoveHandler:function(t){this.scrollbarFadeInOutHandler(t,!0)},containerMouseOverOutHandler:function(t,e){const i=this.getEventClosestNode(t.target,"tg-cell"),o=this.getEventClosestNode(t.target,"tg-header-item");if(i||o){const i=this.getEventData(t);if(!i)return;e?this.trigger(y.onMouseOver,i):this.trigger(y.onMouseOut,i)}},containerMouseEnterLeaveHandler:function(t,e){this.scrollbarFadeInOutHandler(t,e);if(w(t.target).hasClass("tg-column-resizing"))return void this.columnResizingMouseEnterLeaveHandler(t,e);if(w(t.target).hasClass("tg-cell"))return void this.cellEnterLeaveHandler(t,e);w(t.target).hasClass("tg-row")&&this.rowEnterLeaveHandler(t,e)},containerTouchStartHandler:function(t){this.scrollTouch.motionStop();if(this.getEventClosestNode(t.target,"tg-column-resizing"))return void this.columnResizingTouchStartHandler(t);if(this.options.rowDragVisible){if(this.getEventClosestNode(t.target,"tg-row-drag-icon"))return void this.rowDragTouchStartHandler(t)}const e=this.getEventData(t);e&&(this.trigger(y.onTouchStart,e),this.isDefaultPrevented(e))||this.scrollPaneTouchStartHandler(t)},containerTouchMoveHandler:function(t){const e=this.getEventData(t);e&&this.trigger(y.onTouchMove,e)},containerTouchEndHandler:function(t){const e=this.getEventData(t);e&&this.trigger(y.onTouchEnd,e)},containerTouchCancelHandler:function(t){this.trigger(y.onTouchEnd,{e:t})},containerWheelHandler:function(t){if(this.hasMask)return;const e=this.getRowHeight(),i=this.bodyHeight,o=this.getWheelDelta(t,e,i),n={e:t,deltaX:o.deltaX,deltaY:o.deltaY,delta:o};if(this.trigger(y.onMouseWheel,n),this.isDefaultPrevented(n))return;let s=!1;this.scrollPaneHidden&&(s=this.scrollPaneFrozen.setOffsetH(o.deltaX),o.deltaX=0);(this.scrollPane.mouseWheelHandler(o)||s)&&d.preventDefault(t)},containerClickHandler:function(t){if(this.getEventClosestNode(t.target,"tg-tree-icon-all"))return void this.toggleAllRows();const e=this.getEventClosestNode(t.target,"tg-select-icon-all");if(e)return void this.selectIconAllClickHandler(e);const i=this.getEventData(t);if(!i)return;if(this.getEventClosestNode(t.target,"tg-header-item")){if(this.trigger(y.onClick,i),this.isDefaultPrevented(i))return;return void this.sortHandler(t,i)}if(this.getEventClosestNode(t.target,"tg-tree-icon"))return void this.toggleRow(i.rowItem);this.getEventClosestNode(t.target,"tg-select-icon")?this.setRowSelected(i.rowItem,t):this.trigger(y.onClick,i)},containerDblClickHandler:function(t){const e=this.getEventData(t)||{e:t};this.trigger(y.onDblClick,e)},containerContextMenuHandler:function(t){const e=this.getEventData(t)||{e:t};this.trigger(y.onContextMenu,e)},containerSelectStartHandler:function(t){if(this.options.textSelectable)return;w(t.target).is("input,textarea,code")||d.preventDefault(t)},containerKeyDownHandler:function(t){if(this.hasMask)return;const e={e:t};if(this.trigger(y.onKeyDown,e),this.isDefaultPrevented(e))return;const i=t.keyCode,o={9:this.keyTabHandler,13:this.keyEnterHandler,27:this.keyEscHandler,33:this.keyPageUpHandler,34:this.keyPageDownHandler,35:this.keyEndHandler,36:this.keyHomeHandler,37:this.keyLeftHandler,38:this.keyUpHandler,39:this.keyRightHandler,40:this.keyDownHandler}[i];if(!o)return;o.call(this,t)&&d.preventDefault(t)},unbindEvents:function(){d.unbindEvents(this.containerEvents),this.containerEvents=null,this.columnWidthDrag&&(this.columnWidthDrag.destroy(),this.columnWidthDrag=null),this.columnWidthTouch&&(this.columnWidthTouch.destroy(),this.columnWidthTouch=null),this.rowDrag&&(this.rowDrag.destroy(),this.rowDrag=null),this.rowTouch&&(this.rowTouch.destroy(),this.rowTouch=null),this.scrollTouch&&(this.scrollTouch.destroy(),this.scrollTouch=null),this.protectedItem=null}},G={exportData:function(t){const e=this.getData();return{columns:this.getTreeSnapshot(e.columns,t),rows:this.getTreeSnapshot(e.rows,t)}},isItemExportable:function(t){return!!t&&(!d.hasOwn(t,"exportable")||Boolean(t.exportable))},getTreeSnapshot:function(t,e){const i=(t,o)=>{d.isList(o)&&o.forEach((o=>{if(!this.isItemExportable(o))return;const n=this.getItemSnapshot(o,e),s=o.subs;Array.isArray(s)&&(n.subs=[],i(n.subs,s)),t.push(n)}))},o=[];return i(o,t),o},getItemSnapshot:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i={};return Object.keys(t).forEach((o=>{!0!==e[o]?!1!==e[o]&&"subs"!==o&&0!==o.indexOf("tg_")&&(i[o]=t[o]):i[o]=t[o]})),i}},j={flushRow:function(t){d.toList(t).forEach((t=>{this.deleteRowCache(t)}))},flushRowFrom:function(t){d.isNum(t)&&(0!==t?this.forEachRowsCache((e=>{e>=t&&this.deleteRowCache(e)})):this.flushBody())},flushBody:function(){this.forEachRowsCache((t=>{this.deleteRowCache(t)}))},flushSort:function(){this.frozenInfo.rows?this.flushRowFrom(this.frozenInfo.rows):this.flushBody()},flushColumn:function(t){const e=d.toList(t);this.forEachRowsCache(((t,i,o,n)=>{e.forEach((t=>{this.deleteCellCache(t,o,n)}))}))},flushColumnFrom:function(t){d.isNum(t)&&this.forEachRowsCache(((e,i,o,n)=>{o.forEach(((e,i)=>{i>=t&&this.deleteCellCache(i,o,n)}))}))},flushCell:function(t,e){const i=d.toList(t),o=d.toList(e);i.forEach((t=>{const e=this.getRowCache(t);if(!e)return;const i=e.cellNodes,n=e.observerNodes;o.forEach((t=>{this.deleteCellCache(t,i,n)}))}))},flushWithViewport:function(){const{rows:t,columns:e}=this.viewport;this.forEachRowsCache(((i,o,n,s)=>{t.includes(i)?n.forEach(((t,i)=>{e.includes(i)||this.deleteCellCache(i,n,s)})):this.deleteRowCache(i)}))}},U={"sort-h":'\n\n \n \n \n \n\n',"sort-v":'\n\n \n \n \n \n\n',checkbox:'\n\n \n \n \n\n',radio:'
    ',drag:'\n\n \n\n',tree:'\n\n \n \n\n'},X={icons:U,getIcon:function(t){let e=U[t];return e=String(e).trim(),e}},Y={header:function(t,e,i,o){return t},null:function(t,e,i,o){return e&&e.tg_group?t:null==t?"—":t},blank:function(t,e,i,o){return""},string:function(t,e,i,o){return t},number:function(t,e,i,o){return t},icon:function(t,e,i,o){return`${t}`},select:function(t,e,i,o){return this.isRowSelectable(e)?this.getSelectFormatterContent(e):""},rowDrag:function(t,e,i,o){return this.getRowDragFormatterContent(e)},rowNumber:function(t,e,i,o){return e.tg_row_number||""},tree:function(t,e,i,o){return this.getTreeFormatterContent(t,e)}},K={setFormatter:function(t,e){this.renderType="all";let i=t;if("string"==typeof t){if(this.formatters)return this.formatters[t]=e,this;i={},i[t]=e}return this.customFormatters=i,this},getFormatter:function(t){if(!t)return;const e=this.formatters[t];return"function"==typeof e?e.bind(this):void 0},getDefaultFormatter:function(t){return(Y[t]||Y.string).bind(this)},getSelectFormatterContent:function(t){let e="radio";this.options.selectMultiple&&(e="checkbox");const i=X.getIcon(e);return`
    ${i}
    `},getRowDragFormatterContent:function(t){if(t.tg_frozen)return"";return`
    ${X.getIcon("drag")}
    `},getTreeIndentWidth:function(t,i,o){if(!t)return 0;let n=5;return i||(n+=e.TREE_INDENT),n+=o*e.TREE_INDENT,n},getTreeFormatterContent:function(t,e){const i=this.rowsInfo.isTree,o=e.tg_group,n=this.isEmptyGroup(e);n&&(e.collapsed=!0);const s=e.collapsed,r=d.toNum(e.tg_level),l=this.getTreeIndentWidth(i,o,r),h=[];if(h.push(`
    `),o){const t={"tg-tree-icon":!0,"tg-tree-icon-collapsed":s,"tg-tree-icon-expanded":!s,"tg-tree-icon-empty":n},e=X.getIcon("tree"),i=`
    ${e}
    `;h.push(i)}return h.push(`
    ${t}
    `),h.push("
    "),h.join("")}},q={renderHeaderTables:function(){this.clearHeaderCache();const t=this.viewColumns,e=this.frozenInfo.columns;this.hasTreeColumn=!1,this.hasSortColumn=!1;let i=[],o=[];for(let n=0,s=t.length;n=e?o.push(s):i.push(s)}if(this.frozenInfo.right){const t=i;i=o,o=t}this.renderHeaderTable(i,this.$headerL),this.renderHeaderTable(o,this.$headerR)},renderHeaderTable:function(t,e){const i=document.createElement("div"),o=["tg-header-table"];this.hasSortColumn&&(o.push("tg-header-sortable"),o.push(`tg-header-sort-${this.options.sortIndicator}`)),i.className=d.classMap(o);const n=t.length;if(n){let e=t[n-1];e&&"tg-column-blank"===e.id&&(e=t[n-2]),t.forEach((t=>{this.renderHeaderItem(t,i,e)}))}e.append(i)},renderHeaderItem:function(t,e,i){const o=t.tg_view_index;if(this.getHeaderCache(o))return;const n=this.getHeaderItemClass(t,i),s=d.styleMap(t.headerStyleMap),r={column:o,class:n,data:t.id};s&&(r.style=s);const l=[this.createColumnHeader(t)];if(this.isColumnResizable(t)){const e=this.createColumnResizing(t);l.push(e)}const h=this.createElement("div",r,l);e.appendChild(h),this.setHeaderCache(o,h),this.setNodeDataCache(h,{rowItem:this.headerRowItem,column:o,columnItem:t,headerNode:h}),t.tg_parent&&this.renderHeaderItem(t.tg_parent,e)},createColumnHeader:function(t){const e={class:this.getHeaderClass(t),style:this.getHeaderStyle(t)},i=[this.createColumnName(t)];if(this.hasSortColumn&&!t.tg_group){const e=this.createColumnSort(t);i.push(e)}return this.createElement("div",e,i)},createColumnName:function(t){const e=["tg-column-name"];t.tg_group&&e.push("tg-header-group-name");const i={class:e.join(" ")};let o=t.name;const n=t.tg_headerFormatter;return"function"==typeof n&&(o=n.call(this,o,this.headerRowItem,t)),"tree"===t.formatter?o=this.createHeaderTreeName(o):t===this.selectColumn&&this.isSelectAllVisible()&&(o=this.createHeaderSelectName()),this.createElement("div",i,o)},createHeaderTreeName:function(t){this.hasTreeColumn=!0;const e=[];if(this.options.collapseAllVisible){const t=X.getIcon("tree"),i=this.createElement("div",{class:"tg-tree-icon tg-tree-icon-all"},t);e.push(i)}else{const t=this.createElement("div",{class:"tg-tree-icon"});e.push(t)}const i=this.createElement("div",{class:"tg-tree-name"},t);e.push(i);return this.createElement("div",{class:"tg-tree"},e)},createHeaderSelectName:function(){const t=X.getIcon("checkbox");return this.createElement("div",{class:"tg-select-icon-all tg-checkbox"},t)},createColumnSort:function(t){let e;return this.isColumnSortable(t)&&(e="h"===this.options.sortIndicator?this.createSortIndicatorH(t):this.createSortIndicatorV(t)),this.createElement("div",{class:"tg-column-sort"},e)},createSortIndicatorH:function(t){const e=X.getIcon("sort-h"),i=[this.createElement("div",{class:"tg-sort-indicator-line"}),this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createSortIndicatorV:function(t){const e=X.getIcon("sort-v"),i=[this.createElement("div",{class:"tg-sort-indicator-icon"},e)];return this.createElement("div",{class:"tg-sort-indicator"},i)},createColumnResizing:function(){return this.createElement("div",{class:"tg-column-resizing"})},getHeaderItemClass:function(t,e){const i=["tg-header-item"];return t.tg_group&&i.push("tg-header-group-item"),t===e&&i.push("tg-header-column-last"),i.push(`tg-c-${t.tg_view_index}`),i.push(`tg-h-${t.tg_layer}`),t.tg_combination&&i.push(`tg-h-${t.tg_combination}`),i.push(d.classMap(t.headerClassMap)),d.classMap(i)},getHeaderClass:function(t){const e=["tg-column-header"];return"tree"===t.formatter&&(e.push("tg-tree-header"),this.rowsInfo.isTree&&e.push("tg-tree-header-indent")),this.isColumnSortable(t)&&e.push(`tg-column-sortable tg-column-sort-${this.options.sortIndicator}`),t.align&&e.push(`tg-align-${t.align}`),e.join(" ")},getHeaderStyle:function(t){const e=[d.styleMap(t.headerStyleMap)],i=t.tg_width;return this.isInvisible(t)||i<=0?e.push("display:none;"):e.push(`width:${i}px;`),e.join("")}},J={renderHeader:function(){this.cssRulesInvalid=!0,this.$headerL.empty(),this.$headerR.empty(),this.resetCssDisplay(),this.renderHeaderTables(),this.renderHeaderSort(),this.headerCreated=!0,this.trigger(y.onHeaderUpdated,{node:this.$headerFrame.get(0)})},initHeaderLayerHeight:function(){this.updateScrollPaneHiddenState(),this.resetCssDisplay(),this.viewAllColumns.forEach((t=>{this.updateColumnHeaderHeight(t)})),this.resetCssDisplay("none"),this.updateHeaderLayerHeight()},updateHeaderLayerHeight:function(){const t={},e=this.columnsInfo.maxLevel;for(let i=0;i<=e;i++)t[i]=0;const i=[];this.viewAllColumns.forEach((function(e){if(e.tg_combination)i.push(e);else{const i=e.tg_height,o=e.tg_layer;t[o]=Math.max(t[o],i)}})),i.forEach((function(e){let i=e.tg_height;const o=e.tg_combination.split(""),n=o.pop();o.forEach((function(e){i-=t[e]||0})),t[n]=Math.max(t[n],i)}));const o=JSON.stringify(t);this.previousHeaderLayerHeight!==o&&(this.previousHeaderLayerHeight=o,this.headerLayerHeight=t,this.cssRulesInvalid=!0)}};var Q=i(915);const Z={create:function(t){this.id=d.uid(4,"tg-"),d.isObject(t)||(t={container:t}),this.constructorOptions=t,this.createCache(),this.createView(t.container)},createView:function(t){this.createHolder(t),this.$holder?(this.createGlobalStyle(),this.createContainer()):console.error("ERROR: Grid requires a container")},createHolder:function(t){const e=w(t);if(!e.length)return;this.$holder=e,this.$holder.empty(),this.holder=this.$holder.get(0);const i=this.holder.getRootNode();this.shadowRoot=null,i&&i.host&&(this.shadowRoot=i)},createGlobalStyle:function(){const t=this.shadowRoot||document.head;if(t.querySelector(`style[context="${e.ID}"]`))return;const i=document.createElement("style");i.setAttribute("context",e.ID),i.innerHTML=Q.A.toString(),t.appendChild(i)},createContainer:function(){return this.$container=w('
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n\r\n
    \r\n
    \r\n \r\n \r\n \r\n
    \r\n
    \r\n\r\n
    \r\n').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(`${e.NS} ${this.id}`),this.container=this.$container.get(0),d.setInstance(this.container,this),this.$headerFrame=this.$container.find(".tg-header-frame"),this.$paneHL=this.$headerFrame.find(".tg-pane-header-left"),this.$paneHR=this.$headerFrame.find(".tg-pane-header-right"),this.$headerL=this.$paneHL.find(".tg-header-left"),this.$headerR=this.$paneHR.find(".tg-header-right"),this.$header=w().add(this.$headerL).add(this.$headerR),this.$bodyFrame=this.$container.find(".tg-body-frame"),this.$paneTL=this.$bodyFrame.find(".tg-pane-top-left"),this.$paneTR=this.$bodyFrame.find(".tg-pane-top-right"),this.$paneBL=this.$bodyFrame.find(".tg-pane-bottom-left"),this.$paneBR=this.$bodyFrame.find(".tg-pane-bottom-right"),this.$bodyTL=this.$paneTL.find(".tg-body-top-left"),this.$bodyTR=this.$paneTR.find(".tg-body-top-right"),this.$bodyBL=this.$paneBL.find(".tg-body-bottom-left"),this.$bodyBR=this.$paneBR.find(".tg-body-bottom-right"),this.$body=w().add(this.$bodyTL).add(this.$bodyTR).add(this.$bodyBL).add(this.$bodyBR),this.$columnLineContainer=this.$container.find(".tg-column-line"),this.$columnLineItem=this.$columnLineContainer.find(".tg-column-line-item"),this.$columnLineItemL=this.$columnLineContainer.find(".tg-column-line-l"),this.$columnLineItemR=this.$columnLineContainer.find(".tg-column-line-r"),this}},tt={initColumnsHandler:function(){this.columns=this.data.columns,this.columns.forEach(((t,e)=>{t&&"object"==typeof t||(this.columns[e]={})}));const t=this.getPrivateColumns();this.columnsInfo=this.initTreeInfo(t,this.frozenInfo.column);const e=[],i=[],o=(t,n)=>{if(!d.isList(t))return;let s,r=0;t.forEach((t=>{if(!this.isInvisible(t))if(t.tg_group){if(this.isEmptyGroup(t))return;i.push(t),o(t.subs,t)}else t.tg_list_index=r,r+=1,t.tg_list_last=!1,s=t,e.push(t)})),s&&(s.tg_list_last=!0)};o(t),e.forEach((t=>{this.initColumnItemHandler(t)})),i.forEach((t=>{this.initColumnGroupHandler(t)}));const n=[].concat(e).concat(i);this.initViewList(n,((t,e)=>{})),this.viewColumns=e,this.viewGroupColumns=i,this.viewAllColumns=n,this.initHeaderHandler(t),this.initSortColumn()},getPrivateColumns:function(){const t=this.options;this.selectColumn=t.selectColumn,this.rowDragColumn=t.rowDragColumn,this.rowNumberColumn=t.rowNumberColumn,this.blankColumn=t.blankColumn;let e=[];const i=()=>{t.selectVisible&&e.push(this.selectColumn),t.rowDragVisible&&e.push(this.rowDragColumn),t.rowNumberVisible&&(this.rowNumberColumn.width=t.rowNumberWidth,e.push(this.rowNumberColumn))};if(this.frozenInfo.right){const t=this.frozenInfo.column;this.columns.forEach(((o,n)=>{e.push(o),n===t&&i()}))}else i(),e=e.concat(this.columns);return e.push(this.blankColumn),e},setColumns:function(t){this.data.columns=d.toList(t),this.rerender()},getColumns:function(){return this.columns},getViewColumns:function(t){return t?this.viewAllColumns:this.viewColumns},initColumnItemHandler:function(t){this.initColumnProps(t),this.initColumnFormatter(t),this.initColumnWidth(t)},initColumnGroupHandler:function(t){this.initColumnFormatterByName(t,"headerFormatter","header")},initColumnProps:function(t){const e=this.options.columnTypes;if(!d.hasOwn(t,"type")){const i=e[t.id];"string"==typeof i&&(t.type=i)}let i=this.options.columnProps;const o=e[t.type];o&&"object"==typeof o&&(i=d.merge(i,o));for(const e in i)d.hasOwn(t,e)||(t[e]=i[e])},initColumnFormatter:function(t){this.initColumnFormatterByName(t,"headerFormatter","header");let e=t.type;const i=t.formatter;"string"==typeof i&&(e=i),this.initColumnFormatterByName(t,"formatter",e)},initColumnFormatterByName:function(t,e,i){let o=t[e];"function"!=typeof o?(o=this.getFormatter(i),t[`tg_${e}`]=o||this.getFormatter("string")):t[`tg_${e}`]=o.bind(this)},initColumnWidth:function(t){if(t!==this.blankColumn)return d.isNum(t.width)&&t.width>=0?(t.tg_width=t.width,t.minWidth=Math.min(t.minWidth,t.tg_width),void(t.maxWidth=Math.max(t.maxWidth,t.tg_width))):void this.initColumnWidthByName(t);t.tg_width=0},initColumnWidthByName:function(t){const e=this.getComputedColumnWidth(t);d.isNum(e)&&(t.tg_width=e)},getComputedColumnWidth:function(t){const e=t.name||"",i=d.getCharLen(e);let o=Math.round(10*i);return o>103&&(o=Math.max(103,Math.round(10*i/2)),o>133&&(o=Math.max(133,Math.round(10*i/3)),o>163&&(o=Math.max(163,Math.round(10*i/4))))),d.clamp(o,t.minWidth,t.maxWidth)},initSortColumn:function(){this.sortColumn=null;const t=this.options,e=t.sortField;if(!e)return;const i=this.getColumnItemById(e);return i&&this.isColumnSortable(i)?(d.hasOwn(i,"sortAsc")||(i.sortAsc=t.sortAsc),this.sortColumn=i,this):void 0}},et={initHeaderHandler:function(t){this.initHeaderRowItem(),this.viewGroupColumns.reverse(),this.initGroupColumnsWidth(),this.initGroupColumnsLayer(t)},initHeaderRowItem:function(){this.headerRowItem={tg_index:-1,tg_view_index:-1},this.viewAllColumns.forEach((t=>{d.hasOwn(t,"id")&&(this.headerRowItem[t.id]=t.name)}))},initGroupColumnsWidth:function(){this.viewGroupColumns.forEach((t=>{let e=0;t.subs.forEach((t=>{this.isInvisible(t)||(e+=t.tg_width)})),t.tg_width=e}))},initGroupColumnsLayer:function(t){const e=this.columnsInfo.maxLevel;this.viewColumns.forEach((function(t){t.tg_layer=e,t.tg_parent&&(t.tg_parent.tg_layer=e-1)})),this.viewGroupColumns.forEach((function(t){const e=t.tg_layer,i=t.tg_parent;if(i){let t=e-1;d.isNum(i.tg_layer)&&(t=Math.min(t,i.tg_layer)),i.tg_layer=t}})),this.initColumnRowspanHandler(t,0)},initColumnRowspanHandler:function(t,e){t.forEach((t=>{const i=this.initColumnCombinationHandler(t,e);t.tg_group&&this.initColumnRowspanHandler(t.subs,e+i)}))},initColumnCombinationHandler:function(t,e){const i=[],o=t.tg_layer;for(;e<=o;)i.push(e),e+=1;i.reverse();const n=i.length;let s="";return n>1&&(s=i.join("")),t.tg_combination=s,n}},it={},ot={name:"",minWidth:81,maxWidth:300},nt=function(t){return null==t},st=function(t,e){const i=nt(t),o=nt(e);return i&&o?0:i?1:o?-1:void 0},rt=function(t,e){return t.tg_index>e.tg_index?1:-1},lt=function(t,e){return rt(t,e)},ht=function(t,e){if("string"==typeof t&&"string"==typeof e){const i=t.toUpperCase(),o=e.toUpperCase();if(i!==o)return i>o?-1:1}return t>e?-1:1},at=function(t,e,i,o){return t?-1:e?1:ht(i,o)},ct=function(t,e){const i="number"==typeof t,o="number"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},dt=function(t,e){const i=new Date(t),o=new Date(e),n=d.isDate(i),s=d.isDate(o);if(n&&s){const t=i.getTime(),e=o.getTime();if(t===e)return;return t>e?-1:1}return at(n,s,t,e)},ut=function(t,e){const i="boolean"==typeof t,o="boolean"==typeof e;return i&&o?t>e?-1:1:at(i,o,t,e)},gt=function(t,e,i,o){const n=t[i.sortField],s=e[i.sortField],r=st(n,s);if("number"==typeof r)return 0===r?lt(t,e):i.sortBlankFactor*r;if(n!==s&&"function"==typeof o){const t=o(n,s);if(d.isNum(t))return i.sortFactor*t}return lt(t,e)},ft={blankValue:st,equal:lt,index:rt,value:gt,diffType:at,string:function(t,e,i){return gt(t,e,i,ht)},stringValue:ht,number:function(t,e,i){return gt(t,e,i,ct)},numberValue:ct,date:function(t,e,i){return gt(t,e,i,dt)},dateValue:dt,boolean:function(t,e,i){return gt(t,e,i,ut)},booleanValue:ut};const pt={initOptionsHandler:function(){return this.options=this.generateOptions(),this.initOptionsFormatters(),this.initOptionsSort(),this.initOptionsFrozen(),this.initOptionsScrollbar(),this.initOptionsContainer(),this.initBindWindowResize(),this.initBindContainerResize(),this},generateOptions(){const t={className:e.NS,theme:e.ID,headerVisible:!0,rowHeight:32,rowFilter:null,rowFilteredSort:null,rowNotFound:"",rowMoveCrossLevel:!0,rowCacheLength:0,rowProps:it,columnTypes:{tree:{type:"tree",formatter:"tree",width:230,minWidth:120,maxWidth:810},number:{type:"number",align:"right"},date:{type:"date",align:"right"},name:"tree"},columnCacheLength:0,columnProps:ot,collapseAllOnInit:null,collapseAllVisible:!0,selectAllOnInit:null,selectVisible:!1,selectAllVisible:!0,selectMultiple:!0,selectColumn:{private:!0,id:"tg-column-select",name:"",formatter:"select",headerClassMap:"tg-header-select",classMap:"tg-cell-select",width:36,align:"center",resizable:!1,sortable:!1,exportable:!1},rowDragCrossLevel:!0,rowDragVisible:!1,rowDragColumn:{private:!0,id:"tg-column-row-drag",name:"",formatter:"rowDrag",headerClassMap:"tg-header-row-drag",classMap:"tg-cell-row-drag",align:"center",width:36,resizable:!1,sortable:!1,exportable:!1},rowNumberWidth:36,rowNumberFilter:null,rowNumberVisible:!1,rowNumberColumn:{private:!0,id:"tg-column-row-number",name:"",formatter:"rowNumber",headerClassMap:"tg-header-row-number",classMap:"tg-cell-row-number",align:"center",maxWidth:100,sortable:!1,exportable:!1},blankColumn:{private:!0,id:"tg-column-blank",name:"",formatter:"blank",headerClassMap:"tg-header-blank",classMap:"tg-cell-blank",width:0,minWidth:0,maxWidth:4096,resizable:!1,sortable:!1,exportable:!1},sortField:"",sortAsc:!0,sortBlankValueBottom:!0,sortComparers:ft,sortOnInit:!1,sortIndicator:"h",highlightKeywords:{textKey:"tg_text_",textGenerator:null,highlightKey:"tg_highlight_",highlightPre:"",highlightPost:""},frozenRow:-1,frozenRowMax:10,frozenRowHoverable:!1,frozenBottom:!1,frozenColumn:-1,frozenColumnMax:10,frozenRight:!1,scrollbarSize:12,scrollbarSizeH:null,scrollbarSizeV:null,scrollbarRound:!1,scrollbarFade:!1,scrollbarFadeTimeout:1e3,scrollbarType:"auto",scrollPaneMinWidth:30,scrollPaneGradient:30,autoHeight:!1,textSelectable:!1,bindWindowResize:!1,bindContainerResize:!1,cellResizeObserver:null},i=this.generateThemeOptions();return d.merge(t,i,this.constructorOptions,this.customOptions,this.dataOptions)},generateThemeOptions(){const t=this.pickOptions("theme").pop();if(t)return this.getThemeOptions(t)},pickOptions(t){return[this.constructorOptions,this.customOptions,this.dataOptions].map((e=>e&&e[t])).filter((t=>t))},initOptionsFormatters(){let t;const e=this.pickOptions("formatters");e.length&&(t=d.merge.apply(null,e)),this.formatters=d.merge(Y,t,this.customFormatters),this.nullFormatter=this.getFormatter("null")},initOptionsSort(){"v"!==this.options.sortIndicator&&(this.options.sortIndicator="h")},initOptionsFrozen:function(){const t=this.options;this.frozenInfo={column:-1,row:-1,columns:0,rows:0,bottom:Boolean(t.frozenBottom),right:Boolean(t.frozenRight)};let e=d.toNum(t.frozenColumn,!0);e=d.clamp(e,-1,t.frozenColumnMax),e>-1&&!this.frozenInfo.right&&(t.selectVisible&&(e+=1),t.rowDragVisible&&(e+=1),t.rowNumberVisible&&(e+=1)),this.frozenInfo.column=e,e>-1?this.frozenInfo.columns=e+1:(this.frozenInfo.columns=0,this.frozenInfo.right=!1);let i=d.toNum(t.frozenRow,!0);i=d.clamp(i,-1,t.frozenRowMax),this.frozenInfo.row=i,i>-1?this.frozenInfo.rows=i+1:(this.frozenInfo.rows=0,this.frozenInfo.bottom=!1)},initOptionsScrollbar:function(){const t=this.options;("auto"===t.scrollbarType&&d.isTouchDevice()||["touch","mobile"].includes(t.scrollbarType))&&(t.scrollbarFade=!0,t.scrollbarSize=6,t.scrollbarRound=!0);const e=d.toNum(t.scrollbarSize);this.scrollbarSizeH=e,d.isNum(t.scrollbarSizeH)&&(this.scrollbarSizeH=t.scrollbarSizeH),this.scrollbarSizeV=e,d.isNum(t.scrollbarSizeV)&&(this.scrollbarSizeV=t.scrollbarSizeV)},initOptionsContainer:function(){this.$container.attr("id",this.id);const t=this.options;this.$container.removeClass();const i=[e.NS,this.id,`tg-${t.theme}`,t.className];t.textSelectable||i.push("tg-text-unselectable"),d.isTouchDevice()&&i.push("tg-touch-device"),this.$container.addClass(d.classMap(i))},setTextSelectable:function(t){this.options.textSelectable&&(t?this.$container.removeClass("tg-text-unselectable"):this.$container.addClass("tg-text-unselectable"))}},mt={initBindWindowResize:function(){this.unbindWindowResize(),this.options.bindWindowResize&&(this.windowResizeEvents={resize:{handler:t=>{this.resize()}}},d.bindEvents(this.windowResizeEvents,window))},unbindWindowResize:function(){d.unbindEvents(this.windowResizeEvents)},createResizeObserver:function(t){if("undefined"==typeof ResizeObserver)return console.error("ERROR: This browser does not support ResizeObserver"),{observe:()=>{},unobserve:()=>{},disconnect:()=>{}};return new ResizeObserver((e=>{t.call(this,e)}))},initBindContainerResize:function(){this.unbindContainerResize(),this.options.bindContainerResize&&this.holder&&(this.resizeObserver=this.createResizeObserver((t=>{Boolean(this.holder.offsetWidth||this.holder.offsetHeight||this.holder.getClientRects().length)&&this.resize()})),this.resizeObserver.observe(this.holder))},unbindContainerResize:function(){this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}},bt={initRowsHandler:function(){this.rows=this.data.rows,this.rowsInfo=this.initTreeInfo(this.rows,this.frozenInfo.row)},getRows:function(){return this.rows},getViewRows:function(){return this.viewRows},createViewRows:function(){this.initRowFilterHandler();const t=[],e=this.getRowNumberFilter();let i=1;const o=(t,o)=>{if(e.call(this,t,o))return t.tg_row_number=i,void(i+=1);t.tg_row_number=""},n=(e,i,s)=>{if(!d.isList(e))return;let r,l=0;e.forEach((e=>{if(this.isInvisible(e))return;e.tg_list_index=l,l+=1,e.tg_list_last=!1,r=e,this.gridRowItemHandler(e),o(e,l),s||t.push(e);const i=s||e.tg_group&&e.collapsed;n(e.subs,e,i)})),r&&(r.tg_list_last=!0)};n(this.rows);let s,r=0;return this.initViewList(t,((t,e)=>{t.tg_top=r,r+=this.getRowHeight(t),t.tg_group_line=!1,t.collapsed&&(t.tg_group_line=!0),s&&(t.tg_group||t.tg_level{if(e.tg_invisible)return;const n=!t.call(this,e,i,o);if(e.tg_filtered=n,!n){let t=e;for(;t.tg_parent;)t.tg_parent.tg_filtered=!1,t=t.tg_parent}})),this.sortColumn)return;let e=this.options.rowFilteredSort;if("function"==typeof e&&(e=e.call(this)),!e)return;"string"==typeof e&&(e={sortField:e,sortAsc:this.options.sortAsc});const i=e.sortField||e.id;i&&this.sortRows(i,e)},highlightKeywordsFilter:function(t,e,i){const{textKey:o,textGenerator:n,highlightKey:s}=this.options.highlightKeywords;if(e.forEach((e=>{t[`${s}${e}`]=null})),!i)return!0;const r=`${i}`.trim().toLowerCase().split(/\s+/g).filter((t=>t));if(!r.length)return!0;let l=!1;const h=(e,i)=>(/<\/?[a-z][\s\S]*>/i.test(e)&&(e=((e,i)=>{const n=`${o}${i}`,s=t[n];if(s)return s;const r=document.createElement("div");r.innerHTML=e;const l=r.innerText;return t[n]=l,l})(e,i)),(t=>{const e=t.toLowerCase();let i=0;for(const t of r){const o=e.indexOf(t,i);if(-1===o)return;i=o+t.length}return!0})(e));let a=function(t,e){return t[e]};return"function"==typeof n&&(a=n),e.forEach((e=>{const i=a(t,e);if(null==i)return;const o=`${i}`.trim();if(!o)return;const n=h(o,e);n&&(t[`${s}${e}`]=n,l=!0,this.highlightKeywords=r)})),l},highlightKeywordsHandler:function(){const{highlightCells:t}=this.renderSettings;if(!t.length)return;const e=this.highlightKeywords;e&&(this.asyncHighlightKeywords||(this.asyncHighlightKeywords=d.debounce(this.highlightKeywordsSync,10)),this.asyncHighlightKeywords.apply(this,[t,e]))},highlightKeywordsSync:function(t,e){t.forEach((t=>{const i=Array.from(t.querySelectorAll("svg")).concat(Array.from(t.querySelectorAll("textarea"))),o=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,(t=>{if(i.length)for(const e of i)if(e.contains(t))return NodeFilter.FILTER_SKIP;return NodeFilter.FILTER_ACCEPT})),n=[];let s=o.nextNode();for(;s;)n.push(s),s=o.nextNode();n.length&&this.highlightTextNodes(n,e)}))},highlightTextNodes:function(t,e){const{highlightPre:i,highlightPost:o}=this.options.highlightKeywords;let n=0;const s=()=>(n>=e.length&&(n=0),e[n++]);let r=s();t.forEach((t=>{const e=t.textContent,n=e.toLowerCase(),l=[];let h=0;const a=e.length;let c=!1;for(;h{if(e.selected){if(t)return void(e.selected=!1);t=e}}))}const t=this.options.selectAllOnInit;!0!==t?!1===t&&this.updateAllRowsSelected(!1):this.updateAllRowsSelected(!0)},updateAllRowsSelected:function(t){this.forEachSelectableRow((e=>{e.selected=t}))},initCollapseAllOnInitHandler:function(){const t=this.options.collapseAllOnInit;!0!==t?!1===t&&this.updateAllRowsCollapsed(!1):this.updateAllRowsCollapsed(!0)},getToBeAddedItemList:function(t){const e=[];return d.toList(t).forEach((t=>{t&&"object"==typeof t?e.push(t):void 0!==t&&e.push({name:t})})),e},getToBeAddedParentSubs:function(t,e){return t?(t.subs||(t.subs=[]),t.subs):e},getToBeAddedPositionIndex:function(t,e){const i=e.length;return d.isNum(t)&&t>=0&&t<=i?Math.round(t):i},generateDataSnapshot:function(t){if(!t||"object"!=typeof t)return t;const e=this.cleanTreeList(t.rows),i=this.cleanTreeList(t.columns);return this.convertNumberType(e,i),t.rows=e,t.columns=i,t},cleanTreeList:function(t){if(!d.isList(t))return[];const e=(t,i)=>{i.forEach((i=>{if(!i||"object"!=typeof i)return void t.push({});const o=this.getItemSnapshot(i),n=i.subs;Array.isArray(n)&&(o.subs=[],e(o.subs,n)),t.push(o)}))},i=[];return e(i,t),i},convertNumberType:function(t,e){const i=[];d.forEachTree(e,(function(t){"number"===t.type&&t.id&&i.push(t.id)})),i.length&&d.forEachTree(t,(function(t){i.forEach((function(e){t[e]=d.convertNum(t[e])}))}))}},vt={setDefaultLoading:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!t)return;const i=t.style;e.size&&(i.width=e.size,i.height=e.size),e.color&&(i.color=e.color),e.size||e.color||t.removeAttribute("style"),e.fast?t.classList.add("tg-loading-fast"):t.classList.remove("tg-loading-fast")},getDefaultLoading:function(t){return this.setDefaultLoading(this.$defaultLoading,t),this.$defaultLoading},getLoadingHolder:function(){return this.$container?this.$container.find(".tg-loading"):w()},setLoading:function(t){if(!this.$container)return this;this.$defaultLoading||(this.$defaultLoading=this.$container.find(".tg-loading-default").get(0));const e=this.getLoadingHolder().get(0);return"function"==typeof t&&(t=t.call(this,e)),d.isObject(t)&&(t=this.getDefaultLoading(t)),t||(t=this.getDefaultLoading()),this.renderNodeContent(e,t),this},showLoading:function(){return this.getLoadingHolder().show(),this},hideLoading:function(){return this.getLoadingHolder().hide(),this}},Ht={showMask:function(t){if(!this.hasMask||t){const e=this.$container.find(".tg-mask"),i=e.get(0);if(t&&i){const e=d.styleMap(t);e&&(i.style.cssText=e)}e.show(),this.hasMask=!0}return this},hideMask:function(){return this.hasMask&&(this.$container.find(".tg-mask").hide(),this.hasMask=!1),this}},Ct={renderNodeContent:function(t,e){if(t){if(e&&e.nodeType)return this.emptyNode(t),void t.appendChild(e);if(Array.isArray(e))return this.emptyNode(t),void e.forEach((e=>{e&&e.nodeType&&t.appendChild(e)}));void 0===e&&(e=""),t.innerHTML=e}},emptyNode:function(t){if(t)for(;t.firstChild;)t.removeChild(t.firstChild)},removeNode:function(t){t&&t.parentNode&&t.parentNode.removeChild(t)},appendNode:function(t,e){t&&e&&t.appendChild(e)},createElement:function(t,e,i){const o=document.createElement(t);e&&Object.keys(e).forEach((function(t){const i=e[t];void 0!==i&&o.setAttribute(t,i)})),d.isArray(i)||(i=[i]);let n="";return i.forEach((function(t){t&&t.nodeType?o.appendChild(t):void 0!==t&&(n+=t)})),n&&(o.innerHTML=n),o},find:function(t,e){return w(e||this.$container).find(t)},getRowNodes:function(t){const e=this.getRowItem(t);if(e)return this.getRowNodesByIndex(e.tg_view_index)},getCellNode:function(t,e){const i=this.getRowItem(t);if(!i)return;const o=this.getColumnItem(e);return o?this.getCellNodeByIndex(i.tg_view_index,o.tg_view_index):void 0},getHeaderItemNode:function(t){const e=this.getColumnItem(t);if(e)return this.getHeaderCache(e.tg_view_index)},getColumnHeaderNode:function(t){const e=this.getHeaderItemNode(t);if(e)return e.querySelector(".tg-column-header")}},yt={render:function(){this.asyncRender||(this.asyncRender=d.microtask(this.renderSync)),this.asyncRender.apply(this,arguments)},renderSync:function(){this.renderStartedTimestamp=Date.now();const t=this.generateRenderSettings.apply(this,arguments);return this.renderSettings=t,"all"===t.type?(this.flushBody(),this.initHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"columns"===t.type?(this.flushBody(),this.initColumnsHandler(),this.renderHeader(),this.updateViewRowsAndSize(),this.renderBody(),this):"rows"===t.type?(this.updateViewRowsAndSize(),this.renderBody(),this):"rows_cache"===t.type?(this.cssRulesInvalid=!0,this.updateViewRowsAndSize(),this.updateRowCacheTopAndHeight(),this.renderBody(),this):"resize"===t.type?(this.resizeHandler(),this.renderBody(),this):(this.renderBody(),this)},generateRenderSettings:function(t){const e={type:this.renderType,scrollLeft:null,scrollTop:null,scrollColumn:null,scrollRow:null,highlightCells:[]};return"string"==typeof t?e.type=t:t&&Object.assign(e,t),this.headerCreated||(e.type="all"),e},renderBody:function(){this.scrollOnInit(),this.scrollTopOffset=this.scrollPane.getScrollTopOffset();const t=this.getViewport();return this.viewport=t,this.flushWithViewport(),this.previousScrollTopOffset!==this.scrollTopOffset&&(this.previousScrollTopOffset=this.scrollTopOffset,this.updateRowCacheTopOffset()),this.renderRows(t.rows),this.renderCells(t.rows,t.columns),this.renderUpdatedTimestamp=Date.now(),this.renderDuration=this.renderUpdatedTimestamp-this.renderStartedTimestamp,this.trigger(y.onUpdated,t),this.firstUpdated||(this.firstUpdated=!0,this.trigger(y.onFirstUpdated,t)),this.layoutEventHandler(),this.resizeEventHandler(),this.highlightKeywordsHandler(),this.renderSettings=null,this.renderType=null,this},rerender:function(){return this.render("all"),this}},Rt={resize:function(){return this.asyncResize||(this.asyncResize=d.throttle(this.resizeSync,100)),this.asyncResize.apply(this,arguments),this},resizeSync:function(){return this.headerCreated?(this.resizeHolderHandler.apply(this,arguments),this.firstUpdated&&this.isHolderInvisible()||this.render("resize"),this):this},resizeHolderHandler(t,e){if(0!==arguments.length)return 1===arguments.length?t&&"object"==typeof t?void this.$holder.css(t):void this.$holder.css({width:t}):void this.$holder.css({width:t,height:e})},isHolderInvisible(){const t=this.$holder.width(),e=this.$holder.height();return!t||!e},resizeHandler:function(){this.containerWidth=this.$container.width(),this.containerHeight=this.$container.height(),this.headerWidth=this.containerWidth,this.bodyWidth=this.containerWidth,this.updateTotalColumnsWidth(),this.resizeHeaderHandler(),this.resizeBodyHandler()},layoutEventHandler:function(){const t=this.previousLayout||{},e={headerWidth:this.headerWidth,headerHeight:this.headerHeight,bodyWidth:this.bodyWidth,bodyHeight:this.bodyHeight,scrollbarWidth:this.getScrollbarWidth(),scrollbarHeight:this.getScrollbarHeight()};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousLayout=e,this.trigger(y.onLayout,d.merge({previous:t},e)))},resizeEventHandler:function(){const t=this.previousSize||{},e={width:this.containerWidth,height:this.containerHeight};Object.values(e).join("")!==Object.values(t).join("")&&(this.previousSize=e,this.trigger(y.onResize,d.merge({previous:t},e)))},resizeHeaderHandler:function(){this.initHeaderLayerHeight();const t=this.options;t.autoHeight&&this.viewRows.length>5e3&&(t.autoHeight=!1),this.headerHeight=0,t.headerVisible&&(this.containerHeight>0||t.autoHeight)&&this.updateHeaderTableHeight(),this.$headerFrame.css({width:this.headerWidth,height:this.headerHeight})},updateHeaderTableHeight:function(){let t=0;Object.keys(this.headerLayerHeight).forEach((e=>{t+=this.headerLayerHeight[e]}));const e=this.$headerL.find(".tg-header-table"),i=this.$headerR.find(".tg-header-table");e.css({height:t}),i.css({height:t}),this.headerHeight=t},resizeBodyHandler:function(){this.updateScrollState(),this.bodyHeight=this.containerHeight-this.headerHeight,this.$bodyFrame.css({width:this.bodyWidth,height:this.bodyHeight}),this.updatePaneWidth(),this.updatePaneHeight(),this.updateCanvasWidth(),this.updateCanvasHeight(),this.updateScrollPane(),this.updateCssRules()},updatePaneWidth:function(){let t=this.bodyWidth,e=0;if(this.frozenInfo.columns){const i=this.getScrollbarWidth();this.frozenInfo.right?(e=this.columnsWidthR+i,t=this.bodyWidth-e):(t=this.columnsWidthL,e=this.bodyWidth-t),this.scrollPaneHidden&&(this.frozenInfo.right?(t<=0&&(t=0),e=Math.max(0,this.bodyWidth-t)):(e3&&void 0!==arguments[3])||arguments[3];const n=this.getToBeAddedItemList(t);if(!n.length)return!1;let s;if(null!=e&&(s=this.getRowItem(e),!s))return!1;const r=this.getToBeAddedParentSubs(s,this.rows),l=this.getToBeAddedPositionIndex(i,r),h=[l,0].concat(n);r.splice.apply(r,h),this.initRowsHandler(),s?(s.collapsed=!1,this.flushRowFrom(s.tg_view_index+l)):this.flushRowFrom(l),this.onNextUpdated((function(){this.trigger(y.onRowAdded,n)}));const a={type:"rows"};return o&&(a.scrollRow=n[n.length-1]),this.render(a),!0},deleteRow:function(t){const e=d.toList(t),i=[];if(e.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!i.length)return!1;const o=this.removeRowsHandler(i);this.initRowsHandler();const n=this.getRemovedMinIndex(o);return this.flushRowFrom(n),this.onNextUpdated((function(){this.trigger(y.onRowRemoved,i)})),this.render("rows"),!0},getRemovedMinIndex:function(t){let e=0;const i=t[t.length-1];if(this.isInvisible(i))return e;e=i.tg_view_index,e>0&&(e-=1);let o=i.tg_parent;for(;o;)o.collapsed&&(e=o.tg_view_index),o=o.tg_parent;return e},removeRowsHandler:function(t){const e=[].concat(t);e.sort((function(t,e){return e.tg_index-t.tg_index}));const i=[];return e.forEach((t=>{this.getRowParentSubs(t).splice(t.tg_sub_index,1),i.push(t)})),i}},Tt={renderCollapseAllState:function(){this.hasTreeColumn&&(this.asyncRenderCollapseAllState||(this.asyncRenderCollapseAllState=d.microtask(this.renderCollapseAllStateSync)),this.asyncRenderCollapseAllState.apply(this,arguments))},renderCollapseAllStateSync:function(){const t=this.$header.find(".tg-tree-header");this.rowsInfo.isTree?t.addClass("tg-tree-header-indent"):t.removeClass("tg-tree-header-indent"),this.renderCollapseAllIcon()},checkCollapseAllState:function(t){if(t!==this.allRowsCollapsed){if(t){let t=0;const e=this.rows.length;for(;t{if(e.tg_group&&e.tg_subs_length&&e.collapsed)return t=!0,!1})),t)return}this.allRowsCollapsed=t,this.renderCollapseAllIcon()}},expandAllRows:function(){return this.renderAllRowsCollapsed(!1)},collapseAllRows:function(){return this.renderAllRowsCollapsed(!0)},toggleAllRows:function(){return this.allRowsCollapsed?this.expandAllRows():this.collapseAllRows()},renderAllRowsCollapsed:function(t){const e=this.updateAllRowsCollapsed(t);return e.length?(this.flushBody(),this.onNextUpdated((()=>{this.renderCollapseAllIcon(),t?this.trigger(y.onRowCollapsed,e):this.trigger(y.onRowExpanded,e)})),this.render("rows"),this):this},updateAllRowsCollapsed:function(t){this.allRowsCollapsed=t;const e=[];return this.forEachRow((i=>{i.subs&&i.tg_subs_length&&this.isCollapsedChanged(i,t)&&(i.collapsed=t,e.push(i))})),e},expandRow:function(t){const e=this.getRowItem(t);return e?this.isEmptyGroup(e)?(this.trigger(y.onRowSubsRequest,e),this):this.isCollapsedChanged(e,!1)?(e.collapsed=!1,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!1),this.trigger(y.onRowExpanded,e)})),this.render("rows"),this):this:this},collapseRow:function(t){const e=this.getRowItem(t);return e&&e.subs&&e.tg_subs_length&&this.isCollapsedChanged(e,!0)?(e.collapsed=!0,this.flushRowFrom(e.tg_view_index),this.renderCollapseIcon(e),this.onNextUpdated((()=>{this.checkCollapseAllState(!0),this.trigger(y.onRowCollapsed,e)})),this.render("rows"),this):this},toggleRow:function(t){const e=this.getRowItem(t);return e?(e.collapsed?this.expandRow(e):this.collapseRow(e),this):this},expandRowLevel:function(t){t=d.toNum(t,!0);const e=[],i=[];return this.forEachRow((o=>{o.subs&&o.tg_subs_length&&(o.tg_level<=t?this.isCollapsedChanged(o,!1)&&(o.collapsed=!1,i.push(o)):this.isCollapsedChanged(o,!0)&&(o.collapsed=!0,e.push(o)))})),e.length||i.length?(this.flushBody(),this.onNextUpdated((()=>{e.length&&this.trigger(y.onRowCollapsed,e),i.length&&this.trigger(y.onRowExpanded,i)})),this.render("rows"),this):this},renderCollapseAllIcon:function(){if(!this.options.collapseAllVisible||!this.hasTreeColumn)return;const t=this.$header.find(".tg-tree-icon-all");this.renderTreeIcon(t,this.allRowsCollapsed)},renderCollapseIcon:function(t){if(!this.headerCreated)return;const e=this.getRowNodesByIndex(t.tg_view_index);if(!e)return;const i=e.find(".tg-tree-icon");this.renderTreeIcon(i,t.collapsed)},renderTreeIcon:function(t,e){t&&(e?t.removeClass("tg-tree-icon-expanded").addClass("tg-tree-icon-collapsed"):t.removeClass("tg-tree-icon-collapsed").addClass("tg-tree-icon-expanded"))}},Et={rowDragStartHandler:function(t,e){this.removeSortColumn();const i=e.rowItem;if(!i)return;const o=this.getRowNodesByIndex(i.tg_view_index);if(!o)return;e.dragCloneNodes=this.getRowDragCloneNodes(o),e.dropPlaceholder=this.getRowDropPlaceholder(o),e.dragStartTop=this.getRowTop(i),e.dragRowHeight=this.getRowHeight(i),e.dragStartScrollTop=this.scrollTop,e.dragMaxScrollTop=this.scrollPane.getMaxScrollTop();const n={e:t,rowItem:i};this.trigger(y.onRowDragged,n),this.isDefaultPrevented(n)||("touch"===e.type&&d.preventDefault(e.e),this.setRowState(i,"dragging"),this.setTextSelectable(!1),this.rowDropListHandler(e),this.updateDragCloneRowPosition(e))},rowDragMoveHandler:function(t,e){"touch"===e.type&&d.preventDefault(e.e),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e),this.rowDragAutoScrollHandler(e)},rowDragEndHandler:function(t,e){"touch"===e.type&&(this.protectedItem=null,d.preventDefault(e.e)),this.autoScrollStop(),this.setRowState(e.rowItem,"dragging",!1),this.setTextSelectable(!0),e.dragCloneNodes&&(e.dragCloneNodes.remove(),e.dragCloneNodes=null),e.dropPlaceholder&&(e.dropPlaceholder.remove(),e.dropPlaceholder=null),e.changed&&this.rowDropHandler(e)},updateDragCloneRowPosition:function(t){const e=this.scrollTop-t.dragStartScrollTop,i=t.dragStartTop+t.offsetY+e,o=i-this.scrollTopOffset;t.dragCloneNodes&&t.dragCloneNodes.css("top",o).show(),t.dragCurrentPosition=i+.5*t.dragRowHeight},getRowDragCloneNodes:function(t){const e=w();return t.each((function(t){const i=w(t),o=i.clone();o.appendTo(i.parent()),e.add(o)})),e.addClass("tg-clone").hide(),e},getRowDropPlaceholder:function(t){const e=w();return t.each((function(t){const i=w(t),o=w("
    ").addClass("tg-row-placeholder").hide(),n=i.parent();n.find(".tg-row-placeholder").remove(),o.appendTo(n),e.add(o)})),e},updateDragPlaceholderPosition:function(t){this.rowDropItemHandler(t);const e=t.dropItem;if(!e)return;let i=t.dropPosition-1;t.dropBottom?e.tg_view_last&&(i=t.dropPosition-2):e.tg_view_index-this.frozenInfo.rows==0&&(i=t.dropPosition);const o=i-this.scrollTopOffset;t.dropPlaceholder&&t.dropPlaceholder.css("top",o).show()},rowDragAutoScrollHandler:function(t){const e=t.dragCurrentPosition,i=this.scrollTop,o=this.bodyHeight-this.frozenRowsHeight,n=i+o,s=this.options.rowHeight,r=Math.min(3*s,.5*o);if(!(rn-r){const i=e-(n-r),o=this.getAutoScrollOffset(i,r);this.autoScrollStart(o,t)}else this.autoScrollStop()},getAutoScrollOffset:function(t,e){return Math.floor(t/e*20)},autoScrollStop:function(){this.autoScrollMotion&&(this.autoScrollMotion.destroy(),this.autoScrollMotion=null)},autoScrollStart:function(t,e){this.autoScrollStop();const i=e.dragMaxScrollTop;this.autoScrollMotion=new B,this.autoScrollMotion.bind(B.EVENT.MOTION_MOVE,(()=>{const o=d.clamp(this.scrollTop+t,0,i);o!==this.scrollTop?(this.setScrollTop(o),this.updateDragCloneRowPosition(e),this.updateDragPlaceholderPosition(e)):this.autoScrollStop()})),this.autoScrollMotion.once(B.EVENT.MOTION_END,(()=>{this.autoScrollStart(t,e)})),this.autoScrollMotion.start({duration:200})},rowDropListHandler:function(t){const e=this.getRowDropList(t);if(!d.isList(e))return;const i=t.rowItem,o=e.filter((t=>{if(t===i)return!1;if(t.tg_frozen)return!1;let e=t.tg_parent;for(;e;){if(e===i)return!1;e=e.tg_parent}return!0}));if(!d.isList(o))return;const n=[];o.forEach((t=>{const e=this.getRowTop(t),i=this.getRowHeight(t);n.push({rowItem:t,position:e}),n.push({rowItem:t,position:e+i-1,dropBottom:!0})})),t.dropList=n},getRowDropList:function(t){const e=this.options.rowDragCrossLevel;return e?"function"==typeof e?e.call(this,t):this.viewRows:this.getRowParentSubs(t.rowItem)},rowDropItemHandler:function(t){const e=t.dropList;if(!e)return;const i=t.dragCurrentPosition;let o=Number.MAX_VALUE;for(let n=0,s=e.length;no)break;o=r,t.dropItem=s.rowItem,t.dropBottom=s.dropBottom,t.dropPosition=s.position}},rowDragDropPositionHandler:function(t,e,i){const o=this.getRowParentSubs(t),n=t.tg_sub_index;let s,r;return this.isDropIntoGroupFirstChild(e,i)?(s=e.subs,r=0):(s=this.getRowParentSubs(e),r=e.tg_sub_index,o===s&&n{this.trigger(y.onRowDropped,n)})),this.render({type:"rows",scrollRow:i})}},It={getMoveFocusRow:function(t,e){let i=t[0];return e>0&&(i=t[t.length-1]),i},getMoveLengthInList:function(t,e){let i=0;return t.forEach((t=>{this.getRowParentSubs(t)===e&&(i+=1)})),i},getMoveInfo:function(t,e,i){const o=this.getRowParentSubs(i);let n=i.tg_sub_index+e;const s=i.tg_parent;if(s&&this.options.rowMoveCrossLevel){const e=0,i=s.tg_subs_length-1;if(ni){const e=n-i;return this.getMoveInfo(t,e,s)}}if(e>0){n-=this.getMoveLengthInList(t,o)-1}return n=d.clamp(n,0,o.length),{list:o,index:n}},moveRowsHandler:function(t,e){(t=this.removeRowsHandler(t)).reverse();const i=this.getMoveFocusRow(t,e),o=this.getMoveInfo(t,e,i),n=[o.index,0].concat(t);return o.list.splice.apply(o.list,n),this.initRowsHandler(),this.onNextUpdated((function(){this.scrollRowIntoView(i),this.trigger(y.onRowMoved,t)})),this.removeSortColumn(),this.update(),!0},moveRows:function(t,e){t=d.toList(t);const i=[];return t.forEach((t=>{const e=this.getRowItem(t);e&&i.push(e)})),!!i.length&&(!(i.length>=this.getRowsLength())&&(0!==(e=d.toNum(e,!0))&&this.moveRowsHandler(i,e)))},moveRowsUp:function(t){return this.moveRows(t,-1)},moveRowsDown:function(t){return this.moveRows(t,1)},moveRowsToTop:function(t){return this.moveRows(t,-this.getRowsLength(!0))},moveRowsToBottom:function(t){return this.moveRows(t,this.getRowsLength(!0))},moveSelectedRowsUp:function(){return this.moveRows(this.getSelectedRows(),-1)},moveSelectedRowsDown:function(){return this.moveRows(this.getSelectedRows(),1)},moveSelectedRowsToTop:function(){return this.moveRows(this.getSelectedRows(),-this.getRowsLength(!0))},moveSelectedRowsToBottom:function(){return this.moveRows(this.getSelectedRows(),this.getRowsLength(!0))}},Lt={getSelectedRow:function(){let t=null;return this.forEachSelectableRow((function(e){if(e.selected)return t=e,!1})),t},getSelectedRows:function(){const t=[];return this.forEachSelectableRow((function(e){e.selected&&t.push(e)})),t.length>1&&t.sort((function(t,e){const i=t.tg_selected_index,o=e.tg_selected_index;return i>o?1:i0&&void 0!==arguments[0])||arguments[0];if(t=Boolean(t),this.globalSelectedIndex=0,t&&!this.options.selectMultiple)return this;const e=this.getAllSelectedChangedList(t);return e.length?(this.updateRowsSelectedState(e),this):this},setRowSelected:function(){return(this.options.selectMultiple?this.setRowMultipleSelected:this.setRowSingleSelected).apply(this,arguments)},setRowSingleSelected:function(t){const e=this.getRowItem(t);if(!e)return this;if(!this.isRowSelectable(e))return this;if(e.selected)return this;const i=[],o=this.getSelectedRow();return o&&o.selected&&i.push(o),e.selected||i.push(e),i.length?(this.updateRowsSelectedState(i),this):this},setRowMultipleSelected:function(t,e){if(0===arguments.length)return this;if(1===arguments.length&&!1===arguments[0])return this.selectAll(!1);const i=this.toRowItemList(t,(t=>this.isRowSelectable(t)));return i.length?!1===e?(this.setRowListUnselected(i),this):d.hasShiftKey(e)&&1===i.length?(this.setRowBetweenListSelected(i[0]),this):(this.updateRowsSelectedState(i),this):this},setRowListUnselected:function(t){const e=this.getSelectedChangedList(t,!1);e.length&&this.updateRowsSelectedState(e)},setRowBetweenListSelected:function(t){const e=this.previousSelectedRow;if(e&&e!==t){const i=this.getBetweenSelectedChangedList(e,t);if(!i.length)return;this.updateRowsSelectedState(i,!0)}else this.updateRowsSelectedState([t])},getAllSelectedChangedList:function(t){const e=[];return this.forEachSelectableRow((i=>{this.isSelectedChanged(i,t)&&e.push(i)})),e},getSelectedChangedList:function(t,e){const i=[];return t.forEach((t=>{this.isSelectedChanged(t,e)&&i.push(t)})),i},getBetweenSelectedChangedList:function(t,e){const i=t.tg_index,o=e.tg_index,n=[];if(i=o;)n.push(t),t--}return this.toRowItemList(n,(t=>this.isRowSelectable(t)&&!t.selected))},updateRowsSelectedState:function(t,e){let i;t.forEach((t=>{const e=!t.selected;t.selected=e,e&&(t.tg_selected_index=this.globalSelectedIndex++,i=t),this.renderRowSelectedState(t)})),e||(this.previousSelectedRow=i),this.renderSelectAllState(),this.onNextUpdated((()=>{this.trigger(y.onSelectChanged,t)})),this.render()},renderRowSelectedState:function(t){const e=t.tg_view_index;this.viewport.rows.includes(e)&&(this.renderRowState(t,"selected"),this.flushCell(e,this.selectColumn.tg_view_index))},renderSelectAllState:function(){this.isSelectAllVisible()&&(this.asyncRenderSelectAllState||(this.asyncRenderSelectAllState=d.microtask(this.renderSelectAllStateSync)),this.asyncRenderSelectAllState.apply(this,arguments))},renderSelectAllStateSync:function(){const t=this.getSelectAllState();if(t===this.previousSelectAllState)return;this.previousSelectAllState=t;const e=this.selectColumn,i=w(this.getColumnHeaderNode(e)).find(".tg-select-icon-all");i.length&&(i.removeClass("tg-selected tg-mixed"),t&&i.addClass(`tg-${t}`))},getSelectAllState:function(){let t=0;this.forEachSelectableRow((e=>{t+=1}));const e=this.getSelectedRows().length;let i="mixed";return 0===e?(i="",this.previousSelectedRow=null):e===t&&(i="selected"),i},isSelectAllVisible:function(){const t=this.options;return!!(t.selectVisible&&t.selectAllVisible&&t.selectMultiple)}},xt={setRowHover:function(t,e){const i=this.getRowItem(t);return i?(this.renderRowHover(i,e),this):this},renderRowHover:function(t,e){if(this.previousHover&&(this.previousHover.removeClass("tg-hover"),this.previousHover=null),!e)return this;if(!1===this.rowHoverable)return;if(!1===t.hoverable)return this;if(t.tg_frozen&&!this.options.frozenRowHoverable)return this;const i=t.tg_view_index;return this.previousHover=this.$body.find(`.tg-row[row='${i}']`).addClass("tg-hover"),this},setRowState:function(t,e){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const o=this.getRowItem(t);return o?(o.tg_state_names||(o.tg_state_names=new Set),o.tg_state_names.add(e),o[e]=i,this.renderRowState(o,e),this):this},renderRowState:function(t,e){const i=this.getRowNodesByIndex(t.tg_view_index);if(i){const o=`tg-${e}`;t[e]?i.addClass(o):i.removeClass(o)}}},zt={getRowItem:function(t){return d.isNum(t)?(t<0&&(t=this.rowsInfo.length+t),this.rowsInfo.indexCache[t]):t?d.isNum(t.tg_index)?t:this.getRowItemById(t.id||t):void 0},getRowItemById:function(t){return this.getRowItemBy("id",t)},getRowItemBy:function(t,e){if(void 0!==e)return this.rowsInfo.indexCache.find((i=>i[t]===e))},getRowsLength:function(t){return t?this.rowsInfo.length:this.viewRows.length},getViewRowItem:function(t){return this.viewRows[t]},getPreRenderRowInfo:function(t){const e={rows:[],rowNotFound:!1,benchmark:0};if(!t.length)return 0===this.getRowsLength()&&(e.rowNotFound=!0),e;const i=[],o=this.frozenInfo.row;return t.forEach((t=>{this.getRowCache(t)?t>o&&i.push(t):e.rows.push(t)})),i.length&&(e.benchmark=Math.min.apply(Math,i)),e.rows.sort((function(t,i){return t{this.renderRowNodes(t,e.benchmark)}))},createRowNode:function(t,e,i,o,n,s){const r=document.createElement("div");return r.setAttribute("row",t),r.className=i,o&&(r.style.cssText=o),r.style.top=`${n}px`,s!==this.options.rowHeight&&(r.style.height=`${s}px`,r.style.lineHeight=`${s}px`),this.setNodeDataCache(r,{row:t,rowItem:e,rowNode:r}),r},appendRowNode:function(t,e,i,o){ithis.frozenInfo.row))return e;e-=this.frozenRowsHeight}return e-=this.scrollTopOffset,e},getRowTop:function(t){let e=t.tg_top;return t.tg_frozen||(e-=this.frozenRowsHeight),e},getRowVPos:function(t){const e=this.frozenInfo.bottom,i=this.frozenInfo.row;let o="top";return this.frozenInfo.rows&&(t<=i?e&&(o="bottom"):e||(o="bottom")),o},getRowCanvas:function(t,e){return"top"===t?"left"===e?this.$bodyTL:this.$bodyTR:"left"===e?this.$bodyBL:this.$bodyBR}},Mt={CHANGE:"change",START:"start",END:"end"},Pt={h:{type:"h",className:"tg-scrollbar-h",offset:"left",size:"width",page:"pageX",axis:"x",offsetName:"offsetX"},v:{type:"v",className:"tg-scrollbar-v",offset:"top",size:"height",page:"pageY",axis:"y",offsetName:"offsetY"}};class Nt extends k{static EVENT=Mt;static H="h";static V="v";type="h";settings={};size=0;viewSize=0;bodySize=0;trackSize=0;position=0;scale=0;thumbPosition=0;thumbScale=0;constructor(t,e){super(),this.settings=Pt[t]||Pt.h,this.type=this.settings.type,this.id=d.uid(4,`tg-scrollbar-${this.type}-`),this.$holder=w(e),this.$holder.find(`.${this.settings.className}`).remove(),this.options=this.generateOptions()}generateOptions(t){return d.merge({size:15,round:!1,blank:!1,motionDuration:200},t)}updateOptions(t){this.options=this.generateOptions(t);let e=this.options.size;d.isNum(e)||(e=d.toNum(e)),e=Math.round(e),e=Math.max(e,0),e=Math.min(e,30),this.size=e}create(){this.$container=w('
    ').appendTo(this.$holder),this.$container.attr("id",this.id),this.$container.addClass(d.classMap(["tg-scrollbar",this.settings.className,{"tg-scrollbar-round":this.options.round}])),this.$track=this.$container.find(".tg-scrollbar-track"),this.$thumb=this.$container.find(".tg-scrollbar-thumb"),this.thumbDrag=new O,this.thumbDrag.bind(O.EVENT.DRAG_START,((t,e)=>{this.thumbDragStart(e)})).bind(O.EVENT.DRAG_MOVE,((t,e)=>{this.thumbDragMove(e)})).bind(O.EVENT.DRAG_END,((t,e)=>{this.thumbDragEnd(e)}));const t=this.$container.get(0);return this.scrollEvents={mousedown:{handler:e=>{e.target.classList.contains("tg-scrollbar-thumb")?this.thumbMouseDownHandler(e):(this.trackEvents={mouseup:{handler:t=>{this.trackMouseupHandler(t)},options:{once:!0}}},d.bindEvents(this.trackEvents,t),this.trackMousedownHandler(e))},options:!0},selectstart:{handler:t=>{d.preventDefault(t)},options:!0}},d.bindEvents(this.scrollEvents,t),this}getBlank(){return this.options.blank}getSize(){return this.size}getViewSize(){return this.viewSize}getBodySize(){return this.bodySize}getTrackMouseDirection(){let t=1;return this.trackMousePosition0){const i=this.getMaxThumbPosition();t=Math.round(i*this.position/e),t=d.clamp(t,0,i)}return this.setThumbPosition(t),this}trackMousedownHandler(t){return this.motionStop(),this.trackMousePosition=this.getTrackMousePos(t),this.motionStart(),this}trackMouseupHandler(t){return d.unbindEvents(this.trackEvents),this.motionStop(),this.motionStarted||(this.trackMousePosition=this.getTrackMousePos(t),this.trackScrollHandler(),this.triggerEvent()),this}trackScrollHandler(){const t=Math.max(0,this.viewSize-20)*this.getTrackMouseDirection();return this.setOffset(t),this}motionStop(){return this.motion&&(this.motion.destroy(),this.motion=null),this}motionStart(){const t=this.position,e=Math.round(this.trackMousePosition/this.viewSize*this.getMaxPosition());return this.motionStarted=!1,this.motion=new B,this.motion.bind(B.EVENT.MOTION_START,((t,e)=>{this.motionStarted=!0})),this.motion.bind(B.EVENT.MOTION_MOVE,((t,e)=>{this.motionUpdateHandler(t,e)})),this.motion.start({duration:this.options.motionDuration,from:t,till:e}),this}motionUpdateHandler(t,e){e!==this.position&&(this.setPosition(e),this.triggerEvent())}thumbMouseDownHandler(t){this.$thumb.addClass("tg-scrollbar-thumb-hold"),this.thumbDrag.start(t,{target:this.$thumb})}thumbDragStart(t){this.motionStop(),t.thumbPositionStart=this.thumbPosition,this.trigger(Mt.START)}thumbDragMove(t){let e=t.thumbPositionStart+t[this.settings.offsetName];const i=this.getMaxThumbPosition();e=d.clamp(e,0,i),this.setThumbPosition(e);let o=0;i>0&&(o=d.per(e/i)*this.getMaxPosition(),o=Math.round(o)),this.position=o,this.triggerEvent()}thumbDragEnd(t){this.$thumb&&this.$thumb.removeClass("tg-scrollbar-thumb-hold"),this.trigger(Mt.END)}triggerEvent(){this.trigger(Mt.CHANGE,this.position)}getPosition(){return this.position}setPosition(t){t=d.toNum(t,!0);const e=this.getMaxPosition();t=d.clamp(t,0,e),this.position=t,this.updateThumbPosition()}getMaxPosition(){return this.bodySize-this.viewSize}updatePosition(){const t=this.getMaxPosition(),e=d.clamp(this.position,0,t);this.position=e}setOffset(t){t=d.toNum(t);const e=this.position+t;return this.setPosition(e),this}getScale(){return this.scale}setScale(t){return t=d.per(t),this.scale=t,this.scaleChangeHandler(),this}scaleChangeHandler(){let t=Math.round(this.viewSize*this.scale);if(t=Math.max(t,Math.round(1.5*this.options.size)),t=Math.min(t,this.viewSize-1),this.thumbSize=t,this.$thumb){const t={};"h"===this.type?(t.height=this.size,t.width=this.thumbSize):(t.width=this.size,t.height=this.thumbSize),this.$thumb.css(t)}}updateTrackSize(){const t={};return"h"===this.type?(t.width=this.trackSize,t.height=this.size):(t.height=this.trackSize,t.width=this.size),this.$container.css(t),this}updateThumbSize(){let t=0;return this.bodySize&&(t=this.trackSize/this.bodySize),this.setScale(t),this}parseSize(t){return t=d.toNum(t),t=Math.round(t),t=Math.max(t,0)}updateSize(t,e,i){t=this.parseSize(t),this.viewSize=t,e=this.parseSize(e),this.bodySize=e,i=d.isNum(i)?this.parseSize(i):t,this.trackSize=i,this.previousFadeIn=null}fade(t){return!(!this.$container||!this.size)&&(this.previousFadeIn!==t&&(this.previousFadeIn=t,t?this.$container.hasClass("tg-fade-out")&&this.$container.removeClass("tg-fade-out").addClass("tg-fade-in"):this.$container.removeClass("tg-fade-in").addClass("tg-fade-out"),!0))}show(){if(this.updatePosition(),!this.getBlank())return!this.$container&&this.size>0&&this.create(),this.$container?(this.updateTrackSize(),this.updateThumbSize(),this):this;this.remove()}hide(){return this.updatePosition(),this.remove(),this}remove(){if(this.motionStop(),d.unbindEvents(this.scrollEvents),d.unbindEvents(this.trackEvents),this.thumbDrag&&(this.thumbDrag.destroy(),this.thumbDrag=null),!this.$container)return this;this.$thumb=null,this.$track=null,this.$container.remove(),this.$container=null}destroy(){return this.remove(),this}}const _t={CHANGE:"change",START:"start",END:"end"};class kt extends k{static EVENT=_t;visible=!0;constructor(t,e){super(),this.id=d.uid(4,`tg-scroll-pane-${e}-`),this.gradientInfo=[],this.$container=w(t).attr("id",this.id),this.$container.addClass("tg-scroll-pane"),this.$scrollView=this.$container.find(".tg-scroll-view"),this.$scrollBody=this.$scrollView.find(".tg-scroll-body"),this.scrollbarH=new Nt(Nt.H,this.$container),this.scrollbarH.bind(Nt.EVENT.CHANGE,((t,e)=>{this.scrollHChangeHandler()})).bind(Nt.EVENT.START,(t=>{this.scrollStartEndHandler(!0)})).bind(Nt.EVENT.END,(t=>{this.scrollStartEndHandler()})),this.scrollbarV=new Nt(Nt.V,this.$container),this.scrollbarV.bind(Nt.EVENT.CHANGE,((t,e)=>{this.scrollVChangeHandler()})).bind(Nt.EVENT.START,(t=>{this.scrollStartEndHandler(!0)})).bind(Nt.EVENT.END,(t=>{this.scrollStartEndHandler()})),this.options=this.generateOptions()}generateOptions(t){return d.merge({scrollbarH:{},scrollbarV:{},scrollbarFade:!1,scrollSizeOnKeyPress:20,gradient:30},t)}scrollStartEndHandler(t){t?this.trigger(_t.START):this.trigger(_t.END)}show(){return this.$container.show(),this.visible=!0,this}hide(){return this.$container.hide(),this.visible=!1,this}width(){return this.scrollPaneW}height(){return this.scrollPaneH}render(t){return this.visible?(this.options=this.generateOptions(t),this.update(),this):this}update(){this.scrollPaneW=this.options.scrollPaneW,this.scrollPaneH=this.options.scrollPaneH,this.scrollBodyW=this.options.scrollBodyW,this.scrollBodyH=this.options.scrollBodyH,this.updateScrollbar()}setGroupH(t){this.groupH=d.toList(t)}setGroupV(t){this.groupV=d.toList(t)}updateGroupH(){if(!d.isList(this.groupH))return this;const t=this.scrollbarH.getPosition();return this.groupH.forEach((function(e){e&&e.updateScrollHFromGroup(t)})),this}updateGroupV(){if(!d.isList(this.groupV))return this;const t=this.scrollbarV.getPosition();return this.groupV.forEach((function(e){e&&e.updateScrollVFromGroup(t)})),this}updateGroupList(){this.updateGroupH(),this.updateGroupV()}updateScrollHFromGroup(t){this.scrollbarH.getPosition()!==t&&(this.scrollbarH.setPosition(t),this.updateScrollLeft(),this.triggerEvent())}updateScrollVFromGroup(t){this.scrollbarV.getPosition()!==t&&(this.scrollbarV.setPosition(t),this.updateScrollTop(),this.triggerEvent())}setPosition(t,e){return this.scrollbarH.setPosition(t),this.scrollbarV.setPosition(e),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList(),this}updateScrollbar(){this.scrollbarH.updateOptions(this.options.scrollbarH),this.scrollbarV.updateOptions(this.options.scrollbarV),this.updateScrollState(),this.updateScrollView(),this.updateScrollTrack(),this.scrollbarH.updateSize(this.scrollViewW,this.scrollBodyW,this.scrollTrackW),this.scrollbarV.updateSize(this.scrollViewH,this.scrollBodyH,this.scrollTrackH),this.hasScrollH?(this.scrollbarH.show(),this.scrollbarH.setPosition(this.scrollbarH.getPosition())):this.scrollbarH.hide(),this.hasScrollV?(this.scrollbarV.show(),this.scrollbarV.setPosition(this.scrollbarV.getPosition())):this.scrollbarV.hide(),this.updateScrollLeft(),this.updateScrollTop(),this.updateGroupList()}updateScrollState(){const t=this.scrollbarH.getSize(),e=this.scrollbarV.getSize(),i=this.scrollbarH.getBlank(),o=this.scrollbarV.getBlank(),n=this.options.scrollbarFade;let s=!1,r=0;(function(){(this.scrollPaneWe&&t.push("left"),ie&&t.push("top"),o{const i=`tg-gradient-${e}`;t.includes(e)?this.$container.addClass(i):this.$container.removeClass(i)})))}getScrollLeft(){return this.scrollbarH.getPosition()}getScrollTop(){return this.scrollbarV.getPosition()}getMaxScrollLeft(){return this.scrollbarH.getMaxPosition()}getMaxScrollTop(){return this.scrollbarV.getMaxPosition()}getScrollTopOffset(){const t=this.getScrollTop();return t-t%1e4}triggerEvent(){this.trigger(_t.CHANGE,{scrollLeft:this.getScrollLeft(),scrollTop:this.getScrollTop()})}scrollHChangeHandler(){this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent()}scrollVChangeHandler(){this.updateScrollTop(),this.updateGroupList(),this.triggerEvent()}setOffsetH(t){const e=this.getScrollLeft();this.scrollbarH.setOffset(t);return this.getScrollLeft()!==e&&(this.updateScrollLeft(),this.updateGroupList(),this.triggerEvent(),!0)}setOffsetV(t){const e=this.getScrollTop();this.scrollbarV.setOffset(t);return this.getScrollTop()!==e&&(this.updateScrollTop(),this.updateGroupList(),this.triggerEvent(),!0)}mouseWheelHandler(t){const e=t.deltaX,i=t.deltaY,o=Math.abs(e);if(o>Math.abs(i)){if(this.hasScrollH)return this.setOffsetH(e)}else{if(this.hasScrollV)return this.setOffsetV(i);if(this.hasScrollH&&!o)return this.setOffsetH(i)}return!1}keyPageUpHandler(t){return this.setOffsetV(-this.scrollViewH)}keyPageDownHandler(t){return this.setOffsetV(this.scrollViewH)}keyEndHandler(t){return this.setOffsetV(this.scrollBodyH)}keyHomeHandler(t){return this.setOffsetV(-this.scrollBodyH)}keyLeftHandler(t){return this.setOffsetH(-this.options.scrollSizeOnKeyPress)}keyUpHandler(t){return this.setOffsetV(-this.options.scrollSizeOnKeyPress)}keyRightHandler(t){return this.setOffsetH(this.options.scrollSizeOnKeyPress)}keyDownHandler(t){return this.setOffsetV(this.options.scrollSizeOnKeyPress)}destroy(){return this.visible=!1,this.groupH=null,this.groupV=null,this.scrollbarV&&(this.scrollbarV.destroy(),this.scrollbarV=null),this.scrollbarH&&(this.scrollbarH.destroy(),this.scrollbarH=null),this.$container=null,this.$scrollView=null,this.$scrollBody=null,this}}const Vt={initScrollPane:function(){this.initFrozenStyle(),this.createScrollPane()},initFrozenStyle:function(){const t={HL:{container:this.$paneHL,cls:[]},HR:{container:this.$paneHR,cls:[]},TL:{container:this.$paneTL,cls:[]},TR:{container:this.$paneTR,cls:[]},BL:{container:this.$paneBL,cls:[]},BR:{container:this.$paneBR,cls:[]}},e="tg-frozen-h";this.frozenInfo.rows&&(this.frozenInfo.bottom?(t.BL.cls.push(e),t.BR.cls.push(e)):(t.TL.cls.push(e),t.TR.cls.push(e)));const i="tg-frozen-v",o="tg-frozen-line-v";this.frozenInfo.columns&&(this.frozenInfo.right?(t.HR.cls.push(i),t.TR.cls.push(i),t.BR.cls.push(i)):(t.HL.cls.push(i),t.TL.cls.push(i),t.BL.cls.push(i)),t.HL.cls.push(o),t.TL.cls.push(o),t.BL.cls.push(o));const n="tg-frozen",s=[n,e,i,o].join(" ");Object.keys(t).forEach((function(e){const i=t[e],o=i.container;o.removeClass(s);const r=i.cls;if(!r.length)return;const l=[n].concat(r).join(" ");o.addClass(l)}))},createScrollPane:function(){this.removeScrollPane(),this.scrollPaneMap={HL:new kt(this.$paneHL,"header-left"),HR:new kt(this.$paneHR,"header-right"),TL:new kt(this.$paneTL,"top-left"),TR:new kt(this.$paneTR,"top-right"),BL:new kt(this.$paneBL,"bottom-left"),BR:new kt(this.$paneBR,"bottom-right")},this.scrollPaneMap.BR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.TR]),this.scrollPaneMap.TR.setGroupH([this.scrollPaneMap.HR,this.scrollPaneMap.BR]),this.scrollPaneMap.BL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.TL]),this.scrollPaneMap.TL.setGroupH([this.scrollPaneMap.HL,this.scrollPaneMap.BL]),this.scrollPaneMap.BR.setGroupV(this.scrollPaneMap.BL),this.scrollPaneMap.BL.setGroupV(this.scrollPaneMap.BR),this.scrollPaneMap.TR.setGroupV(this.scrollPaneMap.TL),this.scrollPaneMap.TL.setGroupV(this.scrollPaneMap.TR),this.initActiveScrollPane(),this.initPaneVisibility()},initActiveScrollPane:function(){const t=this.getScrollPaneVP(),e=this.getScrollPaneHP(),i=`${t}${e}`;this.scrollPane=this.scrollPaneMap[i],this.scrollPane.bind(kt.EVENT.CHANGE,((t,e)=>{this.scrollPaneChangeHandler(t,e)})).bind(kt.EVENT.START,(t=>{this.rowHoverable=!1})).bind(kt.EVENT.END,(t=>{this.rowHoverable=!0}));let o={L:"L",R:"L"};this.frozenInfo.columns&&this.frozenInfo.right&&(o={L:"R",R:"L"});const n=`${t}${o[e]}`;this.scrollPaneFrozen=this.scrollPaneMap[n]},getScrollPaneVP:function(){return this.frozenInfo.rows&&!this.frozenInfo.bottom?"B":"T"},getScrollPaneHP:function(){return this.frozenInfo.columns&&!this.frozenInfo.right?"R":"L"},initPaneVisibility:function(){this.scrollPaneMap.HL.show(),this.scrollPaneMap.TL.show(),this.frozenInfo.columns?(this.scrollPaneMap.HR.show(),this.scrollPaneMap.TR.show(),this.frozenInfo.rows?(this.scrollPaneMap.BL.show(),this.scrollPaneMap.BR.show()):(this.scrollPaneMap.BL.hide(),this.scrollPaneMap.BR.hide())):(this.scrollPaneMap.HR.hide(),this.scrollPaneMap.TR.hide(),this.scrollPaneMap.BR.hide(),this.frozenInfo.rows?this.scrollPaneMap.BL.show():this.scrollPaneMap.BL.hide())},scrollPaneChangeHandler:function(t,e){this.hideColumnLine(),this.scrollLeft=e.scrollLeft,this.scrollTop=e.scrollTop,this.scrollRenderHandler()},scrollbarFadeInOutHandler:function(t,e){this.options.scrollbarFade&&(e?this.updateScrollPaneFade(!0):this.options.scrollbarFadeTimeout||this.updateScrollPaneFade(!1))},updateScrollPaneFade:function(t){if(!this.options.scrollbarFade)return;this.updateScrollPaneFadeSync(t);const e=this.options.scrollbarFadeTimeout;e&&(clearTimeout(this.timeout_fade),this.timeout_fade=setTimeout((()=>{this.updateScrollPaneFadeSync(!1)}),e))},updateScrollPaneFadeSync:function(t){if(this.previousScrollbarFadeIn===t)return;this.previousScrollbarFadeIn=t;const e=[];Object.keys(this.scrollPaneMap).forEach((t=>{const i=this.scrollPaneMap[t];i.hasScrollbar()&&e.push(i)})),e.length&&e.forEach((function(e){e.fade(t)}))},updateScrollPane:function(){const t=this.getScrollbarOptions();this.scrollPaneMap.HL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthL,scrollBodyH:this.headerHeight,scrollbarV:t.HLV,scrollbarH:t.HLH})),this.scrollPaneMap.HR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.headerHeight,scrollBodyW:this.bodyWidthR,scrollBodyH:this.headerHeight,scrollbarV:t.HRV,scrollbarH:t.HRH})),this.scrollPaneMap.TL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightT,scrollbarV:t.TLV,scrollbarH:t.TLH})),this.scrollPaneMap.TR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightT,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightT,scrollbarV:t.TRV,scrollbarH:t.TRH})),this.scrollPaneMap.BL.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthL,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthL,scrollBodyH:this.bodyHeightB,scrollbarV:t.BLV,scrollbarH:t.BLH})),this.scrollPaneMap.BR.render(this.getScrollPaneOptions({scrollPaneW:this.paneWidthR,scrollPaneH:this.paneHeightB,scrollBodyW:this.bodyWidthR,scrollBodyH:this.bodyHeightB,scrollbarV:t.BRV,scrollbarH:t.BRH})),this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop(),this.updateScrollPaneFade(Boolean(this.options.scrollbarFadeTimeout))},getScrollPaneOptions:function(t){const e=this.options;return t.scrollbarFade=e.scrollbarFade,t.gradient=d.clamp(d.toNum(e.scrollPaneGradient,!0),0,100),t},getScrollbarOptions:function(){const t=this.options.scrollbarRound,e={};return["HLH","HLV","HRH","HRV","TLH","TLV","TRH","TRV","BLH","BLV","BRH","BRV"].forEach((function(i){e[i]={size:0,round:t,blank:!1}})),this.scrollbarOptionsHandler(e),this.scrollbarFadeHandler(e),e},scrollbarOptionsHandler:function(t){const e=this.scrollbarSizeH,i=this.scrollbarSizeV;this.scrollbarHeaderHandler(t,e,i),this.frozenInfo.columns?this.frozenInfo.rows?this.scrollbarC1R1Handler(t,e,i):this.scrollbarC1R0Handler(t,e,i):this.frozenInfo.rows?this.scrollbarC0R1Handler(t,e,i):this.scrollbarC0R0Handler(t,e,i)},scrollbarFadeHandler:function(t){if(this.options.scrollbarFade)for(const e in t)if(d.hasOwn(t,e)){const i=t[e];i.size>0&&i.blank&&(i.blank=!1,i.size=0)}},scrollbarHeaderHandler:function(t,e,i){this.hasVScroll&&(this.frozenInfo.columns?(t.HRV.size=i,t.HRV.blank=1):(t.HLV.size=i,t.HLV.blank=1))},scrollbarC0R0Handler:function(t,e,i){t.TLH.size=e,t.TLV.size=i},scrollbarC0R1Handler:function(t,e,i){this.frozenInfo.bottom?this.scrollbarC0R1B1Handler(t,e,i):this.scrollbarC0R1B0Handler(t,e,i)},scrollbarC0R1B1Handler:function(t,e,i){t.BLH.size=e,t.TLV.size=i,this.hasVScroll&&(t.BLV.size=i,t.BLV.blank=1)},scrollbarC0R1B0Handler:function(t,e,i){t.BLH.size=e,t.BLV.size=i,this.hasVScroll&&(t.TLV.size=i,t.TLV.blank=1)},scrollbarC1R0Handler:function(t,e,i){this.frozenInfo.right?this.scrollbarC1R0R1Handler(t,e,i):this.scrollbarC1R0R0Handler(t,e,i)},scrollbarC1R0R1Handler:function(t,e,i){this.hasHScroll&&(t.TLH.size=e,this.scrollPaneHidden?(t.TRH.size=e,t.TLH.blank=!0):(t.TRH.size=e,t.TRH.blank=!0)),t.TRV.size=i},scrollbarC1R0R0Handler:function(t,e,i){this.hasHScroll&&(t.TRH.size=e,this.scrollPaneHidden?(t.TLH.size=e,t.TRH.blank=!0):(t.TLH.size=e,t.TLH.blank=!0)),t.TRV.size=i},scrollbarC1R1Handler:function(t,e,i){this.frozenInfo.right?this.frozenInfo.bottom?this.scrollbarC1R1R1B1Handler(t,e,i):this.scrollbarC1R1R1B0Handler(t,e,i):this.frozenInfo.bottom?this.scrollbarC1R1R0B1Handler(t,e,i):this.scrollbarC1R1R0B0Handler(t,e,i)},scrollbarC1R1R1B1Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden&&(t.BRH.size=e,t.BLH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R1B0Handler:function(t,e,i){this.hasHScroll&&(t.BLH.size=e,this.scrollPaneHidden?(t.BRH.size=e,t.BLH.blank=!0):(t.BRH.size=e,t.BRH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},scrollbarC1R1R0B1Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden&&(t.BLH.size=e,t.BRH.blank=!0)),t.TRV.size=i,this.hasVScroll&&(t.BRV.size=i,t.BRV.blank=1)},scrollbarC1R1R0B0Handler:function(t,e,i){this.hasHScroll&&(t.BRH.size=e,this.scrollPaneHidden?(t.BLH.size=e,t.BRH.blank=!0):(t.BLH.size=e,t.BLH.blank=!0)),t.BRV.size=i,this.hasVScroll&&(t.TRV.size=i,t.TRV.blank=1)},removeScrollPane:function(){clearTimeout(this.timeout_fade),this.previousScrollbarFadeIn=null,this.scrollPaneMap&&(Object.keys(this.scrollPaneMap).forEach((t=>{const e=this.scrollPaneMap[t];e&&e.destroy()})),this.scrollPaneMap=null,this.scrollPane=null,this.scrollPaneFrozen=null)}},Ot={updateScrollState:function(){this.updateGlobalScrollInfo(),this.updateHScrollState(),this.updateVScrollState(),this.updateBlankColumnWidth(),this.scrollStateChanged=!1,this.previousHasHScroll===this.hasHScroll&&this.previousHasVScroll===this.hasVScroll||(this.scrollStateChanged=!0,this.previousHasHScroll=this.hasHScroll,this.previousHasVScroll=this.hasVScroll,this.trigger(y.onScrollStateChanged,{hasHScroll:this.hasHScroll,hasVScroll:this.hasVScroll}))},updateGlobalScrollInfo:function(){this.totalRowsLength=this.getRowsLength(),this.totalRowsHeight=this.getRowsHeight(),this.frozenRowsHeight=this.getFrozenRowsHeight(),this.scrollRowsHeight=this.totalRowsHeight-this.frozenRowsHeight,this.totalRowsHeight=Math.max(this.totalRowsHeight,1),this.scrollRowsHeight=Math.max(this.scrollRowsHeight,1),this.flushRowFrom(this.totalRowsLength)},updateHScrollState:function(){if(this.hasHScroll=!0,this.updateScrollPaneHiddenState(),this.updateHScrollByScrollPaneHidden(),this.scrollPaneHidden)return;this.containerWidth-this.columnsWidth>=0&&(this.hasHScroll=!1)},getScrollPaneCurrentWidth:function(){return this.frozenInfo.right?this.bodyWidth-this.columnsWidthR:this.bodyWidth-this.columnsWidthL},updateHScrollByScrollPaneHidden:function(){if(this.scrollPaneHidden){this.hasHScroll=!1;this.getScrollPaneCurrentWidth()=this.totalRowsHeight&&(this.hasVScroll=!1)}},updateBlankColumnWidth:function(){let t=this.containerWidth-this.columnsWidth;!this.hasVScroll||this.hasHScroll||this.options.scrollbarFade||(t-=this.scrollbarSizeV),this.scrollPaneHidden&&(t=0),this.hasHScroll||(t>=0?(this.frozenInfo.columns?this.columnsWidthR+=t:this.columnsWidthL+=t,this.blankColumn.tg_width=t):this.hasHScroll=!0)}},$t={scrollToRow:function(t){const e=this.getRowItem(t);return this.scrollToItem(e,null),this},scrollToColumn:function(t){const e=this.getColumnItem(t);return this.scrollToItem(null,e),this},scrollToCell:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollToItem(i,o),this},scrollToFirstRow:function(){return this.setScrollTop(0),this},scrollToLastRow:function(){const t=this.getViewRows(),e=t[t.length-1],i=this.getScrollRowPosition(e);if(d.isNum(i))return this.setScrollTop(i),this},scrollToFirstColumn:function(){return this.setScrollLeft(0),this},scrollToLastColumn:function(t){const e=this.getViewColumns();let i=e[e.length-2];t&&(i=e[e.length-1]);const o=this.getScrollColumnPosition(i);if(d.isNum(o))return this.setScrollLeft(o),this},scrollRowIntoView:function(t){const e=this.getRowItem(t);return this.scrollItemIntoView(e,null),this},scrollColumnIntoView:function(t){const e=this.getColumnItem(t);return this.scrollItemIntoView(null,e),this},scrollCellIntoView:function(t,e){const i=this.getRowItem(t),o=this.getColumnItem(e);return this.scrollItemIntoView(i,o),this},setScroll:function(t,e){return t===this.scrollLeft&&e===this.scrollTop||(this.scrollLeft=t,this.scrollTop=e,this.scrollHandler()),this},setScrollLeft:function(t){return t===this.scrollLeft||(this.scrollLeft=t,this.scrollHandler()),this},setScrollTop:function(t){return t===this.scrollTop||(this.scrollTop=t,this.scrollHandler()),this},getScrollRowPosition:function(t){if(!t)return;let e=t.tg_view_index;return e-=this.frozenInfo.rows,e>=0?this.getRowTop(t):void 0},getScrollColumnPosition:function(t){if(!t)return;let e=t.tg_left;return this.frozenInfo.columns&&(e-=this.bodyWidthL),e>=0?e:void 0},scrollToItem:function(t,e){return this.scrollToChanged=!1,this.scrollToRowHandler(t),this.scrollToColumnHandler(e),this.scrollToChanged?(this.scrollHandler(),this):this},scrollToRowHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);d.isNum(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollToChanged=!0)},scrollToColumnHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);d.isNum(e)&&e!==this.scrollLeft&&(this.scrollLeft=e,this.scrollToChanged=!0)},scrollItemIntoView:function(t,e){return this.scrollIntoViewChanged=!1,this.scrollRowIntoViewHandler(t),this.scrollColumnIntoViewHandler(e),this.scrollIntoViewChanged?(this.scrollHandler(),this):this},scrollRowIntoViewHandler:function(t){if(!t)return;const e=this.getScrollRowPosition(t);if(!d.isNum(e))return;if(ethis.scrollTop+o){const t=e-(o-i);this.scrollTop=t,this.scrollIntoViewChanged=!0}},scrollColumnIntoViewHandler:function(t){if(!t)return;const e=this.getScrollColumnPosition(t);if(!d.isNum(e))return;if(ethis.scrollLeft+o){const t=e-(o-i);this.scrollLeft=t,this.scrollIntoViewChanged=!0}},scrollOnInit:function(){const{scrollLeft:t,scrollTop:e,scrollColumn:i,scrollRow:o}=this.renderSettings;this.scrollIntoViewChanged=!1,Number.isInteger(t)&&t!==this.scrollLeft&&(this.scrollLeft=t,this.scrollIntoViewChanged=!0),Number.isInteger(e)&&e!==this.scrollTop&&(this.scrollTop=e,this.scrollIntoViewChanged=!0),i&&this.scrollColumnIntoViewHandler(i),o&&this.scrollRowIntoViewHandler(o),this.scrollIntoViewChanged&&this.scrollPane.setPosition(this.scrollLeft,this.scrollTop)},scrollHandler:function(){this.scrollPane.setPosition(this.scrollLeft,this.scrollTop),this.scrollRenderHandler()},scrollRenderHandler:function(){this.previousScrollLeft===this.scrollLeft&&this.previousScrollTop===this.scrollTop||(this.previousScrollLeft=this.scrollLeft,this.previousScrollTop=this.scrollTop,this.onNextUpdated((()=>{this.updateScrollPaneFade(!0),this.trigger(y.onScroll,{scrollLeft:this.scrollLeft,scrollTop:this.scrollTop})})),this.render())},scrollTouchStartHandler:function(t,e){this.hideColumnLine(),this.scrollTouchLeft=this.getScrollLeft(),this.scrollTouchTop=this.getScrollTop(),this.scrollMaxTouchLeft=this.getMaxScrollLeft(),this.scrollMaxTouchTop=this.getMaxScrollTop()},getTouchOrientation:function(t){return t.orientation?t.orientation:[e.LEFT,e.RIGHT].includes(t.direction)?(t.orientation||(t.orientation="Y"),t.orientation):[e.UP,e.DOWN].includes(t.direction)?(t.orientation||(t.orientation="X"),t.orientation):void 0},scrollTouchMoveHandler:function(t,e){if(e.touchLength>1)return;let i=e.offsetX,o=e.offsetY;const n=this.getTouchOrientation(e);"X"===n?i=0:"Y"===n&&(o=0);let s=this.scrollTouchLeft-i,r=this.scrollTouchTop-o;s=d.clamp(s,0,this.scrollMaxTouchLeft),r=d.clamp(r,0,this.scrollMaxTouchTop);let l=!1;this.scrollPaneHidden&&(l=this.scrollPaneFrozen.setOffsetH(-e.moveX),s=0);const h=this.getScrollLeft(),a=this.getScrollTop();(s!==h||r!==a||l)&&(d.preventDefault(e.e),this.setScroll(s,r))},scrollTouchEndHandler:function(){this.protectedItem=null},scrollTouchInertiaHandler:function(t,e){const i=this.getScrollLeft(),o=this.getScrollTop(),n=i-e.touchInertiaX,s=o-e.touchInertiaY;this.setScroll(n,s)},getScrollViewWidth:function(){let t=this.getScrollPaneWidth();return this.frozenInfo.right||(t-=this.getScrollbarWidth()),t},getScrollViewHeight:function(){let t=this.getScrollPaneHeight();return this.frozenInfo.bottom||(t-=this.getScrollbarHeight()),t},getScrollPaneWidth:function(){return this.scrollPane.width()},getScrollPaneHeight:function(){return this.scrollPane.height()},getScrollbarWidth:function(){return this.hasVScroll&&!this.options.scrollbarFade?this.scrollbarSizeV:0},getScrollbarHeight:function(){return this.hasHScroll&&!this.options.scrollbarFade?this.scrollbarSizeH:0},getScrollLeft:function(){return this.scrollPane.getScrollLeft()},getScrollTop:function(){return this.scrollPane.getScrollTop()},getMaxScrollLeft:function(){return this.scrollPane.getMaxScrollLeft()},getMaxScrollTop:function(){return this.scrollPane.getMaxScrollTop()}};class Dt{constructor(t){this.options=this.generateOptions(t)}generateOptions(t){return d.merge({ignore:null,sortField:"",sortFactor:1,sortBlankFactor:1,sortComparer:null},t)}sortList(t){if(!d.isList(t)||1===t.length)return!1;this.ignoreExcludeHandler(t);const e=this.comparerHandler(t);return this.ignoreIncludeHandler(t),e}getDefaultComparer(t){return(ft[t]||ft.string).bind(this)}comparerHandler(t){const e=this.options,i=e.sortField,o=e.sortFactor,n=e.sortBlankFactor,s=e.sortComparer;return"function"==typeof s&&(t.sort(((t,e)=>s.call(this,t,e,{sortField:i,sortFactor:o,sortBlankFactor:n}))),!0)}ignoreExcludeHandler(t){const e=this.options.ignore;this.ignoreListTop=[],this.ignoreListBottom=[];const i=[];for(let o=0,n=t.length;o{t.unshift(e.item)})),this.ignoreListBottom.forEach((e=>{t.push(e.item)}))}}const Bt={removeSortColumn:function(){return this.sortColumn=null,this.$header&&this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted"),this},setSortColumn:function(t){if(!(t=this.getColumnItem(t)))return;if(!this.isColumnSortable(t))return;t===this.sortColumn?t.sortAsc=!t.sortAsc:d.hasOwn(t,"sortAsc")||(t.sortAsc=this.options.sortAsc),this.sortColumn=t;if(this.getRowsLength()-this.frozenInfo.rows<2)return;if(!this.headerCreated)return;this.updateRowsSort()&&(this.renderHeaderSort(),this.flushSort(),this.render("rows"))},renderHeaderSort:function(){const t=this.sortColumn;if(!t)return this;if(!this.isColumnSortable(t))return this;this.$header.find(".tg-column-sorted").removeClass("tg-column-sorted");const e=t.tg_view_index,i=this.$header.find(`.tg-header-item[column='${e}']`).find(".tg-column-header").addClass("tg-column-sorted");return t.sortAsc?i.removeClass("tg-sort-desc").addClass("tg-sort-asc"):i.removeClass("tg-sort-asc").addClass("tg-sort-desc"),this},getSortComparer:function(t){const e=t.comparer;if("function"==typeof e)return e;const i=this.options.sortComparers,o=i[e||t.type];return"function"==typeof o?o:i.string},updateRowsSort:function(){const t=this.sortColumn;if(!t)return!1;const e=t.id;return!!e&&this.sortRows(e,t)},sortRows:function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=e.sortAsc?-1:1,o=this.options.sortBlankValueBottom?1:i,n=this.getSortComparer(e);let s=!1;const r=new Dt({ignore:function(t){return t.tg_frozen?{item:t,top:!0}:t.sortFixed?{item:t,top:"top"===t.sortFixed}:void 0},sortField:t,sortFactor:i,sortBlankFactor:o,sortComparer:n}),l=function(t){r.sortList(t)&&(s=!0),t.forEach((function(t,e){t.tg_sub_index=e,t.subs&&l(t.subs)}))};return l(this.rows),s&&this.initRowsHandler(),s}},At={default:{},lightblue:{rowHeight:35,scrollbarSize:10,scrollbarRound:!0},dark:{}},Wt={getAllThemes:function(){return Object.keys(At)},getThemeOptions:function(t){return At[t]}},Ft={update:function(){return this.flushBody(),this.render("rows"),this},updateRow:function(t,e){const i=this.getRowItem(t);if(!i)return this;if(e&&"object"==typeof e){const t=this.getItemSnapshot(e);Object.keys(t).forEach((function(e){i[e]=t[e]}))}return this.flushRow(i.tg_view_index),this.render("rows"),this},updateCell:function(t,e,i){const o=this.getRowItem(t);if(!o)return this;const n=this.getColumnItem(e);return n?(arguments.length>2&&(o[n.id]=i),this.flushCell(o.tg_view_index,n.tg_view_index),this.render("rows"),this):this},onNextUpdated:function(t){return"function"!=typeof t||this.once(y.onUpdated,t),this}},Gt={getViewport:function(){this.scrollLeft=this.getScrollLeft(),this.scrollTop=this.getScrollTop();return{rows:this.getViewportRows(),columns:this.getViewportColumns()}},getViewportRows:function(){const t=[],e=this.viewRows,i=e.length;if(!i)return t;let o=this.options.rowCacheLength;o=d.clamp(d.toNum(o,!0),0,i);const n=this.frozenInfo.rows;if(n){let e=0;for(;e1;){const n=Math.floor(.5*(e+i)),s=t[n],r=this.getRowTop(s),l=this.getRowHeight(s);if(or+l))return n;e=n}}const n=t[i];return o=e)return[];const i=[],o=this.frozenInfo.columns,n=this.viewColumns;for(let s=o,r=n.length;s0;){const n=t[0]-1;n>o&&t.unshift(n);const s=t[t.length-1]+1;si)&&!(n0&&(e.rows.length=o),i=t.options}return this.data=e,this.dataOptions=i,this}setDataSnapshot(t){return this.setData(this.generateDataSnapshot(t)),this}getData(){return this.data}toString(){return"[object Grid]"}}var Ut;Ut=jt.prototype,[v,R,S,T,E,I,L,x,z,F,G,j,K,q,J,Z,tt,et,pt,mt,bt,wt,vt,Ht,{keyTabHandler:function(t){},keyEnterHandler:function(t){},keyEscHandler:function(t){},keyPageUpHandler:function(t){return this.scrollPane.keyPageUpHandler(t)},keyPageDownHandler:function(t){return this.scrollPane.keyPageDownHandler(t)},keyEndHandler:function(t){return this.scrollPane.keyEndHandler(t)},keyHomeHandler:function(t){return this.scrollPane.keyHomeHandler(t)},keyLeftHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyLeftHandler(t):this.scrollPane.keyLeftHandler(t)},keyUpHandler:function(t){return this.scrollPane.keyUpHandler(t)},keyRightHandler:function(t){return this.scrollPaneHidden?this.scrollPaneFrozen.keyRightHandler(t):this.scrollPane.keyRightHandler(t)},keyDownHandler:function(t){return this.scrollPane.keyDownHandler(t)}},Ct,yt,Rt,St,Tt,{showRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!1)},hideRow:function(t){return this.updateRowsInvisible(this.toRowItemList(t),!0)},updateRowsInvisible:function(t,e){if(!t.length)return!1;const i=[];return t.forEach((t=>{t.invisible!==e&&(t.invisible=e,t.tg_invisible=e,i.push(t))})),!!i.length&&(this.update(),!0)}},Et,It,Lt,xt,zt,Vt,Ot,$t,Bt,Wt,Ft,Gt].forEach((t=>{for(const e in t){if(d.hasOwn(Ut,e))throw new Error(`ERROR: extends with an existing key: "${e}"`);Ut[e]=t[e]}}));const Xt=jt,Yt=e.VERSION,Kt=e.TIMESTAMP,qt={VERSION:Yt,TIMESTAMP:Kt,Grid:Xt,$:w,CONST:e,EventBase:k,Icon:X,Motion:B,ScrollPane:kt,Util:d}})();var n=o.$,s=o.MP,r=o._d,l=o.xA,h=o.In,a=o.T8,c=o.Gr,d=o.ht,u=o.J0,g=o.xv,f=o.Ay;export{n as $,s as CONST,r as EventBase,l as Grid,h as Icon,a as Motion,c as ScrollPane,d as TIMESTAMP,u as Util,g as VERSION,f as default}; \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/json-checker.py b/custom_nodes/ComfyUI-Manager/json-checker.py new file mode 100644 index 000000000..a6c1317ff --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/json-checker.py @@ -0,0 +1,23 @@ +import json +import argparse + +def check_json_syntax(file_path): + try: + with open(file_path, 'r') as file: + json_str = file.read() + json.loads(json_str) + print(f"[ OK ] {file_path}") + except json.JSONDecodeError as e: + print(f"[FAIL] {file_path}\n\n {e}\n") + except FileNotFoundError: + print(f"[FAIL] {file_path}\n\n File not found\n") + +def main(): + parser = argparse.ArgumentParser(description="JSON File Syntax Checker") + parser.add_argument("file_path", type=str, help="Path to the JSON file for syntax checking") + + args = parser.parse_args() + check_json_syntax(args.file_path) + +if __name__ == "__main__": + main() diff --git a/custom_nodes/ComfyUI-Manager/misc/Impact.pack b/custom_nodes/ComfyUI-Manager/misc/Impact.pack new file mode 100644 index 000000000..93fd32847 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/misc/Impact.pack @@ -0,0 +1,444 @@ +{ + "Impact::MAKE_BASIC_PIPE": { + "category": "", + "config": { + "1": { + "input": { + "text": { + "name": "Positive prompt" + } + } + }, + "2": { + "input": { + "text": { + "name": "Negative prompt" + } + } + } + }, + "datetime": 1705418802481, + "external": [], + "links": [ + [ + 0, + 1, + 1, + 0, + 1, + "CLIP" + ], + [ + 0, + 1, + 2, + 0, + 1, + "CLIP" + ], + [ + 0, + 0, + 3, + 0, + 1, + "MODEL" + ], + [ + 0, + 1, + 3, + 1, + 1, + "CLIP" + ], + [ + 0, + 2, + 3, + 2, + 1, + "VAE" + ], + [ + 1, + 0, + 3, + 3, + 3, + "CONDITIONING" + ], + [ + 2, + 0, + 3, + 4, + 4, + "CONDITIONING" + ] + ], + "nodes": [ + { + "flags": {}, + "index": 0, + "mode": 0, + "order": 0, + "outputs": [ + { + "links": [], + "name": "MODEL", + "shape": 3, + "slot_index": 0, + "type": "MODEL" + }, + { + "links": [], + "name": "CLIP", + "shape": 3, + "slot_index": 1, + "type": "CLIP" + }, + { + "links": [], + "name": "VAE", + "shape": 3, + "slot_index": 2, + "type": "VAE" + } + ], + "pos": [ + 550, + 360 + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "size": { + "0": 315, + "1": 98 + }, + "type": "CheckpointLoaderSimple", + "widgets_values": [ + "SDXL/sd_xl_base_1.0_0.9vae.safetensors" + ] + }, + { + "flags": {}, + "index": 1, + "inputs": [ + { + "link": null, + "name": "clip", + "type": "CLIP" + } + ], + "mode": 0, + "order": 1, + "outputs": [ + { + "links": [], + "name": "CONDITIONING", + "shape": 3, + "slot_index": 0, + "type": "CONDITIONING" + } + ], + "pos": [ + 940, + 480 + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "size": { + "0": 263, + "1": 99 + }, + "title": "Positive", + "type": "CLIPTextEncode", + "widgets_values": [ + "" + ] + }, + { + "flags": {}, + "index": 2, + "inputs": [ + { + "link": null, + "name": "clip", + "type": "CLIP" + } + ], + "mode": 0, + "order": 2, + "outputs": [ + { + "links": [], + "name": "CONDITIONING", + "shape": 3, + "slot_index": 0, + "type": "CONDITIONING" + } + ], + "pos": [ + 940, + 640 + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "size": { + "0": 263, + "1": 99 + }, + "title": "Negative", + "type": "CLIPTextEncode", + "widgets_values": [ + "" + ] + }, + { + "flags": {}, + "index": 3, + "inputs": [ + { + "link": null, + "name": "model", + "type": "MODEL" + }, + { + "link": null, + "name": "clip", + "type": "CLIP" + }, + { + "link": null, + "name": "vae", + "type": "VAE" + }, + { + "link": null, + "name": "positive", + "type": "CONDITIONING" + }, + { + "link": null, + "name": "negative", + "type": "CONDITIONING" + } + ], + "mode": 0, + "order": 3, + "outputs": [ + { + "links": null, + "name": "basic_pipe", + "shape": 3, + "slot_index": 0, + "type": "BASIC_PIPE" + } + ], + "pos": [ + 1320, + 360 + ], + "properties": { + "Node name for S&R": "ToBasicPipe" + }, + "size": { + "0": 241.79998779296875, + "1": 106 + }, + "type": "ToBasicPipe" + } + ], + "packname": "Impact", + "version": "1.0" + }, + "Impact::SIMPLE_DETAILER_PIPE": { + "category": "", + "config": { + "0": { + "output": { + "0": { + "visible": false + }, + "1": { + "visible": false + } + } + }, + "2": { + "input": { + "Select to add LoRA": { + "visible": false + }, + "Select to add Wildcard": { + "visible": false + }, + "wildcard": { + "visible": false + } + } + } + }, + "datetime": 1705419147116, + "external": [], + "links": [ + [ + null, + 0, + 2, + 0, + 6, + "BASIC_PIPE" + ], + [ + 0, + 0, + 2, + 1, + 13, + "BBOX_DETECTOR" + ], + [ + 1, + 0, + 2, + 2, + 15, + "SAM_MODEL" + ] + ], + "nodes": [ + { + "flags": {}, + "index": 0, + "mode": 0, + "order": 2, + "outputs": [ + { + "links": [], + "name": "BBOX_DETECTOR", + "shape": 3, + "type": "BBOX_DETECTOR" + }, + { + "links": null, + "name": "SEGM_DETECTOR", + "shape": 3, + "type": "SEGM_DETECTOR" + } + ], + "pos": [ + 590, + 830 + ], + "properties": { + "Node name for S&R": "UltralyticsDetectorProvider" + }, + "size": { + "0": 315, + "1": 78 + }, + "type": "UltralyticsDetectorProvider", + "widgets_values": [ + "bbox/Eyeful_v1.pt" + ] + }, + { + "flags": {}, + "index": 1, + "mode": 0, + "order": 3, + "outputs": [ + { + "links": [], + "name": "SAM_MODEL", + "shape": 3, + "type": "SAM_MODEL" + } + ], + "pos": [ + 590, + 960 + ], + "properties": { + "Node name for S&R": "SAMLoader" + }, + "size": { + "0": 315, + "1": 82 + }, + "type": "SAMLoader", + "widgets_values": [ + "sam_vit_b_01ec64.pth", + "AUTO" + ] + }, + { + "flags": {}, + "index": 2, + "inputs": [ + { + "link": null, + "name": "basic_pipe", + "type": "BASIC_PIPE" + }, + { + "link": null, + "name": "bbox_detector", + "slot_index": 1, + "type": "BBOX_DETECTOR" + }, + { + "link": null, + "name": "sam_model_opt", + "slot_index": 2, + "type": "SAM_MODEL" + }, + { + "link": null, + "name": "segm_detector_opt", + "type": "SEGM_DETECTOR" + }, + { + "link": null, + "name": "detailer_hook", + "type": "DETAILER_HOOK" + } + ], + "mode": 0, + "order": 5, + "outputs": [ + { + "links": null, + "name": "detailer_pipe", + "shape": 3, + "type": "DETAILER_PIPE" + } + ], + "pos": [ + 1044, + 812 + ], + "properties": { + "Node name for S&R": "BasicPipeToDetailerPipe" + }, + "size": { + "0": 400, + "1": 204 + }, + "type": "BasicPipeToDetailerPipe", + "widgets_values": [ + "", + "Select the LoRA to add to the text", + "Select the Wildcard to add to the text" + ] + } + ], + "packname": "Impact", + "version": "1.0" + } +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/misc/custom-nodes.jpg b/custom_nodes/ComfyUI-Manager/misc/custom-nodes.jpg new file mode 100644 index 000000000..74c2a8bf5 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/custom-nodes.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/main.jpg b/custom_nodes/ComfyUI-Manager/misc/main.jpg new file mode 100644 index 000000000..ec31f76fc Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/main.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/menu.jpg b/custom_nodes/ComfyUI-Manager/misc/menu.jpg new file mode 100644 index 000000000..c83540a9d Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/menu.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/missing-list.jpg b/custom_nodes/ComfyUI-Manager/misc/missing-list.jpg new file mode 100644 index 000000000..ead976372 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/missing-list.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/missing-menu.jpg b/custom_nodes/ComfyUI-Manager/misc/missing-menu.jpg new file mode 100644 index 000000000..455ea6fc0 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/missing-menu.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/models.png b/custom_nodes/ComfyUI-Manager/misc/models.png new file mode 100644 index 000000000..9e985fb49 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/models.png differ diff --git a/custom_nodes/ComfyUI-Manager/misc/nickname.jpg b/custom_nodes/ComfyUI-Manager/misc/nickname.jpg new file mode 100644 index 000000000..e3cfdcac5 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/nickname.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/portable-install.png b/custom_nodes/ComfyUI-Manager/misc/portable-install.png new file mode 100644 index 000000000..177174513 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/portable-install.png differ diff --git a/custom_nodes/ComfyUI-Manager/misc/share-setting.jpg b/custom_nodes/ComfyUI-Manager/misc/share-setting.jpg new file mode 100644 index 000000000..631794a38 Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/share-setting.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/share.jpg b/custom_nodes/ComfyUI-Manager/misc/share.jpg new file mode 100644 index 000000000..97c0ae7de Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/share.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/misc/snapshot.jpg b/custom_nodes/ComfyUI-Manager/misc/snapshot.jpg new file mode 100644 index 000000000..33269564b Binary files /dev/null and b/custom_nodes/ComfyUI-Manager/misc/snapshot.jpg differ diff --git a/custom_nodes/ComfyUI-Manager/model-list.json b/custom_nodes/ComfyUI-Manager/model-list.json new file mode 100644 index 000000000..a09be8633 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/model-list.json @@ -0,0 +1,3364 @@ +{ + "models": [ + { + "name": "TAESD3 Decoder", + "type": "TAESD", + "base": "SDXL", + "save_path": "vae_approx", + "description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesd3_decoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesd3_decoder.pth", + "size": "4.94MB" + }, + { + "name": "TAESD3 Encoder", + "type": "TAESD", + "base": "SDXL", + "save_path": "vae_approx", + "description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesd3_encoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesd3_encoder.pth", + "size": "4.94MB" + }, + { + "name": "TAESDXL Decoder", + "type": "TAESD", + "base": "SDXL", + "save_path": "vae_approx", + "description": "(SDXL Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesdxl_decoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesdxl_decoder.pth", + "size": "4.91MB" + }, + { + "name": "TAESDXL Encoder", + "type": "TAESD", + "base": "SDXL", + "save_path": "vae_approx", + "description": "(SDXL Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesdxl_encoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesdxl_encoder.pth", + "size": "4.91MB" + }, + { + "name": "TAESD Decoder", + "type": "TAESD", + "base": "SD1.x", + "save_path": "vae_approx", + "description": "To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesd_decoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesd_decoder.pth", + "size": "4.91MB" + }, + { + "name": "TAESD Encoder", + "type": "TAESD", + "base": "SD1.x", + "save_path": "vae_approx", + "description": "To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesd_encoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesd_encoder.pth", + "size": "4.91MB" + }, + { + "name": "RealESRGAN x2", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "RealESRGAN x2 upscaler model", + "reference": "https://huggingface.co/ai-forever/Real-ESRGAN", + "filename": "RealESRGAN_x2.pth", + "url": "https://huggingface.co/ai-forever/Real-ESRGAN/resolve/main/RealESRGAN_x2.pth", + "size": "67.1MB" + }, + { + "name": "RealESRGAN x4", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "RealESRGAN x4 upscaler model", + "reference": "https://huggingface.co/ai-forever/Real-ESRGAN", + "filename": "RealESRGAN_x4.pth", + "url": "https://huggingface.co/ai-forever/Real-ESRGAN/resolve/main/RealESRGAN_x4.pth", + "size": "67.0MB" + }, + { + "name": "ESRGAN x4", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "ESRGAN x4 upscaler model", + "reference": "https://huggingface.co/Afizi/ESRGAN_4x.pth", + "filename": "ESRGAN_4x.pth", + "url": "https://huggingface.co/Afizi/ESRGAN_4x.pth/resolve/main/ESRGAN_4x.pth", + "size": "66.9MB" + }, + { + "name": "4x_foolhardy_Remacri", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "4x_foolhardy_Remacri upscaler model", + "reference": "https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri", + "filename": "4x_foolhardy_Remacri.pth", + "url": "https://huggingface.co/FacehugmanIII/4x_foolhardy_Remacri/resolve/main/4x_foolhardy_Remacri.pth", + "size": "67.0MB" + }, + { + "name": "4x-AnimeSharp", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "4x-AnimeSharp upscaler model", + "reference": "https://huggingface.co/Kim2091/AnimeSharp/", + "filename": "4x-AnimeSharp.pth", + "url": "https://huggingface.co/Kim2091/AnimeSharp/resolve/main/4x-AnimeSharp.pth", + "size": "67.0MB" + }, + { + "name": "4x-UltraSharp", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "4x-UltraSharp upscaler model", + "reference": "https://huggingface.co/Kim2091/UltraSharp/", + "filename": "4x-UltraSharp.pth", + "url": "https://huggingface.co/Kim2091/UltraSharp/resolve/main/4x-UltraSharp.pth", + "size": "67.0MB" + }, + { + "name": "4x_NMKD-Siax_200k", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "4x_NMKD-Siax_200k upscaler model", + "reference": "https://huggingface.co/gemasai/4x_NMKD-Siax_200k", + "filename": "4x_NMKD-Siax_200k.pth", + "url": "https://huggingface.co/gemasai/4x_NMKD-Siax_200k/resolve/main/4x_NMKD-Siax_200k.pth", + "size": "67.0MB" + }, + { + "name": "8x_NMKD-Superscale_150000_G", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "8x_NMKD-Superscale_150000_G upscaler model", + "reference": "https://huggingface.co/uwg/upscaler", + "filename": "8x_NMKD-Superscale_150000_G.pth", + "url": "https://huggingface.co/uwg/upscaler/resolve/main/ESRGAN/8x_NMKD-Superscale_150000_G.pth", + "size": "67.1MB" + }, + { + "name": "8x_NMKD-Faces_160000_G", + "type": "upscale", + "base": "upscale", + "save_path": "default", + "description": "8x_NMKD-Faces_160000_G upscaler model", + "reference": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/tree/main", + "filename": "8x_NMKD-Faces_160000_G.pth", + "url": "https://huggingface.co/gemasai/8x_NMKD-Faces_160000_G/resolve/main/8x_NMKD-Faces_160000_G.pth", + "size": "67.2MB" + }, + { + "name": "LDSR(Latent Diffusion Super Resolution)", + "type": "upscale", + "base": "upscale", + "save_path": "upscale_models/ldsr", + "description": "LDSR upscale model. Through the [a/ComfyUI-Flowty-LDSR](https://github.com/flowtyone/ComfyUI-Flowty-LDSR) extension, the upscale model can be utilized.", + "reference": "https://github.com/CompVis/latent-diffusion", + "filename": "last.ckpt", + "url": "https://heibox.uni-heidelberg.de/f/578df07c8fc04ffbadf3/?dl=1", + "size": "2.04GB" + }, + { + "name": "stabilityai/stable-diffusion-x4-upscaler", + "type": "checkpoints", + "base": "upscale", + "save_path": "checkpoints/upscale", + "description": "This upscaling model is a latent text-guided diffusion model and should be used with SD_4XUpscale_Conditioning and KSampler.", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler", + "filename": "x4-upscaler-ema.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-x4-upscaler/resolve/main/x4-upscaler-ema.safetensors", + "size": "3.53GB" + }, + { + "name": "Inswapper-fp16 (face swap)", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface", + "description": "Checkpoint of the insightface swapper model\n(used by ComfyUI-FaceSwap, comfyui-reactor-node, CharacterFaceSwap,\nComfyUI roop and comfy_mtb)", + "reference": "https://github.com/facefusion/facefusion-assets", + "filename": "inswapper_128_fp16.onnx", + "url": "https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128_fp16.onnx", + "size": "277.7MB" + }, + { + "name": "Inswapper (face swap)", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface", + "description": "Checkpoint of the insightface swapper model\n(used by ComfyUI-FaceSwap, comfyui-reactor-node, CharacterFaceSwap,\nComfyUI roop and comfy_mtb)", + "reference": "https://github.com/facefusion/facefusion-assets", + "filename": "inswapper_128.onnx", + "url": "https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128.onnx", + "size": "555.3MB" + }, + { + "name": "Deepbump", + "type": "deepbump", + "base": "deepbump", + "save_path": "deepbump", + "description": "Checkpoint of the deepbump model to generate height and normal maps textures from an image (requires comfy_mtb)", + "reference": "https://github.com/HugoTini/DeepBump", + "filename": "deepbump256.onnx", + "url": "https://github.com/HugoTini/DeepBump/raw/master/deepbump256.onnx", + "size": "26.7MB" + }, + { + "name": "GFPGAN 1.3", + "type": "face_restore", + "base": "face_restore", + "save_path": "face_restore", + "description": "Face restoration", + "reference": "https://github.com/TencentARC/GFPGAN", + "filename": "GFPGANv1.3.pth", + "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth", + "size": "348.6MB" + }, + { + "name": "GFPGAN 1.4", + "type": "face_restore", + "base": "face_restore", + "save_path": "face_restore", + "description": "Face restoration", + "reference": "https://github.com/TencentARC/GFPGAN", + "filename": "GFPGANv1.4.pth", + "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth", + "size": "348.6MB" + }, + { + "name": "RestoreFormer", + "type": "face_restore", + "base": "face_restore", + "save_path": "face_restore", + "description": "Face restoration", + "reference": "https://github.com/TencentARC/GFPGAN", + "filename": "RestoreFormer.pth", + "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/RestoreFormer.pth", + "size": "290.8MB" + }, + { + "name": "Stable Video Diffusion Image-to-Video", + "type": "checkpoints", + "base": "SVD", + "save_path": "checkpoints/SVD", + "description": "Stable Video Diffusion (SVD) Image-to-Video is a diffusion model that takes in a still image as a conditioning frame, and generates a video from it.\nNOTE: 14 frames @ 576x1024", + "reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid", + "filename": "svd.safetensors", + "url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/resolve/main/svd.safetensors", + "size": "9.56GB" + }, + { + "name": "stabilityai/Stable Zero123", + "type": "zero123", + "base": "zero123", + "save_path": "checkpoints/zero123", + "description": "Stable Zero123 is a model for view-conditioned image generation based on [a/Zero123](https://github.com/cvlab-columbia/zero123).", + "reference": "https://huggingface.co/stabilityai/stable-zero123", + "filename": "stable_zero123.ckpt", + "url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt", + "size": "8.58GB" + }, + { + "name": "Stable Video Diffusion Image-to-Video (XT)", + "type": "checkpoints", + "base": "SVD", + "save_path": "checkpoints/SVD", + "description": "Stable Video Diffusion (SVD) Image-to-Video is a diffusion model that takes in a still image as a conditioning frame, and generates a video from it.\nNOTE: 25 frames @ 576x1024 ", + "reference": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt", + "filename": "svd_xt.safetensors", + "url": "https://huggingface.co/stabilityai/stable-video-diffusion-img2vid-xt/resolve/main/svd_xt.safetensors", + "size": "9.56GB" + }, + { + "name": "negative_hand Negative Embedding", + "type": "embeddings", + "base": "SD1.5", + "save_path": "default", + "description": "If you use this embedding with negatives, you can solve the issue of damaging your hands.", + "reference": "https://civitai.com/models/56519/negativehand-negative-embedding", + "filename": "negative_hand-neg.pt", + "url": "https://civitai.com/api/download/models/60938", + "size": "25KB" + }, + { + "name": "bad_prompt Negative Embedding", + "type": "embeddings", + "base": "SD1.5", + "save_path": "default", + "description": "The idea behind this embedding was to somehow train the negative prompt as an embedding, thus unifying the basis of the negative prompt into one word or embedding.", + "reference": "https://civitai.com/models/55700/badprompt-negative-embedding", + "filename": "bad_prompt_version2-neg.pt", + "url": "https://civitai.com/api/download/models/60095", + "size": "25KB" + }, + { + "name": "Deep Negative V1.75", + "type": "embeddings", + "base": "SD1.5", + "save_path": "default", + "description": "These embedding learn what disgusting compositions and color patterns are, including faulty human anatomy, offensive color schemes, upside-down spatial structures, and more. Placing it in the negative can go a long way to avoiding these things.", + "reference": "https://civitai.com/models/4629/deep-negative-v1x", + "filename": "ng_deepnegative_v1_75t.pt", + "url": "https://civitai.com/api/download/models/5637", + "size": "226KB" + }, + { + "name": "EasyNegative", + "type": "embeddings", + "base": "SD1.5", + "save_path": "default", + "description": "This embedding should be used in your NEGATIVE prompt. Adjust the strength as desired (seems to scale well without any distortions), the strength required may vary based on positive and negative prompts.", + "reference": "https://civitai.com/models/7808/easynegative", + "filename": "easynegative.safetensors", + "url": "https://civitai.com/api/download/models/9208", + "size": "25KB" + }, + { + "name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_b.safetensors", + "type": "checkpoints", + "base": "Stable Cascade", + "save_path": "checkpoints/Stable-Cascade", + "description": "Stable Cascade stage_b checkpoints", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stable_cascade_stage_b.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_b.safetensors", + "size": "4.55GB" + }, + { + "name": "stabilityai/comfyui_checkpoints/stable_cascade_stage_c.safetensors", + "type": "checkpoints", + "base": "Stable Cascade", + "save_path": "checkpoints/Stable-Cascade", + "description": "Stable Cascade stage_c checkpoints", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stable_cascade_stage_c.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/comfyui_checkpoints/stable_cascade_stage_c.safetensors", + "size": "9.22GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_a.safetensors (VAE)", + "type": "VAE", + "base": "Stable Cascade", + "save_path": "vae/Stable-Cascade", + "description": "Stable Cascade: stage_a", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_a.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_a.safetensors", + "size": "73.7MB" + }, + { + "name": "stabilityai/Stable Cascade: effnet_encoder.safetensors (VAE)", + "type": "VAE", + "base": "Stable Cascade", + "save_path": "vae/Stable-Cascade", + "description": "Stable Cascade: effnet_encoder.\nVAE encoder for stage_c latent.", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "effnet_encoder.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/effnet_encoder.safetensors", + "size": "81.5MB" + }, + { + "name": "stabilityai/Stable Cascade: stage_b.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_b", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_b.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b.safetensors", + "size": "6.25GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_b_bf16.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_b/bf16", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_b_bf16.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_bf16.safetensors", + "size": "3.13GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_b/lite", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_b_lite.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite.safetensors", + "size": "2.80GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_b_lite.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_b/bf16,lite", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_b_lite_bf16.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_b_lite_bf16.safetensors", + "size": "1.40GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_c.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_c", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_c.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c.safetensors", + "size": "14.4GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_c_bf16.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_c/bf16", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_c_bf16.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors", + "size": "7.18GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_c/lite", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_c_lite.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite.safetensors", + "size": "4.12GB" + }, + { + "name": "stabilityai/Stable Cascade: stage_c_lite.safetensors (UNET)", + "type": "unet", + "base": "Stable Cascade", + "save_path": "unet/Stable-Cascade", + "description": "Stable Cascade: stage_c/bf16,lite", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "stage_c_lite_bf16.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_lite_bf16.safetensors", + "size": "2.06GB" + }, + { + "name": "stabilityai/Stable Cascade: text_encoder (CLIP)", + "type": "clip", + "base": "Stable Cascade", + "save_path": "clip/Stable-Cascade", + "description": "Stable Cascade: text_encoder", + "reference": "https://huggingface.co/stabilityai/stable-cascade", + "filename": "model.safetensors", + "url": "https://huggingface.co/stabilityai/stable-cascade/resolve/main/text_encoder/model.safetensors", + "size": "1.39GB" + }, + { + "name": "SDXL-Turbo 1.0 (fp16)", + "type": "checkpoints", + "base": "SDXL", + "save_path": "checkpoints/SDXL-TURBO", + "description": "SDXL-Turbo 1.0 fp16", + "reference": "https://huggingface.co/stabilityai/sdxl-turbo", + "filename": "sd_xl_turbo_1.0_fp16.safetensors", + "url": "https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0_fp16.safetensors", + "size": "6.94GB" + }, + { + "name": "SDXL-Turbo 1.0", + "type": "checkpoints", + "base": "SDXL", + "save_path": "checkpoints/SDXL-TURBO", + "description": "SDXL-Turbo 1.0", + "reference": "https://huggingface.co/stabilityai/sdxl-turbo", + "filename": "sd_xl_turbo_1.0.safetensors", + "url": "https://huggingface.co/stabilityai/sdxl-turbo/resolve/main/sd_xl_turbo_1.0.safetensors", + "size": "13.9GB" + }, + { + "name": "sd_xl_base_1.0_0.9vae.safetensors", + "type": "checkpoints", + "base": "SDXL", + "save_path": "default", + "description": "Stable Diffusion XL base model (VAE 0.9)", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0", + "filename": "sd_xl_base_1.0_0.9vae.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0_0.9vae.safetensors", + "size": "6.94GB" + }, + { + "name": "sd_xl_base_1.0.safetensors", + "type": "checkpoints", + "base": "SDXL", + "save_path": "default", + "description": "Stable Diffusion XL base model", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0", + "filename": "sd_xl_base_1.0.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors", + "size": "6.94GB" + }, + { + "name": "sd_xl_refiner_1.0_0.9vae.safetensors", + "type": "checkpoints", + "base": "SDXL", + "save_path": "default", + "description": "Stable Diffusion XL refiner model (VAE 0.9)", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0", + "filename": "sd_xl_refiner_1.0_0.9vae.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0_0.9vae.safetensors", + "size": "6.08GB" + }, + { + "name": "stable-diffusion-xl-refiner-1.0", + "type": "checkpoints", + "base": "SDXL", + "save_path": "default", + "description": "Stable Diffusion XL refiner model", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0", + "filename": "sd_xl_refiner_1.0.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors", + "size": "6.08GB" + }, + { + "name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET/fp16)", + "type": "unet", + "base": "SDXL", + "save_path": "unet/xl-inpaint-0.1", + "description": "Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.", + "reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1", + "filename": "diffusion_pytorch_model.fp16.safetensors", + "url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.fp16.safetensors", + "size": "5.14GB" + }, + { + "name": "diffusers/stable-diffusion-xl-1.0-inpainting-0.1 (UNET)", + "type": "unet", + "base": "SDXL", + "save_path": "unet/xl-inpaint-0.1", + "description": "Stable Diffusion XL inpainting model 0.1. You need UNETLoader instead of CheckpointLoader.", + "reference": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/diffusers/stable-diffusion-xl-1.0-inpainting-0.1/resolve/main/unet/diffusion_pytorch_model.safetensors", + "size": "10.3GB" + }, + { + "name": "sd_xl_offset_example-lora_1.0.safetensors", + "type": "lora", + "base": "SDXL", + "save_path": "default", + "description": "Stable Diffusion XL offset LoRA", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0", + "filename": "sd_xl_offset_example-lora_1.0.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors", + "size": "49.6MB" + }, + { + "name": "SDXL Lightning LoRA (2step)", + "type": "lora", + "base": "SDXL", + "save_path": "loras/SDXL-Lightning", + "description": "SDXL Lightning LoRA (2step)", + "reference": "https://huggingface.co/ByteDance/SDXL-Lightning", + "filename": "sdxl_lightning_2step_lora.safetensors", + "url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_2step_lora.safetensors", + "size": "393.9MB" + }, + { + "name": "SDXL Lightning LoRA (4step)", + "type": "lora", + "base": "SDXL", + "save_path": "loras/SDXL-Lightning", + "description": "SDXL Lightning LoRA (4step)", + "reference": "https://huggingface.co/ByteDance/SDXL-Lightning", + "filename": "sdxl_lightning_4step_lora.safetensors", + "url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_4step_lora.safetensors", + "size": "393.9MB" + }, + { + "name": "SDXL Lightning LoRA (8step)", + "type": "lora", + "base": "SDXL", + "save_path": "loras/SDXL-Lightning", + "description": "SDXL Lightning LoRA (8tep)", + "reference": "https://huggingface.co/ByteDance/SDXL-Lightning", + "filename": "sdxl_lightning_8step_lora.safetensors", + "url": "https://huggingface.co/ByteDance/SDXL-Lightning/resolve/main/sdxl_lightning_8step_lora.safetensors", + "size": "393.9MB" + }, + + { + "name": "google-t5/t5-base", + "type": "clip", + "base": "t5-base", + "save_path": "clip/t5-base", + "description": "T5 Base: Text-To-Text Transfer Transformer. This model can be loaded via CLIPLoader for Stable Audio workflow.", + "reference": "https://huggingface.co/google-t5/t5-base", + "filename": "model.safetensors", + "url": "https://huggingface.co/google-t5/t5-base/resolve/main/model.safetensors", + "size": "892MB" + }, + + { + "name": "v1-5-pruned-emaonly.ckpt", + "type": "checkpoints", + "base": "SD1.5", + "save_path": "default", + "description": "Stable Diffusion 1.5 base model", + "reference": "https://huggingface.co/runwayml/stable-diffusion-v1-5", + "filename": "v1-5-pruned-emaonly.ckpt", + "url": "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt", + "size": "4.27GB" + }, + { + "name": "v2-1_512-ema-pruned.safetensors", + "type": "checkpoints", + "base": "SD2", + "save_path": "default", + "description": "Stable Diffusion 2 base model (512)", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-2-1-base", + "filename": "v2-1_512-ema-pruned.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.safetensors", + "size": "5.21GB" + }, + { + "name": "v2-1_768-ema-pruned.safetensors", + "type": "checkpoints", + "base": "SD2", + "save_path": "default", + "description": "Stable Diffusion 2 base model (768)", + "reference": "https://huggingface.co/stabilityai/stable-diffusion-2-1", + "filename": "v2-1_768-ema-pruned.safetensors", + "url": "https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.safetensors", + "size": "5.21GB" + }, + { + "name": "AbyssOrangeMix2 (hard)", + "type": "checkpoints", + "base": "SD1.5", + "save_path": "default", + "description": "AbyssOrangeMix2 - hard version (anime style)", + "reference": "https://huggingface.co/WarriorMama777/OrangeMixs", + "filename": "AbyssOrangeMix2_hard.safetensors", + "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix2/AbyssOrangeMix2_hard.safetensors", + "size": "5.57GB" + }, + { + "name": "AbyssOrangeMix3 A1", + "type": "checkpoints", + "base": "SD1.5", + "save_path": "default", + "description": "AbyssOrangeMix3 - A1 (anime style)", + "reference": "https://huggingface.co/WarriorMama777/OrangeMixs", + "filename": "AOM3A1_orangemixs.safetensors", + "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1_orangemixs.safetensors", + "size": "2.13GB" + }, + { + "name": "AbyssOrangeMix3 A3", + "type": "checkpoints", + "base": "SD1.5", + "save_path": "default", + "description": "AbyssOrangeMix - A3 (anime style)", + "reference": "https://huggingface.co/WarriorMama777/OrangeMixs", + "filename": "AOM3A3_orangemixs.safetensors", + "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A3_orangemixs.safetensors", + "size": "2.13GB" + }, + { + "name": "Waifu Diffusion 1.5 Beta3 (fp16)", + "type": "checkpoints", + "base": "SD2.1", + "save_path": "default", + "description": "Waifu Diffusion 1.5 Beta3", + "reference": "https://huggingface.co/waifu-diffusion/wd-1-5-beta3", + "filename": "wd-illusion-fp16.safetensors", + "url": "https://huggingface.co/waifu-diffusion/wd-1-5-beta3/resolve/main/wd-illusion-fp16.safetensors", + "size": "2.58GB" + }, + { + "name": "illuminatiDiffusionV1_v11 unCLIP model", + "type": "unclip", + "base": "SD2.1", + "save_path": "default", + "description": "Mix model (SD2.1 unCLIP + illuminatiDiffusionV1_v11)", + "reference": "https://huggingface.co/comfyanonymous/illuminatiDiffusionV1_v11_unCLIP", + "filename": "illuminatiDiffusionV1_v11-unclip-h-fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/illuminatiDiffusionV1_v11_unCLIP/resolve/main/illuminatiDiffusionV1_v11-unclip-h-fp16.safetensors", + "size": "3.98GB" + }, + { + "name": "Waifu Diffusion 1.5 unCLIP model", + "type": "unclip", + "base": "SD2.1", + "save_path": "default", + "description": "Mix model (SD2.1 unCLIP + Waifu Diffusion 1.5)", + "reference": "https://huggingface.co/comfyanonymous/wd-1.5-beta2_unCLIP", + "filename": "wd-1-5-beta2-aesthetic-unclip-h-fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/wd-1.5-beta2_unCLIP/resolve/main/wd-1-5-beta2-aesthetic-unclip-h-fp16.safetensors", + "size": "3.98GB" + }, + { + "name": "sdxl_vae.safetensors", + "type": "VAE", + "base": "SDXL VAE", + "save_path": "default", + "description": "SDXL-VAE", + "reference": "https://huggingface.co/stabilityai/sdxl-vae", + "filename": "sdxl_vae.safetensors", + "url": "https://huggingface.co/stabilityai/sdxl-vae/resolve/main/sdxl_vae.safetensors", + "size": "334.6MB" + }, + { + "name": "vae-ft-mse-840000-ema-pruned", + "type": "VAE", + "base": "SD1.5 VAE", + "save_path": "default", + "description": "vae-ft-mse-840000-ema-pruned", + "reference": "https://huggingface.co/stabilityai/sd-vae-ft-mse-original", + "filename": "vae-ft-mse-840000-ema-pruned.safetensors", + "url": "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors", + "size": "334.6MB" + }, + { + "name": "orangemix.vae", + "type": "VAE", + "base": "SD1.5 VAE", + "save_path": "default", + "description": "orangemix vae model", + "reference": "https://huggingface.co/WarriorMama777/OrangeMixs", + "filename": "orangemix.vae.pt", + "url": "https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt", + "size": "822.8MB" + }, + { + "name": "kl-f8-anime2", + "type": "VAE", + "base": "SD2.1 VAE", + "save_path": "default", + "description": "kl-f8-anime2 vae model", + "reference": "https://huggingface.co/hakurei/waifu-diffusion-v1-4", + "filename": "kl-f8-anime2.ckpt", + "url": "https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt", + "size": "404.7MB" + }, + { + "name": "OpenAI Consistency Decoder", + "type": "VAE", + "base": "SD1.5 VAE", + "save_path": "vae/openai_consistency_decoder", + "description": "OpenAI Consistency Decoder. Improved decoding for stable diffusion vaes.", + "reference": "https://github.com/openai/consistencydecoder", + "filename": "decoder.pt", + "url": "https://openaipublic.azureedge.net/diff-vae/c9cebd3132dd9c42936d803e33424145a748843c8f716c0814838bdc8a2fe7cb/decoder.pt", + "size": "2.49GB" + }, + { + "name": "LCM LoRA SD1.5", + "type": "lora", + "base": "SD1.5", + "save_path": "loras/lcm/SD1.5", + "description": "Latent Consistency LoRA for SD1.5", + "reference": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5", + "filename": "pytorch_lora_weights.safetensors", + "url": "https://huggingface.co/latent-consistency/lcm-lora-sdv1-5/resolve/main/pytorch_lora_weights.safetensors", + "size": "134.6MB" + }, + { + "name": "LCM LoRA SSD-1B", + "type": "lora", + "base": "SSD-1B", + "save_path": "loras/lcm/SSD-1B", + "description": "Latent Consistency LoRA for SSD-1B", + "reference": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b", + "filename": "pytorch_lora_weights.safetensors", + "url": "https://huggingface.co/latent-consistency/lcm-lora-ssd-1b/resolve/main/pytorch_lora_weights.safetensors", + "size": "210.0MB" + }, + { + "name": "LCM LoRA SDXL", + "type": "lora", + "base": "SSD-1B", + "save_path": "loras/lcm/SDXL", + "description": "Latent Consistency LoRA for SDXL", + "reference": "https://huggingface.co/latent-consistency/lcm-lora-sdxl", + "filename": "pytorch_lora_weights.safetensors", + "url": "https://huggingface.co/latent-consistency/lcm-lora-sdxl/resolve/main/pytorch_lora_weights.safetensors", + "size": "393.9MB" + }, + { + "name": "Segmind-Vega", + "type": "checkpoints", + "base": "segmind-vega", + "save_path": "checkpoints/segmind-vega", + "description": "The Segmind-Vega Model is a distilled version of the Stable Diffusion XL (SDXL), offering a remarkable 70% reduction in size and an impressive 100% speedup while retaining high-quality text-to-image generation capabilities.", + "reference": "https://huggingface.co/segmind/Segmind-Vega", + "filename": "segmind-vega.safetensors", + "url": "https://huggingface.co/segmind/Segmind-Vega/resolve/main/segmind-vega.safetensors", + "size": "3.29GB" + }, + { + "name": "Segmind-VegaRT - Latent Consistency Model (LCM) LoRA of Segmind-Vega", + "type": "lora", + "base": "segmind-vega", + "save_path": "loras/segmind-vega", + "description": "Segmind-VegaRT a distilled consistency adapter for Segmind-Vega that allows to reduce the number of inference steps to only between 2 - 8 steps.", + "reference": "https://huggingface.co/segmind/Segmind-VegaRT", + "filename": "pytorch_lora_weights.safetensors", + "url": "https://huggingface.co/segmind/Segmind-VegaRT/resolve/main/pytorch_lora_weights.safetensors", + "size": "239.2MB" + }, + { + "name": "Theovercomer8's Contrast Fix (SD2.1)", + "type": "lora", + "base": "SD2.1", + "save_path": "default", + "description": "LORA: Theovercomer8's Contrast Fix (SD2.1)", + "reference": "https://civitai.com/models/8765/theovercomer8s-contrast-fix-sd15sd21-768", + "filename": "theovercomer8sContrastFix_sd21768.safetensors", + "url": "https://civitai.com/api/download/models/10350", + "size": "163MB" + }, + { + "name": "Theovercomer8's Contrast Fix (SD1.5)", + "type": "lora", + "base": "SD1.5", + "save_path": "default", + "description": "LORA: Theovercomer8's Contrast Fix (SD1.5)", + "reference": "https://civitai.com/models/8765/theovercomer8s-contrast-fix-sd15sd21-768", + "filename": "theovercomer8sContrastFix_sd15.safetensors", + "url": "https://civitai.com/api/download/models/10638", + "size": "113MB" + }, + { + "name": "T2I-Adapter (depth)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for depth", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_depth_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth", + "size": "309.5MB" + }, + { + "name": "T2I-Adapter (seg)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for seg", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_seg_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_seg_sd14v1.pth", + "size": "309.5MB" + }, + { + "name": "T2I-Adapter (sketch)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for sketch", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_sketch_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_sketch_sd14v1.pth", + "size": "308.0MB" + }, + { + "name": "T2I-Adapter (keypose)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for keypose", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_keypose_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_keypose_sd14v1.pth", + "size": "309.5MB" + }, + { + "name": "T2I-Adapter (openpose)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for openpose", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_openpose_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_openpose_sd14v1.pth", + "size": "309.5MB" + }, + { + "name": "T2I-Adapter (color)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for color", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_color_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_color_sd14v1.pth", + "size": "74.8MB" + }, + { + "name": "T2I-Adapter (canny)", + "type": "T2I-Adapter", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter for canny", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_canny_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_canny_sd14v1.pth", + "size": "308.0MB" + }, + { + "name": "T2I-Style model", + "type": "T2I-Style", + "base": "SD1.5", + "save_path": "default", + "description": "ControlNet T2I-Adapter style model. Need to download CLIPVision model.", + "reference": "https://huggingface.co/TencentARC/T2I-Adapter", + "filename": "t2iadapter_style_sd14v1.pth", + "url": "https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth", + "size": "154.4MB" + }, + { + "name": "T2I-Adapter XL (lineart) FP16", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for lineart", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0", + "filename": "t2i-adapter-lineart-sdxl-1.0.fp16.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors", + "size": "158.1MB" + }, + { + "name": "T2I-Adapter XL (canny) FP16", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for canny", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0", + "filename": "t2i-adapter-canny-sdxl-1.0.fp16.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors", + "size": "158.1MB" + }, + { + "name": "T2I-Adapter XL (depth-zoe) FP16", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for depth-zoe", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0", + "filename": "t2i-adapter-depth-zoe-sdxl-1.0.fp16.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors", + "size": "158.1MB" + }, + { + "name": "T2I-Adapter XL (depth-midas) FP16", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for depth-midas", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0", + "filename": "t2i-adapter-depth-midas-sdxl-1.0.fp16.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors", + "size": "158.1MB" + }, + { + "name": "T2I-Adapter XL (sketch) FP16", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for sketch", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0", + "filename": "t2i-adapter-sketch-sdxl-1.0.fp16.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0/resolve/main/diffusion_pytorch_model.fp16.safetensors", + "size": "158.1MB" + }, + { + "name": "T2I-Adapter XL (lineart)", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for lineart", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0", + "filename": "t2i-adapter-lineart-sdxl-1.0.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-lineart-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "316.1MB" + }, + { + "name": "T2I-Adapter XL (canny)", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for canny", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0", + "filename": "t2i-adapter-canny-sdxl-1.0.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "316.1MB" + }, + { + "name": "T2I-Adapter XL (depth-zoe)", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for depth-zoe", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0", + "filename": "t2i-adapter-depth-zoe-sdxl-1.0.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-zoe-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "316.1MB" + }, + { + "name": "T2I-Adapter XL (depth-midas)", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for depth-midas", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0", + "filename": "t2i-adapter-depth-midas-sdxl-1.0.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-depth-midas-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "316.1MB" + }, + { + "name": "T2I-Adapter XL (sketch)", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for sketch", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0", + "filename": "t2i-adapter-sketch-sdxl-1.0.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-sketch-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "316.1MB" + }, + { + "name": "T2I-Adapter XL (openpose)", + "type": "T2I-Adapter", + "base": "SDXL 1.0", + "save_path": "default", + "description": "ControlNet T2I-Adapter XL for openpose", + "reference": "https://huggingface.co/TencentARC/t2i-adapter-openpose-sdxl-1.0", + "filename": "t2i-adapter-openpose-sdxl-1.0.safetensors", + "url": "https://huggingface.co/TencentARC/t2i-adapter-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "316.1MB" + }, + { + "name": "CiaraRowles/TemporalNet2", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "TemporalNet was a ControlNet model designed to enhance the temporal consistency of generated outputs", + "reference": "https://huggingface.co/CiaraRowles/TemporalNet2", + "filename": "temporalnetversion2.safetensors", + "url": "https://huggingface.co/CiaraRowles/TemporalNet2/resolve/main/temporalnetversion2.safetensors", + "size": "5.71GB" + }, + { + "name": "CiaraRowles/TemporalNet1XL (1.0)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "controlnet/TemporalNet1XL", + "description": "This is TemporalNet1XL, it is a re-train of the controlnet TemporalNet1 with Stable Diffusion XL.", + "reference": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/CiaraRowles/controlnet-temporalnet-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "5.00GB" + }, + { + "name": "CLIPVision model (stabilityai/clip_vision_g)", + "type": "clip_vision", + "base": "vit-g", + "save_path": "clip_vision", + "description": "clip_g vision model", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "clip_vision_g.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/revision/clip_vision_g.safetensors", + "size": "3.69GB" + }, + { + "name": "CLIPVision model (openai/clip-vit-large)", + "type": "clip_vision", + "base": "ViT-L", + "save_path": "clip_vision", + "description": "CLIPVision model (needed for styles model)", + "reference": "https://huggingface.co/openai/clip-vit-large-patch14", + "filename": "clip-vit-large-patch14.bin", + "url": "https://huggingface.co/openai/clip-vit-large-patch14/resolve/main/model.safetensors", + "size": "1.71GB" + }, + { + "name": "CLIPVision model (IP-Adapter) CLIP-ViT-H-14-laion2B-s32B-b79K", + "type": "clip_vision", + "base": "ViT-H", + "save_path": "clip_vision", + "description": "CLIPVision model (needed for IP-Adapter)", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/image_encoder/model.safetensors", + "size": "2.53GB" + }, + { + "name": "CLIPVision model (IP-Adapter) CLIP-ViT-bigG-14-laion2B-39B-b160k", + "type": "clip_vision", + "base": "ViT-G", + "save_path": "clip_vision", + "description": "CLIPVision model (needed for IP-Adapter)", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "CLIP-ViT-bigG-14-laion2B-39B-b160k.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/image_encoder/model.safetensors", + "size": "3.69GB" + }, + { + "name": "stabilityai/control-lora-canny-rank128.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: canny rank128", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-canny-rank128.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-canny-rank128.safetensors", + "size": "395.7MB" + }, + { + "name": "stabilityai/control-lora-depth-rank128.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: depth rank128", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-depth-rank128.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-depth-rank128.safetensors", + "size": "395.7MB" + }, + { + "name": "stabilityai/control-lora-recolor-rank128.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: recolor rank128", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-recolor-rank128.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-recolor-rank128.safetensors", + "size": "395.7MB" + }, + { + "name": "stabilityai/control-lora-sketch-rank128-metadata.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: sketch rank128 metadata", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-sketch-rank128-metadata.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank128/control-lora-sketch-rank128-metadata.safetensors", + "size": "395.7MB" + }, + { + "name": "stabilityai/control-lora-canny-rank256.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: canny rank256", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-canny-rank256.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-canny-rank256.safetensors", + "size": "774.5MB" + }, + { + "name": "stabilityai/control-lora-depth-rank256.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: depth rank256", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-depth-rank256.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-depth-rank256.safetensors", + "size": "774.4MB" + }, + { + "name": "stabilityai/control-lora-recolor-rank256.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: recolor rank256", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-recolor-rank256.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-recolor-rank256.safetensors", + "size": "774.4MB" + }, + { + "name": "stabilityai/control-lora-sketch-rank256.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "Control-LoRA: sketch rank256", + "reference": "https://huggingface.co/stabilityai/control-lora", + "filename": "control-lora-sketch-rank256.safetensors", + "url": "https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-sketch-rank256.safetensors", + "size": "774.5MB" + }, + { + "name": "kohya-ss/ControlNet-LLLite: SDXL Canny Anime", + "type": "controlnet", + "base": "SDXL", + "save_path": "custom_nodes/ControlNet-LLLite-ComfyUI/models", + "description": "An extremely compactly designed controlnet model (a.k.a. ControlNet-LLLite). Note: The model structure is highly experimental and may be subject to change in the future.", + "reference": "https://huggingface.co/kohya-ss/controlnet-lllite", + "filename": "controllllite_v01032064e_sdxl_canny_anime.safetensors", + "url": "https://huggingface.co/kohya-ss/controlnet-lllite/resolve/main/controllllite_v01032064e_sdxl_canny_anime.safetensors", + "size": "46.2MB" + }, + { + "name": "SDXL-controlnet: OpenPose (v2)", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "ControlNet openpose model for SDXL", + "reference": "https://huggingface.co/thibaud/controlnet-openpose-sdxl-1.0", + "filename": "OpenPoseXL2.safetensors", + "url": "https://huggingface.co/thibaud/controlnet-openpose-sdxl-1.0/resolve/main/OpenPoseXL2.safetensors", + "size": "5.00GB" + }, + { + "name": "controlnet-SargeZT/controlnet-sd-xl-1.0-softedge-dexined", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "ControlNet softedge model for SDXL", + "reference": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-softedge-dexined", + "filename": "controlnet-sd-xl-1.0-softedge-dexined.safetensors", + "url": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-softedge-dexined/resolve/main/controlnet-sd-xl-1.0-softedge-dexined.safetensors", + "size": "5.00GB" + }, + { + "name": "controlnet-SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "ControlNet depth-zoe model for SDXL", + "reference": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe", + "filename": "depth-zoe-xl-v1.0-controlnet.safetensors", + "url": "https://huggingface.co/SargeZT/controlnet-sd-xl-1.0-depth-16bit-zoe/resolve/main/depth-zoe-xl-v1.0-controlnet.safetensors", + "size": "5.00GB" + }, + { + "name": "ControlNet-v1-1 (ip2p; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (ip2p)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11e_sd15_ip2p_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_ip2p_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (shuffle; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (shuffle)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11e_sd15_shuffle_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_shuffle_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (canny; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (canny)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_canny_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_canny_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (depth; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (depth)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11f1p_sd15_depth_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11f1p_sd15_depth_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (inpaint; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (inpaint)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_inpaint_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_inpaint_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (lineart; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (lineart)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_lineart_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_lineart_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (mlsd; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (mlsd)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_mlsd_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_mlsd_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (normalbae; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (normalbae)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_normalbae_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_normalbae_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (openpose; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (openpose)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_openpose_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_openpose_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (scribble; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (scribble)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_scribble_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_scribble_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (seg; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (seg)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_seg_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_seg_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (softedge; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (softedge)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15_softedge_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_softedge_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (anime; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (anime)", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11p_sd15s2_lineart_anime_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15s2_lineart_anime_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (tile; fp16; v11u)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (tile) / v11u", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11u_sd15_tile_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11u_sd15_tile_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-v1-1 (tile; fp16; v11f1e)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Safetensors/FP16 versions of the new ControlNet-v1-1 checkpoints (tile) / v11f1e\nYou need to this model for Tiled Resample", + "reference": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors", + "filename": "control_v11f1e_sd15_tile_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11f1e_sd15_tile_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "ControlNet-HandRefiner-pruned (inpaint-depth-hand; fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "This inpaint-depth controlnet model is specialized for the hand refiner.", + "reference": "https://huggingface.co/hr16/ControlNet-HandRefiner-pruned", + "filename": "control_sd15_inpaint_depth_hand_fp16.safetensors", + "url": "https://huggingface.co/hr16/ControlNet-HandRefiner-pruned/resolve/main/control_sd15_inpaint_depth_hand_fp16.safetensors", + "size": "722.6MB" + }, + { + "name": "control_boxdepth_LooseControlfp16 (fp16)", + "type": "controlnet", + "base": "SD1.5", + "save_path": "default", + "description": "Loose ControlNet model", + "reference": "https://huggingface.co/ioclab/LooseControl_WebUICombine", + "filename": "control_boxdepth_LooseControlfp16.safetensors", + "url": "https://huggingface.co/ioclab/LooseControl_WebUICombine/resolve/main/control_boxdepth_LooseControlfp16.safetensors", + "size": "722.6MB" + }, + { + "name": "GLIGEN textbox (fp16; pruned)", + "type": "gligen", + "base": "SD1.5", + "save_path": "default", + "description": "GLIGEN textbox model", + "reference": "https://huggingface.co/comfyanonymous/GLIGEN_pruned_safetensors", + "filename": "gligen_sd14_textbox_pruned_fp16.safetensors", + "url": "https://huggingface.co/comfyanonymous/GLIGEN_pruned_safetensors/resolve/main/gligen_sd14_textbox_pruned_fp16.safetensors", + "size": "418.2MB" + }, + { + "name": "ViT-H SAM model", + "type": "sam", + "base": "SAM", + "save_path": "sams", + "description": "Segmenty Anything SAM model (ViT-H)", + "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints", + "filename": "sam_vit_h_4b8939.pth", + "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth", + "size": "2.56GB" + }, + { + "name": "ViT-L SAM model", + "type": "sam", + "base": "SAM", + "save_path": "sams", + "description": "Segmenty Anything SAM model (ViT-L)", + "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints", + "filename": "sam_vit_l_0b3195.pth", + "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth", + "size": "1.25GB" + }, + { + "name": "ViT-B SAM model", + "type": "sam", + "base": "SAM", + "save_path": "sams", + "description": "Segmenty Anything SAM model (ViT-B)", + "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints", + "filename": "sam_vit_b_01ec64.pth", + "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth", + "size": "375.0MB" + }, + { + "name": "seecoder v1.0", + "type": "seecoder", + "base": "SEECODER", + "save_path": "seecoders", + "description": "SeeCoder model", + "reference": "https://huggingface.co/shi-labs/prompt-free-diffusion/tree/main/pretrained/pfd/seecoder", + "filename": "seecoder-v1-0.safetensors", + "url": "https://huggingface.co/shi-labs/prompt-free-diffusion/resolve/main/pretrained/pfd/seecoder/seecoder-v1-0.safetensors", + "size": "1.18GB" + }, + { + "name": "seecoder pa v1.0", + "type": "seecoder", + "base": "SEECODER", + "save_path": "seecoders", + "description": "SeeCoder model", + "reference": "https://huggingface.co/shi-labs/prompt-free-diffusion/tree/main/pretrained/pfd/seecoder", + "filename": "seecoder-pa-v1-0.safetensors", + "url": "https://huggingface.co/shi-labs/prompt-free-diffusion/resolve/main/pretrained/pfd/seecoder/seecoder-pa-v1-0.safetensors", + "size": "1.19GB" + }, + { + "name": "seecoder anime v1.0", + "type": "seecoder", + "base": "SEECODER", + "save_path": "seecoders", + "description": "SeeCoder model", + "reference": "https://huggingface.co/shi-labs/prompt-free-diffusion/tree/main/pretrained/pfd/seecoder", + "filename": "seecoder-anime-v1-0.safetensors", + "url": "https://huggingface.co/shi-labs/prompt-free-diffusion/resolve/main/pretrained/pfd/seecoder/seecoder-anime-v1-0.safetensors", + "size": "1.18GB" + }, + { + "name": "face_yolov8m (bbox)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/bbox", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "face_yolov8m.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8m.pt", + "size": "52.0MB" + }, + { + "name": "face_yolov8n (bbox)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/bbox", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "face_yolov8n.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8n.pt", + "size": "6.23MB" + }, + { + "name": "face_yolov8n_v2 (bbox)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/bbox", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "face_yolov8n_v2.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8n_v2.pt", + "size": "6.24MB" + }, + { + "name": "face_yolov8s (bbox)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/bbox", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "face_yolov8s.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/face_yolov8s.pt", + "size": "22.5MB" + }, + { + "name": "hand_yolov8n (bbox)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/bbox", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "hand_yolov8n.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/hand_yolov8n.pt", + "size": "6.24MB" + }, + { + "name": "hand_yolov8s (bbox)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/bbox", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "hand_yolov8s.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/hand_yolov8s.pt", + "size": "22.5MB" + }, + { + "name": "person_yolov8m (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "person_yolov8m-seg.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8m-seg.pt", + "size": "54.8MB" + }, + { + "name": "person_yolov8n (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "person_yolov8n-seg.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8n-seg.pt", + "size": "6.78MB" + }, + { + "name": "person_yolov8s (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "person_yolov8s-seg.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/person_yolov8s-seg.pt", + "size": "23.9MB" + }, + { + "name": "deepfashion2_yolov8s (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://huggingface.co/Bingsu/adetailer/tree/main", + "filename": "deepfashion2_yolov8s-seg.pt", + "url": "https://huggingface.co/Bingsu/adetailer/resolve/main/deepfashion2_yolov8s-seg.pt", + "size": "23.9MB" + }, + { + "name": "face_yolov8m-seg_60.pt (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://github.com/hben35096/assets/releases/tag/yolo8", + "filename": "face_yolov8m-seg_60.pt", + "url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8m-seg_60.pt", + "size": "54.8MB" + }, + { + "name": "face_yolov8n-seg2_60.pt (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://github.com/hben35096/assets/releases/tag/yolo8", + "filename": "face_yolov8n-seg2_60.pt", + "url": "https://github.com/hben35096/assets/releases/download/yolo8/face_yolov8n-seg2_60.pt", + "size": "6.77MB" + }, + { + "name": "hair_yolov8n-seg_60.pt (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://github.com/hben35096/assets/releases/tag/yolo8", + "filename": "hair_yolov8n-seg_60.pt", + "url": "https://github.com/hben35096/assets/releases/download/yolo8/hair_yolov8n-seg_60.pt", + "size": "6.77MB" + }, + { + "name": "skin_yolov8m-seg_400.pt (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://github.com/hben35096/assets/releases/tag/yolo8", + "filename": "skin_yolov8m-seg_400.pt", + "url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8m-seg_400.pt", + "size": "54.9MB" + }, + { + "name": "skin_yolov8n-seg_400.pt (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://github.com/hben35096/assets/releases/tag/yolo8", + "filename": "skin_yolov8n-seg_400.pt", + "url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_400.pt", + "size": "6.83MB" + }, + { + "name": "skin_yolov8n-seg_800.pt (segm)", + "type": "Ultralytics", + "base": "Ultralytics", + "save_path": "ultralytics/segm", + "description": "These are the available models in the UltralyticsDetectorProvider of Impact Pack.", + "reference": "https://github.com/hben35096/assets/releases/tag/yolo8", + "filename": "skin_yolov8n-seg_800.pt", + "url": "https://github.com/hben35096/assets/releases/download/yolo8/skin_yolov8n-seg_800.pt", + "size": "6.84MB" + }, + { + "name": "animatediff/mmd_sd_v14.ckpt (comfyui-animatediff) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "AnimateDiff", + "description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "mm_sd_v14.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt", + "size": "1.67GB" + }, + { + "name": "animatediff/mm_sd_v15.ckpt (comfyui-animatediff) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "AnimateDiff", + "description": "Pressing 'install' directly downloads the model from the ArtVentureX/AnimateDiff extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "mm_sd_v15.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt", + "size": "1.67GB" + }, + { + "name": "animatediff/mmd_sd_v14.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "mm_sd_v14.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v14.ckpt", + "size": "1.67GB" + }, + { + "name": "animatediff/mm_sd_v15.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "mm_sd_v15.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15.ckpt", + "size": "1.67GB" + }, + { + "name": "animatediff/mm_sd_v15_v2.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "mm_sd_v15_v2.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sd_v15_v2.ckpt", + "size": "1.82GB" + }, + { + "name": "animatediff/v3_sd15_mm.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v3_sd15_mm.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_mm.ckpt", + "size": "1.67GB" + }, + { + "name": "animatediff/mm_sdxl_v10_beta.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SDXL", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "mm_sdxl_v10_beta.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/mm_sdxl_v10_beta.ckpt", + "size": "950.1MB" + }, + { + "name": "AD_Stabilized_Motion/mm-Stabilized_high.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion", + "filename": "mm-Stabilized_high.pth", + "url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_high.pth", + "size": "1.67GB" + }, + { + "name": "AD_Stabilized_Motion/mm-Stabilized_mid.pth (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/manshoety/AD_Stabilized_Motion", + "filename": "mm-Stabilized_mid.pth", + "url": "https://huggingface.co/manshoety/AD_Stabilized_Motion/resolve/main/mm-Stabilized_mid.pth", + "size": "1.67GB" + }, + { + "name": "CiaraRowles/temporaldiff-v1-animatediff.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/CiaraRowles/TemporalDiff", + "filename": "temporaldiff-v1-animatediff.ckpt", + "url": "https://huggingface.co/CiaraRowles/TemporalDiff/resolve/main/temporaldiff-v1-animatediff.ckpt", + "size": "1.67GB" + }, + { + "name": "animatediff/v2_lora_PanLeft.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_PanLeft.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanLeft.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_PanRight.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_PanRight.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_PanRight.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_RollingAnticlockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_RollingAnticlockwise.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingAnticlockwise.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_RollingClockwise.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_RollingClockwise.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_RollingClockwise.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_TiltDown.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_TiltDown.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltDown.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_TiltUp.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_TiltUp.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_TiltUp.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_ZoomIn.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_ZoomIn.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomIn.ckpt", + "size": "77.5MB" + }, + { + "name": "animatediff/v2_lora_ZoomOut.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "motion lora", + "base": "SD1.x", + "save_path": "animatediff_motion_lora", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v2_lora_ZoomOut.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v2_lora_ZoomOut.ckpt", + "size": "77.5MB" + }, + { + "name": "LongAnimatediff/lt_long_mm_32_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/Lightricks/LongAnimateDiff", + "filename": "lt_long_mm_32_frames.ckpt", + "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_32_frames.ckpt", + "size": "1.82GB" + }, + { + "name": "LongAnimatediff/lt_long_mm_16_64_frames.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/Lightricks/LongAnimateDiff", + "filename": "lt_long_mm_16_64_frames.ckpt", + "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames.ckpt", + "size": "1.83GB" + }, + { + "name": "LongAnimatediff/lt_long_mm_16_64_frames_v1.1.ckpt (ComfyUI-AnimateDiff-Evolved) (Updated path)", + "type": "animatediff", + "base": "SD1.x", + "save_path": "animatediff_models", + "description": "Pressing 'install' directly downloads the model from the Kosinkadink/ComfyUI-AnimateDiff-Evolved extension node.", + "reference": "https://huggingface.co/Lightricks/LongAnimateDiff", + "filename": "lt_long_mm_16_64_frames_v1.1.ckpt", + "url": "https://huggingface.co/Lightricks/LongAnimateDiff/resolve/main/lt_long_mm_16_64_frames_v1.1.ckpt", + "size": "1.83GB" + }, + { + "name": "animatediff/v3_sd15_sparsectrl_rgb.ckpt (ComfyUI-AnimateDiff-Evolved)", + "type": "controlnet", + "base": "SD1.x", + "save_path": "controlnet/SD1.5/animatediff", + "description": "AnimateDiff SparseCtrl RGB ControlNet model", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v3_sd15_sparsectrl_rgb.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_rgb.ckpt", + "size": "1.99GB" + }, + { + "name": "animatediff/v3_sd15_sparsectrl_scribble.ckpt", + "type": "controlnet", + "base": "SD1.x", + "save_path": "controlnet/SD1.5/animatediff", + "description": "AnimateDiff SparseCtrl Scribble ControlNet model", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v3_sd15_sparsectrl_scribble.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_sparsectrl_scribble.ckpt", + "size": "1.99GB" + }, + { + "name": "animatediff/v3_sd15_adapter.ckpt", + "type": "lora", + "base": "SD1.x", + "save_path": "loras/SD1.5/animatediff", + "description": "AnimateDiff Adapter LoRA (SD1.5)", + "reference": "https://huggingface.co/guoyww/animatediff", + "filename": "v3_sd15_adapter.ckpt", + "url": "https://huggingface.co/guoyww/animatediff/resolve/main/v3_sd15_adapter.ckpt", + "size": "102.1MB" + }, + { + "name": "TencentARC/motionctrl.pth", + "type": "checkpoints", + "base": "MotionCtrl", + "save_path": "checkpoints/motionctrl", + "description": "To use the ComfyUI-MotionCtrl extension, downloading this model is required.", + "reference": "https://huggingface.co/TencentARC/MotionCtrl", + "filename": "motionctrl.pth", + "url": "https://huggingface.co/TencentARC/MotionCtrl/resolve/main/motionctrl.pth", + "size": "4.02GB" + }, + { + "name": "ip-adapter_sd15.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sd15.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15.safetensors", + "size": "44.6MB" + }, + { + "name": "ip-adapter_sd15_light_v11.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sd15_light_v11.bin", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light_v11.bin", + "size": "44.6MB" + }, + { + "name": "ip-adapter_sd15_light.safetensors [DEPRECATED]", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sd15_light.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light.safetensors", + "size": "44.6MB" + }, + { + "name": "ip-adapter-plus_sd15.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter-plus_sd15.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-plus_sd15.safetensors", + "size": "98.2MB" + }, + { + "name": "ip-adapter-plus-face_sd15.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter-plus-face_sd15.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-plus-face_sd15.safetensors", + "size": "98.2MB" + }, + { + "name": "ip-adapter-full-face_sd15.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter-full-face_sd15.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter-full-face_sd15.safetensors", + "size": "43.6MB" + }, + { + "name": "ip-adapter_sd15_vit-G.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sd15_vit-G.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_vit-G.safetensors", + "size": "46.2MB" + }, + { + "name": "ip-adapter-faceid_sd15.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15.bin", + "size": "96.7MB" + }, + { + "name": "ip-adapter-faceid-plusv2_sd15.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Plus V2 Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plusv2_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15.bin", + "size": "156.6MB" + }, + { + "name": "ip-adapter-faceid-plus_sd15.bin [DEPRECATED]", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Plus Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plus_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15.bin", + "size": "156.6MB" + }, + { + "name": "ip-adapter-faceid-portrait-v11_sd15.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait V11 Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait-v11_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait-v11_sd15.bin", + "size": "64.6MB" + }, + { + "name": "ip-adapter-faceid-portrait_sd15.bin [DEPRECATED]", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sd15.bin", + "size": "64.6MB" + }, + { + "name": "ip-adapter-faceid_sdxl.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Model (SDXL) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid_sdxl.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sdxl.bin", + "size": "1.07GB" + }, + { + "name": "ip-adapter-faceid-plusv2_sdxl.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Plus Model (SDXL) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plusv2_sdxl.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl.bin", + "size": "1.49GB" + }, + { + "name": "ip-adapter-faceid-portrait_sdxl.bin", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait Model (SDXL) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait_sdxl.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl.bin", + "size": "749.8MB" + }, + { + "name": "ip-adapter-faceid-portrait_sdxl_unnorm.bin", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait Model (SDXL/unnorm) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait_sdxl_unnorm.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl_unnorm.bin", + "size": "1.01GB" + }, + { + "name": "ip-adapter-faceid_sd15_lora.safetensors", + "type": "lora", + "base": "SD1.5", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID LoRA Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sd15_lora.safetensors", + "size": "51.1MB" + }, + { + "name": "ip-adapter-faceid-plus_sd15_lora.safetensors [DEPRECATED]", + "type": "lora", + "base": "SD1.5", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID Plus LoRA Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plus_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plus_sd15_lora.safetensors", + "size": "51.1MB" + }, + { + "name": "ip-adapter-faceid-plusv2_sd15_lora.safetensors", + "type": "lora", + "base": "SD1.5", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plusv2_sd15_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sd15_lora.safetensors", + "size": "51.1MB" + }, + { + "name": "ip-adapter-faceid_sdxl_lora.safetensors", + "type": "lora", + "base": "SDXL", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID LoRA Model (SDXL) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid_sdxl_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid_sdxl_lora.safetensors", + "size": "371.8MB" + }, + { + "name": "ip-adapter-faceid-plusv2_sdxl_lora.safetensors", + "type": "lora", + "base": "SDXL", + "save_path": "loras/ipadapter", + "description": "IP-Adapter-FaceID-Plus V2 LoRA Model (SDXL) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-plusv2_sdxl_lora.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-plusv2_sdxl_lora.safetensors", + "size": "371.8MB" + }, + { + "name": "ip-adapter_sdxl.safetensors", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sdxl.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter_sdxl.safetensors", + "size": "702.6MB" + }, + { + "name": "ip-adapter_sdxl_vit-h.safetensors", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sdxl_vit-h.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter_sdxl_vit-h.safetensors", + "size": "698.4MB" + }, + { + "name": "ip-adapter-plus_sdxl_vit-h.safetensors", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter-plus_sdxl_vit-h.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus_sdxl_vit-h.safetensors", + "size": "847.5MB" + }, + { + "name": "ip-adapter-plus-face_sdxl_vit-h.safetensors", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "This model requires the use of the SD1.5 encoder despite being for SDXL checkpoints [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter-plus-face_sdxl_vit-h.safetensors", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/sdxl_models/ip-adapter-plus-face_sdxl_vit-h.safetensors", + "size": "847.5MB" + }, + { + "name": "ip_plus_composition_sd15.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/ostris/ip-composition-adapter", + "filename": "ip_plus_composition_sd15.safetensors", + "url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sd15.safetensors", + "size": "98.2MB" + }, + { + "name": "ip_plus_composition_sdxl.safetensors", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/ostris/ip-composition-adapter", + "filename": "ip_plus_composition_sdxl.safetensors", + "url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sdxl.safetensors", + "size": "847.5MB" + }, + { + "name": "pfg-novel-n10.pt", + "type": "PFG", + "base": "SD1.5", + "save_path": "custom_nodes/pfg-ComfyUI/models", + "description": "Pressing 'install' directly downloads the model from the pfg-ComfyUI/models extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", + "reference": "https://huggingface.co/furusu/PFG", + "filename": "pfg-novel-n10.pt", + "url": "https://huggingface.co/furusu/PFG/resolve/main/pfg-novel-n10.pt", + "size": "23.6MB" + }, + { + "name": "pfg-wd14-n10.pt", + "type": "PFG", + "base": "SD1.5", + "save_path": "custom_nodes/pfg-ComfyUI/models", + "description": "Pressing 'install' directly downloads the model from the pfg-ComfyUI/models extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", + "reference": "https://huggingface.co/furusu/PFG", + "filename": "pfg-wd14-n10.pt", + "url": "https://huggingface.co/furusu/PFG/resolve/main/pfg-wd14-n10.pt", + "size": "31.5MB" + }, + { + "name": "pfg-wd15beta2-n10.pt", + "type": "PFG", + "base": "SD1.5", + "save_path": "custom_nodes/pfg-ComfyUI/models", + "description": "Pressing 'install' directly downloads the model from the pfg-ComfyUI/models extension node. (Note: Requires ComfyUI-Manager V0.24 or above)", + "reference": "https://huggingface.co/furusu/PFG", + "filename": "pfg-wd15beta2-n10.pt", + "url": "https://huggingface.co/furusu/PFG/resolve/main/pfg-wd15beta2-n10.pt", + "size": "31.5MB" + }, + { + "name": "GFPGANv1.4.pth", + "type": "GFPGAN", + "base": "GFPGAN", + "save_path": "facerestore_models", + "description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.", + "reference": "https://github.com/TencentARC/GFPGAN/releases", + "filename": "GFPGANv1.4.pth", + "url": "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.4/GFPGANv1.4.pth", + "size": "348.6MB" + }, + { + "name": "codeformer.pth", + "type": "CodeFormer", + "base": "CodeFormer", + "save_path": "facerestore_models", + "description": "Face Restoration Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.", + "reference": "https://github.com/sczhou/CodeFormer/releases", + "filename": "codeformer.pth", + "url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth", + "size": "376.6MB" + }, + { + "name": "detection_Resnet50_Final.pth", + "type": "facexlib", + "base": "facexlib", + "save_path": "facerestore_models", + "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.", + "reference": "https://github.com/xinntao/facexlib", + "filename": "detection_Resnet50_Final.pth", + "url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth", + "size": "109.5MB" + }, + { + "name": "detection_mobilenet0.25_Final.pth", + "type": "facexlib", + "base": "facexlib", + "save_path": "facerestore_models", + "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.", + "reference": "https://github.com/xinntao/facexlib", + "filename": "detection_mobilenet0.25_Final.pth", + "url": "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_mobilenet0.25_Final.pth", + "size": "1.79MB" + }, + { + "name": "yolov5l-face.pth", + "type": "facexlib", + "base": "facexlib", + "save_path": "facedetection", + "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.", + "reference": "https://github.com/xinntao/facexlib", + "filename": "yolov5l-face.pth", + "url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5l-face.pth", + "size": "187.0MB" + }, + { + "name": "yolov5n-face.pth", + "type": "facexlib", + "base": "facexlib", + "save_path": "facedetection", + "description": "Face Detection Models. Download the model required for using the 'Facerestore CF (Code Former)' custom node.", + "reference": "https://github.com/xinntao/facexlib", + "filename": "yolov5n-face.pth", + "url": "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/yolov5n-face.pth", + "size": "7.15MB" + }, + { + "name": "photomaker-v1.bin", + "type": "photomaker", + "base": "SDXL", + "save_path": "photomaker", + "description": "PhotoMaker model. This model is compatible with SDXL.", + "reference": "https://huggingface.co/TencentARC/PhotoMaker", + "filename": "photomaker-v1.bin", + "url": "https://huggingface.co/TencentARC/PhotoMaker/resolve/main/photomaker-v1.bin", + "size": "934.1MB" + }, + { + "name": "1k3d68.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/antelopev2", + "description": "Antelopev2 1k3d68.onnx model for InstantId. (InstantId needs all Antelopev2 models)", + "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation", + "filename": "1k3d68.onnx", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/1k3d68.onnx", + "size": "143.6MB" + }, + { + "name": "2d106det.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/antelopev2", + "description": "Antelopev2 2d106det.onnx model for InstantId. (InstantId needs all Antelopev2 models)", + "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation", + "filename": "2d106det.onnx", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/2d106det.onnx", + "size": "5.03MB" + }, + { + "name": "genderage.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/antelopev2", + "description": "Antelopev2 genderage.onnx model for InstantId. (InstantId needs all Antelopev2 models)", + "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation", + "filename": "genderage.onnx", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/genderage.onnx", + "size": "1.32MB" + }, + { + "name": "glintr100.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/antelopev2", + "description": "Antelopev2 glintr100.onnx model for InstantId. (InstantId needs all Antelopev2 models)", + "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation", + "filename": "glintr100.onnx", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/glintr100.onnx", + "size": "260.7MB" + }, + { + "name": "scrfd_10g_bnkps.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/antelopev2", + "description": "Antelopev2 scrfd_10g_bnkps.onnx model for InstantId. (InstantId needs all Antelopev2 models)", + "reference": "https://github.com/cubiq/ComfyUI_InstantID#installation", + "filename": "scrfd_10g_bnkps.onnx", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/scrfd_10g_bnkps.onnx", + "size": "16.9MB" + }, + { + "name": "ip-adapter.bin", + "type": "instantid", + "base": "SDXL", + "save_path": "instantid", + "description": "InstantId main model based on IpAdapter", + "reference": "https://huggingface.co/InstantX/InstantID", + "filename": "ip-adapter.bin", + "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin", + "size": "1.69GB" + }, + { + "name": "diffusion_pytorch_model.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/instantid", + "description": "InstantId controlnet model", + "reference": "https://huggingface.co/InstantX/InstantID", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "efficient_sam_s_cpu.jit [ComfyUI-YoloWorld-EfficientSAM]", + "type": "efficient_sam", + "base": "efficient_sam", + "save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM", + "description": "Install efficient_sam_s_cpu.jit into ComfyUI-YoloWorld-EfficientSAM", + "reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main", + "filename": "efficient_sam_s_cpu.jit", + "url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_cpu.jit", + "size": "106.0MB" + }, + { + "name": "efficient_sam_s_gpu.jit [ComfyUI-YoloWorld-EfficientSAM]", + "type": "efficient_sam", + "base": "efficient_sam", + "save_path": "custom_nodes/ComfyUI-YoloWorld-EfficientSAM", + "description": "Install efficient_sam_s_gpu.jit into ComfyUI-YoloWorld-EfficientSAM", + "reference": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/tree/main", + "filename": "efficient_sam_s_gpu.jit", + "url": "https://huggingface.co/camenduru/YoloWorld-EfficientSAM/resolve/main/efficient_sam_s_gpu.jit", + "size": "106.0MB" + }, + { + "name": "shape_predictor_68_face_landmarks.dat [Face Analysis]", + "type": "Shape Predictor", + "base": "DLIB", + "save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib", + "description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.", + "reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main", + "filename": "shape_predictor_68_face_landmarks.dat", + "url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/shape_predictor_68_face_landmarks.dat", + "size": "99.7MB" + }, + { + "name": "dlib_face_recognition_resnet_model_v1.dat [Face Analysis]", + "type": "Face Recognition", + "base": "DLIB", + "save_path": "custom_nodes/ComfyUI_FaceAnalysis/dlib", + "description": "To use the Face Analysis for ComfyUI custom node, installation of this model is needed.", + "reference": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/tree/main", + "filename": "dlib_face_recognition_resnet_model_v1.dat", + "url": "https://huggingface.co/matt3ounstable/dlib_predictor_recognition/resolve/main/dlib_face_recognition_resnet_model_v1.dat", + "size": "22.5MB" + }, + { + "name": "InstanceDiffusion/fusers", + "type": "InstanceDiffusion", + "base": "SD1.5", + "save_path": "instance_models/fuser_models", + "description": "Fusers checkpoints for multi-object prompting with InstanceDiffusion.", + "reference": "https://huggingface.co/logtd/instance_diffusion", + "filename": "fusers.ckpt", + "url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/fusers.ckpt", + "size": "832.1MB" + }, + { + "name": "InstanceDiffusion/position_net", + "type": "InstanceDiffusion", + "base": "SD1.5", + "save_path": "instance_models/positionnet_models", + "description": "PositionNet checkpoints for multi-object prompting with InstanceDiffusion.", + "reference": "https://huggingface.co/logtd/instance_diffusion", + "filename": "position_net.ckpt", + "url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/position_net.ckpt", + "size": "643.2MB" + }, + { + "name": "InstanceDiffusion/scaleu", + "type": "InstanceDiffusion", + "base": "SD1.5", + "save_path": "instance_models/scaleu_models", + "description": "ScaleU checkpoints for multi-object prompting with InstanceDiffusion.", + "reference": "https://huggingface.co/logtd/instance_diffusion", + "filename": "scaleu.ckpt", + "url": "https://huggingface.co/logtd/instance_diffusion/resolve/main/scaleu.ckpt", + "size": "53.1KB" + }, + { + "name": "1k3d68.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/buffalo_l", + "description": "Buffalo_l 1k3d68.onnx model for IpAdapterPlus", + "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid", + "filename": "1k3d68.onnx", + "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/1k3d68.onnx", + "size": "143.6MB" + }, + { + "name": "2d106det.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/buffalo_l", + "description": "Buffalo_l 2d106det.onnx model for IpAdapterPlus", + "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid", + "filename": "2d106det.onnx", + "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/2d106det.onnx", + "size": "5.03MB" + }, + { + "name": "det_10g.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/buffalo_l", + "description": "Buffalo_l det_10g.onnx model for IpAdapterPlus", + "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid", + "filename": "det_10g.onnx", + "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/det_10g.onnx", + "size": "16.9MB" + }, + { + "name": "genderage.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/buffalo_l", + "description": "Buffalo_l genderage.onnx model for IpAdapterPlus", + "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid", + "filename": "genderage.onnx", + "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/genderage.onnx", + "size": "1.32MB" + }, + { + "name": "w600k_r50.onnx", + "type": "insightface", + "base": "inswapper", + "save_path": "insightface/models/buffalo_l", + "description": "Buffalo_l w600k_r50.onnx model for IpAdapterPlus", + "reference": "https://github.com/cubiq/ComfyUI_IPAdapter_plus?tab=readme-ov-file#faceid", + "filename": "w600k_r50.onnx", + "url": "https://huggingface.co/public-data/insightface/resolve/main/models/buffalo_l/w600k_r50.onnx", + "size": "174.4MB" + }, + { + "name": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L", + "type": "BLIP_MODEL", + "base": "blip_model", + "save_path": "blip", + "description": "BLIP ImageCaption (COCO) w/ ViT-B and CapFilt-L", + "reference": "https://github.com/salesforce/BLIP", + "filename": "model_base_capfilt_large.pth", + "url": "https://storage.googleapis.com/sfr-vision-language-research/BLIP/models/model_base_capfilt_large.pth", + "size": "2.12GB" + }, + { + "name": "GroundingDINO SwinT OGC - Model", + "type": "GroundingDINO", + "base": "DINO", + "save_path": "groundingdino", + "description": "GroundingDINO SwinT OGC Model", + "reference": "https://huggingface.co/ShilongLiu/GroundingDINO", + "filename": "groundingdino_swint_ogc.pth", + "url": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/groundingdino_swint_ogc.pth", + "size": "694.0MB" + }, + { + "name": "GroundingDINO SwinT OGC - CFG File", + "type": "GroundingDINO", + "base": "DINO", + "save_path": "groundingdino", + "description": "GroundingDINO SwinT OGC CFG File", + "reference": "https://huggingface.co/ShilongLiu/GroundingDINO/resolve/main/GroundingDINO_SwinT_OGC.cfg.py", + "filename": "GroundingDINO_SwinT_OGC.cfg.py", + "url": "https://huggingface.co/ShilongLiu/GroundingDINO/raw/main/GroundingDINO_SwinT_OGC.cfg.py", + "size": "1.01KB" + }, + { + "name": "ViT-H SAM model", + "type": "sam", + "base": "SAM", + "save_path": "sams", + "description": "Segmenty Anything SAM model (ViT-H)", + "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints", + "filename": "sam_vit_h_4b8939.pth", + "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth", + "size": "2.56GB" + }, + { + "name": "ViT-L SAM model", + "type": "sam", + "base": "SAM", + "save_path": "sams", + "description": "Segmenty Anything SAM model (ViT-L)", + "reference": "https://github.com/facebookresearch/segment-anything#model-checkpoints", + "filename": "sam_vit_l_0b3195.pth", + "url": "https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth", + "size": "1.25GB" + }, + { + "name": "MobileSAM", + "type": "sam", + "base": "SAM", + "save_path": "sams", + "description": "MobileSAM", + "reference": "https://github.com/ChaoningZhang/MobileSAM/", + "filename": "mobile_sam.pt", + "url": "https://github.com/ChaoningZhang/MobileSAM/blob/master/weights/mobile_sam.pt", + "size": "38.8MB" + }, + { + "name": "DynamiCrafter 1024 bf16 safetensors", + "type": "checkpoints", + "base": "DynamiCrafter", + "save_path": "checkpoints/dynamicrafter", + "description": "DynamiCrafter image2video model 1024x575", + "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned/", + "filename": "dynamicrafter_1024_v1_bf16.safetensors", + "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/dynamicrafter_1024_v1_bf16.safetensors", + "size": "5.22GB" + }, + { + "name": "DynamiCrafter 512 interpolation bf16 safetensors", + "type": "checkpoints", + "base": "DynamiCrafter", + "save_path": "checkpoints/dynamicrafter", + "description": "DynamiCrafter image2video interpolation model 512", + "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned/", + "filename": "dynamicrafter_512_interp_v1_bf16.safetensors", + "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/dynamicrafter_512_interp_v1_bf16.safetensors", + "size": "5.22GB" + }, + { + "name": "monster-labs - Controlnet QR Code Monster v1 For SDXL", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "monster-labs - Controlnet QR Code Monster v1 For SDXL", + "reference": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster", + "filename": "control_v1p_sdxl_qrcode_monster.safetensors", + "url": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster/resolve/main/diffusion_pytorch_model.safetensors", + "size": "5.00GB" + }, + { + "name": "Depth-FM-v1 fp16 safetensors", + "type": "checkpoints", + "base": "Depth-FM", + "save_path": "checkpoints/depthfm", + "description": "Depth-FM monocular depth estimation model", + "reference": "https://huggingface.co/Kijai/depth-fm-pruned", + "filename": "depthfm-v1_fp16.safetensors", + "url": "https://huggingface.co/Kijai/depth-fm-pruned/resolve/main/depthfm-v1_fp16.safetensors", + "size": "1.73GB" + }, + { + "name": "Depth-FM-v1 fp32 safetensors", + "type": "checkpoints", + "base": "Depth-FM", + "save_path": "checkpoints/depthfm", + "description": "Depth-FM monocular depth estimation model", + "reference": "https://huggingface.co/Kijai/depth-fm-pruned", + "filename": "depthfm-v1_fp32.safetensors", + "url": "https://huggingface.co/Kijai/depth-fm-pruned/resolve/main/depthfm-v1_fp32.safetensors", + "size": "3.46GB" + }, + { + "name": "SUPIR-v0F.ckpt", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/camenduru/SUPIR/tree/main", + "filename": "SUPIR-v0F.ckpt", + "url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0F.ckpt", + "size": "5.33GB" + }, + { + "name": "SUPIR-v0Q.ckpt", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/camenduru/SUPIR/tree/main", + "filename": "SUPIR-v0Q.ckpt", + "url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0Q.ckpt", + "size": "5.33GB" + }, + { + "name": "Kijai/SUPIR-v0F_fp16.safetensors (pruned)", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main", + "filename": "SUPIR-v0F_fp16.safetensors", + "url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0F_fp16.safetensors", + "size": "2.66GB" + }, + { + "name": "Kijai/SUPIR-v0Q_fp16.safetensors (pruned)", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main", + "filename": "SUPIR-v0Q_fp16.safetensors", + "url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0Q_fp16.safetensors", + "size": "2.66GB" + }, + { + "name": "RAM", + "type": "RAM", + "base": "RAM", + "save_path": "rams", + "description": "RAM Recognize Anything Model", + "reference": "https://huggingface.co/xinyu1205/recognize_anything_model", + "filename": "ram_swin_large_14m.pth", + "url": "https://huggingface.co/xinyu1205/recognize_anything_model/resolve/main/ram_swin_large_14m.pth", + "size": "5.63GB" + }, + { + "name": "RAM++", + "type": "RAM", + "base": "RAM", + "save_path": "rams", + "description": "RAM++ Recognize Anything Model", + "reference": "https://huggingface.co/xinyu1205/recognize-anything-plus-model", + "filename": "ram_plus_swin_large_14m.pth", + "url": "https://huggingface.co/xinyu1205/recognize-anything-plus-model/resolve/main/ram_plus_swin_large_14m.pth", + "size": "3.01GB" + }, + { + "name": "tag2text", + "type": "RAM", + "base": "RAM", + "save_path": "rams", + "description": "tag2text Recognize Anything Model", + "reference": "https://huggingface.co/xinyu1205/recognize_anything_model", + "filename": "tag2text_swin_14m.pth", + "url": "https://huggingface.co/xinyu1205/recognize_anything_model/resolve/main/tag2text_swin_14m.pth", + "size": "4.48GB" + }, + { + "name": "Zero123 3D object Model", + "type": "Zero123", + "base": "Zero123", + "save_path": "checkpoints/zero123", + "description": "model that been trained on 10M+ 3D objects from Objaverse-XL, used for generated rotated CamView", + "reference": "https://objaverse.allenai.org/docs/zero123-xl/", + "filename": "zero123-xl.ckpt", + "url": "https://huggingface.co/kealiu/zero123-xl/resolve/main/zero123-xl.ckpt", + "size": "15.5GB" + }, + { + "name": "Zero123 3D object Model", + "type": "Zero123", + "base": "Zero123", + "save_path": "checkpoints/zero123", + "description": "Stable Zero123 is a model for view-conditioned image generation based on [a/Zero123](https://github.com/cvlab-columbia/zero123).", + "reference": "https://huggingface.co/stabilityai/stable-zero123", + "filename": "stable_zero123.ckpt", + "url": "https://huggingface.co/stabilityai/stable-zero123/resolve/main/stable_zero123.ckpt", + "size": "8.58GB" + }, + { + "name": "Zero123 3D object Model", + "type": "Zero123", + "base": "Zero123", + "save_path": "checkpoints/zero123", + "description": "Zero123 original checkpoints in 105000 steps.", + "reference": "https://huggingface.co/cvlab/zero123-weights", + "filename": "zero123-105000.ckpt", + "url": "https://huggingface.co/cvlab/zero123-weights/resolve/main/105000.ckpt", + "size": "15.5GB" + }, + { + "name": "Zero123 3D object Model", + "type": "Zero123", + "base": "Zero123", + "save_path": "checkpoints/zero123", + "description": "Zero123 original checkpoints in 165000 steps.", + "reference": "https://huggingface.co/cvlab/zero123-weights", + "filename": "zero123-165000.ckpt", + "url": "https://huggingface.co/cvlab/zero123-weights/resolve/main/165000.ckpt", + "size": "15.5GB" + }, + { + "name": "InstantID/ip-adapter", + "type": "instantid", + "base": "SDXL", + "save_path": "instantid/SDXL", + "description": "ip-adapter model for cubiq/InstantID", + "reference": "https://huggingface.co/InstantX/InstantID", + "filename": "ip-adapter.bin", + "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin", + "size": "1.69GB" + }, + { + "name": "InstantID/ControlNet", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/instantid", + "description": "instantid controlnet model for cubiq/InstantID", + "reference": "https://huggingface.co/InstantX/InstantID", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "MonsterMMORPG/insightface (for InstantID)", + "type": "insightface", + "base": "SDXL", + "save_path": "insightface/models", + "description": "MonsterMMORPG insightface model for cubiq/InstantID", + "reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main", + "filename": "antelopev2.zip", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip", + "size": "360.7MB" + }, + { + "name": "IC-Light/fc", + "type": "IC-Light", + "base": "SD1.5", + "save_path": "unet/IC-Light", + "description": "The default relighting model, conditioned on text and foreground", + "reference": "https://huggingface.co/lllyasviel/ic-light", + "filename": "iclight_sd15_fc.safetensors", + "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors", + "size": "1.72GB" + }, + { + "name": "IC-Light/fbc", + "type": "IC-Light", + "base": "SD1.5", + "save_path": "unet/IC-Light", + "description": "Relighting model conditioned with text, foreground, and background", + "reference": "https://huggingface.co/lllyasviel/ic-light", + "filename": "iclight_sd15_fbc.safetensors", + "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors", + "size": "1.72GB" + }, + { + "name": "IC-Light/fcon", + "type": "IC-Light", + "base": "SD1.5", + "save_path": "unet/IC-Light", + "description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise", + "reference": "https://huggingface.co/lllyasviel/ic-light", + "filename": "iclight_sd15_fcon.safetensors", + "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors", + "size": "1.72GB" + }, + { + "name": "ID-Animator/animator.ckpt", + "type": "ID-Animator", + "base": "SD1.5", + "save_path": "custom_nodes/ComfyUI_ID_Animator/models", + "description": "ID-Animator checkpoint", + "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator", + "filename": "animator.ckpt", + "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt", + "size": "247.3MB" + }, + { + "name": "ID-Animator/mm_sd_v15_v2.ckpt", + "type": "ID-Animator", + "base": "SD1.5", + "save_path": "custom_nodes/ComfyUI_ID_Animator/models/animatediff_models", + "description": "AnimateDiff checkpoint for ID-Animator", + "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator", + "filename": "mm_sd_v15_v2.ckpt", + "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt", + "size": "1.82GB" + }, + { + "name": "ID-Animator/image_encoder", + "type": "ID-Animator", + "base": "SD1.5", + "save_path": "custom_nodes/ComfyUI_ID_Animator/models/image_encoder", + "description": "CLIP Image encoder for ID-Animator", + "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator", + "filename": "model.safetensors", + "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors", + "size": "2.53GB" + }, + { + "name": "TencentARC/CustomNet", + "type": "CustomNet", + "base": "CustomNet", + "save_path": "custom_nodes/ComfyUI_CustomNet/pretrain", + "description": "CustomNet pretrained model for ComfyUI_CustomNet", + "reference": "https://huggingface.co/TencentARC/CustomNet/tree/main", + "filename": "customnet_v1.pt", + "url": "https://huggingface.co/TencentARC/CustomNet/resolve/main/customnet_v1.pt", + "size": "5.71GB" + }, + { + "name": "TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic v2 (fp16)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "Controlnet SDXL Tile model realistic version.", + "reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic", + "filename": "TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors", + "url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors", + "size": "2.50GB" + }, + { + "name": "TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic v2 (rank256)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "Controlnet SDXL Tile model realistic version.", + "reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic", + "filename": "TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors", + "url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors", + "size": "774.4MB" + }, + { + "name": "ViperYX/RGT_x2.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT", + "description": "RGT x2 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_x2.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x2.pth", + "size": "179.8MB" + }, + { + "name": "ViperYX/RGT_x3.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT", + "description": "RGT x3 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_x3.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x3.pth", + "size": "180.5MB" + }, + { + "name": "ViperYX/RGT_x4.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT", + "description": "RGT_S x4 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_x4.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x4.pth", + "size": "180.4MB" + }, + { + "name": "ViperYX/RGT_S_x2.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT_S", + "description": "RGT_S x2 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_S_x2.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x2.pth", + "size": "135.4MB" + }, + { + "name": "ViperYX/RGT_S_x3.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT_S", + "description": "RGT_S x3 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_S_x3.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x3.pth", + "size": "136.1MB" + }, + { + "name": "ViperYX/RGT_S_x4.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT_S", + "description": "RGT_S x4 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_S_x4.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x4.pth", + "size": "136.0MB" + }, + { + "name": "Doubiiu/ToonCrafter model checkpoint", + "type": "checkpoint", + "base": "ToonCrafter", + "save_path": "custom_nodes/ComfyUI-ToonCrafter/ToonCrafter/checkpoints/tooncrafter_512_interp_v1", + "description": "ToonCrafter checkpoint model for ComfyUI-ToonCrafter", + "reference": "https://huggingface.co/Doubiiu/ToonCrafter/tree/main", + "filename": "model.ckpt", + "url": "https://huggingface.co/Doubiiu/ToonCrafter/resolve/main/model.ckpt", + "size": "10.5GB" + }, + + { + "name": "xinsir/ControlNet++: All-in-one ControlNet", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-union-sdxl-1.0", + "description": "All-in-one ControlNet for image generations and editing!", + "reference": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Scribble-Sdxl-1.0", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0", + "description": "Controlnet SDXL Scribble model.", + "reference": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Canny-Sdxl-1.0 (V2)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-canny-sdxl-1.0", + "description": "Controlnet SDXL Canny model.", + "reference": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0", + "filename": "diffusion_pytorch_model_V2.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model_V2.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Openpose-Sdxl-1.0", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-openpose-sdxl-1.0", + "description": "Controlnet SDXL Openpose model.", + "reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Openpose-Sdxl-1.0 (Ver. twins)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-openpose-sdxl-1.0", + "description": "Controlnet SDXL Openpose model. (Ver. twins)", + "reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0", + "filename": "diffusion_pytorch_model_twins.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime", + "description": "Controlnet SDXL Scribble model. (Ver. anime)", + "reference": "https://huggingface.co/xinsir/anime-painter", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/anime-painter/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/ControlNet Depth SDXL, support zoe, midias", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-depth-sdxl-1.0", + "description": "Controlnet SDXL Depth model.", + "reference": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/ControlNet Tile SDXL", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-tile-sdxl-1.0", + "description": "Controlnet SDXL Tile model.", + "reference": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + + { + "name": "InstantX/SD3-Controlnet-Canny", + "type": "controlnet", + "base": "SD3", + "save_path": "controlnet/SD3/InstantX-Controlnet-Canny", + "description": "Controlnet SD3 Canny model.", + "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Canny", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/SD3-Controlnet-Canny/resolve/main/diffusion_pytorch_model.safetensors", + "size": "1.19GB" + }, + { + "name": "InstantX/SD3-Controlnet-Pose", + "type": "controlnet", + "base": "SD3", + "save_path": "controlnet/SD3/InstantX-Controlnet-Pose", + "description": "Controlnet SD3 Pose model.", + "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Pose", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/SD3-Controlnet-Pose/resolve/main/diffusion_pytorch_model.safetensors", + "size": "1.19GB" + }, + { + "name": "InstantX/SD3-Controlnet-Tile", + "type": "controlnet", + "base": "SD3", + "save_path": "controlnet/SD3/InstantX-Controlnet-Tile", + "description": "Controlnet SD3 Tile model.", + "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Tile", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/SD3-Controlnet-Tile/resolve/main/diffusion_pytorch_model.safetensors", + "size": "1.19GB" + }, + + { + "name": "Kijai/ToonCrafter model checkpoint (interpolation fp16)", + "type": "checkpoint", + "base": "ToonCrafter", + "save_path": "checkpoints/ToonCrafter", + "description": "ToonCrafter checkpoint model for ComfyUI-DynamiCrafterWrapper", + "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned", + "filename": "tooncrafter_512_interp-fp16.safetensors", + "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/tooncrafter_512_interp-fp16.safetensors", + "size": "5.25GB" + }, + { + "name": "CN-anytest_v4-marged.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors", + "size": "2.50GB" + }, + { + "name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim256) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim128) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim256) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim128) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "CN-anytest_v3-50000_fp16.safetensors (fp16)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_fp16.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors", + "size": "2.50GB" + }, + { + "name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim256) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim128) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim256) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "AnyTest Controlnet Lora (dim128) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitb/fp16)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitb_fp16.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp16.safetensors", + "size": "195.0MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitb/fp32)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitb_fp32.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp32.safetensors", + "size": "389.9MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitl/fp16)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitl_fp16.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp16.safetensors", + "size": "670.7MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitl/fp32)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitl_fp32.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp32.safetensors", + "size": "1.34GB" + }, + { + "name": "kijai/DepthAnythingV2 (vits/fp16)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vits_fp16.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp16.safetensors", + "size": "49.6MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitb/fp32)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vits_fp32.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp32.safetensors", + "size": "99.2MB" + }, + { + "name": "PixArt-Sigma-XL-2-1024-MS.pth", + "type": "checkpoint", + "base": "pixart-sigma", + "save_path": "checkpoints/PixArt-Sigma", + "description": "PixArt-Sigma Checkpoint model", + "reference": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/tree/main", + "filename": "PixArt-Sigma-XL-2-1024-MS.pth", + "url": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/resolve/main/PixArt-Sigma-XL-2-1024-MS.pth", + "size": "2.47GB" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/dev/custom-node-list.json new file mode 100644 index 000000000..6478121c1 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/dev/custom-node-list.json @@ -0,0 +1,1750 @@ +{ + "custom_nodes": [ + { + "author": "#NOTICE_1.13", + "title": "NOTICE: This channel is not the default channel.", + "reference": "https://github.com/ltdrdata/ComfyUI-Manager", + "files": [], + "install_type": "git-clone", + "description": "If you see this message, your ComfyUI-Manager is outdated.\nDev channel provides only the list of the developing nodes. If you want to find the complete node list, please go to the Default channel." + }, + + + { + "author": "tom-doerr", + "title": "DSPy Nodes [WIP]", + "reference": "https://github.com/tom-doerr/dspy_nodes", + "files": [ + "https://github.com/tom-doerr/dspy_nodes" + ], + "install_type": "git-clone", + "description": "This is an attempt to make all DSPy features available in ComfyUI. Using an UI to devlop DSPy programs should be way faster since it makes it easier to see what is happening and allows to quickly iterate on the DSPy program structure." + }, + { + "author": "Grant-CP", + "title": "ComfyUI-LivePortraitKJ-MPS", + "reference": "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS", + "files": [ + "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS" + ], + "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": "807502278", + "title": "ComfyUI-3D-MeshTool [WIP]", + "reference": "https://github.com/807502278/ComfyUI-3D-MeshTool", + "files": [ + "https://github.com/807502278/ComfyUI-3D-MeshTool" + ], + "install_type": "git-clone", + "description": "Introduction: A simple 3D model processing tool within ComfyUI" + }, + { + "author": "thderoo", + "title": "_topfun_s_nodes", + "reference": "https://github.com/thderoo/ComfyUI-_topfun_s_nodes", + "files": [ + "https://github.com/thderoo/ComfyUI-_topfun_s_nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Conditioning Perturbation" + }, + { + "author": "willblaschko", + "title": "ComfyUI-Unload-Models", + "reference": "https://github.com/willblaschko/ComfyUI-Unload-Models", + "files": [ + "https://github.com/willblaschko/ComfyUI-Unload-Models" + ], + "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]", + "id": "opendit", + "reference": "https://github.com/AIFSH/ComfyUI-OpenDIT", + "files": [ + "https://github.com/AIFSH/ComfyUI-OpenDIT" + ], + "install_type": "git-clone", + "description": "make [a/OpenDIT](https://github.com/NUS-HPC-AI-Lab/OpenDiT) avaliable in ComfyUI" + }, + { + "author": "alexisrolland", + "title": "alexisrolland/ComfyUI-AuraSR", + "id": "aurasr-alexisrolland", + "reference": "https://github.com/alexisrolland/ComfyUI-AuraSR", + "files": [ + "https://github.com/alexisrolland/ComfyUI-AuraSR" + ], + "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": "mingqizhang", + "title": "ComfyUI_AEMatter_zmq", + "id": "aematter", + "reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq", + "files": [ + "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq" + ], + "install_type": "git-clone", + "description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter, Improved_Aplha_Composite" + }, + { + "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]", + "id": "cfgpp", + "reference": "https://github.com/linhusyung/comfyui-Build-and-train-your-network", + "files": [ + "https://github.com/linhusyung/comfyui-Build-and-train-your-network" + ], + "install_type": "git-clone", + "description": "Stable Diffusion is an image generation technique based on diffusion models. Its core idea involves simulating diffusion processes by iteratively adding noise and using neural networks to predict and remove the noise, thereby generating high-quality images. This approach is not limited to image generation; with appropriate network architecture and training data, it can be adapted for various other tasks. The application of neural networks extends beyond image generation. By adjusting network structures and loss functions, neural networks can also perform tasks such as classification and regression. This flexibility makes neural networks a powerful tool for handling a wide range of machine learning tasks. This project aims to expand custom neural network layers (such as linear layers, convolutional layers, etc.) within ComfyUI and provide simplified task training functionalities. Through this project, users can easily construct custom neural network layers and perform training in ComfyUI using a graphical interface." + }, + { + "author": "alexgenovese", + "title": "comfyui_CfgPlusPlus [WIP]", + "id": "cfgpp", + "reference": "https://gitea.com/NotEvilGirl/cfgpp", + "files": [ + "https://gitea.com/NotEvilGirl/cfgpp" + ], + "install_type": "git-clone", + "description": "CFG++ implemented according to [a/https://cfgpp-diffusion.github.io](https://cfgpp-diffusion.github.io). Basically modified DDIM sampler that makes sampling work at low CFG values (0 ~ 2). Read the CFG++ paper for more details" + }, + { + "author": "Fucci-Mateo", + "title": "ComfyUI-Airtable [WIP]", + "id": "airtable", + "reference": "https://github.com/Fucci-Mateo/ComfyUI-Airtable", + "files": [ + "https://github.com/Fucci-Mateo/ComfyUI-Airtable" + ], + "install_type": "git-clone", + "description": "A simple node to load image from local path or http url. You can find this node from 'image' category." + }, + { + "author": "mingqizhang", + "title": "ComfyUI_AEMatter_zmq", + "id": "aematter-zmq", + "reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq", + "files": [ + "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq" + ], + "install_type": "git-clone", + "description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter" + }, + { + "author": "majorsauce", + "title": "comfyui_indieTools [WIP]", + "id": "indie-tools", + "reference": "https://github.com/majorsauce/comfyui_indieTools", + "files": [ + "https://github.com/majorsauce/comfyui_indieTools" + ], + "install_type": "git-clone", + "description": "Nodes:[Indie] Cut by Mask, [Indie] Paste Image, [Indie] Local Scale, [Indie] Solidify, [Indie] Yolo Detector.[w/Install may fail due to invliad requirements.txt file]" + }, + { + "author": "AIFSH", + "title": "ComfyUI-ViViD", + "id": "vivid", + "reference": "https://github.com/AIFSH/ComfyUI-ViViD", + "files": [ + "https://github.com/AIFSH/ComfyUI-ViViD" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for ViViD" + }, + { + "author": "NeuralNotW0rk", + "title": "ComfyUI-Waveform-Extensions", + "reference": "https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions", + "files": [ + "https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/raw/main/EXT_VariationUtils.py", + "https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py" + ], + "install_type": "copy", + "description": "Some additional audio utilites for use on top of Sample Diffusion ComfyUI Extension" + }, + { + "author": "mingqizhang", + "title": "ComfyUI_AEMatter_zmq", + "reference": "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq", + "files": [ + "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq" + ], + "install_type": "git-clone", + "description": "Nodes:AEMatter_ModelLoader, Create_Trimap, AEMatter_Apply, Mask_Transfor, Replace_Background, Gaussian_Filter, Guide_Filter." + }, + { + "author": "nat-chan", + "title": "comfyui-paint", + "reference": "https://github.com/nat-chan/comfyui-paint", + "files": [ + "https://github.com/nat-chan/comfyui-paint" + ], + "install_type": "git-clone", + "description": "comfyui-paint\n[w/You need to clone submodule manually after clone. There is permission issue.]" + }, + { + "author": "prabinpebam", + "title": "anyPython [UNSAFE]", + "reference": "https://github.com/prabinpebam/anyPython", + "files": [ + "https://github.com/prabinpebam/anyPython" + ], + "install_type": "git-clone", + "description": "This node was inspired by AnyNode. I wanted to have a node where I can paste any python script and execute it. That way I can use this node in combination with a Custom node like the Ollama node that can generate the python code and feed into this node. This also makes it much easier to debug or modify the code iteratively. As of the current version, I've created separate nodes for no input, 1 input and 2 inputs. The input also currently takes only sting as input. Let me know in the discussion how you would use this node.\n[w/This extension allows the execution of arbitrary Python code from a workflow.]" + }, + { + "author": "kijai", + "title": "ComfyUI DiffSynth wrapper nodes", + "id": "diffsynth-wrapper", + "reference": "https://github.com/kijai/ComfyUI-DiffSynthWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-DiffSynthWrapper" + ], + "install_type": "git-clone", + "description": "Currently only the new extended SVD model 'ExVideo' is supported.\nOriginal repo:[a/https://github.com/modelscope/DiffSynth-Studio](https://github.com/modelscope/DiffSynth-Studio)" + }, + { + "author": "AllenEdgarPoe", + "title": "ComfyUI-Xorbis-nodes", + "id": "xorbis", + "reference": "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes", + "files": [ + "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes" + ], + "install_type": "git-clone", + "description": "This repository is for MuseumX Update. We use ComfyUI as our framework, and the nodes are built for my comfort." + }, + { + "author": "mikeymcfish", + "title": "LaserCutterFull and Deptherize Nodes", + "id": "fishtools", + "reference": "https://github.com/mikeymcfish/FishTools", + "files": [ + "https://github.com/mikeymcfish/FishTools" + ], + "install_type": "git-clone", + "description": "This repository contains two custom nodes, LaserCutterFull and Deptherize, designed for use in image processing workflows. The LaserCutterFull node processes input images to generate layers for laser cutting, while the Deptherize node converts SVG data into a depth map image." + }, + { + "author": "pzzmyc", + "title": "comfyui-sd3-simple-simpletuner", + "id": "simpletuner", + "reference": "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner", + "files": [ + "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner" + ], + "install_type": "git-clone", + "description": "Nodes:sd3 simple simpletuner by hhy." + }, + { + "author": "horidream", + "title": "ComfyUI-Horidream", + "id": "horidream", + "reference": "https://github.com/horidream/ComfyUI-Horidream", + "files": [ + "https://github.com/horidream/ComfyUI-Horidream" + ], + "install_type": "git-clone", + "description": "Nodes:Pass Through With Sound." + }, + { + "author": "kijai", + "title": "ComfyUI-DiffusersSD3Wrapper", + "id": "diffusers-sd3-wrapper", + "reference": "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper", + "files": [ + "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper" + ], + "install_type": "git-clone", + "description": "Nodes:Load SD3DiffusersPipeline, SD3 ControlNet Sampler" + }, + { + "author": "AustinMroz", + "title": "ComfyUI-SD3-Medium-CN-Diffusers [WIP]", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers", + "files": [ + "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing" + ], + "install_type": "git-clone", + "description": "ComfyUI SD3-Medium ControlNet (Diffusers)" + }, + { + "author": "redhottensors", + "title": "ComfyUI-ODE", + "id": "ode", + "reference": "https://github.com/redhottensors/ComfyUI-ODE", + "files": [ + "https://github.com/redhottensors/ComfyUI-ODE" + ], + "install_type": "git-clone", + "description": "ODE Solvers for ComfyUI\nThis node enables use of torchdiffeq ODE solvers with models. Intended for use with Stable Diffusion 3 and similar flow models." + }, + { + "author": "maruhidd", + "title": "Transparent Background for ComfyUI", + "id": "transparent-bg", + "reference": "https://github.com/maruhidd/ComfyUI_Transparent-Background", + "files": [ + "https://github.com/maruhidd/ComfyUI_Transparent-Background" + ], + "install_type": "git-clone", + "description": "Nodes:Remove Background, Fill Transparent" + }, + { + "author": "baicai99", + "title": "ComfyUI-FrameSkipping", + "id": "frame-skipping", + "reference": "https://github.com/baicai99/ComfyUI-FrameSkipping", + "files": [ + "https://github.com/baicai99/ComfyUI-FrameSkipping" + ], + "install_type": "git-clone", + "description": "This plugin can precisely control the rendering between frames, completing the synthesis of multiple frames in a single load. My homepage includes my attached workflow." + }, + { + "author": "ejektaflex", + "title": "ComfyUI - Ty", + "id": "ty-nodes", + "reference": "https://github.com/ejektaflex/ComfyUI-Ty", + "files": [ + "https://github.com/ejektaflex/ComfyUI-Ty" + ], + "install_type": "git-clone", + "description": "Nodes:Lora Block Weight Regex Loader" + }, + { + "author": "jtydhr88", + "title": "ComfyUI-Unique3D [WIP]", + "id": "unique3d", + "reference": "https://github.com/jtydhr88/ComfyUI-Unique3D", + "files": [ + "https://github.com/jtydhr88/ComfyUI-Unique3D" + ], + "install_type": "git-clone", + "description": "ComfyUI Unique3D is custom nodes that running [a/AiuniAI/Unique3D](https://github.com/AiuniAI/Unique3D) into ComfyUI." + }, + { + "author": "kycg", + "title": "comfyui-Kwtoolset", + "id": "kwtoolset", + "reference": "https://github.com/kycg/comfyui-Kwtoolset", + "files": [ + "https://github.com/kycg/comfyui-Kwtoolset" + ], + "install_type": "git-clone", + "description": "Nodes:KwtoolsetLoraLoaderwithpreview, KwtoolsetCheckpointLoaderwithpreview, KwtoolsetLoadCheckpointsBatch, KwtoolsetGrowMaskPlus, KwtoolsetGetHipMask, KwtoolsetGetHipMasktest, KwtoolsetGetImageSize, KWPositiveString, KWNagetiveString, KWanywhereString, KwtoolsetChangeOpenpose, ..." + }, + { + "author": "mashb1t", + "title": "ComfyUI mashb1t nodes", + "id": "mashb1t", + "reference": "https://github.com/mashb1t/comfyui-nodes-mashb1t", + "files": [ + "https://github.com/mashb1t/comfyui-nodes-mashb1t" + ], + "install_type": "git-clone", + "description": "This Python script is an optional add-on to the Comfy UI stable diffusion client." + }, + { + "author": "immersiveexperience", + "title": "ie-comfyui-color-nodes", + "reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes", + "files": [ + "https://github.com/immersiveexperience/ie-comfyui-color-nodes" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI nodes for simple color correction." + }, + { + "author": "LZpenguin", + "title": "ComfyUI-Text", + "id": "comfy-text", + "reference": "https://github.com/LZpenguin/ComfyUI-Text", + "files": [ + "https://github.com/LZpenguin/ComfyUI-Text" + ], + "install_type": "git-clone", + "description": "Nodes:Add_text_by_mask.[w/This custom node cannot be installed simultaneously as it has the same repository name as MarkoCa1/ComfyUI-Text.]" + }, + { + "author": "yushan777", + "title": "Y7 Nodes for ComfyUI", + "id": "y7nodes", + "reference": "https://github.com/yushan777/ComfyUI-Y7Nodes", + "files": [ + "https://github.com/yushan777/ComfyUI-Y7Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Count_Tokens_(Y7)" + }, + { + "author": "norgeous", + "title": "UI Builder [WIP]", + "id": "norgeous", + "reference": "https://github.com/norgeous/ComfyUI-UI-Builder", + "files": [ + "https://github.com/norgeous/ComfyUI-UI-Builder" + ], + "install_type": "git-clone", + "description": "Alternative configurable React UI overlay for Comfy UI." + }, + { + "author": "Shinsplat", + "title": "ComfyUI-Shinsplat [UNSAFE]", + "id": "shinsplat", + "reference": "https://github.com/Shinsplat/ComfyUI-Shinsplat", + "files": [ + "https://github.com/Shinsplat/ComfyUI-Shinsplat" + ], + "install_type": "git-clone", + "description": "Nodes: Clip Text Encode (Shinsplat), Clip Text Encode SDXL (Shinsplat), Lora Loader (Shinsplat).\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]" + }, + { + "author": "NitramDom", + "title": "ComfyUI_FacialFlip", + "id": "facialflip", + "reference": "https://github.com/NitramDom/ComfyUI_FacialFlip", + "files": [ + "https://github.com/NitramDom/ComfyUI_FacialFlip" + ], + "install_type": "git-clone", + "description": "Nodes:Swapper" + }, + { + "author": "hy134300", + "title": "comfyui-hydit", + "reference": "https://github.com/hy134300/comfyui-hydit", + "files": [ + "https://github.com/hy134300/comfyui-hydit" + ], + "install_type": "git-clone", + "description": "This repository contains a customized node and workflow designed specifically for HunYuan DIT. The official tests conducted on DDPM, DDIM, and DPMMS have consistently yielded results that align with those obtained through the Diffusers library. However, it's important to note that we cannot assure the consistency of results from other ComfyUI native samplers with the Diffusers inference. We cordially invite users to explore our workflow and are open to receiving any inquiries or suggestions you may have." + }, + { + "author": "corbin-hayden13", + "title": "ComfyUI-Better-Dimensions", + "id": "better-dim", + "reference": "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions", + "files": [ + "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions" + ], + "install_type": "git-clone", + "description": "Nodes:BetterImageDimensions, SDXLDimensions, PureRatio" + }, + { + "author": "endman100", + "title": "ComfyUI Nodes: SaveConditioning and LoadConditioning", + "id": "save-load-conditioning", + "reference": "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition", + "files": [ + "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition" + ], + "install_type": "git-clone", + "description": "The SaveConditioning node is designed to save conditioning data to binary files. This is useful for storing and reusing conditioning information across different sessions or applications.\n[w/This node can only handle very limited conditioning at the text prompt level.]" + }, + { + "author": "marduk191", + "title": "comfyui-marnodes", + "id": "marnodes", + "reference": "https://github.com/marduk191/comfyui-marnodes", + "files": [ + "https://github.com/marduk191/comfyui-marnodes" + ], + "install_type": "git-clone", + "description": "Nodes:marduk191_workflow_settings" + }, + { + "author": "kijai", + "title": "ComfyUI-CV-VAE", + "id": "cv-vae", + "reference": "https://github.com/kijai/ComfyUI-CV-VAE", + "files": [ + "https://github.com/kijai/ComfyUI-CV-VAE" + ], + "install_type": "git-clone", + "description": "Nodes:CV_VAE_Load, CV_VAE_Encode, CV_VAE_Decode" + }, + { + "author": "GentlemanHu", + "title": "ComfyUI Notifier", + "id": "notifier", + "reference": "https://github.com/GentlemanHu/ComfyUI-Notifier", + "files": [ + "https://github.com/GentlemanHu/ComfyUI-Notifier" + ], + "install_type": "git-clone", + "description": "Nodes:GentlemanHu_Notifier" + }, + { + "author": "jimmm-ai", + "title": "TimeUi a ComfyUI Timeline Node System [WIP]", + "id": "timeline", + "reference": "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node", + "files": [ + "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node" + ], + "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", + "id": "cxh-crm", + "reference": "https://github.com/StartHua/Comfyui_CXH_CRM", + "files": [ + "https://github.com/StartHua/Comfyui_CXH_CRM" + ], + "install_type": "git-clone", + "description": "Nodes:CRM" + }, + { + "author": "comfypod", + "title": "ComfyUI-Comflow", + "id": "comflow", + "reference": "https://github.com/comfypod/ComfyUI-Comflow", + "files": [ + "https://github.com/comfypod/ComfyUI-Comflow" + ], + "install_type": "git-clone", + "description": "ComfyUI-Comflow." + }, + { + "author": "pamparamm", + "title": "ComfyUI-ppm", + "id": "ppm", + "reference": "https://github.com/pamparamm/ComfyUI-ppm", + "files": [ + "https://github.com/pamparamm/ComfyUI-ppm" + ], + "install_type": "git-clone", + "description": "Nodes:Empty Latent Image (Aspect Ratio), Token Counter, Random Prompt Generator, StableCascade_AutoCompLatent, CLIPTextEncode, CLIPMicroConditioning, CLIPNegPip" + }, + { + "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", + "id": "kisekae-ootd", + "reference": "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD", + "files": [ + "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD" + ], + "install_type": "git-clone", + "description": "Nodes:LoadOOTDPipeline, LoadOOTDPipelineHub, LoadOOTDPipelineHub." + }, + { + "author": "bruce007lee", + "title": "comfyui-tiny-utils", + "id": "tiny-utils", + "reference": "https://github.com/bruce007lee/comfyui-tiny-utils", + "files": [ + "https://github.com/bruce007lee/comfyui-tiny-utils" + ], + "install_type": "git-clone", + "description": "Nodes:FaceAlign, FaceAlignImageProcess, FaceAlignMaskProcess" + }, + { + "author": "zmwv823", + "title": "ComfyUI-AnyText [UNSTABLE]", + "id": "anytext", + "reference": "https://github.com/zmwv823/ComfyUI-AnyText", + "files": [ + "https://github.com/zmwv823/ComfyUI-AnyText" + ], + "install_type": "git-clone", + "description": "Unofficial Simple And Rough Implementation Of [a/AnyText](https://github.com/tyxsspa/AnyText)" + }, + { + "author": "brycegoh", + "title": "brycegoh/comfyui-custom-nodes", + "reference": "https://github.com/brycegoh/comfyui-custom-nodes", + "files": [ + "https://github.com/brycegoh/comfyui-custom-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:MaskAreaComparisonSegment, FillMaskedArea, OCRAndMask, CombineTwoImageIntoOne" + }, + { + "author": "LykosAI", + "title": "ComfyUI Nodes for Inference.Core", + "id": "inference-core", + "reference": "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes", + "files": [ + "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes" + ], + "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", + "id": "p5js", + "reference": "https://github.com/tracerstar/comfyui-p5js-node", + "files": [ + "https://github.com/tracerstar/comfyui-p5js-node" + ], + "install_type": "git-clone", + "description": "A simple proof of concept node to pass a p5js canvas through ComfyUI for img2img generation use." + }, + { + "author": "chaojie", + "title": "ComfyUI-mobvoi-openapi", + "id": "mobvoi-openapi", + "reference": "https://github.com/chaojie/ComfyUI-mobvoi-openapi", + "files": [ + "https://github.com/chaojie/ComfyUI-mobvoi-openapi" + ], + "install_type": "git-clone", + "description": "Nodes:MobvoiOpenapiMetamanText, MobvoiOpenapiMetamanAudio, MobvoiOpenapiTts, HtmlViewer, OssUploadImage, OssUploadAudio" + }, + { + "author": "immersiveexperience", + "title": "ie-comfyui-color-nodes", + "id": "ie-color-nodes", + "reference": "https://github.com/immersiveexperience/ie-comfyui-color-nodes", + "files": [ + "https://github.com/immersiveexperience/ie-comfyui-color-nodes" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI nodes for simple color correction." + }, + { + "author": "beyastard", + "title": "ComfyUI_BeySoft", + "reference": "https://github.com/beyastard/ComfyUI_BeySoft", + "files": [ + "https://github.com/beyastard/ComfyUI_BeySoft" + ], + "install_type": "git-clone", + "description": "Nodes:BeySoft" + }, + { + "author": "christian-byrne", + "title": "🌌 Infinite Parallax Nodes [WIP]", + "reference": "https://github.com/christian-byrne/infinite-zoom-parallax-nodes", + "files": [ + "https://github.com/christian-byrne/infinite-zoom-parallax-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Parallax Config, Load Parallax Frame, Save Parallax Object Layers, Layer Shifter for Parallax Outpainting, Save Parallax Frame, Shrink and Pad for Outpainting, Create Infinite Zoom Video" + }, + { + "author": "flyingdogsoftware", + "title": "Gyre for ComfyUI", + "id": "gyre", + "reference": "https://github.com/flyingdogsoftware/gyre_for_comfyui", + "files": [ + "https://github.com/flyingdogsoftware/gyre_for_comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:GyreLoopStart, GyreLoopEnd, GyreIfElse" + }, + { + "author": "githubYiheng", + "title": "comfyui_median_filter", + "id": "median-filter", + "reference": "https://github.com/githubYiheng/comfyui_median_filter", + "files": [ + "https://github.com/githubYiheng/comfyui_median_filter" + ], + "install_type": "git-clone", + "description": "Nodes:Apply Median Filter. [w/This has been updated to be equivalent to the comfyui_kmeans_filter node. Mistake?]" + }, + { + "author": "nat-chan", + "title": "comfyui-eval [UNSAFE]", + "id": "evalnode", + "reference": "https://github.com/nat-chan/comfyui-eval", + "files": [ + "https://github.com/nat-chan/comfyui-eval" + ], + "install_type": "git-clone", + "description": "Nodes:EvalNode [w/Please do not use the node that executes arbitrary code and outputs in any type, as it is dangerous.]" + }, + { + "author": "haofanwang", + "title": "ComfyUI-InstantStyle", + "id": "instantstyle", + "reference": "https://github.com/haofanwang/ComfyUI-InstantStyle", + "files": [ + "https://github.com/haofanwang/ComfyUI-InstantStyle" + ], + "install_type": "git-clone", + "description": "Nodes:PromptLoader, BaseModelLoader, InstantStyleLoader, InstantStyleGenerationNode" + }, + { + "author": "jp0215", + "title": "comfyUI_padding-resize_node", + "reference": "https://github.com/jp0215/comfyUI_padding-resize_node", + "files": [ + "https://github.com/jp0215/comfyUI_padding-resize_node/raw/main/PaddingNode.py", + "https://github.com/jp0215/comfyUI_padding-resize_node/raw/main/ResizeNode.py" + ], + "install_type": "copy", + "description": "Padding image to 8x: input image and mask, if the side length is not an integer multiple of 8, expand the side length to the smallest multiple of 8 greater than the original side length. Output padding image and mask. Resize to the origin: input the generated image and the original image, crop the generated image to the size of the original image, output the cropped image." + }, + { + "author": "Quasimondo", + "title": "ComfyUI-QuasimondoNodes [WIP]", + "id": "quasimondo-nodes", + "reference": "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes", + "files": [ + "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes" + ], + "install_type": "git-clone", + "description": "Nodes:Custom Shader, Spring Mesh" + }, + { + "author": "TSFSean", + "title": "ComfyUI-TSFNodes", + "id": "tsfnodes", + "reference": "https://github.com/TSFSean/ComfyUI-TSFNodes", + "files": [ + "https://github.com/TSFSean/ComfyUI-TSFNodes" + ], + "install_type": "git-clone", + "description": "Nodes:GyroOSC" + }, + { + "author": "blib-la", + "title": "ComfyUI-Captain-Extensions", + "id": "captain", + "reference": "https://github.com/blib-la/ComfyUI-Captain-Extensions", + "files": [ + "https://github.com/blib-la/ComfyUI-Captain-Extensions" + ], + "install_type": "git-clone", + "description": "ComfyUI extensions for better [a/Captain](https://github.com/blib-la/captain) integration." + }, + { + "author": "ejektaflex", + "title": "ComfyUI-Ty", + "reference": "https://github.com/ejektaflex/ComfyUI-Ty", + "files": [ + "https://github.com/ejektaflex/ComfyUI-Ty" + ], + "install_type": "git-clone", + "description": "Nodes:Lora Block Weight Regex Loader" + }, + { + "author": "christian-byrne", + "title": "Python Interpreter ComfyUI Node [UNSAFE]", + "reference": "https://github.com/christian-byrne/python-interpreter-node", + "files": [ + "https://github.com/christian-byrne/python-interpreter-node" + ], + "install_type": "git-clone", + "description": "For debugging, parsing data, generating random values, converting types, testing custom nodes faster.\nReference and use variables in the code using the same names as the inputs in the UI\nWrapper class around tensors with operator overloading for doing common image manipulation tasks.I might remove this aspect\n[w/This extension allows you to run programs through Python code in your workflow, which may not be secure. Use with caution.]" + }, + { + "author": "sofakid", + "title": "dandy [UNSAFE]", + "reference": "https://github.com/sofakid/dandy", + "files": [ + "https://github.com/sofakid/dandy" + ], + "install_type": "git-clone", + "description": "Dandy is a JavaScript bridge for ComfyUI. It includes everything you need to make JavaScript enabled extensions, or just load and code in little editor nodes right in ComfyUI.[w/This code can cause security issues because it allows for the execution of arbitrary JavaScript input.]" + }, + { + "author": "tachyon-beep", + "title": "comfyui-simplefeed [UNSAFE]", + "reference": "https://github.com/tachyon-beep/comfyui-simplefeed", + "files": [ + "https://github.com/tachyon-beep/comfyui-simplefeed" + ], + "install_type": "git-clone", + "description": "A simple image feed for comfyUI which is easily configurable and easily extensible.\nUse the filter button to select which nodes write to the feed. Under settings, there are options that allow you: Position the feed. Set a max iamge count for the feed. Set oldest to newest or newest to oldest." + }, + { + "author": "shadowcz007", + "title": "ComfyUI-PuLID [TEST]", + "reference": "https://github.com/shadowcz007/ComfyUI-PuLID-Test", + "files": [ + "https://github.com/shadowcz007/ComfyUI-PuLID-Test" + ], + "install_type": "git-clone", + "description": "[a/PuLID](https://github.com/ToTheBeginning/PuLID) ComfyUI native implementation." + }, + { + "author": "sangeet", + "title": "comfyui-testui [TEST]", + "reference": "https://github.com/sangeet/comfyui-testui", + "files": [ + "https://github.com/sangeet/comfyui-testui" + ], + "install_type": "git-clone", + "description": "Simple Frontend For ComfyUI workflow" + }, + { + "author": "Elawphant", + "title": "ComfyUI-MusicGen [WIP]", + "id": "musicgen", + "reference": "https://github.com/Elawphant/ComfyUI-MusicGen", + "files": [ + "https://github.com/Elawphant/ComfyUI-MusicGen" + ], + "install_type": "git-clone", + "description": "ComfyUI for Meta MusicGen." + }, + { + "author": "jtscmw01", + "title": "ComfyUI-DiffBIR", + "id": "diffbir", + "reference": "https://github.com/jtscmw01/ComfyUI-DiffBIR", + "files": [ + "https://github.com/jtscmw01/ComfyUI-DiffBIR" + ], + "install_type": "git-clone", + "description": "This extension provides [a/DiffBIR](https://github.com/XPixelGroup/DiffBIR) feature." + }, + { + "author": "ericbeyer", + "title": "guidance_interval", + "reference": "https://github.com/ericbeyer/guidance_interval", + "files": [ + "https://github.com/ericbeyer/guidance_interval" + ], + "install_type": "git-clone", + "description": "Nodes:Guidance Interval\nNOTE: Because the sampling function is replaced, you must restart after executing this custom node to restore the original state." + }, + { + "author": "GraftingRayman", + "title": "ComfyUI-GR", + "reference": "https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector", + "files": [ + "https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector" + ], + "install_type": "git-clone", + "description": "Nodes:GR Prompt Selector" + }, + { + "author": "oztrkoguz", + "title": "Kosmos2_BBox_Cutter Models", + "reference": "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter", + "files": [ + "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter" + ], + "install_type": "git-clone", + "description": "Nodes:KosmosLoader, Kosmos2SamplerSimple, Write" + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "ComfyUI-PuLID-ZHO [WIP]", + "reference": "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO", + "files": [ + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/PuLID](https://github.com/ToTheBeginning/PuLID)(diffusers) for ComfyUI" + }, + { + "author": "longgui0318", + "title": "comfyui-one-more-step [WIP]", + "reference": "https://github.com/longgui0318/comfyui-one-more-step", + "files": [ + "https://github.com/longgui0318/comfyui-one-more-step" + ], + "install_type": "git-clone", + "description": "[a/(OMS)mhh0318/OneMoreStep](https://github.com/mhh0318/OneMoreStep) comfyui support ." + }, + { + "author": "unknown", + "title": "CLIPTextEncodeAndEnhancev4 (shirazdesigner)", + "reference": "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4", + "files": [ + "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4" + ], + "install_type": "git-clone", + "description": "Nodes:CLIPTextEncodeAndEnhance.\nNOTE:Translation:This is a wrapper that simply makes it easy to install an existing node via git." + }, + { + "author": "umisetokikaze", + "title": "comfyui_mergekit [WIP]", + "reference": "https://github.com/umisetokikaze/comfyui_mergekit", + "files": [ + "https://github.com/umisetokikaze/comfyui_mergekit" + ], + "install_type": "git-clone", + "description": "Nodes:DefineSaveName, SetModels, get_skip, LoadLR, LoadTarget, SetTokenizer, Merge, SetLayer, SetModels" + }, + { + "author": "Video3DGenResearch", + "title": "ComfyUI Batch Input Node", + "reference": "https://github.com/Video3DGenResearch/comfyui-batch-input-node", + "files": [ + "https://github.com/Video3DGenResearch/comfyui-batch-input-node" + ], + "install_type": "git-clone", + "description": "Nodes:BatchInputText" + }, + { + "author": "kijai", + "title": "ComfyUI nodes to use DeepSeek-VL", + "reference": "https://github.com/kijai/ComfyUI-DeepSeek-VL", + "files": [ + "https://github.com/kijai/ComfyUI-DeepSeek-VL" + ], + "install_type": "git-clone", + "description": "[a/https://huggingface.co/deepseek-ai](https://huggingface.co/deepseek-ai)" + }, + { + "author": "GentlemanHu", + "title": "ComfyUI-Notifier", + "reference": "https://github.com/GentlemanHu/ComfyUI-Notifier", + "files": [ + "https://github.com/GentlemanHu/ComfyUI-Notifier" + ], + "install_type": "git-clone", + "description": "Nodes:GentlemanHu_Notifier" + }, + { + "author": "nat-chan", + "title": "comfyui-in-memory-transceiver", + "reference": "https://github.com/nat-chan/comfyui-in-memory-transceiver", + "files": [ + "https://github.com/nat-chan/comfyui-in-memory-transceiver" + ], + "install_type": "git-clone", + "description": "Why? When processing a large number of requests, the SaveImage and LoadImage nodes may be IO-limited, and using shared memory improves performance by passing images only through memory access, not through IO." + }, + { + "author": "DrMWeigand", + "title": "ComfyUI_LineBreakInserter", + "reference": "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter", + "files": [ + "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter" + ], + "install_type": "git-clone", + "description": "Nodes:Line Break Inserter" + }, + { + "author": "WilliamStanford", + "title": "visuallabs_comfyui_nodes", + "reference": "https://github.com/WilliamStanford/visuallabs_comfyui_nodes", + "files": [ + "https://github.com/WilliamStanford/visuallabs_comfyui_nodes" + ], + "install_type": "git-clone", + "description": "Nodes:PointStringFromFloatArray" + }, + { + "author": "bruce007lee", + "title": "comfyui-cleaner", + "reference": "https://github.com/bruce007lee/comfyui-cleaner", + "files": [ + "https://github.com/bruce007lee/comfyui-cleaner" + ], + "install_type": "git-clone", + "description": "Nodes:cleaner" + }, + { + "author": "ExponentialML", + "title": "ComfyUI_LiveDirector (WIP)", + "reference": "https://github.com/ExponentialML/ComfyUI_LiveDirector", + "files": [ + "https://github.com/ExponentialML/ComfyUI_LiveDirector" + ], + "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", + "reference": "https://github.com/hy134300/comfyui-hb-node", + "files": [ + "https://github.com/hy134300/comfyui-hb-node" + ], + "install_type": "git-clone", + "description": "Nodes:sound voice, text concat, latent to list, movie generate, movie batch, hy save image, generate story" + }, + { + "author": "gameltb", + "title": "io_comfyui", + "reference": "https://github.com/gameltb/io_comfyui", + "files": [ + "https://github.com/gameltb/io_comfyui" + ], + "install_type": "git-clone", + "description": "Let Blender work with ComfyUI by ComfyScript. This addon is still in development." + }, + { + "author": "ALatentPlace", + "title": "YANC- Yet Another Node Collection", + "reference": "https://github.com/ALatentPlace/ComfyUI_yanc", + "files": [ + "https://github.com/ALatentPlace/ComfyUI_yanc" + ], + "install_type": "git-clone", + "description": "This is another node collection for ComfyUI. It includes some basic nodes that I find useful, and I've also created them to meet my personal needs." + }, + { + "author": "Jiffies-64", + "title": "ComfyUI-SaveImagePlus", + "reference": "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus", + "files": [ + "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus" + ], + "install_type": "git-clone", + "description": "Nodes:SaveImagePlus" + }, + { + "author": "kadirnar", + "title": "ComfyUI-Adapter [WIP]", + "reference": "https://github.com/kadirnar/ComfyUI-Adapter", + "files": [ + "https://github.com/kadirnar/ComfyUI-Adapter" + ], + "install_type": "git-clone", + "description": "WIP" + }, + { + "author": "Beinsezii", + "title": "comfyui-amd-go-fast", + "reference": "https://github.com/Beinsezii/comfyui-amd-go-fast", + "files": [ + "https://github.com/Beinsezii/comfyui-amd-go-fast" + ], + "install_type": "git-clone", + "description": "This contains all-in-one 'principled' nodes for T2I, I2I, refining, and scaling. Additionally it has many tools for directly manipulating the color of latents, high res fix math, and scripted image post-processing." + }, + { + "author": "sugarkwork", + "title": "comfyui_psd [WIP]", + "reference": "https://github.com/sugarkwork/comfyui_psd", + "files": [ + "https://github.com/sugarkwork/comfyui_psd" + ], + "install_type": "git-clone", + "description": "Not working yet." + }, + { + "author": "SadaleNet", + "title": "ComfyUI Port for Google's Prompt-to-Prompt", + "reference": "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt", + "files": [ + "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt" + ], + "install_type": "git-clone", + "description": "This is a PoC port of [a/Google's Prompt-to-Prompt](https://github.com/google/prompt-to-prompt/) to ComfyUI. It isn't feature complete. But it's good enough for evaluating if prompt-to-prompt is of any good." + }, + { + "author": "MushroomFleet", + "title": "DJZ-Nodes", + "reference": "https://github.com/MushroomFleet/DJZ-Nodes", + "files": [ + "https://github.com/MushroomFleet/DJZ-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Aspect Size. Drift Johnsons Custom nodes for ComfyUI" + }, + { + "author": "stavsap", + "title": "ComfyUI Ollama [WIP]", + "reference": "https://github.com/stavsap/ComfyUI-React-SDK", + "files": [ + "https://github.com/stavsap/ComfyUI-React-SDK" + ], + "install_type": "git-clone", + "description": "This project is for building React application as an overlay upon ComfyUI.\nProviding and ability to provide desired UI with ComfyUI API and workflows.\nInspired by: [a/https://github.com/cubiq/Comfy_Dungeon](https://github.com/cubiq/Comfy_Dungeon)" + }, + { + "author": "chaojie", + "title": "ComfyUI DynamiCrafter", + "reference": "https://github.com/chaojie/ComfyUI-DynamiCrafter", + "files": [ + "https://github.com/chaojie/ComfyUI-DynamiCrafter" + ], + "install_type": "git-clone", + "description": "ComfyUI [a/DynamiCrafter](https://github.com/Doubiiu/DynamiCrafter)" + }, + { + "author": "cubiq", + "title": "Comfy Dungeon [WIP]", + "reference": "https://github.com/cubiq/Comfy_Dungeon", + "files": [ + "https://github.com/cubiq/Comfy_Dungeon" + ], + "install_type": "git-clone", + "description": "Build D&D Character Portraits with ComfyUI.\nIMPORTANT: At the moment this is mostly a tech demo to show how to build a web app on top of ComfyUI. The code is very messy and the application doesn't guaratee consistent results." + }, + { + "author": "dfl", + "title": "comfyui-stylegan", + "reference": "https://github.com/dfl/comfyui-stylegan", + "files": [ + "https://github.com/dfl/comfyui-stylegan" + ], + "install_type": "git-clone", + "description": "Generator for StyleGAN 3" + }, + { + "author": "A719689614", + "title": "ComfyUI_AC_FUNV8Beta1", + "reference": "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1", + "files": [ + "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1" + ], + "install_type": "git-clone", + "description": "Nodes:AC_Super_Controlnet/Checkpoint/Loras/Lora&LCM/KSampler/UpKSampler/SaveImage/PreviewImage/CKPT&LCM/CLIPEN/EmptLatent, AC_FUN_SUPER_LARGE, AC_Super_Come_Ckpt, AC_Super_Come_Lora" + }, + { + "author": "houdinii", + "title": "comfy-magick [WIP]", + "reference": "https://github.com/houdinii/comfy-magick", + "files": [ + "https://github.com/houdinii/comfy-magick" + ], + "install_type": "git-clone", + "description": "This is a way to implement ImageMagick functionality in ComfyUI, which is generally PIL (pillow) based. I'm not sure the best way to handle this, as batch images make it a lot more complex, but the general idea will be two nodes to translate the IMAGE type, a torch.tensor of shape [batch, height, width, channels], or [1, 600, 800, 3] for a single 800x600 image, into/from a wand Image object." + }, + { + "author": "tjorbogarden", + "title": "my-useful-comfyui-custom-nodes", + "reference": "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes", + "files": [ + "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:My-Image Sizer, KSamplerSDXLAdvanced." + }, + { + "author": "DeTK", + "title": "ComfyUI Node Switcher", + "reference": "https://github.com/DeTK/ComfyUI-Switch", + "files": [ + "https://github.com/DeTK/ComfyUI-Switch" + ], + "install_type": "git-clone", + "description": "Nodes:NodeSwitch." + }, + { + "author": "GrindHouse66", + "title": "GH Tools for ComfyUI", + "reference": "https://github.com/GrindHouse66/ComfyUI-GH_Tools", + "files": [ + "https://github.com/GrindHouse66/ComfyUI-GH_Tools" + ], + "install_type": "git-clone", + "description": "Nodes:GH Tools Image Sizer, GH Tools Simple Scale. Simple quality of life Tools for ComfyUI. Basically, If it makes my life easier, it will be here. The list will grow over time." + }, + { + "author": "sdfxai", + "title": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration", + "reference": "https://github.com/sdfxai/SDFXBridgeForComfyUI", + "files": [ + "https://github.com/sdfxai/SDFXBridgeForComfyUI" + ], + "install_type": "git-clone", + "description": "SDFXBridgeForComfyUI is a custom node designed for seamless integration between ComfyUI and the SDFX solution. This custom node allows users to make ComfyUI compatible with SDFX when running the ComfyUI instance on their local machines." + }, + { + "author": "Beinsezii", + "title": "comfyui-amd-go-fast", + "reference": "https://github.com/Beinsezii/comfyui-amd-go-fast", + "files": [ + "https://github.com/Beinsezii/comfyui-amd-go-fast" + ], + "install_type": "git-clone", + "description": "See details: [a/link](https://github.com/Beinsezii/comfyui-amd-go-fast?tab=readme-ov-file)" + }, + { + "author": "SeedV", + "title": "ComfyUI-SeedV-Nodes [UNSAFE]", + "reference": "https://github.com/SeedV/ComfyUI-SeedV-Nodes", + "files": [ + "https://github.com/SeedV/ComfyUI-SeedV-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Script.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]" + }, + { + "author": "mut-ex", + "title": "ComfyUI GLIGEN GUI Node", + "reference": "https://github.com/mut-ex/comfyui-gligengui-node", + "files": [ + "https://github.com/mut-ex/comfyui-gligengui-node" + ], + "install_type": "git-clone", + "description": "This is a simple, straightforward ComfyUI node to be used along with the [a/GLIGEN GUI](https://github.com/mut-ex/gligen-gui) I developed.\nNOTE:[a/Make sure you have the GLIGEN GUI up and running](https://github.com/mut-ex/gligen-gui/tree/main)" + }, + { + "author": "unanan", + "title": "ComfyUI-Dist [WIP]", + "reference": "https://github.com/unanan/ComfyUI-Dist", + "files": [ + "https://github.com/unanan/ComfyUI-Dist" + ], + "install_type": "git-clone", + "description": "For distributed processing ComfyUI workflows within a local area network.\nNot Finished Yet." + }, + { + "author": "NicholasKao1029", + "title": "comfyui-hook", + "reference": "https://github.com/NicholasKao1029/comfyui-hook", + "files": [ + "https://github.com/NicholasKao1029/comfyui-hook" + ], + "install_type": "git-clone", + "description": "This extension provides additional API" + }, + { + "author": "Extraltodeus", + "title": "Conditioning-token-experiments-for-ComfyUI", + "reference": "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI", + "files": [ + "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI" + ], + "install_type": "git-clone", + "description": "I made these nodes for experimenting so it's far from perfect but at least it is entertaining!\nIt uses cosine similarities or smallest euclidean distances to find the closest tokens." + }, + { + "author": "shadowcz007", + "title": "comfyui-llamafile [WIP]", + "reference": "https://github.com/shadowcz007/comfyui-llamafile", + "files": [ + "https://github.com/shadowcz007/comfyui-llamafile" + ], + "install_type": "git-clone", + "description": "This node is an experimental node aimed at exploring the collaborative way of human-machine creation." + }, + { + "author": "gameltb", + "title": "ComfyUI paper playground", + "reference": "https://github.com/gameltb/ComfyUI_paper_playground", + "files": [ + "https://github.com/gameltb/ComfyUI_paper_playground" + ], + "install_type": "git-clone", + "description": "Evaluate some papers in ComfyUI, just playground.\nNOTE: Various models need to be installed, so please visit the repository to check." + }, + { + "author": "huizhang0110", + "title": "ComfyUI_Easy_Nodes_hui", + "reference": "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui", + "files": [ + "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui" + ], + "install_type": "git-clone", + "description": "Nodes:EasyEmptyLatentImage" + }, + { + "author": "tuckerdarby", + "title": "ComfyUI-TDNodes [WIP]", + "reference": "https://github.com/tuckerdarby/ComfyUI-TDNodes", + "files": [ + "https://github.com/tuckerdarby/ComfyUI-TDNodes" + ], + "install_type": "git-clone", + "description": "Nodes:KSampler (RAVE), KSampler (TF), Object Tracker, KSampler Batched, Video Tracker Prompt, TemporalNet Preprocessor, Instance Tracker Prompt, Instance Diffusion Loader, Hand Tracker Node" + }, + { + "author": "shadowcz007", + "title": "comfyui-musicgen", + "reference": "https://github.com/shadowcz007/comfyui-musicgen", + "files": [ + "https://github.com/shadowcz007/comfyui-musicgen" + ], + "install_type": "git-clone", + "description": "Nodes:Musicgen" + }, + { + "author": "shadowcz007", + "title": "comfyui-CLIPSeg", + "reference": "https://github.com/shadowcz007/comfyui-CLIPSeg", + "files": [ + "https://github.com/shadowcz007/comfyui-CLIPSeg" + ], + "install_type": "git-clone", + "description": "Download [a/CLIPSeg](https://huggingface.co/CIDAS/clipseg-rd64-refined/tree/main), move to : models/clipseg" + }, + { + "author": "stutya", + "title": "ComfyUI-Terminal [UNSAFE]", + "reference": "https://github.com/stutya/ComfyUI-Terminal", + "files": [ + "https://github.com/stutya/ComfyUI-Terminal" + ], + "install_type": "git-clone", + "description": "Run Terminal Commands from ComfyUI.\n[w/This extension poses a risk of executing arbitrary commands through workflow execution. Please be cautious.]" + }, + { + "author": "marcueberall", + "title": "ComfyUI-BuildPath", + "reference": "https://github.com/marcueberall/ComfyUI-BuildPath", + "files": [ + "https://github.com/marcueberall/ComfyUI-BuildPath" + ], + "install_type": "git-clone", + "description": "Nodes: Build Path Adv." + }, + { + "author": "LotzF", + "title": "ComfyUI simple ChatGPT completion [UNSAFE]", + "reference": "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion", + "files": [ + "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion" + ], + "install_type": "git-clone", + "description": "A simple node to request ChatGPT completions. [w/Do not share your workflows including the API key! I'll take no responsibility for your leaked keys.]" + }, + { + "author": "kappa54m", + "title": "ComfyUI_Usability (WIP)", + "reference": "https://github.com/kappa54m/ComfyUI_Usability", + "files": [ + "https://github.com/kappa54m/ComfyUI_Usability" + ], + "install_type": "git-clone", + "description": "Nodes: Load Image Dedup, Load Image By Path." + }, + { + "author": "17Retoucher", + "title": "ComfyUI_Fooocus", + "reference": "https://github.com/17Retoucher/ComfyUI_Fooocus", + "files": [ + "https://github.com/17Retoucher/ComfyUI_Fooocus" + ], + "install_type": "git-clone", + "description": "Custom nodes that help reproduce image generation in Fooocus." + }, + { + "author": "nkchocoai", + "title": "ComfyUI-PromptUtilities", + "reference": "https://github.com/nkchocoai/ComfyUI-PromptUtilities", + "files": [ + "https://github.com/nkchocoai/ComfyUI-PromptUtilities" + ], + "install_type": "git-clone", + "description": "Nodes: Format String, Join String List, Load Preset, Load Preset (Advanced), Const String, Const String (multi line). Add useful nodes related to prompt." + }, + { + "author": "BadCafeCode", + "title": "execution-inversion-demo-comfyui", + "reference": "https://github.com/BadCafeCode/execution-inversion-demo-comfyui", + "files": [ + "https://github.com/BadCafeCode/execution-inversion-demo-comfyui" + ], + "install_type": "git-clone", + "description": "execution-inversion-demo-comfyui" + }, + { + "author": "unanan", + "title": "ComfyUI-clip-interrogator [WIP]", + "reference": "https://github.com/unanan/ComfyUI-clip-interrogator", + "files": [ + "https://github.com/unanan/ComfyUI-clip-interrogator" + ], + "install_type": "git-clone", + "description": "Unofficial ComfyUI extension of clip-interrogator" + }, + { + "author": "prismwastaken", + "title": "prism-tools", + "reference": "https://github.com/prismwastaken/comfyui-tools", + "files": [ + "https://github.com/prismwastaken/comfyui-tools" + ], + "install_type": "git-clone", + "description": "prism-tools" + }, + { + "author": "poisenbery", + "title": "NudeNet-Detector-Provider [WIP]", + "reference": "https://github.com/poisenbery/NudeNet-Detector-Provider", + "files": [ + "https://github.com/poisenbery/NudeNet-Detector-Provider" + ], + "install_type": "git-clone", + "description": "BBOX Detector Provider for NudeNet. Bethesda version of NudeNet V3 detector provider to work with Impact Pack ComfyUI." + }, + { + "author": "LarryJane491", + "title": "ComfyUI-ModelUnloader", + "reference": "https://github.com/LarryJane491/ComfyUI-ModelUnloader", + "files": [ + "https://github.com/LarryJane491/ComfyUI-ModelUnloader" + ], + "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]", + "reference": "https://github.com/MrAdamBlack/CheckProgress", + "files": [ + "https://github.com/MrAdamBlack/CheckProgress" + ], + "install_type": "git-clone", + "description": "I was looking for a node to put in place to ensure my prompt etc where going as expected before the rest of the flow executed. To end the session, I just return the input image as None (see expected error). Recommend using it alongside PreviewImage, then output to the rest of the flow and Save Image." + }, + { + "author": "birnam", + "title": "Gen Data Tester [WIP]", + "reference": "https://github.com/birnam/ComfyUI-GenData-Pack", + "files": [ + "https://github.com/birnam/ComfyUI-GenData-Pack" + ], + "install_type": "git-clone", + "description": "This answers the itch for being able to easily paste [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 ComfyUI(EXP)" + }, + { + "author": "nidefawl", + "title": "ComfyUI-nidefawl [UNSAFE]", + "reference": "https://github.com/nidefawl/ComfyUI-nidefawl", + "files": [ + "https://github.com/nidefawl/ComfyUI-nidefawl" + ], + "install_type": "git-clone", + "description": "Nodes:PythonScript, BlendImagesWithBoundedMasks, CropImagesWithMasks, VAELoaderDataType, ModelSamplerTonemapNoiseTest, gcLatentTunnel, ReferenceOnlySimple, EmptyImageWithColor, MaskFromColor, SetLatentCustomNoise, LatentToImage, ImageToLatent, LatentScaledNoise, DisplayAnyType, SamplerCustomCallback, CustomCallback, SplitCustomSigmas, SamplerDPMPP_2M_SDE_nidefawl, LatentPerlinNoise.
    [w/This node is an unsafe node that includes the capability to execute arbitrary python script.]" + }, + { + "author": "kadirnar", + "title": "comfyui_helpers", + "reference": "https://github.com/kadirnar/comfyui_helpers", + "files": [ + "https://github.com/kadirnar/comfyui_helpers" + ], + "install_type": "git-clone", + "description": "A collection of nodes randomly selected and gathered, related to noise. NOTE: SD-Advanced-Noise, noise_latent_perlinpinpin, comfy-plasma" + }, + { + "author": "foglerek", + "title": "comfyui-cem-tools", + "reference": "https://github.com/foglerek/comfyui-cem-tools", + "files": [ + "https://github.com/foglerek/comfyui-cem-tools" + ], + "install_type": "git-clone", + "description": "Nodes:ProcessImageBatch" + }, + { + "author": "komojini", + "title": "ComfyUI_Prompt_Template_CustomNodes", + "reference": "https://github.com/komojini/ComfyUI_Prompt_Template_CustomNodes", + "files": [ + "https://github.com/komojini/ComfyUI_Prompt_Template_CustomNodes/raw/main/prompt_with_template.py" + ], + "install_type": "copy", + "description": "Nodes:Prompt with Template" + }, + { + "author": "talesofai", + "title": "comfyui-supersave [WIP]", + "reference": "https://github.com/talesofai/comfyui-supersave", + "files": [ + "https://github.com/talesofai/comfyui-supersave" + ], + "install_type": "git-clone", + "description": "WIP" + }, + { + "author": "Sai-ComfyUI", + "title": "ComfyUI-MS-Nodes [WIP]", + "reference": "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes", + "files": [ + "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes" + ], + "install_type": "git-clone", + "description": "WIP" + }, + { + "author": "eigenpunk", + "title": "ComfyUI-audio", + "reference": "https://github.com/eigenpunk/ComfyUI-audio", + "files": [ + "https://github.com/eigenpunk/ComfyUI-audio" + ], + "install_type": "git-clone", + "description": "generative audio tools for ComfyUI. highly experimental-expect things to break." + }, + { + "author": "Jaxkr", + "title": "comfyui-terminal-command [UNSAFE]", + "reference": "https://github.com/Jaxkr/comfyui-terminal-command", + "files": [ + "https://github.com/Jaxkr/comfyui-terminal-command" + ], + "install_type": "git-clone", + "description": "Nodes: Run Terminal Command. [w/This node is an unsafe node that includes the capability to execute terminal commands.]" + }, + { + "author": "BlueDangerX", + "title": "ComfyUI-BDXNodes [WIP]", + "reference": "https://github.com/BlueDangerX/ComfyUI-BDXNodes", + "files": [ + "https://github.com/BlueDangerX/ComfyUI-BDXNodes" + ], + "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]", + "reference": "https://github.com/IvanZhd/comfyui-codeformer", + "files": [ + "https://github.com/IvanZhd/comfyui-codeformer" + ], + "install_type": "git-clone", + "description": "Nodes:Image Inverter" + }, + { + "author": "alt-key-project", + "title": "Dream Project Video Batches [WIP]", + "reference": "https://github.com/alt-key-project/comfyui-dream-video-batches", + "files": [ + "https://github.com/alt-key-project/comfyui-dream-video-batches" + ], + "install_type": "git-clone", + "description": "NOTE: This is currently work in progress. Expect nodes to break (or be broken) until 1.0 release." + }, + { + "author": "oyvindg", + "title": "ComfyUI-TrollSuite", + "reference": "https://github.com/oyvindg/ComfyUI-TrollSuite", + "files": [ + "https://github.com/oyvindg/ComfyUI-TrollSuite" + ], + "install_type": "git-clone", + "description": "Nodes: BinaryImageMask, ImagePadding, LoadLastCreatedImage, RandomMask, TransparentImage." + }, + { + "author": "romeobuilderotti", + "title": "ComfyUI-EZ-Pipes", + "reference": "https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes", + "files": [ + "https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes" + ], + "install_type": "git-clone", + "description": "ComfyUI-EZ-Pipes is a set of custom pipe nodes for ComfyUI. It provides a set of Input/Edit/Output nodes for each pipe type." + }, + { + "author": "wormley", + "title": "comfyui-wormley-nodes", + "reference": "https://github.com/wormley/comfyui-wormley-nodes", + "files": [ + "https://github.com/wormley/comfyui-wormley-nodes" + ], + "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", + "reference": "https://github.com/Brandelan/ComfyUI_bd_customNodes", + "files": [ + "https://github.com/Brandelan/ComfyUI_bd_customNodes" + ], + "install_type": "git-clone", + "description": "Nodes: BD Random Range, BD Settings, BD Sequencer." + }, + { + "author": "Jordach", + "title": "comfy-consistency-vae", + "reference": "https://github.com/Jordach/comfy-consistency-vae", + "files": [ + "https://github.com/Jordach/comfy-consistency-vae" + ], + "install_type": "git-clone", + "description": "Nodes: Comfy_ConsistencyVAE" + }, + { + "author": "gameltb", + "title": "ComfyUI_stable_fast", + "reference": "https://github.com/gameltb/ComfyUI_stable_fast", + "files": [ + "https://github.com/gameltb/ComfyUI_stable_fast" + ], + "install_type": "git-clone", + "description": "Nodes:ApplyStableFastUnet. Experimental usage of stable-fast." + }, + { + "author": "jn-jairo", + "title": "jn_node_suite_comfyui [WIP]", + "reference": "https://github.com/jn-jairo/jn_node_suite_comfyui", + "files": [ + "https://github.com/jn-jairo/jn_node_suite_comfyui" + ], + "install_type": "git-clone", + "description": "Image manipulation nodes, Temperature control nodes, Tiling nodes, Primitive and operation nodes, ..." + }, + { + "author": "PluMaZero", + "title": "ComfyUI-SpaceFlower", + "reference": "https://github.com/PluMaZero/ComfyUI-SpaceFlower", + "files": [ + "https://github.com/PluMaZero/ComfyUI-SpaceFlower" + ], + "install_type": "git-clone", + "description": "Nodes: SpaceFlower_Prompt, SpaceFlower_HangulPrompt, ..." + }, + { + "author": "laksjdjf", + "title": "ssd-1b-comfyui", + "reference": "https://github.com/laksjdjf/ssd-1b-comfyui", + "files": [ + "https://github.com/laksjdjf/ssd-1b-comfyui" + ], + "install_type": "git-clone", + "description": "Experimental node for SSD-1B. This node is not need for latest comfyui." + }, + { + "author": "flowtyone", + "title": "comfyui-flowty-lcm", + "reference": "https://github.com/flowtyone/comfyui-flowty-lcm", + "files": [ + "https://github.com/flowtyone/comfyui-flowty-lcm" + ], + "install_type": "git-clone", + "description": "This is a comfyui early testing node for LCM, adapted from [a/https://github.com/0xbitches/sd-webui-lcm](https://github.com/0xbitches/sd-webui-lcm). It uses the diffusers backend unfortunately and not comfy's model loading mechanism. But the intention here is just to be able to execute lcm inside comfy.\nNOTE: 0xbitches's 'Latent Consistency Model for ComfyUI' is original implementation." + }, + { + "author": "doucx", + "title": "ComfyUI_WcpD_Utility_Kit", + "reference": "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit", + "files": [ + "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit" + ], + "install_type": "git-clone", + "description": "Nodes: MergeStrings, ExecStrAsCode, RandnLatentImage. [w/NOTE: This extension includes the ability to execute code as a string in nodes. Be cautious during installation, as it can pose a security risk.]" + }, + { + "author": "WSJUSA", + "title": "pre-comfyui-stablsr", + "reference": "https://github.com/WSJUSA/Comfyui-StableSR", + "files": [ + "https://github.com/WSJUSA/Comfyui-StableSR" + ], + "install_type": "git-clone", + "description": "This is a development respository for debugging migration of StableSR to Comfyui" + }, + { + "author": "Dr.Lt.Data", + "title": "ComfyUI-Workflow-Component [WIP]", + "reference": "https://github.com/ltdrdata/ComfyUI-Workflow-Component", + "files": [ + "https://github.com/ltdrdata/ComfyUI-Workflow-Component" + ], + "install_type": "git-clone", + "description": "This extension provides the capability to use ComfyUI Workflow as a component and the ability to use the Image Refiner functionality based on components. NOTE: This is an experimental extension feature with no consideration for backward compatibility and can be highly unstable." + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/dev/extension-node-map.json new file mode 100644 index 000000000..b6f2a587d --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/dev/extension-node-map.json @@ -0,0 +1,2119 @@ +{ + "https://github.com/17Retoucher/ComfyUI_Fooocus": [ + [ + "BasicScheduler", + "CLIPLoader", + "CLIPMergeSimple", + "CLIPSave", + "CLIPSetLastLayer", + "CLIPTextEncode", + "CLIPTextEncodeSDXL", + "CLIPTextEncodeSDXLRefiner", + "CLIPVisionEncode", + "CLIPVisionLoader", + "Canny", + "CheckpointLoader", + "CheckpointLoaderSimple", + "CheckpointSave", + "ConditioningAverage", + "ConditioningCombine", + "ConditioningConcat", + "ConditioningSetArea", + "ConditioningSetAreaPercentage", + "ConditioningSetMask", + "ConditioningSetTimestepRange", + "ConditioningZeroOut", + "ControlNetApply", + "ControlNetApplyAdvanced", + "ControlNetLoader", + "CropMask", + "DiffControlNetLoader", + "DiffusersLoader", + "DualCLIPLoader", + "EmptyImage", + "EmptyLatentImage", + "ExponentialScheduler", + "FeatherMask", + "FlipSigmas", + "Fooocus Controlnet", + "Fooocus Hirefix", + "Fooocus KSampler", + "Fooocus Loader", + "Fooocus LoraStack", + "Fooocus PreKSampler", + "Fooocus negative", + "Fooocus positive", + "Fooocus stylesSelector", + "FreeU", + "FreeU_V2", + "GLIGENLoader", + "GLIGENTextBoxApply", + "GrowMask", + "HyperTile", + "HypernetworkLoader", + "ImageBatch", + "ImageBlend", + "ImageBlur", + "ImageColorToMask", + "ImageCompositeMasked", + "ImageCrop", + "ImageInvert", + "ImageOnlyCheckpointLoader", + "ImagePadForOutpaint", + "ImageQuantize", + "ImageScale", + "ImageScaleBy", + "ImageScaleToTotalPixels", + "ImageSharpen", + "ImageToMask", + "ImageUpscaleWithModel", + "InvertMask", + "JoinImageWithAlpha", + "KSampler", + "KSamplerAdvanced", + "KSamplerSelect", + "KarrasScheduler", + "LatentAdd", + "LatentBatch", + "LatentBlend", + "LatentComposite", + "LatentCompositeMasked", + "LatentCrop", + "LatentFlip", + "LatentFromBatch", + "LatentInterpolate", + "LatentMultiply", + "LatentRotate", + "LatentSubtract", + "LatentUpscale", + "LatentUpscaleBy", + "LoadImage", + "LoadImageMask", + "LoadLatent", + "LoraLoader", + "LoraLoaderModelOnly", + "MaskComposite", + "MaskToImage", + "ModelMergeAdd", + "ModelMergeBlocks", + "ModelMergeSimple", + "ModelMergeSubtract", + "ModelSamplingContinuousEDM", + "ModelSamplingDiscrete", + "PatchModelAddDownscale", + "PerpNeg", + "PolyexponentialScheduler", + "PorterDuffImageComposite", + "PreviewImage", + "RebatchImages", + "RebatchLatents", + "RepeatImageBatch", + "RepeatLatentBatch", + "RescaleCFG", + "SDTurboScheduler", + "SVD_img2vid_Conditioning", + "SamplerCustom", + "SamplerDPMPP_2M_SDE", + "SamplerDPMPP_SDE", + "SaveAnimatedPNG", + "SaveAnimatedWEBP", + "SaveImage", + "SaveLatent", + "SelfAttentionGuidance", + "SetLatentNoiseMask", + "SolidMask", + "SplitImageWithAlpha", + "SplitSigmas", + "StableZero123_Conditioning", + "StyleModelApply", + "StyleModelLoader", + "TomePatchModel", + "UNETLoader", + "UpscaleModelLoader", + "VAEDecode", + "VAEDecodeTiled", + "VAEEncode", + "VAEEncodeForInpaint", + "VAEEncodeTiled", + "VAELoader", + "VAESave", + "VPScheduler", + "VideoLinearCFGGuidance", + "unCLIPCheckpointLoader", + "unCLIPConditioning" + ], + { + "title_aux": "ComfyUI_Fooocus" + } + ], + "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": [ + [ + "\u2b1b(TODO)AC_Super_Come_Ckpt", + "\u2b1c(TODO)AC_Super_Come_Lora", + "\u2b55AC_FUN_SUPER_LARGE", + "\ud83c\ude35AC_Super_Checkpoint", + "\ud83c\ude35AC_Super_Loras", + "\ud83c\udfabAC_Super_PreviewImage", + "\ud83c\udfb0AC_Super_Controlnet", + "\ud83d\udcb6AC_Super_EmptLatent", + "\ud83d\udcbcAC_Super_Lora&LCM", + "\ud83d\udcbeAC_Super_SaveImage", + "\ud83d\udcc4AC_Super_CLIPEN", + "\ud83d\udcc8AC_Super_UpKSampler", + "\ud83d\udcdfAC_Super_CKPT&LCM", + "\ud83d\ude80AC_Super_KSampler" + ], + { + "title_aux": "ComfyUI_AC_FUNV8Beta1" + } + ], + "https://github.com/ALatentPlace/ComfyUI_yanc": [ + [ + "> Clear Text", + "> Float to Int", + "> Get Mean Color", + "> Int", + "> Int to Text", + "> Light Source Mask", + "> Load Image", + "> Load Image From Folder", + "> Mask Curves", + "> NIKSampler", + "> Noise From Image", + "> Normal Map Lighting", + "> RGB Color", + "> Resolution by Aspect Ratio", + "> Rotate Image", + "> Save Image", + "> Scale Image to Side", + "> Text", + "> Text Combine", + "> Text Pick Random Line", + "> Text Random Weights", + "> Text Replace" + ], + { + "title_aux": "YANC- Yet Another Node Collection" + } + ], + "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes": [ + [ + "Add Human Styler", + "Save Log Info" + ], + { + "title_aux": "ComfyUI-Xorbis-nodes" + } + ], + "https://github.com/BadCafeCode/execution-inversion-demo-comfyui": [ + [ + "AccumulateNode", + "AccumulationGetItemNode", + "AccumulationGetLengthNode", + "AccumulationHeadNode", + "AccumulationSetItemNode", + "AccumulationTailNode", + "AccumulationToListNode", + "BoolOperationNode", + "ComponentInput", + "ComponentMetadata", + "ComponentOutput", + "DebugPrint", + "ExecutionBlocker", + "FloatConditions", + "ForLoopClose", + "ForLoopOpen", + "IntConditions", + "IntMathOperation", + "InversionDemoAdvancedPromptNode", + "InversionDemoFakeAdvancedPromptNode", + "InversionDemoLazyConditional", + "InversionDemoLazyIndexSwitch", + "InversionDemoLazyMixImages", + "InversionDemoLazySwitch", + "ListToAccumulationNode", + "MakeListNode", + "StringConditions", + "ToBoolNode", + "WhileLoopClose", + "WhileLoopOpen" + ], + { + "title_aux": "execution-inversion-demo-comfyui" + } + ], + "https://github.com/BlueDangerX/ComfyUI-BDXNodes": [ + [ + "BDXTestInt", + "ColorMatch", + "ColorToMask", + "ConditioningMultiCombine", + "ConditioningSetMaskAndCombine", + "ConditioningSetMaskAndCombine3", + "ConditioningSetMaskAndCombine4", + "ConditioningSetMaskAndCombine5", + "CreateAudioMask", + "CreateFadeMask", + "CreateFluidMask", + "CreateGradientMask", + "CreateTextMask", + "CrossFadeImages", + "EmptyLatentImagePresets", + "GrowMaskWithBlur", + "SomethingToString", + "VRAM_Debug" + ], + { + "author": "BlueDangerX", + "title": "BDXNodes", + "title_aux": "ComfyUI-BDXNodes [WIP]" + } + ], + "https://github.com/Brandelan/ComfyUI_bd_customNodes": [ + [ + "BD Random Range", + "BD Random Settings", + "BD Sequencer", + "BD Settings" + ], + { + "title_aux": "ComfyUI_bd_customNodes" + } + ], + "https://github.com/DeTK/ComfyUI-Switch": [ + [ + "NodeSwitch" + ], + { + "title_aux": "ComfyUI Node Switcher" + } + ], + "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": [ + [ + "LineBreakInserter" + ], + { + "title_aux": "ComfyUI_LineBreakInserter" + } + ], + "https://github.com/Elawphant/ComfyUI-MusicGen": [ + [ + "AudioLoader", + "MusicGen" + ], + { + "title_aux": "ComfyUI-MusicGen [WIP]" + } + ], + "https://github.com/ExponentialML/ComfyUI_LiveDirector": [ + [ + "LiveDirector" + ], + { + "title_aux": "ComfyUI_LiveDirector (WIP)" + } + ], + "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": [ + [ + "Automatic wildcards", + "Conditioning (Cosine similarities)", + "Conditioning (Maximum absolute)", + "Conditioning (Maximum absolute) text inputs", + "Conditioning (Scale by absolute sum)", + "Conditioning merge clip g/l", + "Conditioning similar tokens recombine", + "Conditioning to text", + "Quick and dirty text encode", + "encode_all_tokens_SDXL" + ], + { + "title_aux": "Conditioning-token-experiments-for-ComfyUI" + } + ], + "https://github.com/GentlemanHu/ComfyUI-Notifier": [ + [ + "GentlemanHu_Notifier" + ], + { + "title_aux": "ComfyUI-Notifier" + } + ], + "https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": [ + [ + "GR Checkered Board", + "GR Flip Tile Random Inverted", + "GR Flip Tile Random Red Ring", + "GR Image Details Displayer", + "GR Image Details Saver", + "GR Image Resize", + "GR Image Resize Methods", + "GR Image Size", + "GR Image/Depth Mask", + "GR Mask Create", + "GR Mask Create Random", + "GR Mask Resize", + "GR Multi Mask Create", + "GR Onomatopoeia", + "GR Prompt Selector", + "GR Prompt Selector Multi", + "GR Stack Image", + "GR Text Overlay", + "GR Tile and Border Image", + "GR Tile and Border Image Random Flip" + ], + { + "title_aux": "ComfyUI-GR" + } + ], + "https://github.com/GrindHouse66/ComfyUI-GH_Tools": [ + [ + "GHImg_Sizer", + "GHSimple_Scale" + ], + { + "title_aux": "GH Tools for ComfyUI" + } + ], + "https://github.com/IvanZhd/comfyui-codeformer": [ + [ + "RedBeanie_CustomImageInverter" + ], + { + "title_aux": "comfyui-codeformer [WIP]" + } + ], + "https://github.com/Jaxkr/comfyui-terminal-command": [ + [ + "Terminal" + ], + { + "title_aux": "comfyui-terminal-command [UNSAFE]" + } + ], + "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": [ + [ + "SaveImagePlus" + ], + { + "title_aux": "ComfyUI-SaveImagePlus" + } + ], + "https://github.com/Jordach/comfy-consistency-vae": [ + [ + "Comfy_ConsistencyVAE" + ], + { + "title_aux": "comfy-consistency-vae" + } + ], + "https://github.com/LZpenguin/ComfyUI-Text": [ + [ + "Add_text_by_mask" + ], + { + "title_aux": "ComfyUI-Text" + } + ], + "https://github.com/LarryJane491/ComfyUI-ModelUnloader": [ + [ + "Model Unloader" + ], + { + "title_aux": "ComfyUI-ModelUnloader" + } + ], + "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": [ + [ + "ChatGPTCompletion" + ], + { + "title_aux": "ComfyUI simple ChatGPT completion [UNSAFE]" + } + ], + "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": [ + [ + "AIO_Preprocessor", + "AnimalPosePreprocessor", + "AnimeFace_SemSegPreprocessor", + "AnimeLineArtPreprocessor", + "BAE-NormalMapPreprocessor", + "BinaryPreprocessor", + "CannyEdgePreprocessor", + "ColorPreprocessor", + "DWPreprocessor", + "DensePosePreprocessor", + "DepthAnythingPreprocessor", + "DiffusionEdge_Preprocessor", + "FacialPartColoringFromPoseKps", + "FakeScribblePreprocessor", + "HEDPreprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "ImageIntensityDetector", + "ImageLuminanceDetector", + "InpaintPreprocessor", + "LayeredDiffusionApply", + "LayeredDiffusionCondApply", + "LayeredDiffusionCondJointApply", + "LayeredDiffusionDecode", + "LayeredDiffusionDecodeRGBA", + "LayeredDiffusionDecodeSplit", + "LayeredDiffusionDiffApply", + "LayeredDiffusionJointApply", + "LeReS-DepthMapPreprocessor", + "LineArtPreprocessor", + "LineartStandardPreprocessor", + "M-LSDPreprocessor", + "Manga2Anime_LineArt_Preprocessor", + "MaskOptFlow", + "MediaPipe-FaceMeshPreprocessor", + "MeshGraphormer-DepthMapPreprocessor", + "MiDaS-DepthMapPreprocessor", + "MiDaS-NormalMapPreprocessor", + "ModelMergeBlockNumber", + "ModelMergeSDXL", + "ModelMergeSDXLDetailedTransformers", + "ModelMergeSDXLTransformers", + "ModelSamplerTonemapNoiseTest", + "OneFormer-ADE20K-SemSegPreprocessor", + "OneFormer-COCO-SemSegPreprocessor", + "OpenposePreprocessor", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "PromptExpansion", + "ReferenceOnlySimple", + "RescaleClassifierFreeGuidanceTest", + "SAMPreprocessor", + "SavePoseKpsAsJsonFile", + "ScribblePreprocessor", + "Scribble_XDoG_Preprocessor", + "SemSegPreprocessor", + "ShufflePreprocessor", + "TEEDPreprocessor", + "TilePreprocessor", + "TonemapNoiseWithRescaleCFG", + "UniFormer-SemSegPreprocessor", + "Unimatch_OptFlowPreprocessor", + "Zoe-DepthMapPreprocessor", + "Zoe_DepthAnythingPreprocessor" + ], + { + "author": "tstandley", + "title_aux": "ComfyUI Nodes for Inference.Core" + } + ], + "https://github.com/MrAdamBlack/CheckProgress": [ + [ + "CHECK_PROGRESS" + ], + { + "title_aux": "CheckProgress [WIP]" + } + ], + "https://github.com/MushroomFleet/DJZ-Nodes": [ + [ + "AspectSize" + ], + { + "title_aux": "DJZ-Nodes" + } + ], + "https://github.com/NeuralNotW0rk/ComfyUI-Waveform-Extensions/raw/main/EXT_VariationUtils.py": [ + [ + "BatchToList", + "ConcatAudioList", + "SequenceVariation", + "SliceAudio" + ], + { + "title_aux": "ComfyUI-Waveform-Extensions" + } + ], + "https://github.com/NitramDom/ComfyUI_FacialFlip": [ + [ + "Swapper" + ], + { + "title_aux": "ComfyUI_FacialFlip" + } + ], + "https://github.com/PluMaZero/ComfyUI-SpaceFlower": [ + [ + "SpaceFlower_HangulPrompt", + "SpaceFlower_Prompt" + ], + { + "title_aux": "ComfyUI-SpaceFlower" + } + ], + "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": [ + [ + "CPPN Generator", + "Color Match", + "Custom Shader", + "Folder Queue Manager", + "Image Blend by Mask (Batch)", + "Image Noise Generator", + "Perlin Noise Generator", + "Random Image Generator", + "Spring Mesh", + "Video Queue Manager" + ], + { + "title_aux": "ComfyUI-QuasimondoNodes [WIP]" + } + ], + "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": [ + [ + "CLIPTextEncodePromptToPrompt", + "KSamplerPromptToPrompt", + "KSamplerPromptToPromptAttentionMapLogger", + "LocalBlendLayerPresetPromptToPrompt" + ], + { + "title_aux": "ComfyUI Port for Google's Prompt-to-Prompt" + } + ], + "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": [ + [ + "FloatMath", + "MS_Boolean", + "MS_Float", + "MS_GenerateSeed", + "MS_NP_Vector3", + "PowerFractalCrossHatchNode", + "PowerFractalNoiseNode", + "VectorMath" + ], + { + "title_aux": "ComfyUI-MS-Nodes [WIP]" + } + ], + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [ + [ + "CombinedDiffusersLoader", + "DiffusersClipLoader", + "DiffusersUNETLoader", + "DiffusersVAELoader" + ], + { + "title_aux": "ComfyUI-DiffusersLoader" + } + ], + "https://github.com/SeedV/ComfyUI-SeedV-Nodes": [ + [ + "CheckpointLoaderSimpleShared //SeedV", + "ControlNetLoaderAdvancedShared", + "LoraLoader //SeedV", + "Script" + ], + { + "title_aux": "ComfyUI-SeedV-Nodes [UNSAFE]" + } + ], + "https://github.com/Shinsplat/ComfyUI-Shinsplat": [ + [ + "Clip Text Encode (Shinsplat)", + "Clip Text Encode SD3 (Shinsplat)", + "Clip Text Encode SDXL (Shinsplat)", + "Clip Text Encode T5 (Shinsplat)", + "Clip Tokens Encode (Shinsplat)", + "Green Box (Shinsplat)", + "Hex To Other (Shinsplat)", + "Lora Loader (Shinsplat)", + "Python (Shinsplat)", + "Python - More Inputs (Shinsplat)", + "String Interpolated (Shinsplat)", + "Sum Wrap (Shinsplat)", + "Test Node (Shinsplat)", + "Text To Tokens (Shinsplat)", + "Variables (Shinsplat)" + ], + { + "author": "Shinsplat", + "description": "", + "nickname": "shinsplat", + "title": "ComfyUI-Shinsplat", + "title_aux": "ComfyUI-Shinsplat [UNSAFE]" + } + ], + "https://github.com/StartHua/Comfyui_CXH_CRM": [ + [ + "CRM" + ], + { + "title_aux": "Comfyui_CXH_CRM" + } + ], + "https://github.com/TSFSean/ComfyUI-TSFNodes": [ + [ + "GyroOSC" + ], + { + "title_aux": "ComfyUI-TSFNodes" + } + ], + "https://github.com/Video3DGenResearch/comfyui-batch-input-node": [ + [ + "BatchImageAndPrompt", + "BatchInputCSV", + "BatchInputText" + ], + { + "title_aux": "ComfyUI Batch Input Node" + } + ], + "https://github.com/WSJUSA/Comfyui-StableSR": [ + [ + "ColorFix", + "StableSRUpscalerPipe" + ], + { + "author": "WSJUSA", + "description": "This module enables StableSR in Comgfyui. Ported work of sd-webui-stablesr. Original work for Auotmaatic1111 version of this module and StableSR credit to LIightChaser and Jianyi Wang.", + "nickname": "StableSR", + "title": "StableSR", + "title_aux": "pre-comfyui-stablsr" + } + ], + "https://github.com/WilliamStanford/visuallabs_comfyui_nodes": [ + [ + "CreateFadeMaskAdvancedVL", + "PointStringFromFloatArray", + "RescaleFloatArray", + "StringFromFloatArray" + ], + { + "title_aux": "visuallabs_comfyui_nodes" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": [ + [ + "AnyTextNode_Zho" + ], + { + "title_aux": "ComfyUI-AnyText [WIP]" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": [ + [ + "PuLID_Zho" + ], + { + "title_aux": "ComfyUI-PuLID-ZHO [WIP]" + } + ], + "https://github.com/alt-key-project/comfyui-dream-video-batches": [ + [ + "Blended Transition [DVB]", + "Calculation [DVB]", + "Create Frame Set [DVB]", + "Divide [DVB]", + "Fade From Black [DVB]", + "Fade To Black [DVB]", + "Float Input [DVB]", + "For Each Done [DVB]", + "For Each Filename [DVB]", + "Frame Set Append [DVB]", + "Frame Set Frame Dimensions Scaled [DVB]", + "Frame Set Index Offset [DVB]", + "Frame Set Merger [DVB]", + "Frame Set Reindex [DVB]", + "Frame Set Repeat [DVB]", + "Frame Set Reverse [DVB]", + "Frame Set Split Beginning [DVB]", + "Frame Set Split End [DVB]", + "Frame Set Splitter [DVB]", + "Generate Inbetween Frames [DVB]", + "Int Input [DVB]", + "Linear Camera Pan [DVB]", + "Linear Camera Roll [DVB]", + "Linear Camera Zoom [DVB]", + "Load Image From Path [DVB]", + "Multiply [DVB]", + "Sine Camera Pan [DVB]", + "Sine Camera Roll [DVB]", + "Sine Camera Zoom [DVB]", + "String Input [DVB]", + "Text Input [DVB]", + "Trace Memory Allocation [DVB]", + "Unwrap Frame Set [DVB]" + ], + { + "title_aux": "Dream Project Video Batches [WIP]" + } + ], + "https://github.com/baicai99/ComfyUI-FrameSkipping": [ + [ + "FrameSelector", + "FrameSkipping", + "FrameTruncating", + "IntOperationsNode", + "MaskFrameSkipping", + "MaskGenerator", + "MaskSelector" + ], + { + "title_aux": "ComfyUI-FrameSkipping" + } + ], + "https://github.com/beyastard/ComfyUI_BeySoft": [ + [ + "BeySoft" + ], + { + "title_aux": "ComfyUI_BeySoft" + } + ], + "https://github.com/birnam/ComfyUI-GenData-Pack": [ + [ + "Checkpoint From String \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint Rerouter \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint Selector Stacker \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint Selector \ud83d\udc69\u200d\ud83d\udcbb", + "Checkpoint to String \ud83d\udc69\u200d\ud83d\udcbb", + "Crop Recombine \ud83d\udc69\u200d\ud83d\udcbb", + "Crop|IP|Inpaint \ud83d\udc69\u200d\ud83d\udcbb", + "Crop|IP|Inpaint|SDXL \ud83d\udc69\u200d\ud83d\udcbb", + "Decode GenData \ud83d\udc69\u200d\ud83d\udcbb", + "Encode GenData \ud83d\udc69\u200d\ud83d\udcbb", + "GenData Stacker \ud83d\udc69\u200d\ud83d\udcbb", + "IPAdapterApply", + "IPAdapterApplyEncoded", + "IPAdapterApplyFaceID", + "IPAdapterBatchEmbeds", + "IPAdapterEncoder", + "IPAdapterLoadEmbeds", + "IPAdapterModelLoader", + "IPAdapterSaveEmbeds", + "IPAdapterTilesMasked", + "InsightFaceLoader", + "LoRA Stack to String \ud83d\udc69\u200d\ud83d\udcbb", + "LoRA Stacker From Prompt \ud83d\udc69\u200d\ud83d\udcbb", + "Load Checkpoints From File \ud83d\udc69\u200d\ud83d\udcbb", + "Load GenData From Dir \ud83d\udc69\u200d\ud83d\udcbb", + "Parse GenData \ud83d\udc69\u200d\ud83d\udcbb", + "PrepImageForClipVision", + "PrepImageForInsightFace", + "Provide GenData \ud83d\udc69\u200d\ud83d\udcbb", + "Save Image From GenData \ud83d\udc69\u200d\ud83d\udcbb", + "VAE From String \ud83d\udc69\u200d\ud83d\udcbb", + "VAE to String \ud83d\udc69\u200d\ud83d\udcbb", + "\u00d7 Product CheckpointXGenDatas \ud83d\udc69\u200d\ud83d\udcbb" + ], + { + "title_aux": "Gen Data Tester [WIP]" + } + ], + "https://github.com/blepping/comfyui_overly_complicated_sampling": [ + [ + "ComposableSampler", + "ComposableStepSampler" + ], + { + "title_aux": "comfyui_overly_complicated_sampling" + } + ], + "https://github.com/bruce007lee/comfyui-cleaner": [ + [ + "cleaner" + ], + { + "title_aux": "comfyui-cleaner" + } + ], + "https://github.com/bruce007lee/comfyui-tiny-utils": [ + [ + "CropImageByMask", + "FaceAlign", + "FaceAlignImageProcess", + "FaceAlignMaskProcess", + "ImageFillColorByMask" + ], + { + "title_aux": "comfyui-tiny-utils" + } + ], + "https://github.com/brycegoh/comfyui-custom-nodes": [ + [ + "CombineTwoImageIntoOne", + "FillMaskedArea", + "MaskAreaComparisonSegment", + "OCRAndMask" + ], + { + "title_aux": "brycegoh/comfyui-custom-nodes" + } + ], + "https://github.com/chaojie/ComfyUI-DynamiCrafter": [ + [ + "DynamiCrafter Simple", + "DynamiCrafterInterp Simple", + "DynamiCrafterInterpLoader", + "DynamiCrafterLoader" + ], + { + "title_aux": "ComfyUI DynamiCrafter" + } + ], + "https://github.com/chaojie/ComfyUI-mobvoi-openapi": [ + [ + "HtmlViewer", + "MobvoiOpenapiMetamanAudio", + "MobvoiOpenapiMetamanText", + "MobvoiOpenapiTts", + "OssUploadAudio", + "OssUploadImage" + ], + { + "title_aux": "ComfyUI-mobvoi-openapi" + } + ], + "https://github.com/christian-byrne/infinite-zoom-parallax-nodes": [ + [ + "Create Parallax Video", + "Layer Shifter for Parallax Outpainting", + "Load Most Recent Image in Folder", + "Load Parallax Frame", + "Load Random Image-Pose Pair", + "Parallax Config", + "Save Parallax Frame", + "Shrink and Pad for Outpainting" + ], + { + "title_aux": "\ud83c\udf0c Infinite Parallax Nodes [WIP]" + } + ], + "https://github.com/christian-byrne/python-interpreter-node": [ + [ + "Exec Python Code Script" + ], + { + "title_aux": "Python Interpreter ComfyUI Node [UNSAFE]" + } + ], + "https://github.com/comfyanonymous/ComfyUI": [ + [ + "AddNoise", + "AlignYourStepsScheduler", + "BasicGuider", + "BasicScheduler", + "CFGGuider", + "CLIPAttentionMultiply", + "CLIPLoader", + "CLIPMergeAdd", + "CLIPMergeSimple", + "CLIPMergeSubtract", + "CLIPSave", + "CLIPSetLastLayer", + "CLIPTextEncode", + "CLIPTextEncodeControlnet", + "CLIPTextEncodeSD3", + "CLIPTextEncodeSDXL", + "CLIPTextEncodeSDXLRefiner", + "CLIPVisionEncode", + "CLIPVisionLoader", + "Canny", + "CheckpointLoader", + "CheckpointLoaderSimple", + "CheckpointSave", + "ConditioningAverage", + "ConditioningCombine", + "ConditioningConcat", + "ConditioningSetArea", + "ConditioningSetAreaPercentage", + "ConditioningSetAreaStrength", + "ConditioningSetMask", + "ConditioningSetTimestepRange", + "ConditioningZeroOut", + "ControlNetApply", + "ControlNetApplyAdvanced", + "ControlNetLoader", + "CropMask", + "DiffControlNetLoader", + "DifferentialDiffusion", + "DiffusersLoader", + "DisableNoise", + "DualCFGGuider", + "DualCLIPLoader", + "EmptyImage", + "EmptyLatentAudio", + "EmptyLatentImage", + "EmptySD3LatentImage", + "ExponentialScheduler", + "FeatherMask", + "FlipSigmas", + "FreeU", + "FreeU_V2", + "GITSScheduler", + "GLIGENLoader", + "GLIGENTextBoxApply", + "GrowMask", + "HyperTile", + "HypernetworkLoader", + "ImageBatch", + "ImageBlend", + "ImageBlur", + "ImageColorToMask", + "ImageCompositeMasked", + "ImageCrop", + "ImageFromBatch", + "ImageInvert", + "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", + "ImagePadForOutpaint", + "ImageQuantize", + "ImageScale", + "ImageScaleBy", + "ImageScaleToTotalPixels", + "ImageSharpen", + "ImageToMask", + "ImageUpscaleWithModel", + "InpaintModelConditioning", + "InstructPixToPixConditioning", + "InvertMask", + "JoinImageWithAlpha", + "KSampler", + "KSamplerAdvanced", + "KSamplerSelect", + "KarrasScheduler", + "LatentAdd", + "LatentBatch", + "LatentBatchSeedBehavior", + "LatentBlend", + "LatentComposite", + "LatentCompositeMasked", + "LatentCrop", + "LatentFlip", + "LatentFromBatch", + "LatentInterpolate", + "LatentMultiply", + "LatentRotate", + "LatentSubtract", + "LatentUpscale", + "LatentUpscaleBy", + "LoadAudio", + "LoadImage", + "LoadImageMask", + "LoadLatent", + "LoraLoader", + "LoraLoaderModelOnly", + "MaskComposite", + "MaskToImage", + "ModelMergeAdd", + "ModelMergeBlocks", + "ModelMergeSD1", + "ModelMergeSD2", + "ModelMergeSD3_2B", + "ModelMergeSDXL", + "ModelMergeSimple", + "ModelMergeSubtract", + "ModelSamplingContinuousEDM", + "ModelSamplingContinuousV", + "ModelSamplingDiscrete", + "ModelSamplingSD3", + "ModelSamplingStableCascade", + "Morphology", + "PatchModelAddDownscale", + "PerpNeg", + "PerpNegGuider", + "PerturbedAttentionGuidance", + "PhotoMakerEncode", + "PhotoMakerLoader", + "PolyexponentialScheduler", + "PorterDuffImageComposite", + "PreviewImage", + "RandomNoise", + "RebatchImages", + "RebatchLatents", + "RepeatImageBatch", + "RepeatLatentBatch", + "RescaleCFG", + "SDTurboScheduler", + "SD_4XUpscale_Conditioning", + "SV3D_Conditioning", + "SVD_img2vid_Conditioning", + "SamplerCustom", + "SamplerCustomAdvanced", + "SamplerDPMAdaptative", + "SamplerDPMPP_2M_SDE", + "SamplerDPMPP_3M_SDE", + "SamplerDPMPP_SDE", + "SamplerEulerAncestral", + "SamplerEulerCFGpp", + "SamplerLCMUpscale", + "SamplerLMS", + "SaveAnimatedPNG", + "SaveAnimatedWEBP", + "SaveAudio", + "SaveImage", + "SaveImageWebsocket", + "SaveLatent", + "SelfAttentionGuidance", + "SetLatentNoiseMask", + "SolidMask", + "SplitImageWithAlpha", + "SplitSigmas", + "SplitSigmasDenoise", + "StableCascade_EmptyLatentImage", + "StableCascade_StageB_Conditioning", + "StableCascade_StageC_VAEEncode", + "StableCascade_SuperResolutionControlnet", + "StableZero123_Conditioning", + "StableZero123_Conditioning_Batched", + "StyleModelApply", + "StyleModelLoader", + "ThresholdMask", + "TomePatchModel", + "TripleCLIPLoader", + "UNETLoader", + "UNetCrossAttentionMultiply", + "UNetSelfAttentionMultiply", + "UNetTemporalAttentionMultiply", + "UpscaleModelLoader", + "VAEDecode", + "VAEDecodeAudio", + "VAEDecodeTiled", + "VAEEncode", + "VAEEncodeAudio", + "VAEEncodeForInpaint", + "VAEEncodeTiled", + "VAELoader", + "VAESave", + "VPScheduler", + "VideoLinearCFGGuidance", + "VideoTriangleCFGGuidance", + "WebcamCapture", + "unCLIPCheckpointLoader", + "unCLIPConditioning" + ], + { + "title_aux": "ComfyUI" + } + ], + "https://github.com/comfypod/ComfyUI-Comflow": [ + [ + "ComflowInputBoolean", + "ComflowInputCheckpoint", + "ComflowInputImage", + "ComflowInputImageAlpha", + "ComflowInputImageBatch", + "ComflowInputLora", + "ComflowInputNumber", + "ComflowInputNumberInt", + "ComflowInputNumberSlider", + "ComflowInputText", + "ComflowInputVid", + "ComflowInputVideo", + "ComflowWebsocketImageInput", + "ComflowWebsocketImageOutput" + ], + { + "description": "", + "nickname": "Comflow", + "title": "comflow", + "title_aux": "ComfyUI-Comflow" + } + ], + "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": [ + [ + "BetterImageDimensions", + "PureRatio", + "SDXLDimensions" + ], + { + "title_aux": "ComfyUI-Better-Dimensions" + } + ], + "https://github.com/dfl/comfyui-stylegan": [ + [ + "StyleGAN Generator", + "StyleGAN ModelLoader" + ], + { + "title_aux": "comfyui-stylegan" + } + ], + "https://github.com/dnl13/ComfyUI-dnl13-seg": [ + [ + "Automatic Segmentation (dnl13)", + "BatchSelector (dnl13)", + "Combine Images By Mask (dnl13)", + "Dinov1 Model Loader (dnl13)", + "Mask with prompt (dnl13)", + "RGB (dnl13)", + "SAM Model Loader (dnl13)" + ], + { + "title_aux": "ComfyUI-dnl13-seg" + } + ], + "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit": [ + [ + "BlackImage", + "CopyImage(Wayland)", + "ExecStrAsCode", + "MergeStrings", + "YamlToPrompt" + ], + { + "title_aux": "ComfyUI_WcpD_Utility_Kit" + } + ], + "https://github.com/eigenpunk/ComfyUI-audio": [ + [ + "ApplyVoiceFixer", + "BatchAudio", + "BlendAudio", + "ClipAudioRegion", + "CombineImageWithAudio", + "ConcatAudio", + "ConvertAudio", + "FilterAudio", + "FlattenAudioBatch", + "HifiGANApply", + "HifiGANLoader", + "HifiGANModelParams", + "InvertAudioPhase", + "LoadAudio", + "MusicgenGenerate", + "MusicgenHFGenerate", + "MusicgenHFLoader", + "MusicgenLoader", + "NormalizeAudio", + "PreviewAudio", + "ResampleAudio", + "SaveAudio", + "SpectrogramImage", + "Tacotron2Generate", + "Tacotron2Loader", + "ToMelSpectrogram", + "TortoiseTTSGenerate", + "TortoiseTTSLoader", + "TrimAudio", + "TrimAudioSamples", + "TrimSilence", + "VALLEXGenerator", + "VALLEXLoader", + "VALLEXVoicePromptFromAudio", + "VALLEXVoicePromptLoader", + "WaveGlowApply", + "WaveGlowLoader" + ], + { + "title_aux": "ComfyUI-audio" + } + ], + "https://github.com/ejektaflex/ComfyUI-Ty": [ + [ + "Lora Block Weight Regex Loader // Ty" + ], + { + "title_aux": "ComfyUI-Ty" + } + ], + "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": [ + [ + "LoadContditioning", + "SaveConditioning" + ], + { + "title_aux": "ComfyUI Nodes: SaveConditioning and LoadConditioning" + } + ], + "https://github.com/ericbeyer/guidance_interval": [ + [ + "Guidance Interval" + ], + { + "title_aux": "guidance_interval" + } + ], + "https://github.com/flowtyone/comfyui-flowty-lcm": [ + [ + "LCMSampler" + ], + { + "title_aux": "comfyui-flowty-lcm" + } + ], + "https://github.com/flyingdogsoftware/gyre_for_comfyui": [ + [ + "BackgroundRemoval", + "GyreIfElse", + "GyreLoopEnd", + "GyreLoopStart" + ], + { + "title_aux": "Gyre for ComfyUI" + } + ], + "https://github.com/foglerek/comfyui-cem-tools": [ + [ + "ProcessImageBatch" + ], + { + "title_aux": "comfyui-cem-tools" + } + ], + "https://github.com/gameltb/ComfyUI_stable_fast": [ + [ + "ApplyStableFastUnet", + "ApplyTensorRTControlNet", + "ApplyTensorRTUnet", + "ApplyTensorRTVaeDecoder" + ], + { + "title_aux": "ComfyUI_stable_fast" + } + ], + "https://github.com/githubYiheng/comfyui_median_filter": [ + [ + "ImageMedianFilter" + ], + { + "title_aux": "comfyui_median_filter" + } + ], + "https://github.com/haofanwang/ComfyUI-InstantStyle": [ + [ + "BaseModelLoader", + "InstantStyleGenerationNode", + "InstantStyleLoader", + "PromptLoader" + ], + { + "title_aux": "ComfyUI-InstantStyle" + } + ], + "https://github.com/horidream/ComfyUI-Horidream": [ + [ + "PassThroughWithSound" + ], + { + "title_aux": "ComfyUI-Horidream" + } + ], + "https://github.com/houdinii/comfy-magick": [ + [ + "AdaptiveBlur", + "AdaptiveSharpen", + "AddNoise", + "BlueShift", + "Blur", + "Charcoal", + "Colorize", + "CropByAspectRatio", + "Despeckle", + "Edge", + "Emboss", + "FX", + "GaussianBlur", + "Implode", + "Kuwahara", + "MotionBlur", + "RotationalBlur", + "SelectiveBlur", + "Sepia", + "Shade", + "Sharpen", + "Sketch", + "Solarize", + "Spread", + "Stereogram", + "Swirl", + "Tint", + "UnsharpMask", + "Vignette", + "WaveletDenoise" + ], + { + "title_aux": "comfy-magick [WIP]" + } + ], + "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": [ + [ + "EasyBgRemover", + "EasyBgRemover_ModelLoader", + "EasyControlNetApply", + "EasyControlNetLoader", + "EasyEmptyLatentImage", + "EasyLatentToCondition", + "EasyLoadImage" + ], + { + "title_aux": "ComfyUI_Easy_Nodes_hui" + } + ], + "https://github.com/hy134300/comfyui-hb-node": [ + [ + "generate story", + "hy save image", + "latent to list", + "movie batch", + "movie generate", + "sound voice", + "text concat" + ], + { + "title_aux": "comfyui-hb-node" + } + ], + "https://github.com/hy134300/comfyui-hydit": [ + [ + "DiffusersClipTextEncode", + "DiffusersModelMakeup", + "DiffusersPipelineLoader", + "DiffusersSampler", + "DiffusersSchedulerLoader" + ], + { + "title_aux": "comfyui-hydit" + } + ], + "https://github.com/ilovejohnwhite/UncleBillyGoncho": [ + [ + "CannyEdgePreprocessor", + "DiffusionEdge_Preprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "LineArtPreprocessor", + "LinkMasterNode", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "SuckerPunch", + "UWU_Preprocessor", + "VooDooNode", + "VooDooNode2" + ], + { + "title_aux": "TatToolkit" + } + ], + "https://github.com/immersiveexperience/ie-comfyui-color-nodes": [ + [ + "Average Color", + "Complementary Color", + "Hex Color to Image", + "Hex to Color Name", + "Random String" + ], + { + "title_aux": "ie-comfyui-color-nodes" + } + ], + "https://github.com/jh-leon-kim/ComfyUI-JHK-utils": [ + [ + "JHK_Utils_ImageRemoveBackground", + "JHK_Utils_LoadEmbed", + "JHK_Utils_string_merge" + ], + { + "title_aux": "ComfyUI-JHK-utils" + } + ], + "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": [ + [ + "utils/TimelineUI" + ], + { + "title_aux": "TimeUi a ComfyUI Timeline Node System [WIP]" + } + ], + "https://github.com/jn-jairo/jn_node_suite_comfyui": [ + [ + "JN_AreaInfo", + "JN_AreaNormalize", + "JN_AreaWidthHeight", + "JN_AreaXY", + "JN_Blip", + "JN_BlipLoader", + "JN_BooleanOperation", + "JN_Condition", + "JN_CoolDown", + "JN_CoolDownOutput", + "JN_CropFace", + "JN_DatetimeFormat", + "JN_DatetimeInfo", + "JN_DatetimeNow", + "JN_Dump", + "JN_DumpOutput", + "JN_FaceRestoreModelLoader", + "JN_FaceRestoreWithModel", + "JN_FirstActive", + "JN_ImageAddMask", + "JN_ImageBatch", + "JN_ImageCenterArea", + "JN_ImageCrop", + "JN_ImageGrid", + "JN_ImageInfo", + "JN_ImageSharpness", + "JN_ImageSquare", + "JN_ImageUncrop", + "JN_KSampler", + "JN_KSamplerAdvancedParams", + "JN_KSamplerFaceRestoreParams", + "JN_KSamplerResizeInputParams", + "JN_KSamplerResizeMaskAreaParams", + "JN_KSamplerResizeOutputParams", + "JN_KSamplerSeamlessParams", + "JN_KSamplerTileParams", + "JN_LoadImageDirectory", + "JN_LogicOperation", + "JN_MaskInfo", + "JN_MathOperation", + "JN_MathOperationArray", + "JN_PrimitiveArrayInfo", + "JN_PrimitiveBatchToArray", + "JN_PrimitiveBoolean", + "JN_PrimitiveFloat", + "JN_PrimitiveInt", + "JN_PrimitivePrompt", + "JN_PrimitiveString", + "JN_PrimitiveStringMultiline", + "JN_PrimitiveStringToArray", + "JN_PrimitiveToArray", + "JN_PrimitiveToBoolean", + "JN_PrimitiveToFloat", + "JN_PrimitiveToInt", + "JN_PrimitiveToString", + "JN_RemoveBackground", + "JN_Seamless", + "JN_SeamlessBorder", + "JN_SeamlessBorderCrop", + "JN_SelectItem", + "JN_Sleep", + "JN_SleepOutput", + "JN_SliceOperation", + "JN_StopIf", + "JN_StopIfOutput", + "JN_TextConcatenation", + "JN_TextReplace", + "JN_TimedeltaFormat", + "JN_TimedeltaInfo", + "JN_VAEPatch" + ], + { + "title_aux": "jn_node_suite_comfyui [WIP]" + } + ], + "https://github.com/jp0215/comfyUI_padding-resize_node/raw/main/PaddingNode.py": [ + [ + "function" + ], + { + "title_aux": "comfyUI_padding-resize_node" + } + ], + "https://github.com/jtscmw01/ComfyUI-DiffBIR": [ + [ + "DiffBIR_sample", + "DiffBIR_sample_advanced", + "Simple_load", + "Stage1_load", + "Stage2_load" + ], + { + "title_aux": "ComfyUI-DiffBIR" + } + ], + "https://github.com/jtydhr88/ComfyUI-Unique3D": [ + [ + "Unique3DLoadPipeline", + "Unique3DRun - Geo Reconstruct", + "Unique3DRun - MVPrediction" + ], + { + "title_aux": "ComfyUI-Unique3D [WIP]" + } + ], + "https://github.com/kadirnar/ComfyUI-Adapter": [ + [ + "GarmentSegLoader" + ], + { + "title_aux": "ComfyUI-Adapter [WIP]" + } + ], + "https://github.com/kadirnar/comfyui_helpers": [ + [ + "CircularVAEDecode", + "CustomKSamplerAdvancedTile", + "JDC_AutoContrast", + "JDC_BlendImages", + "JDC_BrownNoise", + "JDC_Contrast", + "JDC_EqualizeGrey", + "JDC_GaussianBlur", + "JDC_GreyNoise", + "JDC_Greyscale", + "JDC_ImageLoader", + "JDC_ImageLoaderMeta", + "JDC_PinkNoise", + "JDC_Plasma", + "JDC_PlasmaSampler", + "JDC_PowerImage", + "JDC_RandNoise", + "JDC_ResizeFactor", + "LatentGaussianNoise", + "LatentToRGB", + "MathEncode", + "NoisyLatentPerlin" + ], + { + "title_aux": "comfyui_helpers" + } + ], + "https://github.com/kappa54m/ComfyUI_Usability": [ + [ + "KLoadImageByPath", + "KLoadImageByPathAdvanced", + "KLoadImageDedup" + ], + { + "title_aux": "ComfyUI_Usability (WIP)" + } + ], + "https://github.com/kijai/ComfyUI-CV-VAE": [ + [ + "CV_VAE_Decode", + "CV_VAE_Encode", + "CV_VAE_Load" + ], + { + "title_aux": "ComfyUI-CV-VAE" + } + ], + "https://github.com/kijai/ComfyUI-DeepSeek-VL": [ + [ + "deepseek_vl_inference", + "deepseek_vl_model_loader" + ], + { + "title_aux": "ComfyUI nodes to use DeepSeek-VL" + } + ], + "https://github.com/kijai/ComfyUI-DiffSynthWrapper": [ + [ + "DiffSynthSampler", + "DownloadAndLoadDiffSynthExVideoSVD" + ], + { + "title_aux": "ComfyUI DiffSynth wrapper nodes [WIP]" + } + ], + "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper": [ + [ + "LoadSD3DiffusersPipeline", + "SD3ControlNetSampler" + ], + { + "title_aux": "ComfyUI-DiffusersSD3Wrapper" + } + ], + "https://github.com/komojini/ComfyUI_Prompt_Template_CustomNodes/raw/main/prompt_with_template.py": [ + [ + "ObjectPromptWithTemplate", + "PromptWithTemplate" + ], + { + "title_aux": "ComfyUI_Prompt_Template_CustomNodes" + } + ], + "https://github.com/kycg/comfyui-Kwtoolset": [ + [ + "KWNagetiveString", + "KWPositiveString", + "KWanywhereString", + "KwtoolsetChangeOpenpose", + "KwtoolsetCheckpointLoaderwithpreview", + "KwtoolsetGetHipMask", + "KwtoolsetGetHipMasktest", + "KwtoolsetGetImageSize", + "KwtoolsetGrowMaskPlus", + "KwtoolsetLoadCheckpointsBatch", + "KwtoolsetLoraLoaderwithpreview", + "LatentMatch" + ], + { + "title_aux": "comfyui-Kwtoolset" + } + ], + "https://github.com/laksjdjf/ssd-1b-comfyui": [ + [ + "SSD-1B-Loader" + ], + { + "title_aux": "ssd-1b-comfyui" + } + ], + "https://github.com/logtd/ComfyUI-MotionThiefExperiment": [ + [ + "ApplyRefMotionNode", + "MotionRefSettingsCustomNode", + "MotionRefSettingsDefaultNode" + ], + { + "title_aux": "ComfyUI-MotionThiefExperiment" + } + ], + "https://github.com/longgui0318/comfyui-one-more-step": [ + [ + "Calculate More Step Latent", + "Load More Step Model" + ], + { + "title_aux": "comfyui-one-more-step [WIP]" + } + ], + "https://github.com/ltdrdata/ComfyUI-Workflow-Component": [ + [ + "ComboToString", + "ExecutionBlocker", + "ExecutionControlString", + "ExecutionOneOf", + "ExecutionSwitch", + "InputUnzip", + "InputZip", + "LoopControl", + "LoopCounterCondition", + "OptionalTest", + "TensorToCPU" + ], + { + "title_aux": "ComfyUI-Workflow-Component [WIP]" + } + ], + "https://github.com/marcueberall/ComfyUI-BuildPath": [ + [ + "Build Path Adv" + ], + { + "title_aux": "ComfyUI-BuildPath" + } + ], + "https://github.com/marduk191/comfyui-marnodes": [ + [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", + "marduk191_workflow_settings" + ], + { + "author": "\u02f6marduk191", + "description": "A node to set workflow settings.", + "nickname": "marduk191 workflow settings", + "title": "marduk191 workflow settings", + "title_aux": "comfyui-marnodes" + } + ], + "https://github.com/maruhidd/ComfyUI_Transparent-Background": [ + [ + "FillTransparentNode", + "RemoveBackgroundNode" + ], + { + "title_aux": "Transparent Background for ComfyUI" + } + ], + "https://github.com/mashb1t/comfyui-nodes-mashb1t": [ + [ + "mashb1t: LoadImage" + ], + { + "title_aux": "ComfyUI mashb1t nodes" + } + ], + "https://github.com/mikeymcfish/FishTools": [ + [ + "Deptherize", + "LaserCutterFull" + ], + { + "author": "Fish", + "description": "This extension provides tools for generating laser cutter ready files", + "nickname": "FishTools", + "title": "FishTools", + "title_aux": "LaserCutterFull and Deptherize Nodes" + } + ], + "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq": [ + [ + "AEMatter_Apply", + "AEMatter_ModelLoader", + "Create_Trimap", + "Gaussian_Filter", + "Guide_Filter", + "Mask_Transfor", + "Replace_Background" + ], + { + "title_aux": "ComfyUI_AEMatter_zmq" + } + ], + "https://github.com/mut-ex/comfyui-gligengui-node": [ + [ + "GLIGEN_GUI" + ], + { + "title_aux": "ComfyUI GLIGEN GUI Node" + } + ], + "https://github.com/nidefawl/ComfyUI-nidefawl": [ + [ + "BlendImagesWithBoundedMasks", + "CropImagesWithMasks", + "CustomCallback", + "DisplayAnyType", + "EmptyImageWithColor", + "ImageToLatent", + "LatentPerlinNoise", + "LatentScaledNoise", + "LatentToImage", + "MaskFromColor", + "ModelSamplerTonemapNoiseTest", + "PythonScript", + "ReferenceOnlySimple", + "SamplerCustomCallback", + "SamplerDPMPP_2M_SDE_nidefawl", + "SetLatentCustomNoise", + "SplitCustomSigmas", + "VAELoaderDataType", + "gcLatentTunnel" + ], + { + "title_aux": "ComfyUI-nidefawl [UNSAFE]" + } + ], + "https://github.com/nkchocoai/ComfyUI-PromptUtilities": [ + [ + "PromptUtilitiesConstString", + "PromptUtilitiesConstStringMultiLine", + "PromptUtilitiesFormatString", + "PromptUtilitiesJoinStringList", + "PromptUtilitiesLoadPreset", + "PromptUtilitiesLoadPresetAdvanced", + "PromptUtilitiesRandomPreset", + "PromptUtilitiesRandomPresetAdvanced" + ], + { + "title_aux": "ComfyUI-PromptUtilities" + } + ], + "https://github.com/oyvindg/ComfyUI-TrollSuite": [ + [ + "BinaryImageMask", + "ImagePadding", + "LoadLastImage", + "RandomMask", + "TransparentImage" + ], + { + "title_aux": "ComfyUI-TrollSuite" + } + ], + "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter": [ + [ + "Kosmos2SamplerSimple", + "KosmosLoader", + "Write" + ], + { + "title_aux": "Kosmos2_BBox_Cutter Models" + } + ], + "https://github.com/pamparamm/ComfyUI-ppm": [ + [ + "AttentionCouplePPM", + "CLIPMicroConditioning", + "CLIPNegPip", + "CLIPTextEncodeBREAK", + "CLIPTokenCounter", + "EmptyLatentImageAR", + "EmptyLatentImageARAdvanced", + "LatentToMaskBB", + "LatentToWidthHeight", + "RandomPromptGenerator", + "StableCascade_AutoCompLatent" + ], + { + "title_aux": "ComfyUI-ppm" + } + ], + "https://github.com/poisenbery/NudeNet-Detector-Provider": [ + [ + "NudeNetDetectorProvider" + ], + { + "title_aux": "NudeNet-Detector-Provider [WIP]" + } + ], + "https://github.com/prabinpebam/anyPython": [ + [ + "Any Python" + ], + { + "author": "prabinpebam", + "description": "This node can take any input and use that to run a python script in ComfyUI", + "nickname": "AnyPython", + "title": "AnyPython v0.1", + "title_aux": "anyPython [UNSAFE]" + } + ], + "https://github.com/prismwastaken/comfyui-tools": [ + [ + "Prism-RandomNormal" + ], + { + "title_aux": "prism-tools" + } + ], + "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner": [ + [ + "sd not very simple simpletuner by hhy" + ], + { + "title_aux": "comfyui-sd3-simple-simpletuner" + } + ], + "https://github.com/redhottensors/ComfyUI-ODE": [ + [ + "Blended Transition [DVB]", + "Calculation [DVB]", + "Create Frame Set [DVB]", + "Divide [DVB]", + "Fade From Black [DVB]", + "Fade To Black [DVB]", + "Float Input [DVB]", + "For Each Done [DVB]", + "For Each Filename [DVB]", + "Frame Set Append [DVB]", + "Frame Set Frame Dimensions Scaled [DVB]", + "Frame Set Index Offset [DVB]", + "Frame Set Merger [DVB]", + "Frame Set Reindex [DVB]", + "Frame Set Repeat [DVB]", + "Frame Set Reverse [DVB]", + "Frame Set Split Beginning [DVB]", + "Frame Set Split End [DVB]", + "Frame Set Splitter [DVB]", + "Generate Inbetween Frames [DVB]", + "Int Input [DVB]", + "Linear Camera Pan [DVB]", + "Linear Camera Roll [DVB]", + "Linear Camera Zoom [DVB]", + "Load Image From Path [DVB]", + "Multiply [DVB]", + "ODESamplerSelect", + "Sine Camera Pan [DVB]", + "Sine Camera Roll [DVB]", + "Sine Camera Zoom [DVB]", + "String Input [DVB]", + "Text Input [DVB]", + "Trace Memory Allocation [DVB]", + "Unwrap Frame Set [DVB]" + ], + { + "author": "RedHotTensors", + "description": "Adaptive ODE Solvers for ComfyUI", + "nickname": "ComfyUI-ODE", + "title": "ComfyUI-ODE", + "title_aux": "ComfyUI-ODE" + } + ], + "https://github.com/sdfxai/SDFXBridgeForComfyUI": [ + [ + "SDFXClipTextEncode" + ], + { + "title_aux": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration" + } + ], + "https://github.com/shadowcz007/ComfyUI-PuLID-Test": [ + [ + "ApplyPulid", + "PulidEvaClipLoader", + "PulidInsightFaceLoader", + "PulidModelLoader" + ], + { + "title_aux": "ComfyUI-PuLID [TEST]" + } + ], + "https://github.com/shadowcz007/comfyui-CLIPSeg": [ + [ + "CLIPSeg_", + "CombineMasks_" + ], + { + "title_aux": "comfyui-CLIPSeg" + } + ], + "https://github.com/shadowcz007/comfyui-musicgen": [ + [ + "AudioPlay", + "Musicgen_", + "StableAudio_" + ], + { + "title_aux": "comfyui-musicgen" + } + ], + "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": [ + [ + "CLIPTextEncodeAndEnhance" + ], + { + "title_aux": "CLIPTextEncodeAndEnhancev4 (shirazdesigner)" + } + ], + "https://github.com/sofakid/dandy": [ + [ + "DandyBooleanCollector", + "DandyBooleanPreview", + "DandyBooleanSplitter", + "DandyCss", + "DandyCssLoader", + "DandyEditorSettings", + "DandyFloatCollector", + "DandyFloatPreview", + "DandyFloatSplitter", + "DandyGradient", + "DandyHtml", + "DandyHtmlLoader", + "DandyImageCollector", + "DandyIntCollector", + "DandyIntPreview", + "DandyIntSplitter", + "DandyJs", + "DandyJsLoader", + "DandyJson", + "DandyJsonLoader", + "DandyLand", + "DandyMaskCollector", + "DandyP5JsDraw", + "DandyP5JsLoader", + "DandyP5JsSetup", + "DandyPixelsJs", + "DandyPixiJs", + "DandyPrompt", + "DandyString", + "DandyStringArrayCollector", + "DandyStringArraySplitter", + "DandyStringCatCollector", + "DandyStringPreview", + "DandyUrlLoader", + "DandyWasmLoader", + "DandyYaml", + "DandyYamlLoader" + ], + { + "title_aux": "dandy [UNSAFE]" + } + ], + "https://github.com/stutya/ComfyUI-Terminal": [ + [ + "Terminal" + ], + { + "title_aux": "ComfyUI-Terminal [UNSAFE]" + } + ], + "https://github.com/sugarkwork/comfyui_psd": [ + [ + "SavePSD" + ], + { + "title_aux": "comfyui_psd [WIP]" + } + ], + "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": [ + [ + "ImageSizer", + "KSamplerSDXLAdvanced" + ], + { + "title_aux": "my-useful-comfyui-custom-nodes" + } + ], + "https://github.com/tracerstar/comfyui-p5js-node": [ + [ + "HYPE_P5JSImage" + ], + { + "title_aux": "comfyui-p5js-node" + } + ], + "https://github.com/tuckerdarby/ComfyUI-TDNodes": [ + [ + "HandTrackerNode", + "InstanceDiffusionLoader", + "InstanceTrackerPrompt", + "KSamplerBatchedNode", + "KSamplerRAVE", + "KSamplerTF", + "TemporalNetPreprocessor", + "TrackerNode", + "VideoTrackerPromptNode" + ], + { + "title_aux": "ComfyUI-TDNodes [WIP]" + } + ], + "https://github.com/umisetokikaze/comfyui_mergekit": [ + [ + "DefineSaveName", + "LoadLR", + "LoadTarget", + "Merge", + "SetLayer", + "SetModels", + "SetTokenizer", + "get_skip" + ], + { + "title_aux": "comfyui_mergekit [WIP]" + } + ], + "https://github.com/unanan/ComfyUI-Dist": [ + [ + "LoadCheckpointFromLAN", + "LoadCheckpointFromURL", + "LoadImageFromLAN", + "LoadImageFromURL", + "LoadWorkflowFromLAN", + "LoadWorkflowFromURL" + ], + { + "title_aux": "ComfyUI-Dist [WIP]" + } + ], + "https://github.com/unanan/ComfyUI-clip-interrogator": [ + [ + "ComfyUIClipInterrogator", + "ShowText" + ], + { + "title_aux": "ComfyUI-clip-interrogator [WIP]" + } + ], + "https://github.com/wormley/comfyui-wormley-nodes": [ + [ + "CheckpointVAELoaderSimpleText", + "CheckpointVAESelectorText", + "LoRA_Tag_To_Stack" + ], + { + "title_aux": "comfyui-wormley-nodes" + } + ], + "https://github.com/yushan777/ComfyUI-Y7Nodes": [ + [ + "Count_Tokens_(Y7)" + ], + { + "title_aux": "Y7 Nodes for ComfyUI" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/github-stats.json b/custom_nodes/ComfyUI-Manager/node_db/dev/github-stats.json new file mode 100644 index 000000000..8239a1133 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/dev/github-stats.json @@ -0,0 +1,762 @@ +{ + "https://github.com/17Retoucher/ComfyUI_Fooocus": { + "stars": 52, + "last_update": "2024-02-24 07:33:29", + "author_account_age_days": 171 + }, + "https://github.com/A719689614/ComfyUI_AC_FUNV8Beta1": { + "stars": 13, + "last_update": "2024-03-08 10:11:44", + "author_account_age_days": 314 + }, + "https://github.com/AI2lab/comfyUI-tool-2lab": { + "stars": 7, + "last_update": "2024-06-06 16:16:11", + "author_account_age_days": 192 + }, + "https://github.com/AIGODLIKE/ComfyUI-Studio": { + "stars": 203, + "last_update": "2024-06-05 00:52:46", + "author_account_age_days": 501 + }, + "https://github.com/ALatentPlace/ComfyUI_yanc": { + "stars": 18, + "last_update": "2024-06-14 09:04:57", + "author_account_age_days": 1460 + }, + "https://github.com/AllenEdgarPoe/ComfyUI-Xorbis-nodes": { + "stars": 0, + "last_update": "2024-06-21 01:43:13", + "author_account_age_days": 2105 + }, + "https://github.com/AustinMroz/ComfyUI-WorkflowCheckpointing": { + "stars": 5, + "last_update": "2024-06-19 21:19:45", + "author_account_age_days": 4074 + }, + "https://github.com/BadCafeCode/execution-inversion-demo-comfyui": { + "stars": 4, + "last_update": "2024-06-19 06:59:39", + "author_account_age_days": 430 + }, + "https://github.com/Beinsezii/comfyui-amd-go-fast": { + "stars": 9, + "last_update": "2024-05-10 00:48:37", + "author_account_age_days": 2226 + }, + "https://github.com/BlueDangerX/ComfyUI-BDXNodes": { + "stars": 1, + "last_update": "2023-12-10 04:01:19", + "author_account_age_days": 246 + }, + "https://github.com/Brandelan/ComfyUI_bd_customNodes": { + "stars": 1, + "last_update": "2023-10-09 00:40:26", + "author_account_age_days": 4151 + }, + "https://github.com/DeTK/ComfyUI-Switch": { + "stars": 0, + "last_update": "2024-03-04 11:52:04", + "author_account_age_days": 2031 + }, + "https://github.com/DrMWeigand/ComfyUI_LineBreakInserter": { + "stars": 0, + "last_update": "2024-04-19 11:37:19", + "author_account_age_days": 1032 + }, + "https://github.com/Elawphant/ComfyUI-MusicGen": { + "stars": 4, + "last_update": "2024-05-11 13:33:24", + "author_account_age_days": 2588 + }, + "https://github.com/ExponentialML/ComfyUI_LiveDirector": { + "stars": 35, + "last_update": "2024-04-09 19:01:49", + "author_account_age_days": 1623 + }, + "https://github.com/Extraltodeus/Conditioning-token-experiments-for-ComfyUI": { + "stars": 13, + "last_update": "2024-03-10 01:04:02", + "author_account_age_days": 3149 + }, + "https://github.com/FoundD-oka/ComfyUI-kisekae-OOTD": { + "stars": 0, + "last_update": "2024-06-02 06:13:42", + "author_account_age_days": 437 + }, + "https://github.com/GentlemanHu/ComfyUI-Notifier": { + "stars": 3, + "last_update": "2024-06-04 10:05:38", + "author_account_age_days": 2383 + }, + "https://github.com/GraftingRayman/ComfyUI_GR_PromptSelector": { + "stars": 17, + "last_update": "2024-06-22 18:22:20", + "author_account_age_days": 163 + }, + "https://github.com/GrindHouse66/ComfyUI-GH_Tools": { + "stars": 0, + "last_update": "2024-03-10 13:27:14", + "author_account_age_days": 624 + }, + "https://github.com/IvanZhd/comfyui-codeformer": { + "stars": 0, + "last_update": "2023-12-02 20:51:52", + "author_account_age_days": 2578 + }, + "https://github.com/Jaxkr/comfyui-terminal-command": { + "stars": 1, + "last_update": "2023-12-03 10:31:40", + "author_account_age_days": 4627 + }, + "https://github.com/Jiffies-64/ComfyUI-SaveImagePlus": { + "stars": 0, + "last_update": "2024-04-01 10:52:59", + "author_account_age_days": 891 + }, + "https://github.com/Jordach/comfy-consistency-vae": { + "stars": 68, + "last_update": "2023-11-06 20:50:40", + "author_account_age_days": 4513 + }, + "https://github.com/LZpenguin/ComfyUI-Text": { + "stars": 9, + "last_update": "2024-06-20 13:38:16", + "author_account_age_days": 1979 + }, + "https://github.com/LarryJane491/ComfyUI-ModelUnloader": { + "stars": 1, + "last_update": "2024-01-14 08:22:39", + "author_account_age_days": 164 + }, + "https://github.com/LotzF/ComfyUI-Simple-Chat-GPT-completion": { + "stars": 0, + "last_update": "2024-02-04 21:15:22", + "author_account_age_days": 929 + }, + "https://github.com/LykosAI/ComfyUI-Inference-Core-Nodes": { + "stars": 16, + "last_update": "2024-04-05 05:11:51", + "author_account_age_days": 378 + }, + "https://github.com/MrAdamBlack/CheckProgress": { + "stars": 1, + "last_update": "2024-01-10 08:02:18", + "author_account_age_days": 2720 + }, + "https://github.com/MushroomFleet/DJZ-Nodes": { + "stars": 4, + "last_update": "2024-03-18 11:18:42", + "author_account_age_days": 3721 + }, + "https://github.com/NicholasKao1029/comfyui-hook": { + "stars": 0, + "last_update": "2024-03-07 05:50:56", + "author_account_age_days": 2030 + }, + "https://github.com/NitramDom/ComfyUI_FacialFlip": { + "stars": 2, + "last_update": "2024-06-07 14:56:55", + "author_account_age_days": 3172 + }, + "https://github.com/PluMaZero/ComfyUI-SpaceFlower": { + "stars": 4, + "last_update": "2023-12-09 05:55:15", + "author_account_age_days": 1058 + }, + "https://github.com/Quasimondo/ComfyUI-QuasimondoNodes": { + "stars": 4, + "last_update": "2024-06-21 19:55:21", + "author_account_age_days": 5275 + }, + "https://github.com/SadaleNet/ComfyUI-Prompt-To-Prompt": { + "stars": 20, + "last_update": "2024-03-17 04:30:01", + "author_account_age_days": 4040 + }, + "https://github.com/Sai-ComfyUI/ComfyUI-MS-Nodes": { + "stars": 2, + "last_update": "2024-02-22 08:34:44", + "author_account_age_days": 209 + }, + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": { + "stars": 3, + "last_update": "2024-06-23 01:30:57", + "author_account_age_days": 1110 + }, + "https://github.com/SeedV/ComfyUI-SeedV-Nodes": { + "stars": 1, + "last_update": "2024-06-05 10:01:47", + "author_account_age_days": 1126 + }, + "https://github.com/Shinsplat/ComfyUI-Shinsplat": { + "stars": 13, + "last_update": "2024-06-22 14:29:36", + "author_account_age_days": 1024 + }, + "https://github.com/StartHua/Comfyui_CXH_CRM": { + "stars": 26, + "last_update": "2024-06-06 14:15:14", + "author_account_age_days": 2835 + }, + "https://github.com/TSFSean/ComfyUI-TSFNodes": { + "stars": 4, + "last_update": "2024-05-18 00:59:06", + "author_account_age_days": 3472 + }, + "https://github.com/TemryL/ComfyUI-IDM-VTON": { + "stars": 203, + "last_update": "2024-06-22 06:14:19", + "author_account_age_days": 868 + }, + "https://github.com/Video3DGenResearch/comfyui-batch-input-node": { + "stars": 1, + "last_update": "2024-04-28 15:21:17", + "author_account_age_days": 106 + }, + "https://github.com/WSJUSA/Comfyui-StableSR": { + "stars": 38, + "last_update": "2023-10-18 12:40:30", + "author_account_age_days": 1424 + }, + "https://github.com/WilliamStanford/visuallabs_comfyui_nodes": { + "stars": 1, + "last_update": "2024-04-16 21:53:02", + "author_account_age_days": 1769 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-AnyText": { + "stars": 45, + "last_update": "2024-05-22 14:30:05", + "author_account_age_days": 340 + }, + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO": { + "stars": 184, + "last_update": "2024-05-22 13:38:23", + "author_account_age_days": 340 + }, + "https://github.com/alt-key-project/comfyui-dream-video-batches": { + "stars": 51, + "last_update": "2024-05-22 20:52:05", + "author_account_age_days": 660 + }, + "https://github.com/baicai99/ComfyUI-FrameSkipping": { + "stars": 6, + "last_update": "2024-06-18 10:25:55", + "author_account_age_days": 831 + }, + "https://github.com/beyastard/ComfyUI_BeySoft": { + "stars": 0, + "last_update": "2024-05-26 22:44:55", + "author_account_age_days": 4286 + }, + "https://github.com/birnam/ComfyUI-GenData-Pack": { + "stars": 0, + "last_update": "2024-03-25 01:25:23", + "author_account_age_days": 5009 + }, + "https://github.com/blepping/comfyui_overly_complicated_sampling": { + "stars": 5, + "last_update": "2024-06-12 01:05:41", + "author_account_age_days": 154 + }, + "https://github.com/blib-la/ComfyUI-Captain-Extensions": { + "stars": 0, + "last_update": "2024-05-17 23:27:25", + "author_account_age_days": 273 + }, + "https://github.com/bruce007lee/comfyui-cleaner": { + "stars": 3, + "last_update": "2024-04-20 15:36:03", + "author_account_age_days": 4512 + }, + "https://github.com/bruce007lee/comfyui-tiny-utils": { + "stars": 0, + "last_update": "2024-06-07 03:44:47", + "author_account_age_days": 4512 + }, + "https://github.com/brycegoh/comfyui-custom-nodes": { + "stars": 0, + "last_update": "2024-06-05 09:30:06", + "author_account_age_days": 3108 + }, + "https://github.com/chaojie/ComfyUI-DynamiCrafter": { + "stars": 109, + "last_update": "2024-06-14 10:23:59", + "author_account_age_days": 4833 + }, + "https://github.com/chaojie/ComfyUI-mobvoi-openapi": { + "stars": 2, + "last_update": "2024-05-29 09:02:52", + "author_account_age_days": 4833 + }, + "https://github.com/christian-byrne/infinite-zoom-parallax-nodes": { + "stars": 4, + "last_update": "2024-05-27 01:51:24", + "author_account_age_days": 1348 + }, + "https://github.com/christian-byrne/python-interpreter-node": { + "stars": 20, + "last_update": "2024-06-23 22:22:20", + "author_account_age_days": 1348 + }, + "https://github.com/comfyanonymous/ComfyUI": { + "stars": 39915, + "last_update": "2024-06-24 11:47:40", + "author_account_age_days": 549 + }, + "https://github.com/comfypod/ComfyUI-Comflow": { + "stars": 0, + "last_update": "2024-06-17 08:44:08", + "author_account_age_days": 23 + }, + "https://github.com/corbin-hayden13/ComfyUI-Better-Dimensions": { + "stars": 7, + "last_update": "2024-06-12 17:45:21", + "author_account_age_days": 1815 + }, + "https://github.com/cubiq/Comfy_Dungeon": { + "stars": 174, + "last_update": "2024-04-26 11:00:58", + "author_account_age_days": 5011 + }, + "https://github.com/dezi-ai/ComfyUI-AnimateLCM": { + "stars": 148, + "last_update": "2024-02-07 17:34:39", + "author_account_age_days": 177 + }, + "https://github.com/dfl/comfyui-stylegan": { + "stars": 1, + "last_update": "2024-03-14 14:34:25", + "author_account_age_days": 5974 + }, + "https://github.com/dnl13/ComfyUI-dnl13-seg": { + "stars": 16, + "last_update": "2024-01-08 10:52:13", + "author_account_age_days": 4218 + }, + "https://github.com/doucx/ComfyUI_WcpD_Utility_Kit": { + "stars": 1, + "last_update": "2024-01-06 19:07:45", + "author_account_age_days": 2323 + }, + "https://github.com/eigenpunk/ComfyUI-audio": { + "stars": 59, + "last_update": "2024-03-03 21:14:14", + "author_account_age_days": 925 + }, + "https://github.com/ejektaflex/ComfyUI-Ty": { + "stars": 0, + "last_update": "2024-06-12 16:08:16", + "author_account_age_days": 2772 + }, + "https://github.com/endman100/ComfyUI-SaveAndLoadPromptCondition": { + "stars": 0, + "last_update": "2024-06-06 06:07:49", + "author_account_age_days": 2473 + }, + "https://github.com/ericbeyer/guidance_interval": { + "stars": 2, + "last_update": "2024-04-16 03:24:01", + "author_account_age_days": 2594 + }, + "https://github.com/flowtyone/comfyui-flowty-lcm": { + "stars": 62, + "last_update": "2023-10-23 12:08:55", + "author_account_age_days": 273 + }, + "https://github.com/flyingdogsoftware/gyre_for_comfyui": { + "stars": 0, + "last_update": "2024-06-21 15:35:49", + "author_account_age_days": 2013 + }, + "https://github.com/foglerek/comfyui-cem-tools": { + "stars": 1, + "last_update": "2024-01-13 23:22:07", + "author_account_age_days": 4038 + }, + "https://github.com/gameltb/ComfyUI_paper_playground": { + "stars": 9, + "last_update": "2024-06-20 07:16:06", + "author_account_age_days": 4055 + }, + "https://github.com/gameltb/ComfyUI_stable_fast": { + "stars": 183, + "last_update": "2024-06-06 12:43:16", + "author_account_age_days": 4055 + }, + "https://github.com/gameltb/io_comfyui": { + "stars": 3, + "last_update": "2024-04-06 04:40:05", + "author_account_age_days": 4055 + }, + "https://github.com/githubYiheng/comfyui_median_filter": { + "stars": 0, + "last_update": "2024-05-24 15:21:40", + "author_account_age_days": 3903 + }, + "https://github.com/haofanwang/ComfyUI-InstantStyle": { + "stars": 5, + "last_update": "2024-05-23 16:11:13", + "author_account_age_days": 2977 + }, + "https://github.com/horidream/ComfyUI-Horidream": { + "stars": 0, + "last_update": "2024-06-18 02:09:07", + "author_account_age_days": 5043 + }, + "https://github.com/houdinii/comfy-magick": { + "stars": 4, + "last_update": "2024-03-11 06:40:54", + "author_account_age_days": 3520 + }, + "https://github.com/huchenlei/ComfyUI_densediffusion": { + "stars": 70, + "last_update": "2024-06-11 00:39:28", + "author_account_age_days": 2875 + }, + "https://github.com/huchenlei/ComfyUI_omost": { + "stars": 321, + "last_update": "2024-06-14 12:45:52", + "author_account_age_days": 2875 + }, + "https://github.com/huizhang0110/ComfyUI_Easy_Nodes_hui": { + "stars": 2, + "last_update": "2024-02-27 08:22:49", + "author_account_age_days": 2455 + }, + "https://github.com/hy134300/comfyui-hb-node": { + "stars": 0, + "last_update": "2024-04-09 09:56:22", + "author_account_age_days": 1761 + }, + "https://github.com/hy134300/comfyui-hydit": { + "stars": 7, + "last_update": "2024-06-07 09:52:15", + "author_account_age_days": 1761 + }, + "https://github.com/ilovejohnwhite/UncleBillyGoncho": { + "stars": 0, + "last_update": "2024-02-29 00:16:42", + "author_account_age_days": 873 + }, + "https://github.com/immersiveexperience/ie-comfyui-color-nodes": { + "stars": 2, + "last_update": "2024-06-18 10:54:55", + "author_account_age_days": 269 + }, + "https://github.com/jh-leon-kim/ComfyUI-JHK-utils": { + "stars": 0, + "last_update": "2024-06-04 08:57:52", + "author_account_age_days": 172 + }, + "https://github.com/jimmm-ai/TimeUi-a-ComfyUi-Timeline-Node": { + "stars": 194, + "last_update": "2024-06-12 20:10:22", + "author_account_age_days": 20 + }, + "https://github.com/jn-jairo/jn_node_suite_comfyui": { + "stars": 5, + "last_update": "2024-06-08 05:15:33", + "author_account_age_days": 3984 + }, + "https://github.com/jtscmw01/ComfyUI-DiffBIR": { + "stars": 61, + "last_update": "2024-05-21 05:28:34", + "author_account_age_days": 502 + }, + "https://github.com/jtydhr88/ComfyUI-Unique3D": { + "stars": 57, + "last_update": "2024-06-24 00:30:37", + "author_account_age_days": 4753 + }, + "https://github.com/kadirnar/ComfyUI-Adapter": { + "stars": 3, + "last_update": "2024-04-03 12:05:39", + "author_account_age_days": 2329 + }, + "https://github.com/kadirnar/comfyui_helpers": { + "stars": 2, + "last_update": "2024-03-04 16:25:30", + "author_account_age_days": 2329 + }, + "https://github.com/kappa54m/ComfyUI_Usability": { + "stars": 0, + "last_update": "2024-02-05 14:49:45", + "author_account_age_days": 1511 + }, + "https://github.com/kijai/ComfyUI-CV-VAE": { + "stars": 9, + "last_update": "2024-06-03 21:46:49", + "author_account_age_days": 2183 + }, + "https://github.com/kijai/ComfyUI-DeepSeek-VL": { + "stars": 19, + "last_update": "2024-05-21 16:43:40", + "author_account_age_days": 2183 + }, + "https://github.com/kijai/ComfyUI-DiffSynthWrapper": { + "stars": 22, + "last_update": "2024-06-22 00:16:46", + "author_account_age_days": 2183 + }, + "https://github.com/kijai/ComfyUI-DiffusersSD3Wrapper": { + "stars": 7, + "last_update": "2024-06-17 13:03:43", + "author_account_age_days": 2183 + }, + "https://github.com/kycg/comfyui-Kwtoolset": { + "stars": 0, + "last_update": "2024-06-12 17:04:09", + "author_account_age_days": 940 + }, + "https://github.com/laksjdjf/ssd-1b-comfyui": { + "stars": 1, + "last_update": "2023-10-27 20:05:06", + "author_account_age_days": 2831 + }, + "https://github.com/logtd/ComfyUI-MotionThiefExperiment": { + "stars": 36, + "last_update": "2024-05-22 00:12:06", + "author_account_age_days": 122 + }, + "https://github.com/longgui0318/comfyui-one-more-step": { + "stars": 1, + "last_update": "2024-05-07 08:40:56", + "author_account_age_days": 4165 + }, + "https://github.com/ltdrdata/ComfyUI-Workflow-Component": { + "stars": 195, + "last_update": "2024-04-26 01:39:09", + "author_account_age_days": 462 + }, + "https://github.com/marcueberall/ComfyUI-BuildPath": { + "stars": 0, + "last_update": "2024-02-06 07:57:33", + "author_account_age_days": 1782 + }, + "https://github.com/marduk191/comfyui-marnodes": { + "stars": 0, + "last_update": "2024-06-14 10:24:11", + "author_account_age_days": 4415 + }, + "https://github.com/maruhidd/ComfyUI_Transparent-Background": { + "stars": 1, + "last_update": "2024-06-14 07:02:56", + "author_account_age_days": 2255 + }, + "https://github.com/mashb1t/comfyui-nodes-mashb1t": { + "stars": 0, + "last_update": "2024-06-11 15:55:53", + "author_account_age_days": 3535 + }, + "https://github.com/mikeymcfish/FishTools": { + "stars": 12, + "last_update": "2024-06-21 20:35:44", + "author_account_age_days": 3403 + }, + "https://github.com/mingqizhang/ComfyUI_AEMatter_zmq": { + "stars": 0, + "last_update": "2024-06-24 07:22:59", + "author_account_age_days": 2594 + }, + "https://github.com/mut-ex/comfyui-gligengui-node": { + "stars": 30, + "last_update": "2024-02-28 02:46:05", + "author_account_age_days": 2858 + }, + "https://github.com/nat-chan/comfyui-eval": { + "stars": 1, + "last_update": "2024-05-28 11:56:37", + "author_account_age_days": 2993 + }, + "https://github.com/nat-chan/comfyui-in-memory-transceiver": { + "stars": 1, + "last_update": "2024-05-01 10:03:01", + "author_account_age_days": 2993 + }, + "https://github.com/nat-chan/comfyui-paint": { + "stars": 2, + "last_update": "2024-06-14 11:01:38", + "author_account_age_days": 2993 + }, + "https://github.com/nidefawl/ComfyUI-nidefawl": { + "stars": 0, + "last_update": "2024-01-16 18:16:41", + "author_account_age_days": 4868 + }, + "https://github.com/nkchocoai/ComfyUI-PromptUtilities": { + "stars": 6, + "last_update": "2024-06-23 04:58:30", + "author_account_age_days": 160 + }, + "https://github.com/norgeous/ComfyUI-UI-Builder": { + "stars": 2, + "last_update": "2024-06-24 13:55:40", + "author_account_age_days": 4029 + }, + "https://github.com/oyvindg/ComfyUI-TrollSuite": { + "stars": 0, + "last_update": "2024-05-22 21:32:03", + "author_account_age_days": 2329 + }, + "https://github.com/oztrkoguz/ComfyUI_Kosmos2_BBox_Cutter": { + "stars": 13, + "last_update": "2024-05-03 10:52:29", + "author_account_age_days": 841 + }, + "https://github.com/pamparamm/ComfyUI-ppm": { + "stars": 3, + "last_update": "2024-06-15 15:19:13", + "author_account_age_days": 2131 + }, + "https://github.com/phineas-pta/comfy-trt-test": { + "stars": 83, + "last_update": "2024-06-04 21:09:17", + "author_account_age_days": 2288 + }, + "https://github.com/poisenbery/NudeNet-Detector-Provider": { + "stars": 1, + "last_update": "2024-02-26 02:11:27", + "author_account_age_days": 1237 + }, + "https://github.com/prabinpebam/anyPython": { + "stars": 3, + "last_update": "2024-06-21 16:58:16", + "author_account_age_days": 4242 + }, + "https://github.com/prismwastaken/comfyui-tools": { + "stars": 0, + "last_update": "2024-03-05 14:34:56", + "author_account_age_days": 157 + }, + "https://github.com/pzzmyc/comfyui-sd3-simple-simpletuner": { + "stars": 1, + "last_update": "2024-06-19 12:48:18", + "author_account_age_days": 2099 + }, + "https://github.com/redhottensors/ComfyUI-ODE": { + "stars": 12, + "last_update": "2024-06-23 22:16:53", + "author_account_age_days": 139 + }, + "https://github.com/romeobuilderotti/ComfyUI-EZ-Pipes": { + "stars": 3, + "last_update": "2023-11-15 22:00:49", + "author_account_age_days": 290 + }, + "https://github.com/runtime44/comfyui_r44_nodes": { + "stars": 28, + "last_update": "2024-06-11 10:49:02", + "author_account_age_days": 168 + }, + "https://github.com/sangeet/comfyui-testui": { + "stars": 2, + "last_update": "2024-05-15 00:55:17", + "author_account_age_days": 5080 + }, + "https://github.com/sdfxai/SDFXBridgeForComfyUI": { + "stars": 6, + "last_update": "2024-06-14 10:26:56", + "author_account_age_days": 235 + }, + "https://github.com/shadowcz007/ComfyUI-PuLID-Test": { + "stars": 8, + "last_update": "2024-05-12 14:37:28", + "author_account_age_days": 3314 + }, + "https://github.com/shadowcz007/comfyui-CLIPSeg": { + "stars": 1, + "last_update": "2024-02-08 02:16:24", + "author_account_age_days": 3314 + }, + "https://github.com/shadowcz007/comfyui-llamafile": { + "stars": 15, + "last_update": "2024-05-21 19:47:56", + "author_account_age_days": 3314 + }, + "https://github.com/shadowcz007/comfyui-musicgen": { + "stars": 54, + "last_update": "2024-06-20 02:07:31", + "author_account_age_days": 3314 + }, + "https://github.com/shirazdesigner/CLIPTextEncodeAndEnhancev4": { + "stars": 0, + "last_update": "2024-04-27 13:25:08", + "author_account_age_days": 3962 + }, + "https://github.com/sofakid/dandy": { + "stars": 30, + "last_update": "2024-05-27 21:46:18", + "author_account_age_days": 4053 + }, + "https://github.com/stavsap/ComfyUI-React-SDK": { + "stars": 6, + "last_update": "2024-03-17 21:54:21", + "author_account_age_days": 4084 + }, + "https://github.com/stutya/ComfyUI-Terminal": { + "stars": 0, + "last_update": "2024-02-05 16:47:28", + "author_account_age_days": 3838 + }, + "https://github.com/sugarkwork/comfyui_psd": { + "stars": 1, + "last_update": "2024-03-26 08:24:56", + "author_account_age_days": 875 + }, + "https://github.com/tachyon-beep/comfyui-simplefeed": { + "stars": 3, + "last_update": "2024-05-22 03:30:57", + "author_account_age_days": 4921 + }, + "https://github.com/talesofai/comfyui-supersave": { + "stars": 1, + "last_update": "2023-12-27 02:05:53", + "author_account_age_days": 556 + }, + "https://github.com/tjorbogarden/my-useful-comfyui-custom-nodes": { + "stars": 0, + "last_update": "2024-03-05 13:31:31", + "author_account_age_days": 113 + }, + "https://github.com/tracerstar/comfyui-p5js-node": { + "stars": 28, + "last_update": "2024-05-30 18:33:55", + "author_account_age_days": 5198 + }, + "https://github.com/tuckerdarby/ComfyUI-TDNodes": { + "stars": 3, + "last_update": "2024-02-19 17:00:55", + "author_account_age_days": 2938 + }, + "https://github.com/umisetokikaze/comfyui_mergekit": { + "stars": 0, + "last_update": "2024-04-28 07:21:00", + "author_account_age_days": 1823 + }, + "https://github.com/unanan/ComfyUI-Dist": { + "stars": 5, + "last_update": "2024-02-28 10:03:50", + "author_account_age_days": 2898 + }, + "https://github.com/unanan/ComfyUI-clip-interrogator": { + "stars": 22, + "last_update": "2024-02-01 09:46:57", + "author_account_age_days": 1030 + }, + "https://github.com/wormley/comfyui-wormley-nodes": { + "stars": 0, + "last_update": "2023-11-12 19:05:11", + "author_account_age_days": 2473 + }, + "https://github.com/yushan777/ComfyUI-Y7Nodes": { + "stars": 1, + "last_update": "2024-06-23 22:36:49", + "author_account_age_days": 517 + }, + "https://github.com/zmwv823/ComfyUI-AnyText": { + "stars": 42, + "last_update": "2024-06-23 15:52:12", + "author_account_age_days": 3269 + } +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/dev/model-list.json new file mode 100644 index 000000000..8e3e1dc48 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/dev/model-list.json @@ -0,0 +1,3 @@ +{ + "models": [] +} diff --git a/custom_nodes/ComfyUI-Manager/node_db/dev/scan.sh b/custom_nodes/ComfyUI-Manager/node_db/dev/scan.sh new file mode 100644 index 000000000..f9589f3c5 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/dev/scan.sh @@ -0,0 +1,3 @@ +#!/bin/bash +rm ~/.tmp/dev/*.py > /dev/null 2>&1 +python ../../scanner.py ~/.tmp/dev diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/forked/custom-node-list.json new file mode 100644 index 000000000..554591143 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/forked/custom-node-list.json @@ -0,0 +1,54 @@ +{ + "custom_nodes": [ + { + "author": "meimeilook", + "title": "ComfyUI_IPAdapter_plus.old [backward compatbility]", + "reference": "https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old", + "files": [ + "https://github.com/meimeilook/ComfyUI_IPAdapter_plus.old" + ], + "install_type": "git-clone", + "description": "This repo is created to provide backward compatibility for workflows configured with the old IPAdapter." + }, + { + "author": "ZHO-ZHO-ZHO", + "title": "Dr.Lt.Data/ComfyUI-YoloWorld-EfficientSAM", + "reference": "https://github.com/ltdrdata/ComfyUI-YoloWorld-EfficientSAM", + "files": [ + "https://github.com/ltdrdata/ComfyUI-YoloWorld-EfficientSAM" + ], + "install_type": "git-clone", + "description": "This fork includes [a/PR32](https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM/pull/32)" + }, + { + "author": "ertu110", + "title": "sdxl_prompt_style", + "reference": "https://github.com/ertu110/sdxl_prompt_style", + "files": [ + "https://github.com/ertu110/sdxl_prompt_style" + ], + "install_type": "git-clone", + "description": "This project is a complete benchmark [a/https://github.com/twri/sdxl_prompt_styler](https://github.com/twri/sdxl_prompt_styler) A large amount of code inside comes from https://github.com/twri/sdxl_prompt_styler Project and [a/https://www.nodecafe.org/package/pythongosssss_ComfyUI-Custom-Scripts](https://www.nodecafe.org/package/pythongosssss_ComfyUI-Custom-Scripts) project\nThe functionality of this project is related to https://github.com/twri/sdxl_prompt_styler Highly overlapping, the only purpose of creating this project is because there are too many styles when selecting, resulting in a long and inconvenient dropdown box. Therefore, To address this issue, this project has added a secondary menu to the style." + }, + { + "author": "gustproof", + "title": "ComfyUI_IPAdapter_plus_Style_Components", + "reference": "https://github.com/gustproof/ComfyUI_IPAdapter_plus_Style_Components", + "files": [ + "https://github.com/gustproof/ComfyUI_IPAdapter_plus_Style_Components" + ], + "install_type": "git-clone", + "description": "Style Components is an IP-Adapter model conditioned on anime styles. The style embeddings can either be extracted from images or created manually. This repo currently only supports the SDXL model trained on AutismmixPony." + }, + { + "author": "gameltb", + "title": "comfyui-stablsr", + "reference": "https://github.com/gameltb/Comfyui-StableSR", + "files": [ + "https://github.com/gameltb/Comfyui-StableSR" + ], + "install_type": "git-clone", + "description": "This is a development respository for debugging migration of StableSR to ComfyUI\n\nNOTE:Forked from [https://github.com/gameltb/Comfyui-StableSR]\nPut the StableSR [a/webui_786v_139.ckpt](https://huggingface.co/Iceclear/StableSR/resolve/main/webui_768v_139.ckpt) model into Comyfui/models/stablesr/, Put the StableSR [a/stablesr_768v_000139.ckpt](https://huggingface.co/Iceclear/StableSR/resolve/main/stablesr_768v_000139.ckpt) model into Comyfui/models/checkpoints/" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/forked/extension-node-map.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/forked/extension-node-map.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/forked/model-list.json new file mode 100644 index 000000000..8e3e1dc48 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/forked/model-list.json @@ -0,0 +1,3 @@ +{ + "models": [] +} diff --git a/custom_nodes/ComfyUI-Manager/node_db/forked/scan.sh b/custom_nodes/ComfyUI-Manager/node_db/forked/scan.sh new file mode 100644 index 000000000..5d8d8c48b --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/forked/scan.sh @@ -0,0 +1,4 @@ +#!/bin/bash +source ../../../../venv/bin/activate +rm .tmp/*.py > /dev/null +python ../../scanner.py diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/alter-list.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/alter-list.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/alter-list.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/custom-node-list.json new file mode 100644 index 000000000..334346935 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/custom-node-list.json @@ -0,0 +1,587 @@ +{ + "custom_nodes": [ + { + "author": "#NOTICE_1.13", + "title": "NOTICE: This channel is not the default channel.", + "reference": "https://github.com/ltdrdata/ComfyUI-Manager", + "files": [], + "install_type": "git-clone", + "description": "If you see this message, your ComfyUI-Manager is outdated.\nLegacy channel provides only the list of the deprecated nodes. If you want to find the complete node list, please go to the Default channel." + }, + + + { + "author": "turkyden", + "title": "ComfyUI-Sticker [REMOVED]", + "reference": "https://github.com/turkyden/ComfyUI-Sticker", + "files": [ + "https://github.com/turkyden/ComfyUI-Sticker" + ], + "install_type": "git-clone", + "description": "image to sticker" + }, + { + "author": "turkyden", + "title": "ComfyUI-Comic [REMOVED]", + "id": "comic", + "reference": "https://github.com/turkyden/ComfyUI-Comic", + "files": [ + "https://github.com/turkyden/ComfyUI-Comic" + ], + "install_type": "git-clone", + "description": "a comfyui plugin for image to comic" + }, + { + "author": "turkyden", + "title": "ComfyUI-Avatar [REMOVED]", + "id": "avatar", + "reference": "https://github.com/turkyden/ComfyUI-Avatar", + "files": [ + "https://github.com/turkyden/ComfyUI-Avatar" + ], + "install_type": "git-clone", + "description": "a comfyui plugin for image to avatar" + }, + { + "author": "bvhari", + "title": "LatentToRGB [DEPRECATED]", + "id": "latent2rgb", + "reference": "https://github.com/bvhari/ComfyUI_LatentToRGB", + "files": [ + "https://github.com/bvhari/ComfyUI_LatentToRGB" + ], + "install_type": "git-clone", + "description": "ComfyUI custom node to convert latent to RGB.\nNOTE:This repo has been archived because ComfyUI natively has similar functionality now" + }, + { + "author": "Kaharos94", + "title": "ComfyUI-Saveaswebp [DEPRECATED]", + "id": "save-webp", + "reference": "https://github.com/Kaharos94/ComfyUI-Saveaswebp", + "files": [ + "https://github.com/Kaharos94/ComfyUI-Saveaswebp" + ], + "install_type": "git-clone", + "description": "Save a picture as Webp file in Comfy + Workflow loading" + }, + { + "author": "udi0510", + "title": "comfyui-slicer [REMOVED]", + "id": "slicer", + "reference": "https://github.com/udi0510/comfyui-slicer", + "files": [ + "https://github.com/udi0510/comfyui-slicer" + ], + "install_type": "git-clone", + "description": "Nodes:SlicerNode" + }, + { + "author": "logtd", + "title": "ComfyUI-FLATTEN [REMOVED]", + "id": "flatten", + "reference": "https://github.com/logtd/ComfyUI-FlattenFlow", + "files": [ + "https://github.com/logtd/ComfyUI-FlattenFlow" + ], + "install_type": "git-clone", + "description": "An alternate trajectory processor for ComfyUI-FLATTEN\nNOTE:When using this trajectory type FLATTEN will use roughly 1/4 VRAM and be ~20% faster at the cost of some consistency (especially when injection_steps are low)." + }, + { + "author": "MackinationsAi", + "title": "ComfyUi_Stuctured-Outputs [REMOVED]", + "id": "struct-output", + "reference": "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs", + "files": [ + "https://github.com/MackinationsAi/ComfyUi_Stuctured-Outputs" + ], + "install_type": "git-clone", + "description": "This repository contains a custom node for ComfyUI that allows users to save generative image outputs with custom filenames and folder structures. The filenames are padded to four digits, and the positive and negative prompts are embedded in the image metadata." + }, + { + "author": "laksjdjf", + "title": "attention-couple-ComfyUI [DEPRECATED]", + "id": "attention-couple", + "reference": "https://github.com/laksjdjf/attention-couple-ComfyUI", + "files": [ + "https://github.com/laksjdjf/attention-couple-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes:Attention couple. This is a custom node that manipulates region-specific prompts. While vanilla ComfyUI employs an area specification method based on latent couples, this node divides regions using attention layers within UNet.\nNOTE: This has been integrated with cgem156-ComfyUI." + }, + { + "author": "phineas-pta", + "title": "comfy-trt-test [DEPRECATED]", + "reference": "https://github.com/phineas-pta/comfy-trt-test", + "files": [ + "https://github.com/phineas-pta/comfy-trt-test" + ], + "install_type": "git-clone", + "description": "Test project for ComfyUI TensorRT Support.\nNOT WORKING YET.\nnot automatic yet, do not use ComfyUI-Manager to install !!!.\nnot beginner-friendly yet, still intended to technical users\nNOTE: The reason for registration in the Manager is for guidance, and for detailed installation instructions, please visit the repository.\nNOTE: Use 'TensorRT Node for ComfyUI' instead of this." + }, + { + "author": "dezi-ai", + "title": "ComfyUI Animate LCM [NOT MAINTAINED]", + "reference": "https://github.com/dezi-ai/ComfyUI-AnimateLCM", + "files": [ + "https://github.com/dezi-ai/ComfyUI-AnimateLCM" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation for [a/AnimateLCM](https://animatelcm.github.io/) [[a/paper](https://arxiv.org/abs/2402.00769)].\b[w/This extension includes a large number of nodes imported from the existing custom nodes, increasing the likelihood of conflicts.]" + }, + { + "author": "christian-byrne", + "title": "elimination-nodes [REMOVED]", + "reference": "https://github.com/christian-byrne/elimination-nodes", + "files": [ + "https://github.com/christian-byrne/elimination-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Paste Cutout on Base Image" + }, + { + "author": "Levy1417", + "title": "Universal-Data-Processing-Kit [UNSAFE] [REMOVED]", + "reference": "https://github.com/Levy1417/Universal-Data-Processing-Kit", + "files": [ + "https://github.com/Levy1417/Universal-Data-Processing-Kit" + ], + "install_type": "git-clone", + "description": "Nodes:DPK - Any Eval, DPK - Extract Array, DPK - Run External Program, DPK - Any Literals, DPK - Set Node States, DPK - Realtime Text Preview, DPK - Dynamic Action, DPK - Object To Json, DPK - Json To Object\n[w/This extension includes the ability to execute arbitrary code and programs.]" + }, + { + "author": "liusida", + "title": "ComfyUI-Sida-Remove-Image [UNSAFE] [REMOVED]", + "reference": "https://github.com/liusida/ComfyUI-Sida-Remove-Image", + "files": [ + "https://github.com/liusida/ComfyUI-Sida-Remove-Image" + ], + "install_type": "git-clone", + "description": "Nodes: LoadImageWithPrivacy, RemoveImage.[w/This extension is not secure because it provides the capability to delete files from arbitrary paths.]" + }, + { + "author": "88IO", + "title": "ComfyUI Image Reordering Plugins [REMOVED]", + "reference": "https://github.com/88IO/ComfyUI-ImageReorder", + "files": [ + "https://github.com/88IO/ComfyUI-ImageReorder" + ], + "install_type": "git-clone", + "description": "A custom node reorder multiple image frames based on indexes or curves." + }, + { + "author": "jtydhr88", + "title": "ComfyUI-InstantMesh [DEPRECATED]", + "id": "instant-mesh", + "reference": "https://github.com/jtydhr88/ComfyUI-InstantMesh", + "files": [ + "https://github.com/jtydhr88/ComfyUI-InstantMesh" + ], + "install_type": "git-clone", + "description": "ComfyUI InstantMesh is custom nodes that running TencentARC/InstantMesh into ComfyUI, this extension depends on ComfyUI-3D-Pack. Please refer to Readme carefully to install.\nNOTE: This repo is archived due to ComfyUI-3D-Pack supports InstantMesh, please check 3D-Pack directly if you need it" + }, + { + "author": "biegert", + "title": "CLIPSeg [NOT MAINTAINED]", + "id": "clipseg", + "reference": "https://github.com/biegert/ComfyUI-CLIPSeg", + "files": [ + "https://github.com/biegert/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py" + ], + "install_type": "copy", + "description": "The CLIPSeg node generates a binary mask for a given input image and text prompt." + }, + { + "author": "tankucc1no", + "title": "ComfyUI-Dragdiffusion [REMOVED]", + "id": "dragdiffusion", + "reference": "https://github.com/tankucc1no/ComfyUI-Dragdiffusion", + "files": [ + "https://github.com/tankucc1no/ComfyUI-Dragdiffusion" + ], + "install_type": "git-clone", + "description": "Implementation of [a/Dragdiffusion](https://github.com/Yujun-Shi/DragDiffusion) in ComfyUI." + }, + { + "author": "wibur0620", + "title": "ComfyUI Ollama (wibur) [REMOVED]", + "id": "ollama-wibur", + "reference": "https://github.com/wibur0620/comfyui-ollama-wibur", + "files": [ + "https://github.com/wibur0620/comfyui-ollama-wibur" + ], + "install_type": "git-clone", + "description": "Custom ComfyUI Nodes for interacting with [a/Ollama](https://ollama.com/) using the ollama python client.\nIntegrate the power of LLMs into ComfyUI workflows easily or just experiment with GPT.\nNOTE: To use this properly, you would need a running Ollama server reachable from the host that is running ComfyUI." + }, + { + "author": "IKHOR", + "title": "ikhor-nodes [REMOVED]", + "reference": "https://github.com/IKHOR/ComfyUI-IKHOR-Jam-Nodes", + "files": [ + "https://github.com/IKHOR/ComfyUI-IKHOR-Jam-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:LoadFromS3, LoadBatchFromS3, SaveToS3, SaveBatchToS3" + }, + { + "author": "kijai", + "title": "ComfyUI wrapper nodes for IC-light [DEPRECATED]", + "reference": "https://github.com/kijai/ComfyUI-IC-Light-Wrapper", + "files": [ + "https://github.com/kijai/ComfyUI-IC-Light-Wrapper" + ], + "install_type": "git-clone", + "description": "Stopped. Original repo: [a/https://github.com/lllyasviel/IC-Light](https://github.com/lllyasviel/IC-Light)" + }, + { + "author": "thedyze", + "title": "Save Image Extended for ComfyUI", + "reference": "https://github.com/thedyze/save-image-extended-comfyui", + "files": [ + "https://github.com/thedyze/save-image-extended-comfyui" + ], + "install_type": "git-clone", + "description": "Customize the information saved in file- and folder names. Use the values of sampler parameters as part of file or folder names. Save your positive & negative prompt as entries in a JSON (text) file, in each folder.\n[w/This custom node has not been maintained for a long time. Please use an alternative node from the default channel.]" + }, + { + "author": "ExponentialML", + "title": "ComfyUI_ELLA [DEPRECATED]", + "reference": "https://github.com/ExponentialML/ComfyUI_ELLA", + "files": [ + "https://github.com/ExponentialML/ComfyUI_ELLA" + ], + "install_type": "git-clone", + "description": "ComfyUI Implementaion of ELLA: Equip Diffusion Models with LLM for Enhanced Semantic Alignment.[w/Officially implemented here: [a/https://github.com/TencentQQGYLab/ComfyUI-ELLA](https://github.com/TencentQQGYLab/ComfyUI-ELLA)]" + }, + { + "author": "shinich39", + "title": "comfyui-text-pipe-39 [DEPRECATED]", + "reference": "https://github.com/shinich39/comfyui-text-pipe-39", + "files": [ + "https://github.com/shinich39/comfyui-text-pipe-39" + ], + "install_type": "git-clone", + "description": "Modify text by condition." + }, + { + "author": "Big Idea Technology", + "title": "Image Text Overlay Node for ComfyUI [DEPRECATED]", + "reference": "https://github.com/Big-Idea-Technology/ComfyUI_Image_Text_Overlay", + "files": [ + "https://github.com/Big-Idea-Technology/ComfyUI_Image_Text_Overlay" + ], + "install_type": "git-clone", + "description": "Please note that the ImageTextOverlay project is no longer supported and has been moved to a new repository. For ongoing developments, contributions, and issues, please refer to the new repository at: [a/https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools](https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools)" + }, + { + "author": "mlinmg", + "title": "LaMa Preprocessor [DEPRECATED]", + "reference": "https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor", + "files": [ + "https://github.com/mlinmg/ComfyUI-LaMA-Preprocessor" + ], + "install_type": "git-clone", + "description": "A LaMa prerocessor for ComfyUI. This preprocessor finally enable users to generate coherent inpaint and outpaint prompt-free. The best results are given on landscapes, not so much in drawings/animation." + }, + { + "author": "CapsAdmin", + "title": "ComfyUI-Euler-Smea-Dyn-Sampler [DEPRECATED]", + "reference": "https://github.com/CapsAdmin/ComfyUI-Euler-Smea-Dyn-Sampler", + "files": [ + "https://github.com/CapsAdmin/ComfyUI-Euler-Smea-Dyn-Sampler" + ], + "install_type": "git-clone", + "description": "Just a comfyui version of [a/Euler Smea Dyn Sampler](https://github.com/Koishi-Star/Euler-Smea-Dyn-Sampler). It adds the sampler directly to existing samplers." + }, + { + "author": "BlakeOne", + "title": "ComfyUI FastImageListToImageBatch [REMOVED]", + "reference": "https://github.com/BlakeOne/ComfyUI-FastImageListToImageBatch", + "files": [ + "https://github.com/BlakeOne/ComfyUI-FastImageListToImageBatch" + ], + "install_type": "git-clone", + "description": "Quickly convert a list of images to a batch of images. All images must be the same size. Great for long videos." + }, + { + "author": "ggpid", + "title": "idpark_custom_node [REMOVED]", + "reference": "https://github.com/ggpid/idpark_custom_node", + "files": [ + "https://github.com/ggpid/idpark_custom_node" + ], + "install_type": "git-clone", + "description": "Nodes:Load Image from S3, Save Image to S3, Generate SAM, Generate FastSAM, Cut by Mask fixed" + }, + { + "author": "Davemane42", + "title": "Visual Area Conditioning / Latent composition [DEPRECATED]", + "reference": "https://github.com/Davemane42/ComfyUI_Dave_CustomNode", + "files": [ + "https://github.com/Davemane42/ComfyUI_Dave_CustomNode" + ], + "install_type": "git-clone", + "description": "This tool provides custom nodes that allow visualization and configuration of area conditioning and latent composite." + }, + { + "author": "laksjdjf", + "title": "LoRA-Merger-ComfyUI [DEPRECATED]", + "reference": "https://github.com/laksjdjf/LoRA-Merger-ComfyUI", + "files": [ + "https://github.com/laksjdjf/LoRA-Merger-ComfyUI" + ], + "install_type": "git-clone", + "description": "Nodes:Load LoRA Weight Only, Load LoRA from Weight, Merge LoRA, Save LoRA. This extension provides nodes for merging LoRA." + }, + { + "author": "kinfolk0117", + "title": "TiledIPAdapter [DEPRECATED]", + "reference": "https://github.com/kinfolk0117/ComfyUI_TiledIPAdapter", + "files": [ + "https://github.com/kinfolk0117/ComfyUI_TiledIPAdapter" + ], + "install_type": "git-clone", + "description": "Proof of concent on how to use IPAdapter to control tiled upscaling. NOTE: You need to have 'ComfyUI_IPAdapter_plus' installed." + }, + { + "author": "XINZHANG-ops", + "title": "comfyui-xin-nodes [REMOVED]", + "reference": "https://github.com/XINZHANG-ops/comfyui-xin-nodes", + "files": [ + "https://github.com/XINZHANG-ops/comfyui-xin-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:ImageSizeClassifer, RandomInt, ShowValue" + }, + { + "author": "ssitu", + "title": "NestedNodeBuilder [DEPRECATED]", + "reference": "https://github.com/ssitu/ComfyUI_NestedNodeBuilder", + "files": [ + "https://github.com/ssitu/ComfyUI_NestedNodeBuilder" + ], + "install_type": "git-clone", + "description": "This extension provides the ability to combine multiple nodes into a single node.\nNOTE:An identical feature now exists in ComfyUI. Additionally, this extension is largely broken with the recent versions of the codebase, so please use the built-in feature for group nodes." + }, + { + "author": "ccvv804", + "title": "ComfyUI StableCascade using diffusers for Low VRAM [DEPRECATED]", + "reference": "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM", + "files": [ + "https://github.com/ccvv804/ComfyUI-DiffusersStableCascade-LowVRAM" + ], + "install_type": "git-clone", + "description": "Works with RTX 4070ti 12GB.\nSimple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!" + }, + { + "author": "kijai", + "title": "ComfyUI StableCascade using diffusers [DEPRECATED]", + "reference": "https://github.com/kijai/ComfyUI-DiffusersStableCascade", + "files": [ + "https://github.com/kijai/ComfyUI-DiffusersStableCascade" + ], + "install_type": "git-clone", + "description": "Simple quick wrapper for [a/https://huggingface.co/stabilityai/stable-cascade](https://huggingface.co/stabilityai/stable-cascade)\nComfy is going to implement this properly soon, this repo is just for quick testing for the impatient!" + }, + { + "author": "solarpush", + "title": "comfyui_sendimage_node [REMOVED]", + "reference": "https://github.com/solarpush/comfyui_sendimage_node", + "files": [ + "https://github.com/solarpush/comfyui_sendimage_node" + ], + "install_type": "git-clone", + "description": "Send images to the pod." + }, + { + "author": "azazeal04", + "title": "ComfyUI-Styles", + "reference": "https://github.com/azazeal04/ComfyUI-Styles", + "files": [ + "https://github.com/azazeal04/ComfyUI-Styles" + ], + "install_type": "git-clone", + "description": "Nodes:Anime_Styler, Fantasy_Styler, Gothic_Styler, Line_Art_Styler, Movie_Poster_Styler, Punk_Styler, Travel_Poster_Styler. This extension offers 8 art style nodes, each of which includes approximately 50 individual style variations.\n\nNOTE: Due to the dynamic nature of node name definitions, ComfyUI-Manager cannot recognize the node list from this extension. The Missing nodes and Badge features are not available for this extension.\nNOTE: This extension is removed. Users who were previously using this node should install ComfyUI-styles-all instead." + }, + { + "author": "hnmr293", + "title": "ComfyUI-nodes-hnmr", + "reference": "https://github.com/hnmr293/ComfyUI-nodes-hnmr", + "files": [ + "https://github.com/hnmr293/ComfyUI-nodes-hnmr" + ], + "install_type": "git-clone", + "description": "Provide various custom nodes for Latent, Sampling, Model, Loader, Image, Text" + }, + { + "author": "bvhari", + "title": "ComfyUI_PerpNeg [WIP]", + "reference": "https://github.com/bvhari/ComfyUI_PerpNeg", + "files": [ + "https://github.com/bvhari/ComfyUI_PerpNeg" + ], + "install_type": "git-clone", + "description": "Nodes: KSampler (Advanced + Perp-Neg). Implementation of [a/Perp-Neg](https://perp-neg.github.io/)\nIncludes Tonemap and CFG Rescale optionsComfyUI custom node to convert latent to RGB.[w/WARNING: Experimental code, might have incompatibilities and edge cases.]\nNOTE: In the latest version of ComfyUI, this extension is included as built-in." + }, + { + "author": "laksjdjf", + "title": "IPAdapter-ComfyUI", + "reference": "https://github.com/laksjdjf/IPAdapter-ComfyUI", + "files": [ + "https://github.com/laksjdjf/IPAdapter-ComfyUI" + ], + "install_type": "git-clone", + "description": "This custom nodes provides loader of the IP-Adapter model.[w/NOTE: To use this extension node, you need to download the [a/ip-adapter_sd15.bin](https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15.bin) file and place it in the %%**custom_nodes/IPAdapter-ComfyUI/models**%% directory. Additionally, you need to download the 'Clip vision model' from the 'Install models' menu as well.]
    NOTE: Use ComfyUI_IPAdapter_plus instead of this." + }, + { + "author": "RockOfFire", + "title": "CR Animation Nodes", + "reference": "https://github.com/RockOfFire/CR_Animation_Nodes", + "files": [ + "https://github.com/RockOfFire/CR_Animation_Nodes" + ], + "install_type": "git-clone", + "description": "A comprehensive suite of nodes to enhance your animations. These nodes include some features similar to Deforum, and also some new ideas.
    NOTE: This node is merged into Comfyroll Custom Nodes." + }, + { + "author": "tkoenig89", + "title": "Load Image with metadata", + "reference": "https://github.com/tkoenig89/ComfyUI_Load_Image_With_Metadata", + "files": [ + "https://github.com/tkoenig89/ComfyUI_Load_Image_With_Metadata" + ], + "install_type": "git-clone", + "description": "A custom node for comfy ui to read generation data from images (prompt, seed, size...). This could be used when upscaling generated images to use the original prompt and seed." + }, + { + "author": "LucianoCirino", + "title": "Efficiency Nodes for ComfyUI [LEGACY]", + "reference": "https://github.com/LucianoCirino/efficiency-nodes-comfyui", + "files": [ + "https://github.com/LucianoCirino/efficiency-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "A collection of ComfyUI custom nodes to help streamline workflows and reduce total node count.
    NOTE: This repository is the original repository but is no longer maintained. Please use the forked version by jags." + }, + { + "author": "GeLi1989", + "title": "roop nodes for ComfyUI", + "reference": "https://github.com/GeLi1989/GK-beifen-ComfyUI_roop", + "files": [ + "https://github.com/GeLi1989/GK-beifen-ComfyUI_roop" + ], + "install_type": "git-clone", + "description": "ComfyUI nodes for the roop A1111 webui script. NOTE: Need to download model to use this node. NOTE: This is removed." + }, + { + "author": "ProDALOR", + "title": "comfyui_u2net", + "reference": "https://github.com/ProDALOR/comfyui_u2net", + "files": [ + "https://github.com/ProDALOR/comfyui_u2net" + ], + "install_type": "git-clone", + "description": "Nodes: Load U2Net model, U2Net segmentation, To mask, Segmentation to mask, U2NetBaseNormalization, U2NetMaxNormalization. NOTE: This is removed." + }, + { + "author": "FizzleDorf", + "title": "AIT", + "reference": "https://github.com/FizzleDorf/AIT", + "files": [ + "https://github.com/FizzleDorf/AIT" + ], + "install_type": "git-clone", + "description": "Nodes: Load AITemplate, Load AITemplate (ControlNet), VAE Decode (AITemplate), VAE Encode (AITemplate), VAE Encode (AITemplate, Inpaint). Experimental usage of AITemplate. NOTE: This is deprecated extension. Use ComfyUI-AIT instead of this." + }, + { + "author": "chenbaiyujason", + "title": "sc-node-comfyui", + "reference": "https://github.com/chenbaiyujason/sc-node-comfyui", + "files": [ + "https://github.com/chenbaiyujason/sc-node-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes for GPT interaction and text manipulation" + }, + { + "author": "asd417", + "title": "CheckpointTomeLoader", + "reference": "https://github.com/asd417/tomeSD_for_Comfy", + "files": [ + "https://github.com/ltdrdata/ComfyUI-tomeSD-installer" + ], + "install_type": "git-clone", + "description": "tomeSD(https://github.com/dbolya/tomesd) applied to ComfyUI stable diffusion UI using custom node. Note:In vanilla ComfyUI, the TomePatchModel node is provided as a built-in feature." + }, + { + "author": "gamert", + "title": "ComfyUI_tagger", + "reference": "https://github.com/gamert/ComfyUI_tagger", + "pip": ["gradio"], + "files": [ + "https://github.com/gamert/ComfyUI_tagger" + ], + "install_type": "git-clone", + "description": "Nodes: CLIPTextEncodeTaggerDD, ImageTaggerDD.

    WARNING: Installing the current version is causing an issue where ComfyUI fails to start.

    " + }, + { + "author": "Fannovel16", + "title": "ControlNet Preprocessors", + "reference": "https://github.com/Fannovel16/comfy_controlnet_preprocessors", + "files": [ + "https://github.com/Fannovel16/comfy_controlnet_preprocessors" + ], + "install_type": "git-clone", + "description": "ControlNet Preprocessors. (To use this extension, you need to download the required model file from Install Models)

    NOTE: Please uninstall this custom node and instead install 'ComfyUI's ControlNet Auxiliary Preprocessors' from the default channel.
    To use nodes belonging to controlnet v1 such as Canny_Edge_Preprocessor, MIDAS_Depth_Map_Preprocessor, Uniformer_SemSegPreprocessor, etc., you need to copy the config.yaml.example file to config.yaml and change skip_v1: True to skip_v1: False.

    " + }, + { + "author": "comfyanonymous", + "title": "ComfyUI_experiments/sampler_tonemap", + "reference": "https://github.com/comfyanonymous/ComfyUI_experiments", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/sampler_tonemap.py" + ], + "install_type": "copy", + "description": "ModelSamplerTonemapNoiseTest a node that makes the sampler use a simple tonemapping algorithm to tonemap the noise. It will let you use higher CFG without breaking the image. To using higher CFG lower the multiplier value. Similar to Dynamic Thresholding extension of A1111. " + }, + { + "author": "comfyanonymous", + "title": "ComfyUI_experiments/sampler_rescalecfg", + "reference": "https://github.com/comfyanonymous/ComfyUI_experiments", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/sampler_rescalecfg.py" + ], + "install_type": "copy", + "description": "RescaleClassifierFreeGuidance improves the problem of images being degraded by high CFG.To using higher CFG lower the multiplier value. Similar to Dynamic Thresholding extension of A1111. (reference paper)

    It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.

    " + }, + { + "author": "comfyanonymous", + "title": "ComfyUI_experiments/advanced_model_merging", + "reference": "https://github.com/comfyanonymous/ComfyUI_experiments", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/advanced_model_merging.py" + ], + "install_type": "copy", + "description": "This provides a detailed model merge feature based on block weight. ModelMergeBlock, in vanilla ComfyUI, allows for adjusting the ratios of input/middle/output layers, but this node provides ratio adjustments for all blocks within each layer.

    It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.

    " + }, + { + "author": "comfyanonymous", + "title": "ComfyUI_experiments/sdxl_model_merging", + "reference": "https://github.com/comfyanonymous/ComfyUI_experiments", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/sdxl_model_merging.py" + ], + "install_type": "copy", + "description": "These nodes provide the capability to merge SDXL base models.

    It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.

    " + }, + { + "author": "comfyanonymous", + "title": "ComfyUI_experiments/reference_only", + "reference": "https://github.com/comfyanonymous/ComfyUI_experiments", + "files": [ + "https://github.com/comfyanonymous/ComfyUI_experiments/raw/master/reference_only.py" + ], + "install_type": "copy", + "description": "This node provides functionality corresponding to Reference only in Controlnet.

    It is recommended to use the integrated custom nodes in the default channel for update support rather than installing individual nodes.

    " + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/extension-node-map.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/extension-node-map.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/legacy/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/legacy/model-list.json new file mode 100644 index 000000000..8e3e1dc48 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/legacy/model-list.json @@ -0,0 +1,3 @@ +{ + "models": [] +} diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/alter-list.json b/custom_nodes/ComfyUI-Manager/node_db/new/alter-list.json new file mode 100644 index 000000000..072c3bb5e --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/new/alter-list.json @@ -0,0 +1,4 @@ +{ + "items": [ + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/new/custom-node-list.json new file mode 100644 index 000000000..72f9e2906 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/new/custom-node-list.json @@ -0,0 +1,702 @@ +{ + "custom_nodes": [ + { + "author": "#NOTICE_1.13", + "title": "NOTICE: This channel is not the default channel.", + "reference": "https://github.com/ltdrdata/ComfyUI-Manager","files": [], + "install_type": "git-clone", + "description": "If you see this message, your ComfyUI-Manager is outdated.\nRecent channel provides only the list of the latest nodes. If you want to find the complete node list, please go to the Default channel.\nMaking LoRA has never been easier!" + }, + + + + + { + "author": "Extraltodeus", + "title": "pre_cfg_comfy_nodes_for_ComfyUI", + "id": "precfg", + "reference": "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI", + "files": [ + "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI" + ], + "install_type": "git-clone", + "description": "A set of nodes to prepare the noise predictions before the CFG function" + }, + { + "author": "ZZXYWQ", + "title": "ZZX Nodes", + "id": "ZZXYWQ", + "reference": "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ", + "files": [ + "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ" + ], + "install_type": "git-clone", + "description": "Node(s): VideoFormatConverter(VFC)" + }, + { + "author": "smthemex", + "title": "ComfyUI_AnyDoor", + "id": "ComfyUI_AnyDoor", + "reference": "https://github.com/smthemex/ComfyUI_AnyDoor", + "files": [ + "https://github.com/smthemex/ComfyUI_AnyDoor" + ], + "install_type": "git-clone", + "description": "You can use anydoor, change clothes or object..." + }, + { + "author": "Haoming02", + "title": "ComfyUI Node Beautify", + "reference": "https://github.com/Haoming02/comfyui-node-beautify", + "files": [ + "https://github.com/Haoming02/comfyui-node-beautify" + ], + "install_type": "git-clone", + "description": "This is an Extension for ComfyUI, which helps formatting the workflow." + }, + { + "author": "adigayung", + "title": "ComfyUI-Translator", + "reference": "https://github.com/adigayung/ComfyUI-Translator", + "files": [ + "https://github.com/adigayung/ComfyUI-Translator" + ], + "install_type": "git-clone", + "description": "Auto translate all languages ​​to english" + }, + { + "author": "christian-byrne", + "title": "comfyui-default-values-manager", + "reference": "https://github.com/christian-byrne/comfyui-default-values-manager", + "files": [ + "https://github.com/christian-byrne/comfyui-default-values-manager" + ], + "install_type": "git-clone", + "description": "comfyui-default-values-manager" + }, + { + "author": "vivax3794", + "title": "ComfyUI-Sub-Nodes", + "reference": "https://github.com/vivax3794/ComfyUI-Sub-Nodes", + "files": [ + "https://github.com/vivax3794/ComfyUI-Sub-Nodes" + ], + "install_type": "git-clone", + "description": "Creating subgraph and Calling subgraphs." + }, + { + "author": "HECer", + "title": "ComfyUI-FilePathCreator", + "reference": "https://github.com/HECer/ComfyUI-FilePathCreator", + "files": [ + "https://github.com/HECer/ComfyUI-FilePathCreator" + ], + "install_type": "git-clone", + "description": "The ComfyUI-FilePathCreator is a custom node extension for ComfyUI designed to generate dynamic filenames based on user-defined parameters. This node helps streamline the process of creating organized and timestamped filenames, ideal for saving output files in a structured manner." + }, + { + "author": "mullakhmetov", + "title": "comfyui_dynamic_util_nodes", + "reference": "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes", + "files": [ + "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes" + ], + "install_type": "git-clone", + "description": "ComfyS3 helpful util nodes for dynamic workflows" + }, + { + "author": "wTechArtist", + "title": "ComfyUI-CustomNodes", + "reference": "https://github.com/wTechArtist/ComfyUI-CustomNodes", + "files": [ + "https://github.com/wTechArtist/ComfyUI-CustomNodes" + ], + "install_type": "git-clone", + "description": "Nodes:Image Blending Mode Mask" + }, + { + "author": "bradsec", + "title": "ComfyUI_StringTools", + "id": "stringtools", + "reference": "https://github.com/bradsec/ComfyUI_StringTools", + "files": [ + "https://github.com/bradsec/ComfyUI_StringTools" + ], + "install_type": "git-clone", + "description": "Some simple string tools to modify text and strings in ComfyUI." + }, + { + "author": "bluevisor", + "title": "ComfyUI_PS_Blend_Node", + "reference": "https://github.com/bluevisor/ComfyUI_PS_Blend_Node", + "files": [ + "https://github.com/bluevisor/ComfyUI_PS_Blend_Node" + ], + "install_type": "git-clone", + "description": "This repository contains a simple custom node for ComfyUI that implements familiar PS-style blend modes using PyTorch. The PSBlendNode allows you to blend two images together using a variety of blend modes and an opacity parameter." + }, + { + "author": "longgui0318", + "title": "comfyui-common-util", + "id": "common-util", + "reference": "https://github.com/longgui0318/comfyui-common-util", + "files": [ + "https://github.com/longgui0318/comfyui-common-util" + ], + "install_type": "git-clone", + "description": "Nodes:Init Layer Info Array, Added Layer Info To Array, Layer Info Array Fuse, Layer Image Seleted, Layer Images IPAdapter Advanced, Enhanced Random Light Source" + }, + { + "author": "kijai", + "title": "ComfyUI-KwaiKolorsWrapper", + "id": "kwaikolors", + "reference": "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper" + ], + "install_type": "git-clone", + "description": "Rudimentary wrapper that runs [a/Kwai-Kolors](https://huggingface.co/Kwai-Kolors/Kolors) text2image pipeline using diffusers." + }, + { + "author": "Smuzzies", + "title": "comfyui_meme_maker", + "reference": "https://github.com/Smuzzies/comfyui_meme_maker", + "files": [ + "https://github.com/Smuzzies/comfyui_meme_maker" + ], + "install_type": "git-clone", + "description": "Meme Maker Node for ComfyUI." + }, + { + "author": "kijai", + "title": "ComfyUI-LivePortraitKJ", + "id": "liveportrait-kijai", + "reference": "https://github.com/kijai/ComfyUI-LivePortraitKJ", + "files": [ + "https://github.com/kijai/ComfyUI-LivePortraitKJ" + ], + "install_type": "git-clone", + "description": "Nodes for [a/LivePortrait](https://github.com/KwaiVGI/LivePortrait), insightface is required" + }, + { + "author": "metncelik", + "title": "comfyui_met_suite", + "reference": "https://github.com/metncelik/comfyui_met_suite", + "files": [ + "https://github.com/metncelik/comfyui_met_suite" + ], + "install_type": "git-clone", + "description": "Nodes: Primitive BBOX, BBOX Padding, BBOX Resize, ImageResize KeepRatio." + }, + { + "author": "shadowcz007", + "title": "comfyui-liveportrait", + "id": "liveportrait", + "reference": "https://github.com/shadowcz007/comfyui-liveportrait", + "files": [ + "https://github.com/shadowcz007/comfyui-liveportrait" + ], + "install_type": "git-clone", + "description": "The ComfyUI version of [a/LivePortrait](https://github.com/KwaiVGI/LivePortrait)." + }, + { + "author": "Tritant", + "title": "ComfyUI-CreaPrompt", + "id": "creaprompt", + "reference": "https://github.com/tritant/ComfyUI_CreaPrompt", + "files": [ + "https://github.com/tritant/ComfyUI_CreaPrompt" + ], + "install_type": "git-clone", + "description": "Generate random prompts easily." + }, + { + "author": "kijai", + "title": "ComfyUI-MimicMotionWrapper", + "id": "mimicmotion-kijai", + "reference": "https://github.com/kijai/ComfyUI-MimicMotionWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-MimicMotionWrapper" + ], + "install_type": "git-clone", + "description": "Optimized wrapper nodes for MimicMotion: [a/https://github.com/tencent/MimicMotion](https://github.com/tencent/MimicMotion)" + }, + { + "author": "kijai", + "title": "ComfyUI-OpenDiTWrapper", + "id": "opendit-kijai", + "reference": "https://github.com/kijai/ComfyUI-OpenDiTWrapper", + "files": [ + "https://github.com/kijai/ComfyUI-OpenDiTWrapper" + ], + "install_type": "git-clone", + "description": "Wrapper nodes for OpenDiT: [a/OpenDiT](https://github.com/NUS-HPC-AI-Lab/OpenDiT/), supports Open-Sora t2i and i2i" + }, + { + "author": "smthemex", + "title": "ComfyUI_MS_Diffusion", + "id": "MS_Diffusion", + "reference": "https://github.com/smthemex/ComfyUI_MS_Diffusion", + "files": [ + "https://github.com/smthemex/ComfyUI_MS_Diffusion" + ], + "install_type": "git-clone", + "description": "You can using MS-diffusion make story in comfyUI." + }, + { + "author": "christian-byrne", + "title": "audio-separation-nodes-comfyui", + "reference": "https://github.com/christian-byrne/audio-separation-nodes-comfyui", + "files": [ + "https://github.com/christian-byrne/audio-separation-nodes-comfyui" + ], + "install_type": "git-clone", + "description": "Nodes:AudioSeparation, AudioCrop, AudioCombine, AudioTempoMatch." + }, + { + "author": "yiwangsimple", + "title": "comfy-groqchat", + "reference": "https://github.com/yiwangsimple/ComfyUI_GroqChat", + "files": [ + "https://github.com/yiwangsimple/ComfyUI_GroqChat" + ], + "install_type": "git-clone", + "description": "Content generation with open source models in comfyui via graq api implementation." + }, + { + "author": "AIFSH", + "title": "ComfyUI-MimicMotion", + "id": "mimicmotion-aifsh", + "reference": "https://github.com/AIFSH/ComfyUI-MimicMotion", + "files": [ + "https://github.com/AIFSH/ComfyUI-MimicMotion" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/MimicMotion](https://github.com/Tencent/MimicMotion)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-DiffSynth-Studio", + "id": "diffsynth-studio", + "reference": "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio", + "files": [ + "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio" + ], + "install_type": "git-clone", + "description": "make [a/DiffSynth-Studio](https://github.com/modelscope/DiffSynth-Studio) available in ComfyUI" + }, + { + "author": "1038lab", + "title": "ComfyUI-latentSizeSelector", + "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": "AIFSH", + "title": "ComfyUI-I2V-Adapter", + "id": "i2v-adapter", + "reference": "https://github.com/AIFSH/ComfyUI-I2V-Adapter", + "files": [ + "https://github.com/AIFSH/ComfyUI-I2V-Adapter" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/I2V-Adapter](https://github.com/KwaiVGI/I2V-Adapter)" + }, + { + "author": "DeJoker", + "title": "Pipeline Parallel ComfyUI", + "reference": "https://github.com/DeJoker/pipeline-parallel-comfy", + "files": [ + "https://github.com/DeJoker/pipeline-parallel-comfy" + ], + "install_type": "git-clone", + "description": "provide extra api to run prompt request with parallel execution of independent node" + }, + { + "author": "AIFSH", + "title": "ComfyUI-MARS5-TTS", + "id": "mars5-tts", + "reference": "https://github.com/AIFSH/ComfyUI-MARS5-TTS", + "files": [ + "https://github.com/AIFSH/ComfyUI-MARS5-TTS" + ], + "install_type": "git-clone", + "description": "a comfyui custom node for [a/MARS5-TTS](https://github.com/Camb-ai/MARS5-TTS)" + }, + { + "author": "MrSamSeen", + "title": "ComfyUI_SSStereoscope", + "id": "ssstereoscope", + "reference": "https://github.com/MrSamSeen/ComfyUI_SSStereoscope", + "files": [ + "https://github.com/MrSamSeen/ComfyUI_SSStereoscope" + ], + "install_type": "git-clone", + "description": "The SideBySide Node is a powerful tool designed for ComfyUI to generate stereoscopic images. It takes a base image and a corresponding depth map as inputs and produces a combined image that simulates a 3D effect when viewed with appropriate equipment." + }, + { + "author": "jroc22", + "title": "ComfyUI-CSV-prompt-builder", + "id": "csv-prompt-builder", + "reference": "https://github.com/jroc22/ComfyUI-CSV-prompt-builder", + "files": [ + "https://github.com/jroc22/ComfyUI-CSV-prompt-builder" + ], + "install_type": "git-clone", + "description": "This is a simple node for creating prompts using a .csv file. I created this node as an easy way to output different prompts each time a workflow is run." + }, + { + "author": "ImmortalPie", + "title": "PonySwitch Node", + "reference": "https://github.com/ImmortalPie/ComfyUI-PonySwitch", + "files": [ + "https://github.com/ImmortalPie/ComfyUI-PonySwitch/raw/main/PonySwitch.py" + ], + "install_type": "copy", + "description": "The PonySwitch node is a custom node for ComfyUI that modifies prompts based on a toggle switch and adds configurable pony tags." + }, + { + "author": "SEkINVR", + "title": "ComfyUI SaveAS", + "id": "saveas", + "reference": "https://github.com/SEkINVR/ComfyUI-SaveAs", + "files": [ + "https://github.com/SEkINVR/ComfyUI-SaveAs" + ], + "install_type": "git-clone", + "description": "This custom node for ComfyUI allows you to save images in multiple formats, including PNG, JPG, WebP, and ICO.\n[w/ComfyUI-Save-Multi-Format is renamed to SaveAs. Remove previous one and reinstall to this.]" + }, + { + "author": "Fuou Marinas", + "title": "ComfyUI-FirstOrderMM", + "id": "fomm", + "reference": "https://github.com/FuouM/ComfyUI-FirstOrderMM", + "files": [ + "https://github.com/FuouM/ComfyUI-FirstOrderMM" + ], + "install_type": "git-clone", + "description": "Run [a/First Order Motion Model](https://github.com/AliaksandrSiarohin/first-order-model) for Image Animation in ComfyUI." + }, + { + "author": "my-opencode", + "title": "ComfyUI_IndustrialMagick", + "id": "industrialmagick", + "reference": "https://github.com/my-opencode/ComfyUI_IndustrialMagick", + "files": [ + "https://github.com/my-opencode/ComfyUI_IndustrialMagick" + ], + "install_type": "git-clone", + "description": "[a/ImageMagick](https://imagemagick.org/index.php) nodes for ComfyUI. Adds nodes to call ImageMagick subprocesses from ComfyUI.\nRequirements: [a/ImagMagick7](https://imagemagick.org/script/download.php), 'magick' command in your CLI environment." + }, + { + "author": "my-opencode", + "title": "ComfyUI_KSamplerTimer", + "id": "ksamplertimer", + "reference": "https://github.com/my-opencode/ComfyUI_KSamplerTimer", + "files": [ + "https://github.com/my-opencode/ComfyUI_KSamplerTimer" + ], + "install_type": "git-clone", + "description": "A custom node that returns the generation time of the KSampler. Intended for benchmarking or debugging." + }, + { + "author": "licyk", + "title": "ComfyUI-Restart-Sampler", + "id": "restart-sampler-licyk", + "reference": "https://github.com/licyk/ComfyUI-Restart-Sampler", + "files": [ + "https://github.com/licyk/ComfyUI-Restart-Sampler" + ], + "install_type": "git-clone", + "description": "This extension is a node that directly expands the functionality of KSampler, rather than being in the form of a custom node. [w/Workflows created using this feature are not compatible with other users.]" + }, + { + "author": "pamparamm", + "title": "ComfyUI Vectorscope CC", + "id": "vectorscope", + "reference": "https://github.com/pamparamm/ComfyUI-vectorscope-cc", + "files": [ + "https://github.com/pamparamm/ComfyUI-vectorscope-cc" + ], + "install_type": "git-clone", + "description": "ComfyUI port of a wonderful extension [a/SD Webui Vectorscope CC by Haoming02](https://github.com/Haoming02/sd-webui-vectorscope-cc).\nBased on (and probably incompatible with) [a/ComfyUI Diffusion Color Grading by Haoming02](https://github.com/Haoming02/comfyui-diffusion-cg)." + }, + { + "author": "yuvraj108c", + "title": "ComfyUI YoloNasPose Tensorrt", + "id": "yolonaspose-tensorrt", + "reference": "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt", + "files": [ + "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt" + ], + "install_type": "git-clone", + "description": "This repo provides a ComfyUI Custom Node implementation of [a/YOLO-NAS-POSE](https://github.com/Deci-AI/super-gradients), powered by TensorRT for ultra fast pose estimation. It has been adapted to work with openpose controlnet (experimental)" + }, + { + "author": "GreenLandisaLie", + "title": "AuraSR-ComfyUI", + "id": "aurasr-greenlandisalie", + "reference": "https://github.com/GreenLandisaLie/AuraSR-ComfyUI", + "files": [ + "https://github.com/GreenLandisaLie/AuraSR-ComfyUI" + ], + "install_type": "git-clone", + "description": "ComfyUI implementation of [a/Aura-SR](https://github.com/fal-ai/aura-sr)" + }, + { + "author": "mingqizhang", + "title": "ComfyUI_InSPyResNet_zmq", + "id": "inspy", + "reference": "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq", + "files": [ + "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq" + ], + "install_type": "git-clone", + "description": "Nodes:INSPY removebg ModelLoader, INSPY RMBG" + }, + { + "author": "hwhaocool", + "title": "ComfyUI-Select-Any", + "id": "select-any", + "reference": "https://github.com/hwhaocool/ComfyUI-Select-Any", + "files": [ + "https://github.com/hwhaocool/ComfyUI-Select-Any" + ], + "install_type": "git-clone", + "description": "a comfyui custom node, which can select value from inputs" + }, + { + "author": "leiweiqiang", + "title": "ComfyUI-TRA", + "id": "tra", + "reference": "https://github.com/leiweiqiang/ComfyUI-TRA", + "files": [ + "https://github.com/leiweiqiang/ComfyUI-TRA" + ], + "install_type": "git-clone", + "description": "Nodes:TCL EbSynth, TCL Extract Frames (From File), TCL Extract Frames (From Video), TCL Combine Frames, TCL Save Video (From Frames)" + }, + { + "author": "AIFSH", + "title": "ComfyUI-AuraSR", + "id": "aurasr", + "reference": "https://github.com/AIFSH/ComfyUI-AuraSR", + "files": [ + "https://github.com/AIFSH/ComfyUI-AuraSR" + ], + "install_type": "git-clone", + "description": "a node for [a/AuraSR](https://github.com/fal-ai/aura-sr)" + }, + { + "author": "veighnsche", + "title": "comfyui_gr85", + "id": "gr85", + "reference": "https://github.com/veighnsche/comfyui_gr85", + "files": [ + "https://github.com/veighnsche/comfyui_gr85" + ], + "install_type": "git-clone", + "description": "Nodes:Image Dimension Resizer, Image Sizer, Random Ratio, Show Text, Random Title Character, Random Wildcard Tag Picker, Random Show Atm Loc Outfit, Contains Word, Elements Concatenator, ..." + }, + { + "author": "hyunamy", + "title": "Comfy-UI on-complete-email-me", + "id": "hyunamy", + "reference": "https://github.com/hyunamy/comfy-ui-on-complete-email-me", + "files": [ + "https://github.com/hyunamy/comfy-ui-on-complete-email-me" + ], + "install_type": "git-clone", + "description": "A feature that sends an email via Gmail once image generation is completed in Comfy-ui." + }, + { + "author": "rhdunn", + "title": "comfyui-bus-plugin", + "id": "bus", + "reference": "https://github.com/rhdunn/comfyui-bus-plugin", + "files": [ + "https://github.com/rhdunn/comfyui-bus-plugin" + ], + "install_type": "git-clone", + "description": "A collection of nodes for rerouting multiple I/O lines together in a bus." + }, + { + "author": "hay86", + "title": "ComfyUI Hallo", + "id": "hallo-hay86", + "reference": "https://github.com/hay86/ComfyUI_Hallo", + "files": [ + "https://github.com/hay86/ComfyUI_Hallo" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of [a/hallo](https://github.com/fudan-generative-vision/hallo) for ComfyUI" + }, + { + "author": "AI2lab", + "title": "comfyUI-siliconflow-api-2lab", + "id": "siliconflow", + "reference": "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab", + "files": [ + "https://github.com/AI2lab/comfyUI-siliconflow-api-2lab" + ], + "install_type": "git-clone", + "description": "Unofficial implementation of siliconflow API for ComfyUI\nHow to use:apply api key in :https://cloud.siliconflow.cn/\nadd api key in config.json" + }, + { + "author": "11dogzi", + "title": "ComfUI-EGAdapterMadAssistant", + "id": "ergouzi-samplers", + "reference": "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant", + "files": [ + "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant" + ], + "install_type": "git-clone", + "description": "This is a hierarchical auxiliary project of the IPAdapter project, which uses a slider to quickly control the hierarchical weights and add fully random and semi random modes" + }, + { + "author": "iwanders", + "title": "iwanders/ComfyUI_nodes", + "id": "iwanders-nodes", + "reference": "https://github.com/iwanders/ComfyUI_nodes", + "files": [ + "https://github.com/iwanders/ComfyUI_nodes" + ], + "install_type": "git-clone", + "description": "Nodes:IW SaveString, IW PrintString, IW ReplaceString, IW StringNode, IW StringConcat, IW TokenizerVocab, IW JsonPickItem." + }, + { + "author": "SaltAI", + "title": "SaltAI_AudioViz", + "id": "saltai-audioviz", + "reference": "https://github.com/get-salt-AI/SaltAI_AudioViz", + "files": [ + "https://github.com/get-salt-AI/SaltAI_AudioViz" + ], + "install_type": "git-clone", + "description": "SaltAI AudioViz contains ComfyUI nodes for generating complex audio reactive visualizations" + }, + { + "author": "AI2lab", + "title": "comfyUI-tool-2lab", + "id": "tool-2lab", + "reference": "https://github.com/AI2lab/comfyUI-tool-2lab", + "files": [ + "https://github.com/AI2lab/comfyUI-tool-2lab" + ], + "install_type": "git-clone", + "description": "tool set for developing workflow and publish to web api server" + }, + { + "author": "SherryXieYuchen", + "title": "ComfyUI-Image-Inpainting", + "id": "image-inpainting", + "reference": "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting", + "files": [ + "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting" + ], + "install_type": "git-clone", + "description": "Nodes:VAE Encode Inpaint, VAE Decode Inpaint, ColorCorrection Inpaint, ImagePreprocess Inpaint, ImagePostprocess Inpaint, Load Model Inpaint, Inpainting (using Model)" + }, + { + "author": "zeroxoxo", + "title": "ComfyUI-Fast-Style-Transfer", + "id": "fast-style-transfer", + "reference": "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer", + "files": [ + "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer" + ], + "install_type": "git-clone", + "description": "ComfyUI node for fast neural style transfer. This is a simple conversion based on this: [a/https://github.com/rrmina/fast-neural-style-pytorch](https://github.com/rrmina/fast-neural-style-pytorch) Only basic inference functionality is ported for now." + }, + { + "author": "Shibiko-AI", + "title": "Shibiko AI ComfyUI Tools", + "id": "shibiko-ai-tools", + "reference": "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools", + "files": [ + "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools" + ], + "install_type": "git-clone", + "description": "This is a collection of tools that I use to make my life easier when developing ComfyUI applications. It is a collection of tools that I have created to help me with my development process. I have decided to share these tools with the community in the hopes that they will be useful to others as well. I use this tools to further develop features for [a/https://shibiko.ai](https://shibiko.ai)" + }, + { + "author": "fofr", + "title": "comfyui-replicate", + "reference": "https://github.com/fofr/comfyui-replicate", + "files": [ + "https://github.com/fofr/comfyui-replicate" + ], + "install_type": "git-clone", + "description": "Nodes:Llama 3 Replicate" + }, + { + "author": "RedRayz", + "title": "ComfyUI-Danbooru-To-WD", + "id": "danbooru2wd", + "reference": "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD", + "files": [ + "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD" + ], + "install_type": "git-clone", + "description": "Converts booru tags to a format suitable for Waifu Diffusion(or Danbooru based models)." + }, + { + "author": "akkyoss", + "title": "ComfyUI_Zwng_Nodes", + "id": "zwng", + "reference": "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes", + "files": [ + "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes" + ], + "install_type": "git-clone", + "description": "Simple nodes for loading image files.Nodes that include a simple remote connection to Photoshop, a node that can overlay and preview an image with a mask, and a node that can load images directly from a file path." + }, + { + "author": "slyt", + "title": "comfyui-ollama-nodes", + "reference": "https://github.com/slyt/comfyui-ollama-nodes", + "files": [ + "https://github.com/slyt/comfyui-ollama-nodes" + ], + "install_type": "git-clone", + "description": "ComfyUI custom nodes for working with [a/Ollama](https://github.com/ollama/ollama).\nNOTE:Assumes that an Ollama server is running at http://127.0.0.1:11434 and accessible by the ComfyUI backend." + }, + { + "author": "MilitantHitchhiker", + "title": "Militant Hitchhiker's Switchblade Pack", + "id": "hitchhiker", + "reference": "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack", + "files": [ + "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack" + ], + "install_type": "git-clone", + "description": "Militant Hitchhiker's Switchblade Pack is a collection of custom nodes for ComfyUI that provide various multi-function capabilities." + }, + { + "author": "turkyden", + "title": "ComfyUI-Avatar", + "id": "avatar", + "reference": "https://github.com/turkyden/ComfyUI-Avatar", + "files": [ + "https://github.com/turkyden/ComfyUI-Avatar" + ], + "install_type": "git-clone", + "description": "a comfyui plugin for image to avatar" + }, + { + "author": "fablestudio", + "title": "ComfyUI-Showrunner-Utils", + "reference": "https://github.com/fablestudio/ComfyUI-Showrunner-Utils", + "files": [ + "https://github.com/fablestudio/ComfyUI-Showrunner-Utils" + ], + "install_type": "git-clone", + "description": "Comfyui Custom Nodes for Showrunner" + } + ] +} diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/new/extension-node-map.json new file mode 100644 index 000000000..8843576b5 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/new/extension-node-map.json @@ -0,0 +1,15962 @@ +{ + "https://gist.github.com/alkemann/7361b8eb966f29c8238fd323409efb68/raw/f9605be0b38d38d3e3a2988f89248ff557010076/alkemann.py": [ + [ + "Int to Text", + "Save A1 Image", + "Seed With Text" + ], + { + "title_aux": "alkemann nodes" + } + ], + "https://git.mmaker.moe/mmaker/sd-webui-color-enhance": [ + [ + "MMakerColorBlend", + "MMakerColorEnhance" + ], + { + "title_aux": "Color Enhance" + } + ], + "https://github.com/0xbitches/ComfyUI-LCM": [ + [ + "LCM_Sampler", + "LCM_Sampler_Advanced", + "LCM_img2img_Sampler", + "LCM_img2img_Sampler_Advanced" + ], + { + "title_aux": "Latent Consistency Model for ComfyUI" + } + ], + "https://github.com/1038lab/ComfyUI-GPT2P": [ + [ + "GPT2PNode" + ], + { + "title_aux": "ComfyUI-GPT2P" + } + ], + "https://github.com/1038lab/ComfyUI_LatentSizeSelector": [ + [ + "LatentSizeSelector" + ], + { + "title_aux": "ComfyUI-latentSizeSelector" + } + ], + "https://github.com/11dogzi/ComfUI-EGAdapterMadAssistant": [ + [ + "EGIPAdapter_Mad_Assistant", + "EGIPAdapter_Mad_AssistantV1", + "EGIPAdapter_Mad_AssistantV2", + "EGIPAdapter_Mad_AssistantV3", + "EGIPAdapter_Mad_AssistantV4", + "EGIPAdapter_Mad_AssistantV5" + ], + { + "title_aux": "ComfUI-EGAdapterMadAssistant" + } + ], + "https://github.com/11dogzi/Comfyui-ergouzi-Nodes": [ + [ + "EG-YSZT-ZT", + "EG_CPSYTJ", + "EG_FX_BDAPI", + "EG_HT_YSTZ", + "EG_JF_ZZSC", + "EG_JXFZ_node", + "EG_K_LATENT", + "EG_RY_HT", + "EG_SCQY_BHDQY", + "EG_SCQY_QBQY", + "EG_SCQY_SXQY", + "EG_SJ", + "EG_SJPJ_Node", + "EG_SS_RYZH", + "EG_SZ_JDYS", + "EG_TC_Node", + "EG_TSCDS_CJ", + "EG_TSCDS_DG", + "EG_TSCDS_FG", + "EG_TSCDS_JT", + "EG_TSCDS_QT", + "EG_TSCDS_RW", + "EG_TSCDS_WP", + "EG_TSCDS_ZL", + "EG_TSCMB_GL", + "EG_TXZZ_ZH", + "EG_TX_CCHQ", + "EG_TX_CJPJ", + "EG_TX_JZRY", + "EG_TX_LJ", + "EG_TX_LJBC", + "EG_TX_SFBLS", + "EG_TX_WHLJ", + "EG_WB_KSH", + "EG_WXZ_QH", + "EG_XZ_QH", + "EG_YSQY_BBLLD", + "EG_YSQY_BLLD", + "EG_ZY_WBK", + "EG_ZZHBCJ", + "EG_ZZKZ_HT_node", + "EG_ZZ_BSYH", + "EG_ZZ_BYYH", + "EG_ZZ_HSYH", + "EG_ZZ_SSKZ", + "ER_JBCH", + "ER_TX_ZZCJ" + ], + { + "title_aux": "Comfyui-ergouzi-Nodes" + } + ], + "https://github.com/11dogzi/Comfyui-ergouzi-samplers": [ + [ + "EGBYZZCYQ", + "EGCYQJB", + "EGCYQJBCJ" + ], + { + "title_aux": "Comfyui-ergouzi-samplers" + } + ], + "https://github.com/1mckw/Comfyui-Gelbooru": [ + [ + "Gelbooru (ID)", + "Gelbooru (Random)" + ], + { + "title_aux": "Comfyui-Gelbooru" + } + ], + "https://github.com/1shadow1/hayo_comfyui_nodes/raw/main/LZCNodes.py": [ + [ + "LoadPILImages", + "MergeImages", + "make_transparentmask", + "tensor_trans_pil", + "words_generatee" + ], + { + "title_aux": "Hayo comfyui nodes" + } + ], + "https://github.com/42lux/ComfyUI-safety-checker": [ + [ + "Safety Checker" + ], + { + "title_aux": "ComfyUI-safety-checker" + } + ], + "https://github.com/438443467/ComfyUI-GPT4V-Image-Captioner": [ + [ + "GPT4VCaptioner", + "Image Load with Metadata", + "SAMIN String Attribute Selector", + "SANMIN Adapt Coordinates", + "SANMIN AdjustTransparency", + "SANMIN BlurMaskArea", + "SANMIN ChineseToCharacter", + "SANMIN ClothingWildcards", + "SANMIN ConvertToEnglish", + "SANMIN EditWildcards", + "SANMIN Float", + "SANMIN LoadPathImagesPreview", + "SANMIN SCALE AND FILL BLACK", + "SANMIN SanmiSaveImageToLocal", + "SANMIN SimpleWildcards", + "SANMIN Upscale And Original Size", + "Samin Counter", + "Samin Load Image Batch" + ], + { + "title_aux": "ComfyUI-GPT4V-Image-Captioner" + } + ], + "https://github.com/54rt1n/ComfyUI-DareMerge": [ + [ + "DM_AdvancedDareModelMerger", + "DM_AdvancedModelMerger", + "DM_AttentionGradient", + "DM_BlockGradient", + "DM_BlockModelMerger", + "DM_DareClipMerger", + "DM_DareModelMergerBlock", + "DM_DareModelMergerElement", + "DM_DareModelMergerMBW", + "DM_GradientEdit", + "DM_GradientOperations", + "DM_GradientReporting", + "DM_InjectNoise", + "DM_LoRALoaderTags", + "DM_LoRAReporting", + "DM_MBWGradient", + "DM_MagnitudeMasker", + "DM_MaskEdit", + "DM_MaskOperations", + "DM_MaskReporting", + "DM_ModelReporting", + "DM_NormalizeModel", + "DM_QuadMasker", + "DM_ShellGradient", + "DM_SimpleMasker" + ], + { + "title_aux": "ComfyUI-DareMerge" + } + ], + "https://github.com/80sVectorz/ComfyUI-Static-Primitives": [ + [ + "FloatStaticPrimitive", + "IntStaticPrimitive", + "StringMlStaticPrimitive", + "StringStaticPrimitive" + ], + { + "title_aux": "ComfyUI-Static-Primitives" + } + ], + "https://github.com/A4P7J1N7M05OT/ComfyUI-AutoColorGimp": [ + [ + "AutoColorGimp" + ], + { + "title_aux": "ComfyUI-AutoColorGimp" + } + ], + "https://github.com/A4P7J1N7M05OT/ComfyUI-PixelOE": [ + [ + "PixelOE" + ], + { + "title_aux": "ComfyUI-PixelOE" + } + ], + "https://github.com/AARG-FAN/Image-Raster-for-ComfyUI": [ + [ + "AIraster" + ], + { + "title_aux": "Image-vector-for-ComfyUI" + } + ], + "https://github.com/AIFSH/ComfyUI-3d-photo-inpainting": [ + [ + "LoadImagePath", + "PreViewVideo", + "TreeDNode" + ], + { + "title_aux": "ComfyUI-3d-photo-inpainting" + } + ], + "https://github.com/AIFSH/ComfyUI-AuraSR": [ + [ + "AuraSRNode" + ], + { + "title_aux": "AIFSH/ComfyUI-AuraSR" + } + ], + "https://github.com/AIFSH/ComfyUI-DiffSynth-Studio": [ + [ + "ControlNetPathLoader", + "DiffTextNode", + "DiffutoonNode", + "ExVideoNode", + "LoadVideo", + "PreViewVideo", + "SDPathLoader" + ], + { + "title_aux": "ComfyUI-DiffSynth-Studio" + } + ], + "https://github.com/AIFSH/ComfyUI-FishSpeech": [ + [ + "FishSpeech_INFER", + "FishSpeech_INFER_SRT", + "LoadAudio", + "LoadSRT", + "PreViewAudio" + ], + { + "title_aux": "ComfyUI-FishSpeech" + } + ], + "https://github.com/AIFSH/ComfyUI-GPT_SoVITS": [ + [ + "GPT_SOVITS_FT", + "GPT_SOVITS_INFER", + "GPT_SOVITS_TTS", + "LoadAudio", + "LoadSRT", + "PreViewAudio" + ], + { + "title_aux": "ComfyUI-GPT_SoVITS" + } + ], + "https://github.com/AIFSH/ComfyUI-Hallo": [ + [ + "HalloNode", + "LoadAudioPath", + "LoadImagePath", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-Hallo" + } + ], + "https://github.com/AIFSH/ComfyUI-I2V-Adapter": [ + [ + "I2V_AdapterNode", + "LoraPathLoader", + "MotionLoraLoader", + "PreViewVideo", + "PromptNode" + ], + { + "title_aux": "ComfyUI-I2V-Adapter" + } + ], + "https://github.com/AIFSH/ComfyUI-IP_LAP": [ + [ + "CombineAudioVideo", + "IP_LAP", + "LoadVideo", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-IP_LAP" + } + ], + "https://github.com/AIFSH/ComfyUI-Live2DViewer": [ + [ + "Live2DViewer", + "LoadAudio" + ], + { + "title_aux": "ComfyUI-Live2DViewer" + } + ], + "https://github.com/AIFSH/ComfyUI-MARS5-TTS": [ + [ + "LoadAudioPath", + "MARS5TTS_Node", + "PreViewAudio", + "TTSTextEncode" + ], + { + "title_aux": "ComfyUI-MARS5-TTS" + } + ], + "https://github.com/AIFSH/ComfyUI-MimicBrush": [ + [ + "MimicBrushNode" + ], + { + "title_aux": "ComfyUI-MimicBrush" + } + ], + "https://github.com/AIFSH/ComfyUI-MimicMotion": [ + [ + "LoadVideo", + "MimicMotionNode", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-MimicMotion" + } + ], + "https://github.com/AIFSH/ComfyUI-MuseTalk_FSH": [ + [ + "CombineAudioVideo", + "LoadVideo", + "MuseTalk", + "MuseTalkRealTime", + "PreViewVideo" + ], + { + "title_aux": "ComfyUI-MuseTalk_FSH" + } + ], + "https://github.com/AIFSH/ComfyUI-RVC": [ + [ + "CombineAudio", + "LoadAudio", + "PreViewAudio", + "RVC_Infer", + "RVC_Train" + ], + { + "title_aux": "ComfyUI-RVC" + } + ], + "https://github.com/AIFSH/ComfyUI-UVR5": [ + [ + "LoadAudioPath", + "PreViewAudio", + "UVR5_Node" + ], + { + "title_aux": "ComfyUI-UVR5" + } + ], + "https://github.com/AIFSH/ComfyUI-UniAnimate": [ + [ + "LoadImagePath", + "LoadVideo", + "PoseAlignNode", + "PreViewVideo", + "UniAnimateNode" + ], + { + "title_aux": "ComfyUI-UniAnimate" + } + ], + "https://github.com/AIFSH/ComfyUI-WhisperX": [ + [ + "LoadAudio", + "PreViewSRT", + "WhisperX" + ], + { + "title_aux": "ComfyUI-WhisperX" + } + ], + "https://github.com/AIFSH/ComfyUI-XTTS": [ + [ + "LoadAudioPath", + "LoadSRT", + "PreViewAudio", + "XTTS_INFER", + "XTTS_INFER_SRT" + ], + { + "title_aux": "ComfyUI-XTTS" + } + ], + "https://github.com/AIFSH/ComfyUI_V-Express": [ + [ + "LoadAudioPath", + "LoadImagePath", + "LoadVideo", + "PreViewVideo", + "VExpress" + ], + { + "title_aux": "ComfyUI_V-Express" + } + ], + "https://github.com/AIGCTeam/ComfyUI_kkTranslator_nodes": [ + [ + "LoadMarianMTCheckPoint", + "PromptBaiduFanyiToText", + "PromptTranslateToText" + ], + { + "title_aux": "ComfyUI_kkTranslator_nodes" + } + ], + "https://github.com/AIGODLIKE/ComfyUI-CUP": [ + [ + "Mask", + "OpenPose", + "OpenPoseCanny", + "OpenPoseDepth", + "OpenPoseFace", + "OpenPoseFull", + "OpenPoseFullExtraLimb", + "OpenPoseHand", + "OpenPoseKeyPose", + "OpenPoseLineart", + "OpenPoseMediaPipeFace", + "PreviewAudio", + "SaveAudioBL", + "\u5b58\u50a8", + "\u5bfc\u5165", + "\u622a\u56fe", + "\u6750\u8d28\u56fe", + "\u8f93\u5165\u56fe\u50cf", + "\u9884\u89c8" + ], + { + "title_aux": "ComfyUI-CUP" + } + ], + "https://github.com/AIGODLIKE/ComfyUI-ToonCrafter": [ + [ + "ToonCrafterNode" + ], + { + "title_aux": "ComfyUI-ToonCrafter" + } + ], + "https://github.com/AInseven/ComfyUI-fastblend": [ + [ + "FillDarkMask", + "InterpolateKeyFrame", + "MaskListcaptoBatch", + "Merge_Image_List", + "MyOpenPoseNode", + "SmoothVideo", + "alert_when_finished", + "reBatchImage" + ], + { + "title_aux": "ComfyUI-fastblend" + } + ], + "https://github.com/AIrjen/OneButtonPrompt": [ + [ + "AutoNegativePrompt", + "CreatePromptVariant", + "OneButtonArtify", + "OneButtonFlufferize", + "OneButtonPreset", + "OneButtonPrompt", + "OneButtonSuperPrompt", + "SavePromptToFile" + ], + { + "title_aux": "One Button Prompt" + } + ], + "https://github.com/ALatentPlace/ComfyUI_yanc": [ + [ + "> Clear Text", + "> Float to Int", + "> Get Mean Color", + "> Int", + "> Int to Text", + "> Layer Weights (for IPAMS)", + "> Light Source Mask", + "> Load Image", + "> Load Image From Folder", + "> Mask Curves", + "> NIKSampler", + "> Noise From Image", + "> Normal Map Lighting", + "> RGB Color", + "> Resolution by Aspect Ratio", + "> Rotate Image", + "> Save Image", + "> Scale Image to Side", + "> Text", + "> Text Combine", + "> Text Pick Random Line", + "> Text Random Weights", + "> Text Replace" + ], + { + "title_aux": "ComfyUI_yanc" + } + ], + "https://github.com/AbdullahAlfaraj/Comfy-Photoshop-SD": [ + [ + "APS_LatentBatch", + "APS_Seed", + "ContentMaskLatent", + "ControlNetScript", + "ControlnetUnit", + "GaussianLatentImage", + "GetConfig", + "LoadImageBase64", + "LoadImageWithMetaData", + "LoadLorasFromPrompt", + "MaskExpansion" + ], + { + "title_aux": "Comfy-Photoshop-SD" + } + ], + "https://github.com/AbyssYuan0/ComfyUI_BadgerTools": [ + [ + "ApplyMaskToImage-badger", + "CropImageByMask-badger", + "ExpandImageWithColor-badger", + "FindThickLinesFromCanny-badger", + "FloatToInt-badger", + "FloatToString-badger", + "FrameToVideo-badger", + "GETRequset-badger", + "GarbageCollect-badger", + "GetColorFromBorder-badger", + "GetDirName-badger", + "GetUUID-badger", + "IdentifyBorderColorToMask-badger", + "IdentifyColorToMask-badger", + "ImageNormalization-badger", + "ImageOverlap-badger", + "ImageScaleToSide-badger", + "IntToString-badger", + "IntToStringAdvanced-badger", + "LoadImageAdvanced-badger", + "LoadImagesFromDirListAdvanced-badger", + "SegmentToMaskByPoint-badger", + "SimpleBoolean-badger", + "StringToFizz-badger", + "TextListToString-badger", + "ToPixel-badger", + "TrimTransparentEdges-badger", + "VideoCutFromDir-badger", + "VideoToFrame-badger", + "deleteDir-badger", + "findCenterOfMask-badger", + "getImageSide-badger", + "getParentDir-badger", + "mkdir-badger" + ], + { + "title_aux": "ComfyUI_BadgerTools" + } + ], + "https://github.com/Acly/comfyui-inpaint-nodes": [ + [ + "INPAINT_ApplyFooocusInpaint", + "INPAINT_DenoiseToCompositingMask", + "INPAINT_ExpandMask", + "INPAINT_InpaintWithModel", + "INPAINT_LoadFooocusInpaint", + "INPAINT_LoadInpaintModel", + "INPAINT_MaskedBlur", + "INPAINT_MaskedFill", + "INPAINT_VAEEncodeInpaintConditioning" + ], + { + "title_aux": "ComfyUI Inpaint Nodes" + } + ], + "https://github.com/Acly/comfyui-tooling-nodes": [ + [ + "ETN_ApplyMaskToImage", + "ETN_AttentionMask", + "ETN_BackgroundRegion", + "ETN_CropImage", + "ETN_DefineRegion", + "ETN_ExtractImageTile", + "ETN_ExtractMaskTile", + "ETN_GenerateTileMask", + "ETN_ListRegionMasks", + "ETN_LoadImageBase64", + "ETN_LoadMaskBase64", + "ETN_MergeImageTile", + "ETN_SendImageWebSocket", + "ETN_TileLayout" + ], + { + "title_aux": "ComfyUI Nodes for External Tooling" + } + ], + "https://github.com/AiMiDi/ComfyUI-Aimidi-nodes": [ + [ + "Add Tag", + "Clear Tag", + "Load Images Pair Batch", + "Merge Tag", + "Move Tag To Top", + "Reserve Tag", + "Save Images Pair" + ], + { + "title_aux": "ComfyUI-Aimidi-nodes" + } + ], + "https://github.com/AlekPet/ComfyUI_Custom_Nodes_AlekPet": [ + [ + "ArgosTranslateCLIPTextEncodeNode", + "ArgosTranslateTextNode", + "ColorsCorrectNode", + "DeepTranslatorCLIPTextEncodeNode", + "DeepTranslatorTextNode", + "GoogleTranslateCLIPTextEncodeNode", + "GoogleTranslateTextNode", + "HexToHueNode", + "PainterNode", + "PoseNode", + "PreviewTextNode" + ], + { + "title_aux": "AlekPet/ComfyUI_Custom_Nodes_AlekPet" + } + ], + "https://github.com/Amorano/Jovimetrix": [ + [ + "ADJUST (JOV) \ud83d\udd78\ufe0f", + "AKASHIC (JOV) \ud83d\udcd3", + "ARRAY (JOV) \ud83d\udcda", + "BLEND (JOV) \u2697\ufe0f", + "COLOR BLIND (JOV) \ud83d\udc41\u200d\ud83d\udde8", + "COLOR MATCH (JOV) \ud83d\udc9e", + "COLOR THEORY (JOV) \ud83d\udede", + "COMPARISON (JOV) \ud83d\udd75\ud83c\udffd", + "CONSTANT (JOV) \ud83d\udfea", + "CROP (JOV) \u2702\ufe0f", + "DELAY (JOV) \u270b\ud83c\udffd", + "EXPORT (JOV) \ud83d\udcfd", + "FILTER MASK (JOV) \ud83e\udd3f", + "FLATTEN (JOV) \u2b07\ufe0f", + "GLSL (JOV) \ud83c\udf69", + "GRADIENT MAP (JOV) \ud83c\uddf2\ud83c\uddfa", + "GRAPH (JOV) \ud83d\udcc8", + "LERP (JOV) \ud83d\udd30", + "MIDI FILTER (JOV) \u2733\ufe0f", + "MIDI FILTER EZ (JOV) \u2747\ufe0f", + "MIDI MESSAGE (JOV) \ud83c\udf9b\ufe0f", + "MIDI READER (JOV) \ud83c\udfb9", + "OP BINARY (JOV) \ud83c\udf1f", + "OP UNARY (JOV) \ud83c\udfb2", + "PIXEL MERGE (JOV) \ud83e\udec2", + "PIXEL SPLIT (JOV) \ud83d\udc94", + "PIXEL SWAP (JOV) \ud83d\udd03", + "QUEUE (JOV) \ud83d\uddc3", + "ROUTE (JOV) \ud83d\ude8c", + "SAVE OUTPUT (JOV) \ud83d\udcbe", + "SHAPE GEN (JOV) \u2728", + "SPOUT WRITER (JOV) \ud83c\udfa5", + "STACK (JOV) \u2795", + "STEREOGRAM (JOV) \ud83d\udcfb", + "STEREOSCOPIC (JOV) \ud83d\udd76\ufe0f", + "STREAM READER (JOV) \ud83d\udcfa", + "STREAM WRITER (JOV) \ud83c\udf9e\ufe0f", + "SWIZZLE (JOV) \ud83d\ude35", + "TEXT GEN (JOV) \ud83d\udcdd", + "THRESHOLD (JOV) \ud83d\udcc9", + "TICK (JOV) \u23f1", + "TRANSFORM (JOV) \ud83c\udfdd\ufe0f", + "VALUE (JOV) \ud83e\uddec", + "WAVE GEN (JOV) \ud83c\udf0a", + "WAVE GRAPH (JOV) \u25b6 \u0131l\u0131\u0131l\u0131" + ], + { + "author": "amorano", + "description": "Jovimetrix integrates Webcam, MIDI, Spout and GLSL shader support.", + "nodename_pattern": " \\(JOV\\)$", + "title": "Jovimetrix", + "title_aux": "Jovimetrix Composition Nodes" + } + ], + "https://github.com/AonekoSS/ComfyUI-LoRA-Tuner": [ + [ + "LoraTuner" + ], + { + "title_aux": "ComfyUI-LoRA-Tuner" + } + ], + "https://github.com/AonekoSS/ComfyUI-SimpleCounter": [ + [ + "Simple Counter" + ], + { + "title_aux": "ComfyUI-SimpleCounter" + } + ], + "https://github.com/ArcherFMY/Diffusion360_ComfyUI": [ + [ + "Diffusion360LoaderImage2Pano", + "Diffusion360LoaderText2Pano", + "Diffusion360Sampler", + "Diffusion360SamplerImage2Pano", + "Diffusion360SamplerText2Pano", + "InputImage", + "InputText", + "VAEDecodeTiledBlended" + ], + { + "title_aux": "Diffusion360_ComfyUI" + } + ], + "https://github.com/ArdeniusAI/CPlus_Ardenius": [ + [ + "Control_Box" + ], + { + "author": "initials AMA", + "description": "CPlus control box is designed to gather workflow variables into 1 node for easier control of your workflow.", + "nickname": "Ardenius", + "title": "Ardenius", + "title_aux": "CPlus_Ardenius ComfyUI Control Box" + } + ], + "https://github.com/ArtBot2023/CharacterFaceSwap": [ + [ + "Color Blend", + "Crop Face", + "Exclude Facial Feature", + "Generation Parameter Input", + "Generation Parameter Output", + "Image Full BBox", + "Load BiseNet", + "Load RetinaFace", + "Mask Contour", + "Segment Face", + "Uncrop Face" + ], + { + "title_aux": "Character Face Swap" + } + ], + "https://github.com/ArtVentureX/comfyui-animatediff": [ + [ + "AnimateDiffCombine", + "AnimateDiffLoraLoader", + "AnimateDiffModuleLoader", + "AnimateDiffSampler", + "AnimateDiffSlidingWindowOptions", + "ImageSizeAndBatchSize", + "LoadVideo" + ], + { + "title_aux": "AnimateDiff" + } + ], + "https://github.com/AshMartian/ComfyUI-DirGir": [ + [ + "Dir_Gir_Looper", + "Dir_Gir_Picker", + "Gir_Image_Nabber" + ], + { + "title_aux": "Dir Gir" + } + ], + "https://github.com/AuroBit/ComfyUI-AnimateAnyone-reproduction": [ + [ + "AnimateAnyone" + ], + { + "title_aux": "ComfyUI-AnimateAnyone-reproduction" + } + ], + "https://github.com/AustinMroz/ComfyUI-DynamicOversampling": [ + [ + "DynamicSampler", + "MeasuredSampler", + "ResolveMaskPromise" + ], + { + "title_aux": "DynamicOversampling" + } + ], + "https://github.com/AustinMroz/ComfyUI-SpliceTools": [ + [ + "LogSigmas", + "RerangeSigmas", + "SpliceDenoised", + "SpliceLatents", + "TemporalSplice" + ], + { + "title_aux": "SpliceTools" + } + ], + "https://github.com/Auttasak-L/ComfyUI-ImageCropper": [ + [ + "ImageCropper" + ], + { + "title_aux": "ComfyUI-ImageCropper" + } + ], + "https://github.com/BAIS1C/ComfyUI_RSS_Feed_Reader": [ + [ + "RSSFeedNode" + ], + { + "title_aux": "ComfyUI_RSS_Feed_Reader" + } + ], + "https://github.com/BXYMartin/ComfyUI-InstantIDUtils": [ + [ + "ListOfImages", + "MultiControlNetConverter", + "NHWC2NCHWTensor", + "NHWCTensor2PIL", + "PIL2NHWCTensor" + ], + { + "title_aux": "ComfyUI-InstantIDUtils" + } + ], + "https://github.com/BadCafeCode/masquerade-nodes-comfyui": [ + [ + "Blur", + "Change Channel Count", + "Combine Masks", + "Constant Mask", + "Convert Color Space", + "Create QR Code", + "Create Rect Mask", + "Cut By Mask", + "Get Image Size", + "Image To Mask", + "Make Image Batch", + "Mask By Text", + "Mask Morphology", + "Mask To Region", + "MasqueradeIncrementer", + "Mix Color By Mask", + "Mix Images By Mask", + "Paste By Mask", + "Prune By Mask", + "Separate Mask Components", + "Unary Image Op", + "Unary Mask Op" + ], + { + "title_aux": "Masquerade Nodes" + } + ], + "https://github.com/Beinsezii/bsz-cui-extras": [ + [ + "BSZAbsoluteHires", + "BSZAspectHires", + "BSZColoredLatentImageXL", + "BSZCombinedHires", + "BSZHueChromaXL", + "BSZInjectionKSampler", + "BSZLatentDebug", + "BSZLatentFill", + "BSZLatentGradient", + "BSZLatentHSVAImage", + "BSZLatentOffsetXL", + "BSZLatentRGBAImage", + "BSZLatentbuster", + "BSZPixelbuster", + "BSZPixelbusterHelp", + "BSZPrincipledConditioning", + "BSZPrincipledSampler", + "BSZPrincipledScale", + "BSZStrangeResample" + ], + { + "title_aux": "bsz-cui-extras" + } + ], + "https://github.com/BenNarum/SigmaWaveFormNode": [ + [ + "AttenuatorNode", + "FourierFilterNode", + "PhaseLockedLoopNode", + "SigmaWaveFormNode", + "SigmaWaveFormNodeAdvanced", + "SigmaWaveFormNodeSimple" + ], + { + "title_aux": "SigmaWaveFormNodes" + } + ], + "https://github.com/BennyKok/comfyui-deploy": [ + [ + "ComfyDeployWebscoketImageInput", + "ComfyDeployWebscoketImageOutput", + "ComfyUIDeployExternalBoolean", + "ComfyUIDeployExternalCheckpoint", + "ComfyUIDeployExternalImage", + "ComfyUIDeployExternalImageAlpha", + "ComfyUIDeployExternalImageBatch", + "ComfyUIDeployExternalLora", + "ComfyUIDeployExternalNumber", + "ComfyUIDeployExternalNumberInt", + "ComfyUIDeployExternalNumberSlider", + "ComfyUIDeployExternalText", + "ComfyUIDeployExternalVid", + "ComfyUIDeployExternalVideo" + ], + { + "author": "BennyKok", + "description": "", + "nickname": "Comfy Deploy", + "title": "comfyui-deploy", + "title_aux": "ComfyUI Deploy" + } + ], + "https://github.com/Big-Idea-Technology/ComfyUI-Book-Tools": [ + [ + "BTPromptSchedule", + "BTPromptSelector", + "EndQueue", + "ImageTextOverlay", + "Loop", + "LoopEnd", + "LoopStart" + ], + { + "title_aux": "ComfyUI-Book-Tools Nodes for ComfyUI" + } + ], + "https://github.com/Big-Idea-Technology/ComfyUI_LLM_Node": [ + [ + "AdvOptions_Node", + "CodingOptionsNode", + "LLM_Node", + "Output_Node", + "QuantizationConfig_Node" + ], + { + "title_aux": "LLM Node for ComfyUI" + } + ], + "https://github.com/Bikecicle/ComfyUI-Waveform-Extensions/raw/main/EXT_AudioManipulation.py": [ + [ + "BatchJoinAudio", + "CutAudio", + "DuplicateAudio", + "JoinAudio", + "ResampleAudio", + "ReverseAudio", + "StretchAudio" + ], + { + "title_aux": "Waveform Extensions" + } + ], + "https://github.com/Billius-AI/ComfyUI-Path-Helper": [ + [ + "Add File Name Prefix", + "Add File Name Prefix Advanced", + "Add Folder", + "Add Folder Advanced", + "Create Project Root", + "Join Variables", + "Show Path", + "Show String" + ], + { + "title_aux": "ComfyUI-Path-Helper" + } + ], + "https://github.com/BlakeOne/ComfyUI-CustomScheduler": [ + [ + "CustomScheduler" + ], + { + "title_aux": "ComfyUI CustomScheduler" + } + ], + "https://github.com/BlakeOne/ComfyUI-SchedulerMixer": [ + [ + "SchedulerMixer" + ], + { + "title_aux": "ComfyUI SchedulerMixer" + } + ], + "https://github.com/BlenderNeko/ComfyUI_ADV_CLIP_emb": [ + [ + "BNK_AddCLIPSDXLParams", + "BNK_AddCLIPSDXLRParams", + "BNK_CLIPTextEncodeAdvanced", + "BNK_CLIPTextEncodeSDXLAdvanced" + ], + { + "title_aux": "Advanced CLIP Text Encode" + } + ], + "https://github.com/BlenderNeko/ComfyUI_Cutoff": [ + [ + "BNK_CutoffBasePrompt", + "BNK_CutoffRegionsToConditioning", + "BNK_CutoffRegionsToConditioning_ADV", + "BNK_CutoffSetRegions" + ], + { + "title_aux": "ComfyUI Cutoff" + } + ], + "https://github.com/BlenderNeko/ComfyUI_Noise": [ + [ + "BNK_DuplicateBatchIndex", + "BNK_GetSigma", + "BNK_InjectNoise", + "BNK_NoisyLatentImage", + "BNK_SlerpLatent", + "BNK_Unsampler" + ], + { + "title_aux": "ComfyUI Noise" + } + ], + "https://github.com/BlenderNeko/ComfyUI_SeeCoder": [ + [ + "ConcatConditioning", + "SEECoderImageEncode" + ], + { + "title_aux": "SeeCoder [WIP]" + } + ], + "https://github.com/BlenderNeko/ComfyUI_TiledKSampler": [ + [ + "BNK_TiledKSampler", + "BNK_TiledKSamplerAdvanced" + ], + { + "title_aux": "Tiled sampling for ComfyUI" + } + ], + "https://github.com/CC-BryanOttho/ComfyUI_API_Manager": [ + [ + "APIRequestNode", + "PostImageToAPI", + "TextPromptCombinerNode" + ], + { + "title_aux": "ComfyUI_API_Manager" + } + ], + "https://github.com/CYBERLOOM-INC/ComfyUI-nodes-hnmr": [ + [ + "CLIPIter", + "Dict2Model", + "GridImage", + "ImageBlend2", + "KSamplerOverrided", + "KSamplerSetting", + "KSamplerXYZ", + "LatentToHist", + "LatentToImage", + "ModelIter", + "RandomLatentImage", + "SaveStateDict", + "SaveText", + "StateDictLoader", + "StateDictMerger", + "StateDictMergerBlockWeighted", + "StateDictMergerBlockWeightedMulti", + "VAEDecodeBatched", + "VAEEncodeBatched", + "VAEIter" + ], + { + "title_aux": "ComfyUI-nodes-hnmr" + } + ], + "https://github.com/CaptainGrock/ComfyUIInvisibleWatermark/raw/main/Invisible%20Watermark.py": [ + [ + "Apply Invisible Watermark", + "Extract Watermark" + ], + { + "title_aux": "ComfyUIInvisibleWatermark" + } + ], + "https://github.com/Chan-0312/ComfyUI-EasyDeforum": [ + [ + "Easy2DDeforum" + ], + { + "title_aux": "ComfyUI-EasyDeforum" + } + ], + "https://github.com/Chan-0312/ComfyUI-IPAnimate": [ + [ + "IPAdapterAnimate" + ], + { + "title_aux": "ComfyUI-IPAnimate" + } + ], + "https://github.com/Chan-0312/ComfyUI-Prompt-Preview": [ + [ + "SDXLPromptStylerAdvancedPreview", + "SDXLPromptStylerPreview" + ], + { + "title_aux": "ComfyUI-Prompt-Preview" + } + ], + "https://github.com/Chaoses-Ib/ComfyUI_Ib_CustomNodes": [ + [ + "ImageToPIL", + "LoadImageFromPath", + "PILToImage", + "PILToMask" + ], + { + "title_aux": "ComfyUI_Ib_CustomNodes" + } + ], + "https://github.com/Clybius/ComfyUI-Extra-Samplers": [ + [ + "GeometricCFGGuider", + "ImageAssistedCFGGuider", + "MegaCFGGuider", + "SamplerCLYB_4M_SDE_Momentumized", + "SamplerCustomModelMixtureDuo", + "SamplerCustomNoise", + "SamplerCustomNoiseDuo", + "SamplerDPMPP_3M_SDE_DynETA", + "SamplerDPMPP_DualSDE_Momentumized", + "SamplerEulerAncestralDancing_Experimental", + "SamplerLCMCustom", + "SamplerRES_Momentumized", + "SamplerSupreme", + "SamplerTTM", + "ScaledCFGGuider", + "SimpleExponentialScheduler", + "WarmupDecayCFGGuider" + ], + { + "title_aux": "ComfyUI Extra Samplers" + } + ], + "https://github.com/Clybius/ComfyUI-Latent-Modifiers": [ + [ + "Latent Diffusion Mega Modifier" + ], + { + "title_aux": "ComfyUI-Latent-Modifiers" + } + ], + "https://github.com/CosmicLaca/ComfyUI_Primere_Nodes": [ + [ + "PrimereAestheticCKPTScorer", + "PrimereAnyDetailer", + "PrimereAnyOutput", + "PrimereCKPT", + "PrimereCKPTLoader", + "PrimereCLIPEncoder", + "PrimereClearPrompt", + "PrimereConceptDataTuple", + "PrimereDynamicParser", + "PrimereEmbedding", + "PrimereEmbeddingHandler", + "PrimereEmbeddingKeywordMerger", + "PrimereEmotionsStyles", + "PrimereHypernetwork", + "PrimereImageSegments", + "PrimereKSampler", + "PrimereLCMSelector", + "PrimereLORA", + "PrimereLYCORIS", + "PrimereLatentNoise", + "PrimereLoraKeywordMerger", + "PrimereLoraStackMerger", + "PrimereLycorisKeywordMerger", + "PrimereLycorisStackMerger", + "PrimereMetaCollector", + "PrimereMetaDistributor", + "PrimereMetaDistributorStage2", + "PrimereMetaHandler", + "PrimereMetaRead", + "PrimereMetaSave", + "PrimereMidjourneyStyles", + "PrimereModelConceptSelector", + "PrimereModelKeyword", + "PrimereNetworkTagLoader", + "PrimerePreviewImage", + "PrimerePrompt", + "PrimerePromptOrganizer", + "PrimerePromptSwitch", + "PrimereRefinerPrompt", + "PrimereResolution", + "PrimereResolutionCoordinatorMPX", + "PrimereResolutionMultiplier", + "PrimereResolutionMultiplierMPX", + "PrimereSamplers", + "PrimereSamplersSteps", + "PrimereSeed", + "PrimereStepsCfg", + "PrimereStyleLoader", + "PrimereStylePile", + "PrimereTextOutput", + "PrimereUpscaleModel", + "PrimereVAE", + "PrimereVAELoader", + "PrimereVAESelector", + "PrimereVisualCKPT", + "PrimereVisualEmbedding", + "PrimereVisualHypernetwork", + "PrimereVisualLORA", + "PrimereVisualLYCORIS", + "PrimereVisualStyle" + ], + { + "title_aux": "Primere nodes for ComfyUI" + } + ], + "https://github.com/Danand/ComfyUI-ComfyCouple": [ + [ + "Attention couple", + "Comfy Couple" + ], + { + "author": "Rei D.", + "description": "If you want to draw two different characters together without blending their features, so you could try to check out this custom node.", + "nickname": "Danand", + "title": "Comfy Couple", + "title_aux": "Comfy Couple" + } + ], + "https://github.com/DannyStone1999/ComfyUI-Depth2Mask/raw/main/Depth2Mask.py": [ + [ + "Depth2Mask" + ], + { + "title_aux": "ComfyUI-Depth2Mask" + } + ], + "https://github.com/DarKDinDoN/comfyui-checkpoint-automatic-config": [ + [ + "CheckpointAutomaticConfig", + "ConfigPipe" + ], + { + "title_aux": "ComfyUI Checkpoint Automatic Config" + } + ], + "https://github.com/DataCTE/prompt_injection": [ + [ + "AdvancedPromptInjection", + "PromptInjection", + "SVDPromptInjection", + "SimplePromptInjection" + ], + { + "title_aux": "Prompt Injection Node for ComfyUI" + } + ], + "https://github.com/DeJoker/pipeline-parallel-comfy": [ + [ + "PipelineParallel" + ], + { + "title_aux": "Pipeline Parallel ComfyUI" + } + ], + "https://github.com/Derfuu/Derfuu_ComfyUI_ModdedNodes": [ + [], + { + "author": "Derfuu", + "description": "Pack of simple (or not) and modded nodes for scaling images/latents, editing numbers or text. Automate calculations depending on image sizes or any other thing you want. Or randomize any number in your workflow. Debug node included.", + "nickname": "Derfuu simple/modded Nodes", + "nodename_pattern": "^DF_", + "title": "Derfuu simple/modded Nodes", + "title_aux": "Derfuu_ComfyUI_ModdedNodes" + } + ], + "https://github.com/DonBaronFactory/ComfyUI-Cre8it-Nodes": [ + [ + "ApplySerialPrompter", + "ImageSizer", + "SerialPrompter" + ], + { + "author": "CRE8IT GmbH", + "description": "This extension offers various nodes.", + "nickname": "cre8Nodes", + "title": "cr8SerialPrompter", + "title_aux": "ComfyUI-Cre8it-Nodes" + } + ], + "https://github.com/DrMWeigand/ComfyUI_ColorImageDetection": [ + [ + "LABColorDetection", + "RGBColorDetection" + ], + { + "title_aux": "ComfyUI Color Detection Nodes" + } + ], + "https://github.com/Electrofried/ComfyUI-OpenAINode": [ + [ + "OpenAINode" + ], + { + "title_aux": "OpenAINode" + } + ], + "https://github.com/EllangoK/ComfyUI-post-processing-nodes": [ + [ + "ArithmeticBlend", + "AsciiArt", + "Blend", + "Blur", + "CannyEdgeMask", + "ChromaticAberration", + "ColorCorrect", + "ColorTint", + "Dissolve", + "Dither", + "DodgeAndBurn", + "FilmGrain", + "Glow", + "HSVThresholdMask", + "KMeansQuantize", + "KuwaharaBlur", + "Parabolize", + "PencilSketch", + "PixelSort", + "Pixelize", + "Quantize", + "Sharpen", + "SineWave", + "Solarize", + "Vignette" + ], + { + "title_aux": "ComfyUI-post-processing-nodes" + } + ], + "https://github.com/ExponentialML/ComfyUI_ModelScopeT2V": [ + [ + "ModelScopeT2VLoader" + ], + { + "title_aux": "ComfyUI_ModelScopeT2V" + } + ], + "https://github.com/ExponentialML/ComfyUI_Native_DynamiCrafter": [ + [ + "DynamiCrafterLoader", + "DynamiCrafterProcessor" + ], + { + "title_aux": "ComfyUI - Native DynamiCrafter" + } + ], + "https://github.com/ExponentialML/ComfyUI_VisualStylePrompting": [ + [ + "ApplyVisualStyle" + ], + { + "title_aux": "ComfyUI_VisualStylePrompting" + } + ], + "https://github.com/Extraltodeus/ComfyUI-AutomaticCFG": [ + [ + "Automatic CFG", + "Automatic CFG - Advanced", + "Automatic CFG - Attention modifiers", + "Automatic CFG - Attention modifiers tester", + "Automatic CFG - Custom attentions", + "Automatic CFG - Excellent attention", + "Automatic CFG - Negative", + "Automatic CFG - Post rescale only", + "Automatic CFG - Preset Loader", + "Automatic CFG - Unpatch function", + "Automatic CFG - Warp Drive", + "SAG delayed activation", + "Temperature separate settings CLIP SDXL", + "Temperature settings CLIP", + "Temperature settings SD 1.5", + "Temperature settings SDXL", + "Zero Uncond CFG - standalone patch (incompatible with the others)" + ], + { + "title_aux": "ComfyUI-AutomaticCFG" + } + ], + "https://github.com/Extraltodeus/LoadLoraWithTags": [ + [ + "LoraLoaderTagsQuery" + ], + { + "title_aux": "LoadLoraWithTags" + } + ], + "https://github.com/Extraltodeus/Stable-Diffusion-temperature-settings": [ + [ + "CLIP Temperature", + "Unet Temperature" + ], + { + "title_aux": "Stable-Diffusion-temperature-settings" + } + ], + "https://github.com/Extraltodeus/Uncond-Zero-for-ComfyUI": [ + [ + "Conditioning combine positive and negative", + "Conditioning crop or fill", + "Uncond Zero", + "interrupt on NaN" + ], + { + "title_aux": "Uncond-Zero-for-ComfyUI" + } + ], + "https://github.com/Extraltodeus/Vector_Sculptor_ComfyUI": [ + [ + "CLIP Vector Sculptor text encode", + "Conditioning (Average keep magnitude)", + "Conditioning (Slerp)", + "Conditioning SDXL merge clip_g / clip_l", + "Conditioning normalize magnitude to empty" + ], + { + "title_aux": "Vector_Sculptor_ComfyUI" + } + ], + "https://github.com/Extraltodeus/noise_latent_perlinpinpin": [ + [ + "NoisyLatentPerlin" + ], + { + "title_aux": "noise latent perlinpinpin" + } + ], + "https://github.com/Extraltodeus/pre_cfg_comfy_nodes_for_ComfyUI": [ + [ + "Pre CFG automatic scale", + "Pre CFG consensus sharpening", + "Pre CFG exponentiation", + "Pre CFG perp-neg", + "Pre CFG sharpening" + ], + { + "title_aux": "pre_cfg_comfy_nodes_for_ComfyUI" + } + ], + "https://github.com/Extraltodeus/sigmas_tools_and_the_golden_scheduler": [ + [ + "Aligned Scheduler", + "Gaussian Tail Scheduler", + "Get sigmas as float", + "Graph sigmas", + "Manual scheduler", + "Merge many sigmas by average", + "Merge sigmas by average", + "Merge sigmas gradually", + "Multiply sigmas", + "Output min/max sigmas", + "Split and concatenate sigmas", + "The Golden Scheduler" + ], + { + "title_aux": "sigmas_tools_and_the_golden_scheduler" + } + ], + "https://github.com/Fannovel16/ComfyUI-Frame-Interpolation": [ + [ + "AMT VFI", + "CAIN VFI", + "FILM VFI", + "FLAVR VFI", + "GMFSS Fortuna VFI", + "IFRNet VFI", + "IFUnet VFI", + "KSampler Gradually Adding More Denoise (efficient)", + "M2M VFI", + "Make Interpolation State List", + "RIFE VFI", + "STMFNet VFI", + "Sepconv VFI", + "VFI FloatToInt" + ], + { + "title_aux": "ComfyUI Frame Interpolation" + } + ], + "https://github.com/Fannovel16/ComfyUI-Loopchain": [ + [ + "EmptyLatentImageLoop", + "FolderToImageStorage", + "ImageStorageExportLoop", + "ImageStorageImport", + "ImageStorageReset", + "LatentStorageExportLoop", + "LatentStorageImport", + "LatentStorageReset" + ], + { + "title_aux": "ComfyUI Loopchain" + } + ], + "https://github.com/Fannovel16/ComfyUI-MagickWand": [ + [ + "ImageMagick Adaptive Blur", + "ImageMagick Adaptive Resize", + "ImageMagick Adaptive Sharpen", + "ImageMagick Adaptive Threshold", + "ImageMagick Auto Gamma", + "ImageMagick Auto Level", + "ImageMagick Auto Orient", + "ImageMagick Auto Threshold", + "ImageMagick Blue Shift", + "ImageMagick Blur", + "ImageMagick Brightness Contrast", + "ImageMagick Canny", + "ImageMagick Charcoal", + "ImageMagick Chop", + "ImageMagick Clahe", + "ImageMagick Clamp", + "ImageMagick Coalesce", + "ImageMagick Color Decision List", + "ImageMagick Color Matrix", + "ImageMagick Combine", + "ImageMagick Concat", + "ImageMagick Contrast", + "ImageMagick Contrast Stretch", + "ImageMagick Crop", + "ImageMagick Cycle Color Map", + "ImageMagick Decipher", + "ImageMagick Despeckle", + "ImageMagick Distort", + "ImageMagick Edge", + "ImageMagick Emboss", + "ImageMagick Encipher", + "ImageMagick Enhance", + "ImageMagick Equalize", + "ImageMagick Evaluate", + "ImageMagick Extent", + "ImageMagick Flip", + "ImageMagick Flop", + "ImageMagick Forward Fourier Transform", + "ImageMagick Function", + "ImageMagick Gamma", + "ImageMagick Gaussian Blur", + "ImageMagick Hough Lines", + "ImageMagick Implode", + "ImageMagick Kmeans", + "ImageMagick Kuwahara", + "ImageMagick Level", + "ImageMagick Levelize", + "ImageMagick Linear Stretch", + "ImageMagick Liquid Rescale", + "ImageMagick Local Contrast", + "ImageMagick Magnify", + "ImageMagick Mean Shift", + "ImageMagick Merge Layers", + "ImageMagick Mode", + "ImageMagick Modulate", + "ImageMagick Morphology", + "ImageMagick Motion Blur", + "ImageMagick Negate", + "ImageMagick Noise", + "ImageMagick Normalize", + "ImageMagick Oil Paint", + "ImageMagick Ordered Dither", + "ImageMagick Polynomial", + "ImageMagick Posterize", + "ImageMagick Quantize", + "ImageMagick Random Threshold", + "ImageMagick Range Threshold", + "ImageMagick Resample", + "ImageMagick Resize", + "ImageMagick Roll", + "ImageMagick Rotational Blur", + "ImageMagick Sample", + "ImageMagick Scale", + "ImageMagick Selective Blur", + "ImageMagick Sepia Tone", + "ImageMagick Shade", + "ImageMagick Shadow", + "ImageMagick Sharpen", + "ImageMagick Shave", + "ImageMagick Sigmoidal Contrast", + "ImageMagick Sketch", + "ImageMagick Smush", + "ImageMagick Solarize", + "ImageMagick Splice", + "ImageMagick Spread", + "ImageMagick Statistic", + "ImageMagick Swirl", + "ImageMagick Threshold", + "ImageMagick Thumbnail", + "ImageMagick Transform", + "ImageMagick Transform Colorspace", + "ImageMagick Transparentize", + "ImageMagick Transpose", + "ImageMagick Transverse", + "ImageMagick Unsharp Mask", + "ImageMagick Vignette", + "ImageMagick Wave", + "ImageMagick Wavelet Denoise", + "ImageMagick White Balance" + ], + { + "title_aux": "ComfyUI-MagickWand" + } + ], + "https://github.com/Fannovel16/ComfyUI-MotionDiff": [ + [ + "EmptyMotionData", + "ExportSMPLTo3DSoftware", + "Export_SMPLMultipleSubjects_To_3DSoftware", + "Human4D_Img2SMPL", + "Humans4DLoader", + "MotionCLIPTextEncode", + "MotionDataVisualizer", + "MotionDiffLoader", + "MotionDiffSimpleSampler", + "RenderMultipleSubjectsSMPLMesh", + "RenderSMPLMesh", + "Render_OpenPose_From_SMPL_Mesh_Multiple_Subjects", + "SMPLLoader", + "SMPLShapeParameters", + "SaveSMPL", + "SmplifyMotionData", + "SpectreFaceReconLoader", + "SpectreImg2SMPL", + "mgpt_model_loader", + "mgpt_t2m" + ], + { + "title_aux": "ComfyUI MotionDiff" + } + ], + "https://github.com/Fannovel16/ComfyUI-Video-Matting": [ + [ + "BRIAAI Matting", + "Robust Video Matting" + ], + { + "title_aux": "ComfyUI-Video-Matting" + } + ], + "https://github.com/Fannovel16/comfyui_controlnet_aux": [ + [ + "AIO_Preprocessor", + "AnimalPosePreprocessor", + "AnimeFace_SemSegPreprocessor", + "AnimeLineArtPreprocessor", + "AnyLineArtPreprocessor_aux", + "BAE-NormalMapPreprocessor", + "BinaryPreprocessor", + "CannyEdgePreprocessor", + "ColorPreprocessor", + "ControlNetPreprocessorSelector", + "DSINE-NormalMapPreprocessor", + "DWPreprocessor", + "DensePosePreprocessor", + "DepthAnythingPreprocessor", + "DepthAnythingV2Preprocessor", + "DiffusionEdge_Preprocessor", + "FacialPartColoringFromPoseKps", + "FakeScribblePreprocessor", + "HEDPreprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "ImageIntensityDetector", + "ImageLuminanceDetector", + "InpaintPreprocessor", + "LeReS-DepthMapPreprocessor", + "LineArtPreprocessor", + "LineartStandardPreprocessor", + "M-LSDPreprocessor", + "Manga2Anime_LineArt_Preprocessor", + "MaskOptFlow", + "MediaPipe-FaceMeshPreprocessor", + "MeshGraphormer+ImpactDetector-DepthMapPreprocessor", + "MeshGraphormer-DepthMapPreprocessor", + "Metric3D-DepthMapPreprocessor", + "Metric3D-NormalMapPreprocessor", + "Metric_DepthAnythingV2Preprocessor", + "MiDaS-DepthMapPreprocessor", + "MiDaS-NormalMapPreprocessor", + "OneFormer-ADE20K-SemSegPreprocessor", + "OneFormer-COCO-SemSegPreprocessor", + "OpenposePreprocessor", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "RenderAnimalKps", + "RenderPeopleKps", + "SAMPreprocessor", + "SavePoseKpsAsJsonFile", + "ScribblePreprocessor", + "Scribble_PiDiNet_Preprocessor", + "Scribble_XDoG_Preprocessor", + "SemSegPreprocessor", + "ShufflePreprocessor", + "TEEDPreprocessor", + "TTPlanet_TileGF_Preprocessor", + "TTPlanet_TileSimple_Preprocessor", + "TilePreprocessor", + "UniFormer-SemSegPreprocessor", + "Unimatch_OptFlowPreprocessor", + "UpperBodyTrackingFromPoseKps", + "Zoe-DepthMapPreprocessor", + "Zoe_DepthAnythingPreprocessor" + ], + { + "author": "tstandley", + "preemptions": [ + "AIO_Preprocessor", + "AnimalPosePreprocessor", + "AnimeFace_SemSegPreprocessor", + "AnimeLineArtPreprocessor", + "BAE-NormalMapPreprocessor", + "BinaryPreprocessor", + "CannyEdgePreprocessor", + "ColorPreprocessor", + "DSINE-NormalMapPreprocessor", + "DWPreprocessor", + "DensePosePreprocessor", + "DepthAnythingPreprocessor", + "DiffusionEdge_Preprocessor", + "FacialPartColoringFromPoseKps", + "FakeScribblePreprocessor", + "HEDPreprocessor", + "HintImageEnchance", + "ImageGenResolutionFromImage", + "ImageGenResolutionFromLatent", + "ImageIntensityDetector", + "ImageLuminanceDetector", + "InpaintPreprocessor", + "LeReS-DepthMapPreprocessor", + "LineArtPreprocessor", + "LineartStandardPreprocessor", + "M-LSDPreprocessor", + "Manga2Anime_LineArt_Preprocessor", + "MaskOptFlow", + "MediaPipe-FaceMeshPreprocessor", + "MeshGraphormer-DepthMapPreprocessor", + "MiDaS-DepthMapPreprocessor", + "MiDaS-NormalMapPreprocessor", + "OneFormer-ADE20K-SemSegPreprocessor", + "OneFormer-COCO-SemSegPreprocessor", + "OpenposePreprocessor", + "PiDiNetPreprocessor", + "PixelPerfectResolution", + "SAMPreprocessor", + "SavePoseKpsAsJsonFile", + "ScribblePreprocessor", + "Scribble_XDoG_Preprocessor", + "SemSegPreprocessor", + "ShufflePreprocessor", + "TEEDPreprocessor", + "TilePreprocessor", + "UniFormer-SemSegPreprocessor", + "Unimatch_OptFlowPreprocessor", + "Zoe-DepthMapPreprocessor", + "Zoe_DepthAnythingPreprocessor" + ], + "title_aux": "ComfyUI's ControlNet Auxiliary Preprocessors" + } + ], + "https://github.com/Fantaxico/ComfyUI-GCP-Storage": [ + [ + "GCPStorageNode" + ], + { + "title_aux": "ComfyUI-GCP-Storage" + } + ], + "https://github.com/Feidorian/feidorian-ComfyNodes": [ + [], + { + "nodename_pattern": "^Feidorian_", + "title_aux": "feidorian-ComfyNodes" + } + ], + "https://github.com/Fictiverse/ComfyUI_Fictiverse": [ + [ + "Add Noise to Image with Mask", + "Color correction", + "Displace Image with Depth", + "Displace Images with Mask", + "Zoom Image with Depth" + ], + { + "title_aux": "ComfyUI Fictiverse Nodes" + } + ], + "https://github.com/Fihade/IC-Light-ComfyUI-Node": [ + [ + "LoadICLightUnetDiffusers", + "diffusers_model_loader", + "iclight_diffusers_sampler" + ], + { + "title_aux": "IC-Light-ComfyUI-Node" + } + ], + "https://github.com/FizzleDorf/ComfyUI-AIT": [ + [ + "AIT_Unet_Loader", + "AIT_VAE_Encode_Loader" + ], + { + "title_aux": "ComfyUI-AIT" + } + ], + "https://github.com/FizzleDorf/ComfyUI_FizzNodes": [ + [ + "AbsCosWave", + "AbsSinWave", + "BatchGLIGENSchedule", + "BatchPromptSchedule", + "BatchPromptScheduleEncodeSDXL", + "BatchPromptScheduleLatentInput", + "BatchPromptScheduleNodeFlowEnd", + "BatchPromptScheduleSDXLLatentInput", + "BatchStringSchedule", + "BatchValueSchedule", + "BatchValueScheduleLatentInput", + "CalculateFrameOffset", + "ConcatStringSingle", + "CosWave", + "FizzFrame", + "FizzFrameConcatenate", + "ImagesFromBatchSchedule", + "Init FizzFrame", + "InvCosWave", + "InvSinWave", + "Lerp", + "PromptSchedule", + "PromptScheduleEncodeSDXL", + "PromptScheduleNodeFlow", + "PromptScheduleNodeFlowEnd", + "SawtoothWave", + "SinWave", + "SquareWave", + "StringConcatenate", + "StringSchedule", + "TriangleWave", + "ValueSchedule", + "convertKeyframeKeysToBatchKeys" + ], + { + "title_aux": "FizzNodes" + } + ], + "https://github.com/FlyingFireCo/tiled_ksampler": [ + [ + "Asymmetric Tiled KSampler", + "Circular VAEDecode", + "Tiled KSampler" + ], + { + "title_aux": "tiled_ksampler" + } + ], + "https://github.com/ForeignGods/ComfyUI-Mana-Nodes": [ + [ + "Canvas Properties", + "Combine Video", + "Font Properties", + "Generate Audio", + "Preset Color Animations", + "Save/Preview Text", + "Scheduled Values", + "Speech Recognition", + "Split Video", + "Text to Image Generator" + ], + { + "title_aux": "ComfyUI-Mana-Nodes" + } + ], + "https://github.com/Franck-Demongin/NX_PromptStyler": [ + [ + "NX_PromptStyler" + ], + { + "title_aux": "NX_PromptStyler" + } + ], + "https://github.com/FuouM/ComfyUI-FirstOrderMM": [ + [ + "FOMM_Partswap", + "FOMM_Runner", + "FOMM_Seg10Chooser", + "FOMM_Seg15Chooser", + "FOMM_Seg5Chooser" + ], + { + "author": "Fuou Marinas", + "description": "Run First Order Motion Model for Image Animation in ComfyUI.", + "nickname": "FOMM", + "title": "ComfyUI-FirstOrderMM", + "title_aux": "ComfyUI-FirstOrderMM" + } + ], + "https://github.com/G-370/ComfyUI-SD3-Powerlab": [ + [ + "G370SD3PowerLab_AttentionToImage", + "G370SD3PowerLab_ImageIntoAttention", + "G370SD3PowerLab_ImageIntoLayer", + "G370SD3PowerLab_LayerToImage", + "G370SD3PowerLab_RenderAttention" + ], + { + "title_aux": "ComfyUI-SD3-Powerlab" + } + ], + "https://github.com/GMapeSplat/ComfyUI_ezXY": [ + [ + "ConcatenateString", + "ItemFromDropdown", + "IterationDriver", + "JoinImages", + "LineToConsole", + "NumberFromList", + "NumbersToList", + "PlotImages", + "StringFromList", + "StringToLabel", + "StringsToList", + "ezMath", + "ezXY_AssemblePlot", + "ezXY_Driver" + ], + { + "title_aux": "ezXY scripts and nodes" + } + ], + "https://github.com/GTSuya-Studio/ComfyUI-Gtsuya-Nodes": [ + [ + "Danbooru (ID)", + "Danbooru (Random)", + "Random File From Path", + "Replace Strings", + "Simple Wildcards", + "Simple Wildcards (Dir.)", + "Wildcards Nodes" + ], + { + "title_aux": "ComfyUI-GTSuya-Nodes" + } + ], + "https://github.com/GavChap/ComfyUI-SD3LatentSelectRes": [ + [ + "SD3LatentSelectRes" + ], + { + "title_aux": "ComfyUI-SD3LatentSelectRes" + } + ], + "https://github.com/GentlemanHu/ComfyUI-SunoAI": [ + [ + "GentlemanHu_SunoAI", + "GentlemanHu_SunoAI_NotSafe" + ], + { + "title_aux": "ComfyUI Suno API" + } + ], + "https://github.com/Goktug/comfyui-saveimage-plus": [ + [ + "SaveImagePlus" + ], + { + "title_aux": "Save Image Plus for ComfyUI" + } + ], + "https://github.com/Gourieff/comfyui-reactor-node": [ + [ + "ImageRGBA2RGB", + "ReActorBuildFaceModel", + "ReActorFaceBoost", + "ReActorFaceSwap", + "ReActorFaceSwapOpt", + "ReActorImageDublicator", + "ReActorLoadFaceModel", + "ReActorMakeFaceModelBatch", + "ReActorMaskHelper", + "ReActorOptions", + "ReActorRestoreFace", + "ReActorSaveFaceModel" + ], + { + "title_aux": "ReActor Node for ComfyUI" + } + ], + "https://github.com/GraftingRayman/ComfyUI_GraftingRayman": [ + [ + "GR Background Remover REMBG", + "GR Checkered Board", + "GR Counter", + "GR Flip Tile Random Inverted", + "GR Flip Tile Random Red Ring", + "GR Image Details Displayer", + "GR Image Details Saver", + "GR Image Paste", + "GR Image Paste With Mask", + "GR Image Resize", + "GR Image Resize Methods", + "GR Image Size", + "GR Image/Depth Mask", + "GR Mask Create", + "GR Mask Create Random", + "GR Mask Resize", + "GR Multi Mask Create", + "GR Onomatopoeia", + "GR Prompt HUB", + "GR Prompt Selector", + "GR Prompt Selector Multi", + "GR Scroller", + "GR Stack Image", + "GR Text Overlay", + "GR Tile and Border Image", + "GR Tile and Border Image Random Flip" + ], + { + "title_aux": "GraftingRayman" + } + ], + "https://github.com/Grant-CP/ComfyUI-LivePortraitKJ-MPS": [ + [ + "DownloadAndLoadLivePortraitModels", + "LivePortraitProcess" + ], + { + "title_aux": "ComfyUI-LivePortraitKJ-MPS" + } + ], + "https://github.com/GreenLandisaLie/AuraSR-ComfyUI": [ + [ + "AuraSR.AuraSRUpscaler" + ], + { + "title_aux": "AuraSR-ComfyUI" + } + ], + "https://github.com/Guillaume-Fgt/ComfyUI_StableCascadeLatentRatio": [ + [ + "StableCascadeLatentRatio" + ], + { + "title_aux": "ComfyUI_StableCascadeLatentRatio" + } + ], + "https://github.com/HAL41/ComfyUI-aichemy-nodes": [ + [ + "aichemyYOLOv8Segmentation" + ], + { + "title_aux": "ComfyUI aichemy nodes" + } + ], + "https://github.com/HECer/ComfyUI-FilePathCreator": [ + [ + "FilePathCreator" + ], + { + "title_aux": "ComfyUI-FilePathCreator" + } + ], + "https://github.com/Hangover3832/ComfyUI-Hangover-Moondream": [ + [ + "Moondream Interrogator" + ], + { + "author": "AlexL", + "description": "An implementation of the moondream visual LLM", + "nickname": "Hangover-Moondream", + "title": "ComfyUI-Hangover-Moondream", + "title_aux": "ComfyUI-Hangover-Moondream" + } + ], + "https://github.com/Hangover3832/ComfyUI-Hangover-Nodes": [ + [ + "Image Scale Bounding Box", + "MS kosmos-2 Interrogator", + "Make Inpaint Model", + "Save Image w/o Metadata" + ], + { + "author": "AlexL", + "description": "Scales an input image into a given box size, whereby the aspect ratio keeps retained.", + "nickname": "Hangover-Image_Scale_Bouning_Box", + "title": "ComfyUI-Hangover-Image_Scale_Bouning_Box", + "title_aux": "ComfyUI-Hangover-Nodes" + } + ], + "https://github.com/Hangover3832/ComfyUI-Hangover-Recognize_Anything": [ + [ + "Recognize Anything Model (RAM)" + ], + { + "author": "AlexL", + "description": "An implementation of the Recognize Anything Model (RAM++) for ComfyUI. The counterpart of Segment Anything Model (SAM).", + "nickname": "Hangover-Recognize_Anything", + "title": "ComfyUI-Hangover-Recognize_Anything", + "title_aux": "Recognize Anything Model (RAM) for ComfyUI" + } + ], + "https://github.com/Haoming02/comfyui-diffusion-cg": [ + [ + "Normalization", + "NormalizationXL", + "Recenter", + "Recenter XL" + ], + { + "title_aux": "ComfyUI Diffusion Color Grading" + } + ], + "https://github.com/Haoming02/comfyui-floodgate": [ + [ + "FloodGate" + ], + { + "title_aux": "ComfyUI Floodgate" + } + ], + "https://github.com/HaydenReeve/ComfyUI-Better-Strings": [ + [ + "BetterString" + ], + { + "title_aux": "ComfyUI Better Strings" + } + ], + "https://github.com/HebelHuber/comfyui-enhanced-save-node": [ + [ + "EnhancedSaveNode" + ], + { + "title_aux": "comfyui-enhanced-save-node" + } + ], + "https://github.com/Hiero207/ComfyUI-Hiero-Nodes": [ + [ + "Load Prompt Travel file", + "Post to Discord w/ Webhook", + "Save Prompt Travel file" + ], + { + "author": "Hiero", + "description": "Just some nodes that I wanted/needed, so I made them.", + "nickname": "HNodes", + "title": "Hiero-Nodes", + "title_aux": "Hiero-Nodes" + } + ], + "https://github.com/IDGallagher/ComfyUI-IG-Nodes": [ + [ + "IG Analyze SSIM", + "IG Cross Fade Images", + "IG Explorer", + "IG Float", + "IG Float List", + "IG Folder", + "IG Int", + "IG Interpolate", + "IG Load Image", + "IG Load Images", + "IG Multiply", + "IG Path Join", + "IG String", + "IG String List", + "IG ZFill" + ], + { + "author": "IDGallagher", + "description": "Custom nodes to aid in the exploration of Latent Space", + "nickname": "IG Interpolation Nodes", + "title": "IG Interpolation Nodes", + "title_aux": "IG Interpolation Nodes" + } + ], + "https://github.com/ITurchenko/ComfyUI-SizeFromArray": [ + [ + "SizeFromArray" + ], + { + "title_aux": "ComfyUI-SizeFromArray" + } + ], + "https://github.com/ImmortalPie/ComfyUI-PonySwitch/raw/main/PonySwitch.py": [ + [ + "PonySwitch" + ], + { + "title_aux": "PonySwitch Node" + } + ], + "https://github.com/Intersection98/ComfyUI_MX_post_processing-nodes": [ + [ + "MX_AlphaBlend", + "MX_Blend", + "MX_Blur", + "MX_Canny", + "MX_ChromaticAberration", + "MX_ColorCorrect", + "MX_ColorMatch", + "MX_ColorTint", + "MX_Glow", + "MX_HSVThresholdMask", + "MX_KuwaharaBlur(Cartoon)", + "MX_LUT", + "MX_LensBokeh", + "MX_LensOpticAxis", + "MX_LensZoomBurst", + "MX_Mosaic", + "MX_Noise", + "MX_Posterize", + "MX_SineWave", + "MX_Solarize", + "MX_Vignette" + ], + { + "title_aux": "ComfyUI-MX-post-processing-nodes" + } + ], + "https://github.com/Inzaniak/comfyui-ranbooru": [ + [ + "LockSeed", + "PromptBackground", + "PromptLimit", + "PromptMix", + "PromptRandomWeight", + "PromptRemove", + "Ranbooru", + "RanbooruURL", + "RandomPicturePath", + "TimestampFileName" + ], + { + "title_aux": "Ranbooru for ComfyUI" + } + ], + "https://github.com/IsItDanOrAi/ComfyUI-Stereopsis": [ + [ + "Dan_FrameDelay", + "Dan_Stereopsis" + ], + { + "title_aux": "ComfyUI-Stereopsis" + } + ], + "https://github.com/JPS-GER/ComfyUI_JPS-Nodes": [ + [ + "CLIPTextEncode SDXL Plus (JPS)", + "Conditioning Switch (JPS)", + "ControlNet Switch (JPS)", + "Crop Image Pipe (JPS)", + "Crop Image Settings (JPS)", + "Crop Image Square (JPS)", + "Crop Image TargetSize (JPS)", + "CtrlNet CannyEdge Pipe (JPS)", + "CtrlNet CannyEdge Settings (JPS)", + "CtrlNet MiDaS Pipe (JPS)", + "CtrlNet MiDaS Settings (JPS)", + "CtrlNet OpenPose Pipe (JPS)", + "CtrlNet OpenPose Settings (JPS)", + "CtrlNet ZoeDepth Pipe (JPS)", + "CtrlNet ZoeDepth Settings (JPS)", + "Disable Enable Switch (JPS)", + "Enable Disable Switch (JPS)", + "Generation TXT IMG Settings (JPS)", + "Get Date Time String (JPS)", + "Get Image Size (JPS)", + "IP Adapter Settings (JPS)", + "IP Adapter Settings Pipe (JPS)", + "IP Adapter Tiled Settings (JPS)", + "IP Adapter Tiled Settings Pipe (JPS)", + "IPA Switch (JPS)", + "Image Prepare Pipe (JPS)", + "Image Prepare Settings (JPS)", + "Image Switch (JPS)", + "ImageToImage Pipe (JPS)", + "ImageToImage Settings (JPS)", + "Images Masks MultiPipe (JPS)", + "InstantID Mask Prepare Pipe (JPS)", + "InstantID Mask Prepare Settings (JPS)", + "InstantID Pipe (JPS)", + "InstantID Pose Prepare Pipe (JPS)", + "InstantID Pose Prepare Settings (JPS)", + "InstantID Settings (JPS)", + "InstantID Source Prepare Pipe (JPS)", + "InstantID Source Prepare Settings (JPS)", + "Integer Switch (JPS)", + "Largest Int (JPS)", + "Latent Switch (JPS)", + "Lora Loader (JPS)", + "Mask Switch (JPS)", + "Model Switch (JPS)", + "Multiply Float Float (JPS)", + "Multiply Int Float (JPS)", + "Multiply Int Int (JPS)", + "Prepare Image (JPS)", + "Prepare Image Plus (JPS)", + "Prepare Image Tiled IPA (JPS)", + "Resolution Multiply (JPS)", + "Revision Settings (JPS)", + "Revision Settings Pipe (JPS)", + "SDXL Basic Settings (JPS)", + "SDXL Basic Settings Pipe (JPS)", + "SDXL Fundamentals MultiPipe (JPS)", + "SDXL Prompt Handling (JPS)", + "SDXL Prompt Handling Plus (JPS)", + "SDXL Prompt Styler (JPS)", + "SDXL Recommended Resolution Calc (JPS)", + "SDXL Resolutions (JPS)", + "SDXL Settings (JPS)", + "SDXL Settings Pipe (JPS)", + "Sampler Scheduler Settings (JPS)", + "Save Images Plus (JPS)", + "Substract Int Int (JPS)", + "Text Concatenate (JPS)", + "Text Prompt (JPS)", + "Text Prompt Combo (JPS)", + "Time Seed (JPS)", + "VAE Switch (JPS)" + ], + { + "author": "JPS", + "description": "Various nodes to handle SDXL Resolutions, SDXL Basic Settings, IP Adapter Settings, Revision Settings, SDXL Prompt Styler, Crop Image to Square, Crop Image to Target Size, Get Date-Time String, Resolution Multiply, Largest Integer, 5-to-1 Switches for Integer, Images, Latents, Conditioning, Model, VAE, ControlNet", + "nickname": "JPS Custom Nodes", + "title": "JPS Custom Nodes for ComfyUI", + "title_aux": "JPS Custom Nodes for ComfyUI" + } + ], + "https://github.com/Jannchie/ComfyUI-J": [ + [ + "DiffusersCompelPromptEmbedding", + "DiffusersControlnetLoader", + "DiffusersControlnetUnit", + "DiffusersControlnetUnitStack", + "DiffusersDecoder", + "DiffusersGenerator", + "DiffusersPipeline", + "DiffusersPrepareLatents", + "DiffusersTextureInversionLoader", + "DiffusersXLPipeline", + "GetAverageColorFromImage", + "GetFilledColorImage" + ], + { + "title_aux": "ComfyUI-J" + } + ], + "https://github.com/JaredTherriault/ComfyUI-JNodes": [ + [ + "JNodes_AddOrSetMetaDataKey", + "JNodes_AnyToString", + "JNodes_AppendReversedFrames", + "JNodes_BooleanSelectorWithString", + "JNodes_BreakMediaInfo", + "JNodes_CheckpointSelectorWithString", + "JNodes_CreateStereoscopicImageFromDepth", + "JNodes_GetOutputDirectory", + "JNodes_GetParameterFromList", + "JNodes_GetParameterGlobal", + "JNodes_GetTempDirectory", + "JNodes_ImageFormatSelector", + "JNodes_ImageSizeSelector", + "JNodes_LoadVideo", + "JNodes_LoadVisualMediaFromPath", + "JNodes_LoraExtractor", + "JNodes_MediaInfoToString", + "JNodes_OutVideoInfo", + "JNodes_ParseDynamicPrompts", + "JNodes_ParseParametersToGlobalList", + "JNodes_ParseWildcards", + "JNodes_PromptBuilderSingleSubject", + "JNodes_RemoveCommentedText", + "JNodes_RemoveMetaDataKey", + "JNodes_RemoveParseableDataForInference", + "JNodes_SamplerSelectorWithString", + "JNodes_SaveImageWithOutput", + "JNodes_SaveVideo", + "JNodes_SchedulerSelectorWithString", + "JNodes_SearchAndReplace", + "JNodes_SearchAndReplaceFromFile", + "JNodes_SearchAndReplaceFromList", + "JNodes_SelectRandomFileFromDirectory", + "JNodes_SetNegativePromptInMetaData", + "JNodes_SetPositivePromptInMetaData", + "JNodes_SplitAndJoin", + "JNodes_StringLiteral", + "JNodes_SyncedStringLiteral", + "JNodes_TokenCounter", + "JNodes_TrimAndStrip", + "JNodes_UploadVideo", + "JNodes_UploadVisualMedia", + "JNodes_VaeSelectorWithString" + ], + { + "title_aux": "ComfyUI-JNodes" + } + ], + "https://github.com/JayLyu/ComfyUI_BaiKong_Node": [ + [ + "BK_ColorLimit", + "BK_ColorSelector", + "BK_GradientImage", + "BK_Img2Color" + ], + { + "title_aux": "ComfyUI_BaiKong_Node" + } + ], + "https://github.com/JcandZero/ComfyUI_GLM4Node": [ + [ + "GLM3_turbo_CHAT", + "GLM4_CHAT", + "GLM4_Vsion_IMGURL" + ], + { + "title_aux": "ComfyUI_GLM4Node" + } + ], + "https://github.com/Jcd1230/rembg-comfyui-node": [ + [ + "Image Remove Background (rembg)" + ], + { + "title_aux": "Rembg Background Removal Node for ComfyUI" + } + ], + "https://github.com/JerryOrbachJr/ComfyUI-RandomSize": [ + [ + "JOJR_RandomSize" + ], + { + "author": "JerryOrbachJr", + "description": "A ComfyUI custom node that randomly selects a height and width pair from a list in a config file", + "nickname": "Random Size", + "title": "Random Size", + "title_aux": "Random Size" + } + ], + "https://github.com/JettHu/ComfyUI-TCD": [ + [ + "TCDModelSamplingDiscrete" + ], + { + "title_aux": "ComfyUI-TCD" + } + ], + "https://github.com/JettHu/ComfyUI_TGate": [ + [ + "TGateApply", + "TGateApplyAdvanced", + "TGateApplySimple" + ], + { + "title_aux": "ComfyUI_TGate" + } + ], + "https://github.com/Jordach/comfy-plasma": [ + [ + "JDC_AutoContrast", + "JDC_BlendImages", + "JDC_BrownNoise", + "JDC_Contrast", + "JDC_EqualizeGrey", + "JDC_GaussianBlur", + "JDC_GreyNoise", + "JDC_Greyscale", + "JDC_ImageLoader", + "JDC_ImageLoaderMeta", + "JDC_PinkNoise", + "JDC_Plasma", + "JDC_PlasmaSampler", + "JDC_PowerImage", + "JDC_RandNoise", + "JDC_ResizeFactor" + ], + { + "title_aux": "comfy-plasma" + } + ], + "https://github.com/Kangkang625/ComfyUI-paint-by-example": [ + [ + "PaintbyExamplePipeLoader", + "PaintbyExampleSampler" + ], + { + "title_aux": "ComfyUI-Paint-by-Example" + } + ], + "https://github.com/KewkLW/ComfyUI-kewky_tools": [ + [ + "CLIPInterrogator", + "FormattedPromptNode", + "ImageBatcher", + "LoadImagePlus", + "LoadVideoPlus", + "TensorDebugPlus", + "TextAppendNode", + "TextSearchNode", + "VRAM_Debug_Plus" + ], + { + "title_aux": "ComfyUI-kewky_tools" + } + ], + "https://github.com/KoreTeknology/ComfyUI-Universal-Styler": [ + [ + "Load Nai Styles Complex CSV", + "ShowText|pysssss", + "Universal_Styler_Node", + "concat" + ], + { + "title_aux": "ComfyUI Universal Styler" + } + ], + "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet": [ + [ + "ACN_AdvancedControlNetApply", + "ACN_ControlNetLoaderWithLoraAdvanced", + "ACN_DefaultUniversalWeights", + "ACN_ReferenceControlNet", + "ACN_ReferenceControlNetFinetune", + "ACN_ReferencePreprocessor", + "ACN_SparseCtrlIndexMethodNode", + "ACN_SparseCtrlLoaderAdvanced", + "ACN_SparseCtrlMergedLoaderAdvanced", + "ACN_SparseCtrlRGBPreprocessor", + "ACN_SparseCtrlSpreadMethodNode", + "ACN_SparseCtrlWeightExtras", + "ACN_TimestepKeyframeFromStrengthList", + "ACN_TimestepKeyframeInterpolation", + "ControlNetLoaderAdvanced", + "CustomControlNetWeights", + "CustomT2IAdapterWeights", + "DiffControlNetLoaderAdvanced", + "LatentKeyframe", + "LatentKeyframeBatchedGroup", + "LatentKeyframeGroup", + "LatentKeyframeTiming", + "LoadImagesFromDirectory", + "ScaledSoftControlNetWeights", + "ScaledSoftMaskedUniversalWeights", + "SoftControlNetWeights", + "SoftT2IAdapterWeights", + "TimestepKeyframe" + ], + { + "title_aux": "ComfyUI-Advanced-ControlNet" + } + ], + "https://github.com/Kosinkadink/ComfyUI-AnimateDiff-Evolved": [ + [ + "ADE_AdjustPEFullStretch", + "ADE_AdjustPEManual", + "ADE_AdjustPESweetspotStretch", + "ADE_AdjustWeightAllAdd", + "ADE_AdjustWeightAllMult", + "ADE_AdjustWeightIndivAdd", + "ADE_AdjustWeightIndivAttnAdd", + "ADE_AdjustWeightIndivAttnMult", + "ADE_AdjustWeightIndivMult", + "ADE_AnimateDiffCombine", + "ADE_AnimateDiffKeyframe", + "ADE_AnimateDiffLoRALoader", + "ADE_AnimateDiffLoaderGen1", + "ADE_AnimateDiffLoaderV1Advanced", + "ADE_AnimateDiffLoaderWithContext", + "ADE_AnimateDiffModelSettings", + "ADE_AnimateDiffModelSettingsAdvancedAttnStrengths", + "ADE_AnimateDiffModelSettingsSimple", + "ADE_AnimateDiffModelSettings_Release", + "ADE_AnimateDiffSamplingSettings", + "ADE_AnimateDiffSettings", + "ADE_AnimateDiffUniformContextOptions", + "ADE_AnimateDiffUnload", + "ADE_ApplyAnimateDiffModel", + "ADE_ApplyAnimateDiffModelSimple", + "ADE_ApplyAnimateDiffModelWithCameraCtrl", + "ADE_ApplyAnimateDiffModelWithPIA", + "ADE_ApplyAnimateLCMI2VModel", + "ADE_AttachLoraHookToCLIP", + "ADE_AttachLoraHookToConditioning", + "ADE_BatchedContextOptions", + "ADE_CameraCtrlAnimateDiffKeyframe", + "ADE_CameraManualPoseAppend", + "ADE_CameraPoseAdvanced", + "ADE_CameraPoseBasic", + "ADE_CameraPoseCombo", + "ADE_CombineLoraHooks", + "ADE_CombineLoraHooksEight", + "ADE_CombineLoraHooksFour", + "ADE_ConditioningSetMask", + "ADE_ConditioningSetMaskAndCombine", + "ADE_ConditioningSetUnmaskedAndCombine", + "ADE_CustomCFG", + "ADE_CustomCFGKeyframe", + "ADE_EmptyLatentImageLarge", + "ADE_InjectI2VIntoAnimateDiffModel", + "ADE_InjectPIAIntoAnimateDiffModel", + "ADE_InputPIA_Multival", + "ADE_InputPIA_PaperPresets", + "ADE_IterationOptsDefault", + "ADE_IterationOptsFreeInit", + "ADE_LoadAnimateDiffModel", + "ADE_LoadAnimateDiffModelWithCameraCtrl", + "ADE_LoadAnimateLCMI2VModel", + "ADE_LoadCameraPoses", + "ADE_LoopedUniformContextOptions", + "ADE_LoopedUniformViewOptions", + "ADE_LoraHookKeyframe", + "ADE_LoraHookKeyframeFromStrengthList", + "ADE_LoraHookKeyframeInterpolation", + "ADE_MultivalConvertToMask", + "ADE_MultivalDynamic", + "ADE_MultivalDynamicFloatInput", + "ADE_MultivalScaledMask", + "ADE_NoiseLayerAdd", + "ADE_NoiseLayerAddWeighted", + "ADE_NoiseLayerReplace", + "ADE_NoisedImageInjectOptions", + "ADE_NoisedImageInjection", + "ADE_PIA_AnimateDiffKeyframe", + "ADE_PairedConditioningSetMask", + "ADE_PairedConditioningSetMaskAndCombine", + "ADE_PairedConditioningSetUnmaskedAndCombine", + "ADE_RawSigmaSchedule", + "ADE_RegisterLoraHook", + "ADE_RegisterLoraHookModelOnly", + "ADE_RegisterModelAsLoraHook", + "ADE_RegisterModelAsLoraHookModelOnly", + "ADE_ReplaceCameraParameters", + "ADE_ReplaceOriginalPoseAspectRatio", + "ADE_SetLoraHookKeyframe", + "ADE_SigmaSchedule", + "ADE_SigmaScheduleSplitAndCombine", + "ADE_SigmaScheduleWeightedAverage", + "ADE_SigmaScheduleWeightedAverageInterp", + "ADE_StandardStaticContextOptions", + "ADE_StandardStaticViewOptions", + "ADE_StandardUniformContextOptions", + "ADE_StandardUniformViewOptions", + "ADE_TimestepsConditioning", + "ADE_UpscaleAndVAEEncode", + "ADE_UseEvolvedSampling", + "ADE_ViewsOnlyContextOptions", + "AnimateDiffLoaderV1", + "CheckpointLoaderSimpleWithNoiseSelect" + ], + { + "title_aux": "AnimateDiff Evolved" + } + ], + "https://github.com/Kosinkadink/ComfyUI-VideoHelperSuite": [ + [ + "VHS_AudioToVHSAudio", + "VHS_BatchManager", + "VHS_DuplicateImages", + "VHS_DuplicateLatents", + "VHS_DuplicateMasks", + "VHS_GetImageCount", + "VHS_GetLatentCount", + "VHS_GetMaskCount", + "VHS_LoadAudio", + "VHS_LoadAudioUpload", + "VHS_LoadImages", + "VHS_LoadImagesPath", + "VHS_LoadVideo", + "VHS_LoadVideoPath", + "VHS_MergeImages", + "VHS_MergeLatents", + "VHS_MergeMasks", + "VHS_PruneOutputs", + "VHS_SelectEveryNthImage", + "VHS_SelectEveryNthLatent", + "VHS_SelectEveryNthMask", + "VHS_SplitImages", + "VHS_SplitLatents", + "VHS_SplitMasks", + "VHS_VAEDecodeBatched", + "VHS_VAEEncodeBatched", + "VHS_VHSAudioToAudio", + "VHS_VideoCombine", + "VHS_VideoInfo", + "VHS_VideoInfoLoaded", + "VHS_VideoInfoSource" + ], + { + "title_aux": "ComfyUI-VideoHelperSuite" + } + ], + "https://github.com/KytraScript/ComfyUI_KytraWebhookHTTP": [ + [ + "SendToDiscordWebhook" + ], + { + "title_aux": "ComfyUI_KytraWebhookHTTP" + } + ], + "https://github.com/LEv145/images-grid-comfy-plugin": [ + [ + "GridAnnotation", + "ImageCombine", + "ImagesGridByColumns", + "ImagesGridByRows", + "LatentCombine" + ], + { + "title_aux": "ImagesGrid" + } + ], + "https://github.com/LarryJane491/Image-Captioning-in-ComfyUI": [ + [ + "LoRA Caption Load", + "LoRA Caption Save" + ], + { + "title_aux": "Image-Captioning-in-ComfyUI" + } + ], + "https://github.com/LarryJane491/Lora-Training-in-Comfy": [ + [ + "Lora Training in Comfy (Advanced)", + "Lora Training in ComfyUI", + "Tensorboard Access" + ], + { + "title_aux": "Lora-Training-in-Comfy" + } + ], + "https://github.com/Layer-norm/comfyui-lama-remover": [ + [ + "LamaRemover", + "LamaRemoverIMG" + ], + { + "title_aux": "Comfyui lama remover" + } + ], + "https://github.com/Lerc/canvas_tab": [ + [ + "Canvas_Tab", + "Send_To_Editor" + ], + { + "author": "Lerc", + "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor.", + "nickname": "Canvas Tab", + "title": "Canvas Tab", + "title_aux": "Canvas Tab" + } + ], + "https://github.com/Limitex/ComfyUI-Calculation": [ + [ + "CenterCalculation", + "CreateQRCode" + ], + { + "title_aux": "ComfyUI-Calculation" + } + ], + "https://github.com/Limitex/ComfyUI-Diffusers": [ + [ + "CreateIntListNode", + "DiffusersClipTextEncode", + "DiffusersModelMakeup", + "DiffusersPipelineLoader", + "DiffusersSampler", + "DiffusersSchedulerLoader", + "DiffusersVaeLoader", + "LcmLoraLoader", + "StreamDiffusionCreateStream", + "StreamDiffusionFastSampler", + "StreamDiffusionSampler", + "StreamDiffusionWarmup" + ], + { + "title_aux": "ComfyUI-Diffusers" + } + ], + "https://github.com/Loewen-Hob/rembg-comfyui-node-better": [ + [ + "Image Remove Background (rembg)" + ], + { + "title_aux": "Rembg Background Removal Node for ComfyUI (Better)" + } + ], + "https://github.com/LonicaMewinsky/ComfyUI-MakeFrame": [ + [ + "BreakFrames", + "BreakGrid", + "GetKeyFrames", + "MakeGrid", + "RandomImageFromDir" + ], + { + "title_aux": "ComfyBreakAnim" + } + ], + "https://github.com/LonicaMewinsky/ComfyUI-RawSaver": [ + [ + "SaveTifImage" + ], + { + "title_aux": "ComfyUI-RawSaver" + } + ], + "https://github.com/Ludobico/ComfyUI-ScenarioPrompt": [ + [ + "ScenarioPrompt" + ], + { + "title_aux": "ComfyUI-ScenarioPrompt" + } + ], + "https://github.com/LyazS/comfyui-anime-seg": [ + [ + "Anime Character Seg" + ], + { + "title_aux": "Anime Character Segmentation node for comfyui" + } + ], + "https://github.com/M1kep/ComfyLiterals": [ + [ + "Checkpoint", + "Float", + "Int", + "KepStringLiteral", + "Lora", + "Operation", + "String" + ], + { + "title_aux": "ComfyLiterals" + } + ], + "https://github.com/M1kep/ComfyUI-KepOpenAI": [ + [ + "KepOpenAI_ImageWithPrompt" + ], + { + "title_aux": "ComfyUI-KepOpenAI" + } + ], + "https://github.com/M1kep/ComfyUI-OtherVAEs": [ + [ + "OtherVAE_Taesd" + ], + { + "title_aux": "ComfyUI-OtherVAEs" + } + ], + "https://github.com/M1kep/Comfy_KepKitchenSink": [ + [ + "KepRotateImage" + ], + { + "title_aux": "Comfy_KepKitchenSink" + } + ], + "https://github.com/M1kep/Comfy_KepListStuff": [ + [ + "Empty Images", + "Image Overlay", + "ImageListLoader", + "Join Float Lists", + "Join Image Lists", + "KepStringList", + "KepStringListFromNewline", + "Kep_JoinListAny", + "Kep_RepeatList", + "Kep_ReverseList", + "Kep_VariableImageBuilder", + "List Length", + "Range(Num Steps) - Float", + "Range(Num Steps) - Int", + "Range(Step) - Float", + "Range(Step) - Int", + "Stack Images", + "XYAny", + "XYImage" + ], + { + "title_aux": "Comfy_KepListStuff" + } + ], + "https://github.com/M1kep/Comfy_KepMatteAnything": [ + [ + "MatteAnything_DinoBoxes", + "MatteAnything_GenerateVITMatte", + "MatteAnything_InitSamPredictor", + "MatteAnything_LoadDINO", + "MatteAnything_LoadVITMatteModel", + "MatteAnything_SAMLoader", + "MatteAnything_SAMMaskFromBoxes", + "MatteAnything_ToTrimap" + ], + { + "title_aux": "Comfy_KepMatteAnything" + } + ], + "https://github.com/M1kep/KepPromptLang": [ + [ + "Build Gif", + "Special CLIP Loader" + ], + { + "title_aux": "KepPromptLang" + } + ], + "https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes": [ + [ + "\u26d4 Generate Negative Prompt", + "\u2728 Groq LLM API", + "\ud83d\udcbe Save Text File With Path", + "\ud83d\uddbc\ufe0f Download Image from URL" + ], + { + "title_aux": "ComfyUI-mnemic-nodes" + } + ], + "https://github.com/Makeezi/ComfyUI-promptLAB": [ + [ + "PromptLAB" + ], + { + "title_aux": "ComfyUI-promptLAB" + } + ], + "https://github.com/Mamaaaamooooo/batchImg-rembg-ComfyUI-nodes": [ + [ + "Image Remove Background (rembg)" + ], + { + "title_aux": "Batch Rembg for ComfyUI" + } + ], + "https://github.com/ManglerFTW/ComfyI2I": [ + [ + "Color Transfer", + "Combine and Paste", + "Inpaint Segments", + "Mask Ops" + ], + { + "author": "ManglerFTW", + "title": "ComfyI2I", + "title_aux": "ComfyI2I" + } + ], + "https://github.com/MaraScott/ComfyUI_MaraScott_Nodes": [ + [ + "MaraScottAnyBusNode", + "MaraScottAnyBus_v2", + "MaraScottDisplayInfoNode", + "MaraScottDisplayInfo_v1", + "MaraScottPasteInpaintingByMask_v1", + "MaraScottPromptFromImage_v1", + "MaraScottSetInpaintingByMask_v1", + "MaraScottUpscalerRefinerNode_v2", + "MaraScottUpscalerRefinerNode_v3", + "MaraScott_Kijai_TokenCounter_v1", + "McBoaty_Refiner_v4", + "McBoaty_TilePrompter_v4", + "McBoaty_Upscaler_v4" + ], + { + "title_aux": "\ud83d\udc30 MaraScott Nodes" + } + ], + "https://github.com/MarcusNyne/m9-prompts-comfyui": [ + [ + "ScramblePrompts_m9", + "TweakWeights_m9" + ], + { + "title_aux": "m9-prompts-comfyui" + } + ], + "https://github.com/MariusKM/ComfyUI-BadmanNodes": [ + [ + "BadmanCLIPTextEncodeSDXLRegion", + "BadmanIO", + "BadmanIntUtil", + "BadmanStringSelect", + "Badman_Blend", + "Badman_Concat_String", + "Badman_HexGenerator", + "Badman_Print", + "Badman_String" + ], + { + "title_aux": "ComfyUI-BadmanNodes" + } + ], + "https://github.com/MarkoCa1/ComfyUI-Text": [ + [ + "CombinationText", + "PlaceholderText", + "ReplaceText", + "ShowText" + ], + { + "title_aux": "ComfyUI-Text" + } + ], + "https://github.com/MarkoCa1/ComfyUI_Segment_Mask": [ + [ + "AutomaticMask(segment anything)" + ], + { + "title_aux": "ComfyUI_Segment_Mask" + } + ], + "https://github.com/Mason-McGough/ComfyUI-Mosaica": [ + [ + "ApplyLUTToLabelImage", + "KMeans", + "LoadLUTFromMatplotlib", + "MeanShift", + "RandomLUT", + "Watershed" + ], + { + "title_aux": "Mosaica" + } + ], + "https://github.com/MilitantHitchhiker/MilitantHitchhiker-SwitchbladePack": [ + [ + "IntegratedRandomPromptGenerator", + "TextAppender" + ], + { + "author": "Militant Hitchhiker", + "description": "Militant Hitchhiker's multi-function nodes.", + "nickname": "Switchblade", + "title": "Switchblade Pack", + "title_aux": "Militant Hitchhiker's Switchblade Pack" + } + ], + "https://github.com/Miosp/ComfyUI-FBCNN": [ + [ + "JPEG artifacts removal FBCNN" + ], + { + "title_aux": "ComfyUI-FBCNN" + } + ], + "https://github.com/MitoshiroPJ/comfyui_slothful_attention": [ + [ + "NearSightedAttention", + "NearSightedAttentionSimple", + "NearSightedTile", + "SlothfulAttention" + ], + { + "title_aux": "ComfyUI Slothful Attention" + } + ], + "https://github.com/MokkaBoss1/ComfyUI_Mokkaboss1": [ + [ + "AnimeCosplayDir", + "AspectRatioCondition", + "ChooseImage", + "Colors", + "CombinedCrop", + "ConnectFloat", + "ConnectImage", + "ConnectInteger", + "ConnectLatent", + "ConnectString", + "DirSelector", + "DoubleClipTextEncode", + "EmbeddingLoader", + "FilmCharDir", + "FuseImages", + "FuseImages2", + "HashText", + "HueSatLum", + "HueShift", + "ImageDimensions", + "ImageDimensionsBatch", + "ImageOverlayResized", + "ImageResizeLong", + "ImageZigzag", + "IndoorBackgrounds", + "IndoorDir", + "IntEvaluate", + "IntFloatDict", + "IntStringDict", + "JsonSearch", + "KillWorkflow", + "LandscapeBackgrounds", + "LandscapeDir", + "MakeupStylesDir", + "Mbsampler", + "OptimalCrop", + "Overlay", + "PhotomontageA", + "PhotomontageB", + "PhotomontageC", + "PostSamplerCrop", + "PresetLoad", + "PresetRemove", + "PresetSave", + "PromptSwitcher", + "RandomString", + "SDXLEmptyLatent", + "SavePrompt", + "SaveWithMetaData", + "SaveWithMetaData2", + "SearchReplace", + "SimplePrompts", + "SpecificStylesDir", + "SplitImages", + "StringJoin", + "TimeStamp", + "TintnShift", + "TricolorComposition", + "WorkflowSettings", + "WrapText", + "X_In_a_Dress", + "X_In_a_Suit", + "X_In_a_Suit)", + "ZoomCrop", + "imageborder" + ], + { + "title_aux": "Node Pack mostly for manipulating strings and integers" + } + ], + "https://github.com/MrForExample/ComfyUI-3D-Pack": [ + [], + { + "nodename_pattern": "^\\[Comfy3D\\]", + "title_aux": "ComfyUI-3D-Pack" + } + ], + "https://github.com/MrForExample/ComfyUI-AnimateAnyone-Evolved": [ + [], + { + "nodename_pattern": "^\\[AnimateAnyone\\]", + "title_aux": "ComfyUI-AnimateAnyone-Evolved" + } + ], + "https://github.com/MrSamSeen/ComfyUI_SSStereoscope": [ + [ + "SBS_by_SamSeen" + ], + { + "title_aux": "ComfyUI_SSStereoscope" + } + ], + "https://github.com/Munkyfoot/ComfyUI-TextOverlay": [ + [ + "Text Overlay" + ], + { + "title_aux": "ComfyUI-TextOverlay" + } + ], + "https://github.com/NeuralSamurAI/Comfyui-Superprompt-Unofficial": [ + [ + "SuperPrompterNode" + ], + { + "title_aux": "SuperPrompter Node for ComfyUI" + } + ], + "https://github.com/NicholasMcCarthy/ComfyUI_TravelSuite": [ + [ + "LatentTravel" + ], + { + "title_aux": "ComfyUI_TravelSuite" + } + ], + "https://github.com/NimaNzrii/comfyui-photoshop": [ + [ + "\ud83d\udd39 Photoshop RemoteConnection", + "\ud83d\udd39Photoshop ComfyUI Plugin", + "\ud83d\udd39SendTo Photoshop Plugin" + ], + { + "title_aux": "comfyui-photoshop" + } + ], + "https://github.com/NimaNzrii/comfyui-popup_preview": [ + [ + "PreviewPopup" + ], + { + "title_aux": "comfyui-popup_preview" + } + ], + "https://github.com/Niutonian/ComfyUi-NoodleWebcam": [ + [ + "WebcamNode" + ], + { + "title_aux": "ComfyUi-NoodleWebcam" + } + ], + "https://github.com/Nlar/ComfyUI_CartoonSegmentation": [ + [ + "AnimeSegmentation", + "KenBurnsConfigLoader", + "KenBurns_Processor", + "LoadImageFilename" + ], + { + "author": "Nels Larsen", + "description": "This extension offers a front end to the Cartoon Segmentation Project (https://github.com/CartoonSegmentation/CartoonSegmentation)", + "nickname": "CfyCS", + "title": "ComfyUI_CartoonSegmentation", + "title_aux": "ComfyUI_CartoonSegmentation" + } + ], + "https://github.com/NotHarroweD/Harronode": [ + [ + "Harronode" + ], + { + "author": "HarroweD and quadmoon (https://github.com/traugdor)", + "description": "This extension to ComfyUI will build a prompt for the Harrlogos LoRA for SDXL.", + "nickname": "Harronode", + "nodename_pattern": "Harronode", + "title": "Harrlogos Prompt Builder Node", + "title_aux": "Harrlogos Prompt Builder Node" + } + ], + "https://github.com/Nourepide/ComfyUI-Allor": [ + [ + "AlphaChanelAdd", + "AlphaChanelAddByMask", + "AlphaChanelAsMask", + "AlphaChanelRemove", + "AlphaChanelRestore", + "ClipClamp", + "ClipVisionClamp", + "ClipVisionOutputClamp", + "ConditioningClamp", + "ControlNetClamp", + "GligenClamp", + "ImageBatchCopy", + "ImageBatchFork", + "ImageBatchGet", + "ImageBatchJoin", + "ImageBatchPermute", + "ImageBatchRemove", + "ImageClamp", + "ImageCompositeAbsolute", + "ImageCompositeAbsoluteByContainer", + "ImageCompositeRelative", + "ImageCompositeRelativeByContainer", + "ImageContainer", + "ImageContainerInheritanceAdd", + "ImageContainerInheritanceMax", + "ImageContainerInheritanceScale", + "ImageContainerInheritanceSum", + "ImageDrawArc", + "ImageDrawArcByContainer", + "ImageDrawChord", + "ImageDrawChordByContainer", + "ImageDrawEllipse", + "ImageDrawEllipseByContainer", + "ImageDrawLine", + "ImageDrawLineByContainer", + "ImageDrawPieslice", + "ImageDrawPiesliceByContainer", + "ImageDrawPolygon", + "ImageDrawRectangle", + "ImageDrawRectangleByContainer", + "ImageDrawRectangleRounded", + "ImageDrawRectangleRoundedByContainer", + "ImageEffectsAdjustment", + "ImageEffectsGrayscale", + "ImageEffectsLensBokeh", + "ImageEffectsLensChromaticAberration", + "ImageEffectsLensOpticAxis", + "ImageEffectsLensVignette", + "ImageEffectsLensZoomBurst", + "ImageEffectsNegative", + "ImageEffectsSepia", + "ImageFilterBilateralBlur", + "ImageFilterBlur", + "ImageFilterBoxBlur", + "ImageFilterContour", + "ImageFilterDetail", + "ImageFilterEdgeEnhance", + "ImageFilterEdgeEnhanceMore", + "ImageFilterEmboss", + "ImageFilterFindEdges", + "ImageFilterGaussianBlur", + "ImageFilterGaussianBlurAdvanced", + "ImageFilterMax", + "ImageFilterMedianBlur", + "ImageFilterMin", + "ImageFilterMode", + "ImageFilterRank", + "ImageFilterSharpen", + "ImageFilterSmooth", + "ImageFilterSmoothMore", + "ImageFilterStackBlur", + "ImageNoiseBeta", + "ImageNoiseBinomial", + "ImageNoiseBytes", + "ImageNoiseGaussian", + "ImageSegmentation", + "ImageSegmentationCustom", + "ImageSegmentationCustomAdvanced", + "ImageText", + "ImageTextMultiline", + "ImageTextMultilineOutlined", + "ImageTextOutlined", + "ImageTransformCropAbsolute", + "ImageTransformCropCorners", + "ImageTransformCropRelative", + "ImageTransformPaddingAbsolute", + "ImageTransformPaddingRelative", + "ImageTransformResizeAbsolute", + "ImageTransformResizeClip", + "ImageTransformResizeRelative", + "ImageTransformRotate", + "ImageTransformTranspose", + "LatentClamp", + "MaskClamp", + "ModelClamp", + "StyleModelClamp", + "UpscaleModelClamp", + "VaeClamp" + ], + { + "title_aux": "Allor Plugin" + } + ], + "https://github.com/Nuked88/ComfyUI-N-Nodes": [ + [ + "CLIPTextEncodeAdvancedNSuite [n-suite]", + "DynamicPrompt [n-suite]", + "Float Variable [n-suite]", + "FrameInterpolator [n-suite]", + "GPT Loader Simple [n-suite]", + "GPT Sampler [n-suite]", + "ImagePadForOutpaintAdvanced [n-suite]", + "Integer Variable [n-suite]", + "Llava Clip Loader [n-suite]", + "LoadFramesFromFolder [n-suite]", + "LoadImageFromFolder [n-suite]", + "LoadVideo [n-suite]", + "SaveVideo [n-suite]", + "SetMetadataForSaveVideo [n-suite]", + "String Variable [n-suite]" + ], + { + "title_aux": "ComfyUI-N-Nodes" + } + ], + "https://github.com/Off-Live/ComfyUI-off-suite": [ + [ + "Apply CLAHE", + "Cached Image Load From URL", + "CalcMaskBound", + "Crop Center wigh SEGS", + "Crop Center with SEGS", + "Dilate Mask for Each Face", + "GW Number Formatting", + "Grid Image from batch (OFF)", + "Image Crop Fit", + "Image Resize Fit", + "OFF SEGS to Image", + "Paste Face Segment to Image", + "Query Gender and Age", + "RandomSeedfromList", + "SEGS to Face Crop Data", + "Safe Mask to Image", + "VAE Encode For Inpaint V2", + "Watermarking" + ], + { + "title_aux": "ComfyUI-off-suite" + } + ], + "https://github.com/Onierous/QRNG_Node_ComfyUI/raw/main/qrng_node.py": [ + [ + "QRNG_Node_CSV" + ], + { + "title_aux": "QRNG_Node_ComfyUI" + } + ], + "https://github.com/PCMonsterx/ComfyUI-CSV-Loader": [ + [ + "Load Artists CSV", + "Load Artmovements CSV", + "Load Characters CSV", + "Load Colors CSV", + "Load Composition CSV", + "Load Lighting CSV", + "Load Negative CSV", + "Load Positive CSV", + "Load Settings CSV", + "Load Styles CSV" + ], + { + "title_aux": "ComfyUI-CSV-Loader" + } + ], + "https://github.com/ParisNeo/lollms_nodes_suite": [ + [ + "Artbot", + "Lollms_Text_Gen", + "Lollms_Text_Saver", + "RandomizeVideo" + ], + { + "title_aux": "lollms_nodes_suite" + } + ], + "https://github.com/ParmanBabra/ComfyUI-Malefish-Custom-Scripts": [ + [ + "CSVPromptsLoader", + "CombinePrompt", + "MultiLoraLoader", + "RandomPrompt" + ], + { + "title_aux": "ComfyUI-Malefish-Custom-Scripts" + } + ], + "https://github.com/Pfaeff/pfaeff-comfyui": [ + [ + "AstropulsePixelDetector", + "BackgroundRemover", + "ImagePadForBetterOutpaint", + "Inpainting", + "InpaintingPipelineLoader" + ], + { + "title_aux": "pfaeff-comfyui" + } + ], + "https://github.com/PnthrLeo/comfyUI-image-search": [ + [ + "CloseImagesSearcher" + ], + { + "title_aux": "comfyUI-image-search" + } + ], + "https://github.com/Pos13/comfyui-cyclist": [ + [ + "CyclistCompare", + "CyclistMathFloat", + "CyclistMathInt", + "CyclistTimer", + "CyclistTimerStop", + "CyclistTypeCast", + "Interrupt", + "LoopManager", + "MemorizeConditioning", + "MemorizeFloat", + "MemorizeInt", + "MemorizeString", + "OverrideImage", + "OverrideLatent", + "OverrideModel", + "RecallConditioning", + "RecallFloat", + "RecallInt", + "RecallString", + "ReloadImage", + "ReloadLatent", + "ReloadModel" + ], + { + "author": "Pos13", + "description": "This extension provides tools to iterate generation results between runs. In general, it's for cycles.", + "nickname": "comfyui-cyclist", + "title": "Cyclist", + "title_aux": "Cyclist" + } + ], + "https://github.com/QaisMalkawi/ComfyUI-QaisHelper": [ + [ + "Bool Binary Operation", + "Bool Unary Operation", + "Item Debugger", + "Item Switch", + "Nearest SDXL Resolution", + "SDXL Resolution", + "Size Swapper" + ], + { + "title_aux": "ComfyUI-Qais-Helper" + } + ], + "https://github.com/RedRayz/ComfyUI-Danbooru-To-WD": [ + [ + "DanbooruToWD" + ], + { + "title_aux": "ComfyUI-Danbooru-To-WD" + } + ], + "https://github.com/RenderRift/ComfyUI-RenderRiftNodes": [ + [ + "AnalyseMetadata", + "DateIntegerNode", + "DisplayMetaOptions", + "LoadImageWithMeta", + "MetadataOverlayNode", + "VideoPathMetaExtraction" + ], + { + "title_aux": "ComfyUI-RenderRiftNodes" + } + ], + "https://github.com/RomanKuschanow/ComfyUI-Advanced-Latent-Control": [ + [ + "LatentAddTransform", + "LatentInterpolateTransform", + "LatentMirror", + "LatentNormalize", + "LatentShift", + "MirrorTransform", + "MultiplyTransform", + "OffsetCombine", + "OneTimeLatentAddTransform", + "OneTimeLatentInterpolateTransform", + "OneTimeMirrorTransform", + "OneTimeMultiplyTransform", + "OneTimeShiftTransform", + "ShiftTransform", + "TransformHijack", + "TransformOffset", + "TransformSampler", + "TransformSamplerAdvanced", + "TransformsCombine" + ], + { + "title_aux": "Advanced Latent Control" + } + ], + "https://github.com/Ron-Digital/ComfyUI-SceneGenerator": [ + [ + "Scene Generator" + ], + { + "title_aux": "ComfyUI-SceneGenerator" + } + ], + "https://github.com/Ryuukeisyou/comfyui_face_parsing": [ + [ + "BBoxListItemSelect(FaceParsing)", + "BBoxResize(FaceParsing)", + "ColorAdjust(FaceParsing)", + "FaceBBoxDetect(FaceParsing)", + "FaceBBoxDetectorLoader(FaceParsing)", + "FaceParse(FaceParsing)", + "FaceParsingModelLoader(FaceParsing)", + "FaceParsingProcessorLoader(FaceParsing)", + "FaceParsingResultsParser(FaceParsing)", + "GuidedFilter(FaceParsing)", + "ImageCropWithBBox(FaceParsing)", + "ImageInsertWithBBox(FaceParsing)", + "ImageListSelect(FaceParsing)", + "ImagePadWithBBox(FaceParsing)", + "ImageResizeCalculator(FaceParsing)", + "ImageResizeWithBBox(FaceParsing)", + "ImageSize(FaceParsing)", + "LatentCropWithBBox(FaceParsing)", + "LatentInsertWithBBox(FaceParsing)", + "LatentSize(FaceParsing)", + "MaskComposite(FaceParsing)", + "MaskInsertWithBBox(FaceParsing)", + "MaskListComposite(FaceParsing)", + "MaskListSelect(FaceParsing)", + "MaskToBBox(FaceParsing)", + "SkinDetectTraditional(FaceParsing)" + ], + { + "title_aux": "comfyui_face_parsing" + } + ], + "https://github.com/Ryuukeisyou/comfyui_io_helpers": [ + [ + "ImageLoadAsMaskByPath(IOHelpers)", + "ImageLoadByPath(IOHelpers)", + "ImageLoadFromBase64(IOHelpers)", + "ImageSaveAsBase64(IOHelpers)", + "ImageSaveToPath(IOHelpers)", + "TypeConversion(IOHelpers)" + ], + { + "title_aux": "comfyui_io_helpers" + } + ], + "https://github.com/SEkINVR/ComfyUI-SaveAs": [ + [ + "ComfyUISaveAs" + ], + { + "title_aux": "ComfyUI SaveAS" + } + ], + "https://github.com/SLAPaper/ComfyUI-Image-Selector": [ + [ + "ImageDuplicator", + "ImageSelector", + "LatentDuplicator", + "LatentSelector" + ], + { + "title_aux": "ComfyUI-Image-Selector" + } + ], + "https://github.com/SOELexicon/ComfyUI-LexMSDBNodes": [ + [ + "MSSqlSelectNode", + "MSSqlTableNode" + ], + { + "title_aux": "LexMSDBNodes" + } + ], + "https://github.com/SOELexicon/ComfyUI-LexTools": [ + [ + "AesthetlcScoreSorter", + "AgeClassifierNode", + "ArtOrHumanClassifierNode", + "CalculateAestheticScore", + "DocumentClassificationNode", + "FoodCategoryClassifierNode", + "ImageAspectPadNode", + "ImageCaptioning", + "ImageFilterByFloatScoreNode", + "ImageFilterByIntScoreNode", + "ImageQualityScoreNode", + "ImageRankingNode", + "ImageScaleToMin", + "LoadAesteticModel", + "MD5ImageHashNode", + "SamplerPropertiesNode", + "ScoreConverterNode", + "SeedIncrementerNode", + "SegformerNode", + "SegformerNodeMasks", + "SegformerNodeMergeSegments", + "StepCfgIncrementNode" + ], + { + "title_aux": "ComfyUI-LexTools" + } + ], + "https://github.com/SadaleNet/CLIPTextEncodeA1111-ComfyUI/raw/master/custom_nodes/clip_text_encoder_a1111.py": [ + [ + "CLIPTextEncodeA1111", + "RerouteTextForCLIPTextEncodeA1111" + ], + { + "preemptions": [ + "SAMLoader" + ], + "title_aux": "ComfyUI A1111-like Prompt Custom Node Solution" + } + ], + "https://github.com/SamKhoze/ComfyUI-DeepFuze": [ + [ + "DeepFuze Save", + "DeepFuzeAdavance", + "DeepFuzeFaceSwap", + "DeepfuzePreview", + "LLM_node", + "PlayBackAudio", + "TTS_generation" + ], + { + "title_aux": "DeepFuze" + } + ], + "https://github.com/SayanoAI/Comfy-RVC": [ + [ + "AudioBatchValueNode", + "AudioTranscriptionNode", + "DownloadAudio", + "ImageRepeatInterleavedNode", + "LatentRepeatInterleavedNode", + "LoadAudio", + "LoadHubertModel", + "LoadPitchExtractionParams", + "LoadRVCModelNode", + "LoadWhisperModelNode", + "MergeAudioNode", + "MergeImageBatches", + "MergeLatentBatches", + "PreviewAudio", + "RVCNode", + "UVR5Node" + ], + { + "title_aux": "Comfy-RVC" + } + ], + "https://github.com/Scholar01/ComfyUI-Keyframe": [ + [ + "KeyframeApply", + "KeyframeInterpolationPart", + "KeyframePart" + ], + { + "title_aux": "SComfyUI-Keyframe" + } + ], + "https://github.com/Scorpinaus/ComfyUI-DiffusersLoader": [ + [ + "CombinedDiffusersLoader", + "DiffusersClipLoader", + "DiffusersUNETLoader", + "DiffusersVAELoader" + ], + { + "title_aux": "Loaders for Diffusers-format checkpoints" + } + ], + "https://github.com/ScreamingHawk/comfyui-ollama-prompt-encode": [ + [ + "OllamaCLIPTextEncode", + "OllamaPromptGenerator" + ], + { + "author": "Michael Standen", + "description": "Use AI to generate prompts and perform CLIP text encoding", + "nickname": "Ollama Prompt Encode", + "title": "Ollama Prompt Encode", + "title_aux": "Ollama Prompt Encode" + } + ], + "https://github.com/SeaArtLab/ComfyUI-Long-CLIP": [ + [ + "SeaArtLongClip", + "SeaArtLongXLClipMerge" + ], + { + "title_aux": "ComfyUI-Long-CLIP" + } + ], + "https://github.com/SeargeDP/SeargeSDXL": [ + [ + "SeargeAdvancedParameters", + "SeargeCheckpointLoader", + "SeargeConditionMixing", + "SeargeConditioningMuxer2", + "SeargeConditioningMuxer5", + "SeargeConditioningParameters", + "SeargeControlnetAdapterV2", + "SeargeControlnetModels", + "SeargeCustomAfterUpscaling", + "SeargeCustomAfterVaeDecode", + "SeargeCustomPromptMode", + "SeargeDebugPrinter", + "SeargeEnablerInputs", + "SeargeFloatConstant", + "SeargeFloatMath", + "SeargeFloatPair", + "SeargeFreeU", + "SeargeGenerated1", + "SeargeGenerationParameters", + "SeargeHighResolution", + "SeargeImage2ImageAndInpainting", + "SeargeImageAdapterV2", + "SeargeImageSave", + "SeargeImageSaving", + "SeargeInput1", + "SeargeInput2", + "SeargeInput3", + "SeargeInput4", + "SeargeInput5", + "SeargeInput6", + "SeargeInput7", + "SeargeIntegerConstant", + "SeargeIntegerMath", + "SeargeIntegerPair", + "SeargeIntegerScaler", + "SeargeLatentMuxer3", + "SeargeLoraLoader", + "SeargeLoras", + "SeargeMagicBox", + "SeargeModelSelector", + "SeargeOperatingMode", + "SeargeOutput1", + "SeargeOutput2", + "SeargeOutput3", + "SeargeOutput4", + "SeargeOutput5", + "SeargeOutput6", + "SeargeOutput7", + "SeargeParameterProcessor", + "SeargePipelineStart", + "SeargePipelineTerminator", + "SeargePreviewImage", + "SeargePromptAdapterV2", + "SeargePromptCombiner", + "SeargePromptStyles", + "SeargePromptText", + "SeargeSDXLBasePromptEncoder", + "SeargeSDXLImage2ImageSampler", + "SeargeSDXLImage2ImageSampler2", + "SeargeSDXLPromptEncoder", + "SeargeSDXLRefinerPromptEncoder", + "SeargeSDXLSampler", + "SeargeSDXLSampler2", + "SeargeSDXLSamplerV3", + "SeargeSamplerAdvanced", + "SeargeSamplerInputs", + "SeargeSaveFolderInputs", + "SeargeSeparator", + "SeargeStylePreprocessor", + "SeargeTextInputV2", + "SeargeUpscaleModelLoader", + "SeargeUpscaleModels", + "SeargeVAELoader" + ], + { + "title_aux": "SeargeSDXL" + } + ], + "https://github.com/Seedsa/Fooocus_Nodes": [ + [ + "BasicScheduler", + "CLIPLoader", + "CLIPMergeSimple", + "CLIPSave", + "CLIPSetLastLayer", + "CLIPTextEncode", + "CLIPTextEncodeSDXL", + "CLIPTextEncodeSDXLRefiner", + "CLIPVisionEncode", + "CLIPVisionLoader", + "Canny", + "CheckpointLoader", + "CheckpointLoaderSimple", + "CheckpointSave", + "ConditioningAverage", + "ConditioningCombine", + "ConditioningConcat", + "ConditioningSetArea", + "ConditioningSetAreaPercentage", + "ConditioningSetMask", + "ConditioningSetTimestepRange", + "ConditioningZeroOut", + "ControlNetApply", + "ControlNetApplyAdvanced", + "ControlNetLoader", + "CropMask", + "DiffControlNetLoader", + "DiffusersLoader", + "DualCLIPLoader", + "EmptyImage", + "EmptyLatentImage", + "ExponentialScheduler", + "FeatherMask", + "FlipSigmas", + "Fooocus ApplyImagePrompt", + "Fooocus Controlnet", + "Fooocus ImagePrompt", + "Fooocus Inpaint", + "Fooocus KSampler", + "Fooocus Loader", + "Fooocus LoraStack", + "Fooocus PipeOut", + "Fooocus PreKSampler", + "Fooocus Styles", + "Fooocus Upscale", + "Fooocus detailerFix", + "Fooocus negative", + "Fooocus positive", + "Fooocus preDetailerFix", + "Fooocus samLoaderPipe", + "Fooocus ultralyticsDetectorPipe", + "FreeU", + "FreeU_V2", + "GLIGENLoader", + "GLIGENTextBoxApply", + "GrowMask", + "HyperTile", + "HypernetworkLoader", + "ImageBatch", + "ImageBlend", + "ImageBlur", + "ImageColorToMask", + "ImageCompositeMasked", + "ImageCrop", + "ImageInvert", + "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", + "ImagePadForOutpaint", + "ImageQuantize", + "ImageScale", + "ImageScaleBy", + "ImageScaleToTotalPixels", + "ImageSharpen", + "ImageToMask", + "ImageUpscaleWithModel", + "InpaintModelConditioning", + "InvertMask", + "JoinImageWithAlpha", + "KSampler", + "KSamplerAdvanced", + "KSamplerSelect", + "KarrasScheduler", + "LatentAdd", + "LatentBatch", + "LatentBatchSeedBehavior", + "LatentBlend", + "LatentComposite", + "LatentCompositeMasked", + "LatentCrop", + "LatentFlip", + "LatentFromBatch", + "LatentInterpolate", + "LatentMultiply", + "LatentRotate", + "LatentSubtract", + "LatentUpscale", + "LatentUpscaleBy", + "LoadImage", + "LoadImageMask", + "LoadLatent", + "LoraLoader", + "LoraLoaderModelOnly", + "MaskComposite", + "MaskToImage", + "ModelMergeAdd", + "ModelMergeBlocks", + "ModelMergeSimple", + "ModelMergeSubtract", + "ModelSamplingContinuousEDM", + "ModelSamplingDiscrete", + "PatchModelAddDownscale", + "PerpNeg", + "PhotoMakerEncode", + "PhotoMakerLoader", + "PolyexponentialScheduler", + "PorterDuffImageComposite", + "PreviewImage", + "RebatchImages", + "RebatchLatents", + "RepeatImageBatch", + "RepeatLatentBatch", + "RescaleCFG", + "SDTurboScheduler", + "SD_4XUpscale_Conditioning", + "SVD_img2vid_Conditioning", + "SamplerCustom", + "SamplerDPMPP_2M_SDE", + "SamplerDPMPP_SDE", + "SaveAnimatedPNG", + "SaveAnimatedWEBP", + "SaveImage", + "SaveLatent", + "SelfAttentionGuidance", + "SetLatentNoiseMask", + "SolidMask", + "SplitImageWithAlpha", + "SplitSigmas", + "StableZero123_Conditioning", + "StableZero123_Conditioning_Batched", + "StyleModelApply", + "StyleModelLoader", + "TomePatchModel", + "UNETLoader", + "UpscaleModelLoader", + "VAEDecode", + "VAEDecodeTiled", + "VAEEncode", + "VAEEncodeForInpaint", + "VAEEncodeTiled", + "VAELoader", + "VAESave", + "VPScheduler", + "VideoLinearCFGGuidance", + "unCLIPCheckpointLoader", + "unCLIPConditioning" + ], + { + "title_aux": "ComfyUI Fooocus Nodes" + } + ], + "https://github.com/Ser-Hilary/SDXL_sizing/raw/main/conditioning_sizing_for_SDXL.py": [ + [ + "get_aspect_from_image", + "get_aspect_from_ints", + "sizing_node", + "sizing_node_basic", + "sizing_node_unparsed" + ], + { + "title_aux": "SDXL_sizing" + } + ], + "https://github.com/Shadetail/ComfyUI_Eagleshadow": [ + [ + "Batch 12 Images", + "Detect Transparency", + "Fix Checkpoint Name", + "ImageLinearGammaCompositeMasked", + "KSampler Same Noise", + "MaskGlow", + "OffsetImage", + "Round Float to String", + "SaveImageToFolder", + "Select ControlNet", + "Select Model 20", + "Simple Load Image Batch" + ], + { + "title_aux": "Eagleshadow Custom Nodes" + } + ], + "https://github.com/SherryXieYuchen/ComfyUI-Image-Inpainting": [ + [ + "CropImageByRect", + "INPAINT_ColorCorrection", + "INPAINT_CropImage", + "INPAINT_InpaintingWithModel", + "INPAINT_LoadModel", + "INPAINT_PasteBackCropImage", + "INPAINT_VAEDecode", + "INPAINT_VAEEncode", + "ImagePostprocess", + "ImagePreprocess" + ], + { + "title_aux": "ComfyUI-Image-Inpainting" + } + ], + "https://github.com/Shibiko-AI/ShibikoAI-ComfyUI-Tools": [ + [ + "Cascade", + "Luts", + "Waifu2x" + ], + { + "title_aux": "Shibiko AI ComfyUI Tools" + } + ], + "https://github.com/ShmuelRonen/ComfyUI-SVDResizer": [ + [ + "SVDRsizer" + ], + { + "title_aux": "ComfyUI-SVDResizer" + } + ], + "https://github.com/ShmuelRonen/ComfyUI_Gemini_Flash": [ + [ + "Gemini_Flash" + ], + { + "title_aux": "ComfyUI_Gemini_Flash" + } + ], + "https://github.com/ShmuelRonen/ComfyUI_wav2lip": [ + [ + "Wav2Lip" + ], + { + "title_aux": "Wav2Lip Node for ComfyUI" + } + ], + "https://github.com/Shraknard/ComfyUI-Remover": [ + [ + "Remover" + ], + { + "title_aux": "ComfyUI-Remover" + } + ], + "https://github.com/Siberpone/lazy-pony-prompter": [ + [ + "LPP_Deleter", + "LPP_Derpibooru", + "LPP_E621", + "LPP_Loader_Derpibooru", + "LPP_Loader_E621", + "LPP_Saver" + ], + { + "title_aux": "Lazy Pony Prompter" + } + ], + "https://github.com/Smirnov75/ComfyUI-mxToolkit": [ + [ + "mxSeed", + "mxSlider", + "mxSlider2D", + "mxStop" + ], + { + "title_aux": "ComfyUI-mxToolkit" + } + ], + "https://github.com/Smuzzies/comfyui_chatbox_overlay/raw/main/chatbox_overlay.py": [ + [ + "Chatbox Overlay" + ], + { + "title_aux": "Chatbox Overlay node for ComfyUI" + } + ], + "https://github.com/Smuzzies/comfyui_meme_maker": [ + [ + "MemeMaker" + ], + { + "title_aux": "comfyui_meme_maker" + } + ], + "https://github.com/SoftMeng/ComfyUI_ImageToText": [ + [ + "ComfyUI_ImageToText" + ], + { + "title_aux": "ComfyUI_ImageToText" + } + ], + "https://github.com/SoftMeng/ComfyUI_Mexx_Poster": [ + [ + "ComfyUI_Mexx_Poster" + ], + { + "title_aux": "ComfyUI_Mexx_Poster" + } + ], + "https://github.com/SoftMeng/ComfyUI_Mexx_Styler": [ + [ + "MexxSDXLPromptStyler", + "MexxSDXLPromptStylerAdvanced" + ], + { + "title_aux": "ComfyUI_Mexx_Styler" + } + ], + "https://github.com/Sorcerio/MBM-Music-Visualizer": [ + [ + "id", + "mbmAudioFeatureCalculator", + "mbmAudioLoader", + "mbmImageConcat", + "mbmPromptSequenceBuilder", + "mbmPromptSequenceBuilderAdv", + "mbmPromptSequenceInterpolator", + "mbmPromptSequenceLoader", + "mbmPromptSequenceRenderer" + ], + { + "title_aux": "MBM's Music Visualizer" + } + ], + "https://github.com/SozeInc/ComfyUI-Mobile": [ + [ + "Mobile_Settings_Launcher_Data", + "Send Notification (Mobile)", + "Settings Launcher (Mobile)", + "Ultimate Concat (Mobile)" + ], + { + "title_aux": "ComfyUI-Mobile" + } + ], + "https://github.com/SpaceKendo/ComfyUI-svd_txt2vid": [ + [ + "SVD_txt2vid_ConditioningwithLatent" + ], + { + "title_aux": "Text to video for Stable Video Diffusion in ComfyUI" + } + ], + "https://github.com/Stability-AI/ComfyUI-SAI_API": [ + [ + "Stability Conservative Upscale", + "Stability Control Skech", + "Stability Control Structure", + "Stability Creative Upscale", + "Stability Erase", + "Stability Image Core", + "Stability Image Ultra", + "Stability Inpainting", + "Stability Outpainting", + "Stability Remove Background", + "Stability SD3", + "Stability Search and Replace" + ], + { + "title_aux": "Stability API nodes for ComfyUI" + } + ], + "https://github.com/Stability-AI/stability-ComfyUI-nodes": [ + [ + "ColorBlend", + "ControlLoraSave", + "GetImageSize" + ], + { + "title_aux": "stability-ComfyUI-nodes" + } + ], + "https://github.com/StartHua/ComfyUI_OOTDiffusion_CXH": [ + [ + "Ood_CXH" + ], + { + "title_aux": "ComfyUI_OOTDiffusion_CXH" + } + ], + "https://github.com/StartHua/ComfyUI_PCDMs": [ + [ + "PCDMS_CXH" + ], + { + "title_aux": "ComfyUI_PCDMs" + } + ], + "https://github.com/StartHua/ComfyUI_Seg_VITON": [ + [ + "segformer_agnostic", + "segformer_clothes", + "segformer_remove_bg", + "stabel_vition" + ], + { + "title_aux": "ComfyUI_Seg_VITON" + } + ], + "https://github.com/StartHua/Comfyui_joytag": [ + [ + "CXH_JoyTag" + ], + { + "title_aux": "Comfyui_joytag" + } + ], + "https://github.com/StartHua/Comfyui_segformer_b2_clothes": [ + [ + "segformer_b2_clothes" + ], + { + "title_aux": "comfyui_segformer_b2_clothes" + } + ], + "https://github.com/SuperBeastsAI/ComfyUI-SuperBeasts": [ + [ + "Deflicker (SuperBeasts.AI)", + "HDR Effects (SuperBeasts.AI)", + "Image Batch Manager (SuperBeasts.AI)", + "Make Resized Mask Batch (SuperBeasts.AI)", + "Mask Batch Manager (SuperBeasts.AI)", + "Pixel Deflicker (SuperBeasts.AI)", + "String List Manager (SuperBeasts.AI)" + ], + { + "title_aux": "ComfyUI-SuperBeasts" + } + ], + "https://github.com/SuperMasterBlasterLaser/ComfyUI_YOLO_Classifiers": [ + [ + "YOLO Classifier Model Loader", + "YOLO Classify" + ], + { + "title_aux": "ComfyUI_YOLO_Classifiers" + } + ], + "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes": [ + [ + "CR 8 Channel In", + "CR 8 Channel Out", + "CR Apply ControlNet", + "CR Apply LoRA Stack", + "CR Apply Model Merge", + "CR Apply Multi Upscale", + "CR Apply Multi-ControlNet", + "CR Arabic Text RTL", + "CR Aspect Ratio", + "CR Aspect Ratio Banners", + "CR Aspect Ratio SDXL", + "CR Aspect Ratio Social Media", + "CR Batch Images From List", + "CR Batch Process Switch", + "CR Binary Pattern", + "CR Binary To Bit List", + "CR Bit Schedule", + "CR Central Schedule", + "CR Checker Pattern", + "CR Clamp Value", + "CR Clip Input Switch", + "CR Color Bars", + "CR Color Gradient", + "CR Color Panel", + "CR Color Tint", + "CR Combine Prompt", + "CR Combine Schedules", + "CR Comic Panel Templates", + "CR Composite Text", + "CR Conditioning Input Switch", + "CR Conditioning Mixer", + "CR ControlNet Input Switch", + "CR Current Frame", + "CR Cycle Images", + "CR Cycle Images Simple", + "CR Cycle LoRAs", + "CR Cycle Models", + "CR Cycle Text", + "CR Cycle Text Simple", + "CR Data Bus In", + "CR Data Bus Out", + "CR Debatch Frames", + "CR Diamond Panel", + "CR Draw Perspective Text", + "CR Draw Pie", + "CR Draw Shape", + "CR Draw Text", + "CR Encode Scheduled Prompts", + "CR Feathered Border", + "CR Float Range List", + "CR Float To Integer", + "CR Float To String", + "CR Font File List", + "CR Get Parameter From Prompt", + "CR Gradient Float", + "CR Gradient Integer", + "CR Half Drop Panel", + "CR Halftone Filter", + "CR Halftone Grid", + "CR Hires Fix Process Switch", + "CR Image Border", + "CR Image Grid Panel", + "CR Image Input Switch", + "CR Image Input Switch (4 way)", + "CR Image List", + "CR Image List Simple", + "CR Image Output", + "CR Image Panel", + "CR Image Pipe Edit", + "CR Image Pipe In", + "CR Image Pipe Out", + "CR Image Size", + "CR Img2Img Process Switch", + "CR Increment Float", + "CR Increment Integer", + "CR Index", + "CR Index Increment", + "CR Index Multiply", + "CR Index Reset", + "CR Input Text List", + "CR Integer Multiple", + "CR Integer Range List", + "CR Integer To String", + "CR Interpolate Latents", + "CR Intertwine Lists", + "CR Keyframe List", + "CR Latent Batch Size", + "CR Latent Input Switch", + "CR LoRA List", + "CR LoRA Stack", + "CR Load Animation Frames", + "CR Load Flow Frames", + "CR Load GIF As List", + "CR Load Image List", + "CR Load Image List Plus", + "CR Load LoRA", + "CR Load Prompt Style", + "CR Load Schedule From File", + "CR Load Scheduled ControlNets", + "CR Load Scheduled LoRAs", + "CR Load Scheduled Models", + "CR Load Text List", + "CR Mask Text", + "CR Math Operation", + "CR Model Input Switch", + "CR Model List", + "CR Model Merge Stack", + "CR Module Input", + "CR Module Output", + "CR Module Pipe Loader", + "CR Multi Upscale Stack", + "CR Multi-ControlNet Stack", + "CR Multiline Text", + "CR Output Flow Frames", + "CR Output Schedule To File", + "CR Overlay Text", + "CR Overlay Transparent Image", + "CR Page Layout", + "CR Pipe Switch", + "CR Polygons", + "CR Prompt List", + "CR Prompt List Keyframes", + "CR Prompt Scheduler", + "CR Prompt Text", + "CR Radial Gradient", + "CR Random Hex Color", + "CR Random LoRA Stack", + "CR Random Multiline Colors", + "CR Random Multiline Values", + "CR Random Panel Codes", + "CR Random RGB", + "CR Random RGB Gradient", + "CR Random Shape Pattern", + "CR Random Weight LoRA", + "CR Repeater", + "CR SD1.5 Aspect Ratio", + "CR SDXL Aspect Ratio", + "CR SDXL Base Prompt Encoder", + "CR SDXL Prompt Mix Presets", + "CR SDXL Prompt Mixer", + "CR SDXL Style Text", + "CR Save Text To File", + "CR Schedule Input Switch", + "CR Schedule To ScheduleList", + "CR Seamless Checker", + "CR Seed", + "CR Seed to Int", + "CR Select Font", + "CR Select ISO Size", + "CR Select Model", + "CR Select Resize Method", + "CR Set Switch From String", + "CR Set Value On Binary", + "CR Set Value On Boolean", + "CR Set Value on String", + "CR Simple Banner", + "CR Simple Binary Pattern", + "CR Simple Binary Pattern Simple", + "CR Simple Image Compare", + "CR Simple List", + "CR Simple Meme Template", + "CR Simple Prompt List", + "CR Simple Prompt List Keyframes", + "CR Simple Prompt Scheduler", + "CR Simple Schedule", + "CR Simple Text Panel", + "CR Simple Text Scheduler", + "CR Simple Text Watermark", + "CR Simple Titles", + "CR Simple Value Scheduler", + "CR Split String", + "CR Starburst Colors", + "CR Starburst Lines", + "CR String To Boolean", + "CR String To Combo", + "CR String To Number", + "CR Style Bars", + "CR Switch Model and CLIP", + "CR Text", + "CR Text Blacklist", + "CR Text Concatenate", + "CR Text Cycler", + "CR Text Input Switch", + "CR Text Input Switch (4 way)", + "CR Text Length", + "CR Text List", + "CR Text List Simple", + "CR Text List To String", + "CR Text Operation", + "CR Text Replace", + "CR Text Scheduler", + "CR Thumbnail Preview", + "CR Trigger", + "CR Upscale Image", + "CR VAE Decode", + "CR VAE Input Switch", + "CR Value", + "CR Value Cycler", + "CR Value Scheduler", + "CR Vignette Filter", + "CR XY From Folder", + "CR XY Index", + "CR XY Interpolate", + "CR XY List", + "CR XY Product", + "CR XY Save Grid Image", + "CR XYZ Index", + "CR_Aspect Ratio For Print" + ], + { + "author": "Suzie1", + "description": "175 custom nodes for artists, designers and animators.", + "nickname": "Comfyroll Studio", + "title": "Comfyroll Studio", + "title_aux": "Comfyroll Studio" + } + ], + "https://github.com/Sxela/ComfyWarp": [ + [ + "ExtractOpticalFlow", + "LoadFrame", + "LoadFrameFromDataset", + "LoadFrameFromFolder", + "LoadFramePairFromDataset", + "LoadFrameSequence", + "MakeFrameDataset", + "MixConsistencyMaps", + "OffsetNumber", + "ResizeToFit", + "SaveFrame", + "WarpFrame" + ], + { + "title_aux": "ComfyWarp" + } + ], + "https://github.com/TGu-97/ComfyUI-TGu-utils": [ + [ + "MPNReroute", + "MPNSwitch", + "PNSwitch" + ], + { + "title_aux": "TGu Utilities" + } + ], + "https://github.com/THtianhao/ComfyUI-FaceChain": [ + [ + "FC CropAndPaste", + "FC CropBottom", + "FC CropToOrigin", + "FC FaceDetectCrop", + "FC FaceFusion", + "FC FaceSegAndReplace", + "FC FaceSegment", + "FC MaskOP", + "FC RemoveCannyFace", + "FC ReplaceByMask", + "FC StyleLoraLoad" + ], + { + "title_aux": "ComfyUI-FaceChain" + } + ], + "https://github.com/THtianhao/ComfyUI-Portrait-Maker": [ + [ + "PM_BoxCropImage", + "PM_ColorTransfer", + "PM_ExpandMaskBox", + "PM_FaceFusion", + "PM_FaceShapMatch", + "PM_FaceSkin", + "PM_GetImageInfo", + "PM_ImageResizeTarget", + "PM_ImageScaleShort", + "PM_MakeUpTransfer", + "PM_MaskDilateErode", + "PM_MaskMerge2Image", + "PM_PortraitEnhancement", + "PM_RatioMerge2Image", + "PM_ReplaceBoxImg", + "PM_RetinaFace", + "PM_Similarity", + "PM_SkinRetouching", + "PM_SuperColorTransfer", + "PM_SuperMakeUpTransfer" + ], + { + "title_aux": "ComfyUI-Portrait-Maker" + } + ], + "https://github.com/TJ16th/comfyUI_TJ_NormalLighting": [ + [ + "EulerLightingNode" + ], + { + "title_aux": "comfyUI_TJ_NormalLighting" + } + ], + "https://github.com/TMElyralab/Comfyui-MusePose": [ + [ + "filenamestring", + "musepose", + "museposealign" + ], + { + "title_aux": "Comfyui-MusePose" + } + ], + "https://github.com/TRI3D-LC/ComfyUI-MiroBoard": [ + [ + "add-image-miro-board" + ], + { + "title_aux": "ComfyUI-MiroBoard" + } + ], + "https://github.com/TRI3D-LC/tri3d-comfyui-nodes": [ + [ + "get_histogram_limits", + "main_light_layer", + "main_scaled_paste", + "simple_rescale_histogram", + "tri3d-HistogramEqualization", + "tri3d-LAB_2_RGB", + "tri3d-RGB_2_LAB", + "tri3d-adjust-neck", + "tri3d-atr-parse", + "tri3d-atr-parse-batch", + "tri3d-bgremove-mega", + "tri3d-clear-memory", + "tri3d-clipdrop-bgremove-api", + "tri3d-clipdrop-bgreplace-api", + "tri3d-composite-image-splitter", + "tri3d-dwpose", + "tri3d-extract-hand", + "tri3d-extract-masks-batch", + "tri3d-extract-parts-batch", + "tri3d-extract-parts-batch2", + "tri3d-extract-parts-mask-batch", + "tri3d-extract-pascal-parts-batch", + "tri3d-face-recognise", + "tri3d-facer_face_segment", + "tri3d-flexible_color_extract", + "tri3d-float-to-image", + "tri3d-fuzzification", + "tri3d-get_histogram_limits", + "tri3d-get_mean_and_standard_deviation", + "tri3d-get_threshold_for_bg_swap", + "tri3d-image-mask-2-box", + "tri3d-image-mask-box-2-image", + "tri3d-interaction-canny", + "tri3d-levindabhi-cloth-seg", + "tri3d-load-pose-json", + "tri3d-load_AEMatter_Model", + "tri3d-load_MVANet_Model", + "tri3d-luminosity-match", + "tri3d-main_transparent_background", + "tri3d-photoroom-bgremove-api", + "tri3d-pose-adaption", + "tri3d-pose-to-image", + "tri3d-position-hands", + "tri3d-position-parts-batch", + "tri3d-position-pascal-parts-batch", + "tri3d-recolor-mask", + "tri3d-recolor-mask-LAB_space", + "tri3d-recolor-mask-LAB_space_manual", + "tri3d-recolor-mask-RGB_space", + "tri3d-renormalize_array", + "tri3d-run_AEMatter_inference", + "tri3d-run_MVANet_inference", + "tri3d-scaled-paste", + "tri3d-simple_bg_swap", + "tri3d-simple_rescale_histogram", + "tri3d-skin-feathered-padded-mask", + "tri3d-swap-pixels" + ], + { + "title_aux": "tri3d-comfyui-nodes" + } + ], + "https://github.com/TW-CUI/TW-CUI-Util": [ + [ + "TWCUI_Util_CommonSDXLResolutions", + "TWCUI_Util_FloatLiteral", + "TWCUI_Util_GenerationParameters", + "TWCUI_Util_GenerationPrompts", + "TWCUI_Util_IntLiteral", + "TWCUI_Util_ModelVAELORALoader", + "TWCUI_Util_ModelVAELoader", + "TWCUI_Util_MultilineStringLiteral", + "TWCUI_Util_SaveImage", + "TWCUI_Util_SaveImageAdvanced", + "TWCUI_Util_StringLiteral" + ], + { + "title_aux": "TW-CUI-Util" + } + ], + "https://github.com/TaiTair/comfyui-simswap": [ + [ + "Simswap", + "SimswapBuildFaceModel", + "SimswapFaceSwapOpt", + "SimswapImageDublicator", + "SimswapLoadFaceModel", + "SimswapMaskHelper", + "SimswapOptions", + "SimswapRestoreFace", + "SimswapSaveFaceModel" + ], + { + "title_aux": "Simswap Node for ComfyUI" + } + ], + "https://github.com/Taremin/comfyui-prompt-extranetworks": [ + [ + "PromptExtraNetworks" + ], + { + "title_aux": "ComfyUI Prompt ExtraNetworks" + } + ], + "https://github.com/Taremin/comfyui-string-tools": [ + [ + "StringToolsBalancedChoice", + "StringToolsConcat", + "StringToolsRandomChoice", + "StringToolsString", + "StringToolsText" + ], + { + "title_aux": "ComfyUI String Tools" + } + ], + "https://github.com/Taremin/webui-monaco-prompt": [ + [ + "WebuiMonacoPromptFind", + "WebuiMonacoPromptReplace" + ], + { + "title_aux": "WebUI Monaco Prompt" + } + ], + "https://github.com/TeaCrab/ComfyUI-TeaNodes": [ + [ + "TC_ColorFill", + "TC_CropTo", + "TC_EqualizeCLAHE", + "TC_ImageResize", + "TC_ImageScale", + "TC_KorniaGamma", + "TC_RandomColorFill", + "TC_SizeApproximation" + ], + { + "title_aux": "ComfyUI-TeaNodes" + } + ], + "https://github.com/TemryL/ComfyS3": [ + [ + "DownloadFileS3", + "LoadImageS3", + "SaveImageS3", + "SaveVideoFilesS3", + "UploadFileS3" + ], + { + "title_aux": "ComfyS3" + } + ], + "https://github.com/TemryL/ComfyUI-IDM-VTON": [ + [ + "IDM-VTON", + "PipelineLoader" + ], + { + "title_aux": "ComfyUI-IDM-VTON [WIP]" + } + ], + "https://github.com/TencentQQGYLab/ComfyUI-ELLA": [ + [ + "CombineClipEllaEmbeds", + "ConcatConditionEllaEmbeds", + "ConditionToEllaEmbeds", + "ELLALoader", + "EllaApply", + "EllaCombineEmbeds", + "EllaEncode", + "EllaTextEncode", + "SetEllaTimesteps", + "T5TextEncode #ELLA", + "T5TextEncoderLoader #ELLA" + ], + { + "title_aux": "ComfyUI-ELLA" + } + ], + "https://github.com/TheBarret/ZSuite": [ + [ + "ZSuite: Prompter", + "ZSuite: RF Noise", + "ZSuite: SeedMod" + ], + { + "title_aux": "ZSuite" + } + ], + "https://github.com/TheBill2001/comfyui-upscale-by-model": [ + [ + "UpscaleImageByUsingModel" + ], + { + "author": "Tr\u1ea7n Nam Tu\u1ea5n", + "description": "This custom node allow upscaling an image by a factor using a model.", + "nickname": "Upscale Image By (Using Model)", + "title": "Upscale Image By (Using Model)", + "title_aux": "comfyui-upscale-by-model" + } + ], + "https://github.com/TheMistoAI/ComfyUI-Anyline": [ + [ + "AnyLinePreprocessor" + ], + { + "title_aux": "Anyline" + } + ], + "https://github.com/ThereforeGames/ComfyUI-Unprompted": [ + [ + "Unprompted" + ], + { + "title_aux": "ComfyUI-Unprompted" + } + ], + "https://github.com/TinyTerra/ComfyUI_tinyterraNodes": [ + [ + "ttN KSampler_v2", + "ttN advPlot combo", + "ttN advPlot range", + "ttN advPlot string", + "ttN advanced xyPlot", + "ttN compareInput", + "ttN concat", + "ttN conditioning", + "ttN debugInput", + "ttN float", + "ttN hiresfixScale", + "ttN imageOutput", + "ttN imageREMBG", + "ttN int", + "ttN multiModelMerge", + "ttN pipe2BASIC", + "ttN pipe2DETAILER", + "ttN pipeEDIT", + "ttN pipeEncodeConcat", + "ttN pipeIN", + "ttN pipeKSampler", + "ttN pipeKSamplerAdvanced", + "ttN pipeKSamplerAdvanced_v2", + "ttN pipeKSamplerSDXL", + "ttN pipeKSamplerSDXL_v2", + "ttN pipeKSampler_v2", + "ttN pipeLoader", + "ttN pipeLoaderSDXL", + "ttN pipeLoaderSDXL_v2", + "ttN pipeLoader_v2", + "ttN pipeLoraStack", + "ttN pipeOUT", + "ttN seed", + "ttN text", + "ttN text3BOX_3WAYconcat", + "ttN text7BOX_concat", + "ttN textCycleLine", + "ttN textDebug", + "ttN tinyLoader", + "ttN xyPlot" + ], + { + "author": "tinyterra", + "description": "This extension offers extensive xyPlot, various pipe nodes, fullscreen image viewer based on node history, dynamic widgets, interface customization, and more.", + "nickname": "\ud83c\udf0f", + "nodename_pattern": "^ttN ", + "title": "tinyterraNodes", + "title_aux": "ComfyUI_tinyterraNodes" + } + ], + "https://github.com/TripleHeadedMonkey/ComfyUI_MileHighStyler": [ + [ + "menus" + ], + { + "title_aux": "ComfyUI_MileHighStyler" + } + ], + "https://github.com/Tropfchen/ComfyUI-Embedding_Picker": [ + [ + "EmbeddingPicker" + ], + { + "title_aux": "Embedding Picker" + } + ], + "https://github.com/Tropfchen/ComfyUI-yaResolutionSelector": [ + [ + "YARS", + "YARSAdv" + ], + { + "title_aux": "YARS: Yet Another Resolution Selector" + } + ], + "https://github.com/Trung0246/ComfyUI-0246": [ + [ + "0246.Beautify", + "0246.BoxRange", + "0246.CastReroute", + "0246.Cloud", + "0246.Convert", + "0246.Count", + "0246.Highway", + "0246.HighwayBatch", + "0246.Hold", + "0246.Hub", + "0246.Junction", + "0246.JunctionBatch", + "0246.Loop", + "0246.Merge", + "0246.Meta", + "0246.Pick", + "0246.RandomInt", + "0246.Script", + "0246.ScriptNode", + "0246.ScriptPile", + "0246.ScriptRule", + "0246.Stringify", + "0246.Switch", + "0246.Tag" + ], + { + "author": "Trung0246", + "description": "Random nodes for ComfyUI I made to solve my struggle with ComfyUI (ex: pipe, process). Have varying quality.", + "nickname": "ComfyUI-0246", + "title": "ComfyUI-0246", + "title_aux": "ComfyUI-0246" + } + ], + "https://github.com/Ttl/ComfyUi_NNLatentUpscale": [ + [ + "NNLatentUpscale" + ], + { + "preemptions": [ + "NNLatentUpscale" + ], + "title_aux": "ComfyUI Neural Network Latent Upscale" + } + ], + "https://github.com/TylerZoro/SD3-Scaling": [ + [ + "SD3ImageScaleToTotalPixels" + ], + { + "title_aux": "SD3-Scaling" + } + ], + "https://github.com/Umikaze-job/select_folder_path_easy": [ + [ + "SelectFolderPathEasy" + ], + { + "title_aux": "select_folder_path_easy" + } + ], + "https://github.com/VAST-AI-Research/ComfyUI-Tripo": [ + [ + "TripoAPIImageToMeshNode", + "TripoAPITextToMeshNode", + "TripoGLBViewer" + ], + { + "title_aux": "Tripo for ComfyUI" + } + ], + "https://github.com/WASasquatch/ASTERR": [ + [ + "ASTERR", + "SaveASTERR" + ], + { + "title_aux": "ASTERR" + } + ], + "https://github.com/WASasquatch/ComfyUI_Preset_Merger": [ + [ + "Preset_Model_Merge" + ], + { + "title_aux": "ComfyUI Preset Merger" + } + ], + "https://github.com/WASasquatch/FreeU_Advanced": [ + [ + "FreeU (Advanced)", + "FreeU_V2 (Advanced)" + ], + { + "title_aux": "FreeU_Advanced" + } + ], + "https://github.com/WASasquatch/PPF_Noise_ComfyUI": [ + [ + "Blend Latents (PPF Noise)", + "Cross-Hatch Power Fractal (PPF Noise)", + "Images as Latents (PPF Noise)", + "Perlin Power Fractal Latent (PPF Noise)" + ], + { + "title_aux": "PPF_Noise_ComfyUI" + } + ], + "https://github.com/WASasquatch/PowerNoiseSuite": [ + [ + "Blend Latents (PPF Noise)", + "Cross-Hatch Power Fractal (PPF Noise)", + "Cross-Hatch Power Fractal Settings (PPF Noise)", + "Images as Latents (PPF Noise)", + "Latent Adjustment (PPF Noise)", + "Latents to CPU (PPF Noise)", + "Linear Cross-Hatch Power Fractal (PPF Noise)", + "Perlin Power Fractal Latent (PPF Noise)", + "Perlin Power Fractal Settings (PPF Noise)", + "Power KSampler Advanced (PPF Noise)", + "Power-Law Noise (PPF Noise)" + ], + { + "title_aux": "Power Noise Suite for ComfyUI" + } + ], + "https://github.com/WASasquatch/WAS_Extras": [ + [ + "BLVAEEncode", + "CLIPTextEncodeList", + "CLIPTextEncodeSequence2", + "ConditioningBlend", + "DebugInput", + "KSamplerSeq", + "KSamplerSeq2", + "VAEEncodeForInpaint (WAS)", + "VividSharpen" + ], + { + "title_aux": "WAS_Extras" + } + ], + "https://github.com/WASasquatch/was-node-suite-comfyui": [ + [ + "BLIP Analyze Image", + "BLIP Model Loader", + "Blend Latents", + "Boolean To Text", + "Bounded Image Blend", + "Bounded Image Blend with Mask", + "Bounded Image Crop", + "Bounded Image Crop with Mask", + "Bus Node", + "CLIP Input Switch", + "CLIP Vision Input Switch", + "CLIPSeg Batch Masking", + "CLIPSeg Masking", + "CLIPSeg Model Loader", + "CLIPTextEncode (BlenderNeko Advanced + NSP)", + "CLIPTextEncode (NSP)", + "Cache Node", + "Checkpoint Loader", + "Checkpoint Loader (Simple)", + "Conditioning Input Switch", + "Constant Number", + "Control Net Model Input Switch", + "Convert Masks to Images", + "Create Grid Image", + "Create Grid Image from Batch", + "Create Morph Image", + "Create Morph Image from Path", + "Create Video from Path", + "Debug Number to Console", + "Dictionary to Console", + "Diffusers Hub Model Down-Loader", + "Diffusers Model Loader", + "Export API", + "HSL to Hex", + "Hex to HSL", + "Image Analyze", + "Image Aspect Ratio", + "Image Batch", + "Image Blank", + "Image Blend", + "Image Blend by Mask", + "Image Blending Mode", + "Image Bloom Filter", + "Image Bounds", + "Image Bounds to Console", + "Image Canny Filter", + "Image Chromatic Aberration", + "Image Color Palette", + "Image Crop Face", + "Image Crop Location", + "Image Crop Square Location", + "Image Displacement Warp", + "Image Dragan Photography Filter", + "Image Edge Detection Filter", + "Image Film Grain", + "Image Filter Adjustments", + "Image Flip", + "Image Generate Gradient", + "Image Gradient Map", + "Image High Pass Filter", + "Image History Loader", + "Image Input Switch", + "Image Levels Adjustment", + "Image Load", + "Image Lucy Sharpen", + "Image Median Filter", + "Image Mix RGB Channels", + "Image Monitor Effects Filter", + "Image Nova Filter", + "Image Padding", + "Image Paste Crop", + "Image Paste Crop by Location", + "Image Paste Face", + "Image Perlin Noise", + "Image Perlin Power Fractal", + "Image Pixelate", + "Image Power Noise", + "Image Rembg (Remove Background)", + "Image Remove Background (Alpha)", + "Image Remove Color", + "Image Resize", + "Image Rotate", + "Image Rotate Hue", + "Image SSAO (Ambient Occlusion)", + "Image SSDO (Direct Occlusion)", + "Image Save", + "Image Seamless Texture", + "Image Select Channel", + "Image Select Color", + "Image Send HTTP", + "Image Shadows and Highlights", + "Image Size to Number", + "Image Stitch", + "Image Style Filter", + "Image Threshold", + "Image Tiled", + "Image Transpose", + "Image Voronoi Noise Filter", + "Image fDOF Filter", + "Image to Latent Mask", + "Image to Noise", + "Image to Seed", + "Images to Linear", + "Images to RGB", + "Inset Image Bounds", + "Integer place counter", + "KSampler (WAS)", + "KSampler Cycle", + "Latent Batch", + "Latent Input Switch", + "Latent Noise Injection", + "Latent Size to Number", + "Latent Upscale by Factor (WAS)", + "Load Cache", + "Load Image Batch", + "Load Lora", + "Load Text File", + "Logic Boolean", + "Logic Boolean Primitive", + "Logic Comparison AND", + "Logic Comparison OR", + "Logic Comparison XOR", + "Logic NOT", + "Lora Input Switch", + "Lora Loader", + "Mask Arbitrary Region", + "Mask Batch", + "Mask Batch to Mask", + "Mask Ceiling Region", + "Mask Crop Dominant Region", + "Mask Crop Minority Region", + "Mask Crop Region", + "Mask Dilate Region", + "Mask Dominant Region", + "Mask Erode Region", + "Mask Fill Holes", + "Mask Floor Region", + "Mask Gaussian Region", + "Mask Invert", + "Mask Minority Region", + "Mask Paste Region", + "Mask Smooth Region", + "Mask Threshold Region", + "Masks Add", + "Masks Combine Batch", + "Masks Combine Regions", + "Masks Subtract", + "MiDaS Depth Approximation", + "MiDaS Mask Image", + "MiDaS Model Loader", + "Model Input Switch", + "Number Counter", + "Number Input Condition", + "Number Input Switch", + "Number Multiple Of", + "Number Operation", + "Number PI", + "Number to Float", + "Number to Int", + "Number to Seed", + "Number to String", + "Number to Text", + "Prompt Multiple Styles Selector", + "Prompt Styles Selector", + "Random Number", + "SAM Image Mask", + "SAM Model Loader", + "SAM Parameters", + "SAM Parameters Combine", + "Samples Passthrough (Stat System)", + "Save Text File", + "Seed", + "String to Text", + "Tensor Batch to Image", + "Text Add Token by Input", + "Text Add Tokens", + "Text Compare", + "Text Concatenate", + "Text Contains", + "Text Dictionary Convert", + "Text Dictionary Get", + "Text Dictionary Keys", + "Text Dictionary New", + "Text Dictionary To Text", + "Text Dictionary Update", + "Text File History Loader", + "Text Find", + "Text Find and Replace", + "Text Find and Replace Input", + "Text Find and Replace by Dictionary", + "Text Input Switch", + "Text List", + "Text List Concatenate", + "Text List to Text", + "Text Load Line From File", + "Text Multiline", + "Text Multiline (Code Compatible)", + "Text Parse A1111 Embeddings", + "Text Parse Noodle Soup Prompts", + "Text Parse Tokens", + "Text Random Line", + "Text Random Prompt", + "Text Shuffle", + "Text Sort", + "Text String", + "Text String Truncate", + "Text to Conditioning", + "Text to Console", + "Text to Number", + "Text to String", + "True Random.org Number Generator", + "Upscale Model Loader", + "Upscale Model Switch", + "VAE Input Switch", + "Video Dump Frames", + "Write to GIF", + "Write to Video", + "unCLIP Checkpoint Loader" + ], + { + "title_aux": "WAS Node Suite" + } + ], + "https://github.com/WebDev9000/WebDev9000-Nodes": [ + [ + "IgnoreBraces", + "SettingsSwitch" + ], + { + "title_aux": "WebDev9000-Nodes" + } + ], + "https://github.com/Wicloz/ComfyUI-Simply-Nodes": [ + [ + "WF_ConditionalLoraLoader", + "WF_MultilineText", + "WF_RandomStyle", + "WF_ResolutionSDXL", + "WF_TextFlow" + ], + { + "title_aux": "ComfyUI Simply Nodes" + } + ], + "https://github.com/XmYx/deforum-comfy-nodes": [ + [ + "DeforumAddNoiseNode", + "DeforumAnimParamsNode", + "DeforumAreaPromptNode", + "DeforumBaseParamsNode", + "DeforumCacheLatentNode", + "DeforumCadenceNode", + "DeforumCadenceParamsNode", + "DeforumColorMatchNode", + "DeforumColorParamsNode", + "DeforumConditioningBlendNode", + "DeforumDepthParamsNode", + "DeforumDiffusionParamsNode", + "DeforumFILMInterpolationNode", + "DeforumFrameWarpNode", + "DeforumGetCachedLatentNode", + "DeforumHybridMotionNode", + "DeforumHybridParamsNode", + "DeforumHybridScheduleNode", + "DeforumIteratorNode", + "DeforumKSampler", + "DeforumLoadVideo", + "DeforumNoiseParamsNode", + "DeforumPromptNode", + "DeforumSeedNode", + "DeforumSetVAEDownscaleRatioNode", + "DeforumSimpleInterpolationNode", + "DeforumSingleSampleNode", + "DeforumTranslationParamsNode", + "DeforumVideoSaveNode" + ], + { + "title_aux": "Deforum Nodes" + } + ], + "https://github.com/Xyem/Xycuno-Oobabooga": [ + [ + "Oobabooga" + ], + { + "title_aux": "Xycuno Oobabooga" + } + ], + "https://github.com/YMC-GitHub/ymc-node-suite-comfyui": [ + [ + "canvas-util-cal-size", + "conditioning-util-input-switch", + "cutoff-region-util", + "hks-util-cal-denoise-step", + "img-util-get-image-size", + "img-util-switch-input-image", + "io-image-save", + "io-text-save", + "io-util-file-list-get", + "io-util-file-list-get-text", + "number-util-random-num", + "pipe-util-to-basic-pipe", + "region-util-get-by-center-and-size", + "region-util-get-by-lt", + "region-util-get-crop-location-from-center-size-text", + "region-util-get-pad-out-location-by-size", + "text-preset-colors", + "text-util-join-text", + "text-util-loop-text", + "text-util-path-list", + "text-util-prompt-add-prompt", + "text-util-prompt-adv-dup", + "text-util-prompt-adv-search", + "text-util-prompt-del", + "text-util-prompt-dup", + "text-util-prompt-join", + "text-util-prompt-search", + "text-util-prompt-shuffle", + "text-util-prompt-std", + "text-util-prompt-unweight", + "text-util-random-text", + "text-util-search-text", + "text-util-show-text", + "text-util-switch-text", + "xyz-util-txt-to-int" + ], + { + "title_aux": "ymc-node-suite-comfyui" + } + ], + "https://github.com/YOUR-WORST-TACO/ComfyUI-TacoNodes": [ + [ + "Example", + "TacoAnimatedLoader", + "TacoGifMaker", + "TacoImg2ImgAnimatedLoader", + "TacoImg2ImgAnimatedProcessor", + "TacoLatent" + ], + { + "title_aux": "ComfyUI-TacoNodes" + } + ], + "https://github.com/Yanick112/ComfyUI-ToSVG": [ + [ + "ConvertRasterToVector", + "SaveSVG" + ], + { + "title_aux": "ComfyUI-ToSVG" + } + ], + "https://github.com/YinBailiang/MergeBlockWeighted_fo_ComfyUI": [ + [ + "MergeBlockWeighted" + ], + { + "title_aux": "MergeBlockWeighted_fo_ComfyUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-APISR": [ + [ + "APISR_Lterative_Zho", + "APISR_ModelLoader_Zho", + "APISR_Zho" + ], + { + "title_aux": "APISR IN COMFYUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Animated-optical-illusions": [ + [ + "AOI_Processing_Zho" + ], + { + "title_aux": "ComfyUI-Animated-optical-illusions" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-ArtGallery": [ + [ + "ArtGallery_Zho", + "ArtistsImage_Zho", + "CamerasImage_Zho", + "FilmsImage_Zho", + "MovementsImage_Zho", + "StylesImage_Zho" + ], + { + "title_aux": "ComfyUI-ArtGallery" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BRIA_AI-RMBG": [ + [ + "BRIA_RMBG_ModelLoader_Zho", + "BRIA_RMBG_Zho" + ], + { + "title_aux": "ComfyUI-BRIA_AI-RMBG" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-BiRefNet-ZHO": [ + [ + "BiRefNet_ModelLoader_Zho", + "BiRefNet_Zho" + ], + { + "title_aux": "ComfyUI-BiRefNet-ZHO" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-DepthFM": [ + [ + "DepthFM_Literative_Zho", + "DepthFM_ModelLoader_Zho", + "DepthFM_Zho" + ], + { + "title_aux": "DepthFM IN COMFYUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Gemini": [ + [ + "ConcatText_Zho", + "DisplayText_Zho", + "Gemini_15P_API_S_Advance_Zho", + "Gemini_15P_API_S_Chat_Advance_Zho", + "Gemini_API_Chat_Zho", + "Gemini_API_S_Chat_Zho", + "Gemini_API_S_Vsion_ImgURL_Zho", + "Gemini_API_S_Zho", + "Gemini_API_Vsion_ImgURL_Zho", + "Gemini_API_Zho", + "Gemini_FileUpload_API_S_Zho", + "Gemini_File_API_S_Zho" + ], + { + "title_aux": "ComfyUI-Gemini" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-InstantID": [ + [ + "IDBaseModelLoader_fromhub", + "IDBaseModelLoader_local", + "IDControlNetLoader", + "IDGenerationNode", + "ID_Prompt_Styler", + "InsightFaceLoader_Zho", + "Ipadapter_instantidLoader" + ], + { + "title_aux": "ComfyUI-InstantID" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Phi-3-mini": [ + [ + "Phi3mini_4k_Chat_Zho", + "Phi3mini_4k_ModelLoader_Zho", + "Phi3mini_4k_Zho" + ], + { + "title_aux": "Phi-3-mini in ComfyUI" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PhotoMaker-ZHO": [ + [ + "BaseModel_Loader_fromhub", + "BaseModel_Loader_local", + "LoRALoader", + "NEW_PhotoMaker_Generation", + "PhotoMakerAdapter_Loader_fromhub", + "PhotoMakerAdapter_Loader_local", + "PhotoMaker_Generation", + "Prompt_Styler", + "Ref_Image_Preprocessing" + ], + { + "title_aux": "ComfyUI PhotoMaker (ZHO)" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-PixArt-alpha-Diffusers": [ + [ + "PA_BaseModelLoader_fromhub_Zho", + "PA_Generation_Zho", + "PA_Styler_Zho" + ], + { + "title_aux": "ComfyUI-PixArt-alpha-Diffusers" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Q-Align": [ + [ + "QAlign_Zho" + ], + { + "title_aux": "ComfyUI-Q-Align" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-2": [ + [ + "Qwen2_Chat_Zho", + "Qwen2_ModelLoader_Zho", + "Qwen2_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-2" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Qwen-VL-API": [ + [ + "QWenVL_API_S_Multi_Zho", + "QWenVL_API_S_Zho" + ], + { + "title_aux": "ComfyUI-Qwen-VL-API" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SVD-ZHO": [ + [ + "SVD_Aspect_Ratio_Zho", + "SVD_Steps_MotionStrength_Seed_Zho", + "SVD_Styler_Zho" + ], + { + "title_aux": "ComfyUI-SVD-ZHO (WIP)" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-SegMoE": [ + [ + "SMoE_Generation_Zho", + "SMoE_ModelLoader_Zho" + ], + { + "title_aux": "ComfyUI SegMoE" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-Text_Image-Composite": [ + [ + "AlphaChanelAddByMask", + "ImageCompositeBy_BG_Zho", + "ImageCompositeBy_Zho", + "ImageComposite_BG_Zho", + "ImageComposite_Zho", + "RGB_Image_Zho", + "Text_Image_Frame_Zho", + "Text_Image_Multiline_Zho", + "Text_Image_Zho" + ], + { + "title_aux": "ComfyUI-Text_Image-Composite [WIP]" + } + ], + "https://github.com/ZHO-ZHO-ZHO/ComfyUI-YoloWorld-EfficientSAM": [ + [ + "ESAM_ModelLoader_Zho", + "Yoloworld_ESAM_DetectorProvider_Zho", + "Yoloworld_ESAM_Zho", + "Yoloworld_ModelLoader_Zho" + ], + { + "title_aux": "ComfyUI YoloWorld-EfficientSAM" + } + ], + "https://github.com/ZHO-ZHO-ZHO/comfyui-portrait-master-zh-cn": [ + [ + "PortraitMaster_\u4e2d\u6587\u7248" + ], + { + "title_aux": "comfyui-portrait-master-zh-cn" + } + ], + "https://github.com/ZZXYWQ/ComfyUI-ZZXYWQ": [ + [ + "VideoFormatConverter" + ], + { + "title_aux": "ZZX Nodes" + } + ], + "https://github.com/ZaneA/ComfyUI-ImageReward": [ + [ + "ImageRewardLoader", + "ImageRewardScore" + ], + { + "title_aux": "ImageReward" + } + ], + "https://github.com/ZeDarkAdam/ComfyUI-Embeddings-Tools": [ + [ + "EmbeddingsNameLoader", + "EmbendingList" + ], + { + "title_aux": "ComfyUI-Embeddings-Tools" + } + ], + "https://github.com/a1lazydog/ComfyUI-AudioScheduler": [ + [ + "AmplitudeToGraph", + "AmplitudeToNumber", + "AudioToAmplitudeGraph", + "AudioToFFTs", + "BatchAmplitudeSchedule", + "ClipAmplitude", + "FloatArrayToGraph", + "GateNormalizedAmplitude", + "LoadAudio", + "LoadVHSAudio", + "NormalizeAmplitude", + "NormalizedAmplitudeDrivenString", + "NormalizedAmplitudeToGraph", + "NormalizedAmplitudeToNumber", + "TransientAmplitudeBasic" + ], + { + "title_aux": "ComfyUI-AudioScheduler" + } + ], + "https://github.com/aburahamu/ComfyUI-IsNiceParts": [ + [ + "NiceHand" + ], + { + "title_aux": "ComfyUI-IsNiceParts" + } + ], + "https://github.com/aburahamu/ComfyUI-RequestsPoster": [ + [ + "GetImageFromSD3byI2I", + "GetImageFromSD3byT2I", + "PostImage2Discord", + "PostImage2X", + "PostText" + ], + { + "title_aux": "ComfyUI-RequestPoster" + } + ], + "https://github.com/abyz22/image_control": [ + [ + "abyz22_AddPrompt", + "abyz22_Convertpipe", + "abyz22_Editpipe", + "abyz22_FirstNonNull", + "abyz22_FromBasicPipe_v2", + "abyz22_Frompipe", + "abyz22_ImpactWildcardEncode", + "abyz22_ImpactWildcardEncode_GetPrompt", + "abyz22_Ksampler", + "abyz22_Padding Image", + "abyz22_RandomMask", + "abyz22_RemoveControlnet", + "abyz22_ResizeOpenpose", + "abyz22_SaveImage", + "abyz22_SetQueue", + "abyz22_ToBasicPipe", + "abyz22_Topipe", + "abyz22_blend_onecolor", + "abyz22_blendimages", + "abyz22_bypass", + "abyz22_censoring", + "abyz22_drawmask", + "abyz22_lamaInpaint", + "abyz22_lamaPreprocessor", + "abyz22_makecircles", + "abyz22_setimageinfo", + "abyz22_smallhead" + ], + { + "title_aux": "image_control" + } + ], + "https://github.com/adbrasi/ComfyUI-TrashNodes-DownloadHuggingface": [ + [ + "DownloadLinkChecker", + "ShowFileNames" + ], + { + "title_aux": "ComfyUI-TrashNodes-DownloadHuggingface" + } + ], + "https://github.com/adieyal/comfyui-dynamicprompts": [ + [ + "DPCombinatorialGenerator", + "DPFeelingLucky", + "DPJinja", + "DPMagicPrompt", + "DPOutput", + "DPRandomGenerator" + ], + { + "title_aux": "DynamicPrompts Custom Nodes" + } + ], + "https://github.com/adigayung/ComfyUI-Translator": [ + [ + "CLIP Text Encode (Auto Translate)" + ], + { + "title_aux": "ComfyUI-Translator" + } + ], + "https://github.com/adriflex/ComfyUI_Blender_Texdiff": [ + [ + "ViewportColor", + "ViewportDepth" + ], + { + "title_aux": "ComfyUI_Blender_Texdiff" + } + ], + "https://github.com/aegis72/aegisflow_utility_nodes": [ + [ + "Add Text To Image", + "Aegisflow CLIP Pass", + "Aegisflow Conditioning Pass", + "Aegisflow Image Pass", + "Aegisflow Latent Pass", + "Aegisflow Mask Pass", + "Aegisflow Model Pass", + "Aegisflow Pos/Neg Pass", + "Aegisflow SDXL Tuple Pass", + "Aegisflow VAE Pass", + "Aegisflow controlnet preprocessor bus", + "Apply Instagram Filter", + "Binary INT Switch", + "Brightness_Contrast_Ally", + "Flatten Colors", + "Gaussian Blur_Ally", + "GlitchThis Effect", + "Hue Rotation", + "Image Flip_ally", + "Placeholder Tuple", + "Swap Color Mode", + "aegisflow Multi_Pass", + "aegisflow Multi_Pass XL", + "af_pipe_in_15", + "af_pipe_in_xl", + "af_pipe_out_15", + "af_pipe_out_xl" + ], + { + "title_aux": "AegisFlow Utility Nodes" + } + ], + "https://github.com/aegis72/comfyui-styles-all": [ + [ + "menus" + ], + { + "title_aux": "ComfyUI-styles-all" + } + ], + "https://github.com/ai-liam/comfyui-liam": [ + [ + "AiStoreAzureGPTLiam", + "GetBetterDepthImage", + "LiamLibDisplayText", + "LiamLibFillImage", + "LiamLibImageToGray", + "LiamLibLoadImage", + "LiamLibMergeText", + "LiamLibSaveImg", + "LiamLibSaveText", + "OllamaApiTNodeLiam", + "PreviewReliefImage", + "SpeechRecognitionLiam", + "SpeechSynthesisLiam" + ], + { + "title_aux": "LiamUtil" + } + ], + "https://github.com/ai-liam/comfyui_liam_util": [ + [ + "LiamLoadImage" + ], + { + "title_aux": "LiamUtil (single node)" + } + ], + "https://github.com/aianimation55/ComfyUI-FatLabels": [ + [ + "FatLabels" + ], + { + "title_aux": "Comfy UI FatLabels" + } + ], + "https://github.com/al-swaiti/ComfyUI-CascadeResolutions": [ + [ + "CascadeResolutions" + ], + { + "title_aux": "ComfyUI-CascadeResolutions" + } + ], + "https://github.com/alessandrozonta/ComfyUI-CenterNode": [ + [ + "BBoxCrop" + ], + { + "title_aux": "Bounding Box Crop Node for ComfyUI" + } + ], + "https://github.com/alessandrozonta/ComfyUI-Layers": [ + [ + "LayersSaver - Save Layer", + "LayersSaver - Save Layer From Images" + ], + { + "title_aux": "Save Layers Node for ComfyUI" + } + ], + "https://github.com/alessandrozonta/ComfyUI-OpenPose": [ + [ + "OpenPose - Get poses" + ], + { + "author": "joe", + "title_aux": "OpenPose Node" + } + ], + "https://github.com/alexopus/ComfyUI-Image-Saver": [ + [ + "Cfg Literal (Image Saver)", + "Checkpoint Loader with Name (Image Saver)", + "Float Literal (Image Saver)", + "Image Saver", + "Int Literal (Image Saver)", + "Sampler Selector (Image Saver)", + "Scheduler Selector (Comfy) (Image Saver)", + "Scheduler Selector (Image Saver)", + "SchedulerComfyToString (Image Saver)", + "SchedulerToString (Image Saver)", + "Seed Generator (Image Saver)", + "String Literal (Image Saver)", + "Width/Height Literal (Image Saver)" + ], + { + "title_aux": "ComfyUI Image Saver" + } + ], + "https://github.com/alisson-anjos/ComfyUI-Ollama-Describer": [ + [ + "InputText", + "OllamaImageDescriber", + "OllamaTextDescriber", + "ShowText", + "TextTransformer" + ], + { + "title_aux": "ComfyUI-Ollama-Describer" + } + ], + "https://github.com/alpertunga-bile/prompt-generator-comfyui": [ + [ + "Prompt Generator" + ], + { + "title_aux": "prompt-generator" + } + ], + "https://github.com/alsritter/asymmetric-tiling-comfyui": [ + [ + "Asymmetric_Tiling_KSampler" + ], + { + "title_aux": "asymmetric-tiling-comfyui" + } + ], + "https://github.com/alt-key-project/comfyui-dream-project": [ + [ + "Analyze Palette [Dream]", + "Beat Curve [Dream]", + "Big Float Switch [Dream]", + "Big Image Switch [Dream]", + "Big Int Switch [Dream]", + "Big Latent Switch [Dream]", + "Big Palette Switch [Dream]", + "Big Text Switch [Dream]", + "Boolean To Float [Dream]", + "Boolean To Int [Dream]", + "Build Prompt [Dream]", + "CSV Curve [Dream]", + "CSV Generator [Dream]", + "Calculation [Dream]", + "Common Frame Dimensions [Dream]", + "Compare Palettes [Dream]", + "FFMPEG Video Encoder [Dream]", + "File Count [Dream]", + "Finalize Prompt [Dream]", + "Float Input [Dream]", + "Float to Log Entry [Dream]", + "Frame Count Calculator [Dream]", + "Frame Counter (Directory) [Dream]", + "Frame Counter (Simple) [Dream]", + "Frame Counter Info [Dream]", + "Frame Counter Offset [Dream]", + "Frame Counter Time Offset [Dream]", + "Image Brightness Adjustment [Dream]", + "Image Color Shift [Dream]", + "Image Contrast Adjustment [Dream]", + "Image Motion [Dream]", + "Image Sequence Blend [Dream]", + "Image Sequence Loader [Dream]", + "Image Sequence Saver [Dream]", + "Image Sequence Tweening [Dream]", + "Int Input [Dream]", + "Int to Log Entry [Dream]", + "Laboratory [Dream]", + "Linear Curve [Dream]", + "Log Entry Joiner [Dream]", + "Log File [Dream]", + "Noise from Area Palettes [Dream]", + "Noise from Palette [Dream]", + "Palette Color Align [Dream]", + "Palette Color Shift [Dream]", + "Sample Image Area as Palette [Dream]", + "Sample Image as Palette [Dream]", + "Saw Curve [Dream]", + "Sine Curve [Dream]", + "Smooth Event Curve [Dream]", + "String Input [Dream]", + "String Tokenizer [Dream]", + "String to Log Entry [Dream]", + "Text Input [Dream]", + "Triangle Curve [Dream]", + "Triangle Event Curve [Dream]", + "WAV Curve [Dream]" + ], + { + "title_aux": "Dream Project Animation Nodes" + } + ], + "https://github.com/alt-key-project/comfyui-dream-video-batches": [ + [ + "Blended Transition [DVB]", + "Calculation [DVB]", + "Create Frame Set [DVB]", + "Divide [DVB]", + "Fade From Black [DVB]", + "Fade To Black [DVB]", + "Float Input [DVB]", + "For Each Done [DVB]", + "For Each Filename [DVB]", + "Frame Set Append [DVB]", + "Frame Set Frame Dimensions Scaled [DVB]", + "Frame Set Index Offset [DVB]", + "Frame Set Merger [DVB]", + "Frame Set Reindex [DVB]", + "Frame Set Repeat [DVB]", + "Frame Set Reverse [DVB]", + "Frame Set Split Beginning [DVB]", + "Frame Set Split End [DVB]", + "Frame Set Splitter [DVB]", + "Generate Inbetween Frames [DVB]", + "Int Input [DVB]", + "Linear Camera Pan [DVB]", + "Linear Camera Roll [DVB]", + "Linear Camera Zoom [DVB]", + "Load Image From Path [DVB]", + "Multiply [DVB]", + "Sine Camera Pan [DVB]", + "Sine Camera Roll [DVB]", + "Sine Camera Zoom [DVB]", + "String Input [DVB]", + "Text Input [DVB]", + "Trace Memory Allocation [DVB]", + "Unwrap Frame Set [DVB]" + ], + { + "title_aux": "Dream Video Batches" + } + ], + "https://github.com/an90ray/ComfyUI_RErouter_CustomNodes": [ + [ + "CLIPTextEncode (RE)", + "CLIPTextEncodeSDXL (RE)", + "CLIPTextEncodeSDXLRefiner (RE)", + "Int (RE)", + "RErouter <=", + "RErouter =>", + "String (RE)" + ], + { + "title_aux": "ComfyUI_RErouter_CustomNodes" + } + ], + "https://github.com/andersxa/comfyui-PromptAttention": [ + [ + "CLIPAttentionMaskEncode" + ], + { + "title_aux": "CLIP Directional Prompt Attention" + } + ], + "https://github.com/angeloshredder/StableCascadeResizer": [ + [ + "CascadeResize" + ], + { + "title_aux": "StableCascadeResizer" + } + ], + "https://github.com/ansonkao/comfyui-geometry": [ + [ + "TransformTemplateOntoFaceMask" + ], + { + "author": "Anson Kao", + "description": "A small collection of custom nodes for use with ComfyUI, by Discopixel", + "nickname": "ComfyUI Discopixel", + "title": "ComfyUI Discopixel", + "title_aux": "comfyui-geometry" + } + ], + "https://github.com/antrobot1234/antrobots-comfyUI-nodepack": [ + [ + "composite", + "crop", + "paste", + "preview_mask", + "scale" + ], + { + "title_aux": "antrobots ComfyUI Nodepack" + } + ], + "https://github.com/asagi4/ComfyUI-Adaptive-Guidance": [ + [ + "AdaptiveGuidance" + ], + { + "title_aux": "Adaptive Guidance for ComfyUI" + } + ], + "https://github.com/asagi4/ComfyUI-CADS": [ + [ + "CADS" + ], + { + "title_aux": "ComfyUI-CADS" + } + ], + "https://github.com/asagi4/comfyui-prompt-control": [ + [ + "EditableCLIPEncode", + "FilterSchedule", + "LoRAScheduler", + "PCApplySettings", + "PCPromptFromSchedule", + "PCScheduleAddMasks", + "PCScheduleSettings", + "PCSplitSampling", + "PCWrapGuider", + "PromptControlSimple", + "PromptToSchedule", + "ScheduleToCond", + "ScheduleToModel" + ], + { + "title_aux": "ComfyUI prompt control" + } + ], + "https://github.com/asagi4/comfyui-utility-nodes": [ + [ + "MUForceCacheClear", + "MUJinjaRender", + "MUReplaceModelWeights", + "MUSimpleWildcard" + ], + { + "title_aux": "asagi4/comfyui-utility-nodes" + } + ], + "https://github.com/aszc-dev/ComfyUI-CoreMLSuite": [ + [ + "Core ML Converter", + "Core ML LCM Converter", + "Core ML LoRA Loader", + "CoreMLModelAdapter", + "CoreMLSampler", + "CoreMLSamplerAdvanced", + "CoreMLUNetLoader" + ], + { + "title_aux": "Core ML Suite for ComfyUI" + } + ], + "https://github.com/audioscavenger/ComfyUI-Thumbnails": [ + [ + "LoadImageThumbnails" + ], + { + "author": "AudioscavengeR", + "description": "Load Image thumbnails and show input subfolders.", + "nickname": "ComfyUI Thumbnails", + "title": "ComfyUI Thumbnails", + "title_aux": "ComfyUI Thumbnails" + } + ], + "https://github.com/audioscavenger/save-image-extended-comfyui": [ + [ + "SaveImageExtended" + ], + { + "title_aux": "Save Image Extended for ComfyUI" + } + ], + "https://github.com/avatechai/avatar-graph-comfyui": [ + [ + "ApplyMeshTransformAsShapeKey", + "B_ENUM", + "B_VECTOR3", + "B_VECTOR4", + "Combine Points", + "CreateShapeFlow", + "ExportBlendshapes", + "ExportGLTF", + "Extract Boundary Points", + "Image Alpha Mask Merge", + "ImageBridge", + "LoadImageFromRequest", + "LoadImageWithAlpha", + "LoadValueFromRequest", + "SAM MultiLayer", + "Save Image With Workflow" + ], + { + "author": "Avatech Limited", + "description": "Include nodes for sam + bpy operation, that allows workflow creations for generative 2d character rig.", + "nickname": "Avatar Graph", + "title": "Avatar Graph", + "title_aux": "Avatar Graph" + } + ], + "https://github.com/aws-samples/comfyui-llm-node-for-amazon-bedrock": [ + [ + "Bedrock - Claude", + "Bedrock - Claude Multimodal", + "Bedrock - SDXL", + "Bedrock - Titan Inpainting", + "Bedrock - Titan Outpainting", + "Bedrock - Titan Text to Image", + "Bedrock - Titan Variation", + "Image From S3", + "Image From URL", + "Image To S3", + "Prompt Regex Remove", + "Prompt Template" + ], + { + "title_aux": "Amazon Bedrock nodes for ComfyUI" + } + ], + "https://github.com/azure-dragon-ai/ComfyUI-ClipScore-Nodes": [ + [ + "HaojihuiClipScoreFakeImageProcessor", + "HaojihuiClipScoreImageProcessor", + "HaojihuiClipScoreImageScore", + "HaojihuiClipScoreLoader", + "HaojihuiClipScoreRealImageProcessor", + "HaojihuiClipScoreTextProcessor" + ], + { + "title_aux": "ComfyUI-ClipScore-Nodes" + } + ], + "https://github.com/badayvedat/ComfyUI-fal-Connector": [ + [ + "RemoteCheckpointLoader_fal", + "RemoteLoraLoader_fal" + ], + { + "title_aux": "ComfyUI-fal-Connector" + } + ], + "https://github.com/badjeff/comfyui_lora_tag_loader": [ + [ + "LoraTagLoader" + ], + { + "title_aux": "LoRA Tag Loader for ComfyUI" + } + ], + "https://github.com/baicai99/ComfyUI-FrameSkipping": [ + [ + "FrameSelector", + "FrameSkipping", + "FrameTruncating", + "IntOperationsNode", + "MaskFrameSkipping", + "MaskGenerator", + "MaskSelector" + ], + { + "title_aux": "ComfyUI-FrameSkipping" + } + ], + "https://github.com/banodoco/steerable-motion": [ + [ + "BatchCreativeInterpolation", + "IpaConfiguration", + "RemoveAndInterpolateFrames" + ], + { + "title_aux": "Steerable Motion" + } + ], + "https://github.com/barckley75/comfyUI_DaVinciResolve/raw/main/custom_nodes/node_text_to_speech.py": [ + [ + "TextToSpeech" + ], + { + "title_aux": "comfyUI_DaVinciResolve" + } + ], + "https://github.com/bash-j/mikey_nodes": [ + [ + "AddMetaData", + "Batch Crop Image", + "Batch Crop Resize Inplace", + "Batch Load Images", + "Batch Resize Image for SDXL", + "Checkpoint Loader Simple Mikey", + "CheckpointHash", + "CinematicLook", + "Empty Latent Ratio Custom SDXL", + "Empty Latent Ratio Select SDXL", + "EvalFloats", + "FaceFixerOpenCV", + "FileNamePrefix", + "FileNamePrefixDateDirFirst", + "Float to String", + "GetSubdirectories", + "HaldCLUT", + "Image Caption", + "ImageBorder", + "ImageOverlay", + "ImagePaste", + "Int to String", + "LMStudioPrompt", + "Load Image Based on Number", + "LoraSyntaxProcessor", + "Mikey Sampler", + "Mikey Sampler Base Only", + "Mikey Sampler Base Only Advanced", + "Mikey Sampler Tiled", + "Mikey Sampler Tiled Base Only", + "MikeyLatentTileSampler", + "MikeyLatentTileSamplerCustom", + "MikeySamplerTiledAdvanced", + "MikeySamplerTiledAdvancedBaseOnly", + "MosaicExpandImage", + "OobaPrompt", + "PresetRatioSelector", + "Prompt With SDXL", + "Prompt With Style", + "Prompt With Style V2", + "Prompt With Style V3", + "Range Float", + "Range Integer", + "Ratio Advanced", + "Resize Image for SDXL", + "SD3TextConditioningWithOptionsOnePrompt", + "SRFloatPromptInput", + "SRIntPromptInput", + "SRStringPromptInput", + "Save Image If True", + "Save Image With Prompt Data", + "Save Images Mikey", + "Save Images No Display", + "SaveMetaData", + "SearchAndReplace", + "Seed String", + "Style Conditioner", + "Style Conditioner Base Only", + "Text2InputOr3rdOption", + "TextCombinations", + "TextCombinations3", + "TextConcat", + "TextPadderMikey", + "TextPreserve", + "Upscale Tile Calculator", + "Wildcard Processor", + "WildcardAndLoraSyntaxProcessor", + "WildcardOobaPrompt" + ], + { + "title_aux": "Mikey Nodes" + } + ], + "https://github.com/bedovyy/ComfyUI_NAIDGenerator": [ + [ + "GenerateNAID", + "Img2ImgOptionNAID", + "InpaintingOptionNAID", + "MaskImageToNAID", + "ModelOptionNAID", + "PromptToNAID", + "VibeTransferOptionNAID" + ], + { + "title_aux": "ComfyUI_NAIDGenerator" + } + ], + "https://github.com/bilal-arikan/ComfyUI_TextAssets": [ + [ + "LoadTextAsset" + ], + { + "title_aux": "ComfyUI_TextAssets" + } + ], + "https://github.com/bitaffinity/ComfyUI_HF_Inference": [ + [ + "Classification", + "FeatureExtraction", + "Generation", + "ObjectDetection", + "QuestionAnswering", + "Segmentation", + "TextToImage", + "Translation" + ], + { + "title_aux": "ComfyUI_HF_Inference" + } + ], + "https://github.com/bkunbargi/BrevImage/raw/main/BrevLoadImage.py": [ + [ + "BrevImage" + ], + { + "title_aux": "BrevImage" + } + ], + "https://github.com/blepping/ComfyUI-bleh": [ + [ + "BlehBlockOps", + "BlehDeepShrink", + "BlehDisableNoise", + "BlehDiscardPenultimateSigma", + "BlehForceSeedSampler", + "BlehHyperTile", + "BlehInsaneChainSampler", + "BlehLatentOps", + "BlehLatentScaleBy", + "BlehModelPatchConditional", + "BlehPlug", + "BlehRefinerAfter" + ], + { + "title_aux": "ComfyUI-bleh" + } + ], + "https://github.com/blepping/ComfyUI-sonar": [ + [ + "NoisyLatentLike", + "SamplerConfigOverride", + "SamplerSonarDPMPPSDE", + "SamplerSonarEuler", + "SamplerSonarEulerA", + "SonarCompositeNoise", + "SonarCustomNoise", + "SonarGuidanceConfig", + "SonarGuidedNoise", + "SonarModulatedNoise", + "SonarRandomNoise", + "SonarRepeatedNoise", + "SonarScheduledNoise" + ], + { + "title_aux": "ComfyUI-sonar" + } + ], + "https://github.com/blepping/comfyui_jankhidiffusion": [ + [ + "ApplyMSWMSAAttention", + "ApplyMSWMSAAttentionSimple", + "ApplyRAUNet", + "ApplyRAUNetSimple" + ], + { + "title_aux": "ComfyUI jank HiDiffusion" + } + ], + "https://github.com/blueraincoatli/comfyUI_SillyNodes": [ + [ + "BooleanJumper|SillyNode", + "QueueSequence|SillyNode", + "Screenshots|SillyNode", + "dummyInput|SillyNode", + "dummyInput|blueraincoat" + ], + { + "title_aux": "comfyUI_SillyNodes" + } + ], + "https://github.com/bluevisor/ComfyUI_PS_Blend_Node": [ + [ + "PSBlendNode" + ], + { + "title_aux": "ComfyUI_PS_Blend_Node" + } + ], + "https://github.com/bmad4ever/comfyui_ab_samplercustom": [ + [ + "AB SamplerCustom (experimental)" + ], + { + "title_aux": "comfyui_ab_sampler" + } + ], + "https://github.com/bmad4ever/comfyui_bmad_nodes": [ + [ + "AdaptiveThresholding", + "Add String To Many", + "AddAlpha", + "AdjustRect", + "AnyToAny", + "BoundingRect (contours)", + "BuildColorRangeAdvanced (hsv)", + "BuildColorRangeHSV (hsv)", + "CLAHE", + "CLIPEncodeMultiple", + "CLIPEncodeMultipleAdvanced", + "ChameleonMask", + "CheckpointLoader (dirty)", + "CheckpointLoaderSimple (dirty)", + "Color (RGB)", + "Color (hexadecimal)", + "Color Clip", + "Color Clip (advanced)", + "Color Clip ADE20k", + "ColorDictionary", + "ColorDictionary (custom)", + "Conditioning (combine multiple)", + "Conditioning (combine selective)", + "Conditioning Grid (cond)", + "Conditioning Grid (string)", + "Conditioning Grid (string) Advanced", + "Contour To Mask", + "Contours", + "ControlNetHadamard", + "ControlNetHadamard (manual)", + "ConvertImg", + "CopyMakeBorder", + "CreateRequestMetadata", + "DistanceTransform", + "Draw Contour(s)", + "EqualizeHistogram", + "ExtendColorList", + "ExtendCondList", + "ExtendFloatList", + "ExtendImageList", + "ExtendIntList", + "ExtendLatentList", + "ExtendMaskList", + "ExtendModelList", + "ExtendStringList", + "FadeMaskEdges", + "Filter Contour", + "FindComplementaryColor", + "FindThreshold", + "FlatLatentsIntoSingleGrid", + "Framed Mask Grab Cut", + "Framed Mask Grab Cut 2", + "FromListGet1Color", + "FromListGet1Cond", + "FromListGet1Float", + "FromListGet1Image", + "FromListGet1Int", + "FromListGet1Latent", + "FromListGet1Mask", + "FromListGet1Model", + "FromListGet1String", + "FromListGetColors", + "FromListGetConds", + "FromListGetFloats", + "FromListGetImages", + "FromListGetInts", + "FromListGetLatents", + "FromListGetMasks", + "FromListGetModels", + "FromListGetStrings", + "Get Contour from list", + "Get Models", + "Get Prompt", + "HypernetworkLoader (dirty)", + "ImageBatchToList", + "InRange (hsv)", + "Inpaint", + "Input/String to Int Array", + "KMeansColor", + "Load 64 Encoded Image", + "LoraLoader (dirty)", + "MaskGrid N KSamplers Advanced", + "MaskOuterBlur", + "Merge Latent Batch Gridwise", + "MonoMerge", + "MorphologicOperation", + "MorphologicSkeletoning", + "NaiveAutoKMeansColor", + "OtsuThreshold", + "RGB to HSV", + "Rect Grab Cut", + "Remap", + "RemapBarrelDistortion", + "RemapFromInsideParabolas", + "RemapFromQuadrilateral (homography)", + "RemapInsideParabolas", + "RemapInsideParabolasAdvanced", + "RemapPinch", + "RemapReverseBarrelDistortion", + "RemapStretch", + "RemapToInnerCylinder", + "RemapToOuterCylinder", + "RemapToQuadrilateral", + "RemapWarpPolar", + "Repeat Into Grid (image)", + "Repeat Into Grid (latent)", + "RequestInputs", + "SampleColorHSV", + "Save Image (api)", + "SeamlessClone", + "SeamlessClone (simple)", + "SetRequestStateToComplete", + "String", + "String to Float", + "String to Integer", + "ToColorList", + "ToCondList", + "ToFloatList", + "ToImageList", + "ToIntList", + "ToLatentList", + "ToMaskList", + "ToModelList", + "ToStringList", + "UnGridify (image)", + "VAEEncodeBatch" + ], + { + "title_aux": "Bmad Nodes" + } + ], + "https://github.com/bmad4ever/comfyui_lists_cartesian_product": [ + [ + "AnyListCartesianProduct" + ], + { + "title_aux": "Lists Cartesian Product" + } + ], + "https://github.com/bmad4ever/comfyui_quilting": [ + [ + "ImageQuilting_Bmad", + "LatentQuilting_Bmad" + ], + { + "title_aux": "comfyui_quilting" + } + ], + "https://github.com/bmad4ever/comfyui_wfc_like": [ + [ + "WFC_CustomTemperature_Bmad", + "WFC_CustomValueWeights_Bmad", + "WFC_Decode_BMad", + "WFC_EmptyState_Bmad", + "WFC_Encode_BMad", + "WFC_Filter_Bmad", + "WFC_GenParallel_Bmad", + "WFC_Generate_BMad", + "WFC_SampleNode_BMad" + ], + { + "title_aux": "comfyui_wfc_like" + } + ], + "https://github.com/bobmagicii/comfykit-custom-nodes": [ + [ + "LoraThree", + "LoraWithMeta", + "TypecasterImage", + "TypecasterLatent" + ], + { + "title_aux": "ComfyKit Custom Nodes" + } + ], + "https://github.com/bradsec/ComfyUI_ResolutionSelector": [ + [ + "ResolutionSelector" + ], + { + "title_aux": "ResolutionSelector for ComfyUI" + } + ], + "https://github.com/bradsec/ComfyUI_StringTools": [ + [ + "ModifyStringNode", + "RandomStringNode", + "ReplaceStringNode", + "ShowStringNode", + "TextStringNode" + ], + { + "title_aux": "ComfyUI_StringTools" + } + ], + "https://github.com/braintacles/braintacles-comfyui-nodes": [ + [ + "CLIPTextEncodeSDXL-Multi-IO", + "CLIPTextEncodeSDXL-Pipe", + "Empty Latent Image from Aspect-Ratio", + "Interval Sampler", + "Random Find and Replace" + ], + { + "title_aux": "braintacles-nodes" + } + ], + "https://github.com/brianfitzgerald/style_aligned_comfy": [ + [ + "StyleAlignedBatchAlign", + "StyleAlignedReferenceSampler", + "StyleAlignedSampleReferenceLatents" + ], + { + "title_aux": "StyleAligned for ComfyUI" + } + ], + "https://github.com/bronkula/comfyui-fitsize": [ + [ + "FS: Crop Image Into Even Pieces", + "FS: Fit Image And Resize", + "FS: Fit Size From Image", + "FS: Fit Size From Int", + "FS: Image Region To Mask", + "FS: Load Image And Resize To Fit", + "FS: Pick Image From Batch", + "FS: Pick Image From Batches", + "FS: Pick Image From List" + ], + { + "title_aux": "comfyui-fitsize" + } + ], + "https://github.com/bruefire/ComfyUI-SeqImageLoader": [ + [ + "VFrame Loader With Mask Editor", + "Video Loader With Mask Editor" + ], + { + "title_aux": "ComfyUI Sequential Image Loader" + } + ], + "https://github.com/budihartono/comfyui_otonx_nodes": [ + [ + "OTX Integer Multiple Inputs 4", + "OTX Integer Multiple Inputs 5", + "OTX Integer Multiple Inputs 6", + "OTX KSampler Feeder", + "OTX Versatile Multiple Inputs 4", + "OTX Versatile Multiple Inputs 5", + "OTX Versatile Multiple Inputs 6" + ], + { + "title_aux": "Otonx's Custom Nodes" + } + ], + "https://github.com/bvhari/ComfyUI_ImageProcessing": [ + [ + "BilateralFilter", + "Brightness", + "Gamma", + "Hue", + "Saturation", + "SigmoidCorrection", + "UnsharpMask" + ], + { + "title_aux": "ImageProcessing" + } + ], + "https://github.com/bvhari/ComfyUI_PerpWeight": [ + [ + "CLIPTextEncodePerpWeight" + ], + { + "title_aux": "ComfyUI_PerpWeight" + } + ], + "https://github.com/bvhari/ComfyUI_SUNoise": [ + [ + "SUNoiseLatent", + "SamplerDPM2Ancestral_SUN", + "SamplerDPMPP2SAncestral_SUN", + "SamplerDPMPP_2M_SDE_SUN", + "SamplerDPMPP_3M_SDE_SUN", + "SamplerDPMPP_SDE_SUN", + "SamplerEulerAncestralCFGpp_SUN", + "SamplerEulerAncestral_SUN", + "SamplersSUNoise", + "SamplersSUNoiseAdvanced" + ], + { + "title_aux": "ComfyUI_SUNoise" + } + ], + "https://github.com/catscandrive/comfyui-imagesubfolders/raw/main/loadImageWithSubfolders.py": [ + [ + "LoadImagewithSubfolders" + ], + { + "title_aux": "Image loader with subfolders" + } + ], + "https://github.com/cdb-boop/ComfyUI-Bringing-Old-Photos-Back-to-Life": [ + [ + "BOPBTL_BlendFaces", + "BOPBTL_DetectEnhanceBlendFaces", + "BOPBTL_DetectFaces", + "BOPBTL_EnhanceFaces", + "BOPBTL_EnhanceFacesAdvanced", + "BOPBTL_LoadFaceDetectorModel", + "BOPBTL_LoadFaceEnhancerModel", + "BOPBTL_LoadRestoreOldPhotosModel", + "BOPBTL_LoadScratchMaskModel", + "BOPBTL_RestoreOldPhotos", + "BOPBTL_ScratchMask" + ], + { + "title_aux": "ComfyUI Bringing Old Photos Back to Life" + } + ], + "https://github.com/cdb-boop/comfyui-image-round": [ + [ + "ComfyUI_Image_Round__ImageCropAdvanced", + "ComfyUI_Image_Round__ImageRound", + "ComfyUI_Image_Round__ImageRoundAdvanced" + ], + { + "title_aux": "comfyui-image-round" + } + ], + "https://github.com/celsojr2013/comfyui_jamworks_client": [ + [ + "Jamworks_Download", + "Jamworks_Login", + "Shell_Command" + ], + { + "title_aux": "comfyui_jamworks_client" + } + ], + "https://github.com/celsojr2013/comfyui_simpletools": [ + [ + "GoogleTranslator", + "Parameters", + "ResolutionSolver" + ], + { + "title_aux": "ComfyUI SimpleTools Suit" + } + ], + "https://github.com/cerspense/ComfyUI_cspnodes": [ + [ + "ImageDirIterator", + "Modelscopet2v", + "Modelscopev2v", + "RemapRange", + "SplitImageChannels", + "TextFileLineIterator", + "VidDirIterator" + ], + { + "title_aux": "cspnodes" + } + ], + "https://github.com/ceruleandeep/ComfyUI-LLaVA-Captioner": [ + [ + "LlavaCaptioner" + ], + { + "title_aux": "ComfyUI LLaVA Captioner" + } + ], + "https://github.com/chakib-belgaid/ComfyUI-autosize": [ + [ + "CustomAutoSize", + "SDXLAutoSize" + ], + { + "title_aux": "ComfyUI-autosize" + } + ], + "https://github.com/chakib-belgaid/Comfyui_Prompt_styler": [ + [ + "Prompt_Styler" + ], + { + "title_aux": "ComfyUI Style Plugin" + } + ], + "https://github.com/chandlergis/ComfyUI-IMG_Query": [ + [ + "ImageRequestNode" + ], + { + "title_aux": "ComfyUI-IMG_Query" + } + ], + "https://github.com/chandlergis/ComfyUI_EmojiOverlay": [ + [ + "Image Emoji Overlay" + ], + { + "title_aux": "ComfyUI_EmojiOverlay" + } + ], + "https://github.com/chaojie/ComfyUI-AniPortrait": [ + [ + "AniPortraitLoader", + "AniPortraitRun", + "Box2Video", + "CoverVideo", + "MaskList2Video" + ], + { + "title_aux": "ComfyUI-AniPortrait" + } + ], + "https://github.com/chaojie/ComfyUI-CameraCtrl-Wrapper": [ + [ + "CameraBasic", + "CameraCombine", + "CameraCtrlLoader", + "CameraCtrlRun", + "CameraJoin", + "CameraTrajectory" + ], + { + "title_aux": "ComfyUI-CameraCtrl-Wrapper" + } + ], + "https://github.com/chaojie/ComfyUI-Champ": [ + [ + "ChampLoader", + "ChampRun", + "ImageCombineOneColumn", + "ImageCombineOneRow" + ], + { + "title_aux": "ComfyUI-Champ" + } + ], + "https://github.com/chaojie/ComfyUI-DragAnything": [ + [ + "DragAnythingLoader", + "DragAnythingPipelineRun", + "DragAnythingPipelineRunRandom", + "DragAnythingRun", + "DragAnythingRunRandom", + "LoadText", + "SaveText", + "VHS_FILENAMES_STRING" + ], + { + "title_aux": "ComfyUI-DragAnything" + } + ], + "https://github.com/chaojie/ComfyUI-DragNUWA": [ + [ + "BrushMotion", + "CompositeMotionBrush", + "CompositeMotionBrushWithoutModel", + "DragNUWA Run", + "DragNUWA Run MotionBrush", + "Get First Image", + "Get Last Image", + "InstantCameraMotionBrush", + "InstantObjectMotionBrush", + "Load CheckPoint DragNUWA", + "Load MotionBrush From Optical Flow", + "Load MotionBrush From Optical Flow Directory", + "Load MotionBrush From Optical Flow Without Model", + "Load MotionBrush From Tracking Points", + "Load MotionBrush From Tracking Points Without Model", + "Load Pose KeyPoints", + "Loop", + "LoopEnd_IMAGE", + "LoopStart_IMAGE", + "Split Tracking Points" + ], + { + "title_aux": "ComfyUI-DragNUWA" + } + ], + "https://github.com/chaojie/ComfyUI-DynamiCrafter": [ + [ + "DynamiCrafter Simple", + "DynamiCrafterInterp Simple", + "DynamiCrafterInterpLoader", + "DynamiCrafterLoader" + ], + { + "title_aux": "ComfyUI-DynamiCrafter" + } + ], + "https://github.com/chaojie/ComfyUI-EasyAnimate": [ + [ + "EasyAnimateLoader", + "EasyAnimateRun" + ], + { + "title_aux": "ComfyUI-EasyAnimate" + } + ], + "https://github.com/chaojie/ComfyUI-Gemma": [ + [ + "GemmaLoader", + "GemmaRun" + ], + { + "title_aux": "ComfyUI-Gemma" + } + ], + "https://github.com/chaojie/ComfyUI-I2VGEN-XL": [ + [ + "I2VGEN-XL Simple", + "Modelscope Pipeline Loader" + ], + { + "title_aux": "ComfyUI-I2VGEN-XL" + } + ], + "https://github.com/chaojie/ComfyUI-Img2Img-Turbo": [ + [ + "Img2ImgTurboEdgeLoader", + "Img2ImgTurboEdgeRun", + "Img2ImgTurboSketchLoader", + "Img2ImgTurboSketchRun" + ], + { + "title_aux": "ComfyUI-Img2Img-Turbo" + } + ], + "https://github.com/chaojie/ComfyUI-LaVIT": [ + [ + "VHS_FILENAMES_STRING_LaVIT", + "VideoLaVITI2I", + "VideoLaVITI2V", + "VideoLaVITI2VLong", + "VideoLaVITLoader", + "VideoLaVITT2V", + "VideoLaVITT2VLong", + "VideoLaVITUnderstandingImage", + "VideoLaVITUnderstandingLoader", + "VideoLaVITUnderstandingVideo", + "VideoLaVITVideoDetokenizerLoader", + "VideoLaVITVideoReconstruction" + ], + { + "title_aux": "ComfyUI-LaVIT" + } + ], + "https://github.com/chaojie/ComfyUI-LightGlue": [ + [ + "LightGlue Loader", + "LightGlue Simple", + "LightGlue Simple Multi" + ], + { + "title_aux": "ComfyUI-LightGlue" + } + ], + "https://github.com/chaojie/ComfyUI-Moore-AnimateAnyone": [ + [ + "Moore-AnimateAnyone Denoising Unet", + "Moore-AnimateAnyone Image Encoder", + "Moore-AnimateAnyone Pipeline Loader", + "Moore-AnimateAnyone Pose Guider", + "Moore-AnimateAnyone Reference Unet", + "Moore-AnimateAnyone Simple", + "Moore-AnimateAnyone VAE" + ], + { + "title_aux": "ComfyUI-Moore-AnimateAnyone" + } + ], + "https://github.com/chaojie/ComfyUI-Motion-Vector-Extractor": [ + [ + "Motion Vector Extractor", + "VideoCombineThenPath" + ], + { + "title_aux": "ComfyUI-Motion-Vector-Extractor" + } + ], + "https://github.com/chaojie/ComfyUI-MotionCtrl": [ + [ + "Load Motion Camera Preset", + "Load Motion Traj Preset", + "Load Motionctrl Checkpoint", + "Motionctrl Cond", + "Motionctrl Sample", + "Motionctrl Sample Simple", + "Select Image Indices" + ], + { + "title_aux": "ComfyUI-MotionCtrl" + } + ], + "https://github.com/chaojie/ComfyUI-MotionCtrl-SVD": [ + [ + "Load Motionctrl-SVD Camera Preset", + "Load Motionctrl-SVD Checkpoint", + "Motionctrl-SVD Sample Simple" + ], + { + "title_aux": "ComfyUI-MotionCtrl-SVD" + } + ], + "https://github.com/chaojie/ComfyUI-MuseTalk": [ + [ + "MuseTalkCupAudio", + "MuseTalkRun", + "VHS_FILENAMES_STRING_MuseTalk" + ], + { + "title_aux": "ComfyUI-MuseTalk" + } + ], + "https://github.com/chaojie/ComfyUI-MuseV": [ + [ + "MuseVRun", + "MuseVRunVid2Vid", + "VHS_FILENAMES_STRING_MuseV" + ], + { + "author": "infguo", + "title_aux": "ComfyUI-MuseV" + } + ], + "https://github.com/chaojie/ComfyUI-Open-Sora": [ + [ + "OpenSoraLoader", + "OpenSoraRun", + "OpenSoraSampler" + ], + { + "title_aux": "ComfyUI-Open-Sora" + } + ], + "https://github.com/chaojie/ComfyUI-Open-Sora-Plan": [ + [ + "OpenSoraPlanDecode", + "OpenSoraPlanLoader", + "OpenSoraPlanRun", + "OpenSoraPlanSample" + ], + { + "title_aux": "ComfyUI-Open-Sora-Plan" + } + ], + "https://github.com/chaojie/ComfyUI-Panda3d": [ + [ + "Panda3dAmbientLight", + "Panda3dAttachNewNode", + "Panda3dBase", + "Panda3dDirectionalLight", + "Panda3dLoadDepthModel", + "Panda3dLoadModel", + "Panda3dLoadTexture", + "Panda3dModelMerge", + "Panda3dTest", + "Panda3dTextureMerge" + ], + { + "title_aux": "ComfyUI-Panda3d" + } + ], + "https://github.com/chaojie/ComfyUI-Pymunk": [ + [ + "PygameRun", + "PygameSurface", + "PymunkDynamicBox", + "PymunkDynamicCircle", + "PymunkRun", + "PymunkShapeMerge", + "PymunkSpace", + "PymunkStaticLine" + ], + { + "title_aux": "ComfyUI-Pymunk" + } + ], + "https://github.com/chaojie/ComfyUI-RAFT": [ + [ + "Load MotionBrush", + "RAFT Run", + "Save MotionBrush", + "VizMotionBrush" + ], + { + "title_aux": "ComfyUI-RAFT" + } + ], + "https://github.com/chaojie/ComfyUI-SimDA": [ + [ + "SimDALoader", + "SimDARun", + "SimDATrain", + "VHS_FILENAMES_STRING_SimDA" + ], + { + "title_aux": "ComfyUI-SimDA" + } + ], + "https://github.com/chaojie/ComfyUI-Trajectory": [ + [ + "Trajectory_Canvas_Tab" + ], + { + "author": "Lerc", + "description": "This extension provides a full page image editor with mask support. There are two nodes, one to receive images from the editor and one to send images to the editor.", + "nickname": "Canvas Tab", + "title": "Canvas Tab", + "title_aux": "ComfyUI-Trajectory" + } + ], + "https://github.com/chaojie/ComfyUI-Video-Editing-X-Attention": [ + [ + "StringList", + "VEXAGuidance", + "VEXALoader", + "VEXARun" + ], + { + "title_aux": "ComfyUI-Video-Editing-X-Attention" + } + ], + "https://github.com/chaojie/ComfyUI-dust3r": [ + [ + "CameraPoseVideo", + "Dust3rLoader", + "Dust3rRun" + ], + { + "title_aux": "ComfyUI-dust3r" + } + ], + "https://github.com/chaojie/ComfyUI_StreamingT2V": [ + [ + "LoadText_StreamingT2V", + "PromptTravelIndex", + "SaveText_StreamingT2V", + "StreamingT2VLoaderAnimateDiff", + "StreamingT2VLoaderAnimateDiffModel", + "StreamingT2VLoaderEnhanceModel", + "StreamingT2VLoaderModelscopeModel", + "StreamingT2VLoaderModelscopeT2V", + "StreamingT2VLoaderSVD", + "StreamingT2VLoaderSVDModel", + "StreamingT2VLoaderStreamModel", + "StreamingT2VLoaderVidXTendModel", + "StreamingT2VRunEnhanceStep", + "StreamingT2VRunI2V", + "StreamingT2VRunLongStep", + "StreamingT2VRunLongStepVidXTendPipeline", + "StreamingT2VRunLongStepVidXTendPipelineCustomRef", + "StreamingT2VRunLongStepVidXTendPipelineCustomRefOutExtendOnly", + "StreamingT2VRunLongStepVidXTendPipelinePromptTravel", + "StreamingT2VRunShortStepAnimateDiff", + "StreamingT2VRunShortStepModelscopeT2V", + "StreamingT2VRunShortStepSVD", + "StreamingT2VRunT2V", + "VHS_FILENAMES_STRING_StreamingT2V" + ], + { + "title_aux": "ComfyUI_StreamingT2V" + } + ], + "https://github.com/chaosaiart/Chaosaiart-Nodes": [ + [ + "chaosaiart_Any_Switch", + "chaosaiart_Any_Switch_Big_Number", + "chaosaiart_Any_Switch_small", + "chaosaiart_CheckpointLoader", + "chaosaiart_CheckpointPrompt", + "chaosaiart_CheckpointPrompt2", + "chaosaiart_CheckpointPrompt_Frame", + "chaosaiart_CheckpointPrompt_FrameMixer", + "chaosaiart_ControlNetApply", + "chaosaiart_ControlNetApply2", + "chaosaiart_ControlNetApply3", + "chaosaiart_Denoising_Switch", + "chaosaiart_EmptyLatentImage", + "chaosaiart_FramePromptCLIPEncode", + "chaosaiart_Frame_Switch", + "chaosaiart_KSampler1", + "chaosaiart_KSampler2", + "chaosaiart_KSampler3", + "chaosaiart_KSampler4", + "chaosaiart_KSampler5", + "chaosaiart_KSampler7", + "chaosaiart_KSampler_a1", + "chaosaiart_KSampler_a1a", + "chaosaiart_KSampler_a2", + "chaosaiart_KSampler_expert_0", + "chaosaiart_KSampler_expert_1", + "chaosaiart_Ksampler_attribut", + "chaosaiart_Load_Image_Batch", + "chaosaiart_Load_Image_Batch_2img", + "chaosaiart_MainPromptCLIPEncode", + "chaosaiart_Number", + "chaosaiart_Number2", + "chaosaiart_Number_Counter", + "chaosaiart_Number_Switch", + "chaosaiart_Prompt", + "chaosaiart_Prompt_Frame", + "chaosaiart_Prompt_mixer_byFrame", + "chaosaiart_SaveImage", + "chaosaiart_Show_Info", + "chaosaiart_Simple_Prompt", + "chaosaiart_Style_Node", + "chaosaiart_TextCLIPEncode", + "chaosaiart_TextCLIPEncode_lora", + "chaosaiart_adjust_color", + "chaosaiart_any_array2input_1Input", + "chaosaiart_any_array2input_all_big", + "chaosaiart_any_array2input_all_small", + "chaosaiart_any_input2array_big", + "chaosaiart_any_input2array_small", + "chaosaiart_controlnet_weidgth", + "chaosaiart_convert", + "chaosaiart_convert_Prompt", + "chaosaiart_forPreview", + "chaosaiart_image_loop", + "chaosaiart_img2gif", + "chaosaiart_img2video", + "chaosaiart_lora", + "chaosaiart_lora_advanced", + "chaosaiart_merge_Folders", + "chaosaiart_oneNode", + "chaosaiart_reloadAny_Load", + "chaosaiart_reloadAny_Save", + "chaosaiart_reloadIMG_Load", + "chaosaiart_reloadIMG_Save", + "chaosaiart_reloadLatent_Load", + "chaosaiart_reloadLatent_Save", + "chaosaiart_restarter", + "chaosaiart_restarter_advanced", + "chaosaiart_video2img1", + "chaosaiart_zoom_frame" + ], + { + "title_aux": "Chaosaiart-Nodes" + } + ], + "https://github.com/chesnokovivan/ComfyUI-Novakid": [ + [ + "Novakid Styler" + ], + { + "title_aux": "ComfyUI-Novakid" + } + ], + "https://github.com/chflame163/ComfyUI_FaceSimilarity": [ + [ + "Face Similarity" + ], + { + "title_aux": "ComfyUI Face Similarity" + } + ], + "https://github.com/chflame163/ComfyUI_LayerStyle": [ + [ + "LayerColor: AutoAdjust", + "LayerColor: AutoBrightness", + "LayerColor: Brightness & Contrast", + "LayerColor: Color of Shadow & Highlight", + "LayerColor: ColorAdapter", + "LayerColor: ColorBalance", + "LayerColor: ColorTemperature", + "LayerColor: Exposure", + "LayerColor: Gamma", + "LayerColor: HSV", + "LayerColor: LAB", + "LayerColor: LUT Apply", + "LayerColor: Levels", + "LayerColor: RGB", + "LayerColor: YUV", + "LayerFilter: AddGrain", + "LayerFilter: ChannelShake", + "LayerFilter: ColorMap", + "LayerFilter: Film", + "LayerFilter: FilmV2", + "LayerFilter: GaussianBlur", + "LayerFilter: HDREffects", + "LayerFilter: LightLeak", + "LayerFilter: MotionBlur", + "LayerFilter: Sharp & Soft", + "LayerFilter: SkinBeauty", + "LayerFilter: SoftLight", + "LayerFilter: WaterColor", + "LayerMask: BiRefNetUltra", + "LayerMask: BlendIf Mask", + "LayerMask: CreateGradientMask", + "LayerMask: ImageToMask", + "LayerMask: MaskBoxDetect", + "LayerMask: MaskByColor", + "LayerMask: MaskByDifferent", + "LayerMask: MaskEdgeShrink", + "LayerMask: MaskEdgeUltraDetail", + "LayerMask: MaskEdgeUltraDetail V2", + "LayerMask: MaskGradient", + "LayerMask: MaskGrain", + "LayerMask: MaskGrow", + "LayerMask: MaskInvert", + "LayerMask: MaskMotionBlur", + "LayerMask: MaskPreview", + "LayerMask: MaskStroke", + "LayerMask: MediapipeFacialSegment", + "LayerMask: PersonMaskUltra", + "LayerMask: PersonMaskUltra V2", + "LayerMask: PixelSpread", + "LayerMask: RemBgUltra", + "LayerMask: RmBgUltra V2", + "LayerMask: SegformerB2ClothesUltra", + "LayerMask: SegmentAnythingUltra", + "LayerMask: SegmentAnythingUltra V2", + "LayerMask: Shadow & Highlight Mask", + "LayerMask: YoloV8Detect", + "LayerStyle: ColorOverlay", + "LayerStyle: ColorOverlay V2", + "LayerStyle: DropShadow", + "LayerStyle: DropShadow V2", + "LayerStyle: GradientOverlay", + "LayerStyle: GradientOverlay V2", + "LayerStyle: InnerGlow", + "LayerStyle: InnerGlow V2", + "LayerStyle: InnerShadow", + "LayerStyle: InnerShadow V2", + "LayerStyle: OuterGlow", + "LayerStyle: OuterGlow V2", + "LayerStyle: Stroke", + "LayerStyle: Stroke V2", + "LayerUtility: AddBlindWaterMark", + "LayerUtility: BatchSelector", + "LayerUtility: Boolean", + "LayerUtility: BooleanOperator", + "LayerUtility: BooleanOperatorV2", + "LayerUtility: CheckMask", + "LayerUtility: ColorImage", + "LayerUtility: ColorImage V2", + "LayerUtility: ColorPicker", + "LayerUtility: CreateQRCode", + "LayerUtility: CropBoxResolve", + "LayerUtility: CropByMask", + "LayerUtility: CropByMask V2", + "LayerUtility: DecodeQRCode", + "LayerUtility: ExtendCanvas", + "LayerUtility: ExtendCanvasV2", + "LayerUtility: Float", + "LayerUtility: GetColorTone", + "LayerUtility: GetColorToneV2", + "LayerUtility: GetImageSize", + "LayerUtility: GradientImage", + "LayerUtility: GradientImage V2", + "LayerUtility: HLFrequencyDetailRestore", + "LayerUtility: HSV Value", + "LayerUtility: If", + "LayerUtility: ImageAutoCrop", + "LayerUtility: ImageAutoCrop V2", + "LayerUtility: ImageBlend", + "LayerUtility: ImageBlend V2", + "LayerUtility: ImageBlendAdvance", + "LayerUtility: ImageBlendAdvance V2", + "LayerUtility: ImageChannelMerge", + "LayerUtility: ImageChannelSplit", + "LayerUtility: ImageCombineAlpha", + "LayerUtility: ImageHub", + "LayerUtility: ImageMaskScaleAs", + "LayerUtility: ImageOpacity", + "LayerUtility: ImageRemoveAlpha", + "LayerUtility: ImageRewardFilter", + "LayerUtility: ImageScaleByAspectRatio", + "LayerUtility: ImageScaleByAspectRatio V2", + "LayerUtility: ImageScaleRestore", + "LayerUtility: ImageScaleRestore V2", + "LayerUtility: ImageShift", + "LayerUtility: Integer", + "LayerUtility: LaMa", + "LayerUtility: LayerImageTransform", + "LayerUtility: LayerMaskTransform", + "LayerUtility: LoadPSD", + "LayerUtility: NumberCalculator", + "LayerUtility: NumberCalculatorV2", + "LayerUtility: PrintInfo", + "LayerUtility: PromptEmbellish", + "LayerUtility: PromptTagger", + "LayerUtility: PurgeVRAM", + "LayerUtility: QWenImage2Prompt", + "LayerUtility: QueueStop", + "LayerUtility: RGB Value", + "LayerUtility: RestoreCropBox", + "LayerUtility: SD3NegativeConditioning", + "LayerUtility: SaveImagePlus", + "LayerUtility: Seed", + "LayerUtility: ShowBlindWaterMark", + "LayerUtility: SimpleTextImage", + "LayerUtility: String", + "LayerUtility: StringCondition", + "LayerUtility: SwitchCase", + "LayerUtility: TextBox", + "LayerUtility: TextImage", + "LayerUtility: TextJoin", + "LayerUtility: XY to Percent" + ], + { + "author": "chflame", + "description": "A set of nodes for ComfyUI that can composite layer and mask to achieve Photoshop like functionality.", + "nickname": "LayerStyle", + "title": "LayerStyle", + "title_aux": "ComfyUI Layer Style" + } + ], + "https://github.com/chflame163/ComfyUI_MSSpeech_TTS": [ + [ + "Input Trigger", + "MicrosoftSpeech_TTS", + "Play Sound", + "Play Sound (loop)" + ], + { + "title_aux": "ComfyUI_MSSpeech_TTS" + } + ], + "https://github.com/chflame163/ComfyUI_WordCloud": [ + [ + "ComfyWordCloud", + "LoadTextFile", + "RGB_Picker" + ], + { + "title_aux": "ComfyUI_WordCloud" + } + ], + "https://github.com/chibiace/ComfyUI-Chibi-Nodes": [ + [ + "ConditionText", + "ConditionTextMulti", + "ImageAddText", + "ImageSimpleResize", + "ImageSizeInfo", + "ImageTool", + "Int2String", + "LoadEmbedding", + "LoadImageExtended", + "Loader", + "Prompts", + "RandomResolutionLatent", + "SaveImages", + "SeedGenerator", + "SimpleSampler", + "TextSplit", + "Textbox", + "Wildcards" + ], + { + "title_aux": "ComfyUI-Chibi-Nodes" + } + ], + "https://github.com/choey/Comfy-Topaz": [ + [ + "TopazPhotoAI", + "TopazSharpenSettings", + "TopazUpscaleSettings" + ], + { + "title_aux": "Comfy-Topaz" + } + ], + "https://github.com/chris-the-wiz/EmbeddingsCurveEditor_ComfyUI": [ + [ + "Embeddings Curve Editor" + ], + { + "title_aux": "EmbeddingsCurveEditor_ComfyUI" + } + ], + "https://github.com/chrisfreilich/virtuoso-nodes": [ + [ + "BlackAndWhite", + "BlendIf", + "BlendModes", + "ColorBalance", + "ColorBalanceAdvanced", + "GaussianBlur", + "GaussianBlurDepth", + "HueSat", + "HueSatAdvanced", + "LensBlur", + "LensBlurDepth", + "Levels", + "MergeRGB", + "MotionBlur", + "MotionBlurDepth", + "SelectiveColor", + "SolidColor", + "SolidColorHSV", + "SolidColorRGB", + "SplitRGB" + ], + { + "author": "Chris Freilich", + "description": "This extension provides a \"Blend If (BlendIf)\" node.", + "nickname": "Virtuoso Pack - Blend If", + "title": "Virtuoso Pack - Blend If", + "title_aux": "Virtuoso Nodes for ComfyUI" + } + ], + "https://github.com/chrisgoringe/cg-image-picker": [ + [ + "Preview Chooser", + "Preview Chooser Fabric" + ], + { + "author": "chrisgoringe", + "description": "Custom nodes that preview images and pause the workflow to allow the user to select one or more to progress", + "nickname": "Image Chooser", + "title": "Image Chooser", + "title_aux": "Image chooser" + } + ], + "https://github.com/chrisgoringe/cg-noise": [ + [ + "Hijack", + "KSampler Advanced with Variations", + "KSampler with Variations", + "UnHijack" + ], + { + "title_aux": "Variation seeds" + } + ], + "https://github.com/chrisgoringe/cg-use-everywhere": [ + [ + "Seed Everywhere" + ], + { + "nodename_pattern": "(^(Prompts|Anything) Everywhere|Simple String)", + "title_aux": "Use Everywhere (UE Nodes)" + } + ], + "https://github.com/christian-byrne/audio-separation-nodes-comfyui": [ + [ + "AudioCombine", + "AudioCrop", + "AudioSeparation", + "AudioTempoMatch", + "AudioVideoCombine" + ], + { + "title_aux": "audio-separation-nodes-comfyui" + } + ], + "https://github.com/christian-byrne/img2colors-comfyui-node": [ + [ + "bmy_Img2ColorNode" + ], + { + "author": "christian-byrne", + "description": "", + "nickname": "img2color", + "title": "Img2Color Node - Detect and describe color palettes in images", + "title_aux": "img2colors-comfyui-node" + } + ], + "https://github.com/christian-byrne/size-match-compositing-nodes": [ + [ + "Composite Alpha Layer", + "Size Match Images/Masks" + ], + { + "title_aux": "Node - Size Matcher" + } + ], + "https://github.com/city96/ComfyUI_ColorMod": [ + [ + "CV2Tonemap", + "CV2TonemapDrago", + "CV2TonemapDurand", + "CV2TonemapMantiuk", + "CV2TonemapReinhard", + "ColorModCompress", + "ColorModEdges", + "ColorModMove", + "ColorModPivot", + "HDRCreate", + "HDRExposureFusion", + "LoadImageHDR", + "LoadImageHighPrec", + "PreviewImageHighPrec", + "SaveImageHDR", + "SaveImageHighPrec" + ], + { + "title_aux": "ComfyUI_ColorMod" + } + ], + "https://github.com/city96/ComfyUI_DiT": [ + [ + "DiTCheckpointLoader", + "DiTCheckpointLoaderSimple", + "DiTLabelCombine", + "DiTLabelSelect", + "DiTSampler" + ], + { + "title_aux": "ComfyUI_DiT [WIP]" + } + ], + "https://github.com/city96/ComfyUI_ExtraModels": [ + [ + "DiTCondLabelEmpty", + "DiTCondLabelSelect", + "DitCheckpointLoader", + "ExtraVAELoader", + "HYDiTCheckpointLoader", + "HYDiTSrcSizeCond", + "HYDiTTextEncode", + "HYDiTTextEncodeSimple", + "HYDiTTextEncoderLoader", + "MiaoBiCLIPLoader", + "MiaoBiDiffusersLoader", + "PixArtCheckpointLoader", + "PixArtCheckpointLoaderSimple", + "PixArtControlNetCond", + "PixArtLoraLoader", + "PixArtResolutionCond", + "PixArtResolutionSelect", + "PixArtT5FromSD3CLIP", + "PixArtT5TextEncode", + "T5TextEncode", + "T5v11Loader" + ], + { + "title_aux": "Extra Models for ComfyUI" + } + ], + "https://github.com/city96/ComfyUI_NetDist": [ + [ + "CombineImageBatch", + "FetchRemote", + "LoadCurrentWorkflowJSON", + "LoadDiskWorkflowJSON", + "LoadImageUrl", + "LoadLatentNumpy", + "LoadLatentUrl", + "RemoteChainEnd", + "RemoteChainStart", + "RemoteQueueSimple", + "RemoteQueueWorker", + "SaveDiskWorkflowJSON", + "SaveImageUrl", + "SaveLatentNumpy" + ], + { + "title_aux": "ComfyUI_NetDist" + } + ], + "https://github.com/city96/SD-Advanced-Noise": [ + [ + "LatentGaussianNoise", + "MathEncode" + ], + { + "title_aux": "SD-Advanced-Noise" + } + ], + "https://github.com/city96/SD-Latent-Interposer": [ + [ + "LatentInterposer" + ], + { + "title_aux": "Latent-Interposer" + } + ], + "https://github.com/city96/SD-Latent-Upscaler": [ + [ + "LatentUpscaler" + ], + { + "title_aux": "SD-Latent-Upscaler" + } + ], + "https://github.com/civitai/comfy-nodes": [ + [ + "CivitAI_Checkpoint_Loader", + "CivitAI_Lora_Loader" + ], + { + "title_aux": "comfy-nodes" + } + ], + "https://github.com/claussteinmassl/ComfyUI-CS-CustomNodes": [ + [ + "CS Transform" + ], + { + "title_aux": "CS Transform Node for ComfyUI" + } + ], + "https://github.com/comfyanonymous/ComfyUI": [ + [ + "AddNoise", + "AlignYourStepsScheduler", + "BasicGuider", + "BasicScheduler", + "CFGGuider", + "CLIPAttentionMultiply", + "CLIPLoader", + "CLIPMergeAdd", + "CLIPMergeSimple", + "CLIPMergeSubtract", + "CLIPSave", + "CLIPSetLastLayer", + "CLIPTextEncode", + "CLIPTextEncodeControlnet", + "CLIPTextEncodeSD3", + "CLIPTextEncodeSDXL", + "CLIPTextEncodeSDXLRefiner", + "CLIPVisionEncode", + "CLIPVisionLoader", + "Canny", + "CheckpointLoader", + "CheckpointLoaderSimple", + "CheckpointSave", + "ConditioningAverage", + "ConditioningCombine", + "ConditioningConcat", + "ConditioningSetArea", + "ConditioningSetAreaPercentage", + "ConditioningSetAreaStrength", + "ConditioningSetMask", + "ConditioningSetTimestepRange", + "ConditioningZeroOut", + "ControlNetApply", + "ControlNetApplyAdvanced", + "ControlNetApplySD3", + "ControlNetLoader", + "CropMask", + "DiffControlNetLoader", + "DifferentialDiffusion", + "DiffusersLoader", + "DisableNoise", + "DualCFGGuider", + "DualCLIPLoader", + "EmptyImage", + "EmptyLatentAudio", + "EmptyLatentImage", + "EmptySD3LatentImage", + "ExponentialScheduler", + "FeatherMask", + "FlipSigmas", + "FreeU", + "FreeU_V2", + "GITSScheduler", + "GLIGENLoader", + "GLIGENTextBoxApply", + "GrowMask", + "HyperTile", + "HypernetworkLoader", + "ImageBatch", + "ImageBlend", + "ImageBlur", + "ImageColorToMask", + "ImageCompositeMasked", + "ImageCrop", + "ImageFromBatch", + "ImageInvert", + "ImageOnlyCheckpointLoader", + "ImageOnlyCheckpointSave", + "ImagePadForOutpaint", + "ImageQuantize", + "ImageScale", + "ImageScaleBy", + "ImageScaleToTotalPixels", + "ImageSharpen", + "ImageToMask", + "ImageUpscaleWithModel", + "InpaintModelConditioning", + "InstructPixToPixConditioning", + "InvertMask", + "JoinImageWithAlpha", + "KSampler", + "KSamplerAdvanced", + "KSamplerSelect", + "KarrasScheduler", + "LatentAdd", + "LatentBatch", + "LatentBatchSeedBehavior", + "LatentBlend", + "LatentComposite", + "LatentCompositeMasked", + "LatentCrop", + "LatentFlip", + "LatentFromBatch", + "LatentInterpolate", + "LatentMultiply", + "LatentRotate", + "LatentSubtract", + "LatentUpscale", + "LatentUpscaleBy", + "LoadAudio", + "LoadImage", + "LoadImageMask", + "LoadLatent", + "LoraLoader", + "LoraLoaderModelOnly", + "MaskComposite", + "MaskToImage", + "ModelMergeAdd", + "ModelMergeBlocks", + "ModelMergeSD1", + "ModelMergeSD2", + "ModelMergeSD3_2B", + "ModelMergeSDXL", + "ModelMergeSimple", + "ModelMergeSubtract", + "ModelSamplingContinuousEDM", + "ModelSamplingContinuousV", + "ModelSamplingDiscrete", + "ModelSamplingSD3", + "ModelSamplingStableCascade", + "Morphology", + "PatchModelAddDownscale", + "PerpNeg", + "PerpNegGuider", + "PerturbedAttentionGuidance", + "PhotoMakerEncode", + "PhotoMakerLoader", + "PolyexponentialScheduler", + "PorterDuffImageComposite", + "PreviewAudio", + "PreviewImage", + "RandomNoise", + "RebatchImages", + "RebatchLatents", + "RepeatImageBatch", + "RepeatLatentBatch", + "RescaleCFG", + "SDTurboScheduler", + "SD_4XUpscale_Conditioning", + "SV3D_Conditioning", + "SVD_img2vid_Conditioning", + "SamplerCustom", + "SamplerCustomAdvanced", + "SamplerDPMAdaptative", + "SamplerDPMPP_2M_SDE", + "SamplerDPMPP_3M_SDE", + "SamplerDPMPP_SDE", + "SamplerEulerAncestral", + "SamplerEulerAncestralCFGPP", + "SamplerEulerCFGpp", + "SamplerLCMUpscale", + "SamplerLMS", + "SaveAnimatedPNG", + "SaveAnimatedWEBP", + "SaveAudio", + "SaveImage", + "SaveImageWebsocket", + "SaveLatent", + "SelfAttentionGuidance", + "SetLatentNoiseMask", + "SolidMask", + "SplitImageWithAlpha", + "SplitSigmas", + "SplitSigmasDenoise", + "StableCascade_EmptyLatentImage", + "StableCascade_StageB_Conditioning", + "StableCascade_StageC_VAEEncode", + "StableCascade_SuperResolutionControlnet", + "StableZero123_Conditioning", + "StableZero123_Conditioning_Batched", + "StyleModelApply", + "StyleModelLoader", + "ThresholdMask", + "TomePatchModel", + "TripleCLIPLoader", + "UNETLoader", + "UNetCrossAttentionMultiply", + "UNetSelfAttentionMultiply", + "UNetTemporalAttentionMultiply", + "UpscaleModelLoader", + "VAEDecode", + "VAEDecodeAudio", + "VAEDecodeTiled", + "VAEEncode", + "VAEEncodeAudio", + "VAEEncodeForInpaint", + "VAEEncodeTiled", + "VAELoader", + "VAESave", + "VPScheduler", + "VideoLinearCFGGuidance", + "VideoTriangleCFGGuidance", + "WebcamCapture", + "unCLIPCheckpointLoader", + "unCLIPConditioning" + ], + { + "title_aux": "ComfyUI" + } + ], + "https://github.com/comfyanonymous/ComfyUI_TensorRT": [ + [ + "DYNAMIC_TRT_MODEL_CONVERSION", + "STATIC_TRT_MODEL_CONVERSION", + "TensorRTLoader" + ], + { + "title_aux": "TensorRT Node for ComfyUI" + } + ], + "https://github.com/comfyanonymous/ComfyUI_experiments": [ + [ + "ModelMergeBlockNumber", + "ModelMergeSDXL", + "ModelMergeSDXLDetailedTransformers", + "ModelMergeSDXLTransformers", + "ModelSamplerTonemapNoiseTest", + "ReferenceOnlySimple", + "RescaleClassifierFreeGuidanceTest", + "TonemapNoiseWithRescaleCFG" + ], + { + "title_aux": "ComfyUI_experiments" + } + ], + "https://github.com/concarne000/ConCarneNode": [ + [ + "BingImageGrabber", + "Hermes", + "Zephyr" + ], + { + "title_aux": "ConCarneNode" + } + ], + "https://github.com/conquestace/ComfyUI-ImageUploader": [ + [ + "ImageUploader" + ], + { + "author": "ConquestAce", + "description": "Upload to temporary websites with API.", + "nickname": "Image Uploader", + "title": "Image Uploader", + "title_aux": "Image Uploader" + } + ], + "https://github.com/coreyryanhanson/ComfyQR": [ + [ + "comfy-qr-by-image-size", + "comfy-qr-by-module-size", + "comfy-qr-by-module-split", + "comfy-qr-mask_errors" + ], + { + "title_aux": "ComfyQR" + } + ], + "https://github.com/coreyryanhanson/ComfyQR-scanning-nodes": [ + [ + "comfy-qr-read", + "comfy-qr-validate" + ], + { + "title_aux": "ComfyQR-scanning-nodes" + } + ], + "https://github.com/cozymantis/cozy-utils-comfyui-nodes": [ + [ + "Cozy Sampler Options" + ], + { + "title_aux": "Cozy Utils" + } + ], + "https://github.com/cozymantis/human-parser-comfyui-node": [ + [ + "Cozy Human Parser ATR", + "Cozy Human Parser LIP", + "Cozy Human Parser Pascal" + ], + { + "title_aux": "Cozy Human Parser" + } + ], + "https://github.com/cozymantis/pose-generator-comfyui-node": [ + [ + "Cozy Pose Body Reference", + "Cozy Pose Face Reference" + ], + { + "title_aux": "Cozy Reference Pose Generator" + } + ], + "https://github.com/crystian/ComfyUI-Crystools": [ + [], + { + "author": "Crystian", + "description": "Plugins for multiples uses, mainly for debugging, you need them! IG: https://www.instagram.com/crystian.ia", + "nickname": "Crystools", + "nodename_pattern": " \\[Crystools\\]$", + "title": "Crystools", + "title_aux": "Crystools" + } + ], + "https://github.com/cubiq/ComfyUI_FaceAnalysis": [ + [ + "FaceAlign", + "FaceAnalysisModels", + "FaceBoundingBox", + "FaceEmbedDistance", + "FaceSegmentation", + "FaceWarp" + ], + { + "title_aux": "Face Analysis for ComfyUI" + } + ], + "https://github.com/cubiq/ComfyUI_IPAdapter_plus": [ + [ + "IPAAdapterFaceIDBatch", + "IPAdapter", + "IPAdapterAdvanced", + "IPAdapterBatch", + "IPAdapterCombineEmbeds", + "IPAdapterCombineParams", + "IPAdapterCombineWeights", + "IPAdapterEmbeds", + "IPAdapterEmbedsBatch", + "IPAdapterEncoder", + "IPAdapterFaceID", + "IPAdapterFromParams", + "IPAdapterInsightFaceLoader", + "IPAdapterLoadEmbeds", + "IPAdapterMS", + "IPAdapterModelLoader", + "IPAdapterNoise", + "IPAdapterPreciseStyleTransfer", + "IPAdapterPreciseStyleTransferBatch", + "IPAdapterPromptScheduleFromWeightsStrategy", + "IPAdapterRegionalConditioning", + "IPAdapterSaveEmbeds", + "IPAdapterStyleComposition", + "IPAdapterStyleCompositionBatch", + "IPAdapterTiled", + "IPAdapterTiledBatch", + "IPAdapterUnifiedLoader", + "IPAdapterUnifiedLoaderCommunity", + "IPAdapterUnifiedLoaderFaceID", + "IPAdapterWeights", + "IPAdapterWeightsFromStrategy", + "PrepImageForClipVision" + ], + { + "title_aux": "ComfyUI_IPAdapter_plus" + } + ], + "https://github.com/cubiq/ComfyUI_InstantID": [ + [ + "ApplyInstantID", + "ApplyInstantIDAdvanced", + "ApplyInstantIDControlNet", + "FaceKeypointsPreprocessor", + "InstantIDAttentionPatch", + "InstantIDFaceAnalysis", + "InstantIDModelLoader" + ], + { + "title_aux": "ComfyUI InstantID (Native Support)" + } + ], + "https://github.com/cubiq/ComfyUI_SimpleMath": [ + [ + "SimpleMath", + "SimpleMathDebug" + ], + { + "title_aux": "Simple Math" + } + ], + "https://github.com/cubiq/ComfyUI_essentials": [ + [ + "ApplyCLIPSeg+", + "BatchCount+", + "CLIPTextEncodeSDXL+", + "ConditioningCombineMultiple+", + "ConsoleDebug+", + "DebugTensorShape+", + "DrawText+", + "ExtractKeyframes+", + "GetImageSize+", + "ImageApplyLUT+", + "ImageBatchMultiple+", + "ImageCASharpening+", + "ImageColorMatch+", + "ImageCompositeFromMaskBatch+", + "ImageCrop+", + "ImageDesaturate+", + "ImageEnhanceDifference+", + "ImageExpandBatch+", + "ImageFlip+", + "ImageFromBatch+", + "ImageHistogramMatch+", + "ImageListToBatch+", + "ImagePosterize+", + "ImagePreviewFromLatent+", + "ImageRandomTransform+", + "ImageRemoveAlpha+", + "ImageRemoveBackground+", + "ImageResize+", + "ImageSeamCarving+", + "ImageTile+", + "ImageToDevice+", + "ImageUntile+", + "KSamplerVariationsStochastic+", + "KSamplerVariationsWithNoise+", + "LoadCLIPSegModels+", + "MaskBatch+", + "MaskBlur+", + "MaskBoundingBox+", + "MaskExpandBatch+", + "MaskFix+", + "MaskFlip+", + "MaskFromBatch+", + "MaskFromColor+", + "MaskFromList+", + "MaskFromRGBCMYBW+", + "MaskFromSegmentation+", + "MaskPreview+", + "MaskSmooth+", + "ModelCompile+", + "NoiseFromImage+", + "PixelOEPixelize+", + "RemBGSession+", + "RemoveLatentMask+", + "SD3NegativeConditioning+", + "SDXLEmptyLatentSizePicker+", + "SimpleMath+", + "TransitionMask+" + ], + { + "title_aux": "ComfyUI Essentials" + } + ], + "https://github.com/cubiq/PuLID_ComfyUI": [ + [ + "ApplyPulid", + "ApplyPulidAdvanced", + "PulidEvaClipLoader", + "PulidInsightFaceLoader", + "PulidModelLoader" + ], + { + "title_aux": "PuLID_ComfyUI" + } + ], + "https://github.com/cuongloveit/comfy_http_request": [ + [ + "Send Http Request", + "Send Http request" + ], + { + "title_aux": "comfy_http_request" + } + ], + "https://github.com/curiousjp/ComfyUI-MaskBatchPermutations": [ + [ + "CombinatorialDetailer", + "FlattenAgainstOriginal", + "PermuteMaskBatch" + ], + { + "title_aux": "ComfyUI-MaskBatchPermutations" + } + ], + "https://github.com/czcz1024/Comfyui-FaceCompare": [ + [ + "FaceCompare" + ], + { + "author": "czcz1024", + "description": "Face Compare", + "nickname": "Face Compare", + "title": "Face Compare", + "title_aux": "Face Compare" + } + ], + "https://github.com/da2el-ai/ComfyUI-d2-size-selector": [ + [ + "D2_SizeSelector" + ], + { + "author": "da2el", + "description": "Easy select image size", + "title": "D2 Size Selector", + "title_aux": "D2 Size Selector" + } + ], + "https://github.com/da2el-ai/ComfyUI-d2-steps": [ + [ + "D2 Refiner Steps", + "D2 Refiner Steps A1111", + "D2 Refiner Steps Tester" + ], + { + "author": "da2el", + "description": "Calculate the steps for the refiner", + "title": "D2 Steps", + "title_aux": "D2 Steps" + } + ], + "https://github.com/dagthomas/comfyui_dagthomas": [ + [ + "PGSD3LatentGenerator", + "PromptGenerator" + ], + { + "title_aux": "SDXL Auto Prompter" + } + ], + "https://github.com/daniabib/ComfyUI_ProPainter_Nodes": [ + [ + "ProPainterInpaint", + "ProPainterOutpaint" + ], + { + "title_aux": "ComfyUI ProPainter Nodes" + } + ], + "https://github.com/daniel-lewis-ab/ComfyUI-Llama": [ + [ + "Call LLM Advanced", + "Call LLM Basic", + "LLM_Create_Completion Advanced", + "LLM_Detokenize", + "LLM_Embed", + "LLM_Eval", + "LLM_Load_State", + "LLM_Reset", + "LLM_Sample", + "LLM_Save_State", + "LLM_Token_BOS", + "LLM_Token_EOS", + "LLM_Tokenize", + "Load LLM Model Advanced", + "Load LLM Model Basic" + ], + { + "title_aux": "ComfyUI-Llama" + } + ], + "https://github.com/daniel-lewis-ab/ComfyUI-TTS": [ + [ + "Load_Piper_Model", + "Piper_Speak_Text" + ], + { + "title_aux": "ComfyUI-TTS" + } + ], + "https://github.com/darkpixel/darkprompts": [ + [ + "DarkCheckpointRandomizer", + "DarkCheckpointSwitcher", + "DarkCombine", + "DarkFaceIndexGenerator", + "DarkFaceIndexShuffle", + "DarkFolders", + "DarkLoRALoader", + "DarkPrompt" + ], + { + "title_aux": "DarkPrompts" + } + ], + "https://github.com/dave-palt/comfyui_DSP_imagehelpers": [ + [ + "dsp-imagehelpers-concat" + ], + { + "title_aux": "comfyui_DSP_imagehelpers" + } + ], + "https://github.com/dawangraoming/ComfyUI_ksampler_gpu/raw/main/ksampler_gpu.py": [ + [ + "KSamplerAdvancedGPU", + "KSamplerGPU" + ], + { + "title_aux": "KSampler GPU" + } + ], + "https://github.com/daxcay/ComfyUI-DataSet": [ + [ + "DataSet_ConceptManager", + "DataSet_CopyFiles", + "DataSet_FindAndReplace", + "DataSet_LoadImage", + "DataSet_OpenAIChat", + "DataSet_OpenAIChatImage", + "DataSet_OpenAIChatImageBatch", + "DataSet_PathSelector", + "DataSet_SaveImage", + "DataSet_TextFilesLoad", + "DataSet_TextFilesLoadFromList", + "DataSet_TextFilesSave", + "DataSet_TriggerWords", + "DataSet_Visualizer" + ], + { + "author": "Daxton Caylor", + "description": "Data Research, Preparation, and Manipulation Nodes for Model Trainers, Artists, Designers, and Animators.", + "nickname": "ComfyUI-DataSet", + "title": "ComfyUI-DataSet", + "title_aux": "ComfyUI-DataSet" + } + ], + "https://github.com/daxcay/ComfyUI-JDCN": [ + [ + "JDCN_AnyCheckpointLoader", + "JDCN_AnyFileList", + "JDCN_AnyFileListHelper", + "JDCN_AnyFileListRandom", + "JDCN_AnyFileSelector", + "JDCN_BatchCounter", + "JDCN_BatchCounterAdvance", + "JDCN_BatchImageLoadFromDir", + "JDCN_BatchImageLoadFromList", + "JDCN_BatchLatentLoadFromDir", + "JDCN_BatchLatentLoadFromList", + "JDCN_BatchSaveLatent", + "JDCN_BoolInt", + "JDCN_EnableDisable", + "JDCN_FileMover", + "JDCN_ImageSaver", + "JDCN_ListToString", + "JDCN_ReBatch", + "JDCN_SeamlessExperience", + "JDCN_ShowAny", + "JDCN_SplitString", + "JDCN_StringManipulator", + "JDCN_StringToList", + "JDCN_SwapInputs", + "JDCN_TXTFileSaver", + "JDCN_VHSFileMover" + ], + { + "author": "Daxton Caylor & Jerry Davos", + "description": "Custom Utility Nodes for Artists, Designers and Animators.", + "nickname": "ComfyUI-JDCN", + "title": "ComfyUI-JDCN", + "title_aux": "ComfyUI-JDCN" + } + ], + "https://github.com/daxthin/DZ-FaceDetailer": [ + [ + "DZ_Face_Detailer" + ], + { + "title_aux": "DZ-FaceDetailer" + } + ], + "https://github.com/dchatel/comfyui_facetools": [ + [ + "BiSeNetMask", + "CropFaces", + "DetectFaces", + "GenderFaceFilter", + "JonathandinuMask", + "MergeWarps", + "OrderedFaceFilter", + "WarpFacesBack" + ], + { + "title_aux": "comfyui_facetools" + } + ], + "https://github.com/denfrost/Den_ComfyUI_Workflow": [ + [ + "Den_BatchIndex_AS", + "Den_CropImage_AS", + "Den_Eval_AS", + "Den_FaceRestoreCFWithModel", + "Den_GPTLoaderSimple_llama", + "Den_GPTSampler_llama", + "Den_ImageMixMasked_As", + "Den_ImageToLatentSpace", + "Den_ImageToMask_AS", + "Den_Int2Any_AS", + "Den_LatentAdd_AS", + "Den_LatentMixMasked_As", + "Den_LatentMix_AS", + "Den_LatentToImages_AS", + "Den_LoadLatent_AS", + "Den_MapRange_AS", + "Den_MaskToImage_AS", + "Den_Math_AS", + "Den_NoiseImage_AS", + "Den_Number2Float_AS", + "Den_Number2Int_AS", + "Den_Number_AS", + "Den_SVD_img2vid", + "Den_SaveLatent_AS", + "Den_TextToImage_AS", + "Den_TextWildcardList_AS", + "Increment_AS" + ], + { + "title_aux": "Den_ComfyUI_Workflows" + } + ], + "https://github.com/deroberon/StableZero123-comfyui": [ + [ + "SDZero ImageSplit", + "Stablezero123", + "Stablezero123WithDepth" + ], + { + "title_aux": "StableZero123-comfyui" + } + ], + "https://github.com/deroberon/demofusion-comfyui": [ + [ + "Batch Unsampler", + "Demofusion", + "Demofusion From Single File", + "Iterative Mixing KSampler" + ], + { + "title_aux": "demofusion-comfyui" + } + ], + "https://github.com/dfl/comfyui-clip-with-break": [ + [ + "AdvancedCLIPTextEncodeWithBreak", + "CLIPTextEncodeWithBreak" + ], + { + "author": "dfl", + "description": "CLIP text encoder that does BREAK prompting like A1111", + "nickname": "CLIP with BREAK", + "title": "CLIP with BREAK syntax", + "title_aux": "CLIP with BREAK syntax" + } + ], + "https://github.com/dfl/comfyui-tcd-scheduler": [ + [ + "SamplerTCD", + "SamplerTCD EulerA", + "TCDScheduler" + ], + { + "title_aux": "ComfyUI-TCD-scheduler" + } + ], + "https://github.com/diStyApps/ComfyUI_FrameMaker": [ + [ + "FrameMaker", + "FrameMakerBatch" + ], + { + "title_aux": "ComfyUI Frame Maker" + } + ], + "https://github.com/dicksondickson/ComfyUI-Dickson-Nodes": [ + [ + "DicksonColorMatch", + "TTPlanet_Tile_Preprocessor_GF", + "TTPlanet_Tile_Preprocessor_Simple", + "TTPlanet_Tile_Preprocessor_cufoff" + ], + { + "description": "This is a set of custom nodes that I've either written myself or adapted from other authors for my own convenience. Currently includes color matching node forked from StableSR and TTPlanet's controlnet preprocessor. https://github.com/dicksondickson", + "nickname": "Dickson Nodes", + "title": "Dickson Nodes", + "title_aux": "ComfyUI-Dickson-Nodes" + } + ], + "https://github.com/digitaljohn/comfyui-propost": [ + [ + "ProPostApplyLUT", + "ProPostDepthMapBlur", + "ProPostFilmGrain", + "ProPostRadialBlur", + "ProPostVignette" + ], + { + "title_aux": "ComfyUI-ProPost" + } + ], + "https://github.com/dimtoneff/ComfyUI-PixelArt-Detector": [ + [ + "PixelArtAddDitherPattern", + "PixelArtDetectorConverter", + "PixelArtDetectorSave", + "PixelArtDetectorToImage", + "PixelArtLoadPalettes" + ], + { + "title_aux": "ComfyUI PixelArt Detector" + } + ], + "https://github.com/diontimmer/ComfyUI-Vextra-Nodes": [ + [ + "Add Text To Image", + "Apply Instagram Filter", + "Create Solid Color", + "Flatten Colors", + "Generate Noise Image", + "GlitchThis Effect", + "Hue Rotation", + "Load Picture Index", + "Pixel Sort", + "Play Sound At Execution", + "Prettify Prompt Using distilgpt2", + "Swap Color Mode" + ], + { + "title_aux": "ComfyUI-Vextra-Nodes" + } + ], + "https://github.com/discopixel-studio/comfyui-discopixel": [ + [ + "TransformTemplateOntoFaceMask" + ], + { + "author": "Anson Kao", + "description": "A small collection of custom nodes for use with ComfyUI, by Discopixel", + "nickname": "ComfyUI Discopixel", + "title": "ComfyUI Discopixel", + "title_aux": "ComfyUI Discopixel Nodes" + } + ], + "https://github.com/discus0434/comfyui-caching-embeddings": [ + [ + "CachingCLIPTextEncode" + ], + { + "title_aux": "ComfyUI Caching Embeddings" + } + ], + "https://github.com/djbielejeski/a-person-mask-generator": [ + [ + "APersonFaceLandmarkMaskGenerator", + "APersonMaskGenerator" + ], + { + "title_aux": "a-person-mask-generator" + } + ], + "https://github.com/dmMaze/sketch2manga": [ + [ + "BlendScreentone", + "EmptyLatentImageAdvanced" + ], + { + "title_aux": "Sketch2Manga" + } + ], + "https://github.com/dmarx/ComfyUI-AudioReactive": [ + [ + "OpAbs", + "OpBandpass", + "OpClamp", + "OpHarmonic", + "OpModulo", + "OpNormalize", + "OpNovelty", + "OpPercussive", + "OpPow", + "OpPow2", + "OpPredominant_pulse", + "OpQuantize", + "OpRms", + "OpSmoosh", + "OpSmooth", + "OpSqrt", + "OpStretch", + "OpSustain", + "OpThreshold" + ], + { + "title_aux": "ComfyUI-AudioReactive" + } + ], + "https://github.com/dmarx/ComfyUI-Keyframed": [ + [ + "Example", + "KfAddCurveToPGroup", + "KfAddCurveToPGroupx10", + "KfApplyCurveToCond", + "KfConditioningAdd", + "KfConditioningAddx10", + "KfCurveConstant", + "KfCurveDraw", + "KfCurveFromString", + "KfCurveFromYAML", + "KfCurveInverse", + "KfCurveToAcnLatentKeyframe", + "KfCurvesAdd", + "KfCurvesAddx10", + "KfCurvesDivide", + "KfCurvesMultiply", + "KfCurvesMultiplyx10", + "KfCurvesSubtract", + "KfDebug_Clip", + "KfDebug_Cond", + "KfDebug_Curve", + "KfDebug_Float", + "KfDebug_Image", + "KfDebug_Int", + "KfDebug_Latent", + "KfDebug_Model", + "KfDebug_Passthrough", + "KfDebug_Segs", + "KfDebug_String", + "KfDebug_Vae", + "KfDrawSchedule", + "KfEvaluateCurveAtT", + "KfGetCurveFromPGroup", + "KfGetScheduleConditionAtTime", + "KfGetScheduleConditionSlice", + "KfKeyframedCondition", + "KfKeyframedConditionWithText", + "KfPGroupCurveAdd", + "KfPGroupCurveMultiply", + "KfPGroupDraw", + "KfPGroupProd", + "KfPGroupSum", + "KfSetCurveLabel", + "KfSetKeyframe", + "KfSinusoidalAdjustAmplitude", + "KfSinusoidalAdjustFrequency", + "KfSinusoidalAdjustPhase", + "KfSinusoidalAdjustWavelength", + "KfSinusoidalEntangledZeroOneFromFrequencyx2", + "KfSinusoidalEntangledZeroOneFromFrequencyx3", + "KfSinusoidalEntangledZeroOneFromFrequencyx4", + "KfSinusoidalEntangledZeroOneFromFrequencyx5", + "KfSinusoidalEntangledZeroOneFromFrequencyx6", + "KfSinusoidalEntangledZeroOneFromFrequencyx7", + "KfSinusoidalEntangledZeroOneFromFrequencyx8", + "KfSinusoidalEntangledZeroOneFromFrequencyx9", + "KfSinusoidalEntangledZeroOneFromWavelengthx2", + "KfSinusoidalEntangledZeroOneFromWavelengthx3", + "KfSinusoidalEntangledZeroOneFromWavelengthx4", + "KfSinusoidalEntangledZeroOneFromWavelengthx5", + "KfSinusoidalEntangledZeroOneFromWavelengthx6", + "KfSinusoidalEntangledZeroOneFromWavelengthx7", + "KfSinusoidalEntangledZeroOneFromWavelengthx8", + "KfSinusoidalEntangledZeroOneFromWavelengthx9", + "KfSinusoidalGetAmplitude", + "KfSinusoidalGetFrequency", + "KfSinusoidalGetPhase", + "KfSinusoidalGetWavelength", + "KfSinusoidalWithFrequency", + "KfSinusoidalWithWavelength" + ], + { + "title_aux": "ComfyUI-Keyframed" + } + ], + "https://github.com/drago87/ComfyUI_Dragos_Nodes": [ + [ + "file_padding", + "image_info", + "lora_loader", + "vae_loader" + ], + { + "title_aux": "ComfyUI_Dragos_Nodes" + } + ], + "https://github.com/drustan-hawk/primitive-types": [ + [ + "float", + "int", + "string", + "string_multiline" + ], + { + "title_aux": "primitive-types" + } + ], + "https://github.com/e7mac/ComfyUI-ShadertoyGL": [ + [ + "ColorChannelOffset", + "Shader", + "Shadertoy" + ], + { + "title_aux": "ComfyUI-ShadertoyGL" + } + ], + "https://github.com/ealkanat/comfyui_easy_padding": [ + [ + "comfyui-easy-padding" + ], + { + "title_aux": "ComfyUI Easy Padding" + } + ], + "https://github.com/edenartlab/eden_comfy_pipelines": [ + [ + "Animation_RGB_Mask", + "CLIP_Interrogator", + "ConvertToGrayscale", + "Eden_Bool", + "Eden_Compare", + "Eden_DebugPrint", + "Eden_Float", + "Eden_Int", + "Eden_Lora_Loader", + "Eden_String", + "FolderScanner", + "GetRandomFile", + "Get_Prefixed_Imgs", + "HistogramMatching", + "IMG_blender", + "IMG_padder", + "IMG_resolution_multiple_of", + "IMG_scaler", + "IMG_unpadder", + "If ANY execute A else B", + "ImageDescriptionNode", + "LatentTypeConversion", + "Linear_Combine_IP_Embeds", + "LoadImagesByFilename", + "LoadRandomImage", + "Load_Embeddings_From_Folder", + "MaskFromRGB", + "MaskFromRGB_KMeans", + "Random_Style_Mixture", + "SaveImageAdvanced", + "SavePosEmbeds", + "VAEDecode_to_folder", + "VideoFrameSelector", + "WidthHeightPicker" + ], + { + "title_aux": "Various custom nodes by Eden.art" + } + ], + "https://github.com/evanspearman/ComfyMath": [ + [ + "CM_BoolBinaryOperation", + "CM_BoolToInt", + "CM_BoolUnaryOperation", + "CM_BreakoutVec2", + "CM_BreakoutVec3", + "CM_BreakoutVec4", + "CM_ComposeVec2", + "CM_ComposeVec3", + "CM_ComposeVec4", + "CM_FloatBinaryCondition", + "CM_FloatBinaryOperation", + "CM_FloatToInt", + "CM_FloatToNumber", + "CM_FloatUnaryCondition", + "CM_FloatUnaryOperation", + "CM_IntBinaryCondition", + "CM_IntBinaryOperation", + "CM_IntToBool", + "CM_IntToFloat", + "CM_IntToNumber", + "CM_IntUnaryCondition", + "CM_IntUnaryOperation", + "CM_NearestSDXLResolution", + "CM_NumberBinaryCondition", + "CM_NumberBinaryOperation", + "CM_NumberToFloat", + "CM_NumberToInt", + "CM_NumberUnaryCondition", + "CM_NumberUnaryOperation", + "CM_SDXLResolution", + "CM_Vec2BinaryCondition", + "CM_Vec2BinaryOperation", + "CM_Vec2ScalarOperation", + "CM_Vec2ToScalarBinaryOperation", + "CM_Vec2ToScalarUnaryOperation", + "CM_Vec2UnaryCondition", + "CM_Vec2UnaryOperation", + "CM_Vec3BinaryCondition", + "CM_Vec3BinaryOperation", + "CM_Vec3ScalarOperation", + "CM_Vec3ToScalarBinaryOperation", + "CM_Vec3ToScalarUnaryOperation", + "CM_Vec3UnaryCondition", + "CM_Vec3UnaryOperation", + "CM_Vec4BinaryCondition", + "CM_Vec4BinaryOperation", + "CM_Vec4ScalarOperation", + "CM_Vec4ToScalarBinaryOperation", + "CM_Vec4ToScalarUnaryOperation", + "CM_Vec4UnaryCondition", + "CM_Vec4UnaryOperation" + ], + { + "title_aux": "ComfyMath" + } + ], + "https://github.com/exdysa/comfyui-selector": [ + [ + "Fork", + "ForkClip", + "Recourse", + "Recourse+/-", + "RecourseCkpt", + "RecourseImage", + "Selector", + "Unite" + ], + { + "author": "\"\u02f6\ud835\udfa2\u292c\u2ad2\u2d56s\u143c\u02f6\"", + "description": "\"EXDYSA. Selector and Recourse. Presets & failsafes. Work flow.\"", + "nickname": "\"Selector\"", + "title": "\"Selector\"", + "title_aux": "comfyui-selector" + } + ], + "https://github.com/fablestudio/ComfyUI-Showrunner-Utils": [ + [ + "AlignFace" + ], + { + "title_aux": "ComfyUI-Showrunner-Utils" + } + ], + "https://github.com/fearnworks/ComfyUI_FearnworksNodes/raw/main/fw_nodes.py": [ + [ + "Count Files in Directory (FW)", + "Count Tokens (FW)", + "Token Count Ranker(FW)", + "Trim To Tokens (FW)" + ], + { + "title_aux": "Fearnworks Custom Nodes" + } + ], + "https://github.com/fexli/fexli-util-node-comfyui": [ + [ + "FEBCPrompt", + "FEBatchGenStringBCDocker", + "FEColor2Image", + "FEColorOut", + "FEDataInsertor", + "FEDataPacker", + "FEDataUnpacker", + "FEDeepClone", + "FEDictPacker", + "FEDictUnpacker", + "FEEncLoraLoader", + "FEExtraInfoAdd", + "FEGenStringBCDocker", + "FEGenStringGPT", + "FEImageNoiseGenerate", + "FEImagePadForOutpaint", + "FEImagePadForOutpaintByImage", + "FEOperatorIf", + "FEPythonStrOp", + "FERandomBool", + "FERandomLoraSelect", + "FERandomPrompt", + "FERandomizedColor2Image", + "FERandomizedColorOut", + "FERerouteWithName", + "FESaveEncryptImage", + "FETextCombine", + "FETextCombine2Any", + "FETextInput" + ], + { + "title_aux": "fexli-util-node-comfyui" + } + ], + "https://github.com/fexploit/ComfyUI-AutoLabel": [ + [ + "AutoLabel" + ], + { + "title_aux": "ComfyUI-AutoLabel" + } + ], + "https://github.com/fexploit/ComfyUI-AutoTrimBG": [ + [ + "RonLayers/TrimBg: RonLayersTrimBgUltraV2" + ], + { + "title_aux": "ComfyUI-AutoTrimBG" + } + ], + "https://github.com/fexploit/ComfyUI-Classifier": [ + [ + "ClassifierNode" + ], + { + "title_aux": "ComfyUI-Classifier" + } + ], + "https://github.com/filipemeneses/comfy_pixelization": [ + [ + "Pixelization" + ], + { + "title_aux": "Pixelization" + } + ], + "https://github.com/filliptm/ComfyUI_Fill-Nodes": [ + [ + "FL_Ascii", + "FL_AudioConverter", + "FL_AudioFrameCalculator", + "FL_AudioPreview", + "FL_BatchAlign", + "FL_CodeNode", + "FL_DirectoryCrawl", + "FL_Glitch", + "FL_HalftonePattern", + "FL_HexagonalPattern", + "FL_ImageCaptionSaver", + "FL_ImageCollage", + "FL_ImageDimensionDisplay", + "FL_ImageDurationSync", + "FL_ImageNotes", + "FL_ImagePixelator", + "FL_ImageRandomizer", + "FL_InfiniteZoom", + "FL_InpaintCrop", + "FL_Inpaint_Stitch", + "FL_KsamplerSettings", + "FL_NFTGenerator", + "FL_PaperDrawn", + "FL_PasteOnCanvas", + "FL_PixelArtShader", + "FL_PixelSort", + "FL_PromptSelector", + "FL_RandomNumber", + "FL_RetroEffect", + "FL_Ripple", + "FL_SDUltimate_Slices", + "FL_SeparateMaskComponents", + "FL_Shadertoy", + "FL_TD_Sampler", + "FL_VideoCropMask", + "FL_VideoRecompose" + ], + { + "title_aux": "ComfyUI_Fill-Nodes" + } + ], + "https://github.com/fitCorder/fcSuite/raw/main/fcSuite.py": [ + [ + "fcFloat", + "fcFloatMatic", + "fcHex", + "fcInteger" + ], + { + "title_aux": "fcSuite" + } + ], + "https://github.com/florestefano1975/ComfyUI-HiDiffusion": [ + [ + "HiDiffusionSD15", + "HiDiffusionSD21", + "HiDiffusionSDXL", + "HiDiffusionSDXLTurbo" + ], + { + "title_aux": "ComfyUI HiDiffusion" + } + ], + "https://github.com/florestefano1975/ComfyUI-StabilityAI-Suite": [ + [ + "StabilityAI Suite - Creative Upscale", + "StabilityAI Suite - Creative Upscale Recover File", + "StabilityAI Suite - Image Core + Style Preset", + "StabilityAI Suite - Inpainting", + "StabilityAI Suite - Outpainting", + "StabilityAI Suite - Remove Background", + "StabilityAI Suite - SD3", + "StabilityAI Suite - Search and Replace" + ], + { + "title_aux": "ComfyUI StabilityAI Suite" + } + ], + "https://github.com/florestefano1975/comfyui-portrait-master": [ + [ + "PortraitMaster" + ], + { + "title_aux": "comfyui-portrait-master" + } + ], + "https://github.com/florestefano1975/comfyui-prompt-composer": [ + [ + "PromptComposerCustomLists", + "PromptComposerEffect", + "PromptComposerGrouping", + "PromptComposerMerge", + "PromptComposerStyler", + "PromptComposerTextSingle", + "promptComposerTextMultiple" + ], + { + "title_aux": "comfyui-prompt-composer" + } + ], + "https://github.com/flowtyone/ComfyUI-Flowty-CRM": [ + [ + "CCMSampler", + "CRMModelLoader", + "CRMModeler", + "CRMModelerCuda", + "CRMPoseSampler", + "CRMPoserConfig", + "CRMPreprocessForPoser", + "CRMViewer" + ], + { + "title_aux": "ComfyUI-Flowty-CRM" + } + ], + "https://github.com/flowtyone/ComfyUI-Flowty-LDSR": [ + [ + "LDSRModelLoader", + "LDSRUpscale", + "LDSRUpscaler" + ], + { + "title_aux": "ComfyUI-Flowty-LDSR" + } + ], + "https://github.com/flowtyone/ComfyUI-Flowty-TripoSR": [ + [ + "TripoSRModelLoader", + "TripoSRSampler", + "TripoSRViewer" + ], + { + "title_aux": "ComfyUI-Flowty-TripoSR" + } + ], + "https://github.com/flyingshutter/As_ComfyUI_CustomNodes": [ + [ + "BatchIndex_AS", + "CropImage_AS", + "Eval_AS", + "ImageMixMasked_As", + "ImageToMask_AS", + "Increment_AS", + "Int2Any_AS", + "LatentAdd_AS", + "LatentMixMasked_As", + "LatentMix_AS", + "LatentToImages_AS", + "LoadLatent_AS", + "MapRange_AS", + "MaskToImage_AS", + "Math_AS", + "NoiseImage_AS", + "Number2Float_AS", + "Number2Int_AS", + "Number_AS", + "SaveLatent_AS", + "TextToImage_AS", + "TextWildcardList_AS" + ], + { + "title_aux": "As_ComfyUI_CustomNodes" + } + ], + "https://github.com/fmatray/ComfyUI_BattlemapGrid": [ + [ + "Battlemap Grid", + "Compass", + "Map Generator", + "Map Generator(Outdoors)" + ], + { + "title_aux": "ComfyUI_BattlemapGrid" + } + ], + "https://github.com/fofr/ComfyUI-HyperSDXL1StepUnetScheduler": [ + [ + "HyperSDXL1StepUnetScheduler" + ], + { + "title_aux": "ComfyUI-HyperSDXL1StepUnetScheduler (ByteDance)" + } + ], + "https://github.com/fofr/ComfyUI-Prompter-fofrAI": [ + [ + "List sampler \ud83e\udeb4", + "Prompt from template \ud83e\udeb4" + ], + { + "title_aux": "ComfyUI-Prompter-fofrAI" + } + ], + "https://github.com/forever22777/comfyui-self-guidance": [ + [ + "CLIPConditioning", + "CheckpointLoaderMixWithDiffusers", + "SelfGuidanceSampler" + ], + { + "title_aux": "Self-Guidance nodes" + } + ], + "https://github.com/foxtrot-roger/comfyui-rf-nodes": [ + [ + "LogBool", + "LogFloat", + "LogInt", + "LogNumber", + "LogString", + "LogVec2", + "LogVec3", + "RF_AtIndexString", + "RF_BoolToString", + "RF_FloatToString", + "RF_IntToString", + "RF_JsonStyleLoader", + "RF_MergeLines", + "RF_NumberToString", + "RF_OptionsString", + "RF_RangeFloat", + "RF_RangeInt", + "RF_RangeNumber", + "RF_SavePromptInfo", + "RF_SplitLines", + "RF_TextConcatenate", + "RF_TextInput", + "RF_TextReplace", + "RF_Timestamp", + "RF_ToString", + "RF_Vec2ToString", + "RF_Vec3ToString", + "TextLine" + ], + { + "title_aux": "RF Nodes" + } + ], + "https://github.com/frankchieng/ComfyUI_Aniportrait": [ + [ + "AniPortrait_Audio2Video", + "AniPortrait_Audio_Path", + "AniPortrait_LoadVideoPath", + "AniPortrait_Pose_Gen_Video", + "AniPortrait_Ref_Image_Path", + "AniPortrait_Video_Gen_Pose" + ], + { + "title_aux": "ComfyUI_Aniportrait" + } + ], + "https://github.com/frankchieng/ComfyUI_MagicClothing": [ + [ + "MagicClothing_Animatediff", + "MagicClothing_Generate", + "MagicClothing_Inpainting" + ], + { + "title_aux": "ComfyUI_MagicClothing" + } + ], + "https://github.com/frankchieng/ComfyUI_llm_easyanimiate": [ + [], + { + "nodename_pattern": "^FrankChiengEasyAnimate", + "title_aux": "ComfyUI_llm_easyanimiate" + } + ], + "https://github.com/fsdymy1024/ComfyUI_fsdymy": [ + [ + "IPAdapterLayerWeight", + "Preview Image Without Metadata", + "PreviewImageWithoutMetadata", + "Save Image Without Metadata", + "SaveImageWithoutMetadata", + "ShowText", + "ZhiPuAiNode" + ], + { + "title_aux": "ComfyUI_fsdymy" + } + ], + "https://github.com/gemell1/ComfyUI_GMIC": [ + [ + "GmicCliWrapper", + "GmicQtWrapper" + ], + { + "title_aux": "ComfyUI_GMIC" + } + ], + "https://github.com/get-salt-AI/SaltAI": [ + [ + "SAIPrimitiveConverter", + "SAIStringRegexSearchMatch", + "SAIStringRegexSearchReplace", + "SaltAIStableVideoDiffusion", + "SaltBatchCropDataExtractor", + "SaltCLIPSegLoader", + "SaltCLIPSegMasking", + "SaltCropImageLocation", + "SaltDisplayAny", + "SaltImagePasteCrop", + "SaltInfo", + "SaltInput", + "SaltLoadImageZip", + "SaltMaskCropRegion", + "SaltMasksToImages", + "SaltOutput", + "SaltRGBAFromMask", + "SaltWebsiteScreenshot" + ], + { + "title_aux": "SaltAI-Open-Resources" + } + ], + "https://github.com/get-salt-AI/SaltAI_Language_Toolkit": [ + [ + "AddTool", + "ChangeSystemMessage", + "ClearMemory", + "ConversableAgentCreator", + "ConversableAgentCreatorAdvanced", + "ConvertAgentAsTool", + "ConvertAgentToLlamaindex", + "CreateTavilySearchTool", + "Example", + "GenerateReply", + "GroupChat", + "GroupChatAdvanced", + "GroupChatManagerCreator", + "LLMCSVReader", + "LLMChat", + "LLMChatBot", + "LLMChatEngine", + "LLMChatMessageConcat", + "LLMChatMessages", + "LLMChatMessagesAdv", + "LLMComplete", + "LLMCustomNodeComposer", + "LLMDirectoryReader", + "LLMDocumentListAppend", + "LLMDocxReader", + "LLMEpubReader", + "LLMFlatReader", + "LLMHTMLTagReader", + "LLMHWPReader", + "LLMHtmlComposer", + "LLMHtmlRepair", + "LLMIPYNBReader", + "LLMImageCaptionReader", + "LLMImageTabularChartReader", + "LLMImageTextReader", + "LLMImageVisionLLMReader", + "LLMInputToDocuments", + "LLMJsonComposer", + "LLMJsonRepair", + "LLMLLaVANextImageEvaluator", + "LLMLLaVANextModelLoader", + "LLMMarkdownComposer", + "LLMMarkdownReader", + "LLMMarkdownRepair", + "LLMMboxReader", + "LLMMultiModalImageEvaluation", + "LLMNotionReader", + "LLMOpenAIModel", + "LLMOpenAIModelOpts", + "LLMPDFReader", + "LLMPagedCSVReader", + "LLMPandasCSVReader", + "LLMParquetDatasetSearcher", + "LLMPostProcessDocuments", + "LLMPptxReader", + "LLMPyMuPDFReader", + "LLMQueryEngine", + "LLMQueryEngineAdv", + "LLMQueryEngineAsTool", + "LLMRTFReader", + "LLMRegexCreator", + "LLMRegexRepair", + "LLMRssReaderNode", + "LLMSaltWebCrawler", + "LLMScaleSERPSearch", + "LLMSemanticSplitterNodeParser", + "LLMSentenceSplitterNodeCreator", + "LLMServiceContextAdv", + "LLMServiceContextDefault", + "LLMSimpleWebPageReader", + "LLMSimpleWebPageReaderAdv", + "LLMSummaryIndex", + "LLMTavilyResearch", + "LLMTrafilaturaWebReader", + "LLMTrafilaturaWebReaderAdv", + "LLMTreeIndex", + "LLMUnstructuredReader", + "LLMVectorStoreIndex", + "LLMVectorStoreIndexAdv", + "LLMVideoAudioReader", + "LLMXMLReader", + "LLMYamlComposer", + "LLMYamlRepair", + "SaltJSONQueryEngine", + "SendMessage", + "SimpleChat" + ], + { + "title_aux": "SaltAI Language Toolkit" + } + ], + "https://github.com/get-salt-AI/SaltAI_LlamaIndex": [ + [ + "AddTool", + "ChangeSystemMessage", + "ClearMemory", + "ConversableAgentCreator", + "ConversableAgentCreatorAdvanced", + "ConvertAgentAsTool", + "ConvertAgentToLlamaindex", + "CreateTavilySearchTool", + "Example", + "GenerateReply", + "GroupChat", + "GroupChatAdvanced", + "GroupChatManagerCreator", + "LLMCSVReader", + "LLMChat", + "LLMChatBot", + "LLMChatEngine", + "LLMChatMessageConcat", + "LLMChatMessages", + "LLMChatMessagesAdv", + "LLMComplete", + "LLMCustomNodeComposer", + "LLMDirectoryReader", + "LLMDocumentListAppend", + "LLMDocxReader", + "LLMEpubReader", + "LLMFlatReader", + "LLMHTMLTagReader", + "LLMHWPReader", + "LLMHtmlComposer", + "LLMHtmlRepair", + "LLMIPYNBReader", + "LLMImageCaptionReader", + "LLMImageTabularChartReader", + "LLMImageTextReader", + "LLMImageVisionLLMReader", + "LLMInputToDocuments", + "LLMJsonComposer", + "LLMJsonRepair", + "LLMLLaVANextImageEvaluator", + "LLMLLaVANextModelLoader", + "LLMMarkdownComposer", + "LLMMarkdownReader", + "LLMMarkdownRepair", + "LLMMboxReader", + "LLMMultiModalImageEvaluation", + "LLMNotionReader", + "LLMOpenAIModel", + "LLMOpenAIModelOpts", + "LLMPDFReader", + "LLMPagedCSVReader", + "LLMPandasCSVReader", + "LLMParquetDatasetSearcher", + "LLMPostProcessDocuments", + "LLMPptxReader", + "LLMPyMuPDFReader", + "LLMQueryEngine", + "LLMQueryEngineAdv", + "LLMQueryEngineAsTool", + "LLMRTFReader", + "LLMRegexCreator", + "LLMRegexRepair", + "LLMRssReaderNode", + "LLMSaltWebCrawler", + "LLMScaleSERPSearch", + "LLMSemanticSplitterNodeParser", + "LLMSentenceSplitterNodeCreator", + "LLMServiceContextAdv", + "LLMServiceContextDefault", + "LLMSimpleWebPageReader", + "LLMSimpleWebPageReaderAdv", + "LLMSummaryIndex", + "LLMTavilyResearch", + "LLMTrafilaturaWebReader", + "LLMTrafilaturaWebReaderAdv", + "LLMTreeIndex", + "LLMUnstructuredReader", + "LLMVectorStoreIndex", + "LLMVectorStoreIndexAdv", + "LLMVideoAudioReader", + "LLMXMLReader", + "LLMYamlComposer", + "LLMYamlRepair", + "SaltJSONQueryEngine", + "SendMessage", + "SimpleChat" + ], + { + "title_aux": "SaltAI_LlamaIndex" + } + ], + "https://github.com/giriss/comfy-image-saver": [ + [ + "Cfg Literal", + "Checkpoint Selector", + "Int Literal", + "Sampler Selector", + "Save Image w/Metadata", + "Scheduler Selector", + "Seed Generator", + "String Literal", + "Width/Height Literal" + ], + { + "title_aux": "Save Image with Generation Metadata" + } + ], + "https://github.com/githubYiheng/ComfyUI_Change_IMAGE_BOREDER": [ + [ + "ChangeImageBorder" + ], + { + "title_aux": "ComfyUI_Change_IMAGE_BOREDER" + } + ], + "https://github.com/githubYiheng/ComfyUI_GetFileNameFromURL": [ + [ + "GetFileNameFromURL" + ], + { + "title_aux": "ComfyUI_GetFileNameFromURL" + } + ], + "https://github.com/githubYiheng/comfyui_kmeans_filter": [ + [ + "ImageKmeansFilter" + ], + { + "title_aux": "comfyui_kmeans_filter" + } + ], + "https://github.com/githubYiheng/comfyui_meanshift_filter": [ + [ + "ImageMeanshiftFilter" + ], + { + "title_aux": "comfyui_meanshift_filter" + } + ], + "https://github.com/githubYiheng/comfyui_private_postprocessor": [ + [ + "ImageCPostprocessor", + "PrivateImageMask" + ], + { + "title_aux": "comfyui_private_postprocessor" + } + ], + "https://github.com/glibsonoran/Plush-for-ComfyUI": [ + [ + "AI Chooser", + "AdvPromptEnhancer", + "DalleImage", + "Enhancer", + "ImgTextSwitch", + "Plush-Exif Wrangler", + "Tagger", + "mulTextSwitch" + ], + { + "title_aux": "Plush-for-ComfyUI" + } + ], + "https://github.com/glifxyz/ComfyUI-GlifNodes": [ + [ + "GlifConsistencyDecoder", + "GlifPatchConsistencyDecoderTiled", + "GlifVariable", + "HFHubEmbeddingLoader", + "HFHubLoraLoader", + "ImageToMultipleOf", + "SDXLAspectRatio" + ], + { + "title_aux": "ComfyUI-GlifNodes" + } + ], + "https://github.com/glowcone/comfyui-base64-to-image": [ + [ + "LoadImageFromBase64" + ], + { + "title_aux": "Load Image From Base64 URI" + } + ], + "https://github.com/godspede/ComfyUI_Substring": [ + [ + "SubstringTheory" + ], + { + "title_aux": "ComfyUI Substring" + } + ], + "https://github.com/gokayfem/ComfyUI-Depth-Visualization": [ + [ + "DepthViewer" + ], + { + "title_aux": "ComfyUI-Depth-Visualization" + } + ], + "https://github.com/gokayfem/ComfyUI-Dream-Interpreter": [ + [ + "DreamViewer" + ], + { + "title_aux": "ComfyUI-Dream-Interpreter" + } + ], + "https://github.com/gokayfem/ComfyUI-Texture-Simple": [ + [ + "TextureViewer" + ], + { + "title_aux": "ComfyUI-Texture-Simple" + } + ], + "https://github.com/gokayfem/ComfyUI_VLM_nodes": [ + [ + "AudioLDM2Node", + "ChatMusician", + "CreativeArtPromptGenerator", + "Internlm", + "Joytag", + "JsonToText", + "KeywordExtraction", + "Kosmos2model", + "LLMLoader", + "LLMPromptGenerator", + "LLMSampler", + "LLava Loader Simple", + "LLavaOptionalMemoryFreeAdvanced", + "LLavaOptionalMemoryFreeSimple", + "LLavaPromptGenerator", + "LLavaSamplerAdvanced", + "LLavaSamplerSimple", + "LlavaClipLoader", + "MCLLaVAModel", + "MoonDream", + "Moondream2model", + "PlayMusic", + "PromptGenerateAPI", + "SaveAudioNode", + "SimpleText", + "StructuredOutput", + "Suggester", + "UformGen2QwenNode", + "ViewText" + ], + { + "title_aux": "VLM_nodes" + } + ], + "https://github.com/gonzalu/ComfyUI_YFG_Comical": [ + [ + "Image10Switcher_node", + "Image15Switcher_node", + "Image20Switcher_node", + "Image3Switcher_node", + "Image5Switcher_node", + "MonoClip_node", + "PixelArt_node", + "VAEDecodePreview_node", + "image2contrastMask_node", + "image2imbgg_node", + "image_halftone", + "image_histograms_node", + "image_histograms_node_compact", + "images_side_by_side", + "imgbbLoader_node", + "smartCheckpointLoader_node", + "storeURL_node", + "textMaskOverlay_node" + ], + { + "author": "Manny Gonzalez", + "description": "Utility custom nodes for special effects, image manipulation and quality of life tools.", + "nickname": "\ud83d\udc2f YFG Comical Nodes", + "title": "\ud83d\udc2f YFG Comical Nodes", + "title_aux": "\ud83d\ude38 YFG Comical Nodes" + } + ], + "https://github.com/griptape-ai/ComfyUI-Griptape": [ + [ + "Griptape Agent Config: Amazon Bedrock", + "Griptape Agent Config: Anthropic", + "Griptape Agent Config: Google", + "Griptape Agent Config: LM Studio", + "Griptape Agent Config: Ollama", + "Griptape Agent Config: OpenAI", + "Griptape Audio Driver: OpenAI", + "Griptape Combine: Merge Inputs", + "Griptape Combine: Merge Texts", + "Griptape Combine: Rules List", + "Griptape Combine: Tool List", + "Griptape Config: Environment Variables", + "Griptape Convert: Text to CLIP Encode", + "Griptape Convert: Text to Combo", + "Griptape Create: Agent", + "Griptape Create: CLIP Text Encode", + "Griptape Create: Image Variation", + "Griptape Create: Image from Text", + "Griptape Create: Rules", + "Griptape Create: Text", + "Griptape Display: Artifact", + "Griptape Display: Data as Text", + "Griptape Display: Image", + "Griptape Display: Text", + "Griptape Driver: Amazon Bedrock Stable Diffusion", + "Griptape Driver: Amazon Bedrock Titan", + "Griptape Driver: Leonardo.AI", + "Griptape Driver: OpenAI Image Generation", + "Griptape Expand: Agent Nodes", + "Griptape Load: Audio", + "Griptape Load: Image From URL", + "Griptape Run: Agent", + "Griptape Run: Audio Transcription", + "Griptape Run: Image Description", + "Griptape Run: Parallel Image Description", + "Griptape Run: Prompt Task", + "Griptape Run: Text Summary", + "Griptape Run: Tool Task", + "Griptape Run: Toolkit Task", + "Griptape Set: Default Agent", + "Griptape Tool: Audio Transcription", + "Griptape Tool: Calculator", + "Griptape Tool: DateTime", + "Griptape Tool: FileManager", + "Griptape Tool: Griptape Cloud KnowledgeBase", + "Griptape Tool: WebScraper", + "Griptape Tool: WebSearch" + ], + { + "author": "Jason Schleifer", + "description": "This extension offers various nodes that allow you to work with LLMs using the Griptape Python Framework (https://griptape.ai)", + "nickname": "ComfyUI-Griptape", + "title": "ComfyUI Griptape Nodes", + "title_aux": "ComfyUI Griptape Nodes" + } + ], + "https://github.com/guill/abracadabra-comfyui": [ + [ + "AbracadabraNode", + "AbracadabraNodeDefSummary" + ], + { + "title_aux": "abracadabra-comfyui" + } + ], + "https://github.com/guoyk93/yk-node-suite-comfyui": [ + [ + "YKImagePadForOutpaint", + "YKMaskToImage" + ], + { + "title_aux": "y.k.'s ComfyUI node suite" + } + ], + "https://github.com/hackkhai/ComfyUI-Image-Matting": [ + [ + "ApplyMatting", + "CreateTrimap", + "MattingModelLoader" + ], + { + "title_aux": "ComfyUI-Image-Matting" + } + ], + "https://github.com/haohaocreates/ComfyUI-HH-Image-Selector": [ + [ + "Image Selector" + ], + { + "title_aux": "ComfyUI-HH-Image-Selector" + } + ], + "https://github.com/hay86/ComfyUI_AceNodes": [ + [ + "ACE_AnyInputSwitchBool", + "ACE_AudioLoad", + "ACE_AudioPlay", + "ACE_AudioSave", + "ACE_Expression_Eval", + "ACE_Float", + "ACE_ImageColorFix", + "ACE_ImageConstrain", + "ACE_ImageFaceCrop", + "ACE_ImageGetSize", + "ACE_ImageLoadFromCloud", + "ACE_ImageQA", + "ACE_ImageRemoveBackground", + "ACE_ImageSaveToCloud", + "ACE_Integer", + "ACE_MaskBlur", + "ACE_Seed", + "ACE_Text", + "ACE_TextConcatenate", + "ACE_TextGoogleTranslate", + "ACE_TextInputSwitch2Way", + "ACE_TextInputSwitch4Way", + "ACE_TextInputSwitch8Way", + "ACE_TextList", + "ACE_TextPreview", + "ACE_TextSelector", + "ACE_TextToResolution", + "ACE_TextTranslate" + ], + { + "title_aux": "ComfyUI AceNodes" + } + ], + "https://github.com/hay86/ComfyUI_DDColor": [ + [ + "D_DDColor" + ], + { + "title_aux": "ComfyUI DDColor" + } + ], + "https://github.com/hay86/ComfyUI_Dreamtalk": [ + [ + "D_DreamTalk" + ], + { + "title_aux": "ComfyUI Dreamtalk" + } + ], + "https://github.com/hay86/ComfyUI_Hallo": [ + [ + "D_HalloNode" + ], + { + "title_aux": "ComfyUI Hallo" + } + ], + "https://github.com/hay86/ComfyUI_MiniCPM-V": [ + [ + "D_MiniCPM_VQA" + ], + { + "title_aux": "ComfyUI MiniCPM-V" + } + ], + "https://github.com/hay86/ComfyUI_OpenVoice": [ + [ + "D_OpenVoice_STS", + "D_OpenVoice_TTS", + "D_OpenVoice_TTS_V2" + ], + { + "title_aux": "ComfyUI OpenVoice" + } + ], + "https://github.com/hben35096/ComfyUI-ToolBox": [ + [ + "AutoDLDownload", + "FolderDeleter", + "FolderViewe" + ], + { + "title_aux": "ComfyUI-ToolBox" + } + ], + "https://github.com/heshengtao/comfyui_LLM_party": [ + [ + "About_us", + "CLIPTextEncode_party", + "CosyVoice", + "Dingding", + "Dingding_tool", + "KG_csv_toolkit_developer", + "KG_csv_toolkit_user", + "KG_json_toolkit_developer", + "KG_json_toolkit_user", + "KG_neo_toolkit_developer", + "KG_neo_toolkit_user", + "KSampler_party", + "LLM", + "LLM_api_loader", + "LLM_local", + "LLM_local_loader", + "LLavaLoader", + "VAEDecode_party", + "accuweather_tool", + "api_tool", + "arxiv_tool", + "bing_tool", + "check_web_tool", + "classify_function", + "classify_function_plus", + "classify_persona", + "classify_persona_plus", + "custom_persona", + "ebd_tool", + "end_dialog", + "end_workflow", + "feishu", + "feishu_tool", + "file_combine", + "file_combine_plus", + "get_string", + "github_tool", + "google_tool", + "image_iterator", + "interpreter_tool", + "json_get_value", + "json_parser", + "keyword_tool", + "listen_audio", + "llama_guff_loader", + "load_embeddings", + "load_excel", + "load_file", + "load_file_folder", + "load_keyword", + "load_name", + "load_persona", + "load_url", + "load_wikipedia", + "new_interpreter_tool", + "omost_decode", + "omost_setting", + "openai_tts", + "openai_whisper", + "play_audio", + "replace_string", + "show_text_party", + "start_dialog", + "start_workflow", + "story_json_tool", + "string_logic", + "substring", + "text_iterator", + "time_tool", + "tool_combine", + "tool_combine_plus", + "translate_persona", + "weather_tool", + "weekday_tool", + "wikipedia_tool", + "work_wechat", + "work_wechat_tool", + "workflow_tool", + "workflow_transfer" + ], + { + "title_aux": "comfyui_LLM_party" + } + ], + "https://github.com/hhhzzyang/Comfyui_Lama": [ + [ + "LamaApply", + "LamaModelLoader", + "YamlConfigLoader" + ], + { + "title_aux": "Comfyui-Lama" + } + ], + "https://github.com/hiforce/comfyui-hiforce-plugin": [ + [ + "HfBoolSwitchKSampleStatus", + "HfImageAutoExpansionSquare", + "HfImageToRGB", + "HfImageToRGBA", + "HfInitImageWithMaxSize", + "HfIterativeLatentUpscale", + "HfLoadImageWithCropper", + "HfLookbackSamplerLoader", + "HfLoopback", + "HfResizeImage", + "HfSampler", + "HfSamplerLoader", + "HfSamplerLoopback", + "HfSaveImage", + "HfSwitchKSampleStatus", + "HfTwoSamplersForMask", + "HfTwoStepSamplers", + "LoadImageFromURL" + ], + { + "title_aux": "Comfyui HiFORCE Plugin" + } + ], + "https://github.com/hinablue/ComfyUI_3dPoseEditor": [ + [ + "Hina.PoseEditor3D" + ], + { + "title_aux": "ComfyUI 3D Pose Editor" + } + ], + "https://github.com/holchan/ComfyUI-ModelDownloader": [ + [ + "LoRADownloader", + "ModelDownloader" + ], + { + "title_aux": "ComfyUI-ModelDownloader" + } + ], + "https://github.com/huagetai/ComfyUI-Gaffer": [ + [ + "ApplyICLight", + "CalculateNormalMap", + "GrayScaler", + "ICLightModelLoader", + "LightSource" + ], + { + "title_aux": "comfyui's gaffer(ComfyUI native implementation of IC-Light. )" + } + ], + "https://github.com/huagetai/ComfyUI_LightGradient": [ + [ + "ImageGradient", + "MaskGradient" + ], + { + "title_aux": "Light Gradient for ComfyUI" + } + ], + "https://github.com/huchenlei/ComfyUI-IC-Light-Native": [ + [ + "ICLightApplyMaskGrey", + "ICLightAppply", + "VAEEncodeArgMax" + ], + { + "title_aux": "ComfyUI-IC-Light-Native" + } + ], + "https://github.com/huchenlei/ComfyUI-layerdiffuse": [ + [ + "LayeredDiffusionApply", + "LayeredDiffusionCondApply", + "LayeredDiffusionCondJointApply", + "LayeredDiffusionDecode", + "LayeredDiffusionDecodeRGBA", + "LayeredDiffusionDecodeSplit", + "LayeredDiffusionDiffApply", + "LayeredDiffusionJointApply" + ], + { + "title_aux": "ComfyUI-layerdiffuse (layerdiffusion)" + } + ], + "https://github.com/huchenlei/ComfyUI-openpose-editor": [ + [ + "huchenlei.LoadOpenposeJSON" + ], + { + "title_aux": "ComfyUI-openpose-editor" + } + ], + "https://github.com/huchenlei/ComfyUI_DanTagGen": [ + [ + "PromptDanTagGen" + ], + { + "title_aux": "ComfyUI_DanTagGen" + } + ], + "https://github.com/huchenlei/ComfyUI_densediffusion": [ + [ + "DenseDiffusionAddCondNode", + "DenseDiffusionApplyNode" + ], + { + "title_aux": "ComfyUI DenseDiffusion" + } + ], + "https://github.com/huchenlei/ComfyUI_omost": [ + [ + "OmostDenseDiffusionLayoutNode", + "OmostGreedyBagsTextEmbeddingNode", + "OmostLLMChatNode", + "OmostLLMHTTPServerNode", + "OmostLLMLoaderNode", + "OmostLayoutCondNode", + "OmostLoadCanvasConditioningNode", + "OmostLoadCanvasPythonCodeNode", + "OmostRenderCanvasConditioningNode" + ], + { + "title_aux": "ComfyUI_omost" + } + ], + "https://github.com/hughescr/ComfyUI-OpenPose-Keypoint-Extractor": [ + [ + "Openpose Keypoint Extractor" + ], + { + "title_aux": "OpenPose Keypoint Extractor" + } + ], + "https://github.com/hustille/ComfyUI_Fooocus_KSampler": [ + [ + "KSampler With Refiner (Fooocus)" + ], + { + "title_aux": "ComfyUI_Fooocus_KSampler" + } + ], + "https://github.com/hustille/ComfyUI_hus_utils": [ + [ + "3way Prompt Styler", + "Batch State", + "Date Time Format", + "Debug Extra", + "Fetch widget value", + "Text Hash" + ], + { + "title_aux": "hus' utils for ComfyUI" + } + ], + "https://github.com/hwhaocool/ComfyUI-Select-Any": [ + [ + "SelectAnyValues" + ], + { + "title_aux": "ComfyUI-Select-Any" + } + ], + "https://github.com/hylarucoder/ComfyUI-Eagle-PNGInfo": [ + [ + "EagleImageNode", + "SDXLPromptStyler", + "SDXLPromptStylerAdvanced", + "SDXLResolutionPresets" + ], + { + "title_aux": "Eagle PNGInfo" + } + ], + "https://github.com/hyunamy/comfy-ui-on-complete-email-me": [ + [ + "OnCompleteEmailMe", + "OnCompleteWebhook" + ], + { + "title_aux": "Comfy-UI on-complete-email-me" + } + ], + "https://github.com/iFREEGROUP/comfyui-undistort": [ + [ + "IG_LoadCheckerboardImageForCalibrateCamera", + "IG_MatrixAndDistCoefToText", + "IG_Undistort" + ], + { + "title_aux": "comfyui-undistort" + } + ], + "https://github.com/icesun963/ComfyUI_HFDownLoad": [ + [ + "HFDownLoad_Tool" + ], + { + "title_aux": "HFDownLoad Node for ComfyUI" + } + ], + "https://github.com/idrirap/ComfyUI-Lora-Auto-Trigger-Words": [ + [ + "FusionText", + "LoraListNames", + "LoraLoaderAdvanced", + "LoraLoaderStackedAdvanced", + "LoraLoaderStackedVanilla", + "LoraLoaderVanilla", + "LoraTagsOnly", + "Randomizer", + "TagsFormater", + "TagsSelector", + "TextInputBasic" + ], + { + "title_aux": "ComfyUI-Lora-Auto-Trigger-Words" + } + ], + "https://github.com/iemesowum/ComfyUI_IsaacNodes": [ + [ + "I_BinaryAmplitudeGate", + "I_UnmixAudio", + "I_WeightsListToWeights" + ], + { + "author": "Isaac Emesowum", + "description": "This extension offers automatic drums extraction from audio files, as well as a few helper nodes to support my audio synchronization AnimateDiff workflows.", + "nickname": "Isaac's Nodes", + "title": "Isaac's Nodes", + "title_aux": "Isaac's Nodes" + } + ], + "https://github.com/if-ai/ComfyUI-IF_AI_HFDownloaderNode": [ + [ + "IF_HFDownload", + "IF_HFDownloadNode" + ], + { + "title_aux": "ComfyUI-IF_AI_HFDownloaderNode" + } + ], + "https://github.com/if-ai/ComfyUI-IF_AI_WishperSpeechNode": [ + [ + "IF_WhisperSpeech" + ], + { + "title_aux": "ComfyUI-IF_AI_WishperSpeechNode" + } + ], + "https://github.com/if-ai/ComfyUI-IF_AI_tools": [ + [ + "IF_ChatPrompt", + "IF_DisplayText", + "IF_ImagePrompt", + "IF_PromptMkr", + "IF_SaveText", + "IF_saveText" + ], + { + "title_aux": "ComfyUI-IF_AI_tools" + } + ], + "https://github.com/imb101/ComfyUI-FaceSwap": [ + [ + "FaceSwapNode" + ], + { + "title_aux": "FaceSwap" + } + ], + "https://github.com/iwanders/ComfyUI_nodes": [ + [ + "IW_JsonPickItem", + "IW_ModelHook", + "IW_StringConcat", + "IW_StringNode", + "IW_StringPrint", + "IW_StringReplace", + "IW_StringSave", + "IW_TokenizerVocab" + ], + { + "title_aux": "iwanders/ComfyUI_nodes" + } + ], + "https://github.com/jags111/ComfyUI_Jags_Audiotools": [ + [ + "BatchJoinAudio", + "BatchToList", + "BitCrushAudioFX", + "BulkVariation", + "ChorusAudioFX", + "ClippingAudioFX", + "CompressorAudioFX", + "ConcatAudioList", + "ConvolutionAudioFX", + "CutAudio", + "DelayAudioFX", + "DistortionAudioFX", + "DuplicateAudio", + "GainAudioFX", + "GenerateAudioSample", + "GenerateAudioWave", + "GetAudioFromFolderIndex", + "GetSingle", + "GetStringByIndex", + "HighShelfFilter", + "HighpassFilter", + "ImageToSpectral", + "InvertAudioFX", + "JoinAudio", + "LadderFilter", + "LimiterAudioFX", + "ListToBatch", + "LoadAudioDir", + "LoadAudioFile", + "LoadAudioModel (DD)", + "LoadVST3", + "LowShelfFilter", + "LowpassFilter", + "MP3CompressorAudioFX", + "MixAudioTensors", + "NoiseGateAudioFX", + "OTTAudioFX", + "PeakFilter", + "PhaserEffectAudioFX", + "PitchShiftAudioFX", + "PlotSpectrogram", + "PreviewAudioFile", + "PreviewAudioTensor", + "ResampleAudio", + "ReverbAudioFX", + "ReverseAudio", + "SaveAudioTensor", + "SequenceVariation", + "SliceAudio", + "SoundPlayer", + "StretchAudio", + "samplerate" + ], + { + "author": "jags111", + "description": "This extension offers various audio generation tools", + "nickname": "Audiotools", + "title": "Jags_Audiotools", + "title_aux": "Jags_Audiotools" + } + ], + "https://github.com/jags111/ComfyUI_Jags_VectorMagic": [ + [ + "CircularVAEDecode", + "JagsCLIPSeg", + "JagsClipseg", + "JagsCombineMasks", + "SVG", + "YoloSEGdetectionNode", + "YoloSegNode", + "color_drop", + "xy_Tiling_KSampler" + ], + { + "author": "jags111", + "description": "This extension offers various vector manipulation and generation tools", + "nickname": "Jags_VectorMagic", + "title": "Jags_VectorMagic", + "title_aux": "Jags_VectorMagic" + } + ], + "https://github.com/jags111/efficiency-nodes-comfyui": [ + [ + "AnimateDiff Script", + "Apply ControlNet Stack", + "Control Net Stacker", + "Eff. Loader SDXL", + "Efficient Loader", + "HighRes-Fix Script", + "Image Overlay", + "Join XY Inputs of Same Type", + "KSampler (Efficient)", + "KSampler Adv. (Efficient)", + "KSampler SDXL (Eff.)", + "LatentUpscaler", + "LoRA Stack to String converter", + "LoRA Stacker", + "Manual XY Entry Info", + "NNLatentUpscale", + "Noise Control Script", + "Pack SDXL Tuple", + "Tiled Upscaler Script", + "Unpack SDXL Tuple", + "XY Input: Add/Return Noise", + "XY Input: Aesthetic Score", + "XY Input: CFG Scale", + "XY Input: Checkpoint", + "XY Input: Clip Skip", + "XY Input: Control Net", + "XY Input: Control Net Plot", + "XY Input: Denoise", + "XY Input: LoRA", + "XY Input: LoRA Plot", + "XY Input: LoRA Stacks", + "XY Input: Manual XY Entry", + "XY Input: Prompt S/R", + "XY Input: Refiner On/Off", + "XY Input: Sampler/Scheduler", + "XY Input: Seeds++ Batch", + "XY Input: Steps", + "XY Input: VAE", + "XY Plot" + ], + { + "title_aux": "Efficiency Nodes for ComfyUI Version 2.0+" + } + ], + "https://github.com/jakechai/ComfyUI-JakeUpgrade": [ + [ + "Animation Prompt JK", + "Animation Value JK", + "Base Image Parameters Extract JK", + "Base Model Parameters Extract JK", + "Base Model Parameters JK", + "Base Model Pipe Extract JK", + "Base Model Pipe JK", + "CM_BoolBinaryOperation JK", + "CM_BoolToInt JK", + "CM_BoolUnaryOperation JK", + "CM_BreakoutVec2 JK", + "CM_BreakoutVec3 JK", + "CM_BreakoutVec4 JK", + "CM_ComposeVec2 JK", + "CM_ComposeVec3 JK", + "CM_ComposeVec4 JK", + "CM_FloatBinaryCondition JK", + "CM_FloatBinaryOperation JK", + "CM_FloatToInt JK", + "CM_FloatToNumber JK", + "CM_FloatUnaryCondition JK", + "CM_FloatUnaryOperation JK", + "CM_IntBinaryCondition JK", + "CM_IntBinaryOperation JK", + "CM_IntToBool JK", + "CM_IntToFloat JK", + "CM_IntToNumber JK", + "CM_IntUnaryCondition JK", + "CM_IntUnaryOperation JK", + "CM_NumberBinaryCondition JK", + "CM_NumberBinaryOperation JK", + "CM_NumberToFloat JK", + "CM_NumberToInt JK", + "CM_NumberUnaryCondition JK", + "CM_NumberUnaryOperation JK", + "CM_Vec2BinaryCondition JK", + "CM_Vec2BinaryOperation JK", + "CM_Vec2FloatOperation_JK", + "CM_Vec2ToFloatBinaryOperation JK", + "CM_Vec2ToFloatUnaryOperation JK", + "CM_Vec2UnaryCondition JK", + "CM_Vec2UnaryOperation JK", + "CM_Vec3BinaryCondition JK", + "CM_Vec3BinaryOperation JK", + "CM_Vec3FloatOperation_JK", + "CM_Vec3ToFloatBinaryOperation JK", + "CM_Vec3ToFloatUnaryOperation JK", + "CM_Vec3UnaryCondition JK", + "CM_Vec3UnaryOperation JK", + "CM_Vec4BinaryCondition JK", + "CM_Vec4BinaryOperation JK", + "CM_Vec4FloatOperation_JK", + "CM_Vec4ToFloatBinaryOperation JK", + "CM_Vec4ToFloatUnaryOperation JK", + "CM_Vec4UnaryCondition JK", + "CM_Vec4UnaryOperation JK", + "CR Apply ControlNet JK", + "CR Apply Multi-ControlNet JK", + "CR Boolean JK", + "CR Clip Input Switch JK", + "CR Conditioning Input Switch JK", + "CR ControlNet Input Switch JK", + "CR Float Input Switch JK", + "CR Image Input Switch JK", + "CR Impact Pipe Input Switch JK", + "CR Int Input Switch JK", + "CR Latent Input Switch JK", + "CR LoRA Stack JK", + "CR Load LoRA JK", + "CR Mask Input Switch JK", + "CR Model Input Switch JK", + "CR Multi-ControlNet Stack JK", + "CR Pipe Input Switch JK", + "CR SD1.5 Aspect Ratio JK", + "CR SDXL Aspect Ratio JK", + "CR Switch Model and CLIP JK", + "CR Text Input Switch JK", + "CR VAE Input Switch JK", + "Ckpt Loader JK", + "Detailer Parameters JK", + "Embedding Picker JK", + "Embedding Picker Multi JK", + "Evaluate Examples JK", + "Evaluate Floats JK", + "Evaluate Ints JK", + "Evaluate Strings JK", + "HintImageEnchance JK", + "Image Upscale Parameters Extract JK", + "Ksampler Parameters JK", + "Latent Upscale Parameters Extract JK", + "Load Image With Metadata JK", + "Metadata Pipe Extract JK", + "Metadata Pipe JK", + "NodesState JK", + "Noise Injection Parameters JK", + "Orbit Poses JK", + "Pipe End JK", + "Project Setting JK", + "Refine 1 Parameters Extract JK", + "Refine 2 Parameters Extract JK", + "Refine Model Parameters JK", + "Refine Pipe Extract JK", + "Refine Pipe JK", + "Reroute Ckpt JK", + "Reroute List JK", + "Reroute Resize JK", + "Reroute Sampler JK", + "Reroute Upscale JK", + "Reroute Vae JK", + "SDXLPromptStylerAll", + "SDXLPromptStylerHorror", + "SDXLPromptStylerMisc", + "SDXLPromptStylerbyArtist", + "SDXLPromptStylerbyCamera", + "SDXLPromptStylerbyComposition", + "SDXLPromptStylerbyCyberpunkSurrealism", + "SDXLPromptStylerbyDepth", + "SDXLPromptStylerbyDiva", + "SDXLPromptStylerbyEnvironment", + "SDXLPromptStylerbyFantasySetting", + "SDXLPromptStylerbyFilter", + "SDXLPromptStylerbyFocus", + "SDXLPromptStylerbyFooocus", + "SDXLPromptStylerbyImpressionism", + "SDXLPromptStylerbyLighting", + "SDXLPromptStylerbyMarc", + "SDXLPromptStylerbyMileHigh", + "SDXLPromptStylerbyMood", + "SDXLPromptStylerbyMre", + "SDXLPromptStylerbyMythicalCreature", + "SDXLPromptStylerbyOriginal", + "SDXLPromptStylerbyQuantumRealism", + "SDXLPromptStylerbySai", + "SDXLPromptStylerbySteamPunkRealism", + "SDXLPromptStylerbySubject", + "SDXLPromptStylerbySurrealism", + "SDXLPromptStylerbyTheme", + "SDXLPromptStylerbyTimeofDay", + "SDXLPromptStylerbyTwri", + "SDXLPromptStylerbyWyvern", + "SDXLPromptbyCelticArt", + "SDXLPromptbyContemporaryNordicArt", + "SDXLPromptbyFashionArt", + "SDXLPromptbyGothicRevival", + "SDXLPromptbyIrishFolkArt", + "SDXLPromptbyRomanticNationalismArt", + "SDXLPromptbySportsArt", + "SDXLPromptbyStreetArt", + "SDXLPromptbyVikingArt", + "SDXLPromptbyWildlifeArt", + "Sampler Loader JK", + "Save Image with Metadata Flow JK", + "Save Image with Metadata JK", + "Upscale Model Loader JK", + "Upscale Model Parameters Extract JK", + "Upscale Model Parameters JK", + "Vae Loader JK" + ], + { + "title_aux": "ComfyUI-JakeUpgrade" + } + ], + "https://github.com/jamal-alkharrat/ComfyUI_rotate_image": [ + [ + "RotateImage" + ], + { + "title_aux": "ComfyUI_rotate_image" + } + ], + "https://github.com/jamesWalker55/comfyui-p2ldgan": [ + [ + "P2LDGAN" + ], + { + "title_aux": "ComfyUI - P2LDGAN Node" + } + ], + "https://github.com/jamesWalker55/comfyui-various": [ + [ + "BatchLoadImage", + "BatchSaveImage", + "GroupInfoExtractFloat", + "GroupInfoExtractInt", + "GroupLoadBatchImages", + "GroupLoadImage", + "JWDatetimeString", + "JWImageBatchCount", + "JWImageContrast", + "JWImageExtractFromBatch", + "JWImageFlip", + "JWImageLevels", + "JWImageLoadRGB", + "JWImageLoadRGBA", + "JWImageLoadRGBIfExists", + "JWImageMix", + "JWImageResize", + "JWImageResizeByFactor", + "JWImageResizeByLongerSide", + "JWImageResizeByShorterSide", + "JWImageResizeToSquare", + "JWImageSaturation", + "JWImageSaveToPath", + "JWImageSequenceExtractFromBatch", + "JWImageStackChannels", + "JWInfoHashExtractFloat", + "JWInfoHashExtractInteger", + "JWInfoHashExtractString", + "JWInfoHashFromInfoHashList", + "JWInfoHashFromRangedInfo", + "JWInfoHashListExtractStringList", + "JWInfoHashListFromRangedInfo", + "JWInfoHashPrint", + "JWLoadImageSequence", + "JWLoadImagesFromString", + "JWLoopImageSequence", + "JWMaskLikeImageSize", + "JWMaskResize", + "JWMaskSequenceApplyToLatent", + "JWMaskSequenceFromMask", + "JWMaskSequenceJoin", + "JWPrintFloat", + "JWPrintImage", + "JWPrintInteger", + "JWPrintLatent", + "JWPrintMask", + "JWPrintString", + "JWRangedInfoCalculateSubBatch", + "JWReferenceOnly", + "JWSaveImageSequence", + "JWStringListCLIPEncode", + "JWStringListFromString", + "JWStringListFromStrings", + "JWStringListJoin", + "JWStringListRepeat", + "JWStringListToFormatedString", + "JWStringListToString", + "JWUncropCrop", + "JWUncropNewRect", + "JWUncropUncrop", + "JamesLoadImageGroup", + "RAFTEstimate", + "RAFTFlowToImage", + "RAFTLoadFlowFromEXRChannels", + "RCReceiveFloat", + "RCReceiveFloatList", + "RCReceiveInt", + "RCReceiveIntList", + "RCReceiveLatent", + "RCSendLatent" + ], + { + "nodename_pattern": "^JW", + "title_aux": "Various ComfyUI Nodes by Type" + } + ], + "https://github.com/jax-explorer/fast_video_comfyui": [ + [ + "FastImageListToImageBatch" + ], + { + "title_aux": "fast_video_comfyui" + } + ], + "https://github.com/jeffy5/comfyui-faceless-node": [ + [ + "FacelessFaceRestore", + "FacelessFaceSwap", + "FacelessLoadFrames", + "FacelessLoadImageUrl", + "FacelessLoadVideo", + "FacelessLoadVideoUrl", + "FacelessMergeVideos", + "FacelessRemoveBackground", + "FacelessSaveVideo", + "FacelessUploadVideo", + "FacelessVideoFaceRestore", + "FacelessVideoFaceSwap", + "FacelessVideoRemoveBackground" + ], + { + "title_aux": "Faceless Node for ComfyUI" + } + ], + "https://github.com/jesenzhang/ComfyUI_StreamDiffusion": [ + [ + "StreamDiffusion_Loader", + "StreamDiffusion_Sampler" + ], + { + "title_aux": "ComfyUI_StreamDiffusion" + } + ], + "https://github.com/jiaxiangc/ComfyUI-ResAdapter": [ + [ + "ResAdapterLoader" + ], + { + "title_aux": "ResAdapter for ComfyUI" + } + ], + "https://github.com/jitcoder/lora-info": [ + [ + "ImageFromURL", + "LoraInfo" + ], + { + "title_aux": "LoraInfo" + } + ], + "https://github.com/jjkramhoeft/ComfyUI-Jjk-Nodes": [ + [ + "JjkConcat", + "JjkShowText", + "JjkText", + "SDXLRecommendedImageSize" + ], + { + "title_aux": "ComfyUI-Jjk-Nodes" + } + ], + "https://github.com/jkrauss82/ultools-comfyui": [ + [ + "CLIPTextEncodeWithStats", + "OpenPoseEditorAdv", + "SaveImgAdv", + "SolidMaskAdv" + ], + { + "title_aux": "ULTools for ComfyUI" + } + ], + "https://github.com/jojkaart/ComfyUI-sampler-lcm-alternative": [ + [ + "LCMScheduler", + "SamplerLCMAlternative", + "SamplerLCMCycle", + "SamplerLCMDualNoise" + ], + { + "title_aux": "ComfyUI-sampler-lcm-alternative" + } + ], + "https://github.com/jordoh/ComfyUI-Deepface": [ + [ + "DeepfaceExtractFaces", + "DeepfaceVerify" + ], + { + "title_aux": "ComfyUI Deepface" + } + ], + "https://github.com/jroc22/ComfyUI-CSV-prompt-builder": [ + [ + "BuildPromptFromCSV" + ], + { + "title_aux": "ComfyUI-CSV-prompt-builder" + } + ], + "https://github.com/jtrue/ComfyUI-JaRue": [ + [ + "Text2Image_jru", + "YouTube2Prompt_jru" + ], + { + "nodename_pattern": "_jru$", + "title_aux": "ComfyUI-JaRue" + } + ], + "https://github.com/jtydhr88/ComfyUI-LayerDivider": [ + [ + "LayerDivider - Color Base", + "LayerDivider - Divide Layer", + "LayerDivider - Load SAM Mask Generator", + "LayerDivider - Segment Mask" + ], + { + "title_aux": "ComfyUI LayerDivider" + } + ], + "https://github.com/jtydhr88/ComfyUI-Unique3D": [ + [ + "Unique3DLoadPipeline", + "Unique3DRun - Geo Reconstruct", + "Unique3DRun - MVPrediction" + ], + { + "title_aux": "ComfyUI Unique3D" + } + ], + "https://github.com/ka-puna/comfyui-yanc": [ + [ + "YANC.ConcatStrings", + "YANC.FormatDatetimeString", + "YANC.GetWidgetValueString", + "YANC.IntegerCaster", + "YANC.MultilineString", + "YANC.TruncateString" + ], + { + "title_aux": "comfyui-yanc" + } + ], + "https://github.com/kaanyalova/ComfyUI_ExtendedImageFormats": [ + [ + "ExtendedSaveImage" + ], + { + "title_aux": "Extended Image Formats for ComfyUI" + } + ], + "https://github.com/kadirnar/ComfyUI-Transformers": [ + [ + "DepthEstimationInference", + "ImageClassificationPipeline", + "ImageSegmentationPipeline", + "LoadDepthModel", + "ObjectDetectionPipeline" + ], + { + "title_aux": "ComfyUI-Transformers" + } + ], + "https://github.com/kadirnar/ComfyUI-YOLO": [ + [ + "BBoxToCoco", + "BBoxToXYWH", + "BBoxVisNode", + "CocoToNumber", + "ConvertToDict", + "CustomUltralyticsModelLoader", + "GetImageSize", + "ImageResizeAdvanced", + "UltralyticsInference", + "UltralyticsModelLoader", + "UltralyticsVisualization", + "ViewText" + ], + { + "title_aux": "ComfyUI-YOLO" + } + ], + "https://github.com/kale4eat/ComfyUI-path-util": [ + [ + "path_util_PathAbspath", + "path_util_PathBasename", + "path_util_PathDirname", + "path_util_PathExists", + "path_util_PathIsdir", + "path_util_PathIsfile", + "path_util_PathJoin", + "path_util_PathRelpath", + "path_util_PathSplitext" + ], + { + "title_aux": "ComfyUI_demucus" + } + ], + "https://github.com/kale4eat/ComfyUI-speech-dataset-toolkit": [ + [ + "SDT_AudioProperty", + "SDT_ConcatAudio", + "SDT_CutAudio", + "SDT_DemucsApply", + "SDT_DemucsLoader", + "SDT_FasterWhisperListSegments", + "SDT_FasterWhisperLoader", + "SDT_FasterWhisperSegmentProperty", + "SDT_FasterWhisperTextFromSegments", + "SDT_FasterWhisperTranscribe", + "SDT_GriffinLim", + "SDT_JoinAudio", + "SDT_KotobaWhisperListSegments", + "SDT_KotobaWhisperLoaderLong", + "SDT_KotobaWhisperLoaderShort", + "SDT_KotobaWhisperSegmentProperty", + "SDT_KotobaWhisperTranscribeLong", + "SDT_KotobaWhisperTranscribeShort", + "SDT_LFCC", + "SDT_LoadAudio", + "SDT_LoadAudios", + "SDT_MFCC", + "SDT_MakeSilenceAudio", + "SDT_MelSpectrogram", + "SDT_NemoAsrListSegments", + "SDT_NemoAsrListSubwords", + "SDT_NemoAsrLoader", + "SDT_NemoAsrSegmentProperty", + "SDT_NemoAsrSubwordProperty", + "SDT_NemoAsrTranscribe", + "SDT_NueAsrLoader", + "SDT_NueAsrTranscribe", + "SDT_PlayAudio", + "SDT_PlotMelFilterBank", + "SDT_PlotPitch", + "SDT_PlotSpecgram", + "SDT_PlotSpectrogram", + "SDT_PlotWaveForm", + "SDT_ResampleAudio", + "SDT_SaveAudio", + "SDT_SaveAudioWithSequentialNumbering", + "SDT_SilenceAudio", + "SDT_SileroVADApply", + "SDT_SileroVADCollectChunks", + "SDT_SileroVADListTimestamps", + "SDT_SileroVADLoader", + "SDT_SileroVADTimestampProperty", + "SDT_Spectrogram", + "SDT_SpeechMOSLoader", + "SDT_SpeechMOSScore", + "SDT_SplitAudio", + "SDT_TrimAudio", + "SDT_TrimAudioBySample" + ], + { + "title_aux": "ComfyUI-speech-dataset-toolkit" + } + ], + "https://github.com/kale4eat/ComfyUI-string-util": [ + [ + "string_util_Str", + "string_util_StrConcat", + "string_util_StrCount", + "string_util_StrEndsWith", + "string_util_StrEqual", + "string_util_StrFind", + "string_util_StrFormat", + "string_util_StrJoin", + "string_util_StrLen", + "string_util_StrLower", + "string_util_StrLstrip", + "string_util_StrNotEqual", + "string_util_StrReplace", + "string_util_StrRstrip", + "string_util_StrSlice", + "string_util_StrSplit", + "string_util_StrStartsWith", + "string_util_StrStrip", + "string_util_StrUpper" + ], + { + "title_aux": "ComfyUI-string-util" + } + ], + "https://github.com/kale4eat/ComfyUI-text-file-util": [ + [ + "text_file_util_ReadAllLines", + "text_file_util_ReadAllText", + "text_file_util_WriteText", + "text_file_util_WriteTextLines", + "text_file_util_WriteTextWithSequentialNumbering" + ], + { + "title_aux": "ComfyUI-text-file-util" + } + ], + "https://github.com/katalist-ai/comfyUI-nsfw-detection": [ + [ + "NudenetDetector" + ], + { + "title_aux": "comfyUI-nsfw-detection" + } + ], + "https://github.com/kealiu/ComfyUI-S3-Tools": [ + [ + "Load Image From S3", + "Save Image To S3" + ], + { + "title_aux": "ComfyUI Load and Save file to S3" + } + ], + "https://github.com/kealiu/ComfyUI-Zero123-Porting": [ + [ + "Zero123: Image Preprocess", + "Zero123: Image Rotate in 3D" + ], + { + "title_aux": "ComfyUI-Zero123-Porting" + } + ], + "https://github.com/kealiu/ComfyUI-ZeroShot-MTrans": [ + [ + "ZeST: Grayout Subject" + ], + { + "title_aux": "ComfyUI-ZeroShot-MTrans" + } + ], + "https://github.com/kenjiqq/qq-nodes-comfyui": [ + [ + "Any List", + "Any List Iterator", + "Any To Any", + "Axis Pack", + "Axis To Any", + "Axis Unpack", + "Image Accumulator End", + "Image Accumulator Start", + "Load Lines From Text File", + "Slice List", + "Text Splitter", + "XY Grid Helper" + ], + { + "title_aux": "qq-nodes-comfyui" + } + ], + "https://github.com/kft334/Knodes": [ + [ + "Image(s) To Websocket (Base64)", + "ImageOutput", + "Load Image (Base64)", + "Load Images (Base64)" + ], + { + "title_aux": "Knodes" + } + ], + "https://github.com/kijai/ComfyUI-ADMotionDirector": [ + [ + "ADMD_AdditionalModelSelect", + "ADMD_CheckpointLoader", + "ADMD_ComfyModelLoader", + "ADMD_DiffusersLoader", + "ADMD_InitializeTraining", + "ADMD_LoadLora", + "ADMD_MakeBatchList", + "ADMD_SaveLora", + "ADMD_TrainLora", + "ADMD_ValidationSampler", + "ADMD_ValidationSettings" + ], + { + "title_aux": "Animatediff MotionLoRA Trainer" + } + ], + "https://github.com/kijai/ComfyUI-APISR-KJ": [ + [ + "APISR_upscale" + ], + { + "title_aux": "ComfyUI-APISR" + } + ], + "https://github.com/kijai/ComfyUI-BrushNet-Wrapper": [ + [ + "brushnet_ella_loader", + "brushnet_ipadapter_matteo", + "brushnet_model_loader", + "brushnet_sampler", + "brushnet_sampler_ella", + "powerpaint_brushnet_sampler" + ], + { + "title_aux": "ComfyUI-BrushNet-Wrapper" + } + ], + "https://github.com/kijai/ComfyUI-CCSR": [ + [ + "CCSR_Model_Select", + "CCSR_Upscale", + "DownloadAndLoadCCSRModel" + ], + { + "title_aux": "ComfyUI-CCSR" + } + ], + "https://github.com/kijai/ComfyUI-DDColor": [ + [ + "DDColor_Colorize" + ], + { + "title_aux": "ComfyUI-DDColor" + } + ], + "https://github.com/kijai/ComfyUI-DepthAnythingV2": [ + [ + "DepthAnything_V2", + "DownloadAndLoadDepthAnythingV2Model" + ], + { + "title_aux": "ComfyUI-DepthAnythingV2" + } + ], + "https://github.com/kijai/ComfyUI-DiffusionLight": [ + [ + "chrome_ball_to_envmap", + "exposure_to_hdr" + ], + { + "title_aux": "DiffusionLight implementation for ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-DynamiCrafterWrapper": [ + [ + "DownloadAndLoadCLIPModel", + "DownloadAndLoadCLIPVisionModel", + "DownloadAndLoadDynamiCrafterModel", + "DynamiCrafterBatchInterpolation", + "DynamiCrafterI2V", + "DynamiCrafterLoadInitNoise", + "DynamiCrafterModelLoader", + "ToonCrafterDecode", + "ToonCrafterInterpolation" + ], + { + "title_aux": "ComfyUI-DynamiCrafterWrapper" + } + ], + "https://github.com/kijai/ComfyUI-ELLA-wrapper": [ + [ + "diffusers_model_loader", + "diffusers_sampler", + "ella_model_loader", + "ella_sampler", + "ella_t5_embeds" + ], + { + "title_aux": "ComfyUI-ELLA-wrapper" + } + ], + "https://github.com/kijai/ComfyUI-Florence2": [ + [ + "DownloadAndLoadFlorence2Model", + "Florence2Run" + ], + { + "title_aux": "ComfyUI-Florence2" + } + ], + "https://github.com/kijai/ComfyUI-Geowizard": [ + [ + "geowizard_model_loader", + "geowizard_sampler" + ], + { + "title_aux": "Geowizard depth and normal estimation in ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-IC-Light": [ + [ + "BackgroundScaler", + "CalculateNormalsFromImages", + "DetailTransfer", + "ICLightConditioning", + "LightSource", + "LoadAndApplyICLightUnet", + "LoadHDRImage" + ], + { + "title_aux": "ComfyUI-IC-Light" + } + ], + "https://github.com/kijai/ComfyUI-KJNodes": [ + [ + "AddLabel", + "AppendInstanceDiffusionTracking", + "BatchCLIPSeg", + "BatchCropFromMask", + "BatchCropFromMaskAdvanced", + "BatchUncrop", + "BatchUncropAdvanced", + "BboxToInt", + "BboxVisualize", + "CameraPoseVisualizer", + "CheckpointPerturbWeights", + "ColorMatch", + "ColorToMask", + "CondPassThrough", + "ConditioningMultiCombine", + "ConditioningSetMaskAndCombine", + "ConditioningSetMaskAndCombine3", + "ConditioningSetMaskAndCombine4", + "ConditioningSetMaskAndCombine5", + "CreateAudioMask", + "CreateFadeMask", + "CreateFadeMaskAdvanced", + "CreateFluidMask", + "CreateGradientFromCoords", + "CreateGradientMask", + "CreateInstanceDiffusionTracking", + "CreateMagicMask", + "CreateShapeImageOnPath", + "CreateShapeMask", + "CreateShapeMaskOnPath", + "CreateTextMask", + "CreateTextOnPath", + "CreateVoronoiMask", + "CrossFadeImages", + "CustomSigmas", + "DownloadAndLoadCLIPSeg", + "DrawInstanceDiffusionTracking", + "DummyLatentOut", + "EmptyLatentImagePresets", + "FilterZeroMasksAndCorrespondingImages", + "FlipSigmasAdjusted", + "FloatConstant", + "FloatToMask", + "FloatToSigmas", + "GLIGENTextBoxApplyBatchCoords", + "GenerateNoise", + "GetImageRangeFromBatch", + "GetImageSizeAndCount", + "GetImagesFromBatchIndexed", + "GetLatentsFromBatchIndexed", + "GetMaskSizeAndCount", + "GradientToFloat", + "GrowMaskWithBlur", + "INTConstant", + "ImageAddMulti", + "ImageAndMaskPreview", + "ImageBatchMulti", + "ImageBatchRepeatInterleaving", + "ImageBatchTestPattern", + "ImageConcanate", + "ImageConcatMulti", + "ImageGrabPIL", + "ImageGridComposite2x2", + "ImageGridComposite3x3", + "ImageNormalize_Neg1_To_1", + "ImagePadForOutpaintMasked", + "ImagePadForOutpaintTargetSize", + "ImagePass", + "ImageResizeKJ", + "ImageTransformByNormalizedAmplitude", + "ImageUpscaleWithModelBatched", + "InjectNoiseToLatent", + "InsertImageBatchByIndexes", + "InsertImagesToBatchIndexed", + "InterpolateCoords", + "Intrinsic_lora_sampling", + "JoinStringMulti", + "JoinStrings", + "LoadAndResizeImage", + "LoadResAdapterNormalization", + "MaskBatchMulti", + "MaskOrImageToWeight", + "MergeImageChannels", + "ModelPassThrough", + "NormalizedAmplitudeToFloatList", + "NormalizedAmplitudeToMask", + "OffsetMask", + "OffsetMaskByNormalizedAmplitude", + "PlotCoordinates", + "PreviewAnimation", + "RemapImageRange", + "RemapMaskRange", + "ReplaceImagesInBatch", + "ResizeMask", + "ReverseImageBatch", + "RoundMask", + "SV3D_BatchSchedule", + "SaveImageWithAlpha", + "ScaleBatchPromptSchedule", + "Sleep", + "SomethingToString", + "SoundReactive", + "SplineEditor", + "SplitBboxes", + "SplitImageChannels", + "StabilityAPI_SD3", + "StableZero123_BatchSchedule", + "StringConstant", + "StringConstantMultiline", + "Superprompt", + "VRAM_Debug", + "WeightScheduleConvert", + "WeightScheduleExtend", + "WidgetToString" + ], + { + "title_aux": "KJNodes for ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-KwaiKolorsWrapper": [ + [ + "DownloadAndLoadChatGLM3", + "DownloadAndLoadKolorsModel", + "KolorsSampler", + "KolorsTextEncode", + "LoadChatGLM3" + ], + { + "title_aux": "ComfyUI-KwaiKolorsWrapper" + } + ], + "https://github.com/kijai/ComfyUI-LaVi-Bridge-Wrapper": [ + [ + "lavi_bridge_llama_encoder", + "lavi_bridge_t5_encoder", + "lavibridge_model_loader", + "lavibridge_sampler" + ], + { + "title_aux": "ComfyUI-LaVi-Bridge-Wrapper" + } + ], + "https://github.com/kijai/ComfyUI-LivePortraitKJ": [ + [ + "DownloadAndLoadLivePortraitModels", + "LivePortraitProcess" + ], + { + "title_aux": "ComfyUI-LivePortraitKJ" + } + ], + "https://github.com/kijai/ComfyUI-LuminaWrapper": [ + [ + "DownloadAndLoadGemmaModel", + "DownloadAndLoadLuminaModel", + "GemmaSampler", + "LuminaGemmaTextEncode", + "LuminaGemmaTextEncodeArea", + "LuminaT2ISampler", + "LuminaTextAreaAppend" + ], + { + "title_aux": "ComfyUI-LuminaWrapper" + } + ], + "https://github.com/kijai/ComfyUI-Marigold": [ + [ + "ColorizeDepthmap", + "MarigoldDepthEstimation", + "MarigoldDepthEstimationVideo", + "MarigoldDepthEstimation_v2", + "MarigoldDepthEstimation_v2_video", + "MarigoldModelLoader", + "RemapDepth", + "SaveImageOpenEXR" + ], + { + "title_aux": "Marigold depth estimation in ComfyUI" + } + ], + "https://github.com/kijai/ComfyUI-MimicMotionWrapper": [ + [ + "DiffusersScheduler", + "DownloadAndLoadMimicMotionModel", + "MimicMotionDecode", + "MimicMotionGetPoses", + "MimicMotionSampler" + ], + { + "title_aux": "ComfyUI-MimicMotionWrapper" + } + ], + "https://github.com/kijai/ComfyUI-OpenDiTWrapper": [ + [ + "DownloadAndLoadOpenDiTT5Model", + "DownloadAndLoadOpenSoraModel", + "DownloadAndLoadOpenSoraVAE", + "OpenDiTConditioning", + "OpenDiTSampler", + "OpenSoraDecode", + "OpenSoraEncodeReference" + ], + { + "title_aux": "ComfyUI-OpenDiTWrapper" + } + ], + "https://github.com/kijai/ComfyUI-SUPIR": [ + [ + "SUPIR_Upscale", + "SUPIR_conditioner", + "SUPIR_decode", + "SUPIR_encode", + "SUPIR_first_stage", + "SUPIR_model_loader", + "SUPIR_model_loader_v2", + "SUPIR_model_loader_v2_clip", + "SUPIR_sample", + "SUPIR_tiles" + ], + { + "title_aux": "ComfyUI-SUPIR" + } + ], + "https://github.com/kijai/ComfyUI-depth-fm": [ + [ + "Depth_fm" + ], + { + "title_aux": "ComfyUI-depth-fm" + } + ], + "https://github.com/kijai/ComfyUI-moondream": [ + [ + "MoondreamQuery", + "MoondreamQueryCaptions" + ], + { + "title_aux": "ComfyUI-moondream" + } + ], + "https://github.com/kinfolk0117/ComfyUI_GradientDeepShrink": [ + [ + "GradientPatchModelAddDownscale", + "GradientPatchModelAddDownscaleAdvanced" + ], + { + "title_aux": "ComfyUI_GradientDeepShrink" + } + ], + "https://github.com/kinfolk0117/ComfyUI_Pilgram": [ + [ + "Pilgram" + ], + { + "title_aux": "ComfyUI_Pilgram" + } + ], + "https://github.com/kinfolk0117/ComfyUI_SimpleTiles": [ + [ + "DynamicTileMerge", + "DynamicTileSplit", + "TileCalc", + "TileMerge", + "TileSplit" + ], + { + "title_aux": "SimpleTiles" + } + ], + "https://github.com/klinter007/klinter_nodes": [ + [ + "Filter", + "Florence2Captions2IPA", + "PresentString", + "SingleString", + "SizeSelector", + "YellowBus", + "concat" + ], + { + "title_aux": "Klinter_nodes" + } + ], + "https://github.com/knuknX/ComfyUI-Image-Tools": [ + [ + "BatchImagePathLoader", + "ImageBgRemoveProcessor", + "ImageCheveretoUploader", + "ImageStandardResizeProcessor", + "JSONMessageNotifyTool", + "PreviewJSONNode", + "SingleImagePathLoader", + "SingleImageUrlLoader" + ], + { + "title_aux": "ComfyUI-Image-Tools" + } + ], + "https://github.com/kohya-ss/ControlNet-LLLite-ComfyUI": [ + [ + "LLLiteLoader" + ], + { + "title_aux": "ControlNet-LLLite-ComfyUI" + } + ], + "https://github.com/komojini/ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes": [ + [ + "S3 Bucket LoRA", + "S3Bucket_Load_LoRA", + "XL DreamBooth LoRA", + "XLDB_LoRA" + ], + { + "title_aux": "ComfyUI_SDXL_DreamBooth_LoRA_CustomNodes" + } + ], + "https://github.com/komojini/komojini-comfyui-nodes": [ + [ + "BatchCreativeInterpolationNodeDynamicSettings", + "CachedGetter", + "DragNUWAImageCanvas", + "FlowBuilder", + "FlowBuilder (adv)", + "FlowBuilder (advanced)", + "FlowBuilder (advanced) Setter", + "FlowBuilderSetter", + "FlowBuilderSetter (adv)", + "Getter", + "ImageCropByRatio", + "ImageCropByRatioAndResize", + "ImageGetter", + "ImageMerger", + "ImagesCropByRatioAndResizeBatch", + "KSamplerAdvancedCacheable", + "KSamplerCacheable", + "Setter", + "UltimateVideoLoader", + "UltimateVideoLoader (simple)", + "YouTubeVideoLoader" + ], + { + "title_aux": "komojini-comfyui-nodes" + } + ], + "https://github.com/kunieone/ComfyUI_alkaid": [ + [ + "A_EmptyLatentImageLongside", + "A_Face3DSwapper", + "A_FaceCrop", + "A_FacePaste", + "A_GetImageSize", + "A_OpenPosePreprocessor", + "AdapterFace", + "AdapterFaceLoader", + "AdapterStyle", + "AdapterStyleLoader", + "AlkaidLoader", + "ApplyAdapter", + "ApplyControlNet_KPS", + "CombineAdapterPatch", + "KSamplerHires" + ], + { + "title_aux": "ComfyUI_alkaid" + } + ], + "https://github.com/kwaroran/abg-comfyui": [ + [ + "Remove Image Background (abg)" + ], + { + "title_aux": "abg-comfyui" + } + ], + "https://github.com/l20richo/ComfyUI-Azure-Blob-Storage": [ + [ + "DownloadFileBLOB", + "LoadImageBLOB", + "SaveImageBLOB", + "SaveVideoFilesBLOB", + "UploadFileBLOB" + ], + { + "title_aux": "ComfyUI-Azure-Blob-Storage" + } + ], + "https://github.com/laksjdjf/Batch-Condition-ComfyUI": [ + [ + "Batch String", + "CLIP Text Encode (Batch)", + "String Input" + ], + { + "title_aux": "Batch-Condition-ComfyUI" + } + ], + "https://github.com/laksjdjf/LCMSampler-ComfyUI": [ + [ + "SamplerLCM", + "TAESDLoader" + ], + { + "title_aux": "LCMSampler-ComfyUI" + } + ], + "https://github.com/laksjdjf/LoRTnoC-ComfyUI": [ + [ + "LortnocLoader" + ], + { + "title_aux": "LoRTnoC-ComfyUI" + } + ], + "https://github.com/laksjdjf/cd-tuner_negpip-ComfyUI": [ + [ + "CDTuner", + "Negapip", + "Negpip" + ], + { + "title_aux": "cd-tuner_negpip-ComfyUI" + } + ], + "https://github.com/laksjdjf/cgem156-ComfyUI": [ + [ + "GradualLatentSampler", + "LCMSamplerRCFG", + "LoadAestheticShadow", + "PredictAesthetic", + "TCDSampler", + "TextScheduler" + ], + { + "title_aux": "cgem156-ComfyUI\ud83c\udf4c" + } + ], + "https://github.com/laksjdjf/pfg-ComfyUI": [ + [ + "PFG" + ], + { + "title_aux": "pfg-ComfyUI" + } + ], + "https://github.com/larsupb/LoRA-Merger-ComfyUI": [ + [ + "PM LoRA Apply", + "PM LoRA Loader", + "PM LoRA Merger", + "PM LoRA Resizer", + "PM LoRA SVD Merger", + "PM LoRA Save", + "XY: PM LoRA Modes", + "XY: PM LoRA SVD Rank", + "XY: PM LoRA Strengths" + ], + { + "title_aux": "LoRA Power-Merger ComfyUI" + } + ], + "https://github.com/latenightlabs/ComfyUI-LNL": [ + [ + "LNL_FrameSelector", + "LNL_FrameSelectorV2", + "LNL_FrameSelectorV3" + ], + { + "title_aux": "LNL Frame Selector" + } + ], + "https://github.com/leiweiqiang/ComfyUI-TRA": [ + [ + "TclEbSynth", + "TclEbSynthBatch", + "TclExtractFramesFromVideo", + "TclExtractFramesFromVideoFile", + "TclFrames2Video", + "TclSaveVideoFromFrames", + "TclYoloV8Segmentation", + "TclYoloV9Segmentation" + ], + { + "title_aux": "ComfyUI-TRA" + } + ], + "https://github.com/leoleelxh/ComfyUI-LLMs": [ + [ + "\ud83d\uddbc\ufe0f LLMs_Vison_Ali", + "\ud83d\uddbc\ufe0f LLMs_Vison_GLM4", + "\ud83d\uddbc\ufe0f LLMs_Vison_Gemini", + "\ud83d\ude00 LLMs_Chat", + "\ud83d\ude00 LLMs_Chat_GLM4_Only" + ], + { + "title_aux": "ComfyUI-LLMs" + } + ], + "https://github.com/linshier/comfyui-remote-tools": [ + [ + "LoadBase64(js)", + "LoadBase64FromRemote", + "SendBase64ToRemote" + ], + { + "title_aux": "comfyui-remote-tools" + } + ], + "https://github.com/liusida/ComfyUI-AutoCropFaces": [ + [ + "AutoCropFaces" + ], + { + "title_aux": "ComfyUI-AutoCropFaces" + } + ], + "https://github.com/liusida/ComfyUI-B-LoRA": [ + [ + "LoadBLoRA" + ], + { + "title_aux": "ComfyUI-B-LoRA" + } + ], + "https://github.com/liusida/ComfyUI-Debug": [ + [ + "DebugInspectorNode", + "DebugModelInspectorNode", + "DebugModelPrintOutNode" + ], + { + "title_aux": "ComfyUI-Debug" + } + ], + "https://github.com/liusida/ComfyUI-Login": [ + [ + "LoadImageIncognito" + ], + { + "title_aux": "ComfyUI-Login" + } + ], + "https://github.com/liusida/ComfyUI-SD3-nodes": [ + [ + "SD3EmptyLatent", + "SD3LoadCLIPs", + "SD3LoadCheckpoint" + ], + { + "title_aux": "ComfyUI-SD3-nodes" + } + ], + "https://github.com/ljleb/comfy-mecha": [ + [ + "Blocks Mecha Hyper", + "Float Mecha Hyper", + "Lora Mecha Recipe", + "Mecha Deserializer", + "Mecha Merger", + "Mecha Recipe List", + "Mecha Serializer", + "Model Mecha Recipe" + ], + { + "title_aux": "Mecha Merge Node Pack" + } + ], + "https://github.com/lks-ai/ComfyUI-StableAudioSampler": [ + [ + "StableAudioConditioning", + "StableAudioLoadModel", + "StableAudioPrompt", + "StableAudioSampler" + ], + { + "author": "lks-ai", + "description": "A Simple integration of Stable Audio Diffusion with knobs and stuff!", + "nickname": "stableaudio", + "title": "StableAudioSampler", + "title_aux": "ComfyUI Stable Audio Open 1.0 Sampler" + } + ], + "https://github.com/lks-ai/anynode": [ + [ + "AnyNode", + "AnyNodeAnthropic", + "AnyNodeCodeViewer", + "AnyNodeExport", + "AnyNodeGemini", + "AnyNodeLocal" + ], + { + "author": "newsbubbles", + "description": "This single node uses an LLM to generate a functionality based on your request. You can make the node do anything.", + "nickname": "AnyNode", + "title": "AnyNode v0.1.1", + "title_aux": "ComfyUI AnyNode: Any Node you ask for" + } + ], + "https://github.com/lldacing/comfyui-easyapi-nodes": [ + [ + "Base64ToImage", + "Base64ToMask", + "ColorPicker", + "GetImageBatchSize", + "ImageEqual", + "ImageToBase64", + "ImageToBase64Advanced", + "InsightFaceBBOXDetect", + "IntToList", + "IntToNumber", + "JoinList", + "ListMerge", + "LoadImageFromURL", + "LoadImageToBase64", + "LoadMaskFromURL", + "MaskImageToBase64", + "MaskToBase64", + "MaskToBase64Image", + "SDBaseVerNumber", + "SamAutoMaskSEGS", + "ShowBoolean", + "ShowFloat", + "ShowInt", + "ShowNumber", + "ShowString", + "StringToList" + ], + { + "title_aux": "comfyui-easyapi-nodes" + } + ], + "https://github.com/logtd/ComfyUI-FLATTEN": [ + [ + "ApplyFlattenAttentionNode", + "CreateFlowNoiseNode", + "FlattenCheckpointLoaderNode", + "KSamplerFlattenNode", + "TrajectoryNode", + "UnsamplerFlattenNode" + ], + { + "title_aux": "ComfyUI-FLATTEN" + } + ], + "https://github.com/logtd/ComfyUI-InstanceDiffusion": [ + [ + "ApplyScaleUModelNode", + "DownloadInstanceDiffusionModels", + "InstanceDiffusionTrackingPrompt", + "LoadInstanceFusersNode", + "LoadInstancePositionNetModel", + "LoadInstanceScaleUNode" + ], + { + "title_aux": "InstanceDiffusion Nodes" + } + ], + "https://github.com/logtd/ComfyUI-InversedNoise": [ + [ + "CombineNoiseLatentNode", + "MixNoiseNode", + "SamplerInversedEulerNode" + ], + { + "title_aux": "ComfyUI-InversedNoise" + } + ], + "https://github.com/logtd/ComfyUI-RAVE_ATTN": [ + [ + "ApplyRaveAttentionNode", + "AttentionOverrideSD15Node", + "AttentionOverrideSDXLNode" + ], + { + "title_aux": "ComfyUI-RAVE Attention" + } + ], + "https://github.com/logtd/ComfyUI-RefSampling": [ + [ + "ApplyRefContentNode", + "ApplyRefStyleNode", + "ApplyRefUNetNode" + ], + { + "title_aux": "ComfyUI-RefSampling" + } + ], + "https://github.com/logtd/ComfyUI-TrackingNodes": [ + [ + "OpenPoseTrackerNode", + "YOLOTrackerNode" + ], + { + "title_aux": "Tracking Nodes for Videos" + } + ], + "https://github.com/longgui0318/comfyui-common-util": [ + [ + "Added Layer Info To Array", + "Enhanced Random Light Source", + "Float Relay", + "Image Relay", + "Init Layer Info Array", + "Int Relay", + "Layer Image Seleted", + "Layer Images IPAdapter Advanced", + "Layer Info Array Fuse", + "Mask Relay", + "String Relay" + ], + { + "title_aux": "comfyui-common-util" + } + ], + "https://github.com/longgui0318/comfyui-llm-assistant": [ + [ + "Chat With LLM", + "Generate Stable Diffsution Prompt With LLM", + "Translate Text With LLM" + ], + { + "title_aux": "comfyui-llm-assistant" + } + ], + "https://github.com/longgui0318/comfyui-magic-clothing": [ + [ + "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", + "Change Pixel Value Normalization", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", + "Load Magic Clothing Model", + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" + ], + { + "title_aux": "comfyui-magic-clothing" + } + ], + "https://github.com/longgui0318/comfyui-mask-util": [ + [ + "Image Adaptive Crop M&R", + "Image Adaptive Crop With Mask", + "Image Change DType", + "Image Change Device", + "Image Resolution Adaptive With X", + "Image Resolution Limit With 8K", + "Load Image With Name", + "Mask Change DType", + "Mask Change Device", + "Mask Selection Of Masks", + "Model Change Device", + "Model Change Device Repeaters", + "Output Image To Input", + "Split Masks" + ], + { + "title_aux": "comfyui-mask-util" + } + ], + "https://github.com/longgui0318/comfyui-oms-diffusion": [ + [ + "Add Magic Clothing Attention", + "Change Pipeline Dtype And Device", + "Change Pixel Value Normalization", + "Diffusers Model Makeup &MC", + "Diffusers Scheduler Loader &MC", + "Load Magic Clothing Adapter", + "Load Magic Clothing Model", + "Load Magic Clothing Pipeline", + "Load Magic Clothing Pipeline With Path", + "RUN Magic Clothing Diffusers Model" + ], + { + "title_aux": "comfyui-oms-diffusion" + } + ], + "https://github.com/lordgasmic/ComfyUI-Wildcards/raw/master/wildcards.py": [ + [ + "CLIPTextEncodeWithWildcards" + ], + { + "title_aux": "Wildcards" + } + ], + "https://github.com/lordgasmic/comfyui_save_image_with_options": [ + [ + "SaveImageWithOptions" + ], + { + "title_aux": "comfyui_save_image_with_options" + } + ], + "https://github.com/lordgasmic/comfyui_wildcards": [ + [ + "CLIPTextEncodeWithWildcards" + ], + { + "title_aux": "comfyui_wildcards" + } + ], + "https://github.com/lquesada/ComfyUI-Inpaint-CropAndStitch": [ + [ + "InpaintCrop", + "InpaintExtendOutpaint", + "InpaintResize", + "InpaintStitch" + ], + { + "title_aux": "ComfyUI-Inpaint-CropAndStitch" + } + ], + "https://github.com/lquesada/ComfyUI-Prompt-Combinator": [ + [ + "PromptCombinator", + "PromptCombinatorExportGallery", + "PromptCombinatorMerger", + "PromptCombinatorRandomPrompt" + ], + { + "title_aux": "ComfyUI-Prompt-Combinator" + } + ], + "https://github.com/lrzjason/ComfyUIJasonNode/raw/main/SDXLMixSampler.py": [ + [ + "SDXLMixSampler" + ], + { + "title_aux": "ComfyUIJasonNode" + } + ], + "https://github.com/ltdrdata/ComfyUI-Impact-Pack": [ + [ + "AddMask", + "BasicPipeToDetailerPipe", + "BasicPipeToDetailerPipeSDXL", + "BboxDetectorCombined", + "BboxDetectorCombined_v2", + "BboxDetectorForEach", + "BboxDetectorSEGS", + "BitwiseAndMask", + "BitwiseAndMaskForEach", + "CLIPSegDetectorProvider", + "CfgScheduleHookProvider", + "CombineRegionalPrompts", + "CoreMLDetailerHookProvider", + "CustomNoiseDetailerHookProvider", + "DenoiseScheduleHookProvider", + "DenoiseSchedulerDetailerHookProvider", + "DetailerForEach", + "DetailerForEachDebug", + "DetailerForEachDebugPipe", + "DetailerForEachPipe", + "DetailerForEachPipeForAnimateDiff", + "DetailerHookCombine", + "DetailerPipeToBasicPipe", + "EditBasicPipe", + "EditDetailerPipe", + "EditDetailerPipeSDXL", + "EmptySegs", + "FaceDetailer", + "FaceDetailerPipe", + "FromBasicPipe", + "FromBasicPipe_v2", + "FromDetailerPipe", + "FromDetailerPipeSDXL", + "FromDetailerPipe_v2", + "GITSSchedulerFuncProvider", + "ImageListToImageBatch", + "ImageMaskSwitch", + "ImageReceiver", + "ImageSender", + "ImpactAssembleSEGS", + "ImpactCombineConditionings", + "ImpactCompare", + "ImpactConcatConditionings", + "ImpactConditionalBranch", + "ImpactConditionalBranchSelMode", + "ImpactConditionalStopIteration", + "ImpactControlBridge", + "ImpactControlNetApplyAdvancedSEGS", + "ImpactControlNetApplySEGS", + "ImpactControlNetClearSEGS", + "ImpactConvertDataType", + "ImpactCount_Elts_in_SEGS", + "ImpactDecomposeSEGS", + "ImpactDilateMask", + "ImpactDilateMaskInSEGS", + "ImpactDilate_Mask_SEG_ELT", + "ImpactDummyInput", + "ImpactEdit_SEG_ELT", + "ImpactFloat", + "ImpactFrom_SEG_ELT", + "ImpactFrom_SEG_ELT_bbox", + "ImpactFrom_SEG_ELT_crop_region", + "ImpactGaussianBlurMask", + "ImpactGaussianBlurMaskInSEGS", + "ImpactHFTransformersClassifierProvider", + "ImpactIPAdapterApplySEGS", + "ImpactIfNone", + "ImpactImageBatchToImageList", + "ImpactImageInfo", + "ImpactInt", + "ImpactInversedSwitch", + "ImpactIsNotEmptySEGS", + "ImpactKSamplerAdvancedBasicPipe", + "ImpactKSamplerBasicPipe", + "ImpactLatentInfo", + "ImpactLogger", + "ImpactLogicalOperators", + "ImpactMakeImageBatch", + "ImpactMakeImageList", + "ImpactMakeTileSEGS", + "ImpactMinMax", + "ImpactNeg", + "ImpactNodeSetMuteState", + "ImpactQueueTrigger", + "ImpactQueueTriggerCountdown", + "ImpactRemoteBoolean", + "ImpactRemoteInt", + "ImpactSEGSClassify", + "ImpactSEGSConcat", + "ImpactSEGSLabelAssign", + "ImpactSEGSLabelFilter", + "ImpactSEGSOrderedFilter", + "ImpactSEGSPicker", + "ImpactSEGSRangeFilter", + "ImpactSEGSToMaskBatch", + "ImpactSEGSToMaskList", + "ImpactScaleBy_BBOX_SEG_ELT", + "ImpactSchedulerAdapter", + "ImpactSegsAndMask", + "ImpactSegsAndMaskForEach", + "ImpactSetWidgetValue", + "ImpactSimpleDetectorSEGS", + "ImpactSimpleDetectorSEGSPipe", + "ImpactSimpleDetectorSEGS_for_AD", + "ImpactSleep", + "ImpactStringSelector", + "ImpactSwitch", + "ImpactValueReceiver", + "ImpactValueSender", + "ImpactWildcardEncode", + "ImpactWildcardProcessor", + "IterativeImageUpscale", + "IterativeLatentUpscale", + "KSamplerAdvancedProvider", + "KSamplerProvider", + "LatentPixelScale", + "LatentReceiver", + "LatentSender", + "LatentSwitch", + "MMDetDetectorProvider", + "MMDetLoader", + "MaskDetailerPipe", + "MaskListToMaskBatch", + "MaskPainter", + "MaskToSEGS", + "MaskToSEGS_for_AnimateDiff", + "MasksToMaskList", + "MediaPipeFaceMeshToSEGS", + "NoiseInjectionDetailerHookProvider", + "NoiseInjectionHookProvider", + "ONNXDetectorProvider", + "ONNXDetectorSEGS", + "PixelKSampleHookCombine", + "PixelKSampleUpscalerProvider", + "PixelKSampleUpscalerProviderPipe", + "PixelTiledKSampleUpscalerProvider", + "PixelTiledKSampleUpscalerProviderPipe", + "PreviewBridge", + "PreviewBridgeLatent", + "PreviewDetailerHookProvider", + "ReencodeLatent", + "ReencodeLatentPipe", + "RegionalPrompt", + "RegionalSampler", + "RegionalSamplerAdvanced", + "RemoveImageFromSEGS", + "RemoveNoiseMask", + "SAMDetectorCombined", + "SAMDetectorSegmented", + "SAMLoader", + "SEGSDetailer", + "SEGSDetailerForAnimateDiff", + "SEGSLabelFilterDetailerHookProvider", + "SEGSOrderedFilterDetailerHookProvider", + "SEGSPaste", + "SEGSPreview", + "SEGSPreviewCNet", + "SEGSRangeFilterDetailerHookProvider", + "SEGSSwitch", + "SEGSToImageList", + "SEGSUpscaler", + "SEGSUpscalerPipe", + "SegmDetectorCombined", + "SegmDetectorCombined_v2", + "SegmDetectorForEach", + "SegmDetectorSEGS", + "Segs Mask", + "Segs Mask ForEach", + "SegsMaskCombine", + "SegsToCombinedMask", + "SetDefaultImageForSEGS", + "StepsScheduleHookProvider", + "StringListToString", + "SubtractMask", + "SubtractMaskForEach", + "TiledKSamplerProvider", + "ToBasicPipe", + "ToBinaryMask", + "ToDetailerPipe", + "ToDetailerPipeSDXL", + "TwoAdvancedSamplersForMask", + "TwoSamplersForMask", + "TwoSamplersForMaskUpscalerProvider", + "TwoSamplersForMaskUpscalerProviderPipe", + "UltralyticsDetectorProvider", + "UnsamplerDetailerHookProvider", + "UnsamplerHookProvider", + "VariationNoiseDetailerHookProvider", + "WildcardPromptFromString" + ], + { + "author": "Dr.Lt.Data", + "description": "This extension offers various detector nodes and detailer nodes that allow you to configure a workflow that automatically enhances facial details. And provide iterative upscaler.", + "nickname": "Impact Pack", + "preemptions": [ + "SAMLoader" + ], + "title": "Impact Pack", + "title_aux": "ComfyUI Impact Pack" + } + ], + "https://github.com/ltdrdata/ComfyUI-Inspire-Pack": [ + [ + "AnimeLineArt_Preprocessor_Provider_for_SEGS //Inspire", + "ApplyRegionalIPAdapters //Inspire", + "BindImageListPromptList //Inspire", + "CLIPTextEncodeWithWeight //Inspire", + "CacheBackendData //Inspire", + "CacheBackendDataList //Inspire", + "CacheBackendDataNumberKey //Inspire", + "CacheBackendDataNumberKeyList //Inspire", + "Canny_Preprocessor_Provider_for_SEGS //Inspire", + "ChangeImageBatchSize //Inspire", + "ChangeLatentBatchSize //Inspire", + "CheckpointLoaderSimpleShared //Inspire", + "ColorMapToMasks //Inspire", + "ColorMaskToDepthMask //Inspire", + "Color_Preprocessor_Provider_for_SEGS //Inspire", + "CompositeNoise //Inspire", + "ConcatConditioningsWithMultiplier //Inspire", + "ConditioningStretch //Inspire", + "ConditioningUpscale //Inspire", + "DWPreprocessor_Provider_for_SEGS //Inspire", + "FakeScribblePreprocessor_Provider_for_SEGS //Inspire", + "FloatRange //Inspire", + "FromIPAdapterPipe //Inspire", + "GlobalSampler //Inspire", + "GlobalSeed //Inspire", + "HEDPreprocessor_Provider_for_SEGS //Inspire", + "HyperTile //Inspire", + "IPAdapterModelHelper //Inspire", + "ImageBatchSplitter //Inspire", + "InpaintPreprocessor_Provider_for_SEGS //Inspire", + "KSampler //Inspire", + "KSamplerAdvanced //Inspire", + "KSamplerAdvancedPipe //Inspire", + "KSamplerAdvancedProgress //Inspire", + "KSamplerPipe //Inspire", + "KSamplerProgress //Inspire", + "LatentBatchSplitter //Inspire", + "LeRes_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", + "LineArt_Preprocessor_Provider_for_SEGS //Inspire", + "ListCounter //Inspire", + "LoadImage //Inspire", + "LoadImageListFromDir //Inspire", + "LoadImagesFromDir //Inspire", + "LoadPromptsFromDir //Inspire", + "LoadPromptsFromFile //Inspire", + "LoadSinglePromptFromFile //Inspire", + "LoraBlockInfo //Inspire", + "LoraLoaderBlockWeight //Inspire", + "MakeBasicPipe //Inspire", + "Manga2Anime_LineArt_Preprocessor_Provider_for_SEGS //Inspire", + "MediaPipeFaceMeshDetectorProvider //Inspire", + "MediaPipe_FaceMesh_Preprocessor_Provider_for_SEGS //Inspire", + "MeshGraphormerDepthMapPreprocessorProvider_for_SEGS //Inspire", + "MiDaS_DepthMap_Preprocessor_Provider_for_SEGS //Inspire", + "OpenPose_Preprocessor_Provider_for_SEGS //Inspire", + "PromptBuilder //Inspire", + "PromptExtractor //Inspire", + "RGB_HexToHSV //Inspire", + "RandomGeneratorForList //Inspire", + "RandomNoise //Inspire", + "RegionalCFG //Inspire", + "RegionalConditioningColorMask //Inspire", + "RegionalConditioningSimple //Inspire", + "RegionalIPAdapterColorMask //Inspire", + "RegionalIPAdapterEncodedColorMask //Inspire", + "RegionalIPAdapterEncodedMask //Inspire", + "RegionalIPAdapterMask //Inspire", + "RegionalPromptColorMask //Inspire", + "RegionalPromptSimple //Inspire", + "RegionalSeedExplorerColorMask //Inspire", + "RegionalSeedExplorerMask //Inspire", + "RemoveBackendData //Inspire", + "RemoveBackendDataNumberKey //Inspire", + "RemoveControlNet //Inspire", + "RemoveControlNetFromRegionalPrompts //Inspire", + "RetrieveBackendData //Inspire", + "RetrieveBackendDataNumberKey //Inspire", + "ScheduledCFGGuider //Inspire", + "ScheduledPerpNegCFGGuider //Inspire", + "SeedExplorer //Inspire", + "SelectNthMask //Inspire", + "ShowCachedInfo //Inspire", + "StableCascade_CheckpointLoader //Inspire", + "TilePreprocessor_Provider_for_SEGS //Inspire", + "ToIPAdapterPipe //Inspire", + "UnzipPrompt //Inspire", + "WildcardEncode //Inspire", + "XY Input: Lora Block Weight //Inspire", + "ZipPrompt //Inspire", + "Zoe_DepthMap_Preprocessor_Provider_for_SEGS //Inspire" + ], + { + "author": "Dr.Lt.Data", + "description": "This extension provides various nodes to support Lora Block Weight and the Impact Pack.", + "nickname": "Inspire Pack", + "nodename_pattern": "Inspire$", + "title": "Inspire Pack", + "title_aux": "ComfyUI Inspire Pack" + } + ], + "https://github.com/luandev/ComfyUI-CrewAI": [ + [ + "\ud83d\udcceCrewAI Agent", + "\ud83d\udcceCrewAI Agent List", + "\ud83d\udcceCrewAI Crew", + "\ud83d\udcceCrewAI LLM Chat GPT", + "\ud83d\udcceCrewAI LLM Hugging Face", + "\ud83d\udcceCrewAI LLM OpenAI", + "\ud83d\udcceCrewAI Task", + "\ud83d\udcceCrewAI Task List" + ], + { + "title_aux": "ComfyUI CrewAI" + } + ], + "https://github.com/m-sokes/ComfyUI-Sokes-Nodes": [ + [ + "Custom Date Format | sokes \ud83e\uddac", + "Latent Switch x9 | sokes \ud83e\uddac" + ], + { + "title_aux": "ComfyUI Sokes Nodes" + } + ], + "https://github.com/m957ymj75urz/ComfyUI-Custom-Nodes/raw/main/clip-text-encode-split/clip_text_encode_split.py": [ + [ + "RawText", + "RawTextCombine", + "RawTextEncode", + "RawTextReplace" + ], + { + "title_aux": "m957ymj75urz/ComfyUI-Custom-Nodes" + } + ], + "https://github.com/mape/ComfyUI-mape-Helpers": [ + [ + "mape Variable" + ], + { + "author": "mape", + "description": "Various QoL improvements like prompt tweaking, variable assignment, image preview, fuzzy search, error reporting, organizing and node navigation.", + "nickname": "\ud83d\udfe1 mape's helpers", + "title": "mape's helpers", + "title_aux": "mape's helpers" + } + ], + "https://github.com/maracman/ComfyUI-SubjectStyle-CSV": [ + [ + "CSVPromptProcessor" + ], + { + "title_aux": "ComfyUI-SubjectStyle-CSV" + } + ], + "https://github.com/marduk191/comfyui-marnodes": [ + [ + "marduk191_5_text_string", + "marduk191_5way_text_switch", + "marduk191_workflow_settings" + ], + { + "author": "\u02f6marduk191", + "description": "marduk191s nodes.", + "nickname": "marduk191 workflow settings", + "title": "marduk191 workflow settings", + "title_aux": "marduk191 workflow settings" + } + ], + "https://github.com/marhensa/sdxl-recommended-res-calc": [ + [ + "RecommendedResCalc" + ], + { + "title_aux": "Recommended Resolution Calculator" + } + ], + "https://github.com/martijnat/comfyui-previewlatent": [ + [ + "PreviewLatent", + "PreviewLatentAdvanced", + "PreviewLatentXL" + ], + { + "title_aux": "comfyui-previewlatent" + } + ], + "https://github.com/massao000/ComfyUI_aspect_ratios": [ + [ + "Aspect Ratios Node" + ], + { + "title_aux": "ComfyUI_aspect_ratios" + } + ], + "https://github.com/matan1905/ComfyUI-Serving-Toolkit": [ + [ + "DiscordServing", + "ServingInputNumber", + "ServingInputText", + "ServingOutput", + "WebSocketServing" + ], + { + "title_aux": "ComfyUI Serving toolkit" + } + ], + "https://github.com/mav-rik/facerestore_cf": [ + [ + "CropFace", + "FaceRestoreCFWithModel", + "FaceRestoreModelLoader" + ], + { + "title_aux": "Facerestore CF (Code Former)" + } + ], + "https://github.com/mbrostami/ComfyUI-HF": [ + [ + "GPT2Node" + ], + { + "title_aux": "ComfyUI-HF" + } + ], + "https://github.com/mbrostami/ComfyUI-TITrain": [ + [ + "TextualInversionTraining", + "TextualInversionTrainingSDXL" + ], + { + "title_aux": "ComfyUI-TITrain" + } + ], + "https://github.com/mcmonkeyprojects/sd-dynamic-thresholding": [ + [ + "DynamicThresholdingFull", + "DynamicThresholdingSimple" + ], + { + "title_aux": "Stable Diffusion Dynamic Thresholding (CFG Scale Fix)" + } + ], + "https://github.com/meap158/ComfyUI-Background-Replacement": [ + [ + "BackgroundReplacement", + "ImageComposite" + ], + { + "title_aux": "ComfyUI-Background-Replacement" + } + ], + "https://github.com/meap158/ComfyUI-GPU-temperature-protection": [ + [ + "GPUTemperatureProtection" + ], + { + "title_aux": "GPU temperature protection" + } + ], + "https://github.com/meap158/ComfyUI-Prompt-Expansion": [ + [ + "PromptExpansion" + ], + { + "title_aux": "ComfyUI-Prompt-Expansion" + } + ], + "https://github.com/melMass/comfy_mtb": [ + [ + "Animation Builder (mtb)", + "Any To String (mtb)", + "Batch Float (mtb)", + "Batch Float Assemble (mtb)", + "Batch Float Fill (mtb)", + "Batch Make (mtb)", + "Batch Merge (mtb)", + "Batch Shake (mtb)", + "Batch Shape (mtb)", + "Batch Transform (mtb)", + "Bbox (mtb)", + "Bbox From Mask (mtb)", + "Blur (mtb)", + "Color Correct (mtb)", + "Colored Image (mtb)", + "Concat Images (mtb)", + "Crop (mtb)", + "Debug (mtb)", + "Deep Bump (mtb)", + "Export With Ffmpeg (mtb)", + "Face Swap (mtb)", + "Film Interpolation (mtb)", + "Fit Number (mtb)", + "Float To Number (mtb)", + "Get Batch From History (mtb)", + "Image Compare (mtb)", + "Image Premultiply (mtb)", + "Image Remove Background Rembg (mtb)", + "Image Resize Factor (mtb)", + "Image Tile Offset (mtb)", + "Int To Bool (mtb)", + "Int To Number (mtb)", + "Interpolate Clip Sequential (mtb)", + "Latent Lerp (mtb)", + "Load Face Analysis Model (mtb)", + "Load Face Enhance Model (mtb)", + "Load Face Swap Model (mtb)", + "Load Film Model (mtb)", + "Load Image From Url (mtb)", + "Load Image Sequence (mtb)", + "Mask To Image (mtb)", + "Math Expression (mtb)", + "Model Patch Seamless (mtb)", + "Pick From Batch (mtb)", + "Qr Code (mtb)", + "Restore Face (mtb)", + "Save Gif (mtb)", + "Save Image Grid (mtb)", + "Save Image Sequence (mtb)", + "Save Tensors (mtb)", + "Sharpen (mtb)", + "Smart Step (mtb)", + "Stack Images (mtb)", + "String Replace (mtb)", + "Styles Loader (mtb)", + "Text To Image (mtb)", + "Transform Image (mtb)", + "Uncrop (mtb)", + "Unsplash Image (mtb)", + "Vae Decode (mtb)" + ], + { + "nodename_pattern": "\\(mtb\\)$", + "title_aux": "MTB Nodes" + } + ], + "https://github.com/mephisto83/petty-paint-comfyui-node": [ + [ + "PettyImageImageColorToMask", + "PettyPaintAppend", + "PettyPaintApplyLoRAStack", + "PettyPaintBlurs", + "PettyPaintComponent", + "PettyPaintConditioningSetMaskAndCombine", + "PettyPaintConvert", + "PettyPaintCountFiles", + "PettyPaintEnsureDirectory", + "PettyPaintExec", + "PettyPaintFakeConvert", + "PettyPaintFileExists", + "PettyPaintImageColorsToMasks", + "PettyPaintImageCompositeMasked", + "PettyPaintImageDims", + "PettyPaintImageMaskCropper", + "PettyPaintImagePlacement", + "PettyPaintImageSave", + "PettyPaintImageStore", + "PettyPaintImageToMask", + "PettyPaintImagesToMasks", + "PettyPaintJsonMap", + "PettyPaintJsonRead", + "PettyPaintJsonReadArray", + "PettyPaintKSampler", + "PettyPaintKSamplerAdvanced", + "PettyPaintLoRAStack", + "PettyPaintLoadImage", + "PettyPaintLoadImageMasks", + "PettyPaintLoadImages", + "PettyPaintMap", + "PettyPaintMasksToImages", + "PettyPaintNot", + "PettyPaintPassThroughNode", + "PettyPaintProcessor", + "PettyPaintRemoveAddText", + "PettyPaintSDTurboScheduler", + "PettyPaintStoryImage", + "PettyPaintText", + "PettyPaintTexts_to_Conditioning", + "PettyPaintToJson", + "PettyPaintVAEDecode" + ], + { + "title_aux": "petty-paint-comfyui-node" + } + ], + "https://github.com/meshmesh-io/ComfyUI-MeshMesh": [ + [ + "ColorPicker", + "MasksToColoredMasks" + ], + { + "title_aux": "ComfyUI-MeshMesh" + } + ], + "https://github.com/meshmesh-io/mm-comfyui-loopback": [ + [ + "Loop", + "LoopEnd", + "LoopEnd_SEGIMAGE", + "LoopStart", + "LoopStart_SEGIMAGE" + ], + { + "title_aux": "mm-comfyui-loopback" + } + ], + "https://github.com/meshmesh-io/mm-comfyui-megamask": [ + [ + "ColorListMaskToImage", + "FlattenAndCombineMaskImages" + ], + { + "title_aux": "mm-comfyui-megamask" + } + ], + "https://github.com/metncelik/comfyui_met_suite": [ + [ + "BBOXPadding", + "BBOXResize", + "ImageResizeKeepRatio", + "PrimitiveBBOX", + "RaiseError" + ], + { + "title_aux": "comfyui_met_suite" + } + ], + "https://github.com/mihaiiancu/ComfyUI_Inpaint": [ + [ + "InpaintMediapipe" + ], + { + "title_aux": "mihaiiancu/Inpaint" + } + ], + "https://github.com/mikkel/ComfyUI-text-overlay": [ + [ + "Image Text Overlay" + ], + { + "title_aux": "ComfyUI - Text Overlay Plugin" + } + ], + "https://github.com/mikkel/comfyui-mask-boundingbox": [ + [ + "Mask Bounding Box" + ], + { + "title_aux": "ComfyUI - Mask Bounding Box" + } + ], + "https://github.com/mingqizhang/ComfyUI_InSPyResNet_zmq": [ + [ + "INSPY removebg Apply", + "INSPY removebg ModelLoader" + ], + { + "title_aux": "ComfyUI_InSPyResNet_zmq" + } + ], + "https://github.com/mirabarukaso/ComfyUI_Mira": [ + [ + "BooleanListInterpreter1", + "BooleanListInterpreter4", + "BooleanListInterpreter8", + "CanvasCreatorAdvanced", + "CanvasCreatorBasic", + "CanvasCreatorSimple", + "CircleCreator", + "CirclesGenerator", + "CreateCircleMask", + "CreateMaskWithCanvas", + "CreateNestedPNGMask", + "CreateSimpleMask", + "CreateTillingPNGMask", + "CreateWatermarkRemovalMask", + "EightBooleanTrigger", + "EightFloats", + "EvenOrOdd", + "EvenOrOddList", + "FloatListInterpreter1", + "FloatListInterpreter4", + "FloatListInterpreter8", + "FloatMultiplication", + "FourBooleanTrigger", + "FourFloats", + "FunctionSwap", + "IntMultiplication", + "IntSubtraction", + "IntToFloatMultiplication", + "LogicNot", + "NoneToZero", + "NumeralToString", + "OneFloat", + "PngColorMasksToMaskList", + "PngColorMasksToRGB", + "PngColorMasksToString", + "PngColorMasksToStringList", + "PngRectanglesToMask", + "PngRectanglesToMaskList", + "RandomNestedLayouts", + "RandomTillingLayouts", + "SN74HC1G86", + "SN74HC86", + "SN74LVC1G125", + "SeedGenerator", + "SingleBooleanTrigger", + "SixBooleanTrigger", + "StepsAndCfg", + "TextBox", + "TextCombinerSix", + "TextCombinerTwo", + "TextWithBooleanSwitchAndCommonTextInput", + "TwoBooleanTrigger", + "TwoFloats" + ], + { + "title_aux": "ComfyUI_Mira" + } + ], + "https://github.com/modusCell/ComfyUI-dimension-node-modusCell": [ + [ + "DimensionProviderFree modusCell", + "DimensionProviderRatio modusCell", + "String Concat modusCell" + ], + { + "title_aux": "Preset Dimensions" + } + ], + "https://github.com/moyi7712/ComfyUI_Seamless_Patten": [ + [ + "SeamlessApply", + "SeamlessKSampler", + "SeamlessKSamplerAdvanced", + "SeamlessVae" + ], + { + "title_aux": "ComfyUI_Seamless_Patten" + } + ], + "https://github.com/mpiquero7164/ComfyUI-SaveImgPrompt": [ + [ + "Save IMG Prompt" + ], + { + "title_aux": "SaveImgPrompt" + } + ], + "https://github.com/mullakhmetov/comfyui_dynamic_util_nodes": [ + [ + "ConcatStrings", + "FormatString", + "GetFiles", + "LoadImageByPath" + ], + { + "title_aux": "comfyui_dynamic_util_nodes" + } + ], + "https://github.com/muzi12888/ComfyUI-PoseKeypoint-Mask": [ + [ + "Image Brightness", + "Openpose Keypoint Mask" + ], + { + "title_aux": "PoseKeypoint Mask" + } + ], + "https://github.com/my-opencode/ComfyUI_IndustrialMagick": [ + [ + "IndustrialMagick", + "IndustrialMagickImageIngest" + ], + { + "title_aux": "ComfyUI_IndustrialMagick" + } + ], + "https://github.com/my-opencode/ComfyUI_KSamplerTimer": [ + [ + "KSamplerTimer" + ], + { + "author": "Ludovic Anterieur", + "description": "This extension provides a wrapper of the native KSampler which outputs generation time.", + "nickname": "\u23f1", + "title": "KSampler (timer)", + "title_aux": "ComfyUI_KSamplerTimer" + } + ], + "https://github.com/nagolinc/ComfyUI_FastVAEDecorder_SDXL": [ + [ + "FastLatentToImage" + ], + { + "title_aux": "ComfyUI_FastVAEDecorder_SDXL" + } + ], + "https://github.com/nagolinc/comfyui_openai_node": [ + [ + "OpenAINode" + ], + { + "title_aux": "comfyui_openai_node" + } + ], + "https://github.com/natto-maki/ComfyUI-NegiTools": [ + [ + "NegiTools_CompositeImages", + "NegiTools_DepthEstimationByMarigold", + "NegiTools_DetectFaceRotationForInpainting", + "NegiTools_ImageProperties", + "NegiTools_LatentProperties", + "NegiTools_NoiseImageGenerator", + "NegiTools_OpenAiDalle3", + "NegiTools_OpenAiGpt", + "NegiTools_OpenAiGpt4v", + "NegiTools_OpenAiTranslate", + "NegiTools_OpenPoseToPointList", + "NegiTools_PointListToMask", + "NegiTools_RandomImageLoader", + "NegiTools_SaveImageToDirectory", + "NegiTools_SeedGenerator", + "NegiTools_StereoImageGenerator", + "NegiTools_StringFunction" + ], + { + "title_aux": "ComfyUI-NegiTools" + } + ], + "https://github.com/nickve28/ComfyUI-Nich-Utils": [ + [ + "Image from Dir Selector (Nich)", + "Select Text with Regular Expression (Nich)" + ], + { + "title_aux": "ComfyUI Nich Utils" + } + ], + "https://github.com/nicolai256/comfyUI_Nodes_nicolai256/raw/main/yugioh-presets.py": [ + [ + "yugioh_Presets" + ], + { + "title_aux": "comfyUI_Nodes_nicolai256" + } + ], + "https://github.com/ningxiaoxiao/comfyui-NDI": [ + [ + "NDI_LoadImage", + "NDI_SendImage" + ], + { + "title_aux": "comfyui-NDI" + } + ], + "https://github.com/nirbhay-faaya/ImgProcessing_ComfyUI": [ + [ + "ImageConcat", + "ImageCropMultEight", + "ImageCut", + "LightingPreprocessor" + ], + { + "title_aux": "ImgProcessing_ComfyUI" + } + ], + "https://github.com/nirex0/ComfyUI_pytorch_openpose": [ + [ + "pytorch_openpose" + ], + { + "title_aux": "ComfyUI_pytorch_openpose" + } + ], + "https://github.com/nkchocoai/ComfyUI-Dart": [ + [ + "DanbooruTagsTransformerBanTagsFromRegex", + "DanbooruTagsTransformerComposePrompt", + "DanbooruTagsTransformerComposePromptV2", + "DanbooruTagsTransformerDecode", + "DanbooruTagsTransformerDecodeBySplitedParts", + "DanbooruTagsTransformerGenerate", + "DanbooruTagsTransformerGenerateAdvanced", + "DanbooruTagsTransformerGenerationConfig", + "DanbooruTagsTransformerGetAspectRatio", + "DanbooruTagsTransformerLoader", + "DanbooruTagsTransformerRearrangedByAnimagine", + "DanbooruTagsTransformerRemoveTagToken" + ], + { + "title_aux": "ComfyUI-Dart" + } + ], + "https://github.com/nkchocoai/ComfyUI-PromptUtilities": [ + [ + "PromptUtilitiesConstString", + "PromptUtilitiesConstStringMultiLine", + "PromptUtilitiesFormatString", + "PromptUtilitiesJoinStringList", + "PromptUtilitiesLoadPreset", + "PromptUtilitiesLoadPresetAdvanced", + "PromptUtilitiesRandomPreset", + "PromptUtilitiesRandomPresetAdvanced" + ], + { + "title_aux": "ComfyUI-PromptUtilities" + } + ], + "https://github.com/nkchocoai/ComfyUI-SaveImageWithMetaData": [ + [ + "SaveImageWithMetaData" + ], + { + "title_aux": "ComfyUI-SaveImageWithMetaData" + } + ], + "https://github.com/nkchocoai/ComfyUI-SizeFromPresets": [ + [ + "EmptyLatentImageFromPresetsSD15", + "EmptyLatentImageFromPresetsSDXL", + "GetSimilarResolution", + "GetSimilarResolutionEmptyLatent", + "RandomEmptyLatentImageFromPresetsSD15", + "RandomEmptyLatentImageFromPresetsSDXL", + "RandomSizeFromPresetsSD15", + "RandomSizeFromPresetsSDXL", + "SizeFromPresetsSD15", + "SizeFromPresetsSDXL" + ], + { + "title_aux": "ComfyUI-SizeFromPresets" + } + ], + "https://github.com/nkchocoai/ComfyUI-TextOnSegs": [ + [ + "CalcMaxFontSize", + "ExtractDominantColor", + "GetComplementaryColor", + "SegsToRegion", + "TextOnSegsFloodFill" + ], + { + "title_aux": "ComfyUI-TextOnSegs" + } + ], + "https://github.com/noembryo/ComfyUI-noEmbryo": [ + [ + "PromptTermList1", + "PromptTermList2", + "PromptTermList3", + "PromptTermList4", + "PromptTermList5", + "PromptTermList6" + ], + { + "author": "noEmbryo", + "description": "Some useful nodes for ComfyUI", + "nickname": "noEmbryo", + "title": "noEmbryo nodes", + "title_aux": "noEmbryo nodes" + } + ], + "https://github.com/nosiu/comfyui-instantId-faceswap": [ + [ + "FaceEmbed", + "FaceSwapGenerationInpaint", + "FaceSwapSetupPipeline", + "LCMLora" + ], + { + "title_aux": "ComfyUI InstantID Faceswapper" + } + ], + "https://github.com/noxinias/ComfyUI_NoxinNodes": [ + [ + "NoxinChime", + "NoxinPromptLoad", + "NoxinPromptSave", + "NoxinScaledResolution", + "NoxinSimpleMath", + "NoxinSplitPrompt" + ], + { + "title_aux": "ComfyUI_NoxinNodes" + } + ], + "https://github.com/ntc-ai/ComfyUI-DARE-LoRA-Merge": [ + [ + "Apply LoRA", + "DARE Merge LoRA Stack", + "Save LoRA" + ], + { + "title_aux": "ComfyUI - Apply LoRA Stacker with DARE" + } + ], + "https://github.com/ntdviet/comfyui-ext/raw/main/custom_nodes/gcLatentTunnel/gcLatentTunnel.py": [ + [ + "gcLatentTunnel" + ], + { + "title_aux": "ntdviet/comfyui-ext" + } + ], + "https://github.com/nuanarchy/ComfyUI-NuA-BIRD": [ + [ + "Bird_Deblurring_NuA", + "Bird_Denoising_NuA", + "Bird_Inpainting_NuA", + "Bird_Loader_NuA", + "Bird_Non_Uniform_Deblurring_NuA", + "Bird_Super_Resolution_NuA" + ], + { + "title_aux": "ComfyUI-NuA-BIRD" + } + ], + "https://github.com/nuanarchy/ComfyUI-NuA-FlashFace": [ + [ + "FlashFace_Loader_NuA", + "FlashFace_Sampler_NuA" + ], + { + "title_aux": "ComfyUI-NuA-FlashFace" + } + ], + "https://github.com/nullquant/ComfyUI-BrushNet": [ + [ + "BlendInpaint", + "BrushNet", + "BrushNetLoader", + "CutForInpaint", + "PowerPaint", + "PowerPaintCLIPLoader", + "RAUNet", + "Terminal" + ], + { + "author": "nullquant", + "description": "These are custom nodes for ComfyUI native implementation of BrushNet, PowerPaint and RAUNet models", + "nickname": "BrushName nodes", + "title": "BrushNet", + "title_aux": "BrushNet" + } + ], + "https://github.com/olduvai-jp/ComfyUI-HfLoader": [ + [ + "Lora Loader From HF" + ], + { + "title_aux": "ComfyUI-HfLoader" + } + ], + "https://github.com/omar92/ComfyUI-QualityOfLifeSuit_Omar92": [ + [ + "CLIPStringEncode _O", + "Chat completion _O", + "ChatGPT Simple _O", + "ChatGPT _O", + "ChatGPT compact _O", + "Chat_Completion _O", + "Chat_Message _O", + "Chat_Message_fromString _O", + "Concat Text _O", + "ConcatRandomNSP_O", + "Debug String _O", + "Debug Text _O", + "Debug Text route _O", + "Edit_image _O", + "Equation1param _O", + "Equation2params _O", + "GetImage_(Width&Height) _O", + "GetLatent_(Width&Height) _O", + "ImageScaleFactor _O", + "ImageScaleFactorSimple _O", + "LatentUpscaleFactor _O", + "LatentUpscaleFactorSimple _O", + "LatentUpscaleMultiply", + "Note _O", + "RandomNSP _O", + "Replace Text _O", + "String _O", + "Text _O", + "Text2Image _O", + "Trim Text _O", + "VAEDecodeParallel _O", + "combine_chat_messages _O", + "compine_chat_messages _O", + "concat Strings _O", + "create image _O", + "create_image _O", + "debug Completeion _O", + "debug messages_O", + "float _O", + "floatToInt _O", + "floatToText _O", + "int _O", + "intToFloat _O", + "load_openAI _O", + "replace String _O", + "replace String advanced _O", + "saveTextToFile _O", + "seed _O", + "selectLatentFromBatch _O", + "string2Image _O", + "trim String _O", + "variation_image _O" + ], + { + "title_aux": "Quality of life Suit:V2" + } + ], + "https://github.com/opvelll/ComfyUI_TextListProduct": [ + [ + "ProductedString", + "TextListProduct", + "TextListProductWithSingleA", + "TextListProductWithSingleB", + "TextListProductWithSingleBoth" + ], + { + "title_aux": "Comfy UI Text List Product" + } + ], + "https://github.com/osi1880vr/prompt_quill_comfyui": [ + [ + "PromptQuillGenerate", + "PromptQuillGenerateConditioning", + "PromptQuillSail", + "PromptQuillSailConditioning" + ], + { + "title_aux": "ComfyUI_Prompt-Quill" + } + ], + "https://github.com/ostris/ostris_nodes_comfyui": [ + [ + "LLM Pipe Loader - Ostris", + "LLM Prompt Upsampling - Ostris", + "One Seed - Ostris", + "Text Box - Ostris" + ], + { + "nodename_pattern": "- Ostris$", + "title_aux": "Ostris Nodes ComfyUI" + } + ], + "https://github.com/ownimage/ComfyUI-ownimage": [ + [ + "Caching Image Loader" + ], + { + "title_aux": "ComfyUI-ownimage" + } + ], + "https://github.com/oyvindg/ComfyUI-TrollSuite": [ + [ + "BinaryImageMask", + "ImagePadding", + "LoadLastImage", + "RandomMask", + "TransparentImage" + ], + { + "title_aux": "ComfyUI-TrollSuite" + } + ], + "https://github.com/oztrkoguz/ComfyUI_StoryCreator": [ + [ + "Kosmos2SamplerSimple2", + "KosmosLoader2", + "StoryLoader", + "StorySamplerSimple", + "Write2" + ], + { + "title_aux": "ComfyUI StoryCreater" + } + ], + "https://github.com/palant/extended-saveimage-comfyui": [ + [ + "SaveImageExtended" + ], + { + "title_aux": "Extended Save Image for ComfyUI" + } + ], + "https://github.com/palant/image-resize-comfyui": [ + [ + "ImageResize" + ], + { + "title_aux": "Image Resize for ComfyUI" + } + ], + "https://github.com/pamparamm/ComfyUI-vectorscope-cc": [ + [ + "NormalizeLatent", + "VectorscopeCC" + ], + { + "title_aux": "ComfyUI Vectorscope CC" + } + ], + "https://github.com/pamparamm/sd-perturbed-attention": [ + [ + "PerturbedAttention" + ], + { + "title_aux": "Perturbed-Attention Guidance" + } + ], + "https://github.com/pants007/comfy-pants": [ + [ + "CLIPTextEncodeAIO", + "Image Make Square" + ], + { + "title_aux": "pants" + } + ], + "https://github.com/paulo-coronado/comfy_clip_blip_node": [ + [ + "CLIPTextEncodeBLIP", + "CLIPTextEncodeBLIP-2", + "Example" + ], + { + "title_aux": "comfy_clip_blip_node" + } + ], + "https://github.com/philz1337x/ComfyUI-ClarityAI": [ + [ + "Clarity AI Upscaler" + ], + { + "title_aux": "\u2728 Clarity AI - Creative Image Upscaler and Enhancer for ComfyUI" + } + ], + "https://github.com/picturesonpictures/comfy_PoP": [ + [ + "AdaptiveCannyDetector_PoP", + "AnyAspectRatio", + "ConditioningMultiplier_PoP", + "ConditioningNormalizer_PoP", + "DallE3_PoP", + "EfficientAttention", + "LoadImageResizer_PoP", + "LoraStackLoader10_PoP", + "LoraStackLoader_PoP", + "VAEDecoderPoP", + "VAEEncoderPoP" + ], + { + "title_aux": "comfy_PoP" + } + ], + "https://github.com/pkpkTech/ComfyUI-SaveAVIF": [ + [ + "SaveAvif" + ], + { + "title_aux": "ComfyUI-SaveAVIF" + } + ], + "https://github.com/pkpkTech/ComfyUI-TemporaryLoader": [ + [ + "LoadTempCheckpoint", + "LoadTempLoRA", + "LoadTempMultiLoRA" + ], + { + "title_aux": "ComfyUI-TemporaryLoader" + } + ], + "https://github.com/portu-sim/comfyui_bmab": [ + [ + "BMAB Alpha Composit", + "BMAB Basic", + "BMAB Blend", + "BMAB Clip Text Encoder SDXL", + "BMAB Conditioning To Bind", + "BMAB Context", + "BMAB ControlNet", + "BMAB ControlNet IPAdapter", + "BMAB ControlNet Openpose", + "BMAB Crop", + "BMAB Detail Anything", + "BMAB Detect And Mask", + "BMAB Detection Crop", + "BMAB Detector", + "BMAB Edge", + "BMAB Extractor", + "BMAB Face Detailer", + "BMAB Google Gemini Prompt", + "BMAB Import Integrator", + "BMAB Integrator", + "BMAB KSampler", + "BMAB KSamplerHiresFix", + "BMAB KSamplerHiresFixWithUpscaler", + "BMAB KSamplerKohyaDeepShrink", + "BMAB Lama Inpaint", + "BMAB LoRA Loader", + "BMAB Load Image", + "BMAB Load Output Image", + "BMAB Masks To Images", + "BMAB Model To Bind", + "BMAB Noise Generator", + "BMAB Openpose Hand Detailer", + "BMAB Person Detailer", + "BMAB Preview Text", + "BMAB Prompt", + "BMAB Remove Background", + "BMAB Resize By Person", + "BMAB Resize By Ratio", + "BMAB Resize and Fill", + "BMAB SD-WebUI API BMAB Extension", + "BMAB SD-WebUI API ControlNet", + "BMAB SD-WebUI API I2I", + "BMAB SD-WebUI API Server", + "BMAB SD-WebUI API T2I", + "BMAB SD-WebUI API T2I Hires.Fix", + "BMAB Save Image", + "BMAB SeedGenerator", + "BMAB Segment Anything", + "BMAB Simple Hand Detailer", + "BMAB Subframe Hand Detailer", + "BMAB Text", + "BMAB Upscale With Model", + "BMAB Upscaler", + "BMAB Watermark" + ], + { + "title_aux": "comfyui_bmab" + } + ], + "https://github.com/prodogape/ComfyUI-EasyOCR": [ + [ + "Apply EasyOCR" + ], + { + "title_aux": "ComfyUI-EasyOCR" + } + ], + "https://github.com/prodogape/ComfyUI-Minio": [ + [ + "Load Image From Minio", + "Save Image To Minio", + "Set Minio Config" + ], + { + "title_aux": "Comfyui-Minio" + } + ], + "https://github.com/prodogape/ComfyUI-OmDet": [ + [ + "Apply OmDet" + ], + { + "title_aux": "ComfyUI-OmDet" + } + ], + "https://github.com/prodogape/Comfyui-Yolov8-JSON": [ + [ + "Apply Yolov8 Model", + "Apply Yolov8 Model Seg", + "Draw Labelme Json", + "Load Yolov8 Model", + "Load Yolov8 Model From Path", + "Save Labelme Json" + ], + { + "title_aux": "Comfyui-Yolov8-JSON" + } + ], + "https://github.com/pythongosssss/ComfyUI-Custom-Scripts": [ + [ + "CheckpointLoader|pysssss", + "ConstrainImageforVideo|pysssss", + "ConstrainImage|pysssss", + "LoadText|pysssss", + "LoraLoader|pysssss", + "MathExpression|pysssss", + "MultiPrimitive|pysssss", + "PlaySound|pysssss", + "Repeater|pysssss", + "ReroutePrimitive|pysssss", + "SaveText|pysssss", + "ShowText|pysssss", + "StringFunction|pysssss", + "SystemNotification|pysssss" + ], + { + "title_aux": "pythongosssss/ComfyUI-Custom-Scripts" + } + ], + "https://github.com/pythongosssss/ComfyUI-WD14-Tagger": [ + [ + "WD14Tagger|pysssss" + ], + { + "title_aux": "ComfyUI WD 1.4 Tagger" + } + ], + "https://github.com/qwixiwp/queuetools": [ + [ + "load images (queue tools)" + ], + { + "title_aux": "queuetools" + } + ], + "https://github.com/ramyma/A8R8_ComfyUI_nodes": [ + [ + "AttentionCouple", + "AttentionCoupleRegion", + "AttentionCoupleRegions", + "Base64ImageInput", + "Base64ImageOutput" + ], + { + "title_aux": "A8R8 ComfyUI Nodes" + } + ], + "https://github.com/randjtw/advance-aesthetic-score": [ + [ + "Adv_Scoring" + ], + { + "title_aux": "advance-aesthetic-score" + } + ], + "https://github.com/ratulrafsan/Comfyui-SAL-VTON": [ + [ + "SALVTON_Apply", + "SV_random" + ], + { + "title_aux": "Comfyui-SAL-VTON" + } + ], + "https://github.com/rcfcu2000/zhihuige-nodes-comfyui": [ + [ + "Combine ZHGMasks", + "Cover ZHGMasks", + "From ZHG pip", + "GroundingDinoModelLoader (zhihuige)", + "GroundingDinoPIPESegment (zhihuige)", + "GroundingDinoSAMSegment (zhihuige)", + "InvertMask (zhihuige)", + "SAMModelLoader (zhihuige)", + "To ZHG pip", + "ZHG FaceIndex", + "ZHG GetMaskArea", + "ZHG Image Levels", + "ZHG SaveImage", + "ZHG SmoothEdge", + "ZHG UltimateSDUpscale" + ], + { + "title_aux": "zhihuige-nodes-comfyui" + } + ], + "https://github.com/rcsaquino/comfyui-custom-nodes": [ + [ + "BackgroundRemover | rcsaquino", + "VAELoader | rcsaquino", + "VAEProcessor | rcsaquino" + ], + { + "title_aux": "rcsaquino/comfyui-custom-nodes" + } + ], + "https://github.com/receyuki/comfyui-prompt-reader-node": [ + [ + "SDAnyConverter", + "SDBatchLoader", + "SDLoraLoader", + "SDLoraSelector", + "SDParameterExtractor", + "SDParameterGenerator", + "SDPromptMerger", + "SDPromptReader", + "SDPromptSaver", + "SDTypeConverter" + ], + { + "author": "receyuki", + "description": "The ultimate solution for managing image metadata and multi-tool compatibility. ComfyUI node version of the SD Prompt Reader", + "nickname": "SD Prompt Reader", + "title": "SD Prompt Reader", + "title_aux": "SD Prompt Reader" + } + ], + "https://github.com/redhottensors/ComfyUI-Prediction": [ + [ + "AvoidErasePrediction", + "CFGPrediction", + "CharacteristicGuidancePrediction", + "CombinePredictions", + "ConditionedPrediction", + "EarlyMiddleLatePrediction", + "InterpolatePredictions", + "LogSigmas", + "PerpNegPrediction", + "SamplerCustomPrediction", + "ScalePrediction", + "ScaledGuidancePrediction", + "SelectSigmas", + "SplitAtSigma", + "SwitchPredictions" + ], + { + "author": "RedHotTensors", + "description": "Fully customizable Classifer Free Guidance for ComfyUI", + "nickname": "ComfyUI-Prediction", + "title": "ComfyUI-Prediction", + "title_aux": "ComfyUI-Prediction" + } + ], + "https://github.com/rgthree/rgthree-comfy": [ + [], + { + "author": "rgthree", + "description": "A bunch of nodes I created that I also find useful.", + "nickname": "rgthree", + "nodename_pattern": " \\(rgthree\\)$", + "title": "Comfy Nodes", + "title_aux": "rgthree's ComfyUI Nodes" + } + ], + "https://github.com/rhdunn/comfyui-bus-plugin": [ + [ + "ComfyBus.CLIPEncodedPromptBusNode", + "ComfyBus.CheckpointBusNode", + "ComfyBus.ImageBusNode", + "ComfyBus.ImageParameterBusNode", + "ComfyBus.ImageScaleToSideParameterBusNode", + "ComfyBus.ImageSizeBusNode", + "ComfyBus.LatentImageBusNode", + "ComfyBus.LatentImageParameterBusNode", + "ComfyBus.PromptBusNode", + "ComfyBus.PromptSDXLBusNode" + ], + { + "title_aux": "comfyui-bus-plugin" + } + ], + "https://github.com/richinsley/Comfy-LFO": [ + [ + "LFO_Pulse", + "LFO_Sawtooth", + "LFO_Sine", + "LFO_Square", + "LFO_Triangle" + ], + { + "title_aux": "Comfy-LFO" + } + ], + "https://github.com/ricklove/comfyui-ricklove": [ + [ + "RL_Crop_Resize", + "RL_Crop_Resize_Batch", + "RL_Finetune_Analyze", + "RL_Finetune_Analyze_Batch", + "RL_Finetune_Variable", + "RL_Image_Shadow", + "RL_Image_Threshold_Channels", + "RL_Internet_Search", + "RL_LoadImageSequence", + "RL_Optical_Flow_Dip", + "RL_SaveImageSequence", + "RL_Uncrop", + "RL_Warp_Image", + "RL_Zoe_Depth_Map_Preprocessor", + "RL_Zoe_Depth_Map_Preprocessor_Raw_Infer", + "RL_Zoe_Depth_Map_Preprocessor_Raw_Process" + ], + { + "title_aux": "comfyui-ricklove" + } + ], + "https://github.com/risunobushi/comfyUI_FrequencySeparation_RGB-HSV": [ + [ + "FrequencyCombination", + "FrequencyCombinationHSV", + "FrequencySeparation", + "FrequencySeparationHSV" + ], + { + "title_aux": "comfyUI_FrequencySeparation_RGB-HSV" + } + ], + "https://github.com/rklaffehn/rk-comfy-nodes": [ + [ + "RK_CivitAIAddHashes", + "RK_CivitAIMetaChecker" + ], + { + "title_aux": "rk-comfy-nodes" + } + ], + "https://github.com/romeobuilderotti/ComfyUI-PNG-Metadata": [ + [ + "SetMetadataAll", + "SetMetadataString" + ], + { + "title_aux": "ComfyUI PNG Metadata" + } + ], + "https://github.com/ronniebasak/ComfyUI-Tara-LLM-Integration": [ + [ + "TaraAdvancedComposition", + "TaraApiKeyLoader", + "TaraApiKeySaver", + "TaraDaisyChainNode", + "TaraLLMConfig", + "TaraPresetLLMConfig", + "TaraPrompter", + "TaraPrompterAdvanced" + ], + { + "title_aux": "ComfyUI-Tara-LLM-Integration" + } + ], + "https://github.com/royceschultz/ComfyUI-Notifications": [ + [ + "Notif-PlaySound", + "Notif-SystemNotification", + "Notif-UnifiedNotification", + "Notif-Webhook" + ], + { + "title_aux": "ComfyUI-Notifications" + } + ], + "https://github.com/royceschultz/ComfyUI-TranscriptionTools": [ + [ + "TT-AudioSink", + "TT-ConvertVhsAudioToAudio", + "TT-LoadAudio", + "TT-LoadBatch", + "TT-LoadVideoAudio", + "TT-LoadWhisperModel", + "TT-WhisperTranscription", + "TT-WhisperTranscriptionBatch" + ], + { + "title_aux": "ComfyUI-TranscriptionTools" + } + ], + "https://github.com/rui40000/RUI-Nodes": [ + [ + "ABCondition", + "CharacterCount" + ], + { + "title_aux": "RUI-Nodes" + } + ], + "https://github.com/ruiqutech/ComfyUI-RuiquNodes": [ + [ + "EvaluateListMultiple1", + "EvaluateListMultiple3", + "EvaluateListMultiple6", + "EvaluateListMultiple9", + "EvaluateMultiple1", + "EvaluateMultiple3", + "EvaluateMultiple6", + "EvaluateMultiple9", + "ImageDilate", + "ImageErode", + "ListPath", + "MaskDilate", + "MaskErode", + "PreviewMask", + "RangeSplit", + "SaveMask", + "StringAsAny", + "StringConcat1", + "StringConcat3", + "StringConcat6", + "StringConcat9", + "StringPathStem", + "TermsToList", + "VAEDecodeSave" + ], + { + "title_aux": "RuiquNodes for ComfyUI" + } + ], + "https://github.com/runtime44/comfyui_r44_nodes": [ + [ + "Runtime44ColorMatch", + "Runtime44DynamicKSampler", + "Runtime44FilmGrain", + "Runtime44ImageEnhance", + "Runtime44ImageOverlay", + "Runtime44ImageResizer", + "Runtime44ImageToNoise", + "Runtime44IterativeUpscaleFactor", + "Runtime44MaskSampler", + "Runtime44TiledMaskSampler", + "Runtime44Upscaler" + ], + { + "title_aux": "Runtime44 ComfyUI Nodes" + } + ], + "https://github.com/s1dlx/comfy_meh/raw/main/meh.py": [ + [ + "MergingExecutionHelper" + ], + { + "title_aux": "comfy_meh" + } + ], + "https://github.com/saftle/suplex_comfy_nodes": [ + [ + "ControlNet Selector", + "ControlNetOptionalLoader", + "DiffusersSelector", + "SaveImageJPGNoMeta" + ], + { + "title_aux": "Suplex Misc ComfyUI Nodes" + } + ], + "https://github.com/sdfxai/SDFXBridgeForComfyUI": [ + [ + "SDFXClipTextEncode" + ], + { + "title_aux": "SDFXBridgeForComfyUI - ComfyUI Custom Node for SDFX Integration" + } + ], + "https://github.com/seanlynch/comfyui-optical-flow": [ + [ + "Apply optical flow", + "Compute optical flow", + "Visualize optical flow" + ], + { + "title_aux": "ComfyUI Optical Flow" + } + ], + "https://github.com/seanlynch/srl-nodes": [ + [ + "SRL Conditional Interrrupt", + "SRL Eval", + "SRL Filter Image List", + "SRL Format String" + ], + { + "title_aux": "SRL's nodes" + } + ], + "https://github.com/seghier/ComfyUI_LibreTranslate/raw/main/translate_node.py": [ + [ + "LibreTranslate" + ], + { + "title_aux": "ComfyUI_LibreTranslate" + } + ], + "https://github.com/sergekatzmann/ComfyUI_Nimbus-Pack": [ + [ + "AdjustAndRoundDimensions", + "AspectRatioMobileDevices", + "ImageResizeAndCropNode", + "ImageSquareAdapterNode", + "PopularScreenResolutions" + ], + { + "title_aux": "ComfyUI_Nimbus-Pack" + } + ], + "https://github.com/shadowcz007/comfyui-Image-reward": [ + [ + "ImageBatchToList_", + "ImageRewardScore_" + ], + { + "title_aux": "comfyui-Image-reward" + } + ], + "https://github.com/shadowcz007/comfyui-consistency-decoder": [ + [ + "VAEDecodeConsistencyDecoder", + "VAELoaderConsistencyDecoder" + ], + { + "title_aux": "Consistency Decoder" + } + ], + "https://github.com/shadowcz007/comfyui-edit-mask": [ + [ + "EditMask" + ], + { + "title_aux": "comfyui-edit-mask" + } + ], + "https://github.com/shadowcz007/comfyui-liveportrait": [ + [ + "FaceCropInfo", + "LivePortraitNode", + "Retargeting" + ], + { + "title_aux": "comfyui-liveportrait" + } + ], + "https://github.com/shadowcz007/comfyui-mixlab-nodes": [ + [ + "3DImage", + "AppInfo", + "ApplyVisualStylePrompting_", + "AreaToMask", + "AudioPlay", + "CenterImage", + "CkptNames_", + "Color", + "ComparingTwoFrames_", + "CompositeImages_", + "DynamicDelayProcessor", + "EmbeddingPrompt", + "EnhanceImage", + "FaceToMask", + "FeatheredMask", + "FloatSlider", + "FloatingVideo", + "Font", + "GLIGENTextBoxApply_Advanced", + "GetImageSize_", + "GradientImage", + "GridDisplayAndSave", + "GridInput", + "GridOutput", + "ImageColorTransfer", + "ImageCropByAlpha", + "ImageListToBatch_", + "ImagesPrompt_", + "IncrementingListNode_", + "IntNumber", + "JoinWithDelimiter", + "LimitNumber", + "ListSplit_", + "LoadImagesFromPath", + "LoadImagesFromURL", + "LoadImagesToBatch", + "LoraNames_", + "LoraPrompt", + "MaskListMerge_", + "MaskListReplace_", + "MergeLayers", + "MirroredImage", + "MultiplicationNode", + "NewLayer", + "NoiseImage", + "OutlineMask", + "PreviewMask_", + "PromptImage", + "PromptSimplification", + "PromptSlide", + "RandomPrompt", + "ResizeImageMixlab", + "SamplerNames_", + "SaveImageAndMetadata_", + "SaveImageToLocal", + "ScreenShare", + "Seed_", + "ShowLayer", + "SmoothMask", + "SpeechRecognition", + "SpeechSynthesis", + "SplitImage", + "SplitLongMask", + "StyleAlignedBatchAlign_", + "StyleAlignedReferenceSampler_", + "StyleAlignedSampleReferenceLatents_", + "SvgImage", + "SwitchByIndex", + "TESTNODE_", + "TESTNODE_TOKEN", + "TextImage", + "TextInput_", + "TextToNumber", + "TransparentImage", + "VAEDecodeConsistencyDecoder", + "VAELoaderConsistencyDecoder" + ], + { + "title_aux": "comfyui-mixlab-nodes" + } + ], + "https://github.com/shadowcz007/comfyui-sound-lab": [ + [ + "AudioPlay", + "Musicgen_", + "StableAudio_" + ], + { + "title_aux": "comfyui-sound-lab" + } + ], + "https://github.com/shadowcz007/comfyui-ultralytics-yolo": [ + [ + "DetectByLabel" + ], + { + "title_aux": "comfyui-ultralytics-yolo" + } + ], + "https://github.com/shi3z/ComfyUI_Memeplex_DALLE": [ + [ + "DallERender", + "GPT", + "MemeplexCustomSDXLRender", + "MemeplexRender", + "TextInput", + "TextSend" + ], + { + "title_aux": "ComfyUI_Memeplex_DALLE" + } + ], + "https://github.com/shiimizu/ComfyUI-PhotoMaker-Plus": [ + [ + "PhotoMakerEncodePlus", + "PhotoMakerStyles", + "PrepImagesForClipVisionFromPath" + ], + { + "title_aux": "ComfyUI PhotoMaker Plus" + } + ], + "https://github.com/shiimizu/ComfyUI-TiledDiffusion": [ + [ + "NoiseInversion", + "TiledDiffusion", + "VAEDecodeTiled_TiledDiffusion", + "VAEEncodeTiled_TiledDiffusion" + ], + { + "title_aux": "Tiled Diffusion & VAE for ComfyUI" + } + ], + "https://github.com/shiimizu/ComfyUI_smZNodes": [ + [ + "smZ CLIPTextEncode", + "smZ Settings" + ], + { + "title_aux": "smZNodes" + } + ], + "https://github.com/shingo1228/ComfyUI-SDXL-EmptyLatentImage": [ + [ + "SDXL Empty Latent Image" + ], + { + "title_aux": "ComfyUI-SDXL-EmptyLatentImage" + } + ], + "https://github.com/shingo1228/ComfyUI-send-eagle-slim": [ + [ + "Send Eagle with text", + "Send Webp Image to Eagle" + ], + { + "title_aux": "ComfyUI-send-Eagle(slim)" + } + ], + "https://github.com/shobhitic/ComfyUI-PlusMinusTextClip": [ + [ + "PlusMinusTextClip" + ], + { + "title_aux": "PlusMinusTextClip - Single node for Positive and Negative Prompts" + } + ], + "https://github.com/shockz0rz/ComfyUI_InterpolateEverything": [ + [ + "OpenposePreprocessorInterpolate" + ], + { + "title_aux": "InterpolateEverything" + } + ], + "https://github.com/shockz0rz/comfy-easy-grids": [ + [ + "FloatToText", + "GridFloatList", + "GridFloats", + "GridIntList", + "GridInts", + "GridLoras", + "GridStringList", + "GridStrings", + "ImageGridCommander", + "IntToText", + "SaveImageGrid", + "TextConcatenator" + ], + { + "title_aux": "comfy-easy-grids" + } + ], + "https://github.com/sipherxyz/comfyui-art-venture": [ + [ + "AV_AwsBedrockClaudeApi", + "AV_AwsBedrockMistralApi", + "AV_CheckpointMerge", + "AV_CheckpointModelsToParametersPipe", + "AV_CheckpointSave", + "AV_ClaudeApi", + "AV_ControlNetEfficientLoader", + "AV_ControlNetEfficientLoaderAdvanced", + "AV_ControlNetEfficientStacker", + "AV_ControlNetEfficientStackerSimple", + "AV_ControlNetLoader", + "AV_ControlNetPreprocessor", + "AV_LLMApiConfig", + "AV_LLMChat", + "AV_LLMCompletion", + "AV_LLMMessage", + "AV_LoraListLoader", + "AV_LoraListStacker", + "AV_LoraLoader", + "AV_OpenAIApi", + "AV_ParametersPipeToCheckpointModels", + "AV_ParametersPipeToPrompts", + "AV_PromptsToParametersPipe", + "AV_SAMLoader", + "AV_VAELoader", + "AspectRatioSelector", + "BLIPCaption", + "BLIPLoader", + "BooleanPrimitive", + "CheckpointNameSelector", + "ColorBlend", + "ColorCorrect", + "DeepDanbooruCaption", + "DependenciesEdit", + "Fooocus_KSampler", + "Fooocus_KSamplerAdvanced", + "GetBoolFromJson", + "GetFloatFromJson", + "GetIntFromJson", + "GetObjectFromJson", + "GetSAMEmbedding", + "GetTextFromJson", + "ISNetLoader", + "ISNetSegment", + "ImageAlphaComposite", + "ImageApplyChannel", + "ImageExtractChannel", + "ImageGaussianBlur", + "ImageMuxer", + "ImageRepeat", + "ImageScaleDown", + "ImageScaleDownBy", + "ImageScaleDownToSize", + "ImageScaleToMegapixels", + "LaMaInpaint", + "LoadImageAsMaskFromUrl", + "LoadImageFromUrl", + "LoadJsonFromUrl", + "MergeModels", + "NumberScaler", + "OverlayInpaintedImage", + "OverlayInpaintedLatent", + "PrepareImageAndMaskForInpaint", + "QRCodeGenerator", + "RandomFloat", + "RandomInt", + "SAMEmbeddingToImage", + "SDXLAspectRatioSelector", + "SDXLPromptStyler", + "SeedSelector", + "StringToInt", + "StringToNumber" + ], + { + "title_aux": "comfyui-art-venture" + } + ], + "https://github.com/skfoo/ComfyUI-Coziness": [ + [ + "LoraTextExtractor-b1f83aa2", + "MultiLoraLoader-70bf3d77" + ], + { + "title_aux": "ComfyUI-Coziness" + } + ], + "https://github.com/slyt/comfyui-ollama-nodes": [ + [ + "BooleanToString", + "DownloadHuggingfaceModel", + "FloatToString", + "GenerateOllama", + "IntToString", + "ListModels", + "ListToString", + "PullModel" + ], + { + "title_aux": "comfyui-ollama-nodes" + } + ], + "https://github.com/smagnetize/kb-comfyui-nodes": [ + [ + "SingleImageDataUrlLoader" + ], + { + "title_aux": "kb-comfyui-nodes" + } + ], + "https://github.com/smthemex/ComfyUI_AnyDoor": [ + [ + "AnyDoor_LoadModel", + "AnyDoor_img2img" + ], + { + "title_aux": "ComfyUI_AnyDoor" + } + ], + "https://github.com/smthemex/ComfyUI_ChatGLM_API": [ + [ + "Glm_4_9b_Chat", + "Glm_4v_9b", + "Glm_Lcoal_Or_Repo", + "ZhipuaiApi_Character", + "ZhipuaiApi_Txt", + "ZhipuaiApi_img" + ], + { + "title_aux": "ComfyUI_ChatGLM_API" + } + ], + "https://github.com/smthemex/ComfyUI_CustomNet": [ + [ + "CustomNet_Plus" + ], + { + "title_aux": "ComfyUI_CustomNet" + } + ], + "https://github.com/smthemex/ComfyUI_HiDiffusion_Pro": [ + [ + "HI_Diffusers_Model_Loader", + "Hi_Sampler" + ], + { + "title_aux": "ComfyUI_HiDiffusion_Pro" + } + ], + "https://github.com/smthemex/ComfyUI_ID_Animator": [ + [ + "ID_Animator", + "ID_Repo_Choice" + ], + { + "title_aux": "ComfyUI_ID_Animator" + } + ], + "https://github.com/smthemex/ComfyUI_Llama3_8B": [ + [ + "ChatQA_1p5_8b", + "Local_Or_Repo_Choice", + "Meta_Llama3_8B", + "MiniCPM_Llama3_V25" + ], + { + "title_aux": "ComfyUI_Llama3_8B" + } + ], + "https://github.com/smthemex/ComfyUI_MS_Diffusion": [ + [ + "MS_Comic_Type", + "MSdiffusion_Model_Loader", + "MSdiffusion_Sampler" + ], + { + "title_aux": "ComfyUI_MS_Diffusion" + } + ], + "https://github.com/smthemex/ComfyUI_ParlerTTS": [ + [ + "PromptToAudio" + ], + { + "title_aux": "ComfyUI_ParlerTTS" + } + ], + "https://github.com/smthemex/ComfyUI_Pic2Story": [ + [ + "Pic2Story" + ], + { + "title_aux": "ComfyUI_Pic2Story" + } + ], + "https://github.com/smthemex/ComfyUI_Pipeline_Tool": [ + [ + "Pipeline_Tool" + ], + { + "title_aux": "ComfyUI_Pipeline_Tool" + } + ], + "https://github.com/smthemex/ComfyUI_Pops": [ + [ + "Imgae_To_Path", + "Pops_Prior_Embedding", + "Pops_Repo_Choice", + "Pops_Sampler" + ], + { + "title_aux": "ComfyUI_Pops" + } + ], + "https://github.com/smthemex/ComfyUI_StableAudio_Open": [ + [ + "StableAudio_Open", + "Use_LocalModel_Or_Repo" + ], + { + "title_aux": "ComfyUI_StableAudio_Open" + } + ], + "https://github.com/smthemex/ComfyUI_StoryDiffusion": [ + [ + "Comic_Type", + "Pre_Translate_prompt", + "Storydiffusion_Model_Loader", + "Storydiffusion_Sampler" + ], + { + "title_aux": "ComfyUI_StoryDiffusion" + } + ], + "https://github.com/smthemex/ComfyUI_Streamv2v_Plus": [ + [ + "Load_Stream", + "Text2IMG", + "Video2Video", + "WebCam2Video" + ], + { + "title_aux": "ComfyUI_Streamv2v_Plus" + } + ], + "https://github.com/space-nuko/ComfyUI-Disco-Diffusion": [ + [ + "DiscoDiffusion_DiscoDiffusion", + "DiscoDiffusion_DiscoDiffusionExtraSettings", + "DiscoDiffusion_GuidedDiffusionLoader", + "DiscoDiffusion_OpenAICLIPLoader" + ], + { + "title_aux": "Disco Diffusion" + } + ], + "https://github.com/space-nuko/ComfyUI-OpenPose-Editor": [ + [ + "Nui.OpenPoseEditor" + ], + { + "title_aux": "OpenPose Editor" + } + ], + "https://github.com/space-nuko/nui-suite": [ + [ + "Nui.DynamicPromptsTextGen", + "Nui.FeelingLuckyTextGen", + "Nui.OutputString" + ], + { + "title_aux": "nui suite" + } + ], + "https://github.com/spacepxl/ComfyUI-Florence-2": [ + [ + "Florence2", + "Florence2Postprocess", + "Florence2PostprocessAll", + "LoadFlorence2Model" + ], + { + "title_aux": "ComfyUI-Florence-2" + } + ], + "https://github.com/spacepxl/ComfyUI-HQ-Image-Save": [ + [ + "LoadEXR", + "LoadEXRFrames", + "LoadLatentEXR", + "SaveEXR", + "SaveEXRFrames", + "SaveLatentEXR", + "SaveTiff" + ], + { + "title_aux": "ComfyUI-HQ-Image-Save" + } + ], + "https://github.com/spacepxl/ComfyUI-Image-Filters": [ + [ + "AdainFilterLatent", + "AdainImage", + "AdainLatent", + "AlphaClean", + "AlphaMatte", + "BatchAlign", + "BatchAverageImage", + "BatchAverageUnJittered", + "BatchNormalizeImage", + "BatchNormalizeLatent", + "BetterFilmGrain", + "BilateralFilterImage", + "BlurImageFast", + "BlurMaskFast", + "ClampOutliers", + "ColorMatchImage", + "ConvertNormals", + "DifferenceChecker", + "DilateErodeMask", + "EnhanceDetail", + "ExposureAdjust", + "FrequencyCombine", + "FrequencySeparate", + "GameOfLife", + "GuidedFilterAlpha", + "GuidedFilterImage", + "ImageConstant", + "ImageConstantHSV", + "InstructPixToPixConditioningAdvanced", + "JitterImage", + "Keyer", + "LatentNormalizeShuffle", + "LatentStats", + "MedianFilterImage", + "NormalMapSimple", + "OffsetLatentImage", + "PrintSigmas", + "RelightSimple", + "RemapRange", + "RestoreDetail", + "SharpenFilterLatent", + "ShuffleChannels", + "Tonemap", + "UnJitterImage", + "UnTonemap", + "VisualizeLatents" + ], + { + "title_aux": "ComfyUI-Image-Filters" + } + ], + "https://github.com/spacepxl/ComfyUI-RAVE": [ + [ + "ConditioningDebug", + "ImageGridCompose", + "ImageGridDecompose", + "KSamplerRAVE", + "LatentGridCompose", + "LatentGridDecompose" + ], + { + "title_aux": "ComfyUI-RAVE" + } + ], + "https://github.com/spacepxl/ComfyUI-StyleGan": [ + [ + "BatchAverageStyleGANLatents", + "BlendStyleGANLatents", + "GenerateStyleGANLatent", + "LoadStyleGAN", + "StyleGANInversion", + "StyleGANLatentFromBatch", + "StyleGANSampler" + ], + { + "title_aux": "ComfyUI-StyleGan" + } + ], + "https://github.com/spinagon/ComfyUI-seam-carving": [ + [ + "SeamCarving" + ], + { + "title_aux": "ComfyUI-seam-carving" + } + ], + "https://github.com/spinagon/ComfyUI-seamless-tiling": [ + [ + "CircularVAEDecode", + "MakeCircularVAE", + "OffsetImage", + "SeamlessTile" + ], + { + "title_aux": "Seamless tiling Node for ComfyUI" + } + ], + "https://github.com/spro/comfyui-mirror": [ + [ + "LatentMirror" + ], + { + "title_aux": "Latent Mirror node for ComfyUI" + } + ], + "https://github.com/ssitu/ComfyUI_UltimateSDUpscale": [ + [ + "UltimateSDUpscale", + "UltimateSDUpscaleCustomSample", + "UltimateSDUpscaleNoUpscale" + ], + { + "title_aux": "UltimateSDUpscale" + } + ], + "https://github.com/ssitu/ComfyUI_fabric": [ + [ + "FABRICPatchModel", + "FABRICPatchModelAdv", + "KSamplerAdvFABRICAdv", + "KSamplerFABRIC", + "KSamplerFABRICAdv" + ], + { + "title_aux": "ComfyUI fabric" + } + ], + "https://github.com/ssitu/ComfyUI_restart_sampling": [ + [ + "KRestartSampler", + "KRestartSamplerAdv", + "KRestartSamplerCustom", + "KRestartSamplerSimple", + "RestartSampler", + "RestartScheduler" + ], + { + "title_aux": "Restart Sampling" + } + ], + "https://github.com/ssitu/ComfyUI_roop": [ + [ + "RoopImproved", + "roop" + ], + { + "title_aux": "ComfyUI roop" + } + ], + "https://github.com/stavsap/comfyui-ollama": [ + [ + "OllamaGenerate", + "OllamaGenerateAdvance", + "OllamaVision" + ], + { + "title_aux": "ComfyUI Ollama" + } + ], + "https://github.com/storyicon/comfyui_musev_evolved": [ + [ + "AnimationZoom (comfyui_musev_evolved)", + "ImageSelector (comfyui_musev_evolved)", + "MuseVImg2Vid V1 (comfyui_musev_evolved)", + "MuseVPredictor V1 (comfyui_musev_evolved)" + ], + { + "author": "infguo", + "title_aux": "ComfyUI MuseV Evolved" + } + ], + "https://github.com/storyicon/comfyui_segment_anything": [ + [ + "GroundingDinoModelLoader (segment anything)", + "GroundingDinoSAMSegment (segment anything)", + "InvertMask (segment anything)", + "IsMaskEmpty", + "SAMModelLoader (segment anything)" + ], + { + "title_aux": "segment anything" + } + ], + "https://github.com/strimmlarn/ComfyUI_Strimmlarns_aesthetic_score": [ + [ + "AesthetlcScoreSorter", + "CalculateAestheticScore", + "LoadAesteticModel", + "ScoreToNumber" + ], + { + "title_aux": "ComfyUI_Strimmlarns_aesthetic_score" + } + ], + "https://github.com/styler00dollar/ComfyUI-deepcache": [ + [ + "DeepCache" + ], + { + "title_aux": "ComfyUI-deepcache" + } + ], + "https://github.com/styler00dollar/ComfyUI-sudo-latent-upscale": [ + [ + "SudoLatentUpscale" + ], + { + "title_aux": "ComfyUI-sudo-latent-upscale" + } + ], + "https://github.com/sugarkwork/comfyui_cohere": [ + [ + "SimpleCohereNode" + ], + { + "title_aux": "comfyui_cohere" + } + ], + "https://github.com/sugarkwork/comfyui_tag_fillter": [ + [ + "TagFilter", + "TagMerger", + "TagRemover", + "TagReplace", + "TagSwitcher" + ], + { + "title_aux": "comfyui_tag_filter" + } + ], + "https://github.com/superyoman/comfyui_lumaAPI": [ + [ + "LUMA_API_YoC", + "LUMA_API_result_YoC" + ], + { + "title_aux": "comfyui_lumaAPI" + } + ], + "https://github.com/syllebra/bilbox-comfyui": [ + [ + "BilboXLut", + "BilboXPhotoPrompt", + "BilboXVignette" + ], + { + "title_aux": "BilboX's ComfyUI Custom Nodes" + } + ], + "https://github.com/sylym/comfy_vid2vid": [ + [ + "CheckpointLoaderSimpleSequence", + "DdimInversionSequence", + "KSamplerSequence", + "LoadImageMaskSequence", + "LoadImageSequence", + "LoraLoaderSequence", + "SetLatentNoiseSequence", + "TrainUnetSequence", + "VAEEncodeForInpaintSequence" + ], + { + "title_aux": "Vid2vid" + } + ], + "https://github.com/szhublox/ambw_comfyui": [ + [ + "Auto Merge Block Weighted", + "CLIPMergeSimple", + "CheckpointSave", + "ModelMergeBlocks", + "ModelMergeSimple" + ], + { + "title_aux": "Auto-MBW" + } + ], + "https://github.com/taabata/Comfy_Syrian_Falcon_Nodes/raw/main/SyrianFalconNodes.py": [ + [ + "CompositeImage", + "KSamplerAlternate", + "KSamplerPromptEdit", + "KSamplerPromptEditAndAlternate", + "LoopBack", + "QRGenerate", + "WordAsImage" + ], + { + "title_aux": "Syrian Falcon Nodes" + } + ], + "https://github.com/taabata/LCM_Inpaint-Outpaint_Comfy": [ + [ + "ComfyNodesToSaveCanvas", + "FloatNumber", + "FreeU_LCM", + "ImageDims", + "ImageOutputToComfyNodes", + "ImageResize", + "ImageShuffle", + "ImageSwitch", + "LCMGenerate", + "LCMGenerate_ReferenceOnly", + "LCMGenerate_SDTurbo", + "LCMGenerate_img2img", + "LCMGenerate_img2img_IPAdapter", + "LCMGenerate_img2img_controlnet", + "LCMGenerate_inpaintv2", + "LCMGenerate_inpaintv3", + "LCMLoader", + "LCMLoader_RefInpaint", + "LCMLoader_ReferenceOnly", + "LCMLoader_SDTurbo", + "LCMLoader_controlnet", + "LCMLoader_controlnet_inpaint", + "LCMLoader_img2img", + "LCMLoraLoader_inpaint", + "LCMLoraLoader_ipadapter", + "LCMLora_inpaint", + "LCMLora_inpaintV2", + "LCMLora_ipadapter", + "LCMT2IAdapter", + "LCM_IPAdapter", + "LCM_IPAdapter_inpaint", + "LCM_outpaint_prep", + "LoadImageNode_LCM", + "Loader_SegmindVega", + "OutpaintCanvasTool", + "SaveImage_Canvas", + "SaveImage_LCM", + "SaveImage_Puzzle", + "SaveImage_PuzzleV2", + "SegmindVega", + "SettingsSwitch", + "stitch" + ], + { + "title_aux": "LCM_Inpaint-Outpaint_Comfy" + } + ], + "https://github.com/talesofai/comfyui-browser": [ + [ + "DifyTextGenerator //Browser", + "LoadImageByUrl //Browser", + "SelectInputs //Browser", + "UploadToRemote //Browser", + "XyzPlot //Browser" + ], + { + "title_aux": "ComfyUI Browser" + } + ], + "https://github.com/teward/ComfyUI-Helper-Nodes": [ + [ + "HelperNodes_CfgScale", + "HelperNodes_CheckpointSelector", + "HelperNodes_MultilineStringLiteral", + "HelperNodes_Prompt", + "HelperNodes_SDXLCommonResolutions", + "HelperNodes_SamplerSelector", + "HelperNodes_SaveImage", + "HelperNodes_SchedulerSelector", + "HelperNodes_SeedSelector", + "HelperNodes_Steps", + "HelperNodes_StringLiteral", + "HelperNodes_VAESelector", + "HelperNodes_WidthHeight" + ], + { + "title_aux": "ComfyUI-Helper-Nodes" + } + ], + "https://github.com/theUpsider/ComfyUI-Logic": [ + [ + "Bool-\ud83d\udd2c", + "Compare-\ud83d\udd2c", + "DebugPrint-\ud83d\udd2c", + "Float-\ud83d\udd2c", + "If ANY return A else B-\ud83d\udd2c", + "Int-\ud83d\udd2c", + "String-\ud83d\udd2c" + ], + { + "title_aux": "ComfyUI-Logic" + } + ], + "https://github.com/theUpsider/ComfyUI-Styles_CSV_Loader": [ + [ + "Load Styles CSV" + ], + { + "title_aux": "Styles CSV Loader Extension for ComfyUI" + } + ], + "https://github.com/thecooltechguy/ComfyUI-MagicAnimate": [ + [ + "MagicAnimate", + "MagicAnimateModelLoader" + ], + { + "title_aux": "ComfyUI-MagicAnimate" + } + ], + "https://github.com/thecooltechguy/ComfyUI-Stable-Video-Diffusion": [ + [ + "SVDDecoder", + "SVDModelLoader", + "SVDSampler", + "SVDSimpleImg2Vid" + ], + { + "title_aux": "ComfyUI Stable Video Diffusion" + } + ], + "https://github.com/tiankuan93/ComfyUI-V-Express": [ + [ + "Load_Audio_Path", + "Load_Audio_Path_From_Video", + "Load_Image_Path", + "Load_Kps_Path", + "Load_Kps_Path_From_Video", + "Load_Video_Path", + "VEINTConstant", + "VEPreview_Video", + "VEStringConstant", + "V_Express_Loader", + "V_Express_Sampler" + ], + { + "title_aux": "V-Express: Conditional Dropout for Progressive Training of Portrait Video Generation" + } + ], + "https://github.com/tianlang0704/ComfyUI-StableProjectorzBridge": [ + [ + "ProjectorzControlnetInput", + "ProjectorzControlnetParameter", + "ProjectorzInitInput", + "ProjectorzOutput", + "ProjectorzParameter", + "ProjectorzStringToFloat", + "ProjectorzStringToInt" + ], + { + "title_aux": "Stable Projectorz Bridge" + } + ], + "https://github.com/time-river/ComfyUI-CLIPSeg/raw/main/custom_nodes/clipseg.py": [ + [ + "CLIPSeg", + "CombineSegMasks" + ], + { + "title_aux": "CLIPSeg" + } + ], + "https://github.com/tmagara/ComfyUI-Prediction-Boost": [ + [ + "PredictionBoost" + ], + { + "title_aux": "ComfyUI-Prediction-Boost" + } + ], + "https://github.com/tocubed/ComfyUI-AudioReactor": [ + [ + "AudioFrameTransformBeats", + "AudioFrameTransformShadertoy", + "AudioLoadPath", + "Shadertoy" + ], + { + "title_aux": "ComfyUI-AudioReactor" + } + ], + "https://github.com/tooldigital/ComfyUI-Yolo-Cropper": [ + [ + "ToolYoloCropper" + ], + { + "title_aux": "Easy automatic (square) image cropper using Yolo" + } + ], + "https://github.com/toxicwind/ComfyUI-TTools": [ + [ + "TTools Extract JSON", + "TTools SD3 Resolution Solver" + ], + { + "title_aux": "TTools for ComfyUI" + } + ], + "https://github.com/toyxyz/ComfyUI_toyxyz_test_nodes": [ + [ + "CaptureWebcam", + "ImageResize_Padding", + "LatentDelay", + "LoadWebcamImage", + "SaveImagetoPath" + ], + { + "title_aux": "ComfyUI_toyxyz_test_nodes" + } + ], + "https://github.com/traugdor/ComfyUI-quadMoons-nodes": [ + [ + "quadmoonCLIPTextEncode", + "quadmoonChangeBackground", + "quadmoonConvertBoolToString", + "quadmoonConvertFloatToString", + "quadmoonConvertIntToString", + "quadmoonConvertNormalizeHW", + "quadmoonConvertNumberToString", + "quadmoonINTConditionalOperation", + "quadmoonKSampler", + "quadmoonKSamplerAdvanced", + "quadmoonLoadConfigs", + "quadmoonModelLoader", + "quadmoonSaveNeg", + "quadmoonSavePrompt", + "quadmoonSmartNeg", + "quadmoonSmartPrompt", + "quadmoonThebutton" + ], + { + "author": "quadmoon (https://github.com/traugdor)", + "description": "These are just some nodes I wanted and couldn't find where anyone else had made them yet.", + "nickname": "quadmoon's Nodes", + "title": "quadmoon's ComfyUI nodes", + "title_aux": "quadmoon's ComfyUI nodes" + } + ], + "https://github.com/tritant/ComfyUI_CreaPrompt": [ + [ + "CreaPrompt", + "CreaPrompt List" + ], + { + "title_aux": "ComfyUI-CreaPrompt" + } + ], + "https://github.com/trojblue/trNodes": [ + [ + "trColorCorrection", + "trLayering", + "trRouter", + "trRouterLonger" + ], + { + "title_aux": "trNodes" + } + ], + "https://github.com/trumanwong/ComfyUI-NSFW-Detection": [ + [ + "NSFWDetection" + ], + { + "title_aux": "ComfyUI-NSFW-Detection" + } + ], + "https://github.com/tsogzark/ComfyUI-load-image-from-url": [ + [ + "LoadImageFromUrlOrPath" + ], + { + "title_aux": "ComfyUI-load-image-from-url" + } + ], + "https://github.com/ttulttul/ComfyUI-Iterative-Mixer": [ + [ + "Batch Unsampler", + "Iterative Mixing KSampler", + "Iterative Mixing KSampler Advanced", + "IterativeMixingSampler", + "IterativeMixingScheduler", + "IterativeMixingSchedulerAdvanced", + "Latent Batch Comparison Plot", + "Latent Batch Statistics Plot", + "MixingMaskGenerator" + ], + { + "title_aux": "ComfyUI Iterative Mixing Nodes" + } + ], + "https://github.com/ttulttul/ComfyUI-Tensor-Operations": [ + [ + "Fast Image to Noise", + "Image Match Normalize", + "Latent Match Normalize" + ], + { + "title_aux": "ComfyUI-Tensor-Operations" + } + ], + "https://github.com/tudal/Hakkun-ComfyUI-nodes/raw/main/hakkun_nodes.py": [ + [ + "Any Converter", + "Calculate Upscale", + "Image Resize To Height", + "Image Resize To Width", + "Image size to string", + "Load Random Image", + "Load Text", + "Multi Text Merge", + "Prompt Parser", + "Random Line", + "Random Line 4" + ], + { + "title_aux": "Hakkun-ComfyUI-nodes" + } + ], + "https://github.com/tusharbhutt/Endless-Nodes": [ + [ + "ESS Aesthetic Scoring", + "ESS Combo Parameterizer", + "ESS Combo Parameterizer & Prompts", + "ESS Eight Input Text Switch", + "ESS Float to Integer", + "ESS Float to Number", + "ESS Float to String", + "ESS Float to X", + "ESS Image Reward", + "ESS Image Saver with JSON", + "ESS Integer to Float", + "ESS Integer to Number", + "ESS Integer to String", + "ESS Integer to X", + "ESS Number to Float", + "ESS Number to Integer", + "ESS Number to String", + "ESS Number to X", + "ESS Parameterizer", + "ESS Parameterizer & Prompts", + "ESS Six Float Output", + "ESS Six Input Text Switch", + "ESS Six Integer IO Switch", + "ESS Six Integer IO Widget", + "ESS String to Float", + "ESS String to Integer", + "ESS String to Num", + "ESS String to X", + "\u267e\ufe0f\ud83c\udf0a\u2728 Image Saver with JSON" + ], + { + "author": "BiffMunky", + "description": "A small set of nodes I created for various numerical and text inputs. Features image saver with ability to have JSON saved to separate folder, parameter collection nodes, two aesthetic scoring models, switches for text and numbers, and conversion of string to numeric and vice versa.", + "nickname": "\u267e\ufe0f\ud83c\udf0a\u2728", + "title": "Endless \ufe0f\ud83c\udf0a\u2728 Nodes", + "title_aux": "Endless \ufe0f\ud83c\udf0a\u2728 Nodes" + } + ], + "https://github.com/twri/sdxl_prompt_styler": [ + [ + "SDXLPromptStyler", + "SDXLPromptStylerAdvanced" + ], + { + "title_aux": "SDXL Prompt Styler" + } + ], + "https://github.com/ty0x2333/ComfyUI-Dev-Utils": [ + [ + "TY_ExecutionTime", + "TY_UploadAnything", + "TY_UrlDownload" + ], + { + "title_aux": "ComfyUI-Dev-Utils" + } + ], + "https://github.com/uarefans/ComfyUI-Fans": [ + [ + "Fans Prompt Styler Negative", + "Fans Prompt Styler Positive", + "Fans Styler", + "Fans Text Concatenate" + ], + { + "title_aux": "ComfyUI-Fans" + } + ], + "https://github.com/uetuluk/comfyui-webcam-node": [ + [ + "webcam_capture_node" + ], + { + "title_aux": "comfyui-webcam-node" + } + ], + "https://github.com/unwdef/unwdef-nodes-comfyui": [ + [ + "RandomTextFromMultiline", + "RandomizeLoras", + "RandomizeLorasStack", + "TextMultilineWithVariables" + ], + { + "title_aux": "unwdef-nodes" + } + ], + "https://github.com/vanche1212/ComfyUI-ZMG-Nodes": [ + [ + "VC_Load_Video_Path_Unified_Output", + "VC_Load_Video_Upload_Unified_Output", + "VC_Video_Combine_Unified_Output", + "Waveform2Audio", + "\ud83d\ude0bAPI Request Node", + "\ud83d\ude0bJSON Parser Node", + "\ud83d\ude0bOld Photo Colorization Node", + "\ud83d\ude0bOllama Request Node", + "\ud83d\ude0bSave Image Unified Output" + ], + { + "title_aux": "ZMG PLUGIN" + } + ], + "https://github.com/vanillacode314/SimpleWildcardsComfyUI": [ + [ + "SimpleConcat", + "SimpleWildcard" + ], + { + "author": "VanillaCode314", + "description": "A simple wildcard node for ComfyUI. Can also be used a style prompt node.", + "nickname": "Simple Wildcard", + "title": "Simple Wildcard", + "title_aux": "Simple Wildcard" + } + ], + "https://github.com/veighnsche/comfyui_gr85": [ + [ + "GR85_ContainsWord", + "GR85_ElementsConcatenator", + "GR85_ImageDimensionResizer", + "GR85_ImageSizer", + "GR85_InsertCharacter", + "GR85_LlmEnhancer", + "GR85_NextSeed", + "GR85_RandomAtmLocOutfit", + "GR85_RandomRatio", + "GR85_RandomTitleCharacter", + "GR85_RandomWildcardTagPicker", + "GR85_ShowText", + "GR85_StrSafe", + "GR85_TagInjector" + ], + { + "title_aux": "comfyui_gr85" + } + ], + "https://github.com/victorchall/comfyui_webcamcapture": [ + [ + "WebcamCapture" + ], + { + "title_aux": "Comfyui Webcam capture node" + } + ], + "https://github.com/vienteck/ComfyUI-Chat-GPT-Integration": [ + [ + "ChatGptPrompt" + ], + { + "title_aux": "ComfyUI-Chat-GPT-Integration" + } + ], + "https://github.com/violet-chen/comfyui-psd2png": [ + [ + "Psd2Png" + ], + { + "title_aux": "comfyui-psd2png" + } + ], + "https://github.com/viperyl/ComfyUI-BiRefNet": [ + [ + "BiRefNet" + ], + { + "title_aux": "ComfyUI-BiRefNet" + } + ], + "https://github.com/viperyl/ComfyUI-RGT": [ + [ + "RGT_Upscale" + ], + { + "title_aux": "ComfyUI-RGT" + } + ], + "https://github.com/vivax3794/ComfyUI-Sub-Nodes": [ + [ + "VIV_Default", + "VIV_Subgraph", + "VIV_Subgraph_Inputs", + "VIV_Subgraph_Outputs" + ], + { + "title_aux": "ComfyUI-Sub-Nodes" + } + ], + "https://github.com/vivax3794/ComfyUI-Vivax-Nodes": [ + [ + "Any String", + "Chunk Up", + "Get Chunk", + "Inspect", + "Join Chunks", + "Model From URL" + ], + { + "title_aux": "ComfyUI-Vivax-Nodes" + } + ], + "https://github.com/vsevolod-oparin/comfyui-kandinsky22": [ + [ + "comfy-kandinsky22-decoder-loader", + "comfy-kandinsky22-hint-combiner", + "comfy-kandinsky22-image-encoder", + "comfy-kandinsky22-img-latents", + "comfy-kandinsky22-latents", + "comfy-kandinsky22-movq-decoder", + "comfy-kandinsky22-positive-text-encoder", + "comfy-kandinsky22-prior-averaging-2", + "comfy-kandinsky22-prior-averaging-3", + "comfy-kandinsky22-prior-averaging-4", + "comfy-kandinsky22-prior-loader", + "comfy-kandinsky22-text-encoder", + "comfy-kandinsky22-unet-decoder" + ], + { + "title_aux": "Kandinsky 2.2 ComfyUI Plugin" + } + ], + "https://github.com/vxinhao/color2rgb/raw/main/color2rgb.py": [ + [ + "color2RGB" + ], + { + "title_aux": "color2rgb" + } + ], + "https://github.com/wTechArtist/ComfyUI-CustomNodes": [ + [ + "Image Blending Mode Mask" + ], + { + "title_aux": "ComfyUI-CustomNodes" + } + ], + "https://github.com/wallish77/wlsh_nodes": [ + [ + "Alternating KSampler (WLSH)", + "Build Filename String (WLSH)", + "CLIP +/- w/Text Unified (WLSH)", + "CLIP Positive-Negative (WLSH)", + "CLIP Positive-Negative XL (WLSH)", + "CLIP Positive-Negative XL w/Text (WLSH)", + "CLIP Positive-Negative w/Text (WLSH)", + "Checkpoint Loader w/Name (WLSH)", + "Empty Latent by Pixels (WLSH)", + "Empty Latent by Ratio (WLSH)", + "Empty Latent by Size (WLSH)", + "Generate Border Mask (WLSH)", + "Grayscale Image (WLSH)", + "Image Load with Metadata (WLSH)", + "Image Save with Prompt (WLSH)", + "Image Save with Prompt File (WLSH)", + "Image Save with Prompt/Info (WLSH)", + "Image Save with Prompt/Info File (WLSH)", + "Image Scale By Factor (WLSH)", + "Image Scale by Shortside (WLSH)", + "KSamplerAdvanced (WLSH)", + "Multiply Integer (WLSH)", + "Outpaint to Image (WLSH)", + "Prompt Weight (WLSH)", + "Quick Resolution Multiply (WLSH)", + "Resolutions by Ratio (WLSH)", + "SDXL Quick Empty Latent (WLSH)", + "SDXL Quick Image Scale (WLSH)", + "SDXL Resolutions (WLSH)", + "SDXL Steps (WLSH)", + "Save Positive Prompt(WLSH)", + "Save Prompt (WLSH)", + "Save Prompt/Info (WLSH)", + "Seed and Int (WLSH)", + "Seed to Number (WLSH)", + "Simple Pattern Replace (WLSH)", + "Simple String Combine (WLSH)", + "Time String (WLSH)", + "Upscale by Factor with Model (WLSH)", + "VAE Encode for Inpaint w/Padding (WLSH)" + ], + { + "title_aux": "wlsh_nodes" + } + ], + "https://github.com/web3nomad/ComfyUI_Invisible_Watermark": [ + [ + "InvisibleWatermarkEncode" + ], + { + "title_aux": "ComfyUI Invisible Watermark" + } + ], + "https://github.com/whatbirdisthat/cyberdolphin": [ + [ + "\ud83d\udc2c Gradio ChatInterface", + "\ud83d\udc2c OpenAI Advanced", + "\ud83d\udc2c OpenAI Compatible", + "\ud83d\udc2c OpenAI DALL\u00b7E", + "\ud83d\udc2c OpenAI Simple" + ], + { + "title_aux": "cyberdolphin" + } + ], + "https://github.com/whmc76/ComfyUI-Openpose-Editor-Plus": [ + [ + "CDL.OpenPoseEditorPlus" + ], + { + "title_aux": "ComfyUI-Openpose-Editor-Plus" + } + ], + "https://github.com/wmatson/easy-comfy-nodes": [ + [ + "EZAssocDictNode", + "EZAssocImgNode", + "EZAssocStrNode", + "EZEmptyDictNode", + "EZHttpPostNode", + "EZLoadImgBatchFromUrlsNode", + "EZLoadImgFromUrlNode", + "EZRemoveImgBackground", + "EZS3Uploader" + ], + { + "title_aux": "easy-comfy-nodes" + } + ], + "https://github.com/wolfden/ComfyUi_PromptStylers": [ + [ + "SDXLPromptStylerAll", + "SDXLPromptStylerHorror", + "SDXLPromptStylerMisc", + "SDXLPromptStylerbyArtist", + "SDXLPromptStylerbyCamera", + "SDXLPromptStylerbyComposition", + "SDXLPromptStylerbyCyberpunkSurrealism", + "SDXLPromptStylerbyDepth", + "SDXLPromptStylerbyEnvironment", + "SDXLPromptStylerbyFantasySetting", + "SDXLPromptStylerbyFilter", + "SDXLPromptStylerbyFocus", + "SDXLPromptStylerbyImpressionism", + "SDXLPromptStylerbyLighting", + "SDXLPromptStylerbyMileHigh", + "SDXLPromptStylerbyMood", + "SDXLPromptStylerbyMythicalCreature", + "SDXLPromptStylerbyOriginal", + "SDXLPromptStylerbyQuantumRealism", + "SDXLPromptStylerbySteamPunkRealism", + "SDXLPromptStylerbySubject", + "SDXLPromptStylerbySurrealism", + "SDXLPromptStylerbyTheme", + "SDXLPromptStylerbyTimeofDay", + "SDXLPromptStylerbyWyvern", + "SDXLPromptbyCelticArt", + "SDXLPromptbyContemporaryNordicArt", + "SDXLPromptbyFashionArt", + "SDXLPromptbyGothicRevival", + "SDXLPromptbyIrishFolkArt", + "SDXLPromptbyRomanticNationalismArt", + "SDXLPromptbySportsArt", + "SDXLPromptbyStreetArt", + "SDXLPromptbyVikingArt", + "SDXLPromptbyWildlifeArt" + ], + { + "title_aux": "SDXL Prompt Styler (customized version by wolfden)" + } + ], + "https://github.com/wolfden/ComfyUi_String_Function_Tree": [ + [ + "StringFunction" + ], + { + "title_aux": "ComfyUi_String_Function_Tree" + } + ], + "https://github.com/wsippel/comfyui_ws/raw/main/sdxl_utility.py": [ + [ + "SDXLResolutionPresets" + ], + { + "title_aux": "SDXLResolutionPresets" + } + ], + "https://github.com/wujm424606/ComfyUi-Ollama-YN": [ + [ + "OllamaGenerate", + "OllamaGenerateAdvance", + "OllamaSpecialGenerateAdvance", + "OllamaVision" + ], + { + "title_aux": "ComfyUi-Ollama-YN" + } + ], + "https://github.com/wutipong/ComfyUI-TextUtils": [ + [ + "Text Utils - Join N-Elements of String List", + "Text Utils - Join String List", + "Text Utils - Join Strings", + "Text Utils - Split String to List" + ], + { + "title_aux": "ComfyUI-TextUtils" + } + ], + "https://github.com/wwwins/ComfyUI-Simple-Aspect-Ratio": [ + [ + "SimpleAspectRatio" + ], + { + "title_aux": "ComfyUI-Simple-Aspect-Ratio" + } + ], + "https://github.com/xXAdonesXx/NodeGPT": [ + [ + "AppendAgent", + "Assistant", + "Chat", + "ChatGPT", + "CombineInput", + "Conditioning", + "CostumeAgent_1", + "CostumeAgent_2", + "CostumeMaster_1", + "Critic", + "DisplayString", + "DisplayTextAsImage", + "EVAL", + "Engineer", + "Executor", + "GroupChat", + "Image_generation_Conditioning", + "LM_Studio", + "LoadAPIconfig", + "LoadTXT", + "MemGPT", + "Memory_Excel", + "Model_1", + "Ollama", + "Output2String", + "Planner", + "Scientist", + "TextCombine", + "TextGeneration", + "TextGenerator", + "TextInput", + "TextOutput", + "UserProxy", + "llama-cpp", + "llava", + "oobaboogaOpenAI" + ], + { + "title_aux": "NodeGPT" + } + ], + "https://github.com/xiaoxiaodesha/hd_node": [ + [ + "Combine HDMasks", + "Cover HDMasks", + "HD FaceIndex", + "HD GetMaskArea", + "HD Image Levels", + "HD SmoothEdge", + "HD UltimateSDUpscale" + ], + { + "title_aux": "hd-nodes-comfyui" + } + ], + "https://github.com/xliry/ComfyUI_SendDiscord": [ + [ + "SendDiscord" + ], + { + "title_aux": "ComfyUI_SendDiscord" + } + ], + "https://github.com/xuhongming251/ComfyUI-GPEN": [ + [ + "FaceEnhancement" + ], + { + "title_aux": "ComfyUI-GPEN" + } + ], + "https://github.com/xuhongming251/ComfyUI-MuseTalkUtils": [ + [ + "MuseTalkPostprocess", + "MuseTalkPreprocess", + "MuseTalkTrain", + "MuseTalkTrainPreprocess", + "MuseTalkUncropMask" + ], + { + "title_aux": "ComfyUI-MuseTalkUtils" + } + ], + "https://github.com/yffyhk/comfyui_auto_danbooru": [ + [ + "GetDanbooru", + "TagEncode" + ], + { + "title_aux": "comfyui_auto_danbooru" + } + ], + "https://github.com/yiwangsimple/ComfyUI_GroqChat": [ + [ + "GroqChatNode", + "PaliGemmaPixelProse" + ], + { + "title_aux": "comfy-groqchat" + } + ], + "https://github.com/yolain/ComfyUI-Easy-Use": [ + [ + "dynamicThresholdingFull", + "easy LLLiteLoader", + "easy XYInputs: CFG Scale", + "easy XYInputs: Checkpoint", + "easy XYInputs: ControlNet", + "easy XYInputs: Denoise", + "easy XYInputs: Lora", + "easy XYInputs: ModelMergeBlocks", + "easy XYInputs: NegativeCond", + "easy XYInputs: NegativeCondList", + "easy XYInputs: PositiveCond", + "easy XYInputs: PositiveCondList", + "easy XYInputs: PromptSR", + "easy XYInputs: Sampler/Scheduler", + "easy XYInputs: Seeds++ Batch", + "easy XYInputs: Steps", + "easy XYPlot", + "easy XYPlotAdvanced", + "easy a1111Loader", + "easy applyBrushNet", + "easy applyFooocusInpaint", + "easy applyInpaint", + "easy applyPowerPaint", + "easy boolean", + "easy cascadeKSampler", + "easy cascadeLoader", + "easy ckptNames", + "easy cleanGpuUsed", + "easy clearCacheAll", + "easy clearCacheKey", + "easy comfyLoader", + "easy compare", + "easy controlnetLoader", + "easy controlnetLoaderADV", + "easy controlnetNames", + "easy controlnetStack", + "easy convertAnything", + "easy detailerFix", + "easy dynamiCrafterLoader", + "easy float", + "easy fullCascadeKSampler", + "easy fullLoader", + "easy fullkSampler", + "easy globalSeed", + "easy hiresFix", + "easy humanSegmentation", + "easy hunyuanDiTLoader", + "easy icLightApply", + "easy if", + "easy imageBatchToImageList", + "easy imageChooser", + "easy imageColorMatch", + "easy imageConcat", + "easy imageCount", + "easy imageCropFromMask", + "easy imageDetailTransfer", + "easy imageInsetCrop", + "easy imageInterrogator", + "easy imageListToImageBatch", + "easy imagePixelPerfect", + "easy imageRatio", + "easy imageRemBg", + "easy imageSave", + "easy imageScaleDown", + "easy imageScaleDownBy", + "easy imageScaleDownToSize", + "easy imageSize", + "easy imageSizeByLongerSide", + "easy imageSizeBySide", + "easy imageSplitGrid", + "easy imageSplitList", + "easy imageSwitch", + "easy imageToBase64", + "easy imageToMask", + "easy imageUncropFromBBOX", + "easy imagesSplitImage", + "easy injectNoiseToLatent", + "easy instantIDApply", + "easy instantIDApplyADV", + "easy int", + "easy ipadapterApply", + "easy ipadapterApplyADV", + "easy ipadapterApplyEmbeds", + "easy ipadapterApplyEncoder", + "easy ipadapterApplyFromParams", + "easy ipadapterApplyRegional", + "easy ipadapterStyleComposition", + "easy isSDXL", + "easy joinImageBatch", + "easy kSampler", + "easy kSamplerDownscaleUnet", + "easy kSamplerInpainting", + "easy kSamplerLayerDiffusion", + "easy kSamplerSDTurbo", + "easy kSamplerTiled", + "easy latentCompositeMaskedWithCond", + "easy latentNoisy", + "easy loadImageBase64", + "easy loraStack", + "easy negative", + "easy pipeBatchIndex", + "easy pipeEdit", + "easy pipeIn", + "easy pipeOut", + "easy pipeToBasicPipe", + "easy pixArtLoader", + "easy portraitMaster", + "easy poseEditor", + "easy positive", + "easy preDetailerFix", + "easy preMaskDetailerFix", + "easy preSampling", + "easy preSamplingAdvanced", + "easy preSamplingCascade", + "easy preSamplingCustom", + "easy preSamplingDynamicCFG", + "easy preSamplingLayerDiffusion", + "easy preSamplingLayerDiffusionADDTL", + "easy preSamplingNoiseIn", + "easy preSamplingSdTurbo", + "easy prompt", + "easy promptConcat", + "easy promptLine", + "easy promptList", + "easy promptReplace", + "easy pulIDApply", + "easy pulIDApplyADV", + "easy rangeFloat", + "easy rangeInt", + "easy removeLocalImage", + "easy samLoaderPipe", + "easy seed", + "easy showAnything", + "easy showLoaderSettingsNames", + "easy showSpentTime", + "easy showTensorShape", + "easy sliderControl", + "easy stableDiffusion3API", + "easy string", + "easy styleAlignedBatchAlign", + "easy stylesSelector", + "easy sv3dLoader", + "easy svdLoader", + "easy textSwitch", + "easy ultralyticsDetectorPipe", + "easy unSampler", + "easy wildcards", + "easy xyAny", + "easy zero123Loader" + ], + { + "title_aux": "ComfyUI Easy Use" + } + ], + "https://github.com/yolanother/DTAIComfyImageSubmit": [ + [ + "DTSimpleSubmitImage", + "DTSubmitImage" + ], + { + "title_aux": "Comfy AI DoubTech.ai Image Sumission Node" + } + ], + "https://github.com/yolanother/DTAIComfyLoaders": [ + [ + "DTCLIPLoader", + "DTCLIPVisionLoader", + "DTCheckpointLoader", + "DTCheckpointLoaderSimple", + "DTControlNetLoader", + "DTDiffControlNetLoader", + "DTDiffusersLoader", + "DTGLIGENLoader", + "DTLoadImage", + "DTLoadImageMask", + "DTLoadLatent", + "DTLoraLoader", + "DTLorasLoader", + "DTStyleModelLoader", + "DTUpscaleModelLoader", + "DTVAELoader", + "DTunCLIPCheckpointLoader" + ], + { + "title_aux": "Comfy UI Online Loaders" + } + ], + "https://github.com/yolanother/DTAIComfyPromptAgent": [ + [ + "DTPromptAgent", + "DTPromptAgentString" + ], + { + "title_aux": "Comfy UI Prompt Agent" + } + ], + "https://github.com/yolanother/DTAIComfyQRCodes": [ + [ + "QRCode" + ], + { + "title_aux": "Comfy UI QR Codes" + } + ], + "https://github.com/yolanother/DTAIComfyVariables": [ + [ + "DTCLIPTextEncode", + "DTSingleLineStringVariable", + "DTSingleLineStringVariableNoClip", + "FloatVariable", + "IntVariable", + "StringFormat", + "StringFormatSingleLine", + "StringVariable" + ], + { + "title_aux": "Variables for Comfy UI" + } + ], + "https://github.com/yolanother/DTAIImageToTextNode": [ + [ + "DTAIImageToTextNode", + "DTAIImageUrlToTextNode" + ], + { + "title_aux": "Image to Text Node" + } + ], + "https://github.com/youyegit/tdxh_node_comfyui": [ + [ + "TdxhBoolNumber", + "TdxhClipVison", + "TdxhControlNetApply", + "TdxhControlNetProcessor", + "TdxhFloatInput", + "TdxhImageToSize", + "TdxhImageToSizeAdvanced", + "TdxhImg2ImgLatent", + "TdxhIntInput", + "TdxhLoraLoader", + "TdxhOnOrOff", + "TdxhReference", + "TdxhStringInput", + "TdxhStringInputTranslator" + ], + { + "title_aux": "tdxh_node_comfyui" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Depth-Anything-Tensorrt": [ + [ + "DepthAnythingTensorrt" + ], + { + "title_aux": "ComfyUI Depth Anything TensorRT" + } + ], + "https://github.com/yuvraj108c/ComfyUI-PiperTTS": [ + [ + "PiperTTS" + ], + { + "title_aux": "ComfyUI PiperTTS" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Pronodes": [ + [ + "LoadImageFromOutputDirectoryNode", + "LoadYoutubeVideoNode", + "PreviewVHSAudioNode", + "SaveAndOverwriteImageNode", + "VHSFilenamesToPathNode" + ], + { + "title_aux": "ComfyUI-Pronodes" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Upscaler-Tensorrt": [ + [ + "UpscalerTensorrt" + ], + { + "title_aux": "ComfyUI Upscaler TensorRT" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Vsgan": [ + [ + "DepthAnythingTrtNode", + "TTSCapcutNode", + "UpscaleVideoTrtNode" + ], + { + "title_aux": "ComfyUI-Vsgan" + } + ], + "https://github.com/yuvraj108c/ComfyUI-Whisper": [ + [ + "Add Subtitles To Background", + "Add Subtitles To Frames", + "Apply Whisper", + "Resize Cropped Subtitles" + ], + { + "title_aux": "ComfyUI Whisper" + } + ], + "https://github.com/yuvraj108c/ComfyUI-YoloNasPose-Tensorrt": [ + [ + "YoloNasPoseTensorrt" + ], + { + "title_aux": "ComfyUI YoloNasPose Tensorrt" + } + ], + "https://github.com/za-wa-n-go/ComfyUI_Zwng_Nodes": [ + [ + "ZwngLoadImagePathOrURL", + "ZwngPreviewImageAndMask", + "ZwngSimpleGoogleTranslater", + "ZwngSimplePhotoshopConnector" + ], + { + "title_aux": "ComfyUI_Zwng_Nodes" + } + ], + "https://github.com/zcfrank1st/Comfyui-Toolbox": [ + [ + "PreviewJson", + "PreviewVideo", + "SaveJson", + "TestJsonPreview" + ], + { + "title_aux": "Comfyui-Toolbox" + } + ], + "https://github.com/zcfrank1st/Comfyui-Yolov8": [ + [ + "Yolov8Detection", + "Yolov8Segmentation" + ], + { + "title_aux": "ComfyUI Yolov8" + } + ], + "https://github.com/zcfrank1st/comfyui_visual_anagrams": [ + [ + "VisualAnagramsAnimate", + "VisualAnagramsSample" + ], + { + "title_aux": "comfyui_visual_anagram" + } + ], + "https://github.com/zer0TF/cute-comfy": [ + [ + "Cute.Placeholder" + ], + { + "title_aux": "Cute Comfy" + } + ], + "https://github.com/zeroxoxo/ComfyUI-Fast-Style-Transfer": [ + [ + "FastStyleTransfer", + "TrainFastStyleTransfer" + ], + { + "title_aux": "ComfyUI-Fast-Style-Transfer" + } + ], + "https://github.com/zfkun/ComfyUI_zfkun": [ + [ + "ZFLoadImagePath", + "ZFPreviewText", + "ZFPreviewTextMultiline", + "ZFShareScreen", + "ZFTextTranslation" + ], + { + "title_aux": "ComfyUI_zfkun" + } + ], + "https://github.com/zhangp365/ComfyUI-utils-nodes": [ + [ + "CheckpointLoaderSimpleWithSwitch", + "ColorCorrectOfUtils", + "ConcatTextOfUtils", + "ImageBatchOneOrMore", + "ImageCompositeMaskedWithSwitch", + "ImageConcanateOfUtils", + "IntAndIntAddOffsetLiteral", + "IntMultipleAddLiteral", + "LoadImageMaskWithSwitch", + "LoadImageMaskWithoutListDir", + "LoadImageWithSwitch", + "LoadImageWithoutListDir", + "MaskAutoSelector", + "MaskFastGrow", + "ModifyTextGender", + "SplitMask" + ], + { + "title_aux": "zhangp365/Some Utils for ComfyUI" + } + ], + "https://github.com/zhongpei/ComfyUI-InstructIR": [ + [ + "InstructIRProcess", + "LoadInstructIRModel" + ], + { + "title_aux": "ComfyUI for InstructIR" + } + ], + "https://github.com/zhongpei/Comfyui_image2prompt": [ + [ + "CLIP AdvancedTextEncode|fofo", + "CLIP PromptConditioning|fofo", + "Image2Text", + "Image2TextWithTags", + "ImageBatchToList|fofo", + "ImageRewardScore|fofo", + "LoadImage2TextModel", + "LoadImageRewardScoreModel|fofo", + "LoadT5Model|fofo", + "LoadText2PromptModel", + "ShowText|fofo", + "T5QuantizationConfig|fofo", + "T5Text2Prompt|fofo", + "Text2GPTPrompt", + "Text2Prompt", + "TextBox|fofo", + "Translate2Chinese|fofo" + ], + { + "title_aux": "Comfyui_image2prompt" + } + ], + "https://github.com/zhuanqianfish/ComfyUI-EasyNode": [ + [ + "EasyCaptureNode", + "EasyVideoOutputNode", + "SendImageWebSocket" + ], + { + "title_aux": "EasyCaptureNode for ComfyUI" + } + ], + "https://github.com/zhulu111/ComfyUI_Bxb": [ + [ + "sdBxb", + "sdBxb_textInput" + ], + { + "title_aux": "ComfyUI_Bxb" + } + ], + "https://github.com/zohac/ComfyUI_ZC_DrawShape": [ + [ + "ZcDrawShape" + ], + { + "author": "Zohac", + "description": "nodes for artists, designers and animators.", + "nickname": "Zc DrawShape", + "title": "Zc DrawShape", + "title_aux": "ComfyUI_ZC_DrawShape" + } + ], + "https://github.com/zombieyang/sd-ppp": [ + [ + "Get Image From Photoshop Layer", + "Image Times Opacity", + "Mask Times Opacity", + "Send Images To Photoshop" + ], + { + "title_aux": "SD-PPP" + } + ], + "https://raw.githubusercontent.com/throttlekitty/SDXLCustomAspectRatio/main/SDXLAspectRatio.py": [ + [ + "SDXLAspectRatio" + ], + { + "title_aux": "SDXLCustomAspectRatio" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/new/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/new/model-list.json new file mode 100644 index 000000000..dee66b3c6 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/new/model-list.json @@ -0,0 +1,710 @@ +{ + "models": [ + { + "name": "xinsir/ControlNet++: All-in-one ControlNet", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-union-sdxl-1.0", + "description": "All-in-one ControlNet for image generations and editing!", + "reference": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-union-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + + { + "name": "InstantX/SD3-Controlnet-Canny", + "type": "controlnet", + "base": "SD3", + "save_path": "controlnet/SD3/InstantX-Controlnet-Canny", + "description": "Controlnet SD3 Canny model.", + "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Canny", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/SD3-Controlnet-Canny/resolve/main/diffusion_pytorch_model.safetensors", + "size": "1.19GB" + }, + { + "name": "InstantX/SD3-Controlnet-Pose", + "type": "controlnet", + "base": "SD3", + "save_path": "controlnet/SD3/InstantX-Controlnet-Pose", + "description": "Controlnet SD3 Pose model.", + "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Pose", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/SD3-Controlnet-Pose/resolve/main/diffusion_pytorch_model.safetensors", + "size": "1.19GB" + }, + { + "name": "InstantX/SD3-Controlnet-Tile", + "type": "controlnet", + "base": "SD3", + "save_path": "controlnet/SD3/InstantX-Controlnet-Tile", + "description": "Controlnet SD3 Tile model.", + "reference": "https://huggingface.co/InstantX/SD3-Controlnet-Tile", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/SD3-Controlnet-Tile/resolve/main/diffusion_pytorch_model.safetensors", + "size": "1.19GB" + }, + + { + "name": "xinsir/ControlNet Depth SDXL, support zoe, midias", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-depth-sdxl-1.0", + "description": "Controlnet SDXL Depth model.", + "reference": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-depth-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/ControlNet Tile SDXL", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-tile-sdxl-1.0", + "description": "Controlnet SDXL Tile model.", + "reference": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + + { + "name": "google-t5/t5-base", + "type": "clip", + "base": "t5-base", + "save_path": "clip/t5-base", + "description": "T5 Base: Text-To-Text Transfer Transformer. This model can be loaded via CLIPLoader for Stable Audio workflow.", + "reference": "https://huggingface.co/google-t5/t5-base", + "filename": "model.safetensors", + "url": "https://huggingface.co/google-t5/t5-base/resolve/main/model.safetensors", + "size": "892MB" + }, + + { + "name": "PixArt-Sigma-XL-2-1024-MS.pth", + "type": "checkpoint", + "base": "pixart-sigma", + "save_path": "checkpoints/PixArt-Sigma", + "description": "PixArt-Sigma Checkpoint model", + "reference": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/tree/main", + "filename": "PixArt-Sigma-XL-2-1024-MS.pth", + "url": "https://huggingface.co/PixArt-alpha/PixArt-Sigma/resolve/main/PixArt-Sigma-XL-2-1024-MS.pth", + "size": "2.47GB" + }, + { + "name": "TAESD3 Decoder", + "type": "TAESD", + "base": "SDXL", + "save_path": "vae_approx", + "description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesd3_decoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesd3_decoder.pth", + "size": "4.94MB" + }, + { + "name": "TAESD3 Encoder", + "type": "TAESD", + "base": "SDXL", + "save_path": "vae_approx", + "description": "(SD3 Verison) To view the preview in high quality while running samples in ComfyUI, you will need this model.", + "reference": "https://github.com/madebyollin/taesd", + "filename": "taesd3_encoder.pth", + "url": "https://github.com/madebyollin/taesd/raw/main/taesd3_encoder.pth", + "size": "4.94MB" + }, + + { + "name": "TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic v2 (rank256)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "Controlnet SDXL Tile model realistic version.", + "reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic", + "filename": "TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors", + "url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_rank256.safetensors", + "size": "774.4MB" + }, + + { + "name": "kijai/DepthAnythingV2 (vitb/fp16)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitb_fp16.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp16.safetensors", + "size": "195.0MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitb/fp32)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitb_fp32.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitb_fp32.safetensors", + "size": "389.9MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitl/fp16)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "[671MB] DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitl_fp16.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp16.safetensors", + "size": "670.7MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitl/fp32)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "[195MB] DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vitl_fp32.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vitl_fp32.safetensors", + "size": "1.34GB" + }, + { + "name": "kijai/DepthAnythingV2 (vits/fp16)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "[49.6MB] DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vits_fp16.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp16.safetensors", + "size": "49.6MB" + }, + { + "name": "kijai/DepthAnythingV2 (vitb/fp32)", + "type": "depthanything", + "base": "depthanything", + "save_path": "depthanything", + "description": "[99.2MB] DepthAnythingV2 model", + "reference": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/tree/main", + "filename": "depth_anything_v2_vits_fp32.safetensors", + "url": "https://huggingface.co/Kijai/DepthAnythingV2-safetensors/resolve/main/depth_anything_v2_vits_fp32.safetensors", + "size": "99.2MB" + }, + + { + "name": "CN-anytest_v4-marged.safetensors", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] AnyTest Controlnet. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged.safetensors", + "size": "2.50GB" + }, + { + "name": "CN-anytest_v4-marged_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v4-marged_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_am_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "CN-anytest_v4-marged_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v4-marged_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A model for style transfer.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v4-marged_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v4-marged_pn_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "CN-anytest_v3-50000_fp16.safetensors (fp16)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] AnyTest Controlnet. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_fp16.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_fp16.safetensors", + "size": "2.50GB" + }, + { + "name": "CN-anytest_v3-50000_am_dim256.safetensors (dim256/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v3-50000_am_dim128.safetensors (dim128/Animagine)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Animagine. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_am_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_am_dim128.safetensors", + "size": "395.7MB" + }, + { + "name": "CN-anytest_v3-50000_pn_dim256.safetensors (dim256/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[774MB] AnyTest Controlnet Lora (dim256) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim256.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim256.safetensors", + "size": "774.4MB" + }, + { + "name": "CN-anytest_v3-50000_pn_dim128.safetensors (dim128/Pony)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[396MB] AnyTest Controlnet Lora (dim128) for Pony. A strict control model.", + "reference": "https://huggingface.co/2vXpSwA7/iroiro-lora/tree/main", + "filename": "CN-anytest_v3-50000_pn_dim128.safetensors", + "url": "https://huggingface.co/2vXpSwA7/iroiro-lora/resolve/main/test_controlnet2/CN-anytest_v3-50000_pn_dim128.safetensors", + "size": "395.7MB" + }, + + { + "name": "Kijai/ToonCrafter model checkpoint (interpolation fp16)", + "type": "checkpoint", + "base": "ToonCrafter", + "save_path": "checkpoints/ToonCrafter", + "description": "[5.25GB] ToonCrafter checkpoint model for ComfyUI-DynamiCrafterWrapper", + "reference": "https://huggingface.co/Kijai/DynamiCrafter_pruned", + "filename": "tooncrafter_512_interp-fp16.safetensors", + "url": "https://huggingface.co/Kijai/DynamiCrafter_pruned/resolve/main/tooncrafter_512_interp-fp16.safetensors", + "size": "5.25GB" + }, + + { + "name": "xinsir/Controlnet-Scribble-Sdxl-1.0", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0", + "description": "[2.5GB] Controlnet SDXL Scribble model.", + "reference": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Canny-Sdxl-1.0 (V2)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-canny-sdxl-1.0", + "description": "[2.5GB] Controlnet SDXL Canny model.", + "reference": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0", + "filename": "diffusion_pytorch_model_V2.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0/resolve/main/diffusion_pytorch_model_V2.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Openpose-Sdxl-1.0", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-openpose-sdxl-1.0", + "description": "[2.5GB] Controlnet SDXL Openpose model.", + "reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Openpose-Sdxl-1.0 (Ver. twins)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-openpose-sdxl-1.0", + "description": "[2.5GB] Controlnet SDXL Openpose model. (Ver. twins)", + "reference": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0", + "filename": "diffusion_pytorch_model_twins.safetensors", + "url": "https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0/resolve/main/diffusion_pytorch_model_twins.safetensors", + "size": "2.50GB" + }, + { + "name": "xinsir/Controlnet-Scribble-Sdxl-1.0-Anime", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/controlnet-scribble-sdxl-1.0-anime", + "description": "[2.5GB] Controlnet SDXL Scribble model. (Ver. anime)", + "reference": "https://huggingface.co/xinsir/anime-painter", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/xinsir/anime-painter/resolve/main/diffusion_pytorch_model.safetensors", + "size": "2.50GB" + }, + + { + "name": "Doubiiu/ToonCrafter model checkpoint", + "type": "checkpoint", + "base": "ToonCrafter", + "save_path": "custom_nodes/ComfyUI-ToonCrafter/ToonCrafter/checkpoints/tooncrafter_512_interp_v1", + "description": "[10.5GB] ToonCrafter checkpoint model for ComfyUI-ToonCrafter", + "reference": "https://huggingface.co/Doubiiu/ToonCrafter/tree/main", + "filename": "model.ckpt", + "url": "https://huggingface.co/Doubiiu/ToonCrafter/resolve/main/model.ckpt", + "size": "10.5GB" + }, + + { + "name": "ViperYX/RGT_x2.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT", + "description": "[180MB] RGT x2 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_x2.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x2.pth", + "size": "179.8MB" + }, + { + "name": "ViperYX/RGT_x3.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT", + "description": "[180MB] RGT x3 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_x3.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x3.pth", + "size": "180.5MB" + }, + { + "name": "ViperYX/RGT_x4.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT", + "description": "[180MB] RGT_S x4 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_x4.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT/RGT_x4.pth", + "size": "180.4MB" + }, + { + "name": "ViperYX/RGT_S_x2.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT_S", + "description": "[135MB] RGT_S x2 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_S_x2.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x2.pth", + "size": "135.4MB" + }, + { + "name": "ViperYX/RGT_S_x3.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT_S", + "description": "[136MB] RGT_S x3 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_S_x3.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x3.pth", + "size": "136.1MB" + }, + { + "name": "ViperYX/RGT_S_x4.pth", + "type": "RGT", + "base": "RGT", + "save_path": "RGT/RGT_S", + "description": "[136MB] RGT_S x4 upscale model for ComfyUI-RGT", + "reference": "https://huggingface.co/ViperYX/RGT/tree/main", + "filename": "RGT_S_x4.pth", + "url": "https://huggingface.co/ViperYX/RGT/resolve/main/RGT_S/RGT_S_x4.pth", + "size": "136.0MB" + }, + + { + "name": "TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic v2 (fp16)", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL", + "description": "[2.5GB] Controlnet SDXL Tile model realistic version.", + "reference": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic", + "filename": "TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors", + "url": "https://huggingface.co/TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic/resolve/main/TTPLANET_Controlnet_Tile_realistic_v2_fp16.safetensors", + "size": "2.50GB" + }, + + { + "name": "TencentARC/CustomNet", + "type": "CustomNet", + "base": "CustomNet", + "save_path": "custom_nodes/ComfyUI_CustomNet/pretrain", + "description": "CustomNet pretrained model for ComfyUI_CustomNet", + "reference": "https://huggingface.co/TencentARC/CustomNet/tree/main", + "filename": "customnet_v1.pt", + "url": "https://huggingface.co/TencentARC/CustomNet/resolve/main/customnet_v1.pt", + "size": "5.71GB" + }, + + { + "name": "ID-Animator/animator.ckpt", + "type": "ID-Animator", + "base": "SD1.5", + "save_path": "custom_nodes/ComfyUI_ID_Animator/models", + "description": "ID-Animator checkpoint", + "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator", + "filename": "animator.ckpt", + "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/animator.ckpt", + "size": "247.3MB" + }, + { + "name": "ID-Animator/mm_sd_v15_v2.ckpt", + "type": "ID-Animator", + "base": "SD1.5", + "save_path": "custom_nodes/ComfyUI_ID_Animator/models/animatediff_models", + "description": "AnimateDiff checkpoint for ID-Animator", + "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator", + "filename": "mm_sd_v15_v2.ckpt", + "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/mm_sd_v15_v2.ckpt", + "size": "1.82GB" + }, + { + "name": "ID-Animator/image_encoder", + "type": "ID-Animator", + "base": "SD1.5", + "save_path": "custom_nodes/ComfyUI_ID_Animator/models/image_encoder", + "description": "CLIP Image encoder for ID-Animator", + "reference": "https://huggingface.co/spaces/ID-Animator/ID-Animator", + "filename": "model.safetensors", + "url": "https://huggingface.co/spaces/ID-Animator/ID-Animator/resolve/main/image_encoder/model.safetensors", + "size": "2.53GB" + }, + + { + "name": "IC-Light/fc", + "type": "IC-Light", + "base": "SD1.5", + "save_path": "unet/IC-Light", + "description": "The default relighting model, conditioned on text and foreground", + "reference": "https://huggingface.co/lllyasviel/ic-light", + "filename": "iclight_sd15_fc.safetensors", + "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fc.safetensors", + "size": "1.72GB" + }, + { + "name": "IC-Light/fbc", + "type": "IC-Light", + "base": "SD1.5", + "save_path": "unet/IC-Light", + "description": "Relighting model conditioned with text, foreground, and background", + "reference": "https://huggingface.co/lllyasviel/ic-light", + "filename": "iclight_sd15_fbc.safetensors", + "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fbc.safetensors", + "size": "1.72GB" + }, + { + "name": "IC-Light/fcon", + "type": "IC-Light", + "base": "SD1.5", + "save_path": "unet/IC-Light", + "description": "Same as iclight_sd15_fc.safetensors, but trained with offset noise", + "reference": "https://huggingface.co/lllyasviel/ic-light", + "filename": "iclight_sd15_fcon.safetensors", + "url": "https://huggingface.co/lllyasviel/ic-light/resolve/main/iclight_sd15_fcon.safetensors", + "size": "1.72GB" + }, + + { + "name": "MonsterMMORPG/insightface (for InstantID)", + "type": "insightface", + "base": "SDXL", + "save_path": "insightface/models", + "description": "MonsterMMORPG insightface model for cubiq/InstantID", + "reference": "https://huggingface.co/MonsterMMORPG/tools/tree/main", + "filename": "antelopev2.zip", + "url": "https://huggingface.co/MonsterMMORPG/tools/resolve/main/antelopev2.zip", + "size": "360.7MB" + }, + { + "name": "InstantID/ip-adapter", + "type": "instantid", + "base": "SDXL", + "save_path": "instantid/SDXL", + "description": "ip-adapter model for cubiq/InstantID", + "reference": "https://huggingface.co/InstantX/InstantID", + "filename": "ip-adapter.bin", + "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ip-adapter.bin" + }, + { + "name": "InstantID/ControlNet", + "type": "controlnet", + "base": "SDXL", + "save_path": "controlnet/SDXL/instantid", + "description": "instantid controlnet model for cubiq/InstantID", + "reference": "https://huggingface.co/InstantX/InstantID", + "filename": "diffusion_pytorch_model.safetensors", + "url": "https://huggingface.co/InstantX/InstantID/resolve/main/ControlNetModel/diffusion_pytorch_model.safetensors" + }, + { + "name": "ip_plus_composition_sd15.safetensors", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/ostris/ip-composition-adapter", + "filename": "ip_plus_composition_sd15.safetensors", + "url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sd15.safetensors" + }, + { + "name": "ip_plus_composition_sdxl.safetensors", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/ostris/ip-composition-adapter", + "filename": "ip_plus_composition_sdxl.safetensors", + "url": "https://huggingface.co/ostris/ip-composition-adapter/resolve/main/ip_plus_composition_sdxl.safetensors" + }, + { + "name": "ip-adapter-faceid-portrait-v11_sd15.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait V11 Model (SD1.5) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait-v11_sd15.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait-v11_sd15.bin" + }, + { + "name": "ip-adapter-faceid-portrait_sdxl.bin", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait Model (SDXL) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait_sdxl.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl.bin" + }, + { + "name": "ip-adapter-faceid-portrait_sdxl_unnorm.bin", + "type": "IP-Adapter", + "base": "SDXL", + "save_path": "ipadapter", + "description": "IP-Adapter-FaceID Portrait Model (SDXL/unnorm) [ipadapter]", + "reference": "https://huggingface.co/h94/IP-Adapter-FaceID", + "filename": "ip-adapter-faceid-portrait_sdxl_unnorm.bin", + "url": "https://huggingface.co/h94/IP-Adapter-FaceID/resolve/main/ip-adapter-faceid-portrait_sdxl_unnorm.bin" + }, + { + "name": "ip-adapter_sd15_light_v11.bin", + "type": "IP-Adapter", + "base": "SD1.5", + "save_path": "ipadapter", + "description": "You can use this model in the [a/ComfyUI IPAdapter plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) extension.", + "reference": "https://huggingface.co/h94/IP-Adapter", + "filename": "ip-adapter_sd15_light_v11.bin", + "url": "https://huggingface.co/h94/IP-Adapter/resolve/main/models/ip-adapter_sd15_light_v11.bin" + }, + + + { + "name": "Kijai/SUPIR-v0F_fp16.safetensors (pruned)", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main", + "filename": "SUPIR-v0F_fp16.safetensors", + "url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0F_fp16.safetensors" + }, + { + "name": "Kijai/SUPIR-v0Q_fp16.safetensors (pruned)", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/Kijai/SUPIR_pruned/tree/main", + "filename": "SUPIR-v0Q_fp16.safetensors", + "url": "https://huggingface.co/Kijai/SUPIR_pruned/resolve/main/SUPIR-v0Q_fp16.safetensors" + }, + { + "name": "SUPIR-v0F.ckpt", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/camenduru/SUPIR/tree/main", + "filename": "SUPIR-v0F.ckpt", + "url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0F.ckpt" + }, + { + "name": "SUPIR-v0Q.ckpt", + "type": "checkpoints", + "base": "SUPIR", + "save_path": "checkpoints/SUPIR", + "description": "SUPIR checkpoint model", + "reference": "https://huggingface.co/camenduru/SUPIR/tree/main", + "filename": "SUPIR-v0Q.ckpt", + "url": "https://huggingface.co/camenduru/SUPIR/resolve/main/SUPIR-v0Q.ckpt" + },{ + "name": "Depth-FM-v1 fp16 safetensors", + "type": "checkpoints", + "base": "Depth-FM", + "save_path": "checkpoints/depthfm", + "description": "Depth-FM monocular depth estimation model", + "reference": "https://huggingface.co/Kijai/depth-fm-pruned", + "filename": "depthfm-v1_fp16.safetensors", + "url": "https://huggingface.co/Kijai/depth-fm-pruned/resolve/main/depthfm-v1_fp16.safetensors" + }, + { + "name": "Depth-FM-v1 fp32 safetensors", + "type": "checkpoints", + "base": "Depth-FM", + "save_path": "checkpoints/depthfm", + "description": "Depth-FM monocular depth estimation model", + "reference": "https://huggingface.co/Kijai/depth-fm-pruned", + "filename": "depthfm-v1_fp32.safetensors", + "url": "https://huggingface.co/Kijai/depth-fm-pruned/resolve/main/depthfm-v1_fp32.safetensors" + }, + { + "name": "monster-labs - Controlnet QR Code Monster v1 For SDXL", + "type": "controlnet", + "base": "SDXL", + "save_path": "default", + "description": "monster-labs - Controlnet QR Code Monster v1 For SDXL", + "reference": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster", + "filename": "control_v1p_sdxl_qrcode_monster.safetensors", + "url": "https://huggingface.co/monster-labs/control_v1p_sdxl_qrcode_monster/resolve/main/diffusion_pytorch_model.safetensors" + } + ] +} diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/custom-node-list.json b/custom_nodes/ComfyUI-Manager/node_db/tutorial/custom-node-list.json new file mode 100644 index 000000000..c02d05d8e --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/custom-node-list.json @@ -0,0 +1,244 @@ +{ + "custom_nodes": [ + { + "author": "Suzie1", + "title": "Guide To Making Custom Nodes in ComfyUI", + "reference": "https://github.com/Suzie1/ComfyUI_Guide_To_Making_Custom_Nodes", + "files": [ + "https://github.com/Suzie1/ComfyUI_Guide_To_Making_Custom_Nodes" + ], + "install_type": "git-clone", + "description": "There is a small node pack attached to this guide. This includes the init file and 3 nodes associated with the tutorials." + }, + { + "author": "bamboodia", + "title": "BAM Nodes", + "reference": "https://github.com/bamboodia/BAM_Nodes", + "files": [ + "https://github.com/bamboodia/BAM_Nodes" + ], + "install_type": "git-clone", + "description": "A collection of comfyui nodes that I have made for nothing more than educational purposes." + }, + { + "author": "BadCafeCode", + "title": "execution-inversion-demo-comfyui", + "reference": "https://github.com/BadCafeCode/execution-inversion-demo-comfyui", + "files": [ + "https://github.com/BadCafeCode/execution-inversion-demo-comfyui" + ], + "install_type": "git-clone", + "description": "These are demo nodes for [a/PR2666](https://github.com/comfyanonymous/ComfyUI/pull/2666)" + }, + { + "author": "ecjojo", + "title": "ecjojo_example_nodes", + "reference": "https://github.com/ecjojo/ecjojo-example-nodes", + "files": [ + "https://github.com/ecjojo/ecjojo-example-nodes" + ], + "install_type": "git-clone", + "description": "Welcome to ecjojo_example_nodes! This example is specifically designed for beginners who want to learn how to write a simple custom node.\nFeel free to modify this example and make it your own. Experiment with different features and functionalities to enhance your understanding of ComfyUI custom nodes. Don't be afraid to explore and customize the code to suit your needs.\nBy diving into this example and making it your own, you'll gain valuable hands-on experience in creating custom nodes in ComfyUI. Enjoy the process of learning and have fun with your custom node development journey!" + }, + { + "author": "dynamixar", + "title": "Atluris", + "reference": "https://github.com/dynamixar/Atluris", + "files": [ + "https://github.com/dynamixar/Atluris" + ], + "install_type": "git-clone", + "description": "Nodes:Random Line" + }, + { + "author": "et118", + "title": "ComfyUI-ElGogh-Nodes", + "reference": "https://github.com/et118/ComfyUI-ElGogh-Nodes", + "files": [ + "https://github.com/et118/ComfyUI-ElGogh-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:ElGogh Positive Prompt, ElGogh NEGATIVE Prompt, ElGogh Empty Latent Image, ElGogh Checkpoint Loader Simple" + }, + { + "author": "LarryJane491", + "title": "Custom-Node-Base", + "reference": "https://github.com/LarryJane491/Custom-Node-Base", + "files": [ + "https://github.com/LarryJane491/Custom-Node-Base" + ], + "install_type": "git-clone", + "description": "This project is an `empty` custom node that is already in its own folder. It serves as a base to build any custom node. Whenever you want to create a custom node, you can download that, put it in custom_nodes, then you just have to change the names and fill it with code!" + }, + { + "author": "foxtrot-roger", + "title": "comfyui-custom-nodes", + "reference": "https://github.com/foxtrot-roger/comfyui-custom-nodes", + "files": [ + "https://github.com/foxtrot-roger/comfyui-custom-nodes" + ], + "install_type": "git-clone", + "description": "Tutorial nodes" + }, + { + "author": "wailovet", + "title": "ComfyUI-WW", + "reference": "https://github.com/wailovet/ComfyUI-WW", + "files": [ + "https://github.com/wailovet/ComfyUI-WW" + ], + "install_type": "git-clone", + "description": "Nodes:WW_ImageResize" + }, + { + "author": "bmz55", + "title": "bmz nodes", + "reference": "https://github.com/bmz55/comfyui-bmz-nodes", + "files": [ + "https://github.com/bmz55/comfyui-bmz-nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Load Images From Dir With Name (Inspire - BMZ), Count Images In Dir (BMZ), Get Level Text (BMZ), Get Level Float (BMZ)" + }, + { + "author": "azure-dragon-ai", + "title": "ComfyUI-HPSv2-Nodes", + "reference": "https://github.com/azure-dragon-ai/ComfyUI-HPSv2-Nodes", + "files": [ + "https://github.com/azure-dragon-ai/ComfyUI-HPSv2-Nodes" + ], + "install_type": "git-clone", + "description": "Nodes:Loader, Image Processor, Text Processor, ImageScore" + }, + { + "author": "kappa54m", + "title": "ComfyUI-HPSv2-Nodes", + "reference": "https://github.com/kappa54m/ComfyUI_Usability", + "files": [ + "https://github.com/kappa54m/ComfyUI_Usability" + ], + "install_type": "git-clone", + "description": "Nodes:Load Image Dedup" + }, + { + "author": "IvanRybakov", + "title": "comfyui-node-int-to-string-convertor", + "reference": "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor", + "files": [ + "https://github.com/IvanRybakov/comfyui-node-int-to-string-convertor" + ], + "install_type": "git-clone", + "description": "Nodes:Int To String Convertor" + }, + { + "author": "yowipr", + "title": "ComfyUI-Manual", + "reference": "https://github.com/yowipr/ComfyUI-Manual", + "files": [ + "https://github.com/yowipr/ComfyUI-Manual" + ], + "install_type": "git-clone", + "description": "Nodes:M_Layer, M_Output" + }, + { + "author": "andrewharp", + "title": "ComfyUI Function Annotator", + "reference": "https://github.com/andrewharp/ComfyUI-Annotations", + "files": [ + "https://github.com/andrewharp/ComfyUI-Annotations" + ], + "install_type": "git-clone", + "description": "This module provides an annotation @ComfyFunc to streamline adding custom node types in ComfyUI. It processes your function's signature to create a wrapped function and custom node definition required for ComfyUI, eliminating all the boilerplate code. In most cases you can just add a @ComfyFunc(\"category\") annotation to your existing function." + }, + { + "author": "MokkaBoss1", + "title": "Woman_in_a_dress", + "reference": "https://github.com/MokkaBoss1/Woman_in_a_dress", + "files": [ + "https://github.com/MokkaBoss1/Woman_in_a_dress/raw/main/Woman_In_A_Dress.py" + ], + "install_type": "git-clone", + "description": "Nodes:Woman_in_a_dress" + }, + { + "author": "shinich39", + "title": "comfyui-concat-text-39", + "reference": "https://github.com/shinich39/comfyui-concat-text-39", + "files": [ + "https://github.com/shinich39/comfyui-concat-text-39" + ], + "install_type": "git-clone", + "description": "Nodes:Concatenate multiple text nodes." + }, + { + "author": "nilor-corp", + "title": "nilor-nodes", + "reference": "https://github.com/nilor-corp/nilor-nodes", + "files": [ + "https://github.com/nilor-corp/nilor-nodes" + ], + "install_type": "git-clone", + "description": "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", + "reference": "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex", + "files": [ + "https://github.com/OuticNZ/ComfyUI-Simple-Of-Complex" + ], + "install_type": "git-clone", + "description": "Keeping it simple for starting. Single branch for now and will add development branch later." + }, + { + "author": "jtong", + "title": "comfyui-jtong-workflow", + "reference": "https://github.com/jtong/comfyui-jtong-workflow", + "files": [ + "https://github.com/jtong/comfyui-jtong-workflow" + ], + "install_type": "git-clone", + "description": "Nodes:jtong.Highway, Example" + }, + { + "author": "thinkthinking", + "title": "ComfyUI-Ye", + "reference": "https://github.com/thinkthinking/ComfyUI-Ye", + "files": [ + "https://github.com/thinkthinking/ComfyUI-Ye" + ], + "install_type": "git-clone", + "description": "Nodes:Signature|Ye, CheckpointLoader|Ye, PrintHelloWorld|Ye." + }, + { + "author": "BoosterCore", + "title": "ComfyUI-BC-Experimental", + "reference": "https://github.com/BoosterCore/ComfyUI-BC-Experimental", + "files": [ + "https://github.com/BoosterCore/ComfyUI-BC-Experimental" + ], + "install_type": "git-clone", + "description": "Nodes:ClipTextEncodeBC, SaveAnyText, SimpleText" + }, + { + "author": "sonyeon-sj", + "title": "ComfyUI-easy_ImageSize_Selecter", + "reference": "https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter", + "files": [ + "https://github.com/sonyeon-sj/ComfyUI-easy_ImageSize_Selecter" + ], + "install_type": "git-clone", + "description": "Custom node for ComfyUI Select the image size from the preset and select Vertical and Horizontal to output Width and Height." + }, + { + "author": "boricuapab", + "title": "ComfyUI_BoricuapabWFNodePack", + "reference": "https://github.com/boricuapab/ComfyUI_BoricuapabWFNodePack", + "files": [ + "https://github.com/boricuapab/ComfyUI_BoricuapabWFNodePack" + ], + "install_type": "git-clone", + "description": "Learning how to make my own comfy ui custom nodes" + } + ] +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/extension-node-map.json b/custom_nodes/ComfyUI-Manager/node_db/tutorial/extension-node-map.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/extension-node-map.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/model-list.json b/custom_nodes/ComfyUI-Manager/node_db/tutorial/model-list.json new file mode 100644 index 000000000..8e3e1dc48 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/model-list.json @@ -0,0 +1,3 @@ +{ + "models": [] +} diff --git a/custom_nodes/ComfyUI-Manager/node_db/tutorial/scan.sh b/custom_nodes/ComfyUI-Manager/node_db/tutorial/scan.sh new file mode 100644 index 000000000..5d8d8c48b --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/node_db/tutorial/scan.sh @@ -0,0 +1,4 @@ +#!/bin/bash +source ../../../../venv/bin/activate +rm .tmp/*.py > /dev/null +python ../../scanner.py diff --git a/custom_nodes/ComfyUI-Manager/notebooks/comfyui_colab_with_manager.ipynb b/custom_nodes/ComfyUI-Manager/notebooks/comfyui_colab_with_manager.ipynb new file mode 100644 index 000000000..d8b863889 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/notebooks/comfyui_colab_with_manager.ipynb @@ -0,0 +1,372 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "aaaaaaaaaa" + }, + "source": [ + "Git clone the repo and install the requirements. (ignore the pip errors about protobuf)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "bbbbbbbbbb" + }, + "outputs": [], + "source": [ + "# #@title Environment Setup\n", + "\n", + "from pathlib import Path\n", + "\n", + "OPTIONS = {}\n", + "\n", + "USE_GOOGLE_DRIVE = True #@param {type:\"boolean\"}\n", + "UPDATE_COMFY_UI = True #@param {type:\"boolean\"}\n", + "USE_COMFYUI_MANAGER = True #@param {type:\"boolean\"}\n", + "INSTALL_CUSTOM_NODES_DEPENDENCIES = True #@param {type:\"boolean\"}\n", + "OPTIONS['USE_GOOGLE_DRIVE'] = USE_GOOGLE_DRIVE\n", + "OPTIONS['UPDATE_COMFY_UI'] = UPDATE_COMFY_UI\n", + "OPTIONS['USE_COMFYUI_MANAGER'] = USE_COMFYUI_MANAGER\n", + "OPTIONS['INSTALL_CUSTOM_NODES_DEPENDENCIES'] = INSTALL_CUSTOM_NODES_DEPENDENCIES\n", + "\n", + "current_dir = !pwd\n", + "WORKSPACE = f\"{current_dir[0]}/ComfyUI\"\n", + "\n", + "if OPTIONS['USE_GOOGLE_DRIVE']:\n", + " !echo \"Mounting Google Drive...\"\n", + " %cd /\n", + "\n", + " from google.colab import drive\n", + " drive.mount('/content/drive')\n", + "\n", + " WORKSPACE = \"/content/drive/MyDrive/ComfyUI\"\n", + " %cd /content/drive/MyDrive\n", + "\n", + "![ ! -d $WORKSPACE ] && echo -= Initial setup ComfyUI =- && git clone https://github.com/comfyanonymous/ComfyUI\n", + "%cd $WORKSPACE\n", + "\n", + "if OPTIONS['UPDATE_COMFY_UI']:\n", + " !echo -= Updating ComfyUI =-\n", + "\n", + " # Correction of the issue of permissions being deleted on Google Drive.\n", + " ![ -f \".ci/nightly/update_windows/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/nightly/update_windows/update_comfyui_and_python_dependencies.bat\n", + " ![ -f \".ci/nightly/windows_base_files/run_nvidia_gpu.bat\" ] && chmod 755 .ci/nightly/windows_base_files/run_nvidia_gpu.bat\n", + " ![ -f \".ci/update_windows/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/update_windows/update_comfyui_and_python_dependencies.bat\n", + " ![ -f \".ci/update_windows_cu118/update_comfyui_and_python_dependencies.bat\" ] && chmod 755 .ci/update_windows_cu118/update_comfyui_and_python_dependencies.bat\n", + " ![ -f \".ci/update_windows/update.py\" ] && chmod 755 .ci/update_windows/update.py\n", + " ![ -f \".ci/update_windows/update_comfyui.bat\" ] && chmod 755 .ci/update_windows/update_comfyui.bat\n", + " ![ -f \".ci/update_windows/README_VERY_IMPORTANT.txt\" ] && chmod 755 .ci/update_windows/README_VERY_IMPORTANT.txt\n", + " ![ -f \".ci/update_windows/run_cpu.bat\" ] && chmod 755 .ci/update_windows/run_cpu.bat\n", + " ![ -f \".ci/update_windows/run_nvidia_gpu.bat\" ] && chmod 755 .ci/update_windows/run_nvidia_gpu.bat\n", + "\n", + " !git pull\n", + "\n", + "!echo -= Install dependencies =-\n", + "!pip3 install accelerate\n", + "!pip3 install einops transformers>=4.25.1 safetensors>=0.3.0 aiohttp pyyaml Pillow scipy tqdm psutil\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", + "\n", + "if OPTIONS['USE_COMFYUI_MANAGER']:\n", + " %cd custom_nodes\n", + "\n", + " # Correction of the issue of permissions being deleted on Google Drive.\n", + " ![ -f \"ComfyUI-Manager/check.sh\" ] && chmod 755 ComfyUI-Manager/check.sh\n", + " ![ -f \"ComfyUI-Manager/scan.sh\" ] && chmod 755 ComfyUI-Manager/scan.sh\n", + " ![ -f \"ComfyUI-Manager/node_db/dev/scan.sh\" ] && chmod 755 ComfyUI-Manager/node_db/dev/scan.sh\n", + " ![ -f \"ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh\" ] && chmod 755 ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh\n", + " ![ -f \"ComfyUI-Manager/scripts/install-comfyui-venv-win.bat\" ] && chmod 755 ComfyUI-Manager/scripts/install-comfyui-venv-win.bat\n", + "\n", + " ![ ! -d ComfyUI-Manager ] && echo -= Initial setup ComfyUI-Manager =- && git clone https://github.com/ltdrdata/ComfyUI-Manager\n", + " %cd ComfyUI-Manager\n", + " !git pull\n", + "\n", + "%cd $WORKSPACE\n", + "\n", + "if OPTIONS['INSTALL_CUSTOM_NODES_DEPENDENCIES']:\n", + " !echo -= Install custom nodes dependencies =-\n", + " !pip install GitPython\n", + " !python custom_nodes/ComfyUI-Manager/cm-cli.py restore-dependencies\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cccccccccc" + }, + "source": [ + "Download some models/checkpoints/vae or custom comfyui nodes (uncomment the commands for the ones you want)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "dddddddddd" + }, + "outputs": [], + "source": [ + "# Checkpoints\n", + "\n", + "### SDXL\n", + "### I recommend these workflow examples: https://comfyanonymous.github.io/ComfyUI_examples/sdxl/\n", + "\n", + "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors -P ./models/checkpoints/\n", + "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors -P ./models/checkpoints/\n", + "\n", + "# SDXL ReVision\n", + "#!wget -c https://huggingface.co/comfyanonymous/clip_vision_g/resolve/main/clip_vision_g.safetensors -P ./models/clip_vision/\n", + "\n", + "# SD1.5\n", + "!wget -c https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt -P ./models/checkpoints/\n", + "\n", + "# SD2\n", + "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.safetensors -P ./models/checkpoints/\n", + "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.safetensors -P ./models/checkpoints/\n", + "\n", + "# Some SD1.5 anime style\n", + "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix2/AbyssOrangeMix2_hard.safetensors -P ./models/checkpoints/\n", + "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1_orangemixs.safetensors -P ./models/checkpoints/\n", + "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A3_orangemixs.safetensors -P ./models/checkpoints/\n", + "#!wget -c https://huggingface.co/Linaqruf/anything-v3.0/resolve/main/anything-v3-fp16-pruned.safetensors -P ./models/checkpoints/\n", + "\n", + "# Waifu Diffusion 1.5 (anime style SD2.x 768-v)\n", + "#!wget -c https://huggingface.co/waifu-diffusion/wd-1-5-beta3/resolve/main/wd-illusion-fp16.safetensors -P ./models/checkpoints/\n", + "\n", + "\n", + "# unCLIP models\n", + "#!wget -c https://huggingface.co/comfyanonymous/illuminatiDiffusionV1_v11_unCLIP/resolve/main/illuminatiDiffusionV1_v11-unclip-h-fp16.safetensors -P ./models/checkpoints/\n", + "#!wget -c https://huggingface.co/comfyanonymous/wd-1.5-beta2_unCLIP/resolve/main/wd-1-5-beta2-aesthetic-unclip-h-fp16.safetensors -P ./models/checkpoints/\n", + "\n", + "\n", + "# VAE\n", + "!wget -c https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.safetensors -P ./models/vae/\n", + "#!wget -c https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt -P ./models/vae/\n", + "#!wget -c https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt -P ./models/vae/\n", + "\n", + "\n", + "# Loras\n", + "#!wget -c https://civitai.com/api/download/models/10350 -O ./models/loras/theovercomer8sContrastFix_sd21768.safetensors #theovercomer8sContrastFix SD2.x 768-v\n", + "#!wget -c https://civitai.com/api/download/models/10638 -O ./models/loras/theovercomer8sContrastFix_sd15.safetensors #theovercomer8sContrastFix SD1.x\n", + "#!wget -c https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors -P ./models/loras/ #SDXL offset noise lora\n", + "\n", + "\n", + "# T2I-Adapter\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_depth_sd14v1.pth -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_seg_sd14v1.pth -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_sketch_sd14v1.pth -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_keypose_sd14v1.pth -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_openpose_sd14v1.pth -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_color_sd14v1.pth -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_canny_sd14v1.pth -P ./models/controlnet/\n", + "\n", + "# T2I Styles Model\n", + "#!wget -c https://huggingface.co/TencentARC/T2I-Adapter/resolve/main/models/t2iadapter_style_sd14v1.pth -P ./models/style_models/\n", + "\n", + "# CLIPVision model (needed for styles model)\n", + "#!wget -c https://huggingface.co/openai/clip-vit-large-patch14/resolve/main/pytorch_model.bin -O ./models/clip_vision/clip_vit14.bin\n", + "\n", + "\n", + "# ControlNet\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_ip2p_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11e_sd15_shuffle_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_canny_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11f1p_sd15_depth_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_inpaint_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_lineart_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_mlsd_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_normalbae_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_openpose_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_scribble_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_seg_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_softedge_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15s2_lineart_anime_fp16.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11u_sd15_tile_fp16.safetensors -P ./models/controlnet/\n", + "\n", + "# ControlNet SDXL\n", + "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-canny-rank256.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-depth-rank256.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-recolor-rank256.safetensors -P ./models/controlnet/\n", + "#!wget -c https://huggingface.co/stabilityai/control-lora/resolve/main/control-LoRAs-rank256/control-lora-sketch-rank256.safetensors -P ./models/controlnet/\n", + "\n", + "# Controlnet Preprocessor nodes by Fannovel16\n", + "#!cd custom_nodes && git clone https://github.com/Fannovel16/comfy_controlnet_preprocessors; cd comfy_controlnet_preprocessors && python install.py\n", + "\n", + "\n", + "# GLIGEN\n", + "#!wget -c https://huggingface.co/comfyanonymous/GLIGEN_pruned_safetensors/resolve/main/gligen_sd14_textbox_pruned_fp16.safetensors -P ./models/gligen/\n", + "\n", + "\n", + "# ESRGAN upscale model\n", + "#!wget -c https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth -P ./models/upscale_models/\n", + "#!wget -c https://huggingface.co/sberbank-ai/Real-ESRGAN/resolve/main/RealESRGAN_x2.pth -P ./models/upscale_models/\n", + "#!wget -c https://huggingface.co/sberbank-ai/Real-ESRGAN/resolve/main/RealESRGAN_x4.pth -P ./models/upscale_models/\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kkkkkkkkkkkkkkk" + }, + "source": [ + "### Run ComfyUI with cloudflared (Recommended Way)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jjjjjjjjjjjjjj" + }, + "outputs": [], + "source": [ + "!wget 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", + "import time\n", + "import socket\n", + "import urllib.request\n", + "\n", + "def iframe_thread(port):\n", + " while True:\n", + " time.sleep(0.5)\n", + " sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n", + " result = sock.connect_ex(('127.0.0.1', port))\n", + " if result == 0:\n", + " break\n", + " sock.close()\n", + " print(\"\\nComfyUI finished loading, trying to launch cloudflared (if it gets stuck here cloudflared is having issues)\\n\")\n", + "\n", + " p = subprocess.Popen([\"cloudflared\", \"tunnel\", \"--url\", \"http://127.0.0.1:{}\".format(port)], stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n", + " for line in p.stderr:\n", + " l = line.decode()\n", + " if \"trycloudflare.com \" in l:\n", + " print(\"This is the URL to access ComfyUI:\", l[l.find(\"http\"):], end='')\n", + " #print(l, end='')\n", + "\n", + "\n", + "threading.Thread(target=iframe_thread, daemon=True, args=(8188,)).start()\n", + "\n", + "!python main.py --dont-print-server" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "kkkkkkkkkkkkkk" + }, + "source": [ + "### Run ComfyUI with localtunnel\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jjjjjjjjjjjjj" + }, + "outputs": [], + "source": [ + "!npm install -g localtunnel\n", + "\n", + "import subprocess\n", + "import threading\n", + "import time\n", + "import socket\n", + "import urllib.request\n", + "\n", + "def iframe_thread(port):\n", + " while True:\n", + " time.sleep(0.5)\n", + " sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n", + " result = sock.connect_ex(('127.0.0.1', port))\n", + " if result == 0:\n", + " break\n", + " sock.close()\n", + " print(\"\\nComfyUI finished loading, trying to launch localtunnel (if it gets stuck here localtunnel is having issues)\\n\")\n", + "\n", + " print(\"The password/enpoint ip for localtunnel is:\", urllib.request.urlopen('https://ipv4.icanhazip.com').read().decode('utf8').strip(\"\\n\"))\n", + " p = subprocess.Popen([\"lt\", \"--port\", \"{}\".format(port)], stdout=subprocess.PIPE)\n", + " for line in p.stdout:\n", + " print(line.decode(), end='')\n", + "\n", + "\n", + "threading.Thread(target=iframe_thread, daemon=True, args=(8188,)).start()\n", + "\n", + "!python main.py --dont-print-server" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gggggggggg" + }, + "source": [ + "### Run ComfyUI with colab iframe (use only in case the previous way with localtunnel doesn't work)\n", + "\n", + "You should see the ui appear in an iframe. If you get a 403 error, it's your firefox settings or an extension that's messing things up.\n", + "\n", + "If you want to open it in another window use the link.\n", + "\n", + "Note that some UI features like live image previews won't work because the colab iframe blocks websockets." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "hhhhhhhhhh" + }, + "outputs": [], + "source": [ + "import threading\n", + "import time\n", + "import socket\n", + "def iframe_thread(port):\n", + " while True:\n", + " time.sleep(0.5)\n", + " sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\n", + " result = sock.connect_ex(('127.0.0.1', port))\n", + " if result == 0:\n", + " break\n", + " sock.close()\n", + " from google.colab import output\n", + " output.serve_kernel_port_as_iframe(port, height=1024)\n", + " print(\"to open it in a window you can open this link here:\")\n", + " output.serve_kernel_port_as_window(port)\n", + "\n", + "threading.Thread(target=iframe_thread, daemon=True, args=(8188,)).start()\n", + "\n", + "!python main.py --dont-print-server" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "provenance": [] + }, + "gpuClass": "standard", + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/pip_overrides.json.template b/custom_nodes/ComfyUI-Manager/pip_overrides.json.template new file mode 100644 index 000000000..a6b1f2629 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/pip_overrides.json.template @@ -0,0 +1,21 @@ +{ + "imageio-ffmpeg": "imageio", + "imageio[ffmpeg]": "imageio", + "imageio_ffmpeg": "imageio", + "diffusers~=0.21.4": "diffusers", + "huggingface_hub": "huggingface-hub", + "numpy<1.24>=1.18": "numpy", + "numpy>=1.18.5, <1.25.0": "numpy", + "opencv-contrib-python": "opencv-contrib-python-headless", + "opencv-python": "opencv-contrib-python-headless", + "opencv-python-headless": "opencv-contrib-python-headless", + "opencv-python-headless[ffmpeg]<=4.7.0.72": "opencv-contrib-python-headless", + "opencv-python>=4.7.0.72": "opencv-contrib-python-headless", + "pandas<=1.5.1": "pandas", + "scikit-image==0.20.0": "scikit-image", + "scipy>=1.11.4": "scipy", + "segment_anything": "segment-anything", + "timm==0.6.5": "timm", + "timm>=0.4.12": "timm", + "transformers==4.26.1": "transformers" +} \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/prestartup_script.py b/custom_nodes/ComfyUI-Manager/prestartup_script.py new file mode 100644 index 000000000..163a9880c --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/prestartup_script.py @@ -0,0 +1,665 @@ +import datetime +import os +import subprocess +import sys +import atexit +import threading +import re +import locale +import platform +import json +import ast +import logging + +glob_path = os.path.join(os.path.dirname(__file__), "glob") +sys.path.append(glob_path) + +import security_check +from manager_util import * +import cm_global + +security_check.security_check() + +cm_global.pip_downgrade_blacklist = ['torch', 'torchsde', 'torchvision', 'transformers', 'safetensors', 'kornia'] + + +def skip_pip_spam(x): + return ('Requirement already satisfied:' in x) or ("DEPRECATION: Loading egg at" in x) + + +message_collapses = [skip_pip_spam] +import_failed_extensions = set() +cm_global.variables['cm.on_revision_detected_handler'] = [] +enable_file_logging = True + + +def register_message_collapse(f): + global message_collapses + message_collapses.append(f) + + +def is_import_failed_extension(name): + global import_failed_extensions + return name in import_failed_extensions + + +def check_file_logging(): + global enable_file_logging + try: + import configparser + config_path = os.path.join(os.path.dirname(__file__), "config.ini") + config = configparser.ConfigParser() + config.read(config_path) + default_conf = config['default'] + + if 'file_logging' in default_conf and default_conf['file_logging'].lower() == 'false': + enable_file_logging = False + except Exception: + pass + + +check_file_logging() + +comfy_path = os.environ.get('COMFYUI_PATH') +if comfy_path is None: + comfy_path = os.path.abspath(os.path.dirname(sys.modules['__main__'].__file__)) + +sys.__comfyui_manager_register_message_collapse = register_message_collapse +sys.__comfyui_manager_is_import_failed_extension = is_import_failed_extension +cm_global.register_api('cm.register_message_collapse', register_message_collapse) +cm_global.register_api('cm.is_import_failed_extension', is_import_failed_extension) + + +comfyui_manager_path = os.path.dirname(__file__) +custom_nodes_path = os.path.abspath(os.path.join(comfyui_manager_path, "..")) +startup_script_path = os.path.join(comfyui_manager_path, "startup-scripts") +restore_snapshot_path = os.path.join(startup_script_path, "restore-snapshot.json") +git_script_path = os.path.join(comfyui_manager_path, "git_helper.py") +pip_overrides_path = os.path.join(comfyui_manager_path, "pip_overrides.json") + + +cm_global.pip_overrides = {} +if os.path.exists(pip_overrides_path): + with open(pip_overrides_path, 'r', encoding="UTF-8", errors="ignore") as json_file: + cm_global.pip_overrides = json.load(json_file) + + +def remap_pip_package(pkg): + if pkg in cm_global.pip_overrides: + res = cm_global.pip_overrides[pkg] + print(f"[ComfyUI-Manager] '{pkg}' is remapped to '{res}'") + return res + else: + return pkg + + +std_log_lock = threading.Lock() + + +class TerminalHook: + def __init__(self): + self.hooks = {} + + def add_hook(self, k, v): + self.hooks[k] = v + + def remove_hook(self, k): + if k in self.hooks: + del self.hooks[k] + + def write_stderr(self, msg): + for v in self.hooks.values(): + try: + v.write_stderr(msg) + except Exception: + pass + + def write_stdout(self, msg): + for v in self.hooks.values(): + try: + v.write_stdout(msg) + except Exception: + pass + + +terminal_hook = TerminalHook() +sys.__comfyui_manager_terminal_hook = terminal_hook + + +def handle_stream(stream, prefix): + stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace') + for msg in stream: + if prefix == '[!]' and ('it/s]' in msg or 's/it]' in msg) and ('%|' in msg or 'it [' in msg): + if msg.startswith('100%'): + print('\r' + msg, end="", file=sys.stderr), + else: + print('\r' + msg[:-1], end="", file=sys.stderr), + else: + if prefix == '[!]': + print(prefix, msg, end="", file=sys.stderr) + else: + print(prefix, msg, end="") + + +def process_wrap(cmd_str, cwd_path, handler=None, env=None): + process = subprocess.Popen(cmd_str, cwd=cwd_path, env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, bufsize=1) + + if handler is None: + handler = handle_stream + + stdout_thread = threading.Thread(target=handler, args=(process.stdout, "")) + stderr_thread = threading.Thread(target=handler, args=(process.stderr, "[!]")) + + stdout_thread.start() + stderr_thread.start() + + stdout_thread.join() + stderr_thread.join() + + return process.wait() + + +try: + if '--port' in sys.argv: + port_index = sys.argv.index('--port') + if port_index + 1 < len(sys.argv): + port = int(sys.argv[port_index + 1]) + postfix = f"_{port}" + else: + postfix = "" + else: + postfix = "" + + # Logger setup + if enable_file_logging: + if os.path.exists(f"comfyui{postfix}.log"): + if os.path.exists(f"comfyui{postfix}.prev.log"): + if os.path.exists(f"comfyui{postfix}.prev2.log"): + os.remove(f"comfyui{postfix}.prev2.log") + os.rename(f"comfyui{postfix}.prev.log", f"comfyui{postfix}.prev2.log") + os.rename(f"comfyui{postfix}.log", f"comfyui{postfix}.prev.log") + + log_file = open(f"comfyui{postfix}.log", "w", encoding="utf-8", errors="ignore") + + log_lock = threading.Lock() + + original_stdout = sys.stdout + original_stderr = sys.stderr + + if original_stdout.encoding.lower() == 'utf-8': + write_stdout = original_stdout.write + write_stderr = original_stderr.write + else: + def wrapper_stdout(msg): + original_stdout.write(msg.encode('utf-8').decode(original_stdout.encoding, errors="ignore")) + + def wrapper_stderr(msg): + original_stderr.write(msg.encode('utf-8').decode(original_stderr.encoding, errors="ignore")) + + write_stdout = wrapper_stdout + write_stderr = wrapper_stderr + + pat_tqdm = r'\d+%.*\[(.*?)\]' + pat_import_fail = r'seconds \(IMPORT FAILED\):.*[/\\]custom_nodes[/\\](.*)$' + + is_start_mode = True + + + class ComfyUIManagerLogger: + def __init__(self, is_stdout): + self.is_stdout = is_stdout + self.encoding = "utf-8" + self.last_char = '' + + def fileno(self): + try: + if self.is_stdout: + return original_stdout.fileno() + else: + return original_stderr.fileno() + except AttributeError: + # Handle error + raise ValueError("The object does not have a fileno method") + + def isatty(self): + return False + + def write(self, message): + global is_start_mode + + if any(f(message) for f in message_collapses): + return + + if is_start_mode: + match = re.search(pat_import_fail, message) + if match: + import_failed_extensions.add(match.group(1)) + + if 'Starting server' in message: + is_start_mode = False + + if not self.is_stdout: + match = re.search(pat_tqdm, message) + if match: + message = re.sub(r'([#|])\d', r'\1▌', message) + message = re.sub('#', '█', message) + if '100%' in message: + self.sync_write(message) + else: + write_stderr(message) + original_stderr.flush() + else: + self.sync_write(message) + else: + self.sync_write(message) + + def sync_write(self, message, file_only=False): + with log_lock: + timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')[:-3] + if self.last_char != '\n': + log_file.write(message) + else: + log_file.write(f"[{timestamp}] {message}") + log_file.flush() + self.last_char = message if message == '' else message[-1] + + if not file_only: + with std_log_lock: + if self.is_stdout: + write_stdout(message) + original_stdout.flush() + terminal_hook.write_stderr(message) + else: + write_stderr(message) + original_stderr.flush() + terminal_hook.write_stdout(message) + + def flush(self): + log_file.flush() + + with std_log_lock: + if self.is_stdout: + original_stdout.flush() + else: + original_stderr.flush() + + def close(self): + self.flush() + + def reconfigure(self, *args, **kwargs): + pass + + # You can close through sys.stderr.close_log() + def close_log(self): + sys.stderr = original_stderr + sys.stdout = original_stdout + log_file.close() + + def close_log(): + sys.stderr = original_stderr + sys.stdout = original_stdout + log_file.close() + + + if enable_file_logging: + sys.stdout = ComfyUIManagerLogger(True) + stderr_wrapper = ComfyUIManagerLogger(False) + sys.stderr = stderr_wrapper + + atexit.register(close_log) + else: + sys.stdout.close_log = lambda: None + stderr_wrapper = None + + + class LoggingHandler(logging.Handler): + def emit(self, record): + global is_start_mode + + message = record.getMessage() + + if is_start_mode: + match = re.search(pat_import_fail, message) + if match: + import_failed_extensions.add(match.group(1)) + + if 'Starting server' in message: + is_start_mode = False + + if stderr_wrapper: + stderr_wrapper.sync_write(message+'\n', file_only=True) + + + logging.getLogger().addHandler(LoggingHandler()) + + +except Exception as e: + print(f"[ComfyUI-Manager] Logging failed: {e}") + + +try: + import git +except ModuleNotFoundError: + my_path = os.path.dirname(__file__) + requirements_path = os.path.join(my_path, "requirements.txt") + + print(f"## ComfyUI-Manager: installing dependencies. (GitPython)") + try: + result = subprocess.check_output([sys.executable, '-s', '-m', 'pip', 'install', '-r', requirements_path]) + except subprocess.CalledProcessError as e: + print(f"## [ERROR] ComfyUI-Manager: Attempting to reinstall dependencies using an alternative method.") + try: + result = subprocess.check_output([sys.executable, '-s', '-m', 'pip', 'install', '--user', '-r', requirements_path]) + except subprocess.CalledProcessError as e: + print(f"## [ERROR] ComfyUI-Manager: Failed to install the GitPython package in the correct Python environment. Please install it manually in the appropriate environment. (You can seek help at https://app.element.io/#/room/%23comfyui_space%3Amatrix.org)") + +try: + import git + print(f"## ComfyUI-Manager: installing dependencies done.") +except: + # maybe we should sys.exit() here? there is at least two screens worth of error messages still being pumped after our error messages + print(f"## [ERROR] ComfyUI-Manager: GitPython package seems to be installed, but failed to load somehow. Make sure you have a working git client installed") + + +print("** ComfyUI startup time:", datetime.datetime.now()) +print("** Platform:", platform.system()) +print("** Python version:", sys.version) +print("** Python executable:", sys.executable) +print("** ComfyUI Path:", comfy_path) + +if enable_file_logging: + print("** Log path:", os.path.abspath('comfyui.log')) +else: + print("** Log path: file logging is disabled") + + +def read_downgrade_blacklist(): + try: + import configparser + config_path = os.path.join(os.path.dirname(__file__), "config.ini") + config = configparser.ConfigParser() + config.read(config_path) + default_conf = config['default'] + + if 'downgrade_blacklist' in default_conf: + items = default_conf['downgrade_blacklist'].split(',') + items = [x.strip() for x in items if x != ''] + cm_global.pip_downgrade_blacklist += items + cm_global.pip_downgrade_blacklist = list(set(cm_global.pip_downgrade_blacklist)) + except: + pass + + +read_downgrade_blacklist() + + +def check_bypass_ssl(): + try: + import configparser + import ssl + config_path = os.path.join(os.path.dirname(__file__), "config.ini") + config = configparser.ConfigParser() + config.read(config_path) + default_conf = config['default'] + + if 'bypass_ssl' in default_conf and default_conf['bypass_ssl'].lower() == 'true': + print(f"[ComfyUI-Manager] WARN: Unsafe - SSL verification bypass option is Enabled. (see ComfyUI-Manager/config.ini)") + ssl._create_default_https_context = ssl._create_unverified_context # SSL certificate error fix. + except Exception: + pass + + +check_bypass_ssl() + + +# Perform install +processed_install = set() +script_list_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "startup-scripts", "install-scripts.txt") +pip_map = None + + +def get_installed_packages(): + global pip_map + + if pip_map is None: + try: + result = subprocess.check_output([sys.executable, '-m', 'pip', 'list'], universal_newlines=True) + + pip_map = {} + for line in result.split('\n'): + x = line.strip() + if x: + y = line.split() + if y[0] == 'Package' or y[0].startswith('-'): + continue + + pip_map[y[0]] = y[1] + except subprocess.CalledProcessError as e: + print(f"[ComfyUI-Manager] Failed to retrieve the information of installed pip packages.") + return set() + + return pip_map + + +def is_installed(name): + name = name.strip() + + if name.startswith('#'): + return True + + pattern = r'([^<>!=]+)([<>!=]=?)(.*)' + match = re.search(pattern, name) + + if match: + name = match.group(1) + + if name in cm_global.pip_downgrade_blacklist: + pips = get_installed_packages() + + if match is None: + if name in pips: + return True + elif match.group(2) in ['<=', '==', '<']: + if name in pips: + if StrictVersion(pips[name]) >= StrictVersion(match.group(3)): + print(f"[ComfyUI-Manager] skip black listed pip installation: '{name}'") + return True + + pkg = get_installed_packages().get(name.lower()) + if pkg is None: + return False # update if not installed + + if match is None: + return True # don't update if version is not specified + + if match.group(2) in ['>', '>=']: + if StrictVersion(pkg) < StrictVersion(match.group(3)): + return False + elif StrictVersion(pkg) > StrictVersion(match.group(3)): + print(f"[SKIP] Downgrading pip package isn't allowed: {name.lower()} (cur={pkg})") + + return True # prevent downgrade + + +if os.path.exists(restore_snapshot_path): + try: + cloned_repos = [] + + def msg_capture(stream, prefix): + stream.reconfigure(encoding=locale.getpreferredencoding(), errors='replace') + for msg in stream: + if msg.startswith("CLONE: "): + cloned_repos.append(msg[7:]) + if prefix == '[!]': + print(prefix, msg, end="", file=sys.stderr) + else: + print(prefix, msg, end="") + + elif prefix == '[!]' and ('it/s]' in msg or 's/it]' in msg) and ('%|' in msg or 'it [' in msg): + if msg.startswith('100%'): + print('\r' + msg, end="", file=sys.stderr), + else: + print('\r'+msg[:-1], end="", file=sys.stderr), + else: + if prefix == '[!]': + print(prefix, msg, end="", file=sys.stderr) + else: + print(prefix, msg, end="") + + print(f"[ComfyUI-Manager] Restore snapshot.") + cmd_str = [sys.executable, git_script_path, '--apply-snapshot', restore_snapshot_path] + + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + exit_code = process_wrap(cmd_str, custom_nodes_path, handler=msg_capture, env=new_env) + + repository_name = '' + for url in cloned_repos: + try: + repository_name = url.split("/")[-1].strip() + repo_path = os.path.join(custom_nodes_path, repository_name) + repo_path = os.path.abspath(repo_path) + + requirements_path = os.path.join(repo_path, 'requirements.txt') + install_script_path = os.path.join(repo_path, 'install.py') + + this_exit_code = 0 + + if os.path.exists(requirements_path): + with open(requirements_path, 'r', encoding="UTF-8", errors="ignore") as file: + for line in file: + package_name = remap_pip_package(line.strip()) + if package_name and not is_installed(package_name): + if not package_name.startswith('#'): + install_cmd = [sys.executable, "-m", "pip", "install", package_name] + this_exit_code += process_wrap(install_cmd, repo_path) + + if os.path.exists(install_script_path) and f'{repo_path}/install.py' not in processed_install: + processed_install.add(f'{repo_path}/install.py') + install_cmd = [sys.executable, install_script_path] + print(f">>> {install_cmd} / {repo_path}") + + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + this_exit_code += process_wrap(install_cmd, repo_path, env=new_env) + + if this_exit_code != 0: + print(f"[ComfyUI-Manager] Restoring '{repository_name}' is failed.") + + except Exception as e: + print(e) + print(f"[ComfyUI-Manager] Restoring '{repository_name}' is failed.") + + if exit_code != 0: + print(f"[ComfyUI-Manager] Restore snapshot failed.") + else: + print(f"[ComfyUI-Manager] Restore snapshot done.") + + except Exception as e: + print(e) + print(f"[ComfyUI-Manager] Restore snapshot failed.") + + os.remove(restore_snapshot_path) + + +def execute_lazy_install_script(repo_path, executable): + global processed_install + + install_script_path = os.path.join(repo_path, "install.py") + requirements_path = os.path.join(repo_path, "requirements.txt") + + if os.path.exists(requirements_path): + print(f"Install: pip packages for '{repo_path}'") + with open(requirements_path, "r") as requirements_file: + for line in requirements_file: + package_name = remap_pip_package(line.strip()) + if package_name and not is_installed(package_name): + install_cmd = [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: + processed_install.add(f'{repo_path}/install.py') + print(f"Install: install script for '{repo_path}'") + install_cmd = [executable, "install.py"] + + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + process_wrap(install_cmd, repo_path, env=new_env) + + +# Check if script_list_path exists +if os.path.exists(script_list_path): + print("\n#######################################################################") + print("[ComfyUI-Manager] Starting dependency installation/(de)activation for the extension\n") + + executed = set() + # Read each line from the file and convert it to a list using eval + with open(script_list_path, 'r', encoding="UTF-8", errors="ignore") as file: + for line in file: + if line in executed: + continue + + executed.add(line) + + try: + script = ast.literal_eval(line) + + if script[1].startswith('#') and script[1] != '#FORCE': + if script[1] == "#LAZY-INSTALL-SCRIPT": + execute_lazy_install_script(script[0], script[2]) + + elif os.path.exists(script[0]): + if script[1] == "#FORCE": + del script[1] + else: + if 'pip' in script[1:] and 'install' in script[1:] and is_installed(script[-1]): + continue + + print(f"\n## ComfyUI-Manager: EXECUTE => {script[1:]}") + print(f"\n## Execute install/(de)activation script for '{script[0]}'") + + new_env = os.environ.copy() + new_env["COMFYUI_PATH"] = comfy_path + exit_code = process_wrap(script[1:], script[0], env=new_env) + + if exit_code != 0: + print(f"install/(de)activation script failed: {script[0]}") + else: + print(f"\n## ComfyUI-Manager: CANCELED => {script[1:]}") + + except Exception as e: + print(f"[ERROR] Failed to execute install/(de)activation script: {line} / {e}") + + # Remove the script_list_path file + if os.path.exists(script_list_path): + os.remove(script_list_path) + + print("\n[ComfyUI-Manager] Startup script completed.") + print("#######################################################################\n") + +del processed_install +del pip_map + + +def check_windows_event_loop_policy(): + try: + import configparser + config_path = os.path.join(os.path.dirname(__file__), "config.ini") + config = configparser.ConfigParser() + config.read(config_path) + default_conf = config['default'] + + if 'windows_selector_event_loop_policy' in default_conf and default_conf['windows_selector_event_loop_policy'].lower() == 'true': + try: + import asyncio + import asyncio.windows_events + asyncio.set_event_loop_policy(asyncio.windows_events.WindowsSelectorEventLoopPolicy()) + print(f"[ComfyUI-Manager] Windows event loop policy mode enabled") + except Exception as e: + print(f"[ComfyUI-Manager] WARN: Windows initialization fail: {e}") + except Exception: + pass + + +if platform.system() == 'Windows': + check_windows_event_loop_policy() diff --git a/custom_nodes/ComfyUI-Manager/pyproject.toml b/custom_nodes/ComfyUI-Manager/pyproject.toml new file mode 100644 index 000000000..fbb0be02f --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/pyproject.toml @@ -0,0 +1,15 @@ +[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.46.2" +license = "LICENSE" +dependencies = ["GitPython", "PyGithub", "matrix-client==0.4.0", "transformers", "huggingface-hub>0.20", "typer", "rich", "typing-extensions"] + +[project.urls] +Repository = "https://github.com/ltdrdata/ComfyUI-Manager" +# Used by Comfy Registry https://comfyregistry.org + +[tool.comfy] +PublisherId = "drltdata" +DisplayName = "ComfyUI-Manager" +Icon = "" diff --git a/custom_nodes/ComfyUI-Manager/requirements.txt b/custom_nodes/ComfyUI-Manager/requirements.txt new file mode 100644 index 000000000..89f93b417 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/requirements.txt @@ -0,0 +1,8 @@ +GitPython +PyGithub +matrix-client==0.4.0 +transformers +huggingface-hub>0.20 +typer +rich +typing-extensions \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/scan.sh b/custom_nodes/ComfyUI-Manager/scan.sh new file mode 100644 index 000000000..f1f088ecc --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scan.sh @@ -0,0 +1,7 @@ +#!/bin/bash +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 diff --git a/custom_nodes/ComfyUI-Manager/scanner.py b/custom_nodes/ComfyUI-Manager/scanner.py new file mode 100644 index 000000000..0118768fd --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scanner.py @@ -0,0 +1,527 @@ +import ast +import re +import os +import json +from git import Repo +import concurrent +import datetime +import concurrent.futures +import requests + +builtin_nodes = set() + +import sys + +from urllib.parse import urlparse +from github import Github + + +def download_url(url, dest_folder, filename=None): + # Ensure the destination folder exists + if not os.path.exists(dest_folder): + os.makedirs(dest_folder) + + # Extract filename from URL if not provided + if filename is None: + filename = os.path.basename(url) + + # Full path to save the file + dest_path = os.path.join(dest_folder, filename) + + # Download the file + response = requests.get(url, stream=True) + if response.status_code == 200: + with open(dest_path, 'wb') as file: + for chunk in response.iter_content(chunk_size=1024): + if chunk: + file.write(chunk) + else: + raise Exception(f"Failed to download file from {url}") + + +# prepare temp dir +if len(sys.argv) > 1: + temp_dir = sys.argv[1] +else: + temp_dir = os.path.join(os.getcwd(), ".tmp") + +if not os.path.exists(temp_dir): + os.makedirs(temp_dir) + + +skip_update = '--skip-update' in sys.argv or '--skip-all' in sys.argv +skip_stat_update = '--skip-stat-update' in sys.argv or '--skip-all' in sys.argv + +if not skip_stat_update: + g = Github(os.environ.get('GITHUB_TOKEN')) +else: + g = None + + +print(f"TEMP DIR: {temp_dir}") + + +parse_cnt = 0 + + +def extract_nodes(code_text): + global parse_cnt + + try: + if parse_cnt % 100 == 0: + print(f".", end="", flush=True) + parse_cnt += 1 + + code_text = re.sub(r'\\[^"\']', '', code_text) + parsed_code = ast.parse(code_text) + + assignments = (node for node in parsed_code.body if isinstance(node, ast.Assign)) + + for assignment in assignments: + if isinstance(assignment.targets[0], ast.Name) and assignment.targets[0].id in ['NODE_CONFIG', 'NODE_CLASS_MAPPINGS']: + node_class_mappings = assignment.value + break + else: + node_class_mappings = None + + if node_class_mappings: + s = set() + + for key in node_class_mappings.keys: + if key is not None and isinstance(key.value, str): + s.add(key.value.strip()) + + return s + else: + return set() + except: + return set() + + +# scan +def scan_in_file(filename, is_builtin=False): + global builtin_nodes + + try: + with open(filename, encoding='utf-8') as file: + code = file.read() + except UnicodeDecodeError: + with open(filename, encoding='cp949') as file: + code = file.read() + + pattern = r"_CLASS_MAPPINGS\s*=\s*{([^}]*)}" + regex = re.compile(pattern, re.MULTILINE | re.DOTALL) + + nodes = set() + class_dict = {} + + nodes |= extract_nodes(code) + code = re.sub(r'^#.*?$', '', code, flags=re.MULTILINE) + + def extract_keys(pattern, code): + keys = re.findall(pattern, code) + return {key.strip() for key in keys} + + def update_nodes(nodes, new_keys): + nodes |= new_keys + + patterns = [ + r'^[^=]*_CLASS_MAPPINGS\["(.*?)"\]', + r'^[^=]*_CLASS_MAPPINGS\[\'(.*?)\'\]', + r'@register_node\("(.+)",\s*\".+"\)', + r'"(\w+)"\s*:\s*{"class":\s*\w+\s*' + ] + + with concurrent.futures.ThreadPoolExecutor() as executor: + futures = {executor.submit(extract_keys, pattern, code): pattern for pattern in patterns} + for future in concurrent.futures.as_completed(futures): + update_nodes(nodes, future.result()) + + matches = regex.findall(code) + for match in matches: + dict_text = match + + key_value_pairs = re.findall(r"\"([^\"]*)\"\s*:\s*([^,\n]*)", dict_text) + for key, value in key_value_pairs: + class_dict[key.strip()] = value.strip() + + key_value_pairs = re.findall(r"'([^']*)'\s*:\s*([^,\n]*)", dict_text) + for key, value in key_value_pairs: + class_dict[key.strip()] = value.strip() + + for key, value in class_dict.items(): + nodes.add(key.strip()) + + update_pattern = r"_CLASS_MAPPINGS.update\s*\({([^}]*)}\)" + update_match = re.search(update_pattern, code) + if update_match: + update_dict_text = update_match.group(1) + update_key_value_pairs = re.findall(r"\"([^\"]*)\"\s*:\s*([^,\n]*)", update_dict_text) + for key, value in update_key_value_pairs: + class_dict[key.strip()] = value.strip() + nodes.add(key.strip()) + + metadata = {} + lines = code.strip().split('\n') + for line in lines: + if line.startswith('@'): + if line.startswith("@author:") or line.startswith("@title:") or line.startswith("@nickname:") or line.startswith("@description:"): + key, value = line[1:].strip().split(':', 1) + metadata[key.strip()] = value.strip() + + if is_builtin: + builtin_nodes += set(nodes) + else: + for x in builtin_nodes: + if x in nodes: + nodes.remove(x) + + return nodes, metadata + + +def get_py_file_paths(dirname): + file_paths = [] + + for root, dirs, files in os.walk(dirname): + if ".git" in root or "__pycache__" in root: + continue + + for file in files: + if file.endswith(".py"): + file_path = os.path.join(root, file) + file_paths.append(file_path) + + return file_paths + + +def get_nodes(target_dir): + py_files = [] + directories = [] + + for item in os.listdir(target_dir): + if ".git" in item or "__pycache__" in item: + continue + + path = os.path.abspath(os.path.join(target_dir, item)) + + if os.path.isfile(path) and item.endswith(".py"): + py_files.append(path) + elif os.path.isdir(path): + directories.append(path) + + return py_files, directories + + +def get_git_urls_from_json(json_file): + with open(json_file, encoding='utf-8') as file: + data = json.load(file) + + custom_nodes = data.get('custom_nodes', []) + git_clone_files = [] + for node in custom_nodes: + if node.get('install_type') == 'git-clone': + files = node.get('files', []) + if files: + git_clone_files.append((files[0], node.get('title'), node.get('preemptions'), node.get('nodename_pattern'))) + + git_clone_files.append(("https://github.com/comfyanonymous/ComfyUI", "ComfyUI", None, None)) + + return git_clone_files + + +def get_py_urls_from_json(json_file): + with open(json_file, encoding='utf-8') as file: + data = json.load(file) + + custom_nodes = data.get('custom_nodes', []) + py_files = [] + for node in custom_nodes: + if node.get('install_type') == 'copy': + files = node.get('files', []) + if files: + py_files.append((files[0], node.get('title'), node.get('preemptions'), node.get('nodename_pattern'))) + + return py_files + + +def clone_or_pull_git_repository(git_url): + repo_name = git_url.split("/")[-1].split(".")[0] + repo_dir = os.path.join(temp_dir, repo_name) + + if os.path.exists(repo_dir): + try: + repo = Repo(repo_dir) + origin = repo.remote(name="origin") + origin.pull() + repo.git.submodule('update', '--init', '--recursive') + print(f"Pulling {repo_name}...") + except Exception as e: + print(f"Pulling {repo_name} failed: {e}") + else: + try: + Repo.clone_from(git_url, repo_dir, recursive=True) + print(f"Cloning {repo_name}...") + except Exception as e: + print(f"Cloning {repo_name} failed: {e}") + + +def update_custom_nodes(): + if not os.path.exists(temp_dir): + os.makedirs(temp_dir) + + node_info = {} + + git_url_titles_preemptions = get_git_urls_from_json('custom-node-list.json') + + def process_git_url_title(url, title, preemptions, node_pattern): + name = os.path.basename(url) + if name.endswith(".git"): + name = name[:-4] + + node_info[name] = (url, title, preemptions, node_pattern) + if not skip_update: + clone_or_pull_git_repository(url) + + def process_git_stats(git_url_titles_preemptions): + GITHUB_STATS_CACHE_FILENAME = 'github-stats-cache.json' + GITHUB_STATS_FILENAME = 'github-stats.json' + + github_stats = {} + try: + with open(GITHUB_STATS_CACHE_FILENAME, 'r', encoding='utf-8') as file: + github_stats = json.load(file) + except FileNotFoundError: + pass + + def is_rate_limit_exceeded(): + return g.rate_limiting[0] == 0 + + if is_rate_limit_exceeded(): + print(f"GitHub API Rate Limit Exceeded: remained - {(g.rate_limiting_resettime - datetime.datetime.now().timestamp())/60:.2f} min") + else: + def renew_stat(url): + if is_rate_limit_exceeded(): + return + + if 'github.com' not in url: + return None + + print('.', end="") + sys.stdout.flush() + try: + # Parsing the URL + parsed_url = urlparse(url) + domain = parsed_url.netloc + path = parsed_url.path + path_parts = path.strip("/").split("/") + if len(path_parts) >= 2 and domain == "github.com": + owner_repo = "/".join(path_parts[-2:]) + repo = g.get_repo(owner_repo) + owner = repo.owner + now = datetime.datetime.now(datetime.timezone.utc) + author_time_diff = now - owner.created_at + + last_update = repo.pushed_at.strftime("%Y-%m-%d %H:%M:%S") if repo.pushed_at else 'N/A' + item = { + "stars": repo.stargazers_count, + "last_update": last_update, + "cached_time": now.timestamp(), + "author_account_age_days": author_time_diff.days, + } + return url, item + else: + print(f"\nInvalid URL format for GitHub repository: {url}\n") + except Exception as e: + print(f"\nERROR on {url}\n{e}") + + return None + + # resolve unresolved urls + with concurrent.futures.ThreadPoolExecutor(11) as executor: + futures = [] + for url, title, preemptions, node_pattern in git_url_titles_preemptions: + if url not in github_stats: + futures.append(executor.submit(renew_stat, url)) + + for future in concurrent.futures.as_completed(futures): + url_item = future.result() + if url_item is not None: + url, item = url_item + github_stats[url] = item + + # renew outdated cache + outdated_urls = [] + for k, v in github_stats.items(): + elapsed = (datetime.datetime.now().timestamp() - v['cached_time']) + if elapsed > 60*60*12: # 12 hours + outdated_urls.append(k) + + with concurrent.futures.ThreadPoolExecutor(11) as executor: + for url in outdated_urls: + futures.append(executor.submit(renew_stat, url)) + + for future in concurrent.futures.as_completed(futures): + url_item = future.result() + if url_item is not None: + url, item = url_item + github_stats[url] = item + + with open('github-stats-cache.json', 'w', encoding='utf-8') as file: + json.dump(github_stats, file, ensure_ascii=False, indent=4) + + with open(GITHUB_STATS_FILENAME, 'w', encoding='utf-8') as file: + for v in github_stats.values(): + if "cached_time" in v: + del v["cached_time"] + + github_stats = dict(sorted(github_stats.items())) + + json.dump(github_stats, file, ensure_ascii=False, indent=4) + + print(f"Successfully written to {GITHUB_STATS_FILENAME}.") + + if not skip_stat_update: + process_git_stats(git_url_titles_preemptions) + + with concurrent.futures.ThreadPoolExecutor(11) as executor: + for url, title, preemptions, node_pattern in git_url_titles_preemptions: + executor.submit(process_git_url_title, url, title, preemptions, node_pattern) + + py_url_titles_and_pattern = get_py_urls_from_json('custom-node-list.json') + + def download_and_store_info(url_title_preemptions_and_pattern): + url, title, preemptions, node_pattern = url_title_preemptions_and_pattern + name = os.path.basename(url) + if name.endswith(".py"): + node_info[name] = (url, title, preemptions, node_pattern) + + try: + download_url(url, temp_dir) + except: + print(f"[ERROR] Cannot download '{url}'") + + with concurrent.futures.ThreadPoolExecutor(10) as executor: + executor.map(download_and_store_info, py_url_titles_and_pattern) + + return node_info + + +def gen_json(node_info): + # scan from .py file + node_files, node_dirs = get_nodes(temp_dir) + + comfyui_path = os.path.abspath(os.path.join(temp_dir, "ComfyUI")) + node_dirs.remove(comfyui_path) + node_dirs = [comfyui_path] + node_dirs + + data = {} + for dirname in node_dirs: + py_files = get_py_file_paths(dirname) + metadata = {} + + nodes = set() + for py in py_files: + nodes_in_file, metadata_in_file = scan_in_file(py, dirname == "ComfyUI") + nodes.update(nodes_in_file) + metadata.update(metadata_in_file) + + dirname = os.path.basename(dirname) + + if 'Jovimetrix' in dirname: + pass + + if len(nodes) > 0 or (dirname in node_info and node_info[dirname][3] is not None): + nodes = list(nodes) + nodes.sort() + + if dirname in node_info: + git_url, title, preemptions, node_pattern = node_info[dirname] + + metadata['title_aux'] = title + + if preemptions is not None: + metadata['preemptions'] = preemptions + + if node_pattern is not None: + metadata['nodename_pattern'] = node_pattern + + data[git_url] = (nodes, metadata) + else: + print(f"WARN: {dirname} is removed from custom-node-list.json") + + for file in node_files: + nodes, metadata = scan_in_file(file) + + if len(nodes) > 0 or (dirname in node_info and node_info[dirname][3] is not None): + nodes = list(nodes) + nodes.sort() + + file = os.path.basename(file) + + if file in node_info: + url, title, preemptions, node_pattern = node_info[file] + metadata['title_aux'] = title + + if preemptions is not None: + metadata['preemptions'] = preemptions + + if node_pattern is not None: + metadata['nodename_pattern'] = node_pattern + + data[url] = (nodes, metadata) + else: + print(f"Missing info: {file}") + + # scan from node_list.json file + extensions = [name for name in os.listdir(temp_dir) if os.path.isdir(os.path.join(temp_dir, name))] + + for extension in extensions: + node_list_json_path = os.path.join(temp_dir, extension, 'node_list.json') + if os.path.exists(node_list_json_path): + git_url, title, preemptions, node_pattern = node_info[extension] + + with open(node_list_json_path, 'r', encoding='utf-8') as f: + try: + node_list_json = json.load(f) + except Exception as e: + print(f"\nERROR: Invalid json format '{node_list_json_path}'") + print("------------------------------------------------------") + print(e) + print("------------------------------------------------------") + + metadata_in_url = {} + if git_url not in data: + nodes = set() + else: + nodes_in_url, metadata_in_url = data[git_url] + nodes = set(nodes_in_url) + + for x, desc in node_list_json.items(): + nodes.add(x.strip()) + + metadata_in_url['title_aux'] = title + + if preemptions is not None: + metadata['preemptions'] = preemptions + + if node_pattern is not None: + metadata_in_url['nodename_pattern'] = node_pattern + + nodes = list(nodes) + nodes.sort() + data[git_url] = (nodes, metadata_in_url) + + json_path = f"extension-node-map.json" + with open(json_path, "w", encoding='utf-8') as file: + json.dump(data, file, indent=4, sort_keys=True) + + +print("### ComfyUI Manager Node Scanner ###") + +print("\n# Updating extensions\n") +updated_node_info = update_custom_nodes() + +print("\n# 'extension-node-map.json' file is generated.\n") +gen_json(updated_node_info) + +print("\nDONE.\n") \ No newline at end of file diff --git a/custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py b/custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py new file mode 100644 index 000000000..d5a70ed6d --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scripts/colab-dependencies.py @@ -0,0 +1,39 @@ +import os +import subprocess + + +def get_enabled_subdirectories_with_files(base_directory): + subdirs_with_files = [] + for subdir in os.listdir(base_directory): + try: + full_path = os.path.join(base_directory, subdir) + if os.path.isdir(full_path) and not subdir.endswith(".disabled") and not subdir.startswith('.') and subdir != '__pycache__': + print(f"## Install dependencies for '{subdir}'") + requirements_file = os.path.join(full_path, "requirements.txt") + install_script = os.path.join(full_path, "install.py") + + if os.path.exists(requirements_file) or os.path.exists(install_script): + subdirs_with_files.append((full_path, requirements_file, install_script)) + except Exception as e: + print(f"EXCEPTION During Dependencies INSTALL on '{subdir}':\n{e}") + + return subdirs_with_files + + +def install_requirements(requirements_file_path): + if os.path.exists(requirements_file_path): + subprocess.run(["pip", "install", "-r", requirements_file_path]) + + +def run_install_script(install_script_path): + if os.path.exists(install_script_path): + subprocess.run(["python", install_script_path]) + + +custom_nodes_directory = "custom_nodes" +subdirs_with_files = get_enabled_subdirectories_with_files(custom_nodes_directory) + + +for subdir, requirements_file, install_script in subdirs_with_files: + install_requirements(requirements_file) + run_install_script(install_script) diff --git a/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh new file mode 100644 index 000000000..fecf3d5bc --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-linux.sh @@ -0,0 +1,21 @@ +git clone https://github.com/comfyanonymous/ComfyUI +cd ComfyUI/custom_nodes +git clone https://github.com/ltdrdata/ComfyUI-Manager +cd .. +python -m venv venv +source venv/bin/activate +python -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121 +python -m pip install -r requirements.txt +python -m pip install -r custom_nodes/ComfyUI-Manager/requirements.txt +cd .. +echo "#!/bin/bash" > run_gpu.sh +echo "cd ComfyUI" >> run_gpu.sh +echo "source venv/bin/activate" >> run_gpu.sh +echo "python main.py --preview-method auto" >> run_gpu.sh +chmod +x run_gpu.sh + +echo "#!/bin/bash" > run_cpu.sh +echo "cd ComfyUI" >> run_cpu.sh +echo "source venv/bin/activate" >> run_cpu.sh +echo "python main.py --preview-method auto --cpu" >> run_cpu.sh +chmod +x run_cpu.sh diff --git a/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-win.bat b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-win.bat new file mode 100644 index 000000000..2789ef6db --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scripts/install-comfyui-venv-win.bat @@ -0,0 +1,17 @@ +git clone https://github.com/comfyanonymous/ComfyUI +cd ComfyUI/custom_nodes +git clone https://github.com/ltdrdata/ComfyUI-Manager +cd .. +python -m venv venv +call venv/Scripts/activate +python -m pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121 +python -m pip install -r requirements.txt +python -m pip install -r custom_nodes/ComfyUI-Manager/requirements.txt +cd .. +echo "cd ComfyUI" >> run_gpu.bat +echo "call venv/Scripts/activate" >> run_gpu.bat +echo "python main.py" >> run_gpu.bat + +echo "cd ComfyUI" >> run_cpu.bat +echo "call venv/Scripts/activate" >> run_cpu.bat +echo "python main.py --cpu" >> run_cpu.bat diff --git a/custom_nodes/ComfyUI-Manager/scripts/install-manager-for-portable-version.bat b/custom_nodes/ComfyUI-Manager/scripts/install-manager-for-portable-version.bat new file mode 100644 index 000000000..7b067dfd7 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scripts/install-manager-for-portable-version.bat @@ -0,0 +1,2 @@ +.\python_embeded\python.exe -s -m pip install gitpython +.\python_embeded\python.exe -c "import git; git.Repo.clone_from('https://github.com/ltdrdata/ComfyUI-Manager', './ComfyUI/custom_nodes/ComfyUI-Manager')" diff --git a/custom_nodes/ComfyUI-Manager/scripts/update-fix.py b/custom_nodes/ComfyUI-Manager/scripts/update-fix.py new file mode 100644 index 000000000..d2ac10074 --- /dev/null +++ b/custom_nodes/ComfyUI-Manager/scripts/update-fix.py @@ -0,0 +1,12 @@ +import git + +commit_hash = "a361cc1" + +repo = git.Repo('.') + +if repo.is_dirty(): + repo.git.stash() + +repo.git.update_ref("refs/remotes/origin/main", commit_hash) +repo.remotes.origin.fetch() +repo.git.pull("origin", "main") diff --git a/custom_nodes/ComfyUI-Manager/snapshots/the_snapshot_files_are_located_here b/custom_nodes/ComfyUI-Manager/snapshots/the_snapshot_files_are_located_here new file mode 100644 index 000000000..e69de29bb