From 5a93c40b7996f2aea82151c6129f95e47262e2d9 Mon Sep 17 00:00:00 2001 From: Will Miao <13051207myq@gmail.com> Date: Wed, 2 Apr 2025 10:29:31 +0800 Subject: [PATCH] Refactor logging levels and improve mapper registration - Changed warning logs to debug logs in CivitaiClient and RecipeScanner for better log granularity. - Updated the mapper registration function name for clarity and adjusted related logging messages. - Enhanced extension loading process to automatically register mappers from NODE_MAPPERS_EXT, improving modularity and maintainability. --- py/services/civitai_client.py | 3 --- py/services/recipe_scanner.py | 8 ++++---- py/workflow/ext/comfyui_core.py | 21 +++------------------ py/workflow/ext/kjnodes.py | 21 +++------------------ py/workflow/mappers.py | 24 +++++++++++++++++------- py/workflow/parser.py | 14 ++++++-------- 6 files changed, 33 insertions(+), 58 deletions(-) diff --git a/py/services/civitai_client.py b/py/services/civitai_client.py index 88dafaaf..fbd77739 100644 --- a/py/services/civitai_client.py +++ b/py/services/civitai_client.py @@ -234,11 +234,9 @@ class CivitaiClient: if not self._session: return None - logger.info(f"Fetching model version info from Civitai for ID: {model_version_id}") version_info = await self._session.get(f"{self.base_url}/model-versions/{model_version_id}") if not version_info or not version_info.json().get('files'): - logger.warning(f"No files found in version info for ID: {model_version_id}") return None # Get hash from the first file @@ -248,7 +246,6 @@ class CivitaiClient: hash_value = file_info['hashes']['SHA256'].lower() return hash_value - logger.warning(f"No SHA256 hash found in version info for ID: {model_version_id}") return None except Exception as e: logger.error(f"Error getting hash from Civitai: {e}") diff --git a/py/services/recipe_scanner.py b/py/services/recipe_scanner.py index 3db5f884..51590a3e 100644 --- a/py/services/recipe_scanner.py +++ b/py/services/recipe_scanner.py @@ -211,7 +211,7 @@ class RecipeScanner: lora['hash'] = hash_from_civitai metadata_updated = True else: - logger.warning(f"Could not get hash for modelVersionId {model_version_id}") + logger.debug(f"Could not get hash for modelVersionId {model_version_id}") # If has hash but no file_name, look up in lora library if 'hash' in lora and (not lora.get('file_name') or not lora['file_name']): @@ -261,7 +261,7 @@ class RecipeScanner: version_info = await self._civitai_client.get_model_version_info(model_version_id) if not version_info or not version_info.get('files'): - logger.warning(f"No files found in version info for ID: {model_version_id}") + logger.debug(f"No files found in version info for ID: {model_version_id}") return None # Get hash from the first file @@ -269,7 +269,7 @@ class RecipeScanner: if file_info.get('hashes', {}).get('SHA256'): return file_info['hashes']['SHA256'] - logger.warning(f"No SHA256 hash found in version info for ID: {model_version_id}") + logger.debug(f"No SHA256 hash found in version info for ID: {model_version_id}") return None except Exception as e: logger.error(f"Error getting hash from Civitai: {e}") @@ -286,7 +286,7 @@ class RecipeScanner: if version_info and 'name' in version_info: return version_info['name'] - logger.warning(f"No version name found for modelVersionId {model_version_id}") + logger.debug(f"No version name found for modelVersionId {model_version_id}") return None except Exception as e: logger.error(f"Error getting model version name from Civitai: {e}") diff --git a/py/workflow/ext/comfyui_core.py b/py/workflow/ext/comfyui_core.py index 73b56f41..125c29f0 100644 --- a/py/workflow/ext/comfyui_core.py +++ b/py/workflow/ext/comfyui_core.py @@ -6,9 +6,6 @@ from typing import Dict, Any, List logger = logging.getLogger(__name__) -# Import the mapper registration functions from the parent module -from workflow.mappers import create_mapper, register_mapper - # ============================================================================= # Transform Functions # ============================================================================= @@ -121,11 +118,11 @@ def transform_checkpoint_loader(inputs: Dict) -> Dict: return {"checkpoint": ckpt_name} if ckpt_name else {} # ============================================================================= -# Register Mappers +# Node Mapper Definitions # ============================================================================= # Define the mappers for ComfyUI core nodes not in main mapper -COMFYUI_CORE_MAPPERS = { +NODE_MAPPERS_EXT = { # KSamplers "SamplerCustomAdvanced": { "inputs_to_track": ["noise", "guider", "sampler", "sigmas", "latent_image"], @@ -163,16 +160,4 @@ COMFYUI_CORE_MAPPERS = { "inputs_to_track": ["ckpt_name"], "transform_func": transform_checkpoint_loader } -} - -# Register all ComfyUI core mappers -for node_type, config in COMFYUI_CORE_MAPPERS.items(): - mapper = create_mapper( - node_type=node_type, - inputs_to_track=config["inputs_to_track"], - transform_func=config["transform_func"] - ) - register_mapper(mapper) - logger.info(f"Registered ComfyUI core mapper for node type: {node_type}") - -logger.info(f"Loaded ComfyUI core extension with {len(COMFYUI_CORE_MAPPERS)} mappers") \ No newline at end of file +} \ No newline at end of file diff --git a/py/workflow/ext/kjnodes.py b/py/workflow/ext/kjnodes.py index ecab4cfd..8ea99d2c 100644 --- a/py/workflow/ext/kjnodes.py +++ b/py/workflow/ext/kjnodes.py @@ -7,9 +7,6 @@ from typing import Dict, Any logger = logging.getLogger(__name__) -# Import the mapper registration functions from the parent module -from workflow.mappers import create_mapper, register_mapper - # ============================================================================= # Transform Functions # ============================================================================= @@ -53,11 +50,11 @@ def transform_int_constant(inputs: Dict) -> int: return inputs.get("value", 0) # ============================================================================= -# Register Mappers +# Node Mapper Definitions # ============================================================================= # Define the mappers for KJNodes -KJNODES_MAPPERS = { +NODE_MAPPERS_EXT = { "JoinStrings": { "inputs_to_track": ["string1", "string2", "delimiter"], "transform_func": transform_join_strings @@ -74,16 +71,4 @@ KJNODES_MAPPERS = { "inputs_to_track": ["value"], "transform_func": transform_int_constant } -} - -# Register all KJNodes mappers -for node_type, config in KJNODES_MAPPERS.items(): - mapper = create_mapper( - node_type=node_type, - inputs_to_track=config["inputs_to_track"], - transform_func=config["transform_func"] - ) - register_mapper(mapper) - logger.info(f"Registered KJNodes mapper for node type: {node_type}") - -logger.info(f"Loaded KJNodes extension with {len(KJNODES_MAPPERS)} mappers") \ No newline at end of file +} \ No newline at end of file diff --git a/py/workflow/mappers.py b/py/workflow/mappers.py index f954cf54..156afb27 100644 --- a/py/workflow/mappers.py +++ b/py/workflow/mappers.py @@ -303,8 +303,8 @@ NODE_MAPPERS = { } } -def register_default_mappers() -> None: - """Register all default mappers from the NODE_MAPPERS dictionary""" +def register_all_mappers() -> None: + """Register all mappers from the NODE_MAPPERS dictionary""" for node_type, config in NODE_MAPPERS.items(): mapper = create_mapper( node_type=node_type, @@ -312,7 +312,7 @@ def register_default_mappers() -> None: transform_func=config["transform_func"] ) register_mapper(mapper) - logger.info(f"Registered {len(NODE_MAPPERS)} default node mappers") + logger.info(f"Registered {len(NODE_MAPPERS)} node mappers") # ============================================================================= # Extension Loading @@ -322,8 +322,8 @@ def load_extensions(ext_dir: str = None) -> None: """ Load mapper extensions from the specified directory - Extension files should define mappers using the create_mapper function - and then call register_mapper to add them to the registry. + Extension files should define a NODE_MAPPERS_EXT dictionary containing mapper configurations. + These will be added to the global NODE_MAPPERS dictionary and registered automatically. """ # Use default path if none provided if ext_dir is None: @@ -349,9 +349,19 @@ def load_extensions(ext_dir: str = None) -> None: if spec and spec.loader: module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) - logger.info(f"Loaded extension module: {filename}") + + # Check if the module defines NODE_MAPPERS_EXT + if hasattr(module, 'NODE_MAPPERS_EXT'): + # Add the extension mappers to the global NODE_MAPPERS dictionary + NODE_MAPPERS.update(module.NODE_MAPPERS_EXT) + logger.info(f"Added {len(module.NODE_MAPPERS_EXT)} mappers from extension: {filename}") + else: + logger.warning(f"Extension {filename} does not define NODE_MAPPERS_EXT dictionary") except Exception as e: logger.warning(f"Error loading extension {filename}: {e}") + + # Re-register all mappers after loading extensions + register_all_mappers() # Initialize the registry with default mappers -register_default_mappers() \ No newline at end of file +# register_default_mappers() \ No newline at end of file diff --git a/py/workflow/parser.py b/py/workflow/parser.py index 2c913173..bfae55a2 100644 --- a/py/workflow/parser.py +++ b/py/workflow/parser.py @@ -15,14 +15,13 @@ logger = logging.getLogger(__name__) class WorkflowParser: """Parser for ComfyUI workflows""" - def __init__(self, load_extensions_on_init: bool = True): + def __init__(self): """Initialize the parser with mappers""" self.processed_nodes: Set[str] = set() # Track processed nodes to avoid cycles self.node_results_cache: Dict[str, Any] = {} # Cache for processed node results - # Load extensions if requested - if load_extensions_on_init: - load_extensions() + # Load extensions + load_extensions() def process_node(self, node_id: str, workflow: Dict) -> Any: """Process a single node and extract relevant information""" @@ -89,7 +88,7 @@ class WorkflowParser: # If we found SamplerCustomAdvanced nodes, return the first one if sampler_advanced_nodes: - logger.info(f"Found SamplerCustomAdvanced node: {sampler_advanced_nodes[0]}") + logger.debug(f"Found SamplerCustomAdvanced node: {sampler_advanced_nodes[0]}") return sampler_advanced_nodes[0] # If we have KSampler nodes, look for one with denoise=1.0 @@ -101,11 +100,11 @@ class WorkflowParser: # Check if denoise is 1.0 (allowing for small floating point differences) if abs(float(denoise) - 1.0) < 0.001: - logger.info(f"Found KSampler node with denoise=1.0: {node_id}") + logger.debug(f"Found KSampler node with denoise=1.0: {node_id}") return node_id # If no KSampler with denoise=1.0 found, use the first one - logger.info(f"No KSampler with denoise=1.0 found, using first KSampler: {ksampler_nodes[0]}") + logger.debug(f"No KSampler with denoise=1.0 found, using first KSampler: {ksampler_nodes[0]}") return ksampler_nodes[0] # No sampler nodes found @@ -168,7 +167,6 @@ class WorkflowParser: # Process sampler node to extract parameters sampler_result = self.process_node(sampler_node_id, workflow) - logger.info(f"Sampler result: {sampler_result}") if not sampler_result: return {}