Merge pull request #215 from jakechai/main

v2.3.1
This commit is contained in:
Jake Chai
2025-11-07 16:18:47 +08:00
committed by GitHub
73 changed files with 344 additions and 282 deletions
+179 -139
View File
@@ -186,7 +186,7 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
5. Add Wan Video ATI Trajectory ff2vid workflow.
6. Use bf16 Wan Video VAE by default for all Wan Video generation workflows.
7. Add Multi-GPU version of Flux Image Generation workflow.
- 2025-06-15 - v1.9.17 1. Find a workaround to recreate all of my original Group Nodes for `comfyui-frontend-package>=1.16.0`. [All Grp Nodes-JK](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/All%20Grp%20Nodes-JK.json) | [All Grp Nodes-JK_~frontend-1.15.13](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.15.13/All%20Grp%20Nodes-JK.json)
- 2025-06-15 - v1.9.17 1. Find a workaround to recreate all of my original Group Nodes for `comfyui-frontend-package>=1.16.0`. [All Grp Nodes-JK](Workflow/ComfyUI/All%20Grp%20Nodes-JK.json) | [All Grp Nodes-JK_~frontend-1.15.13](Workflow/ComfyUI_~frontend-1.15.13/All%20Grp%20Nodes-JK.json)
2. Seperate all workflows into two versions: `comfyui-frontend-package<=1.15.13` & `comfyui-frontend-package>=1.16.0`. Workflows for `comfyui-frontend-package<=1.15.13` are moved to the subfolder with a suffix name `~frontend-1.15.13`, such as `ComfyUI_~frontend-1.15.13` and `Krita_~frontend-1.15.13_v1.19.16`.
3. API workflows are separated into two versions: one for `ComfyUI-JakeUpgrade v1.9.16 or earlier`, the other for `ComfyUI-JakeUpgrade v1.9.17 or later`. API Workflows for `ComfyUI-JakeUpgrade v1.9.16 or earlier` are moved to the subfolder with a suffix name `~v1.9.16`, such as `ComfyUI_~frontend-1.15.13\API_~v1.9.16` and `Krita_~frontend-1.15.13_v1.19.16`.
4. Cleanup and rearrange the codes, and press Deprecated and Experimental to distinguish.
@@ -287,7 +287,7 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
</details>
- 2025-10-27 - v2.2.0
1. Re-write all nodes:
1. Re-write all nodes:
① Code Organization: Nodes are logically grouped by data type and functionality.
② Modular nodes loading control, including deprecated nodes.
③ Comments: All key functions and classes have detailed.
@@ -326,7 +326,10 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
1. Add Random Prompter Geek Node, more convenient random control.
2. Add ABC and non-ABC version of Random Prompter Nodes switch to config.ini.
3. Add Random Prompter config to config.ini.
4. Add more choices for Random Prompter Nodes with more refined and accurate categories
4. Add more choices for Random Prompter Nodes with more refined and accurate categories.
- 2025-11-07 - v2.3.1
1. Set SDXL Target Res node `DEPRECATED = True`.
## Installation
1. `git clone https://github.com/jakechai/ComfyUI-JakeUpgrade` into the `custom_nodes` folder
@@ -345,14 +348,14 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
## Copy files in the replacement folder(optional)
- [JakeUpgrade Subgraphs](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/replacement/subgraphs): Copy all the subgraph JSON files into `...\ComfyUI\user\default\subgraphs`.
- [JakeUpgrade Subgraphs](replacement/subgraphs): Copy all the subgraph JSON files into `...\ComfyUI\user\default\subgraphs`.
- [ComfyUI Manager](https://github.com/ltdrdata/ComfyUI-Manager) : Copy `_JK.pack` or `__JK_1_15_13.pack`(for `comfyui-frontend-package<=1.15.13`) to `...\ComfyUI\user\default\ComfyUI-Manager\components` for saving all JK Group Nodes within each workflow file.
- [IP Adapter Plus](https://github.com/cubiq/ComfyUI_IPAdapter_plus) : (Workaround before IPAdapter approves my pull request) Copy and replace files to `custom_nodes\ComfyUI_IPAdapter_plus` for better API workflow control by adding "None" selection.
> [!NOTE]
> - Subraphs can be used as custom nodes if you copy the JSON files to the `...\ComfyUI\user\default\subgraphs`.
> - Subraphs | Group Nodes can be copied and pasted between workflows in the ComfyUI. See details in my Video Introduction of Subraphs | Group Nodes.
> - For all JK Subraphs | Group Nodes, load [All Subgraphs-JK](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/All%20Subgraph-JK.json) | [All Subgraphs-WanVideoWrapper-JK](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/All%20Subgraph-Wan-JK.json) | [All Grp Nodes-JK_~frontend-1.23.4](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.23.4/All%20Grp%20Nodes-JK.json) | [All Grp Nodes-WanVideoWrapper-JK_~frontend-1.23.4](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.23.4/All%20Grp%20Nodes-Wan-JK.json) | [All Grp Nodes-JK_~frontend-1.15.13](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.15.13/All%20Grp%20Nodes-JK.json)
> - For all JK Subraphs | Group Nodes, load [All Subgraphs-JK](Workflow/ComfyUI/All%20Subgraph-JK.json) | [All Subgraphs-WanVideoWrapper-JK](Workflow/ComfyUI/All%20Subgraph-Wan-JK.json) | [All Grp Nodes-JK_~frontend-1.23.4](Workflow/ComfyUI_~frontend-1.23.4/All%20Grp%20Nodes-JK.json) | [All Grp Nodes-WanVideoWrapper-JK_~frontend-1.23.4](Workflow/ComfyUI_~frontend-1.23.4/All%20Grp%20Nodes-Wan-JK.json) | [All Grp Nodes-JK_~frontend-1.15.13](Workflow/ComfyUI_~frontend-1.15.13/All%20Grp%20Nodes-JK.json)
> - These replacement files cause the node conflict warning in the ComfyUI Manager. But don't worry, JakeUpgrade never loaded them.
## Update
@@ -458,27 +461,27 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
### ComfyUI
> [!NOTE]
> - ComfyUI frontend starts the [deprecation process of Group node](https://github.com/Comfy-Org/ComfyUI_frontend/issues/3441#issuecomment-2814386708) in v1.17.0 and depprecats group node totally in v1.24.0. If you update your ComfyUI to v0.3.49, Comfyui frontend v 1.24.4 will be installed, which will cause group node running error. At the meantime, they released the official version of [Subgraph](https://github.com/Comfy-Org/rfcs/blob/subgraph/rfcs/0000-subgraph.md), the replacement of Group Node. I've separated two versions of my group nodes as backup and memory: one is for `1.23.4>=comfyui-frontend-package>=1.16.0`, and the other is for `comfyui-frontend-package<=1.15.13` (1.15.12 is recommended). [All Grp Nodes-JK_~frontend-1.23.4](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.23.4/All%20Grp%20Nodes-JK.json) | [All Grp Nodes-JK_~frontend-1.15.13](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.15.13/All%20Grp%20Nodes-JK.json). If you want to use the workflows using Group Nodes especially the API workflow, downgrade your frontend to v1.23.4: `"...\python.exe" -m pip install comfyui-frontend-package==1.23.4` and choose ComfyUI v0.3.48(optional).
> - ComfyUI frontend starts the [deprecation process of Group node](https://github.com/Comfy-Org/ComfyUI_frontend/issues/3441#issuecomment-2814386708) in v1.17.0 and depprecats group node totally in v1.24.0. If you update your ComfyUI to v0.3.49, Comfyui frontend v 1.24.4 will be installed, which will cause group node running error. At the meantime, they released the official version of [Subgraph](https://github.com/Comfy-Org/rfcs/blob/subgraph/rfcs/0000-subgraph.md), the replacement of Group Node. I've separated two versions of my group nodes as backup and memory: one is for `1.23.4>=comfyui-frontend-package>=1.16.0`, and the other is for `comfyui-frontend-package<=1.15.13` (1.15.12 is recommended). [All Grp Nodes-JK_~frontend-1.23.4](Workflow/ComfyUI_~frontend-1.23.4/All%20Grp%20Nodes-JK.json) | [All Grp Nodes-JK_~frontend-1.15.13](Workflow/ComfyUI_~frontend-1.15.13/All%20Grp%20Nodes-JK.json). If you want to use the workflows using Group Nodes especially the API workflow, downgrade your frontend to v1.23.4: `"...\python.exe" -m pip install comfyui-frontend-package==1.23.4` and choose ComfyUI v0.3.48(optional).
> - ComfyUI frontend breaks the Impact-Pack Switch(Any) node. It is still functional, but can not be created. This issue has been fixed in the latest Impact-Pack version `>=v8.12`, but it only supports `comfyui-frontend-package>=1.16.9`. When using Group Nodes with `comfyui-frontend-package<=1.15.13`, it's recommended to switch Impact-Pack to `v8.8.1` in the ComfyUI Manager.
> - API workflows are separated into three versions: the first is for `ComfyUI-JakeUpgrade v1.9.16 or earlier`, the second is for `ComfyUI-JakeUpgrade v1.9.17~v1.9.20`, the third is for `ComfyUI-JakeUpgrade v2.0.0 or later`. When editing the first one, it is recommended to switch to `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` and `comfyui-frontend-package<=1.15.13`.
> - You need `comfyui-frontend-package>=1.24.0` to use the latest workflows using Subgraph.
> - ComfyUI API workflows are workflows created to allow other software to call ComfyUI, which include non-dev editable workflows and dev-for-call workflows, as well as python files with supporting parameters.
> - Installing a separate version of ComfyUI to work with 3D Pack is recommended.
> - You need `comfyui-frontend-package<=1.23.4` to run [ComfyUI Main & Module workflows using Group Nodes](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.23.4).
> - You need `comfyui-frontend-package<=1.15.13` and `Impact Pact<=v8.8.1` to run [legacy ComfyUI Main & Module workflows using Group Nodes](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.15.13).
> - You need `1.9.16<=ComfyUI-JakeUpgrade<=1.9.20` to run [legacy ComfyUI API dev workflows](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.23.4/API_~v1.9.20).
> - You need `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` to run [legacy ComfyUI API dev workflows](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI_~frontend-1.15.13/API_~v1.9.16).
> - You need `comfyui-frontend-package<=1.23.4` to run [ComfyUI Main & Module workflows using Group Nodes](Workflow/ComfyUI_~frontend-1.23.4).
> - You need `comfyui-frontend-package<=1.15.13` and `Impact Pact<=v8.8.1` to run [legacy ComfyUI Main & Module workflows using Group Nodes](Workflow/ComfyUI_~frontend-1.15.13).
> - You need `1.9.16<=ComfyUI-JakeUpgrade<=1.9.20` to run [legacy ComfyUI API dev workflows](Workflow/ComfyUI_~frontend-1.23.4/API_~v1.9.20).
> - You need `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` to run [legacy ComfyUI API dev workflows](Workflow/ComfyUI_~frontend-1.15.13/API_~v1.9.16).
> - You need Wan Video Wrapper v1.1.8 to run Wan__Long_v1.1.8 workflows.
- [Main](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/Main)
- [Module](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/Module)
- [API](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/API)
- [API dev & params](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/ComfyUI/API/dev)
- [Main](Workflow/ComfyUI/Main)
- [Module](Workflow/ComfyUI/Module)
- [API](Workflow/ComfyUI/API)
- [API dev & params](Workflow/ComfyUI/API/dev)
- Wan2.1 Video Generation Workflows breakdown
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/VidGen-Wan2.1.png)
![image](imgs/VidGen-Wan2.1.png)
- Wan2.2 Video Generation Workflows breakdown
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/VidGen-Wan2.2.png)
![image](imgs/VidGen-Wan2.2.png)
### Krita
@@ -489,15 +492,15 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
> - Sync version of Krita workflows can be opened by ComyUI and synchronized with Krita AI Diffusion.
> - You need `comfyui-frontend-package>=1.24.0` to use the latest Krita Sync workflows using Subgraph.
> - Dev version of Krita workflows can only loaded by Krita AI Diffusion and should be moved to `...\AppData\Roaming\krita\ai_diffusion\workflows`.
> - You need `comfyui-frontend-package<=1.15.13` and `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` to run [legacy Krita sync workflows](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/Krita_~frontend-1.15.13_v1.19.16).
> - You need `comfyui-frontend-package<=1.23.4` and `1.9.16<=ComfyUI-JakeUpgrade<=1.9.20` to run [legacy Krita sync workflows](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/Krita_~frontend-1.23.4_v1.19.20).
> - You need `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` to run [legacy Krita dev workflows](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/replacement/krita/ai_diffusion/workflows_~v1.9.16).
> - You need `1.9.16<=ComfyUI-JakeUpgrade<=1.9.20` to run [legacy Krita dev workflows](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/replacement/krita/ai_diffusion/workflows_~v1.9.20).
> - You need `comfyui-frontend-package<=1.15.13` and `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` to run [legacy Krita sync workflows](Workflow/Krita_~frontend-1.15.13_v1.19.16).
> - You need `comfyui-frontend-package<=1.23.4` and `1.9.16<=ComfyUI-JakeUpgrade<=1.9.20` to run [legacy Krita sync workflows](Workflow/Krita_~frontend-1.23.4_v1.19.20).
> - You need `1.9.5<=ComfyUI-JakeUpgrade<=1.9.16` to run [legacy Krita dev workflows](replacement/krita/ai_diffusion/workflows_~v1.9.16).
> - You need `1.9.16<=ComfyUI-JakeUpgrade<=1.9.20` to run [legacy Krita dev workflows](replacement/krita/ai_diffusion/workflows_~v1.9.20).
- [Main Sync](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/Krita/Main)
- [Module Sync](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/Krita/Module)
- [SAI Sync](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/Workflow/Krita/SAI)
- [Main & Module & SAI dev](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/replacement/krita/ai_diffusion/workflows)
- [Main Sync](Workflow/Krita/Main)
- [Module Sync](Workflow/Krita/Module)
- [SAI Sync](Workflow/Krita/SAI)
- [Main & Module & SAI dev](replacement/krita/ai_diffusion/workflows)
## Required Custom Nodes
@@ -602,19 +605,19 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
<details>
<summary><b>Explanation</b></summary>
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/img2mesh-types.png)
![image](imgs/img2mesh-types.png)
- Workflow breakdown: img2mesh types
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/img2mesh_CRM&Zero123plus&MVDream&CharacterGen-structure.png)
![image](imgs/img2mesh_CRM&Zero123plus&MVDream&CharacterGen-structure.png)
- Workflow breakdown: CRM&Zero123plus&MVDream&CharacterGen
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/img2mesh_Unique3D&Wonder3D&Era3D-structure.png)
![image](imgs/img2mesh_Unique3D&Wonder3D&Era3D-structure.png)
- Workflow breakdown: JUnique3D&Wonder3D&Era3D
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/img2mesh_Zero123&SV3D-structure.png)
![image](imgs/img2mesh_Zero123&SV3D-structure.png)
- Workflow breakdown: Zero123&SV3D
![image](https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/img2mesh_3DGS-structure.png)
![image](imgs/img2mesh_3DGS-structure.png)
- Workflow breakdown: 3DGS
</details>
@@ -623,115 +626,152 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
<details>
<summary><b>Custom Nodes</b></summary>
Misc Nodes
Project Setting JK🐉
Ksampler Parameters Default JK🐉
Ksampler Adv Parameters Default JK🐉
Base Model Parameters SD3API JK🐉
Aspect Ratio JK🐉
Tiling Mode JK🐉
Empty Latent Color JK🐉
SDXL Target Res JK🐉
Get Size JK🐉
String To Combo JK🐉
Remove Input JK🐉
Image Resize Mode JK🐉
Sampler Loader JK🐉
Image Crop by Mask Resolution Grp JK🐉
Image Crop by Mask Params JK🐉
Upscale Method JK🐉
Latent Crop Offset JK🐉
Scale To Resolution JK🐉
Inject Noise Params JK🐉
SD3 Prompts Switch JK🐉
Guidance Default JK🐉
Save String List To JSON JK🐉
Load String List From JSON JK🐉
Create Loop Schedule List JK🐉
Get Nth String JK🐉
Wan Frame Count JK🐉
Wan22 cfg Scheduler List JK🐉
Wan Wrapper Sampler Default JK🐉
Audio Nodes
Audio Cuts JK🐉
Cut Audio JK🐉
Cut Audio Index JK🐉
Cut Audio Cuts JK🐉
Cut Audio Loop JK🐉
ControlNet Nodes
ControlNet Loader JK🐉
Multi-ControlNet Param Stack JK🐉
Apply ControlNet JK🐉
Apply Multi-ControlNet Adv JK🐉
LoRA Nodes
LoRA Stack JK🐉
Apply LoRA Stack JK🐉
LoRA Stack Model Only JK🐉
Apply LoRA Stack Model Only JK🐉
Image Nodes
Rough Outline JK🐉
Open+DW Pose JK🐉
Make Image Grid JK🐉
Split Image Grid JK🐉
Image Remove Alpha JK🐉
Color Grading JK🐉
Enchance And Resize Hint Images JK🐉
Mask Nodes
Is Mask Empty JK🐉
Logic switches Nodes
Boolean JK🐉
Image Input Switch JK🐉
Mask Input Switch JK🐉
Int Input Switch JK🐉
Float Input Switch JK🐉
Latent Input Switch JK🐉
Conditioning Input Switch JK🐉
Clip Input Switch JK🐉
Model Input Switch JK🐉
ControlNet Input Switch JK🐉
ControlNet Stack Input Switch JK🐉
Text Input Switch JK🐉
VAE Input Switch JK🐉
Noise Input Switch JK🐉
Guider Input Switch JK🐉
Sampler Input Switch JK🐉
Sigmas Input Switch JK🐉
Mesh Input Switch JK🐉
Ply Input Switch JK🐉
Orbit Pose Input Switch JK🐉
TriMesh Input Switch JK🐉
ComfyMath Nodes
BoolToInt JK🐉
IntToBool JK🐉
FloatToInt JK🐉
IntToFloat JK🐉
BoolUnaryOp JK🐉
BoolBinaryOp JK🐉
Bool And JK🐉
Bool OR JK🐉
StringBinaryCon JK🐉
Prompt Combine JK🐉
FloatUnaryCon JK🐉
FloatBinaryCon JK🐉
FloatUnaryOp JK🐉
FloatBinaryOp JK🐉
IntUnaryCon JK🐉
IntBinaryCon JK🐉
IntUnaryOp JK🐉
IntBinaryOp JK🐉
IntSubOp JK🐉
Evaluate Ints JK🐉
Evaluate Floats JK🐉
Evaluate String JK🐉
Evaluate Examples JK🐉
3D Nodes
Orbit Poses JK🐉
OrbitLists to OrbitPoses JK🐉
OrbitPoses to OrbitLists JK🐉
Get OrbitPoses From List JK🐉
Hy3D Cam Config 20to21 JK🐉
Experimental
Random Beats JK🐉
- 3D Nodes
![image](imgs/nodes/3D/Orbit%20Poses%20JK.png)
Orbit Poses JK🐉: Generate 3D camera track pose configurations, supporting multiple preset and custom parameters.
![image](imgs/nodes/3D/Orbit%20Lists%20to%20Orbit%20Poses%20JK.png)
Orbit Lists to Orbit Poses JK🐉: Convert track list format to camera pose format.
![image](imgs/nodes/3D/Orbit%20Poses%20to%20Orbit%Lists%20JK.png)
Orbit Poses to Orbit Lists JK🐉: Convert camera pose format to track list format.
![image](imgs/nodes/3D/Get%20Orbit%20Poses%20From%20List%20JK.png)
Get Orbit Poses From List JK🐉:Select a specific pose by index from a list of camera poses.
- Audio Nodes
![image](imgs/nodes/Audio/Scene%20Cuts%20JK.png)
Scene Cuts JK🐉: Create scene cuts based on multiple cut point times or durations and an optional audio duration.
![image](imgs/nodes/Audio/Cut%20Audio%20JK.png)
Cut Audio JK🐉: Cut an audio file based on start and end time.
![image](imgs/nodes/Audio/Cut%20Audio%20Index JK.png)
Cut Audio Index JK🐉: Cut an audio file based on scene cuts metadata and cut index.
![image](imgs/nodes/Audio/Cut%20Audio%20Cuts%20JK.png)
Cut Audio Cuts JK🐉: Merge all cuts from scene_cuts into a single audio file in chronological order.
![image](imgs/nodes/Audio/Cut%20Audio%20Loop%20JK.png)
Cut Audio Loop JK🐉: Cut an audio file based on loop metadata and cut index.
- Video Nodes
![image](imgs/nodes/Video/Create%20Loop%20Schedule%20List%20JK.png)
Create Loop Schedule List JK🐉: Generate a sequential integer list for animation loop scheduling.
![image](imgs/nodes/Video/Wan%20Frame%20Count%20JK.png)
Wan Frame Count JK🐉: Calculate WAN-compatible frame count by rounding up to nearest multiple of 4 plus 1.
![image](imgs/nodes/Video/Wan22%20cfg%20Scheduler%20List%20JK.png)
Wan22 cfg Scheduler List JK🐉: Generate CFG scheduler list with initial and subsequent values for WAN 2.2.
![image](imgs/nodes/Video/Wan%20Wrapper%20Sampler%20Default%20JK.png)
Wan Wrapper Sampler Default JK🐉: Provide default sampler settings for WAN wrapper including scheduler and rope function.
- Prompt Nodes
![image](imgs/nodes/Prompt/Random%20Prompter%20JK.png)
Random Prompter JK🐉: Random prompt generator with categorized options for scene, motion, facial actions, expressions, lighting, camera, style, and description. Supports manual selection, random generation, and image reference integration for comprehensive prompt creation.
![image](imgs/nodes/Prompt/Random%20Prompter%20Geek%20JK.png)
Random Prompter Geek JK🐉: Random Prompter Geek version: Build prompts using category tags that are replaced with random content at runtime. Supports manual category selection and automatic tag insertion.
![image](imgs/nodes/Prompt/Prompt%20Combine%20JK.png)
Prompt Combine JK🐉: Merge the two strings into one and clean up the result.
- ControlNet Nodes
![image](imgs/nodes/ControlNet/ControlNet%20Loader%20JK.png)
ControlNet Loader JK🐉: Load ControlNet models with configurable union types.
![image](imgs/nodes/ControlNet/Multi-ControlNet%20Param%20Stack%20JK.png)
Multi-ControlNet Param Stack JK🐉: Stack multiple ControlNet parameters for complex control scenarios.
![image](imgs/nodes/ControlNet/Apply%20ControlNet%20JK.png)
Apply ControlNet JK🐉: Apply single ControlNet to conditioning with mask support.
![image](imgs/nodes/ControlNet/Apply%20Multi-ControlNet%20Adv%20JK.png)
Apply Multi-ControlNet%20Adv%20JK🐉: Apply multiple ControlNets from stack to conditioning.
- LoRA Nodes
![image](imgs/nodes/LoRA/LoRA%20Stack%20JK.png)
LoRA Stack JK🐉: Stack multiple LoRA models with prompt and metadata generation.
![image](imgs/nodes/LoRA/Apply%20LoRA%20Stack%20JK.png)
Apply LoRA Stack JK🐉: Apply multiple LoRA models from stack to both model and CLIP.
![image](imgs/nodes/LoRA/LoRA%20Stack%20Model%20Only%20JK.png)
LoRA Stack Model Only JK🐉: Stack LoRA models for model-only application.
![image](imgs/nodes/LoRA/Apply%20LoRA%20Stack%20Model%20Only%20JK.png)
Apply LoRA Stack Model Only JK🐉: Apply multiple LoRA models from stack to model only.
- Image Nodes
![image](imgs/nodes/Image/Rough%20Outline%20JK.png)
Rough Outline JK🐉: Extract rough outlines from images using Canny edge detection and contour processing.
![image](imgs/nodes/Image/Open+DW%20Pose%20JK.png)
Open+DW Pose JK🐉: Combine DWPose and OpenPose images by removing and reserving specific colors.
![image](imgs/nodes/Image/Make%20Image%20Grid%20JK.png)
Make Image Grid JK🐉: Create image grid from multiple images with specified rows or columns.
![image](imgs/nodes/Image/Split%20Image%20Grid%20JK.png)
Split Image Grid JK🐉: Split image grid into individual images based on rows or columns.
![image](imgs/nodes/Image/Image%20Remove%20Alpha%20JK.png)
Image Remove Alpha JK🐉: Remove alpha channel from RGBA images and convert to RGB.
![image](imgs/nodes/Image/Color%20Grading%20JK.png)
Color Grading JK🐉: Apply color grading with brightness, contrast, saturation and RGB channel adjustments.
![image](imgs/nodes/Image/Image%20Crop%20by%20Mask%20Resolution%20Grp%20JK.png)
Image Crop by Mask Resolution Grp JK🐉: Calculate crop parameters based on mask with various resolution options.
![image](imgs/nodes/Image/Image%20Crop%20by%20Mask%20Params%20JK.png)
Image Crop by Mask Params JK🐉: Provide crop parameters for mask-based image cropping operations.
![image](imgs/nodes/Image/Scale%20To%20Resolution%20JK.png)
Scale To Resolution JK🐉: Scale image to target resolution based on width, height or megapixel constraints.
![image](imgs/nodes/Image/Enchance%20And%20Resize%20Hint%20Images%20JK.png)
Enchance And Resize Hint Images JK🐉: Enhance hint images with high quality resizing, edge processing and multiple resize modes.
- Mask Nodes
![image](imgs/nodes/Mask/Is%20Mask%20Empty%20JK.png)
Is Mask Empty JK🐉: Check if mask is completely empty (contains only zeros).
- Math Nodes
![image](imgs/nodes/Math/Math%20Nodes-Conversion.png)
Conversion nodes: BoolToInt JK🐉 | IntToBool JK🐉 | FloatToInt JK🐉 | IntToFloat JK🐉
![image](imgs/nodes/Math/Math%20Nodes-Bool.png)
Boolean Math nodes: BoolUnaryOp JK🐉 | BoolBinaryOp JK🐉 | Bool And JK🐉 | Bool OR JK🐉
![image](imgs/nodes/Math/Math%20Nodes-String.png)
String Math Node: StringBinaryCon JK🐉
![image](imgs/nodes/Math/Math%20Nodes_Float.png)
Float Math Nodes: FloatUnaryCon JK🐉 | FloatBinaryCon JK🐉 | FloatUnaryOp JK🐉 | FloatBinaryOp JK🐉
![image](imgs/nodes/Math/Math%20Nodes-Int.png)
Int Math Nodes: IntUnaryCon JK🐉 | IntBinaryCon JK🐉 | IntUnaryOp JK🐉 | IntBinaryOp JK🐉 | IntSubOp JK🐉
![image](imgs/nodes/Math/Math%20Nodes-Evaluate.png)
Evaluate Nodes: Evaluate Ints JK🐉 | Evaluate Floats JK🐉 | Evaluate String JK🐉 | Evaluate Examples JK🐉
- Misc Nodes
![image](imgs/nodes/Misc/Project%20Setting%20JK.png)
Project Setting JK🐉: Project settings for workflow organization with customizable naming patterns.
![image](imgs/nodes/Misc/Ksampler%20Parameters%20Default%20JK.png)
Ksampler Parameters Default JK🐉: Default parameters for KSampler (steps, CFG scale, denoise strength).
![image](imgs/nodes/Misc/Ksampler%20Adv%20Parameters%20Default%20JK.png)
Ksampler Adv Parameters Default JK🐉: Advanced KSampler parameters for step control and scheduling.
![image](imgs/nodes/Misc/Inject%20Noise%20Params%20JK.png)
Inject Noise Params JK🐉: Parameters for noise injection with seed and strength control.
![image](imgs/nodes/Misc/SD3%20Prompts%20Switch%20JK.png)
SD3 Prompts Switch JK🐉: Switch between different prompt types for SD3 (CLIP-L, CLIP-G, T5-XXL).
![image](imgs/nodes/Misc/Guidance%20Default%20JK.png)
Guidance Default JK🐉: Default guidance scale value for model conditioning.
![image](imgs/nodes/Misc/Image%20Resize%20Mode%20JK.png)
Image Resize Mode JK🐉: Image resize mode selection for various resizing strategies.
![image](imgs/nodes/Misc/Sampler%20Loader%20JK.png)
Sampler Loader JK🐉: Sampler and scheduler selection with name output.
![image](imgs/nodes/Misc/Upscale%20Method%20JK🐉 .png)
Upscale Method JK🐉: Upscale method selection for images and latents.
![image](imgs/nodes/Misc/Aspect%20Ratio%20JK🐉 .png)
Aspect Ratio JK🐉: Aspect ratio selector for various model types with custom resolution support.
![image](imgs/nodes/Misc/String%20To%20Combo%20JK.png)
String To Combo JK🐉: Convert comma-separated string to combo selection (first item).
![image](imgs/nodes/Misc/Get%20Nth%20String%20JK.png)
Get Nth String JK🐉: Get nth item from comma-separated string list with type conversion.
![image](imgs/nodes/Misc/Save%20String%20List%20To%20JSON%20JK.png)
Save String List To JSON JK🐉: Save string data to JSON file with overwrite control and directory creation.
![image](imgs/nodes/Misc/Load%20String%20List%20From%20JSON JK.png)
Load String List From JSON JK🐉: Load string data from JSON file with caching and force reload options.
![image](imgs/nodes/Misc/Tiling%20Mode%20JK.png)
Tiling Mode JK🐉: Tiling mode selection for image generation.
- Switch Nodes
![image](imgs/nodes/Swotcj/Switch%20Nodes.png)
Boolean JK🐉
Image Input Switch JK🐉
Mask Input Switch JK🐉
Int Input Switch JK🐉
Float Input Switch JK🐉
Latent Input Switch JK🐉
Conditioning Input Switch JK🐉
Clip Input Switch JK🐉
Model Input Switch JK🐉
ControlNet Input Switch JK🐉
ControlNet Stack Input Switch JK🐉
Text Input Switch JK🐉
VAE Input Switch JK🐉
Noise Input Switch JK🐉
Guider Input Switch JK🐉
Sampler Input Switch JK🐉
Sigmas Input Switch JK🐉
Mesh Input Switch JK🐉
Ply Input Switch JK🐉
Orbit Pose Input Switch JK🐉
TriMesh Input Switch JK🐉
</details>
<details>
@@ -889,7 +929,7 @@ If you like what I share, please support me with [PayPal](https://paypal.me/jake
Here's my other product [UI for ComfyUI API](https://chaikefu.gumroad.com/l/ComfyAPIUI) using my ComfyUI API workflow.
Please check the [video](https://youtu.be/eyjy10T201M).
<a href="https://youtu.be/eyjy10T201M" target="_blank">
<img src="https://github.com/jakechai/ComfyUI-JakeUpgrade/blob/master/imgs/ComfyUIAPIUI.png" alt="UI for ComfyUI API" />
<img src="imgs/ComfyUIAPIUI.png" alt="UI for ComfyUI API" />
</a>
## Reference Custom Nodes
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -343,7 +343,6 @@ def create_node_mappings() -> Dict[str, Type[Any]]:
"Sampler Loader JK": lambda: global_symbols.get("SamplerLoader_JK"),
"Upscale Method JK": lambda: global_symbols.get("UpscaleMethod_JK"),
"CR Aspect Ratio JK": lambda: global_symbols.get("CR_AspectRatio_JK"),
"SDXL Target Res JK": lambda: global_symbols.get("SDXL_TargetRes_JK"),
"String To Combo JK": lambda: global_symbols.get("StringToCombo_JK"),
"Get Nth String JK": lambda: global_symbols.get("GetNthString_JK"),
"Save String List To JSON JK": lambda: global_symbols.get("SaveStringListToJSON_JK"),
@@ -483,6 +482,7 @@ def create_deprecated_node_mappings() -> Dict[str, Type[Any]]:
"CR SD1.5 Aspect Ratio JK": CR_AspectRatioSD15_JK,
"CR SDXL Aspect Ratio JK": CR_AspectRatioSDXL_JK,
"CR SD3 Aspect Ratio JK": CR_AspectRatioSD3_JK,
"SDXL Target Res JK": SDXL_TargetRes_JK,
### Pipe Nodes [Deprecated]
"Pipe End JK": PipeEnd_JK,
"NodesState JK": NodesState_JK,
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

+1 -1
View File
@@ -521,7 +521,7 @@ class CutAudioLoop_JK:
RETURN_NAMES = ("audio", "duration", "start", "end")
FUNCTION = "process"
CATEGORY = icons.get("JK/Audio")
DESCRIPTION = "Cut an audio file based on start and end time."
DESCRIPTION = "Cut an audio file based on loop metadata and cut index."
OUTPUT_NODE = False
def process(self, audio: Dict[str, Any], fps: int, segment_frame_count: int,
+4 -4
View File
@@ -30,7 +30,7 @@ class CR_ControlNetLoader_JK:
RETURN_TYPES = ("CONTROL_NET",)
FUNCTION = "load_controlnet"
CATEGORY = icons.get("JK/ControlNet")
DESCRIPTION = "Load ControlNet models with configurable union types"
DESCRIPTION = "Load ControlNet models with configurable union types."
def load_controlnet(self, control_net_name, union_type):
"""加载ControlNet模型,支持union类型配置"""
@@ -120,7 +120,7 @@ class CR_ControlNetParamStack_JK:
RETURN_NAMES = ("CONTROLNET_STACK", "ContrlNet_Switch", "ContrlNet0_Switch", "ContrlNet1_Switch", "ContrlNet2_Switch", "ContrlNet3_Switch", "ContrlNet4_Switch", "ContrlNet5_Switch")
FUNCTION = "controlnet_stacker"
CATEGORY = icons.get("JK/ControlNet")
DESCRIPTION = "Stack multiple ControlNet parameters for complex control scenarios"
DESCRIPTION = "Stack multiple ControlNet parameters for complex control scenarios."
def controlnet_stacker(self, control_switch, **kwargs):
"""堆叠多个ControlNet参数,支持复杂的多ControlNet配置"""
@@ -201,7 +201,7 @@ class CR_ApplyControlNet_JK:
RETURN_NAMES = ("base_pos", "base_neg", )
FUNCTION = "apply_controlnet"
CATEGORY = icons.get("JK/ControlNet")
DESCRIPTION = "Apply single ControlNet to conditioning with mask support"
DESCRIPTION = "Apply single ControlNet to conditioning with mask support."
def apply_controlnet(self, base_positive, base_negative, effective_mask, strength, start_percent, end_percent,
image=None, vae=None, mask=None, control_net=None):
@@ -284,7 +284,7 @@ class CR_ApplyControlNetStackAdv_JK:
RETURN_NAMES = ("base_pos", "base_neg", )
FUNCTION = "apply_controlnet_stack"
CATEGORY = icons.get("JK/ControlNet")
DESCRIPTION = "Apply multiple ControlNets from stack to conditioning"
DESCRIPTION = "Apply multiple ControlNets from stack to conditioning."
def apply_controlnet_stack(self, base_positive, base_negative, effective_mask, vae=None, mask=None, controlnet_stack=None):
"""应用堆叠的多个ControlNet到条件输入"""
+39
View File
@@ -122,6 +122,45 @@ class CR_AspectRatioSD3_JK:
width, height = get_sd3_resolution(aspect_ratio)
return (aspect_ratio, width, height)
class SDXL_TargetRes_JK:
"""Target resolution calculator for SDXL with scaling support"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"width": ("INT", {
"default": 1024,
"tooltip": "Original width to scale from"
}),
"height": ("INT", {
"default": 1024,
"tooltip": "Original height to scale from"
}),
"target_res_scale": ("FLOAT", {
"default": 1.0,
"min": 0.01,
"max": 16.0,
"step": 0.01,
"tooltip": "Scale factor for target resolution"
}),
},
}
RETURN_TYPES = ("INT", "INT")
RETURN_NAMES = ("target_width", "target_height")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Target resolution calculator for SDXL with scaling support"
DEPRECATED = True
def get_value(self, width: int, height: int, target_res_scale: float) -> Tuple[int, int]:
"""Calculate target resolution with scaling and multiple-of-8 alignment"""
target_width = multiple_of_int(width * target_res_scale, 8)
target_height = multiple_of_int(height * target_res_scale, 8)
return (target_width, target_height)
#---------------------------------------------------------------------------------------------------------------------#
# Deprecated Image Processing Nodes
#---------------------------------------------------------------------------------------------------------------------#
+12 -11
View File
@@ -39,7 +39,7 @@ class RoughOutline_JK:
RETURN_NAMES = ("outline_image", "overlay_image", "canny_image")
FUNCTION = "rough_outline"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Extract rough outlines from images using Canny edge detection and contour processing"
DESCRIPTION = "Extract rough outlines from images using Canny edge detection and contour processing."
def rough_outline(self, images, blur_size, canny_low, canny_high, simplify_mode, simplify_tolerance, morph_kernel, thickness):
"""
@@ -167,7 +167,7 @@ class OpenDWPose_JK:
RETURN_NAMES = ("pose_image",)
FUNCTION = "add_images"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Combine DWPose and OpenPose images by removing and reserving specific colors"
DESCRIPTION = "Combine DWPose and OpenPose images by removing and reserving specific colors."
def hex_to_rgb(self, hex_color):
"""Convert hex color to RGB values"""
@@ -263,7 +263,7 @@ class MakeImageGrid_JK:
RETURN_NAMES = ("image_grid",)
FUNCTION = "make_image_grid"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Create image grid from multiple images with specified rows or columns"
DESCRIPTION = "Create image grid from multiple images with specified rows or columns."
def make_image_grid(self, images, grid_side_num, grid_side):
"""Create image grid from batch of images"""
@@ -305,7 +305,7 @@ class SplitImageGrid_JK:
RETURN_NAMES = ("images",)
FUNCTION = "split_image_grid"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Split image grid into individual images based on rows or columns"
DESCRIPTION = "Split image grid into individual images based on rows or columns."
def split_image_grid(self, image, grid_side_num, grid_side, crop_excess=True):
"""Split image grid into multiple images"""
@@ -353,7 +353,7 @@ class ImageRemoveAlpha_JK:
RETURN_NAMES = ("RGB_image",)
FUNCTION = "image_remove_alpha"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Remove alpha channel from RGBA images and convert to RGB"
DESCRIPTION = "Remove alpha channel from RGBA images and convert to RGB."
def image_remove_alpha(self, RGBA_image):
"""Convert RGBA images to RGB by removing alpha channel"""
@@ -386,7 +386,7 @@ class ColorGrading_JK:
RETURN_NAMES = ("IMAGE",)
FUNCTION = "color_grading"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Apply color grading with brightness, contrast, saturation and RGB channel adjustments"
DESCRIPTION = "Apply color grading with brightness, contrast, saturation and RGB channel adjustments."
def color_grading(self, image, brightness, contrast, saturation, R, G, B):
"""Apply color grading adjustments to images"""
@@ -448,7 +448,8 @@ class GetSize_JK:
RETURN_NAMES = ("width", "height")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Get width and height dimensions from image, latent, or mask input"
DESCRIPTION = "Get width and height dimensions from image, latent, or mask input."
DEPRECATED = True
def get_value(self, image: torch.Tensor = None, latent: Dict = None, mask: torch.Tensor = None) -> Tuple[int, int]:
"""Get dimensions from input (image, latent, or mask)"""
@@ -540,7 +541,7 @@ class ImageCropByMaskResolutionGrp_JK:
RETURN_NAMES = ("crop_width", "crop_height", "offset_x", "offset_y", "target_width", "target_height")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Calculate crop parameters based on mask with various resolution options"
DESCRIPTION = "Calculate crop parameters based on mask with various resolution options."
def get_value(self, mask: torch.Tensor, padding: int, use_image_res: bool, use_target_mega_pixel: bool,
target_mega_pixel: float, use_target_res: bool, target_res: int,
@@ -610,7 +611,7 @@ class ImageCropByMaskParams_JK:
RETURN_NAMES = ("inpaint_crop_and_stitch", "padding", "use_image_res", "use_target_res", "target_res", "use_target_mega_pixel", "target_mega_pixel")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Provide crop parameters for mask-based image cropping operations"
DESCRIPTION = "Provide crop parameters for mask-based image cropping operations."
def get_value(self, inpaint_crop_and_stitch, padding, use_image_res, use_target_res, target_res, use_target_mega_pixel, target_mega_pixel):
"""Pass through crop parameters"""
@@ -640,7 +641,7 @@ class ScaleToResolution_JK:
RETURN_NAMES = ("target_width", "target_height")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Image")
DESCRIPTION = "Scale image to target resolution based on width, height or megapixel constraints"
DESCRIPTION = "Scale image to target resolution based on width, height or megapixel constraints."
def get_value(self, direction, target_resolution, use_target_mega_pixel, target_mega_pixel, multiple_of, image=None, latent=None):
"""Calculate target dimensions for scaling"""
@@ -806,7 +807,7 @@ class HintImageEnchance_JK:
RETURN_NAMES = ("IMAGE", "METADATA", "MODE")
FUNCTION = "execute"
CATEGORY = "🐉 JK/🛩️ Image"
DESCRIPTION = "Enhance hint images with high quality resizing, edge processing and multiple resize modes"
DESCRIPTION = "Enhance hint images with high quality resizing, edge processing and multiple resize modes."
def execute(self, hint_image, image_gen_width, image_gen_height, resize_mode):
"""Process hint images with high quality enhancement"""
+2 -1
View File
@@ -20,13 +20,13 @@ class EmptyLatentColor_JK:
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Latent")
DESCRIPTION = "Provide empty latent colors for different model types (SD15, SDXL, SD3, FLUX)"
DEPRECATED = True
def get_value(self) -> Tuple[int, int, int, int]:
"""Get empty latent colors for different model types"""
# Return predefined color values for different model types
return (8548961, 9077127, 9214099, 8618319)
class LatentCropOffset_JK:
"""Calculate latent space offset from image space offset for cropping operations"""
@@ -43,6 +43,7 @@ class LatentCropOffset_JK:
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Latent")
DESCRIPTION = "Calculate latent space offset from image space offset for cropping operations"
DEPRECATED = True
def get_value(self, image_offset=0):
"""Convert image offset to latent offset (adding 8 for alignment)"""
+4 -4
View File
@@ -71,7 +71,7 @@ class CR_LoRAStack_JK:
RETURN_NAMES = ("LORA_STACK", "LORA_PROMPT", "LORA_MetaData",)
FUNCTION = "lora_stacker"
CATEGORY = icons.get("JK/LoRA")
DESCRIPTION = "Stack multiple LoRA models with prompt and metadata generation"
DESCRIPTION = "Stack multiple LoRA models with prompt and metadata generation."
def lora_stacker(self, input_mode, save_hash, lora_stack=None, lora_prompt=None, lora_metadata=None, **kwargs):
"""堆叠多个LoRA模型,生成提示词和元数据"""
@@ -163,7 +163,7 @@ class CR_ApplyLoRAStack_JK:
RETURN_NAMES = ("MODEL", "CLIP",)
FUNCTION = "apply_lora_stack"
CATEGORY = icons.get("JK/LoRA")
DESCRIPTION = "Apply multiple LoRA models from stack to both model and CLIP"
DESCRIPTION = "Apply multiple LoRA models from stack to both model and CLIP."
def apply_lora_stack(self, model, clip, lora_stack=None):
"""应用堆叠的LoRA模型到模型和CLIP"""
@@ -229,7 +229,7 @@ class CR_LoRAStack_ModelOnly_JK:
RETURN_NAMES = ("LORA_STACK",)
FUNCTION = "lora_stacker"
CATEGORY = icons.get("JK/LoRA")
DESCRIPTION = "Stack LoRA models for model-only application"
DESCRIPTION = "Stack LoRA models for model-only application."
def lora_stacker(self, lora_stack=None, **kwargs):
"""堆叠LoRA模型,仅用于模型应用(不包含CLIP)"""
@@ -274,7 +274,7 @@ class CR_ApplyLoRAStack_ModelOnly_JK:
RETURN_NAMES = ("MODEL",)
FUNCTION = "apply_lora_stack"
CATEGORY = icons.get("JK/LoRA")
DESCRIPTION = "Apply multiple LoRA models from stack to model only"
DESCRIPTION = "Apply multiple LoRA models from stack to model only."
def apply_lora_stack(self, model, lora_stack=None):
"""应用堆叠的LoRA模型到模型(CLIP保持不变)"""
+1 -1
View File
@@ -19,7 +19,7 @@ class IsMaskEmpty_JK:
RETURN_NAMES = ["BOOLEAN"]
FUNCTION = "main"
CATEGORY = icons.get("JK/Mask")
DESCRIPTION = "Check if mask is completely empty (contains only zeros)"
DESCRIPTION = "Check if mask is completely empty (contains only zeros)."
def main(self, mask):
"""Check if mask contains only zeros"""
+18 -66
View File
@@ -49,7 +49,7 @@ class ProjectSetting_JK:
RETURN_NAMES = ("Image_Name", "Path_Name", "Counter")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Project settings for workflow organization with customizable naming patterns"
DESCRIPTION = "Project settings for workflow organization with customizable naming patterns."
def get_value(self, project_name: str, image_name: str, path_name: str, seed: int) -> Tuple[str, str, int]:
"""Get project settings values with pattern processing"""
@@ -63,7 +63,6 @@ class ProjectSetting_JK:
return (processed_image_name, processed_path_name, seed)
class KsamplerParametersDefault_JK:
"""Default parameters for KSampler (steps, CFG scale, denoise strength)"""
@@ -98,13 +97,12 @@ class KsamplerParametersDefault_JK:
RETURN_NAMES = ("STEPS", "CFG", "DENOISE")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Default parameters for KSampler (steps, CFG scale, denoise strength)"
DESCRIPTION = "Default parameters for KSampler (steps, CFG scale, denoise strength)."
def get_value(self, steps: int, cfg: float, denoise: float) -> Tuple[int, float, float]:
"""Get KSampler parameter values"""
return (steps, cfg, denoise)
class KsamplerAdvParametersDefault_JK:
"""Advanced KSampler parameters for step control and scheduling"""
@@ -125,13 +123,12 @@ class KsamplerAdvParametersDefault_JK:
RETURN_NAMES = ("start_at_step", "switch_at_step", "end_at_step", "enable", "disable")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Advanced KSampler parameters for step control and scheduling"
DESCRIPTION = "Advanced KSampler parameters for step control and scheduling."
def get_value(self, switch_at_step: int) -> Tuple[int, int, int, str, str]:
"""Get advanced KSampler parameter values with step ranges"""
return (0, switch_at_step, 10000, "enable", "disable")
class BaseModelParametersSD3API_JK:
"""SD3 API compatible base model parameters with prompt management"""
@@ -173,7 +170,8 @@ class BaseModelParametersSD3API_JK:
RETURN_NAMES = ("POSITIVE", "NEGATIVE", "ASPECT_RATIO", "WIDTH", "HEIGHT")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "SD3 API compatible base model parameters with prompt management and aspect ratio selection"
DESCRIPTION = "SD3 API compatible base model parameters with prompt management and aspect ratio selection."
DEPRECATED = True
def get_value(self, positive: str, negative: str, use_input_prompt: bool, aspect_ratio: str,
input_positive: str = None, input_negative: str = None) -> Tuple[str, str, str, int, int]:
@@ -195,7 +193,6 @@ class BaseModelParametersSD3API_JK:
return (positive, negative, aspect_ratio, width, height)
class Inject_Noise_Params_JK:
"""Parameters for noise injection with seed and strength control"""
@@ -228,13 +225,12 @@ class Inject_Noise_Params_JK:
RETURN_NAMES = ("Seed", "Strength", "Normalize")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Parameters for noise injection with seed and strength control"
DESCRIPTION = "Parameters for noise injection with seed and strength control."
def get_value(self, noise_seed: int, noise_strength: float, normalize: str) -> Tuple[int, float, str]:
"""Get noise injection parameters"""
return (noise_seed, noise_strength, normalize)
class SD3_Prompts_Switch_JK:
"""Switch between different prompt types for SD3 (CLIP-L, CLIP-G, T5-XXL)"""
@@ -276,7 +272,7 @@ class SD3_Prompts_Switch_JK:
RETURN_NAMES = ("clip_l", "clip_g", "t5xxl")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Switch between different prompt types for SD3 (CLIP-L, CLIP-G, T5-XXL)"
DESCRIPTION = "Switch between different prompt types for SD3 (CLIP-L, CLIP-G, T5-XXL)."
def get_value(self, clip_l: str, clip_g: str, t5xxl: str, clip_l_prompt: str,
clip_g_prompt: str, t5xxl_prompt: str) -> Tuple[str, str, str]:
@@ -296,7 +292,6 @@ class SD3_Prompts_Switch_JK:
else: # t5xxl
return t5xxl
class GuidanceDefault_JK:
"""Default guidance scale value for model conditioning"""
@@ -318,13 +313,12 @@ class GuidanceDefault_JK:
RETURN_NAMES = ("GUIDANCE",)
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Default guidance scale value for model conditioning"
DESCRIPTION = "Default guidance scale value for model conditioning."
def get_value(self, guidance: float) -> Tuple[float]:
"""Get guidance scale value"""
return (guidance,)
class ImageResizeMode_JK:
"""Image resize mode selection for various resizing strategies"""
@@ -345,13 +339,12 @@ class ImageResizeMode_JK:
RETURN_NAMES = ("MODE",)
FUNCTION = "execute"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Image resize mode selection for various resizing strategies"
DESCRIPTION = "Image resize mode selection for various resizing strategies."
def execute(self, resize_mode: str) -> Tuple[str]:
"""Get resize mode value"""
return (resize_mode,)
class SamplerLoader_JK:
"""Sampler and scheduler selection with name output"""
@@ -372,13 +365,12 @@ class SamplerLoader_JK:
RETURN_NAMES = ("sampler_name", "Sampler", "schedular_name", "Schedular")
FUNCTION = "list"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Sampler and scheduler selection with name output"
DESCRIPTION = "Sampler and scheduler selection with name output."
def list(self, sampler: str, scheduler: str) -> Tuple[str, str, str, str]:
"""Get sampler and scheduler with names"""
return (sampler, sampler, scheduler, scheduler)
class UpscaleMethod_JK:
"""Upscale method selection for images and latents"""
@@ -401,7 +393,7 @@ class UpscaleMethod_JK:
RETURN_NAMES = ("image_upscale_method", "latent_upscale_method")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Upscale method selection for images and latents"
DESCRIPTION = "Upscale method selection for images and latents."
def get_value(self, image_upscale_method: str, latent_upscale_method: str) -> Tuple[str, str]:
"""Get upscale method values"""
@@ -451,7 +443,7 @@ class CR_AspectRatio_JK:
RETURN_NAMES = ("width", "height")
FUNCTION = "Aspect_Ratio"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Aspect ratio selector for various model types with custom resolution support"
DESCRIPTION = "Aspect ratio selector for various model types with custom resolution support."
def Aspect_Ratio(self, custom_width: int, custom_height: int, resolution: str, swap_dimensions: bool) -> Tuple[int, int]:
"""Calculate aspect ratio dimensions based on selection"""
@@ -470,45 +462,6 @@ class CR_AspectRatio_JK:
else:
return (width, height)
class SDXL_TargetRes_JK:
"""Target resolution calculator for SDXL with scaling support"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"width": ("INT", {
"default": 1024,
"tooltip": "Original width to scale from"
}),
"height": ("INT", {
"default": 1024,
"tooltip": "Original height to scale from"
}),
"target_res_scale": ("FLOAT", {
"default": 1.0,
"min": 0.01,
"max": 16.0,
"step": 0.01,
"tooltip": "Scale factor for target resolution"
}),
},
}
RETURN_TYPES = ("INT", "INT")
RETURN_NAMES = ("target_width", "target_height")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Target resolution calculator for SDXL with scaling support"
def get_value(self, width: int, height: int, target_res_scale: float) -> Tuple[int, int]:
"""Calculate target resolution with scaling and multiple-of-8 alignment"""
target_width = multiple_of_int(width * target_res_scale, 8)
target_height = multiple_of_int(height * target_res_scale, 8)
return (target_width, target_height)
#---------------------------------------------------------------------------------------------------------------------#
# String & Data Processing Nodes
#---------------------------------------------------------------------------------------------------------------------#
@@ -533,7 +486,7 @@ class StringToCombo_JK:
RETURN_NAMES = ("any",)
FUNCTION = "convert"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Convert comma-separated string to combo selection (first item)"
DESCRIPTION = "Convert comma-separated string to combo selection (first item)."
def convert(self, string: str) -> Tuple[Any]:
"""Convert string to combo value (first item in comma-separated list)"""
@@ -545,7 +498,6 @@ class StringToCombo_JK:
return (text_list,)
class GetNthString_JK:
"""Get nth item from comma-separated string list with type conversion"""
@@ -573,7 +525,7 @@ class GetNthString_JK:
RETURN_NAMES = ("string", "int", "float", "boolean")
FUNCTION = "process"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Get nth item from comma-separated string list with type conversion"
DESCRIPTION = "Get nth item from comma-separated string list with type conversion."
OUTPUT_NODE = False
def process(self, string_list: str, index: int) -> Tuple[str, int, float, bool]:
@@ -645,7 +597,7 @@ class SaveStringListToJSON_JK:
RETURN_NAMES = ("string_output",)
FUNCTION = "save_strlist"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Save string data to JSON file with overwrite control and directory creation"
DESCRIPTION = "Save string data to JSON file with overwrite control and directory creation."
def save_strlist(self, string_input: str, file_path: str, overwrite: bool) -> Tuple[str]:
"""Save string data to JSON file with error handling"""
@@ -712,7 +664,7 @@ class LoadStringListFromJSON_JK:
RETURN_NAMES = ("string_output",)
FUNCTION = "load_strlist"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Load string data from JSON file with caching and force reload options"
DESCRIPTION = "Load string data from JSON file with caching and force reload options."
def load_strlist(self, file_path: str, force_reload: int = 0) -> Tuple[str]:
"""Load string data from JSON file with intelligent caching"""
@@ -816,13 +768,12 @@ class TilingMode_JK:
RETURN_NAMES = ("TILING",)
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Tiling mode selection for image generation"
DESCRIPTION = "Tiling mode selection for image generation."
def get_value(self, tiling: str) -> Tuple[str]:
"""Get tiling mode value"""
return (tiling,)
class RemoveInput_JK:
"""Remove input and provide default values for any type"""
@@ -838,6 +789,7 @@ class RemoveInput_JK:
FUNCTION = "removeinput"
CATEGORY = icons.get("JK/Misc")
DESCRIPTION = "Remove input and provide default values for any type"
DEPRECATED = True
def removeinput(self) -> Tuple[Any, bool, bool]:
"""Remove input and return default values"""
+2 -1
View File
@@ -1633,7 +1633,7 @@ class RandomPrompterGeek_JK:
RETURN_NAMES = ("prompt",)
FUNCTION = "execute"
CATEGORY = icons.get("JK/Prompt")
DESCRIPTION = "Geek version: Build prompts using category tags that are replaced with random content at runtime. Supports manual category selection and automatic tag insertion."
DESCRIPTION = "Random Prompter Geek version: Build prompts using category tags that are replaced with random content at runtime. Supports manual category selection and automatic tag insertion."
def execute(self, **kwargs):
"""执行提示词生成"""
@@ -1663,6 +1663,7 @@ class PromptCombine_JK:
RETURN_NAMES = ("Prompt",)
FUNCTION = "combine"
CATEGORY = icons.get("JK/Prompt")
DESCRIPTION = "Merge the two strings into one and clean up the result."
def combine(self, prompt_1=None, prompt_2=None):
# 清理两个输入字符串
+4 -4
View File
@@ -25,7 +25,7 @@ class CreateLoopScheduleList:
RETURN_NAMES = ("int_list",)
FUNCTION = "process"
CATEGORY = icons.get("JK/Video")
DESCRIPTION = "Generate a sequential integer list for animation loop scheduling"
DESCRIPTION = "Generate a sequential integer list for animation loop scheduling."
def process(self, loop_count: int) -> Tuple[list]:
"""创建循环调度列表"""
@@ -58,7 +58,7 @@ class WanFrameCount_JK:
RETURN_NAMES = ("wan_frame_count",)
FUNCTION = "process"
CATEGORY = icons.get("JK/Video")
DESCRIPTION = "Calculate WAN-compatible frame count by rounding up to nearest multiple of 4 plus 1"
DESCRIPTION = "Calculate WAN-compatible frame count by rounding up to nearest multiple of 4 plus 1."
OUTPUT_NODE = False
def process(self, frame_count: int) -> Tuple[int]:
@@ -108,7 +108,7 @@ class Wan22cfgSchedulerList_JK:
RETURN_NAMES = ("cfg_list",)
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Video")
DESCRIPTION = "Generate CFG scheduler list with initial and subsequent values for WAN 2.2"
DESCRIPTION = "Generate CFG scheduler list with initial and subsequent values for WAN 2.2."
OUTPUT_NODE = False
def get_value(self, first_cfg: float, cfg: float, steps: int, first_switch_at_step: int) -> Tuple[float]:
@@ -151,7 +151,7 @@ class WanWrapperSamplerDefault_JK:
RETURN_NAMES = ("scheduler", "rope_function")
FUNCTION = "get_value"
CATEGORY = icons.get("JK/Video")
DESCRIPTION = "Provide default sampler settings for WAN wrapper including scheduler and rope function"
DESCRIPTION = "Provide default sampler settings for WAN wrapper including scheduler and rope function."
OUTPUT_NODE = False
def get_value(self, scheduler: str) -> Tuple[str, str]:
+2 -2
View File
@@ -20,6 +20,7 @@
"mj\\lomography color 100",
"adox pan 100",
"adox silvermax 100",
"agfa apx 400",
"agfa vista film",
"agfa vista plus 200",
"agfacolor pro 200",
@@ -115,6 +116,5 @@
"slide film",
"ultrafine xtreme film",
"with a specific film",
"x-ray film",
"agfa apx 400"
"x-ray film"
]
+73 -45
View File
@@ -1,15 +1,17 @@
prompt_data/
├── scene/
├── scenes/
│ ├── 1-background.json
│ ├── 2-atmasphere.json
│ ├── 3-color.json
│ ├── 900-color_description.yml
│ └── 901-color.json
├── motion/
│ ├── 901-color.json
│ ├── 902-surface.json
│ └── 903-scale.json
├── motions/
│ ├── 1-performance.json
│ ├── 2-pose.json
│ ├── 3-sexy pose.json
├── facial_action/
├── facial_actions/
│ ├── 1-combination.json
│ ├── 2-eyebrows.json
│ ├── 3-eyes.json
@@ -19,9 +21,9 @@ prompt_data/
│ ├── 7-chin.json
│ ├── 8-head.json
│ └── 999-injured.json
├── exp_str/
├── exp_strs/
│ └── 1-basic.json
├── expression/
├── expressions/
│ ├── 1-happy.txt
│ ├── 2-sad.json
│ ├── 3-angry.yaml
@@ -36,13 +38,13 @@ prompt_data/
│ ├── 12-negative_mood.json
│ ├── 13-complex_mood.json
│ └── 14-other.json
├── lighting/
├── lightings/
│ ├── 1-time.json
│ ├── 2-nature.json
│ ├── 3-artificial.json
│ ├── 4-direction.json
│ └── 5-mood.json
├── camera/
├── cameras/
│ ├── 1-shot.json
│ ├── 2-view.json
│ ├── 900-camera.json
@@ -55,36 +57,58 @@ prompt_data/
│ ├── 907-effects.json
│ ├── 998-composition.json
│ └── 999-movement.json
├── style/
│ ├── 1-artist/
├── styles/
│ ├── 1-artists/
│ │ ├── 1-painter.json
│ │ ├── 2-photographer.json
│ │ ├── 3-illustrator.json
│ │ ├── 4-comic_cartoon-artist.json
│ │ ├── 5-concept-artist.json
│ │ ├── 6-animation-maker.json
│ │ ├── 7-filmmaker-director.json
│ │ ├── 8-game-maker.json
│ │ ├── 4-comic_cartoon_artist.json
│ │ ├── 5-concept_artist.json
│ │ ├── 6-animation_maker.json
│ │ ├── 7-filmmaker_director.json
│ │ ├── 9-sculptor.json
│ │ ├── 10-architect.json
│ │ ├── 11-designer-digital.json
│ │ ├── 12-designer-fashion.json
│ │ ├── 13-designer-industrial.json
│ │ ├── 14-designer-uncategorized.json
│ │ ├── 15-printmaker.json
│ │ ├── 16-dark-artist.json
│ │ ├── 17-street-artist.json
│ │ ├── 18-carving-artist.json
│ │ ├── 19-collage-artist.json
│ │ ├── 20-tattoo-artist.json
│ │ ├── 21-craft-artist.json
│ │ ├── 22-installation-artist.json
│ │ ├── 23-glass-artist.json
│ │ ├── 24-calligrapher.json
│ │ └── 99-uncategorized.json
│ ├── 2-vision/
│ │ ├── 11-printmaker.json
│ │ ├── 12-street_artist.json
│ │ ├── 13-dark_artist.json
│ │ ├── 14-designer_digital.json
│ │ ├── 14-designer_fashion.json
│ │ ├── 14-designer_industrial.json
│ │ ├── 14-designer_interior.json
│ │ ├── 14-designer_uncategorized.json
│ │ ├── 15-collagist.json
│ │ ├── 16-tattoo_artist.json
│ │ ├── 17-craft_artist.json
│ │ ├── 18-installation_artist.json
│ │ ├── 19-glass_artist.json
│ │ ├── 99-uncategorized.json
│ │ ├── 901-painter.json
│ │ ├── 902-photographer.json
│ │ ├── 903-illustrator.json
│ │ ├── 904-comic_cartoon_artist.json
│ │ ├── 905-concept_artist.json
│ │ ├── 906-animation_maker.json
│ │ ├── 907-filmmaker_director.json
│ │ ├── 908-game_maker.json
│ │ ├── 909-sculptor.json
│ │ ├── 910-architect.json
│ │ ├── 911-printmaker.json
│ │ ├── 912-street_artist.json
│ │ ├── 913-dark_artist.json
│ │ ├── 914-designer_digital.json
│ │ ├── 914-designer_fashion.json
│ │ ├── 914-designer_industrial.json
│ │ ├── 914-designer_interior.json
│ │ ├── 914-designer_uncategorized.json
│ │ ├── 915-collagist.json
│ │ ├── 916-tattoo_artist.json
│ │ ├── 917-craft_artist.json
│ │ ├── 918-installation_artist.json
│ │ ├── 919-glass_artist.json
│ │ ├── 920-calligrapher.json
│ │ └── 999-uncategorized.json
│ ├── 2-forms/
│ │ ├── 1-painting.json
│ │ ├── 1-painting-detail-.json
│ │ ├── 2-animation.json
│ │ ├── 3-photography.json
│ │ ├── 4-design.json
@@ -92,29 +116,33 @@ prompt_data/
│ │ ├── 6-film.json
│ │ ├── 7-game.json
│ │ ├── 8-illustration.json
│ │ ├── 9-comic&cartoon.json
│ │ ├── 9-comic_cartoon.json
│ │ ├── 10-digital.json
│ │ ├── 11-sculpture.json
│ │ ├── 12-architecture.json
│ │ ├── 12-architecture-detail.json
│ │ ├── 13-print.json
│ │ ├── 14-carving.json
│ │ ├── 15-collage.json
│ │ ├── 16-tattoo.json
│ │ ├── 17-glass.json
│ │ ├── 18-crafts.json
│ │ ├── 19-printing.json
│ │ ├── 20-calligraphy.json
│ │ ├── 21-decoration.json
│ │ └── 22-other.json
│ │ ├── 17-printing.json
│ │ ├── 18-calligraphy.json
│ │ ├── 19-crafts.json
│ │ ├── 20-other.json
│ │ ├── 902-animation.json
│ │ ├── 906-film.json
│ │ └── 907-game.json
│ ├── 3-genres.json
│ ├── 4-era.json
│ ├── 5-area.json
│ └── 901-perception(don't use).json
└── description/
│ └── 900-perception.json
└── descriptions/
├── 1-sensory.json
├── 2-detail.json
├── 3-quality.json
├── 4-composition.json
├── 5-color.json
└── 6-creativity.json
├── 6-creativity.json
├── 901-sensory.json
├── 902-detail.json
├── 903-quality.json
├── 904-composition.json
├── 905-color.json
└── 906-creativity.json
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
name = "comfyui-jakeupgrade"
description = "ComfyUI workflow customization by Jake."
version = "2.3.0"
version = "2.3.1"
license = {file = "LICENSE"}
dependencies = ["opencv-python", "piexif", "torch", "torchvision", "numpy", "pillow", "simpleeval", "functools", "PyYAML", "toml"]