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.
This commit is contained in:
Will Miao
2025-04-02 10:29:31 +08:00
parent a8ec5af037
commit 5a93c40b79
6 changed files with 33 additions and 58 deletions

View File

@@ -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}")

View File

@@ -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}")

View File

@@ -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")
}

View File

@@ -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")
}

View File

@@ -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()
# register_default_mappers()

View File

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