diff --git a/README.md b/README.md index 8d8c63e..0c234b9 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ I’m sharing them here with the community, and I hope you find them as useful a | [šŸ” Display Any](#-display-any) | Universal debugging tool for any data type | šŸ‘ļø Display | | [šŸ–¼ļø Image to Multiple Of](#ļø-image-to-multiple-of) | Adjust dimensions to multiples for compatibility | šŸ–¼ļø Resolution | | [šŸ“‰ Image Scale Down By](#-image-scale-down-by) | Scale images down by a factor with quality preservation | šŸ–¼ļø Resolution | -| [šŸŽ¬ Kiko Film Grain](#-kiko-film-grain) | Add realistic film grain effects to images | šŸ’¾ Images | +| [šŸŽ¬ Film Grain](#-film-grain) | Add realistic film grain effects to images | šŸ’¾ Images | | [šŸ”¤ Embedding Autocomplete](#-embedding-autocomplete) | Smart autocomplete for embeddings, LoRAs, and tags | šŸ”§ Utils | ### 🧰 xyz-helpers Tools @@ -244,7 +244,7 @@ Efficiently scale images down by a specified factor with quality preservation. - Quick downsampling for performance optimization - Prepare images for web display or transmission -#### šŸŽ¬ Kiko Film Grain +#### šŸŽ¬ Film Grain Add realistic analog film grain effects to generated images. - **Realistic Grain Simulation**: Mimics actual film photography characteristics @@ -630,7 +630,7 @@ Example workflow available: [xyz_helpers_lora_testing.json](examples/workflows/x | **Display Any** | Universal debugging tool for any data type or tensor shapes | āœ… Complete | [Docs](examples/documentation/display_any.md) | | **Image to Multiple Of** | Adjust image dimensions to multiples for model compatibility | āœ… Complete | [Docs](examples/documentation/image_to_multiple_of.md) | | **Image Scale Down By** | Efficiently scale images down by a specified factor | āœ… Complete | [Docs](examples/documentation/image_scale_down_by.md) | -| **Kiko Film Grain** | Add realistic analog film grain effects to images | āœ… Complete | [Docs](examples/documentation/kiko_film_grain.md) | +| **Film Grain** | Add realistic analog film grain effects to images | āœ… Complete | [Docs](examples/documentation/film_grain.md) | | **Flux Sampler Params** | FLUX-optimized parameter generator with batch support | āœ… Complete | [Docs](examples/documentation/flux_sampler_params.md) | | **LoRA Folder Batch** | Batch process multiple LoRAs from folders | āœ… Complete | [Docs](examples/documentation/lora_folder_batch.md) | | **Plot Parameters** | Visualize parameter effects with graphs | āœ… Complete | [Docs](examples/documentation/plot_parameters.md) | @@ -930,7 +930,8 @@ MIT License - see [LICENSE](LICENSE) file for details. ## šŸ“ˆ Stats -- **Nodes**: 20 (13 core tools + 6 xyz-helpers + 1 settings node) +- **Nodes**: 19 (13 core tools + 6 xyz-helpers) +- **Features**: Embedding Autocomplete (settings-based, not a node) - **Categories**: 9 emoji-based categories for better organization - **Format Support**: 3 (PNG, JPEG, WebP with advanced controls) - **Presets**: 26 curated resolution presets diff --git a/kikotools/__init__.py b/kikotools/__init__.py index cb3046b..11702a0 100644 --- a/kikotools/__init__.py +++ b/kikotools/__init__.py @@ -16,14 +16,10 @@ from .tools.resolution_calculator import ResolutionCalculatorNode from .tools.sampler_combo import SamplerComboCompactNode, SamplerComboNode from .tools.seed_history import SeedHistoryNode from .tools.width_height_selector import WidthHeightSelectorNode -from .tools.xyz_helpers import ( - FluxSamplerParamsNode, - LoRAFolderBatchNode, - PlotParametersNode, - SamplerSelectHelperNode, - SchedulerSelectHelperNode, - TextEncodeSamplerParamsNode, -) +from .tools.xyz_helpers import (FluxSamplerParamsNode, LoRAFolderBatchNode, + PlotParametersNode, SamplerSelectHelperNode, + SchedulerSelectHelperNode, + TextEncodeSamplerParamsNode) # ComfyUI node registration mappings NODE_CLASS_MAPPINGS = { @@ -46,7 +42,8 @@ NODE_CLASS_MAPPINGS = { "FluxSamplerParams": FluxSamplerParamsNode, "PlotParameters+": PlotParametersNode, "LoRAFolderBatch": LoRAFolderBatchNode, - "KikoEmbeddingAutocomplete": KikoEmbeddingAutocomplete, + # Note: KikoEmbeddingAutocomplete is not registered as a node + # It's a settings-only feature accessed through ComfyUI settings menu } NODE_DISPLAY_NAME_MAPPINGS = { @@ -62,14 +59,14 @@ NODE_DISPLAY_NAME_MAPPINGS = { "GeminiPrompt": "Gemini Prompt Engineer", "DisplayAny": "Display Any", "DisplayText": "Display Text", - "KikoFilmGrain": "Kiko Film Grain", + "KikoFilmGrain": "Film Grain", "SamplerSelectHelper": "Sampler Select Helper", "SchedulerSelectHelper": "Scheduler Select Helper", "TextEncodeSamplerParams": "Text Encode for Sampler Params", "FluxSamplerParams": "Flux Sampler Parameters", "PlotParameters+": "Plot Parameters", "LoRAFolderBatch": "LoRA Folder Batch", - "KikoEmbeddingAutocomplete": "🫶 Embedding Autocomplete Configuration", + # KikoEmbeddingAutocomplete removed - settings only, not a node } __all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS"] diff --git a/kikotools/base/base_node.py b/kikotools/base/base_node.py index cecba5c..a8f4a4d 100644 --- a/kikotools/base/base_node.py +++ b/kikotools/base/base_node.py @@ -20,7 +20,7 @@ class ComfyAssetsBaseNode: - Consistent return type handling """ - CATEGORY = "ComfyAssets" + CATEGORY = "🫶 ComfyAssets" def validate_inputs(self, **kwargs) -> None: """ diff --git a/kikotools/tools/display_any/node.py b/kikotools/tools/display_any/node.py index 99d4889..65b3c0e 100644 --- a/kikotools/tools/display_any/node.py +++ b/kikotools/tools/display_any/node.py @@ -38,7 +38,7 @@ class DisplayAnyNode(ComfyAssetsBaseNode): return True RETURN_TYPES = ("STRING",) - CATEGORY = "ComfyAssets/šŸ‘ļø Display" + CATEGORY = "🫶 ComfyAssets/šŸ‘ļø Display" RETURN_NAMES = ("display_text",) FUNCTION = "display" OUTPUT_NODE = True # This node displays output in the UI diff --git a/kikotools/tools/display_text/node.py b/kikotools/tools/display_text/node.py index dff07cb..cec296f 100644 --- a/kikotools/tools/display_text/node.py +++ b/kikotools/tools/display_text/node.py @@ -19,7 +19,7 @@ class DisplayTextNode(ComfyAssetsBaseNode): RETURN_NAMES = ("text",) OUTPUT_NODE = True FUNCTION = "display_text" - CATEGORY = "ComfyAssets/šŸ‘ļø Display" + CATEGORY = "🫶 ComfyAssets/šŸ‘ļø Display" DESCRIPTION = """ Displays text in the UI with a copy-to-clipboard feature. diff --git a/kikotools/tools/embedding_autocomplete/node.py b/kikotools/tools/embedding_autocomplete/node.py index 28edd02..620312e 100644 --- a/kikotools/tools/embedding_autocomplete/node.py +++ b/kikotools/tools/embedding_autocomplete/node.py @@ -17,7 +17,7 @@ class KikoEmbeddingAutocomplete: """Node that provides embedding autocomplete functionality.""" DISPLAY_NAME = "🫶 Embedding Autocomplete Settings" - CATEGORY = "ComfyAssets" + CATEGORY = "🫶 ComfyAssets" # Settings definition for the settings registry SETTINGS = { diff --git a/kikotools/tools/empty_latent_batch/node.py b/kikotools/tools/empty_latent_batch/node.py index e16e174..99a0b6e 100644 --- a/kikotools/tools/empty_latent_batch/node.py +++ b/kikotools/tools/empty_latent_batch/node.py @@ -96,7 +96,7 @@ class EmptyLatentBatchNode(ComfyAssetsBaseNode): RETURN_TYPES = ("LATENT", "INT", "INT") RETURN_NAMES = ("latent", "width", "height") FUNCTION = "create_empty_latent" - CATEGORY = "ComfyAssets/šŸ“¦ Latents" + CATEGORY = "🫶 ComfyAssets/šŸ“¦ Latents" def create_empty_latent( self, preset: str, width: int, height: int, batch_size: int diff --git a/kikotools/tools/gemini_prompt/node.py b/kikotools/tools/gemini_prompt/node.py index b83bcb0..968c087 100644 --- a/kikotools/tools/gemini_prompt/node.py +++ b/kikotools/tools/gemini_prompt/node.py @@ -51,7 +51,7 @@ class GeminiPromptNode(ComfyAssetsBaseNode): RETURN_TYPES = ("STRING", "STRING") RETURN_NAMES = ("prompt", "negative_prompt") FUNCTION = "generate_prompt" - CATEGORY = "ComfyAssets/🧠 Prompts" + CATEGORY = "🫶 ComfyAssets/🧠 Prompts" DESCRIPTION = """ Analyzes images using Google's Gemini AI to generate optimized prompts. diff --git a/kikotools/tools/image_scale_down_by/node.py b/kikotools/tools/image_scale_down_by/node.py index 2af817e..aa60171 100644 --- a/kikotools/tools/image_scale_down_by/node.py +++ b/kikotools/tools/image_scale_down_by/node.py @@ -35,7 +35,7 @@ class ImageScaleDownByNode(ComfyAssetsBaseNode): } RETURN_TYPES = ("IMAGE",) - CATEGORY = "ComfyAssets/šŸ–¼ļø Resolution" + CATEGORY = "🫶 ComfyAssets/šŸ–¼ļø Resolution" RETURN_NAMES = ("images",) FUNCTION = "scale_down" diff --git a/kikotools/tools/image_to_multiple_of/node.py b/kikotools/tools/image_to_multiple_of/node.py index 4c4eff7..8d0ce2d 100644 --- a/kikotools/tools/image_to_multiple_of/node.py +++ b/kikotools/tools/image_to_multiple_of/node.py @@ -36,7 +36,7 @@ class ImageToMultipleOfNode(ComfyAssetsBaseNode): } RETURN_TYPES = ("IMAGE",) - CATEGORY = "ComfyAssets/šŸ–¼ļø Resolution" + CATEGORY = "🫶 ComfyAssets/šŸ–¼ļø Resolution" RETURN_NAMES = ("image",) FUNCTION = "process" diff --git a/kikotools/tools/kiko_film_grain/node.py b/kikotools/tools/kiko_film_grain/node.py index 05450c5..2fbd86e 100644 --- a/kikotools/tools/kiko_film_grain/node.py +++ b/kikotools/tools/kiko_film_grain/node.py @@ -85,7 +85,7 @@ class KikoFilmGrainNode(ComfyAssetsBaseNode): RETURN_TYPES = ("IMAGE",) RETURN_NAMES = ("image",) FUNCTION = "apply_grain" - CATEGORY = "ComfyAssets/image" + CATEGORY = "🫶 ComfyAssets/šŸ’¾ Images" DESCRIPTION = "Apply realistic film grain effect with customizable parameters" def apply_grain( diff --git a/kikotools/tools/kiko_save_image/node.py b/kikotools/tools/kiko_save_image/node.py index 3159e4d..bfb723f 100644 --- a/kikotools/tools/kiko_save_image/node.py +++ b/kikotools/tools/kiko_save_image/node.py @@ -95,7 +95,7 @@ class KikoSaveImageNode(ComfyAssetsBaseNode): } RETURN_TYPES = () - CATEGORY = "ComfyAssets/šŸ’¾ Images" + CATEGORY = "🫶 ComfyAssets/šŸ’¾ Images" FUNCTION = "save_images" OUTPUT_NODE = True diff --git a/kikotools/tools/resolution_calculator/node.py b/kikotools/tools/resolution_calculator/node.py index 82abb7a..0c9af4b 100644 --- a/kikotools/tools/resolution_calculator/node.py +++ b/kikotools/tools/resolution_calculator/node.py @@ -60,7 +60,7 @@ class ResolutionCalculatorNode(ComfyAssetsBaseNode): } RETURN_TYPES = ("INT", "INT") - CATEGORY = "ComfyAssets/šŸ–¼ļø Resolution" + CATEGORY = "🫶 ComfyAssets/šŸ–¼ļø Resolution" RETURN_NAMES = ("width", "height") FUNCTION = "calculate_resolution" diff --git a/kikotools/tools/sampler_combo/compact_node.py b/kikotools/tools/sampler_combo/compact_node.py index c449c75..19ef9b7 100644 --- a/kikotools/tools/sampler_combo/compact_node.py +++ b/kikotools/tools/sampler_combo/compact_node.py @@ -63,7 +63,7 @@ class SamplerComboCompactNode(ComfyAssetsBaseNode): RETURN_TYPES = ("SAMPLER", SCHEDULERS, "INT", "FLOAT") RETURN_NAMES = ("sampler", "scheduler", "steps", "cfg") FUNCTION = "get_combo" - CATEGORY = "ComfyAssets/šŸŒ€ Samplers" + CATEGORY = "🫶 ComfyAssets/šŸŒ€ Samplers" def get_combo( self, sampler: str, sched: str, steps: int, cfg: float diff --git a/kikotools/tools/sampler_combo/node.py b/kikotools/tools/sampler_combo/node.py index 6aea258..50fc152 100644 --- a/kikotools/tools/sampler_combo/node.py +++ b/kikotools/tools/sampler_combo/node.py @@ -68,7 +68,7 @@ class SamplerComboNode(ComfyAssetsBaseNode): RETURN_TYPES = ("SAMPLER", SCHEDULERS, "INT", "FLOAT") RETURN_NAMES = ("sampler_name", "scheduler", "steps", "cfg") FUNCTION = "get_sampler_combo" - CATEGORY = "ComfyAssets/šŸŒ€ Samplers" + CATEGORY = "🫶 ComfyAssets/šŸŒ€ Samplers" def get_sampler_combo( self, sampler_name: str, scheduler: str, steps: int, cfg: float diff --git a/kikotools/tools/seed_history/node.py b/kikotools/tools/seed_history/node.py index f5236fa..3bad139 100644 --- a/kikotools/tools/seed_history/node.py +++ b/kikotools/tools/seed_history/node.py @@ -38,7 +38,7 @@ class SeedHistoryNode(ComfyAssetsBaseNode): RETURN_TYPES = ("INT",) RETURN_NAMES = ("seed",) FUNCTION = "output_seed" - CATEGORY = "ComfyAssets/🌱 Seeds" + CATEGORY = "🫶 ComfyAssets/🌱 Seeds" def output_seed(self, seed: int) -> Tuple[int]: """ diff --git a/kikotools/tools/width_height_selector/node.py b/kikotools/tools/width_height_selector/node.py index 341bcf2..9fe5b46 100644 --- a/kikotools/tools/width_height_selector/node.py +++ b/kikotools/tools/width_height_selector/node.py @@ -85,7 +85,7 @@ class WidthHeightSelectorNode(ComfyAssetsBaseNode): RETURN_TYPES = ("INT", "INT") RETURN_NAMES = ("width", "height") FUNCTION = "get_dimensions" - CATEGORY = "ComfyAssets/šŸ–¼ļø Resolution" + CATEGORY = "🫶 ComfyAssets/šŸ–¼ļø Resolution" def get_dimensions(self, preset: str, width: int, height: int) -> Tuple[int, int]: """ diff --git a/kikotools/tools/xyz_helpers/flux_sampler_params/node.py b/kikotools/tools/xyz_helpers/flux_sampler_params/node.py index 26fe56c..d105c21 100644 --- a/kikotools/tools/xyz_helpers/flux_sampler_params/node.py +++ b/kikotools/tools/xyz_helpers/flux_sampler_params/node.py @@ -125,7 +125,7 @@ class FluxSamplerParamsNode(ComfyAssetsBaseNode): RETURN_TYPES = ("LATENT", "SAMPLER_PARAMS") RETURN_NAMES = ("latent", "params") FUNCTION = "process_batch" - CATEGORY = "ComfyAssets/🧰 xyz-helpers" + CATEGORY = "🫶 ComfyAssets/🧰 xyz-helpers" def process_batch( self, diff --git a/kikotools/tools/xyz_helpers/lora_folder_batch/node.py b/kikotools/tools/xyz_helpers/lora_folder_batch/node.py index 123592c..b574101 100644 --- a/kikotools/tools/xyz_helpers/lora_folder_batch/node.py +++ b/kikotools/tools/xyz_helpers/lora_folder_batch/node.py @@ -80,7 +80,7 @@ class LoRAFolderBatchNode(ComfyAssetsBaseNode): RETURN_TYPES = ("LORA_PARAMS", "STRING", "INT") RETURN_NAMES = ("lora_params", "lora_list", "lora_count") FUNCTION = "batch_loras" - CATEGORY = "ComfyAssets/🧰 xyz-helpers" + CATEGORY = "🫶 ComfyAssets/🧰 xyz-helpers" def batch_loras( self, diff --git a/kikotools/tools/xyz_helpers/plot_sampler_params/node.py b/kikotools/tools/xyz_helpers/plot_sampler_params/node.py index 804c0a7..fa19178 100644 --- a/kikotools/tools/xyz_helpers/plot_sampler_params/node.py +++ b/kikotools/tools/xyz_helpers/plot_sampler_params/node.py @@ -113,7 +113,7 @@ class PlotParametersNode(ComfyAssetsBaseNode): RETURN_TYPES = ("IMAGE",) RETURN_NAMES = ("image",) FUNCTION = "plot_parameters" - CATEGORY = "ComfyAssets/🧰 xyz-helpers" + CATEGORY = "🫶 ComfyAssets/🧰 xyz-helpers" def plot_parameters( self, diff --git a/kikotools/tools/xyz_helpers/sampler_select_helper/node.py b/kikotools/tools/xyz_helpers/sampler_select_helper/node.py index a2279d0..8d38c9f 100644 --- a/kikotools/tools/xyz_helpers/sampler_select_helper/node.py +++ b/kikotools/tools/xyz_helpers/sampler_select_helper/node.py @@ -30,7 +30,7 @@ class SamplerSelectHelperNode(ComfyAssetsBaseNode): RETURN_TYPES = ("STRING",) RETURN_NAMES = ("selected_samplers",) FUNCTION = "select_samplers" - CATEGORY = "ComfyAssets/🧰 xyz-helpers" + CATEGORY = "🫶 ComfyAssets/🧰 xyz-helpers" def select_samplers(self, **sampler_flags) -> Tuple[str]: """ diff --git a/kikotools/tools/xyz_helpers/scheduler_select_helper/node.py b/kikotools/tools/xyz_helpers/scheduler_select_helper/node.py index b470872..e4a8ccd 100644 --- a/kikotools/tools/xyz_helpers/scheduler_select_helper/node.py +++ b/kikotools/tools/xyz_helpers/scheduler_select_helper/node.py @@ -30,7 +30,7 @@ class SchedulerSelectHelperNode(ComfyAssetsBaseNode): RETURN_TYPES = ("STRING",) RETURN_NAMES = ("selected_schedulers",) FUNCTION = "select_schedulers" - CATEGORY = "ComfyAssets/🧰 xyz-helpers" + CATEGORY = "🫶 ComfyAssets/🧰 xyz-helpers" def select_schedulers(self, **scheduler_flags) -> Tuple[str]: """ diff --git a/kikotools/tools/xyz_helpers/text_encode_sampler_params/node.py b/kikotools/tools/xyz_helpers/text_encode_sampler_params/node.py index fbdcb48..09d8180 100644 --- a/kikotools/tools/xyz_helpers/text_encode_sampler_params/node.py +++ b/kikotools/tools/xyz_helpers/text_encode_sampler_params/node.py @@ -40,7 +40,7 @@ class TextEncodeSamplerParamsNode(ComfyAssetsBaseNode): RETURN_TYPES = ("CONDITIONING",) RETURN_NAMES = ("conditioning",) FUNCTION = "encode_prompts" - CATEGORY = "ComfyAssets/🧰 xyz-helpers" + CATEGORY = "🫶 ComfyAssets/🧰 xyz-helpers" def encode_prompts(self, text: str, clip: Any) -> Tuple[Any]: """