From ad13e665060553ff90051859bebc08696eae3521 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Wed, 23 Jul 2025 13:29:32 -0700 Subject: [PATCH 1/6] refactor(node): update sampler handling logic --- kikotools/tools/sampler_combo/node.py | 35 ++++++++++++++++++++++----- pyproject.toml | 32 +++++++++++++++++++++--- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/kikotools/tools/sampler_combo/node.py b/kikotools/tools/sampler_combo/node.py index 09cfe7b..660aec2 100644 --- a/kikotools/tools/sampler_combo/node.py +++ b/kikotools/tools/sampler_combo/node.py @@ -65,14 +65,14 @@ class SamplerComboNode(ComfyAssetsBaseNode): } } - RETURN_TYPES = (SAMPLERS, SCHEDULERS, "INT", "FLOAT") + RETURN_TYPES = ("SAMPLER", SCHEDULERS, "INT", "FLOAT") RETURN_NAMES = ("sampler_name", "scheduler", "steps", "cfg") FUNCTION = "get_sampler_combo" CATEGORY = "ComfyAssets" def get_sampler_combo( self, sampler_name: str, scheduler: str, steps: int, cfg: float - ) -> Tuple[str, str, int, float]: + ) -> Tuple[object, str, int, float]: """ Get sampler combo configuration. @@ -83,7 +83,7 @@ class SamplerComboNode(ComfyAssetsBaseNode): cfg: CFG scale value Returns: - Tuple of (sampler_name, scheduler, steps, cfg) + Tuple of (sampler_object, scheduler, steps, cfg) """ try: # Validate inputs @@ -98,17 +98,33 @@ class SamplerComboNode(ComfyAssetsBaseNode): f"steps={steps}, cfg={cfg}. " f"Using safe defaults: euler, normal, 20 steps, CFG 7.0" ) - return ("euler", "normal", 20, 7.0) + try: + import comfy.samplers + + sampler = comfy.samplers.sampler_object("euler") + except ImportError: + # Return mock object for testing + sampler = "euler" + return (sampler, "normal", 20, 7.0) # Process and return the combo result = get_sampler_combo(sampler_name, scheduler, steps, cfg) + # Create the sampler object + try: + import comfy.samplers + + sampler = comfy.samplers.sampler_object(result[0]) + except ImportError: + # Return sampler name for testing + sampler = result[0] + self.log_info( f"Configured sampler combo: {result[0]}, {result[1]}, " f"{result[2]} steps, CFG {result[3]}" ) - return result + return (sampler, result[1], result[2], result[3]) except Exception as e: # Handle any unexpected errors gracefully @@ -119,7 +135,14 @@ class SamplerComboNode(ComfyAssetsBaseNode): f"{self.__class__.__name__}: Error processing sampler combo: {str(e)}. " f"Using safe defaults: euler, normal, 20 steps, CFG 7.0" ) - return ("euler", "normal", 20, 7.0) + try: + import comfy.samplers + + sampler = comfy.samplers.sampler_object("euler") + except ImportError: + # Return mock object for testing + sampler = "euler" + return (sampler, "normal", 20, 7.0) def validate_inputs( self, sampler_name: str, scheduler: str, steps: int, cfg: float diff --git a/pyproject.toml b/pyproject.toml index f54d436..a60bde7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,14 +1,40 @@ +[build-system] +requires = ["setuptools>=61.0", "wheel"] +build-backend = "setuptools.build_meta" + [project] name = "kikotools" description = "Simple tools for ComfyUI" -version = "1.0.5" -license = {file = "LICENSE"} -dependencies = ["# Development dependencies for ComfyUI-KikoTools", "# Testing framework", "pytest>=7.0.0", "pytest-cov>=4.0.0", "pytest-mock>=3.10.0", "# Code quality", "black>=23.0.0", "flake8>=6.0.0", "mypy>=1.0.0", "# Development utilities", "pre-commit>=3.0.0", "# ComfyUI testing (mock dependencies for unit tests)", "torch>=2.0.0", "numpy>=1.24.0", "pillow>=9.0.0"] +version = "1.0.6" +license = {text = "MIT"} +dependencies = [] + +[project.optional-dependencies] +dev = [ + # Testing framework + "pytest>=7.0.0", + "pytest-cov>=4.0.0", + "pytest-mock>=3.10.0", + # Code quality + "black>=23.0.0", + "flake8>=6.0.0", + "mypy>=1.0.0", + # Development utilities + "pre-commit>=3.0.0", + # ComfyUI testing (mock dependencies for unit tests) + "torch>=2.0.0", + "numpy>=1.24.0", + "pillow>=9.0.0" +] [project.urls] Repository = "https://github.com/ComfyAssets/ComfyUI-KikoTools" # Used by Comfy Registry https://registry.comfy.org +[tool.setuptools.packages.find] +include = ["kikotools*"] +exclude = ["tests*", "web*"] + [tool.comfy] PublisherId = "kiko9" DisplayName = "ComfyUI-KikoTools" From 4ff6067dad0f971eb4c1dac0c0f85bf6bbb698cf Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Wed, 23 Jul 2025 13:29:46 -0700 Subject: [PATCH 2/6] refactor(compact_node): update sampler return type --- kikotools/tools/sampler_combo/compact_node.py | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/kikotools/tools/sampler_combo/compact_node.py b/kikotools/tools/sampler_combo/compact_node.py index 24c9690..642b4f0 100644 --- a/kikotools/tools/sampler_combo/compact_node.py +++ b/kikotools/tools/sampler_combo/compact_node.py @@ -60,14 +60,14 @@ class SamplerComboCompactNode(ComfyAssetsBaseNode): } } - RETURN_TYPES = (SAMPLERS, SCHEDULERS, "INT", "FLOAT") + RETURN_TYPES = ("SAMPLER", SCHEDULERS, "INT", "FLOAT") RETURN_NAMES = ("sampler", "scheduler", "steps", "cfg") FUNCTION = "get_combo" CATEGORY = "ComfyAssets" def get_combo( self, sampler: str, sched: str, steps: int, cfg: float - ) -> Tuple[str, str, int, float]: + ) -> Tuple[object, str, int, float]: """ Get compact sampler combo configuration. @@ -78,17 +78,32 @@ class SamplerComboCompactNode(ComfyAssetsBaseNode): cfg: CFG scale value Returns: - Tuple of (sampler, scheduler, steps, cfg) + Tuple of (sampler_object, scheduler, steps, cfg) """ try: # Use the same validation logic but with compact interface result = get_sampler_combo(sampler, sched, steps, cfg) - return result + # Create the sampler object + try: + import comfy.samplers + + sampler_obj = comfy.samplers.sampler_object(result[0]) + except ImportError: + # Return sampler name for testing + sampler_obj = result[0] + return (sampler_obj, result[1], result[2], result[3]) except Exception as e: # Graceful fallback self.handle_error(f"Error in compact combo: {str(e)}") - return ("euler", "normal", 20, 7.0) + try: + import comfy.samplers + + sampler_obj = comfy.samplers.sampler_object("euler") + except ImportError: + # Return sampler name for testing + sampler_obj = "euler" + return (sampler_obj, "normal", 20, 7.0) def __str__(self) -> str: """String representation of the compact node.""" From 22f62bf7b461a9245c29f98b857fe83478acbdd0 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Wed, 23 Jul 2025 13:56:45 -0700 Subject: [PATCH 3/6] test: Update test assertions for sampler combo node --- tests/unit/tools/test_sampler_combo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/unit/tools/test_sampler_combo.py b/tests/unit/tools/test_sampler_combo.py index aa3b813..c786429 100644 --- a/tests/unit/tools/test_sampler_combo.py +++ b/tests/unit/tools/test_sampler_combo.py @@ -168,17 +168,17 @@ class TestSamplerComboNode: steps_input = required["steps"] assert steps_input[0] == "INT" assert steps_input[1]["min"] == 1 - assert steps_input[1]["max"] == 1000 + assert steps_input[1]["max"] == 100 # Check CFG input structure cfg_input = required["cfg"] assert cfg_input[0] == "FLOAT" assert cfg_input[1]["min"] == 0.0 - assert cfg_input[1]["max"] == 30.0 + assert cfg_input[1]["max"] == 20.0 def test_return_types_structure(self): """Test that return types are correctly defined.""" - assert SamplerComboNode.RETURN_TYPES == (SAMPLERS, SCHEDULERS, "INT", "FLOAT") + assert SamplerComboNode.RETURN_TYPES == ("SAMPLER", SCHEDULERS, "INT", "FLOAT") assert SamplerComboNode.RETURN_NAMES == ( "sampler_name", "scheduler", From bbdd27f498e8c639131e509d49c7f154af0cb761 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Wed, 23 Jul 2025 13:56:57 -0700 Subject: [PATCH 4/6] fix(ci): correct return type in tests.yml configuration --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cae7ec0..852c1af 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -159,7 +159,7 @@ jobs: print('✓ Sampler Combo interface tests passed') # Test return types - assert node.RETURN_TYPES == (SAMPLERS, SCHEDULERS, 'INT', 'FLOAT') + assert node.RETURN_TYPES == ('SAMPLER', SCHEDULERS, 'INT', 'FLOAT') assert node.RETURN_NAMES == ('sampler_name', 'scheduler', 'steps', 'cfg') assert node.CATEGORY == 'ComfyAssets' print('✓ Sampler Combo return types tests passed') From a49071f8241038861838861f369e332a876277d5 Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Sat, 26 Jul 2025 14:15:39 -0700 Subject: [PATCH 5/6] fix(resolution_calculator): update scale factor tooltip --- kikotools/tools/resolution_calculator/node.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kikotools/tools/resolution_calculator/node.py b/kikotools/tools/resolution_calculator/node.py index a6bea31..4caffb9 100644 --- a/kikotools/tools/resolution_calculator/node.py +++ b/kikotools/tools/resolution_calculator/node.py @@ -38,12 +38,12 @@ class ResolutionCalculatorNode(ComfyAssetsBaseNode): "FLOAT", { "default": 2.0, - "min": 1.0, + "min": 0.1, "max": 8.0, "step": 0.1, "display": "slider", "tooltip": "Factor to scale the resolution by " - "(e.g., 2.0 for 2x upscale)", + "(e.g., 2.0 for 2x, 0.5 for half scale)", }, ), }, From c1128addc71ef97a3f9ddcfe80c5f37b0aa205ec Mon Sep 17 00:00:00 2001 From: Vito Sansevero Date: Sat, 26 Jul 2025 14:16:06 -0700 Subject: [PATCH 6/6] chore: bump version to 1.0.7 in pyproject.toml --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index a60bde7..8c5475a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta" [project] name = "kikotools" description = "Simple tools for ComfyUI" -version = "1.0.6" +version = "1.0.7" license = {text = "MIT"} dependencies = []