@@ -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
|
||||

|
||||

|
||||
- Wan2.2 Video Generation Workflows breakdown
|
||||

|
||||

|
||||
|
||||
### 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>
|
||||
|
||||

|
||||

|
||||
- Workflow breakdown: img2mesh types
|
||||
|
||||

|
||||

|
||||
- Workflow breakdown: CRM&Zero123plus&MVDream&CharacterGen
|
||||
|
||||

|
||||

|
||||
- Workflow breakdown: JUnique3D&Wonder3D&Era3D
|
||||
|
||||

|
||||

|
||||
- Workflow breakdown: Zero123&SV3D
|
||||
|
||||

|
||||

|
||||
- 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
|
||||

|
||||
Orbit Poses JK🐉: Generate 3D camera track pose configurations, supporting multiple preset and custom parameters.
|
||||

|
||||
Orbit Lists to Orbit Poses JK🐉: Convert track list format to camera pose format.
|
||||

|
||||
Orbit Poses to Orbit Lists JK🐉: Convert camera pose format to track list format.
|
||||

|
||||
Get Orbit Poses From List JK🐉:Select a specific pose by index from a list of camera poses.
|
||||
- Audio Nodes
|
||||

|
||||
Scene Cuts JK🐉: Create scene cuts based on multiple cut point times or durations and an optional audio duration.
|
||||

|
||||
Cut Audio JK🐉: Cut an audio file based on start and end time.
|
||||

|
||||
Cut Audio Index JK🐉: Cut an audio file based on scene cuts metadata and cut index.
|
||||

|
||||
Cut Audio Cuts JK🐉: Merge all cuts from scene_cuts into a single audio file in chronological order.
|
||||

|
||||
Cut Audio Loop JK🐉: Cut an audio file based on loop metadata and cut index.
|
||||
- Video Nodes
|
||||

|
||||
Create Loop Schedule List JK🐉: Generate a sequential integer list for animation loop scheduling.
|
||||

|
||||
Wan Frame Count JK🐉: Calculate WAN-compatible frame count by rounding up to nearest multiple of 4 plus 1.
|
||||

|
||||
Wan22 cfg Scheduler List JK🐉: Generate CFG scheduler list with initial and subsequent values for WAN 2.2.
|
||||

|
||||
Wan Wrapper Sampler Default JK🐉: Provide default sampler settings for WAN wrapper including scheduler and rope function.
|
||||
- Prompt Nodes
|
||||

|
||||
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.
|
||||

|
||||
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.
|
||||

|
||||
Prompt Combine JK🐉: Merge the two strings into one and clean up the result.
|
||||
- ControlNet Nodes
|
||||

|
||||
ControlNet Loader JK🐉: Load ControlNet models with configurable union types.
|
||||

|
||||
Multi-ControlNet Param Stack JK🐉: Stack multiple ControlNet parameters for complex control scenarios.
|
||||

|
||||
Apply ControlNet JK🐉: Apply single ControlNet to conditioning with mask support.
|
||||

|
||||
Apply Multi-ControlNet%20Adv%20JK🐉: Apply multiple ControlNets from stack to conditioning.
|
||||
- LoRA Nodes
|
||||

|
||||
LoRA Stack JK🐉: Stack multiple LoRA models with prompt and metadata generation.
|
||||

|
||||
Apply LoRA Stack JK🐉: Apply multiple LoRA models from stack to both model and CLIP.
|
||||

|
||||
LoRA Stack Model Only JK🐉: Stack LoRA models for model-only application.
|
||||

|
||||
Apply LoRA Stack Model Only JK🐉: Apply multiple LoRA models from stack to model only.
|
||||
- Image Nodes
|
||||

|
||||
Rough Outline JK🐉: Extract rough outlines from images using Canny edge detection and contour processing.
|
||||

|
||||
Open+DW Pose JK🐉: Combine DWPose and OpenPose images by removing and reserving specific colors.
|
||||

|
||||
Make Image Grid JK🐉: Create image grid from multiple images with specified rows or columns.
|
||||

|
||||
Split Image Grid JK🐉: Split image grid into individual images based on rows or columns.
|
||||

|
||||
Image Remove Alpha JK🐉: Remove alpha channel from RGBA images and convert to RGB.
|
||||

|
||||
Color Grading JK🐉: Apply color grading with brightness, contrast, saturation and RGB channel adjustments.
|
||||

|
||||
Image Crop by Mask Resolution Grp JK🐉: Calculate crop parameters based on mask with various resolution options.
|
||||

|
||||
Image Crop by Mask Params JK🐉: Provide crop parameters for mask-based image cropping operations.
|
||||

|
||||
Scale To Resolution JK🐉: Scale image to target resolution based on width, height or megapixel constraints.
|
||||

|
||||
Enchance And Resize Hint Images JK🐉: Enhance hint images with high quality resizing, edge processing and multiple resize modes.
|
||||
- Mask Nodes
|
||||

|
||||
Is Mask Empty JK🐉: Check if mask is completely empty (contains only zeros).
|
||||
- Math Nodes
|
||||

|
||||
Conversion nodes: BoolToInt JK🐉 | IntToBool JK🐉 | FloatToInt JK🐉 | IntToFloat JK🐉
|
||||

|
||||
Boolean Math nodes: BoolUnaryOp JK🐉 | BoolBinaryOp JK🐉 | Bool And JK🐉 | Bool OR JK🐉
|
||||

|
||||
String Math Node: StringBinaryCon JK🐉
|
||||

|
||||
Float Math Nodes: FloatUnaryCon JK🐉 | FloatBinaryCon JK🐉 | FloatUnaryOp JK🐉 | FloatBinaryOp JK🐉
|
||||

|
||||
Int Math Nodes: IntUnaryCon JK🐉 | IntBinaryCon JK🐉 | IntUnaryOp JK🐉 | IntBinaryOp JK🐉 | IntSubOp JK🐉
|
||||

|
||||
Evaluate Nodes: Evaluate Ints JK🐉 | Evaluate Floats JK🐉 | Evaluate String JK🐉 | Evaluate Examples JK🐉
|
||||
- Misc Nodes
|
||||

|
||||
Project Setting JK🐉: Project settings for workflow organization with customizable naming patterns.
|
||||

|
||||
Ksampler Parameters Default JK🐉: Default parameters for KSampler (steps, CFG scale, denoise strength).
|
||||

|
||||
Ksampler Adv Parameters Default JK🐉: Advanced KSampler parameters for step control and scheduling.
|
||||

|
||||
Inject Noise Params JK🐉: Parameters for noise injection with seed and strength control.
|
||||

|
||||
SD3 Prompts Switch JK🐉: Switch between different prompt types for SD3 (CLIP-L, CLIP-G, T5-XXL).
|
||||

|
||||
Guidance Default JK🐉: Default guidance scale value for model conditioning.
|
||||

|
||||
Image Resize Mode JK🐉: Image resize mode selection for various resizing strategies.
|
||||

|
||||
Sampler Loader JK🐉: Sampler and scheduler selection with name output.
|
||||

|
||||
Upscale Method JK🐉: Upscale method selection for images and latents.
|
||||

|
||||
Aspect Ratio JK🐉: Aspect ratio selector for various model types with custom resolution support.
|
||||

|
||||
String To Combo JK🐉: Convert comma-separated string to combo selection (first item).
|
||||

|
||||
Get Nth String JK🐉: Get nth item from comma-separated string list with type conversion.
|
||||

|
||||
Save String List To JSON JK🐉: Save string data to JSON file with overwrite control and directory creation.
|
||||

|
||||
Load String List From JSON JK🐉: Load string data from JSON file with caching and force reload options.
|
||||

|
||||
Tiling Mode JK🐉: Tiling mode selection for image generation.
|
||||
- Switch 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🐉
|
||||
|
||||
</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
|
||||
|
||||
@@ -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,
|
||||
|
||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 8.7 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 94 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 93 KiB |
|
After Width: | Height: | Size: 62 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 70 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 8.6 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 52 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 9.5 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 19 KiB |
@@ -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,
|
||||
|
||||
@@ -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到条件输入"""
|
||||
|
||||
@@ -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
|
||||
#---------------------------------------------------------------------------------------------------------------------#
|
||||
|
||||
@@ -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"""
|
||||
|
||||
@@ -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)"""
|
||||
|
||||
@@ -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保持不变)"""
|
||||
|
||||
@@ -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"""
|
||||
|
||||
@@ -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"""
|
||||
|
||||
@@ -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):
|
||||
# 清理两个输入字符串
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
@@ -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,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"]
|
||||
|
||||
|
||||