459 lines
32 KiB
Python
459 lines
32 KiB
Python
from .nodes.nodes import (
|
|
BOOLConstant, INTConstant, FloatConstant, StringConstant, StringConstantMultiline,
|
|
ScaleBatchPromptSchedule, GetLatentsFromBatchIndexed, ConditioningMultiCombine,
|
|
AppendStringsToList, JoinStrings, JoinStringMulti, CondPassThrough, ModelPassThrough,
|
|
ConditioningSetMaskAndCombine, ConditioningSetMaskAndCombine3,
|
|
ConditioningSetMaskAndCombine4, ConditioningSetMaskAndCombine5,
|
|
VRAM_Debug, SomethingToString, Sleep, EmptyLatentImagePresets,
|
|
EmptyLatentImageCustomPresets, WidgetToString, DummyOut, FlipSigmasAdjusted,
|
|
CustomSigmas, StringToFloatList, InjectNoiseToLatent, SoundReactive, GenerateNoise,
|
|
StableZero123_BatchSchedule, SV3D_BatchSchedule, Superprompt, CameraPoseVisualizer,
|
|
CheckpointPerturbWeights, DifferentialDiffusionAdvanced, FluxBlockLoraSelect,
|
|
HunyuanVideoBlockLoraSelect, Wan21BlockLoraSelect, LTX2BlockLoraSelect,
|
|
DiTBlockLoraLoader, CustomControlNetWeightsFluxFromList,
|
|
SetShakkerLabsUnionControlNetType, ModelSaveKJ, StyleModelApplyAdvanced,
|
|
AudioConcatenate, LeapfusionHunyuanI2V, ImageNoiseAugmentation, VAELoaderKJ, VAEMergeKJ,
|
|
ScheduledCFGGuidance, ApplyRifleXRoPE_WanVideo, ApplyRifleXRoPE_HunuyanVideo,
|
|
TimerNodeKJ, HunyuanVideoEncodeKeyframesToCond, LazySwitchKJ, LatentInpaintTTM,
|
|
SimpleCalculatorKJ, GetTrackRange, AddNoiseToTrackPath, VAEDecodeLoopKJ,
|
|
WanImageToVideoSVIPro, DeprecatedCompileNodeKJ, VisualizeSigmasKJ,
|
|
PreviewLatentNoiseMask, PlaySoundKJ,
|
|
)
|
|
from .nodes.curve_nodes import (
|
|
PlotCoordinates, SplineEditor, CreateShapeMaskOnPath, CreateShapeImageOnPath,
|
|
CreateTextOnPath, CreateGradientFromCoords, GradientToFloat, MaskOrImageToWeight,
|
|
WeightScheduleConvert, FloatToMask, WeightScheduleExtend, FloatToSigmas, SigmasToFloat,
|
|
GLIGENTextBoxApplyBatchCoords, CreateInstanceDiffusionTracking,
|
|
AppendInstanceDiffusionTracking, InterpolateCoords, DrawInstanceDiffusionTracking,
|
|
PointsEditor, CutAndDragOnPath,
|
|
)
|
|
from .nodes.batchcrop_nodes import (
|
|
BatchCropFromMask, BatchUncrop, BatchCropFromMaskAdvanced,
|
|
FilterZeroMasksAndCorrespondingImages, InsertImageBatchByIndexes, BatchUncropAdvanced,
|
|
SplitBboxes, BboxToInt, BboxVisualize,
|
|
)
|
|
from .nodes.audioscheduler_nodes import (
|
|
NormalizedAmplitudeToMask, NormalizedAmplitudeToFloatList,
|
|
OffsetMaskByNormalizedAmplitude, ImageTransformByNormalizedAmplitude,
|
|
)
|
|
from .nodes.image_nodes import (
|
|
ImagePass, ColorMatch, ColorMatchV2, SaveImageWithAlpha, ImageConcanate,
|
|
ImageConcatFromBatch, ImageGridComposite2x2, ImageGridComposite3x3,
|
|
ImageBatchTestPattern, ImageGrabPIL, Screencap_mss, ScreencapStream, WebcamCaptureCV2,
|
|
AddLabel, GetImageSizeAndCount, GetLatentSizeAndCount, ImageBatchRepeatInterleaving,
|
|
ImageUpscaleWithModelBatched, ImageNormalize_Neg1_To_1, RemapImageRange,
|
|
SplitImageChannels, MergeImageChannels, ImagePadForOutpaintMasked,
|
|
ImagePadForOutpaintTargetSize, ImagePrepForICLora, ImageAndMaskPreview,
|
|
CrossFadeImages, CrossFadeImagesMulti, TransitionImagesMulti, TransitionImagesInBatch,
|
|
ImageBatchJoinWithTransition, ShuffleImageBatch, GetImageRangeFromBatch,
|
|
RandomImageFromBatch, ImageBatchExtendWithOverlap, GetLatentRangeFromBatch,
|
|
InsertLatentToIndex, ImageBatchFilter, GetImagesFromBatchIndexed,
|
|
InsertImagesToBatchIndexed, PadImageBatchInterleaved, ReplaceImagesInBatch,
|
|
ReverseImageBatch, ImageBatchMulti, ImageTensorList, ImageAddMulti, ImageConcatMulti,
|
|
PreviewAnimation, ImageResizeKJ, ImageResizeKJv2, LoadAndResizeImage,
|
|
LoadImagesFromFolderKJ, ImageGridtoBatch, SaveImageKJ, SaveStringKJ, FastPreview,
|
|
FastPreviewBatch, ImageCropByMaskAndResize, ImageCropByMask, ImageUncropByMask,
|
|
ImageCropByMaskBatch, ImagePadKJ, LoadVideosFromFolder, EncodeVideoComponents,
|
|
DecodeAndSaveVideo, PreviewImageOrMask,
|
|
)
|
|
|
|
from .nodes.mask_nodes import (
|
|
BatchCLIPSeg, DownloadAndLoadCLIPSeg, CreateTextMask, ColorToMask, CreateFluidMask,
|
|
CreateAudioMask, CreateGradientMask, CreateFadeMask, CreateFadeMaskAdvanced,
|
|
CreateMagicMask, CreateShapeMask, CreateVoronoiMask, GetMaskSizeAndCount,
|
|
GrowMaskWithBlur, MaskBatchMulti, OffsetMask, RoundMask, ResizeMask, RemapMaskRange,
|
|
SeparateMasks, ConsolidateMasksKJ, DrawMaskOnImage, BlockifyMask,
|
|
)
|
|
from .nodes.model_optimization_nodes import (
|
|
PathchSageAttentionKJ, PatchFlashAttentionKJ, CheckpointLoaderKJ, DiffusionModelSelector,
|
|
DiffusionModelLoaderKJ, ModelPatchTorchSettings, PatchModelPatcherOrder,
|
|
TorchCompileModelFluxAdvancedV2, TorchCompileModelWanVideoV2,
|
|
TorchCompileModelAdvanced, TorchCompileVAE, TorchCompileControlNet,
|
|
WanVideoTeaCacheKJ, WanVideoEnhanceAVideoKJ, LTXVEnhanceAVideoKJ, WanVideoNAG, Krea2PromptWeight, MossImagePromptWeight,
|
|
SkipLayerGuidanceWanVideo, CFGZeroStarAndInit, GGUFLoaderKJ, NABLA_AttentionKJ,
|
|
StartRecordCUDAMemoryHistory, EndRecordCUDAMemoryHistory, VisualizeCUDAMemoryHistory,
|
|
ModelMemoryUseReportPatch, ModelMemoryUsageFactorOverride, WanChunkFeedForward,
|
|
SamplerSelfRefineVideo, PiDColorBiasCorrection, Ideogram4OptimizationsKJ,
|
|
)
|
|
from .nodes.lora_nodes import LoraExtractKJ, LoraReduceRank
|
|
from .nodes.image_transform_node import ImageTransformKJ, BBOXToBoundingBoxKJ
|
|
from .nodes.image_compare_node import ImageCompareKJ
|
|
from .nodes.sharpen_nodes import ImageSharpenKJ
|
|
from .nodes.nodes_looping import LOOP_NODES
|
|
from .nodes.hdr_preview_node import HDRPreviewKJ
|
|
from .nodes.preview_override_node import ModelPreviewOverrideKJ, GetPreviewOverrideFramesKJ
|
|
from .nodes.context_windows_visualizer import ContextWindowsVisualizerKJ
|
|
from .nodes.ideogram4_nodes import Ideogram4PromptBuilderKJ
|
|
from .nodes.flux3_nodes import Flux3PromptBuilderKJ, Flux3BoxReconcileKJ
|
|
from .nodes.moss_image_nodes import MossImagePromptBuilderKJ
|
|
|
|
import logging
|
|
|
|
NODE_CONFIG = {
|
|
#constants
|
|
"BOOLConstant": {"class": BOOLConstant, "name": "BOOL Constant"},
|
|
"INTConstant": {"class": INTConstant, "name": "INT Constant"},
|
|
"FloatConstant": {"class": FloatConstant, "name": "Float Constant"},
|
|
"StringConstant": {"class": StringConstant, "name": "String Constant"},
|
|
"StringConstantMultiline": {"class": StringConstantMultiline, "name": "String Constant Multiline"},
|
|
#conditioning
|
|
"ConditioningMultiCombine": {"class": ConditioningMultiCombine, "name": "Conditioning Multi Combine"},
|
|
"ConditioningSetMaskAndCombine": {"class": ConditioningSetMaskAndCombine, "name": "ConditioningSetMaskAndCombine"},
|
|
"ConditioningSetMaskAndCombine3": {"class": ConditioningSetMaskAndCombine3, "name": "ConditioningSetMaskAndCombine3"},
|
|
"ConditioningSetMaskAndCombine4": {"class": ConditioningSetMaskAndCombine4, "name": "ConditioningSetMaskAndCombine4"},
|
|
"ConditioningSetMaskAndCombine5": {"class": ConditioningSetMaskAndCombine5, "name": "ConditioningSetMaskAndCombine5"},
|
|
"CondPassThrough": {"class": CondPassThrough},
|
|
"WanImageToVideoSVIPro": {"class": WanImageToVideoSVIPro, "name": "Wan Image To Video SVIPro"},
|
|
#masking
|
|
"DrawMaskOnImage": {"class": DrawMaskOnImage, "name": "Draw Mask On Image"},
|
|
"DownloadAndLoadCLIPSeg": {"class": DownloadAndLoadCLIPSeg, "name": "(Down)load CLIPSeg"},
|
|
"BatchCLIPSeg": {"class": BatchCLIPSeg, "name": "Batch CLIPSeg"},
|
|
"BlockifyMask": {"class": BlockifyMask, "name": "Blockify Mask"},
|
|
"ColorToMask": {"class": ColorToMask, "name": "Color To Mask"},
|
|
"CreateGradientMask": {"class": CreateGradientMask, "name": "Create Gradient Mask"},
|
|
"CreateTextMask": {"class": CreateTextMask, "name": "Create Text Mask"},
|
|
"CreateAudioMask": {"class": CreateAudioMask, "name": "Create Audio Mask"},
|
|
"CreateFadeMask": {"class": CreateFadeMask, "name": "Create Fade Mask"},
|
|
"CreateFadeMaskAdvanced": {"class": CreateFadeMaskAdvanced, "name": "Create Fade Mask Advanced"},
|
|
"CreateFluidMask": {"class": CreateFluidMask, "name": "Create Fluid Mask"},
|
|
"CreateShapeMask": {"class": CreateShapeMask, "name": "Create Shape Mask"},
|
|
"CreateVoronoiMask": {"class": CreateVoronoiMask, "name": "Create Voronoi Mask"},
|
|
"CreateMagicMask": {"class": CreateMagicMask, "name": "Create Magic Mask"},
|
|
"GetMaskSizeAndCount": {"class": GetMaskSizeAndCount, "name": "Get Mask Size & Count"},
|
|
"GrowMaskWithBlur": {"class": GrowMaskWithBlur, "name": "Grow Mask With Blur"},
|
|
"MaskBatchMulti": {"class": MaskBatchMulti, "name": "Mask Batch Multi"},
|
|
"OffsetMask": {"class": OffsetMask, "name": "Offset Mask"},
|
|
"RemapMaskRange": {"class": RemapMaskRange, "name": "Remap Mask Range"},
|
|
"ResizeMask": {"class": ResizeMask, "name": "Resize Mask"},
|
|
"RoundMask": {"class": RoundMask, "name": "Round Mask"},
|
|
"SeparateMasks": {"class": SeparateMasks, "name": "Separate Masks"},
|
|
"ConsolidateMasksKJ": {"class": ConsolidateMasksKJ, "name": "Consolidate Masks"},
|
|
#images
|
|
"AddLabel": {"class": AddLabel, "name": "Add Label"},
|
|
"ColorMatch": {"class": ColorMatch, "name": "Color Match"},
|
|
"ColorMatchV2": {"class": ColorMatchV2, "name": "Color Match V2"},
|
|
"ImageTensorList": {"class": ImageTensorList, "name": "Image Tensor List"},
|
|
"CrossFadeImages": {"class": CrossFadeImages, "name": "Cross Fade Images"},
|
|
"CrossFadeImagesMulti": {"class": CrossFadeImagesMulti, "name": "Cross Fade Images Multi"},
|
|
"GetImagesFromBatchIndexed": {"class": GetImagesFromBatchIndexed, "name": "Get Images From Batch Indexed"},
|
|
"GetImageRangeFromBatch": {"class": GetImageRangeFromBatch, "name": "Get Image or Mask Range From Batch"},
|
|
"RandomImageFromBatch": {"class": RandomImageFromBatch, "name": "Random Image From Batch"},
|
|
"GetLatentRangeFromBatch": {"class": GetLatentRangeFromBatch, "name": "Get Latent Range From Batch"},
|
|
"GetLatentSizeAndCount": {"class": GetLatentSizeAndCount, "name": "Get Latent Size & Count"},
|
|
"GetImageSizeAndCount": {"class": GetImageSizeAndCount, "name": "Get Image Size & Count"},
|
|
"FastPreview": {"class": FastPreview, "name": "Fast Preview"},
|
|
"FastPreviewBatch": {"class": FastPreviewBatch, "name": "Fast Preview Batch"},
|
|
"ImageBatchFilter": {"class": ImageBatchFilter, "name": "Image Batch Filter"},
|
|
"ImageAndMaskPreview": {"class": ImageAndMaskPreview},
|
|
"ImageAddMulti": {"class": ImageAddMulti, "name": "Image Add Multi"},
|
|
"ImageBatchJoinWithTransition": {"class": ImageBatchJoinWithTransition, "name": "Image Batch Join With Transition"},
|
|
"ImageBatchMulti": {"class": ImageBatchMulti, "name": "Image Batch Multi"},
|
|
"ImageBatchRepeatInterleaving": {"class": ImageBatchRepeatInterleaving},
|
|
"ImageBatchTestPattern": {"class": ImageBatchTestPattern, "name": "Image Batch Test Pattern"},
|
|
"ImageConcanate": {"class": ImageConcanate, "name": "Image Concatenate"},
|
|
"ImageConcatFromBatch": {"class": ImageConcatFromBatch, "name": "Image Concatenate From Batch"},
|
|
"ImageConcatMulti": {"class": ImageConcatMulti, "name": "Image Concatenate Multi"},
|
|
"ImageCropByMask": {"class": ImageCropByMask, "name": "Image Crop By Mask"},
|
|
"ImageCropByMaskAndResize": {"class": ImageCropByMaskAndResize, "name": "Image Crop By Mask And Resize"},
|
|
"ImageCropByMaskBatch": {"class": ImageCropByMaskBatch, "name": "Image Crop By Mask Batch"},
|
|
"ImageUncropByMask": {"class": ImageUncropByMask, "name": "Image Uncrop By Mask"},
|
|
"ImageBatchExtendWithOverlap": {"class": ImageBatchExtendWithOverlap, "name": "Image Batch Extend With Overlap"},
|
|
"ImageGrabPIL": {"class": ImageGrabPIL, "name": "Image Grab PIL"},
|
|
"ImageGridComposite2x2": {"class": ImageGridComposite2x2, "name": "Image Grid Composite 2x2"},
|
|
"ImageGridComposite3x3": {"class": ImageGridComposite3x3, "name": "Image Grid Composite 3x3"},
|
|
"ImageGridtoBatch": {"class": ImageGridtoBatch, "name": "Image Grid To Batch"},
|
|
"ImageNoiseAugmentation": {"class": ImageNoiseAugmentation, "name": "Image Noise Augmentation"},
|
|
"ImageNormalize_Neg1_To_1": {"class": ImageNormalize_Neg1_To_1, "name": "Image Normalize -1 to 1"},
|
|
"ImagePass": {"class": ImagePass},
|
|
"ImagePadKJ": {"class": ImagePadKJ, "name": "ImagePad KJ"},
|
|
"ImagePadForOutpaintMasked": {"class": ImagePadForOutpaintMasked, "name": "Image Pad For Outpaint Masked"},
|
|
"ImagePadForOutpaintTargetSize": {"class": ImagePadForOutpaintTargetSize, "name": "Image Pad For Outpaint Target Size"},
|
|
"ImagePrepForICLora": {"class": ImagePrepForICLora, "name": "Image Prep For ICLora"},
|
|
"ImageResizeKJ": {"class": ImageResizeKJ, "name": "Resize Image (deprecated)"},
|
|
"ImageResizeKJv2": {"class": ImageResizeKJv2, "name": "Resize Image v2"},
|
|
"ImageUpscaleWithModelBatched": {"class": ImageUpscaleWithModelBatched, "name": "Image Upscale With Model Batched"},
|
|
"InsertImagesToBatchIndexed": {"class": InsertImagesToBatchIndexed, "name": "Insert Images To Batch Indexed"},
|
|
"InsertLatentToIndexed": {"class": InsertLatentToIndex, "name": "Insert Latent To Index"},
|
|
"LoadAndResizeImage": {"class": LoadAndResizeImage, "name": "Load & Resize Image"},
|
|
"LoadImagesFromFolderKJ": {"class": LoadImagesFromFolderKJ, "name": "Load Images From Folder (KJ)"},
|
|
"LoadVideosFromFolder": {"class": LoadVideosFromFolder, "name": "Load Videos From Folder"},
|
|
"MergeImageChannels": {"class": MergeImageChannels, "name": "Merge Image Channels"},
|
|
"PadImageBatchInterleaved": {"class": PadImageBatchInterleaved, "name": "Pad Image Batch Interleaved"},
|
|
"PreviewAnimation": {"class": PreviewAnimation, "name": "Preview Animation"},
|
|
"RemapImageRange": {"class": RemapImageRange, "name": "Remap Image Range"},
|
|
"ReverseImageBatch": {"class": ReverseImageBatch, "name": "Reverse Image Batch"},
|
|
"ReplaceImagesInBatch": {"class": ReplaceImagesInBatch, "name": "Replace Images In Batch"},
|
|
"SaveImageWithAlpha": {"class": SaveImageWithAlpha, "name": "Save Image With Alpha"},
|
|
"SaveImageKJ": {"class": SaveImageKJ, "name": "Save Image KJ"},
|
|
"ShuffleImageBatch": {"class": ShuffleImageBatch, "name": "Shuffle Image Batch"},
|
|
"SplitImageChannels": {"class": SplitImageChannels, "name": "Split Image Channels"},
|
|
"TransitionImagesMulti": {"class": TransitionImagesMulti, "name": "Transition Images Multi"},
|
|
"TransitionImagesInBatch": {"class": TransitionImagesInBatch, "name": "Transition Images In Batch"},
|
|
"EncodeVideoComponents": {"class": EncodeVideoComponents, "name": "Encode Video Components"},
|
|
"DecodeAndSaveVideo": {"class": DecodeAndSaveVideo, "name": "Decode And Save Video"},
|
|
"ImageTransformKJ": {"class": ImageTransformKJ, "name": "Image Transform KJ"},
|
|
"ImageCompareKJ": {"class": ImageCompareKJ, "name": "Image Compare KJ"},
|
|
"BBOXToBoundingBoxKJ": {"class": BBOXToBoundingBoxKJ, "name": "BBOX to Bounding Box KJ"},
|
|
"Ideogram4PromptBuilderKJ": {"class": Ideogram4PromptBuilderKJ, "name": "Ideogram 4 Prompt Builder KJ"},
|
|
"Flux3PromptBuilderKJ": {"class": Flux3PromptBuilderKJ, "name": "FLUX.3 Prompt Builder KJ"},
|
|
"Flux3BoxReconcileKJ": {"class": Flux3BoxReconcileKJ, "name": "FLUX.3 Box Reconcile KJ"},
|
|
"MossImagePromptBuilderKJ": {"class": MossImagePromptBuilderKJ, "name": "MOSS-Image Prompt Builder KJ"},
|
|
"HDRPreviewKJ": {"class": HDRPreviewKJ, "name": "HDR Preview KJ"},
|
|
"ModelPreviewOverrideKJ": {"class": ModelPreviewOverrideKJ, "name": "Model Preview Override KJ"},
|
|
"GetPreviewOverrideFramesKJ": {"class": GetPreviewOverrideFramesKJ, "name": "Get Preview Override Frames KJ"},
|
|
"PreviewImageOrMask": {"class": PreviewImageOrMask, "name": "Preview Image Or Mask"},
|
|
"ImageSharpenKJ": {"class": ImageSharpenKJ, "name": "Image Sharpen KJ"},
|
|
#batch cropping
|
|
"BatchCropFromMask": {"class": BatchCropFromMask, "name": "Batch Crop From Mask"},
|
|
"BatchCropFromMaskAdvanced": {"class": BatchCropFromMaskAdvanced, "name": "Batch Crop From Mask Advanced"},
|
|
"FilterZeroMasksAndCorrespondingImages": {"class": FilterZeroMasksAndCorrespondingImages},
|
|
"InsertImageBatchByIndexes": {"class": InsertImageBatchByIndexes, "name": "Insert Image Batch By Indexes"},
|
|
"BatchUncrop": {"class": BatchUncrop, "name": "Batch Uncrop"},
|
|
"BatchUncropAdvanced": {"class": BatchUncropAdvanced, "name": "Batch Uncrop Advanced"},
|
|
"SplitBboxes": {"class": SplitBboxes, "name": "Split Bboxes"},
|
|
"BboxToInt": {"class": BboxToInt, "name": "Bbox To Int"},
|
|
"BboxVisualize": {"class": BboxVisualize, "name": "Bbox Visualize"},
|
|
#noise
|
|
"GenerateNoise": {"class": GenerateNoise, "name": "Generate Noise"},
|
|
"FlipSigmasAdjusted": {"class": FlipSigmasAdjusted, "name": "Flip Sigmas Adjusted"},
|
|
"InjectNoiseToLatent": {"class": InjectNoiseToLatent, "name": "Inject Noise To Latent"},
|
|
"CustomSigmas": {"class": CustomSigmas, "name": "Custom Sigmas"},
|
|
#utility
|
|
"StringToFloatList": {"class": StringToFloatList, "name": "String to Float List"},
|
|
"WidgetToString": {"class": WidgetToString, "name": "Widget To String"},
|
|
"SaveStringKJ": {"class": SaveStringKJ, "name": "Save String KJ"},
|
|
"DummyOut": {"class": DummyOut, "name": "Dummy Out"},
|
|
"GetLatentsFromBatchIndexed": {"class": GetLatentsFromBatchIndexed, "name": "Get Latents From Batch Indexed"},
|
|
"ScaleBatchPromptSchedule": {"class": ScaleBatchPromptSchedule, "name": "Scale Batch Prompt Schedule"},
|
|
"CameraPoseVisualizer": {"class": CameraPoseVisualizer, "name": "Camera Pose Visualizer"},
|
|
"AppendStringsToList": {"class": AppendStringsToList, "name": "Append Strings To List"},
|
|
"JoinStrings": {"class": JoinStrings, "name": "Join Strings"},
|
|
"JoinStringMulti": {"class": JoinStringMulti, "name": "Join String Multi"},
|
|
"SimpleCalculatorKJ": {"class": SimpleCalculatorKJ, "name": "Simple Calculator KJ"},
|
|
"SomethingToString": {"class": SomethingToString, "name": "Something To String"},
|
|
"Sleep": {"class": Sleep, "name": "Sleep"},
|
|
"VRAM_Debug": {"class": VRAM_Debug, "name": "VRAM Debug"},
|
|
"EmptyLatentImagePresets": {"class": EmptyLatentImagePresets, "name": "Empty Latent Image Presets"},
|
|
"EmptyLatentImageCustomPresets": {"class": EmptyLatentImageCustomPresets, "name": "Empty Latent Image Custom Presets"},
|
|
"ModelPassThrough": {"class": ModelPassThrough, "name": "ModelPass"},
|
|
"ModelSaveKJ": {"class": ModelSaveKJ, "name": "Model Save KJ"},
|
|
"SetShakkerLabsUnionControlNetType": {"class": SetShakkerLabsUnionControlNetType, "name": "Set Shakker Labs Union ControlNet Type"},
|
|
"StyleModelApplyAdvanced": {"class": StyleModelApplyAdvanced, "name": "Style Model Apply Advanced"},
|
|
"DiffusionModelSelector": {"class": DiffusionModelSelector, "name": "Diffusion Model Selector"},
|
|
"LazySwitchKJ": {"class": LazySwitchKJ, "name": "Lazy Switch KJ"},
|
|
"VisualizeSigmasKJ": {"class": VisualizeSigmasKJ, "name": "Visualize Sigmas KJ"},
|
|
#audioscheduler stuff
|
|
"NormalizedAmplitudeToMask": {"class": NormalizedAmplitudeToMask},
|
|
"NormalizedAmplitudeToFloatList": {"class": NormalizedAmplitudeToFloatList},
|
|
"OffsetMaskByNormalizedAmplitude": {"class": OffsetMaskByNormalizedAmplitude},
|
|
"ImageTransformByNormalizedAmplitude": {"class": ImageTransformByNormalizedAmplitude},
|
|
"AudioConcatenate": {"class": AudioConcatenate},
|
|
#curve nodes
|
|
"SplineEditor": {"class": SplineEditor, "name": "Spline Editor"},
|
|
"CreateShapeImageOnPath": {"class": CreateShapeImageOnPath, "name": "Create Shape Image On Path"},
|
|
"CreateShapeMaskOnPath": {"class": CreateShapeMaskOnPath, "name": "Create Shape Mask On Path"},
|
|
"CreateTextOnPath": {"class": CreateTextOnPath, "name": "Create Text On Path"},
|
|
"CreateGradientFromCoords": {"class": CreateGradientFromCoords, "name": "Create Gradient From Coords"},
|
|
"CutAndDragOnPath": {"class": CutAndDragOnPath, "name": "Cut And Drag On Path"},
|
|
"GradientToFloat": {"class": GradientToFloat, "name": "Gradient To Float"},
|
|
"WeightScheduleExtend": {"class": WeightScheduleExtend, "name": "Weight Schedule Extend"},
|
|
"MaskOrImageToWeight": {"class": MaskOrImageToWeight, "name": "Mask Or Image To Weight"},
|
|
"WeightScheduleConvert": {"class": WeightScheduleConvert, "name": "Weight Schedule Convert"},
|
|
"FloatToMask": {"class": FloatToMask, "name": "Float To Mask"},
|
|
"FloatToSigmas": {"class": FloatToSigmas, "name": "Float To Sigmas"},
|
|
"SigmasToFloat": {"class": SigmasToFloat, "name": "Sigmas To Float"},
|
|
"PlotCoordinates": {"class": PlotCoordinates, "name": "Plot Coordinates"},
|
|
"InterpolateCoords": {"class": InterpolateCoords, "name": "Interpolate Coords"},
|
|
"PointsEditor": {"class": PointsEditor, "name": "Points Editor"},
|
|
#experimental
|
|
"SoundReactive": {"class": SoundReactive, "name": "Sound Reactive"},
|
|
"StableZero123_BatchSchedule": {"class": StableZero123_BatchSchedule, "name": "Stable Zero123 Batch Schedule"},
|
|
"SV3D_BatchSchedule": {"class": SV3D_BatchSchedule, "name": "SV3D Batch Schedule"},
|
|
"Superprompt": {"class": Superprompt, "name": "Superprompt"},
|
|
"GLIGENTextBoxApplyBatchCoords": {"class": GLIGENTextBoxApplyBatchCoords},
|
|
"CheckpointPerturbWeights": {"class": CheckpointPerturbWeights, "name": "CheckpointPerturbWeights"},
|
|
"Screencap_mss": {"class": Screencap_mss, "name": "Screencap mss"},
|
|
"ScreencapStream": {"class": ScreencapStream, "name": "Screencap Stream"},
|
|
"WebcamCaptureCV2": {"class": WebcamCaptureCV2, "name": "Webcam Capture CV2"},
|
|
"DifferentialDiffusionAdvanced": {"class": DifferentialDiffusionAdvanced, "name": "Differential Diffusion Advanced"},
|
|
"DiTBlockLoraLoader": {"class": DiTBlockLoraLoader, "name": "DiT Block Lora Loader"},
|
|
"FluxBlockLoraSelect": {"class": FluxBlockLoraSelect, "name": "Flux Block Lora Select"},
|
|
"HunyuanVideoBlockLoraSelect": {"class": HunyuanVideoBlockLoraSelect, "name": "Hunyuan Video Block Lora Select"},
|
|
"Wan21BlockLoraSelect": {"class": Wan21BlockLoraSelect, "name": "Wan21 Block Lora Select"},
|
|
"LTX2BlockLoraSelect": {"class": LTX2BlockLoraSelect, "name": "LTX2 Block Lora Select"},
|
|
"CustomControlNetWeightsFluxFromList": {"class": CustomControlNetWeightsFluxFromList, "name": "Custom ControlNet Weights Flux From List"},
|
|
"CheckpointLoaderKJ": {"class": CheckpointLoaderKJ, "name": "CheckpointLoaderKJ"},
|
|
"DiffusionModelLoaderKJ": {"class": DiffusionModelLoaderKJ, "name": "Diffusion Model Loader KJ"},
|
|
"TorchCompileModelFluxAdvancedV2": {"class": TorchCompileModelFluxAdvancedV2, "name": "TorchCompileModelFluxAdvancedV2"},
|
|
"TorchCompileVAE": {"class": TorchCompileVAE, "name": "TorchCompileVAE"},
|
|
"TorchCompileControlNet": {"class": TorchCompileControlNet, "name": "TorchCompileControlNet"},
|
|
"TorchCompileModelWanVideoV2": {"class": TorchCompileModelWanVideoV2, "name": "TorchCompileModelWanVideoV2"},
|
|
"PathchSageAttentionKJ": {"class": PathchSageAttentionKJ, "name": "Patch Sage Attention KJ"},
|
|
"PatchFlashAttentionKJ": {"class": PatchFlashAttentionKJ, "name": "Patch Flash Attention KJ"},
|
|
"LeapfusionHunyuanI2VPatcher": {"class": LeapfusionHunyuanI2V, "name": "Leapfusion Hunyuan I2V Patcher"},
|
|
"VAELoaderKJ": {"class": VAELoaderKJ, "name": "VAELoader KJ"},
|
|
"VAEMergeKJ": {"class": VAEMergeKJ, "name": "VAE Merge KJ"},
|
|
"VAEDecodeLoopKJ": {"class": VAEDecodeLoopKJ, "name": "VAE Decode Loop KJ"},
|
|
"ScheduledCFGGuidance": {"class": ScheduledCFGGuidance, "name": "Scheduled CFG Guidance"},
|
|
"ApplyRifleXRoPE_HunuyanVideo": {"class": ApplyRifleXRoPE_HunuyanVideo, "name": "Apply RifleXRoPE HunuyanVideo"},
|
|
"ApplyRifleXRoPE_WanVideo": {"class": ApplyRifleXRoPE_WanVideo, "name": "Apply RifleXRoPE WanVideo"},
|
|
"WanVideoTeaCacheKJ": {"class": WanVideoTeaCacheKJ, "name": "WanVideo Tea Cache (native)"},
|
|
"WanVideoEnhanceAVideoKJ": {"class": WanVideoEnhanceAVideoKJ, "name": "WanVideo Enhance A Video (native)"},
|
|
"SkipLayerGuidanceWanVideo": {"class": SkipLayerGuidanceWanVideo, "name": "Skip Layer Guidance WanVideo"},
|
|
"TimerNodeKJ": {"class": TimerNodeKJ, "name": "Timer Node KJ"},
|
|
"HunyuanVideoEncodeKeyframesToCond": {"class": HunyuanVideoEncodeKeyframesToCond, "name": "HunyuanVideo Encode Keyframes To Cond"},
|
|
"CFGZeroStarAndInit": {"class": CFGZeroStarAndInit, "name": "CFG Zero Star/Init"},
|
|
"PiDColorBiasCorrection": {"class": PiDColorBiasCorrection, "name": "PiD Color Bias Correction"},
|
|
"ModelPatchTorchSettings": {"class": ModelPatchTorchSettings, "name": "Model Patch Torch Settings"},
|
|
"WanVideoNAG": {"class": WanVideoNAG, "name": "WanVideoNAG"},
|
|
"Krea2PromptWeight": {"class": Krea2PromptWeight, "name": "Krea2 Prompt Weight"},
|
|
"MossImagePromptWeight": {"class": MossImagePromptWeight, "name": "MOSS-Image Prompt Weight"},
|
|
"GGUFLoaderKJ": {"class": GGUFLoaderKJ, "name": "GGUF Loader KJ"},
|
|
"LatentInpaintTTM": {"class": LatentInpaintTTM, "name": "Latent Inpaint TTM"},
|
|
"NABLA_AttentionKJ": {"class": NABLA_AttentionKJ, "name": "NABLA Attention KJ"},
|
|
"TorchCompileModelAdvanced": {"class": TorchCompileModelAdvanced, "name": "TorchCompileModelAdvanced"},
|
|
"StartRecordCUDAMemoryHistory": {"class": StartRecordCUDAMemoryHistory, "name": "Start Recording CUDAMemory History"},
|
|
"EndRecordCUDAMemoryHistory": {"class": EndRecordCUDAMemoryHistory, "name": "End Recording CUDAMemory History"},
|
|
"VisualizeCUDAMemoryHistory": {"class": VisualizeCUDAMemoryHistory, "name": "Visualize CUDAMemory History"},
|
|
"PreviewLatentNoiseMask": {"class": PreviewLatentNoiseMask, "name": "Preview Latent Noise Mask"},
|
|
"ModelMemoryUseReportPatch": {"class": ModelMemoryUseReportPatch, "name": "Model Memory Use Report Patch"},
|
|
"ModelMemoryUsageFactorOverride": {"class": ModelMemoryUsageFactorOverride, "name": "Model Memory Usage Factor Override"},
|
|
"WanChunkFeedForward": {"class": WanChunkFeedForward, "name": "Wan ChunkFeedForward"},
|
|
"Ideogram4OptimizationsKJ": {"class": Ideogram4OptimizationsKJ, "name": "Ideogram4 Optimizations KJ"},
|
|
"SamplerSelfRefineVideo": {"class": SamplerSelfRefineVideo, "name": "Sampler SelfRefineVideo"},
|
|
"PlaySoundKJ": {"class": PlaySoundKJ, "name": "Play Sound KJ"},
|
|
|
|
#instance diffusion
|
|
"CreateInstanceDiffusionTracking": {"class": CreateInstanceDiffusionTracking},
|
|
"AppendInstanceDiffusionTracking": {"class": AppendInstanceDiffusionTracking},
|
|
"DrawInstanceDiffusionTracking": {"class": DrawInstanceDiffusionTracking},
|
|
|
|
#lora
|
|
"LoraExtractKJ": {"class": LoraExtractKJ, "name": "LoraExtractKJ"},
|
|
"LoraReduceRankKJ": {"class": LoraReduceRank, "name": "LoraReduceRank"},
|
|
#looping
|
|
**{n.GET_SCHEMA().node_id: {"class": n, "name": n.GET_SCHEMA().display_name} for n in LOOP_NODES},
|
|
|
|
#tracks
|
|
"GetTrackRange": {"class": GetTrackRange, "name": "Get Track Range"},
|
|
"AddNoiseToTrackPath": {"class": AddNoiseToTrackPath, "name": "Add Noise To Track"},
|
|
|
|
#context windows
|
|
"ContextWindowsVisualizerKJ": {"class": ContextWindowsVisualizerKJ, "name": "Context Windows Visualizer (KJ)"},
|
|
# deprecated
|
|
"PatchModelPatcherOrder": {"class": PatchModelPatcherOrder, "name": "Patch Model Patcher Order"},
|
|
"TorchCompileModelFluxAdvanced": {"class": DeprecatedCompileNodeKJ, "name": "TorchCompileModelFluxAdvanced"},
|
|
"TorchCompileLTXModel": {"class": DeprecatedCompileNodeKJ, "name": "TorchCompileLTXModel"},
|
|
"TorchCompileCosmosModel": {"class": DeprecatedCompileNodeKJ, "name": "TorchCompileCosmosModel"},
|
|
"TorchCompileModelHyVideo": {"class": DeprecatedCompileNodeKJ, "name": "TorchCompileModelHyVideo"},
|
|
"TorchCompileModelQwenImage": {"class": DeprecatedCompileNodeKJ, "name": "TorchCompileModelQwenImage"},
|
|
"TorchCompileModelWanVideo": {"class": DeprecatedCompileNodeKJ, "name": "TorchCompileModelWanVideo"},
|
|
}
|
|
|
|
#ltxv
|
|
try:
|
|
from .nodes.ltxv_nodes import (
|
|
LTXVAddGuideMulti, LTXVAddGuidesFromBatch, LTXVAudioVideoMask, LTX2_NAG,
|
|
LTXVChunkFeedForward, LTX2SamplingPreviewOverride,
|
|
LTX2AudioLatentNormalizingSampling, LTXVImgToVideoInplaceKJ,
|
|
LTX2AttentionTunerPatch, LTX2MemoryEfficientSageAttentionPatch,
|
|
LTX2LoraLoaderAdvanced, WanVideoMemoryEfficientSageAttentionPatch,
|
|
MiniMaxH3MemoryEfficientSageAttentionPatch,
|
|
)
|
|
NODE_CONFIG.update({
|
|
"LTXVEnhanceAVideoKJ": {"class": LTXVEnhanceAVideoKJ, "name": "LTXV Enhance A Video KJ"},
|
|
"LTXVAddGuideMulti": {"class": LTXVAddGuideMulti, "name": "LTXV Add Guide Multi"},
|
|
"LTXVAddGuidesFromBatch": {"class": LTXVAddGuidesFromBatch, "name": "LTXV Add Guides From Batch"},
|
|
"LTXVAudioVideoMask": {"class": LTXVAudioVideoMask, "name": "LTXV Audio Video Mask"},
|
|
"LTX2_NAG": {"class": LTX2_NAG, "name": "LTX2 NAG"},
|
|
"LTXVChunkFeedForward": {"class": LTXVChunkFeedForward, "name": "LTXV Chunk Feed Forward"},
|
|
"LTX2SamplingPreviewOverride": {"class": LTX2SamplingPreviewOverride, "name": "LTX2 Sampling Preview Override"},
|
|
"LTX2AudioLatentNormalizingSampling": {"class": LTX2AudioLatentNormalizingSampling, "name": "LTX2 Audio Latent Normalizing Sampling"},
|
|
"LTXVImgToVideoInplaceKJ": {"class": LTXVImgToVideoInplaceKJ, "name": "LTXV Img To Video Inplace KJ"},
|
|
"LTX2AttentionTunerPatch": {"class": LTX2AttentionTunerPatch, "name": "LTX2 Attention Tuner Patch"},
|
|
"LTX2MemoryEfficientSageAttentionPatch": {"class": LTX2MemoryEfficientSageAttentionPatch, "name": "LTX2 Memory Efficient Sage Attention Patch"},
|
|
"LTX2LoraLoaderAdvanced": {"class": LTX2LoraLoaderAdvanced, "name": "LTX2 Lora Loader Advanced"},
|
|
"WanVideoMemoryEfficientSageAttentionPatch": {"class": WanVideoMemoryEfficientSageAttentionPatch, "name": "WanVideo Memory Efficient Sage Attention Patch"},
|
|
"MiniMaxH3MemoryEfficientSageAttentionPatch": {"class": MiniMaxH3MemoryEfficientSageAttentionPatch, "name": "MiniMax H3 Memory Efficient Sage Attention Patch"},
|
|
})
|
|
except Exception as e:
|
|
logging.warning(f"KJNodes: LTXV nodes could not be imported. LTXV nodes will be unavailable. Error: {e}", exc_info=True)
|
|
|
|
#minimax
|
|
try:
|
|
from .nodes.minimax_nodes import MiniMaxChunkFeedForward, MiniMaxLowVRAMAttention, MiniMaxH3TokenCounter
|
|
NODE_CONFIG.update({
|
|
"MiniMaxChunkFeedForward": {"class": MiniMaxChunkFeedForward, "name": "MiniMax H3 ChunkFeedForward"},
|
|
"MiniMaxLowVRAMAttention": {"class": MiniMaxLowVRAMAttention, "name": "MiniMax H3 Low VRAM Attention"},
|
|
"MiniMaxH3TokenCounter": {"class": MiniMaxH3TokenCounter, "name": "MiniMax H3 Token Counter"},
|
|
})
|
|
except Exception as e:
|
|
logging.warning(f"KJNodes: MiniMax nodes could not be imported. MiniMax nodes will be unavailable. Error: {e}", exc_info=True)
|
|
|
|
try:
|
|
from .nodes.triton_vae import PatchTritonVAE
|
|
NODE_CONFIG.update({
|
|
"PatchTritonVAE": {"class": PatchTritonVAE, "name": "Patch Triton VAE"},
|
|
})
|
|
except Exception:
|
|
logging.warning("KJNodes: PatchTritonVAE node could not be imported. PatchTritonVAE will be unavailable.", exc_info=True)
|
|
|
|
def generate_node_mappings(node_config):
|
|
node_class_mappings = {}
|
|
node_display_name_mappings = {}
|
|
|
|
for node_name, node_info in node_config.items():
|
|
node_class_mappings[node_name] = node_info["class"]
|
|
node_display_name_mappings[node_name] = node_info.get("name", node_info["class"].__name__)
|
|
|
|
return node_class_mappings, node_display_name_mappings
|
|
|
|
NODE_CLASS_MAPPINGS, NODE_DISPLAY_NAME_MAPPINGS = generate_node_mappings(NODE_CONFIG)
|
|
|
|
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
|
|
|
|
WEB_DIRECTORY = "./web"
|
|
|
|
from aiohttp import web
|
|
from server import PromptServer
|
|
from pathlib import Path
|
|
|
|
if hasattr(PromptServer, "instance"):
|
|
# NOTE: we add an extra static path to avoid comfy mechanism that loads every script in web.
|
|
if not PromptServer.instance.app.router.frozen:
|
|
try:
|
|
PromptServer.instance.app.add_routes(
|
|
[web.static("/kjweb_async", (Path(__file__).parent.absolute() / "kjweb_async").as_posix())]
|
|
)
|
|
except Exception:
|
|
logging.exception("KJNodes: failed to register /kjweb_async static route")
|
|
|
|
import asyncio
|
|
import os
|
|
import folder_paths
|
|
|
|
@PromptServer.instance.routes.post("/kjnodes/model_mtimes")
|
|
async def kjnodes_model_mtimes(request):
|
|
# modified times for a combo's model files (Nodes 2.0 folder view date sort); only names already in a model folder listing
|
|
try:
|
|
values = (await request.json()).get("values")
|
|
except Exception:
|
|
values = None
|
|
if not isinstance(values, list):
|
|
return web.json_response({"error": "values must be a list"}, status=400)
|
|
wanted = {v for v in values[:50000] if isinstance(v, str)}
|
|
|
|
def stat():
|
|
# the combo list came from object_info, so its folder is already in the filename cache; pick the best match
|
|
folder, names = max(((name, wanted.intersection(entry[0])) for name, entry in list(folder_paths.filename_list_cache.items())),
|
|
key=lambda x: len(x[1]), default=(None, set()))
|
|
out = {}
|
|
for name in names:
|
|
try:
|
|
out[name] = os.path.getmtime(folder_paths.get_full_path(folder, name))
|
|
except (OSError, TypeError):
|
|
pass
|
|
return out
|
|
|
|
return web.json_response(await asyncio.to_thread(stat))
|