mirror of
https://github.com/willmiao/ComfyUI-Lora-Manager.git
synced 2026-03-25 07:05:43 -03:00
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:
@@ -234,11 +234,9 @@ class CivitaiClient:
|
|||||||
if not self._session:
|
if not self._session:
|
||||||
return None
|
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}")
|
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'):
|
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
|
return None
|
||||||
|
|
||||||
# Get hash from the first file
|
# Get hash from the first file
|
||||||
@@ -248,7 +246,6 @@ class CivitaiClient:
|
|||||||
hash_value = file_info['hashes']['SHA256'].lower()
|
hash_value = file_info['hashes']['SHA256'].lower()
|
||||||
return hash_value
|
return hash_value
|
||||||
|
|
||||||
logger.warning(f"No SHA256 hash found in version info for ID: {model_version_id}")
|
|
||||||
return None
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error getting hash from Civitai: {e}")
|
logger.error(f"Error getting hash from Civitai: {e}")
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ class RecipeScanner:
|
|||||||
lora['hash'] = hash_from_civitai
|
lora['hash'] = hash_from_civitai
|
||||||
metadata_updated = True
|
metadata_updated = True
|
||||||
else:
|
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 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']):
|
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)
|
version_info = await self._civitai_client.get_model_version_info(model_version_id)
|
||||||
|
|
||||||
if not version_info or not version_info.get('files'):
|
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
|
return None
|
||||||
|
|
||||||
# Get hash from the first file
|
# Get hash from the first file
|
||||||
@@ -269,7 +269,7 @@ class RecipeScanner:
|
|||||||
if file_info.get('hashes', {}).get('SHA256'):
|
if file_info.get('hashes', {}).get('SHA256'):
|
||||||
return file_info['hashes']['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
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error getting hash from Civitai: {e}")
|
logger.error(f"Error getting hash from Civitai: {e}")
|
||||||
@@ -286,7 +286,7 @@ class RecipeScanner:
|
|||||||
if version_info and 'name' in version_info:
|
if version_info and 'name' in version_info:
|
||||||
return version_info['name']
|
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
|
return None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error getting model version name from Civitai: {e}")
|
logger.error(f"Error getting model version name from Civitai: {e}")
|
||||||
|
|||||||
@@ -6,9 +6,6 @@ from typing import Dict, Any, List
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Import the mapper registration functions from the parent module
|
|
||||||
from workflow.mappers import create_mapper, register_mapper
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Transform Functions
|
# Transform Functions
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -121,11 +118,11 @@ def transform_checkpoint_loader(inputs: Dict) -> Dict:
|
|||||||
return {"checkpoint": ckpt_name} if ckpt_name else {}
|
return {"checkpoint": ckpt_name} if ckpt_name else {}
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Register Mappers
|
# Node Mapper Definitions
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
# Define the mappers for ComfyUI core nodes not in main mapper
|
# Define the mappers for ComfyUI core nodes not in main mapper
|
||||||
COMFYUI_CORE_MAPPERS = {
|
NODE_MAPPERS_EXT = {
|
||||||
# KSamplers
|
# KSamplers
|
||||||
"SamplerCustomAdvanced": {
|
"SamplerCustomAdvanced": {
|
||||||
"inputs_to_track": ["noise", "guider", "sampler", "sigmas", "latent_image"],
|
"inputs_to_track": ["noise", "guider", "sampler", "sigmas", "latent_image"],
|
||||||
@@ -163,16 +160,4 @@ COMFYUI_CORE_MAPPERS = {
|
|||||||
"inputs_to_track": ["ckpt_name"],
|
"inputs_to_track": ["ckpt_name"],
|
||||||
"transform_func": transform_checkpoint_loader
|
"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")
|
|
||||||
@@ -7,9 +7,6 @@ from typing import Dict, Any
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
# Import the mapper registration functions from the parent module
|
|
||||||
from workflow.mappers import create_mapper, register_mapper
|
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Transform Functions
|
# Transform Functions
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
@@ -53,11 +50,11 @@ def transform_int_constant(inputs: Dict) -> int:
|
|||||||
return inputs.get("value", 0)
|
return inputs.get("value", 0)
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Register Mappers
|
# Node Mapper Definitions
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
# Define the mappers for KJNodes
|
# Define the mappers for KJNodes
|
||||||
KJNODES_MAPPERS = {
|
NODE_MAPPERS_EXT = {
|
||||||
"JoinStrings": {
|
"JoinStrings": {
|
||||||
"inputs_to_track": ["string1", "string2", "delimiter"],
|
"inputs_to_track": ["string1", "string2", "delimiter"],
|
||||||
"transform_func": transform_join_strings
|
"transform_func": transform_join_strings
|
||||||
@@ -74,16 +71,4 @@ KJNODES_MAPPERS = {
|
|||||||
"inputs_to_track": ["value"],
|
"inputs_to_track": ["value"],
|
||||||
"transform_func": transform_int_constant
|
"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")
|
|
||||||
@@ -303,8 +303,8 @@ NODE_MAPPERS = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def register_default_mappers() -> None:
|
def register_all_mappers() -> None:
|
||||||
"""Register all default mappers from the NODE_MAPPERS dictionary"""
|
"""Register all mappers from the NODE_MAPPERS dictionary"""
|
||||||
for node_type, config in NODE_MAPPERS.items():
|
for node_type, config in NODE_MAPPERS.items():
|
||||||
mapper = create_mapper(
|
mapper = create_mapper(
|
||||||
node_type=node_type,
|
node_type=node_type,
|
||||||
@@ -312,7 +312,7 @@ def register_default_mappers() -> None:
|
|||||||
transform_func=config["transform_func"]
|
transform_func=config["transform_func"]
|
||||||
)
|
)
|
||||||
register_mapper(mapper)
|
register_mapper(mapper)
|
||||||
logger.info(f"Registered {len(NODE_MAPPERS)} default node mappers")
|
logger.info(f"Registered {len(NODE_MAPPERS)} node mappers")
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# Extension Loading
|
# Extension Loading
|
||||||
@@ -322,8 +322,8 @@ def load_extensions(ext_dir: str = None) -> None:
|
|||||||
"""
|
"""
|
||||||
Load mapper extensions from the specified directory
|
Load mapper extensions from the specified directory
|
||||||
|
|
||||||
Extension files should define mappers using the create_mapper function
|
Extension files should define a NODE_MAPPERS_EXT dictionary containing mapper configurations.
|
||||||
and then call register_mapper to add them to the registry.
|
These will be added to the global NODE_MAPPERS dictionary and registered automatically.
|
||||||
"""
|
"""
|
||||||
# Use default path if none provided
|
# Use default path if none provided
|
||||||
if ext_dir is None:
|
if ext_dir is None:
|
||||||
@@ -349,9 +349,19 @@ def load_extensions(ext_dir: str = None) -> None:
|
|||||||
if spec and spec.loader:
|
if spec and spec.loader:
|
||||||
module = importlib.util.module_from_spec(spec)
|
module = importlib.util.module_from_spec(spec)
|
||||||
spec.loader.exec_module(module)
|
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:
|
except Exception as e:
|
||||||
logger.warning(f"Error loading extension {filename}: {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
|
# Initialize the registry with default mappers
|
||||||
register_default_mappers()
|
# register_default_mappers()
|
||||||
@@ -15,14 +15,13 @@ logger = logging.getLogger(__name__)
|
|||||||
class WorkflowParser:
|
class WorkflowParser:
|
||||||
"""Parser for ComfyUI workflows"""
|
"""Parser for ComfyUI workflows"""
|
||||||
|
|
||||||
def __init__(self, load_extensions_on_init: bool = True):
|
def __init__(self):
|
||||||
"""Initialize the parser with mappers"""
|
"""Initialize the parser with mappers"""
|
||||||
self.processed_nodes: Set[str] = set() # Track processed nodes to avoid cycles
|
self.processed_nodes: Set[str] = set() # Track processed nodes to avoid cycles
|
||||||
self.node_results_cache: Dict[str, Any] = {} # Cache for processed node results
|
self.node_results_cache: Dict[str, Any] = {} # Cache for processed node results
|
||||||
|
|
||||||
# Load extensions if requested
|
# Load extensions
|
||||||
if load_extensions_on_init:
|
load_extensions()
|
||||||
load_extensions()
|
|
||||||
|
|
||||||
def process_node(self, node_id: str, workflow: Dict) -> Any:
|
def process_node(self, node_id: str, workflow: Dict) -> Any:
|
||||||
"""Process a single node and extract relevant information"""
|
"""Process a single node and extract relevant information"""
|
||||||
@@ -89,7 +88,7 @@ class WorkflowParser:
|
|||||||
|
|
||||||
# If we found SamplerCustomAdvanced nodes, return the first one
|
# If we found SamplerCustomAdvanced nodes, return the first one
|
||||||
if sampler_advanced_nodes:
|
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]
|
return sampler_advanced_nodes[0]
|
||||||
|
|
||||||
# If we have KSampler nodes, look for one with denoise=1.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)
|
# Check if denoise is 1.0 (allowing for small floating point differences)
|
||||||
if abs(float(denoise) - 1.0) < 0.001:
|
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
|
return node_id
|
||||||
|
|
||||||
# If no KSampler with denoise=1.0 found, use the first one
|
# 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]
|
return ksampler_nodes[0]
|
||||||
|
|
||||||
# No sampler nodes found
|
# No sampler nodes found
|
||||||
@@ -168,7 +167,6 @@ class WorkflowParser:
|
|||||||
|
|
||||||
# Process sampler node to extract parameters
|
# Process sampler node to extract parameters
|
||||||
sampler_result = self.process_node(sampler_node_id, workflow)
|
sampler_result = self.process_node(sampler_node_id, workflow)
|
||||||
logger.info(f"Sampler result: {sampler_result}")
|
|
||||||
if not sampler_result:
|
if not sampler_result:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user