Files
arcum42-ComfyUI_SageUtils/__init__.py
T

384 lines
14 KiB
Python

import os
# Initialize performance timing as early as possible
from .utils.performance_timer import python_timer, record_initialization_milestone
record_initialization_milestone("IMPORTS_START")
# Import all node classes
from .nodes import *
record_initialization_milestone("NODES_IMPORTED")
# Import utility functions and objects
from .utils import cache, config_manager
record_initialization_milestone("UTILS_IMPORTED")
from .utils.llm_wrapper import init_llm
record_initialization_milestone("LLM_WRAPPER_IMPORTED")
ENABLE_TRAINING_NODES = True
# Initialize components
cache.load()
record_initialization_milestone("CACHE_LOADED")
# Initialize settings using the enhanced settings system
try:
from .utils.settings import get_settings, get_sage_config
settings = get_settings() # This will load, validate, and set defaults
sage_config = get_sage_config() # Backwards compatibility
record_initialization_milestone("SETTINGS_LOADED")
except ImportError as e:
sage_config = config_manager.settings_manager.data
record_initialization_milestone("SETTINGS_FALLBACK")
# Load other configuration data
sage_styles = config_manager.styles_manager.data
llm_prompts = config_manager.prompts_manager.data
metadata_templates = config_manager.metadata_template_manager.data
record_initialization_milestone("CONFIG_DATA_LOADED")
# Initialize LLM functionality
init_llm()
record_initialization_milestone("LLM_INITIALIZED")
# Import LLM availability flags for conditional node registration
from .utils import llm_wrapper as llm
record_initialization_milestone("LLM_FLAGS_IMPORTED")
# Import server routes to register custom HTTP endpoints
try:
from . import server_routes
record_initialization_milestone("SERVER_ROUTES_LOADED")
except Exception as e:
print(f"Warning: Failed to load SageUtils custom routes: {e}")
record_initialization_milestone("SERVER_ROUTES_FAILED")
WEB_DIRECTORY = "./js"
# Currently, we have to have two mappings: one for the class names and one for the display names.
# I've broken them up into sections to make it easier to manage.
#
# When the new node api is released, this information will be in the individual classes, and
# this will be obsolete.
#
# See: https://github.com/comfyanonymous/ComfyUI/tree/v3-definition
# and: https://github.com/comfyanonymous/ComfyUI/tree/v3-definition-wip
#
# v3 will require reimplementation of all nodes.
SELECTOR_CLASS_MAPPINGS = {
"Sage_TilingInfo": Sage_TilingInfo,
"Sage_ModelShifts": Sage_ModelShifts,
"Sage_FreeU2": Sage_FreeU2,
"Sage_ModelShiftOnly": Sage_ModelShiftOnly,
"Sage_CheckpointSelector": Sage_CheckpointSelector,
"Sage_UNETSelector": Sage_UNETSelector,
"Sage_CLIPSelector": Sage_CLIPSelector,
"Sage_DualCLIPSelector": Sage_DualCLIPSelector,
"Sage_TripleCLIPSelector": Sage_TripleCLIPSelector,
"Sage_QuadCLIPSelector": Sage_QuadCLIPSelector,
"Sage_VAESelector": Sage_VAESelector,
"Sage_UnetClipVaeToModelInfo": Sage_UnetClipVaeToModelInfo
}
TEXT_CLASS_MAPPINGS = {
"Sage_SetText": Sage_SetText,
"Sage_SetTextWithInt": Sage_SetTextWithInt,
"Sage_TextSwitch": Sage_TextSwitch,
"SageSetWildcardText": SageSetWildcardText,
"Sage_TextSubstitution": Sage_TextSubstitution,
"Sage_JoinText": Sage_JoinText,
"Sage_TripleJoinText": Sage_TripleJoinText,
"Sage_CleanText": Sage_CleanText,
"Sage_TextSelectLine": Sage_TextSelectLine,
"Sage_TextRandomLine": Sage_TextRandomLine,
"Sage_TextWeight": Sage_TextWeight,
"Sage_IntToStr": Sage_IntToStr,
"Sage_FloatToStr": Sage_FloatToStr,
"Sage_ViewAnything": Sage_ViewAnything,
"Sage_ViewNotes": Sage_ViewNotes,
"Sage_SaveText": Sage_SaveText,
"Sage_PonyPrefix": Sage_PonyPrefix,
"Sage_PonyStyle": Sage_PonyStyle,
"Sage_HiDreamE1_Instruction": Sage_HiDreamE1_Instruction
}
LOADER_CLASS_MAPPINGS = {
"Sage_LoadModelFromInfo": Sage_LoadModelFromInfo,
"Sage_UNETLoaderFromInfo": Sage_UNETLoaderFromInfo,
"Sage_CLIPLoaderFromInfo": Sage_CLIPLoaderFromInfo,
"Sage_ChromaCLIPLoaderFromInfo": Sage_ChromaCLIPLoaderFromInfo,
"Sage_VAELoaderFromInfo": Sage_VAELoaderFromInfo,
"Sage_LoraStackLoader": Sage_LoraStackLoader,
"Sage_ModelLoraStackLoader": Sage_ModelLoraStackLoader,
"Sage_UNETLoRALoader": Sage_UNETLoRALoader,
}
MODEL_CLASS_MAPPINGS = {
"Sage_ModelInfo": Sage_ModelInfo,
"Sage_ModelInfoDisplay": Sage_ModelInfoDisplay,
"Sage_LastLoraInfo": Sage_LastLoraInfo,
"Sage_CheckLorasForUpdates": Sage_CheckLorasForUpdates,
"Sage_CacheMaintenance": Sage_CacheMaintenance,
"Sage_ModelReport": Sage_ModelReport,
"Sage_MultiModelPicker": Sage_MultiModelPicker
}
LORA_CLASS_MAPPINGS = {
"Sage_LoraStack": Sage_LoraStack,
"Sage_QuickLoraStack": Sage_QuickLoraStack,
"Sage_TripleLoraStack": Sage_TripleLoraStack,
"Sage_SixLoraStack": Sage_SixLoraStack,
"Sage_TripleQuickLoraStack": Sage_TripleQuickLoraStack,
"Sage_QuickSixLoraStack": Sage_QuickSixLoraStack,
"Sage_QuickNineLoraStack": Sage_QuickNineLoraStack,
"Sage_CollectKeywordsFromLoraStack": Sage_CollectKeywordsFromLoraStack,
"Sage_LoraStackInfoDisplay": Sage_LoraStackInfoDisplay
}
CLIP_CLASS_MAPPINGS = {
"Sage_DualCLIPTextEncode": Sage_DualCLIPTextEncode,
"Sage_DualCLIPTextEncodeLumina2": Sage_DualCLIPTextEncodeLumina2,
"Sage_DualCLIPTextEncodeQwen": Sage_DualCLIPTextEncodeQwen,
"Sage_ConditioningZeroOut": Sage_ConditioningZeroOut
}
SAMPLER_CLASS_MAPPINGS = {
"Sage_SamplerInfo": Sage_SamplerInfo,
"Sage_AdvSamplerInfo": Sage_AdvSamplerInfo,
"Sage_SamplerSelector": Sage_SamplerSelector,
"Sage_SchedulerSelector": Sage_SchedulerSelector,
"Sage_KSampler": Sage_KSampler,
"Sage_KSamplerTiledDecoder": Sage_KSamplerTiledDecoder,
"Sage_KSamplerAudioDecoder": Sage_KSamplerAudioDecoder
}
IMAGE_CLASS_MAPPINGS = {
"Sage_LoadImage": Sage_LoadImage,
"Sage_EmptyLatentImagePassthrough": Sage_EmptyLatentImagePassthrough,
"Sage_SaveImageWithMetadata": Sage_SaveImageWithMetadata,
"Sage_QuickResPicker": Sage_QuickResPicker,
"Sage_GuessResolutionByRatio": Sage_GuessResolutionByRatio,
"Sage_CubiqImageResize": Sage_CubiqImageResize,
"Sage_CropImage": Sage_CropImage,
"Sage_ReferenceImage": Sage_ReferenceImage
}
TRAINING_CLASS_MAPPINGS = {
#"Sage_LoadImageTextSetFromFolderNode": Sage_LoadImageTextSetFromFolderNode,
"Sage_Load_Dataset_From_Folder": Sage_Load_Dataset_From_Folder,
"Sage_TrainingCaptionsToConditioning": Sage_TrainingCaptionsToConditioning
}
METADATA_CLASS_MAPPINGS = {
"Sage_ConstructMetadata": Sage_ConstructMetadata,
"Sage_ConstructMetadataLite": Sage_ConstructMetadataLite,
"Sage_ConstructMetadataFlexible": Sage_ConstructMetadataFlexible
}
OLLAMA_CLASS_MAPPINGS = {
"Sage_OllamaLLMPromptText": Sage_OllamaLLMPromptText,
"Sage_OllamaLLMPromptVision": Sage_OllamaLLMPromptVision,
"Sage_OllamaLLMPromptVisionRefine": Sage_OllamaLLMPromptVisionRefine
}
LMSTUDIO_CLASS_MAPPINGS = {
"Sage_LMStudioLLMPromptVision": Sage_LMStudioLLMPromptVision,
"Sage_LMStudioLLMPromptText": Sage_LMStudioLLMPromptText,
"Sage_LMStudioLLMPromptVisionRefine": Sage_LMStudioLLMPromptVisionRefine
}
LLM_CLASS_MAPPINGS = {
"Sage_ConstructLLMPrompt": Sage_ConstructLLMPrompt,
"Sage_ConstructLLMPromptExtra": Sage_ConstructLLMPromptExtra
}
UTILITY_CLASS_MAPPINGS = {
"Sage_GetFileHash": Sage_GetFileHash,
"Sage_LogicalSwitch": Sage_LogicalSwitch,
"Sage_Halt": Sage_Halt,
"Sage_FreeMemory": Sage_FreeMemory
}
if llm.OLLAMA_AVAILABLE:
LLM_CLASS_MAPPINGS = LLM_CLASS_MAPPINGS | OLLAMA_CLASS_MAPPINGS
if llm.LMSTUDIO_AVAILABLE:
LLM_CLASS_MAPPINGS = LLM_CLASS_MAPPINGS | LMSTUDIO_CLASS_MAPPINGS
# A dictionary that contains all nodes you want to export with their names
# NOTE: names should be globally unique
NODE_CLASS_MAPPINGS = UTILITY_CLASS_MAPPINGS | SELECTOR_CLASS_MAPPINGS | TEXT_CLASS_MAPPINGS | \
LOADER_CLASS_MAPPINGS| MODEL_CLASS_MAPPINGS | LORA_CLASS_MAPPINGS | CLIP_CLASS_MAPPINGS | SAMPLER_CLASS_MAPPINGS | \
IMAGE_CLASS_MAPPINGS | METADATA_CLASS_MAPPINGS | LLM_CLASS_MAPPINGS
if ENABLE_TRAINING_NODES:
NODE_CLASS_MAPPINGS = NODE_CLASS_MAPPINGS | TRAINING_CLASS_MAPPINGS
SELECTOR_NAME_MAPPINGS = {
"Sage_TilingInfo": "Tiling Info",
"Sage_ModelShifts": "Model Shifts",
"Sage_FreeU2": "Free U2 Selector",
"Sage_ModelShiftOnly": "Model Shift Only",
"Sage_CheckpointSelector": "Checkpoint Selector",
"Sage_UNETSelector": "UNET Selector",
"Sage_CLIPSelector": "CLIP Selector",
"Sage_DualCLIPSelector": "Dual CLIP Selector",
"Sage_TripleCLIPSelector": "Triple CLIP Selector",
"Sage_QuadCLIPSelector": "Quad CLIP Selector",
"Sage_VAESelector": "VAE Selector",
"Sage_UnetClipVaeToModelInfo": "UNET + CLIP + VAE"
}
TEXT_NAME_MAPPINGS = {
"Sage_SetText": "Set Text",
"Sage_SetTextWithInt": "Text w/ Int",
"Sage_TextSwitch": "Text Switch",
"SageSetWildcardText": "Set Text (Wildcards)",
"Sage_TextSubstitution": "Text Substitution",
"Sage_JoinText": "Join Text",
"Sage_TripleJoinText": "Join Text x3",
"Sage_CleanText": "Clean Text",
"Sage_TextSelectLine": "Select Line from Text",
"Sage_TextRandomLine": "Random Line from Text",
"Sage_TextWeight": "Text Weight",
"Sage_IntToStr": "Int to String",
"Sage_FloatToStr": "Float to String",
"Sage_ViewAnything": "View Any Node as Text",
"Sage_ViewNotes": "View Notes",
"Sage_SaveText": "Save Text",
"Sage_PonyPrefix": "Add Pony v6 Prefixes",
"Sage_PonyStyle": "Add Pony Style",
"Sage_HiDreamE1_Instruction": "HiDreamE1 Instruction"
}
LOADER_NAME_MAPPINGS = {
"Sage_LoadModelFromInfo": "Load Models",
"Sage_ModelLoraStackLoader": "Load Models + Loras",
"Sage_UNETLoaderFromInfo": "Load UNET Model <- Info",
"Sage_CLIPLoaderFromInfo": "Load CLIP Model <- Info",
"Sage_ChromaCLIPLoaderFromInfo": "Load CLIP (w/ Chroma T5 Options)",
"Sage_VAELoaderFromInfo": "Load VAE Model <- Info",
"Sage_LoraStackLoader": "Lora Stack Loader",
"Sage_UNETLoRALoader": "Load UNET + LoRA (Model Only)"
}
MODEL_NAME_MAPPINGS = {
"Sage_ModelInfo": "Pull Model Info",
"Sage_ModelInfoDisplay": "Display Model Info",
"Sage_LastLoraInfo": "Last Lora Info",
"Sage_CollectKeywordsFromLoraStack": "Lora Stack -> Keywords",
"Sage_CheckLorasForUpdates": "Check Loras for Updates",
"Sage_CacheMaintenance": "Cache Maintenance",
"Sage_ModelReport": "Model Scan & Report",
"Sage_MultiModelPicker": "Multi Model Picker"
}
LORA_NAME_MAPPINGS = {
"Sage_LoraStack": "Simple Lora Stack",
"Sage_QuickLoraStack": "Quick Lora Stack",
"Sage_TripleLoraStack": "Lora Stack (x3)",
"Sage_SixLoraStack": "Lora Stack (x6)",
"Sage_TripleQuickLoraStack": "Quick Lora Stack (x3)",
"Sage_QuickSixLoraStack": "Quick Lora Stack (x6)",
"Sage_QuickNineLoraStack": "Quick Lora Stack (x9)",
"Sage_LoraStackInfoDisplay": "Display LoRA Stack Info"
}
CLIP_NAME_MAPPINGS = {
"Sage_DualCLIPTextEncode": "Dual Prompt Encode",
"Sage_DualCLIPTextEncodeLumina2": "Dual Prompt Encode (Lumina 2)",
"Sage_DualCLIPTextEncodeQwen": "Dual Prompt Encode (Qwen Image Edit)",
"Sage_ConditioningZeroOut": "Zero Conditioning"
}
SAMPLER_NAME_MAPPINGS = {
"Sage_SamplerInfo": "KSampler Info",
"Sage_AdvSamplerInfo": "Adv KSampler Info",
"Sage_SamplerSelector": "Sampler Selector",
"Sage_SchedulerSelector": "Scheduler Selector",
"Sage_KSampler": "KSampler w/ Sampler Info",
"Sage_KSamplerTiledDecoder": "KSampler + Tiled Decoder",
"Sage_KSamplerAudioDecoder": "KSampler + Audio Decoder"
}
IMAGE_NAME_MAPPINGS = {
"Sage_EmptyLatentImagePassthrough": "Empty Latent Passthrough",
"Sage_LoadImage": "Load Image w/ Size & Metadata",
"Sage_SaveImageWithMetadata": "Save Image w/ Added Metadata",
"Sage_QuickResPicker": "Quick Resolution Picker",
"Sage_GuessResolutionByRatio": "Guess Close Resolution by Ratio",
"Sage_CubiqImageResize": "Image Resize (from Essentials)",
"Sage_CropImage": "Sage Image Crop",
"Sage_ReferenceImage": "Reference Image"
}
TRAINING_NAME_MAPPINGS = {
#"Sage_LoadImageTextSetFromFolderNode": "Load Image(s) from Folder (Set Text)",
"Sage_Load_Dataset_From_Folder": "Load Dataset from Folder",
"Sage_TrainingCaptionsToConditioning": "Captions to Conditioning"
}
METADATA_NAME_MAPPINGS = {
"Sage_ConstructMetadata": "Construct Metadata",
"Sage_ConstructMetadataLite": "Construct Metadata Lite",
"Sage_ConstructMetadataFlexible": "Construct Metadata (Flexible)"
}
OLLAMA_NAME_MAPPINGS = {
"Sage_OllamaLLMPromptText": "Ollama LLM Prompt (Text)",
"Sage_OllamaLLMPromptVision": "Ollama LLM Prompt (Vision)",
"Sage_OllamaLLMPromptVisionRefine": "Ollama LLM Prompt (Vision) Refined"
}
LMSTUDIO_NAME_MAPPINGS = {
"Sage_LMStudioLLMPromptVision": "LM Studio LLM Prompt (Vision)",
"Sage_LMStudioLLMPromptText": "LM Studio LLM Prompt (Text)",
"Sage_LMStudioLLMPromptVisionRefine": "LM Studio LLM Prompt (Vision) Refined"
}
LLM_NAME_MAPPINGS = {
"Sage_ConstructLLMPrompt": "Construct LLM Prompt",
"Sage_ConstructLLMPromptExtra": "Construct LLM Prompt Extra"
}
UTILITY_NAME_MAPPINGS = {
"Sage_GetFileHash": "Get Sha256 Hash",
"Sage_LogicalSwitch": "Switch",
"Sage_Halt": "Halt Workflow",
"Sage_FreeMemory": "Free Memory"
}
if llm.OLLAMA_AVAILABLE:
LLM_NAME_MAPPINGS = LLM_NAME_MAPPINGS | OLLAMA_NAME_MAPPINGS
if llm.LMSTUDIO_AVAILABLE:
LLM_NAME_MAPPINGS = LLM_NAME_MAPPINGS | LMSTUDIO_NAME_MAPPINGS
# A dictionary that contains the friendly/human readable titles for the nodes
NODE_DISPLAY_NAME_MAPPINGS = UTILITY_NAME_MAPPINGS | SELECTOR_NAME_MAPPINGS | TEXT_NAME_MAPPINGS | \
LOADER_NAME_MAPPINGS | MODEL_NAME_MAPPINGS | LORA_NAME_MAPPINGS | CLIP_NAME_MAPPINGS | SAMPLER_NAME_MAPPINGS | \
IMAGE_NAME_MAPPINGS | METADATA_NAME_MAPPINGS | LLM_NAME_MAPPINGS
if ENABLE_TRAINING_NODES:
NODE_DISPLAY_NAME_MAPPINGS = NODE_DISPLAY_NAME_MAPPINGS | TRAINING_NAME_MAPPINGS
record_initialization_milestone("NODE_MAPPINGS_CREATED")
# Complete initialization timing
from .utils.performance_timer import complete_initialization, print_timing_report
total_init_time = complete_initialization()
# Start background LLM cache population to avoid delays during node use
try:
from .utils.performance_fix import populate_llm_cache_async
populate_llm_cache_async()
except Exception as e:
print(f"Warning: Failed to start background LLM cache population: {e}")
# Print timing report if enabled via environment variable
if os.environ.get('SAGEUTILS_PRINT_TIMING', '').lower() in ('1', 'true', 'yes'):
print_timing_report()
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS', 'WEB_DIRECTORY']