Files
larsupbandClaude Opus 5 dad8a4a5ee Merge larsupb/main: samplers (2.3.0) + delta-space merge work (2.4.0)
larsupb/main carried the sampler rework, released and published to the Comfy
Registry as 2.3.0 on 2026-06-22. This branch had independently claimed 2.3.0
for the delta-space merge work, so that release is renumbered 2.4.0 and the
published 2.3.0 entry is kept intact below it in the changelog.

- README: both sides added a `## Changelog` at the same spot. Resolved by
  keeping the sampler entry as 2.3.0 and moving the merge work to 2.4.0.
- pyproject.toml / __init__.py -> 2.4.0.
- tests/conftest.py: mock comfy.sample and latent_preview, which the incoming
  sampler code imports. Without them collection failed for 6 test files --
  `comfy` is a MagicMock, not a package, so every submodule needs an explicit
  sys.modules entry.

Suite verified at 238 passed, both in-tree and from a copy outside the ComfyUI
tree where `import comfy` raises ModuleNotFoundError.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 11:54:20 +02:00

101 lines
4.0 KiB
Python

from .src.lora_apply import LoraApply
from .src.lora_block_sampler import LoRABlockSampler
from .src.lora_mergekit_merge import LoraMergerMergekit
from .src.lora_selector import LoRASelect
from .src.lora_dir_stacker import LoraStackFromDir
from .src.lora_decompose import LoraDecompose
from .src.lora_parameter_sweep_sampler import LoRAParameterSweepSampler
from .src.lora_power_stacker import LoraPowerStacker
from .src.nodes_block_selector import BlockSelector, KREA2Blocks, FluxKleinBlocks
from .src.lora_resize import LoraResizer
from .src.lora_save import LoraSave
from .src.lora_stack_sampler import LoRAStackSampler
from .src.nodes_lora_modifier import LoRAModifier
from .src.nodes_merge_methods import TaskArithmeticMergeMethod, NearSwapMergeMethod, SCEMergeMethod, BreadcrumbsMergeMethod, \
TIESMergeMethod, DAREMergeMethod, DELLAMergeMethod, SLERPMergeMethod, NuSlerpMergeMethod, \
KArcherMergeMethod
version_code = [2, 4, 0]
version_str = f"V{version_code[0]}.{version_code[1]}" + (f'.{version_code[2]}' if len(version_code) > 2 else '')
print(f"### Loading: ComfyUI LoRA-PowerMerge ({version_str})")
NODE_CLASS_MAPPINGS = {
"PM LoRA Merger (Mergekit)": LoraMergerMergekit,
"PM LoRA Power Stacker": LoraPowerStacker,
"PM LoRA Stacker (from Directory)": LoraStackFromDir,
"PM LoRA Select": LoRASelect,
"PM LoRA Stack Decompose": LoraDecompose,
"PM Block Selector": BlockSelector,
"PM KREA 2 Blocks": KREA2Blocks,
"PM FLUX.2.Klein Blocks": FluxKleinBlocks,
"PM LoRA Block Sampler": LoRABlockSampler,
"PM LoRA Stack Sampler": LoRAStackSampler,
"PM LoRA Parameter Sweep Sampler": LoRAParameterSweepSampler,
"PM Slerp (Mergekit)": SLERPMergeMethod,
"PM NuSlerp (Mergekit)": NuSlerpMergeMethod,
"PM NearSwap (Mergekit)": NearSwapMergeMethod,
"PM SCE (Mergekit)": SCEMergeMethod,
"PM KArcher (Mergekit)": KArcherMergeMethod,
"PM Task Arithmetic (Mergekit)": TaskArithmeticMergeMethod,
"PM Ties (Mergekit)": TIESMergeMethod,
"PM Breadcrumbs (Mergekit)": BreadcrumbsMergeMethod,
"PM Dare (Mergekit)": DAREMergeMethod,
"PM Della (Mergekit)": DELLAMergeMethod,
"PM LoRA Modifier": LoRAModifier,
"PM LoRA Resizer": LoraResizer,
"PM LoRA Apply": LoraApply,
"PM LoRA Save": LoraSave,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"PM LoRA Power Stacker": "PM LoRA Power Stacker",
"PM LoRA Stacker (from Directory)": "PM LoRA Stacker (from Directory)",
"PM LoRA Select": "PM LoRA Select",
"PM LoRA Stack Decompose": "PM LoRA Stack Decompose",
"PM Block Selector": "PM Block Selector",
"PM KREA 2 Blocks": "PM KREA 2 Blocks",
"PM FLUX.2.Klein Blocks": "PM FLUX.2.Klein Blocks",
"PM LoRA Merger (Mergekit)": "PM LoRA Merger",
"PM LoRA Block Sampler": "PM LoRA Block Sampler",
"PM LoRA Stack Sampler": "PM LoRA Stack Sampler",
"PM LoRA Parameter Sweep Sampler": "PM LoRA Parameter Sweep Sampler",
# Still genuinely mergekit-backed — keep the suffix.
"PM Slerp (Mergekit)": "PM Slerp (Mergekit)",
"PM NuSlerp (Mergekit)": "PM NuSlerp (Mergekit)",
"PM NearSwap (Mergekit)": "PM NearSwap (Mergekit)",
"PM SCE (Mergekit)": "PM SCE (Mergekit)",
"PM KArcher (Mergekit)": "PM KArcher (Mergekit)",
# GTA family: UNet path runs our own gta.py, so drop the "(Mergekit)" label.
# NOTE: display keys must match NODE_CLASS_MAPPINGS exactly ("Ties"/"Dare",
# not "TIES"/"DARE") — the old uppercase keys were dead and never applied.
"PM Task Arithmetic (Mergekit)": "PM Task Arithmetic",
"PM Ties (Mergekit)": "PM TIES",
"PM Dare (Mergekit)": "PM DARE",
"PM Breadcrumbs (Mergekit)": "PM Breadcrumbs",
"PM Della (Mergekit)": "PM Della",
"PM LoRA Modifier": "PM LoRA Modifier",
"PM LoRA Resizer": "PM Resize LoRA",
"PM LoRA Apply": "PM Apply LoRA",
"PM LoRA Save": "PM Save LoRA",
}
WEB_DIRECTORY = "./js"
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]