A defect a LoRA learned — smoothed skin, identity drifting at distance, a pose it refuses to copy — usually lives in one module family and a range of blocks, not in the whole adapter. This node makes that testable without retraining: pick a family, pick blocks, set a scale, queue. Nothing is written to disk, so iterating is a slider away. Model-agnostic by construction. The structure is discovered from key names rather than hardcoded, covering the diffusers (lora_A/lora_B) and kohya (lora_down/lora_up + alpha) conventions. Verified against three architectures with different naming: Qwen-Image-2.1 (transformer_blocks, 32), Krea 2 (blocks 28 + txtfusion) and MiniMax-H3 (blocks 50 + token_refiner). Scaling multiplies only the up/B factor, since (sB)A = s(BA) — exact under either alpha convention, and negative scales stay usable. The panel is a Vue app in a DOM widget, with Vue vendored so it works offline. It lists each family's module types sorted by ||dW||, which reads as a map of where training invested. Selections convert to a regex on demand for cases the tree cannot express. Rules are ordered and later ones win, so the UI says so and lets you reorder. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
142 lines
7.2 KiB
Python
142 lines
7.2 KiB
Python
from .nodes import NODE_CLASS_MAPPINGS as BFS_NODE_CLASS_MAPPINGS
|
|
from .nodes import NODE_DISPLAY_NAME_MAPPINGS as BFS_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .ltxv_editanything import NODE_CLASS_MAPPINGS as LTXV_EA_NODE_CLASS_MAPPINGS
|
|
from .ltxv_editanything import NODE_DISPLAY_NAME_MAPPINGS as LTXV_EA_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .headswap_node import NODE_CLASS_MAPPINGS as HEADSWAP_NODE_CLASS_MAPPINGS
|
|
from .headswap_node import NODE_DISPLAY_NAME_MAPPINGS as HEADSWAP_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .anime2real_node import NODE_CLASS_MAPPINGS as A2R_NODE_CLASS_MAPPINGS
|
|
from .anime2real_node import NODE_DISPLAY_NAME_MAPPINGS as A2R_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .amv_guide_node import NODE_CLASS_MAPPINGS as AMV_NODE_CLASS_MAPPINGS
|
|
from .amv_guide_node import NODE_DISPLAY_NAME_MAPPINGS as AMV_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .ltx_identity_overlap import NODE_CLASS_MAPPINGS as IDT_NODE_CLASS_MAPPINGS
|
|
from .ltx_identity_overlap import NODE_DISPLAY_NAME_MAPPINGS as IDT_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .ltx_multiref_slots import NODE_CLASS_MAPPINGS as MRSLOT_NODE_CLASS_MAPPINGS
|
|
from .ltx_multiref_slots import NODE_DISPLAY_NAME_MAPPINGS as MRSLOT_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .ltx_multiple_controls import NODE_CLASS_MAPPINGS as MC_NODE_CLASS_MAPPINGS
|
|
from .ltx_multiple_controls import NODE_DISPLAY_NAME_MAPPINGS as MC_NODE_DISPLAY_NAME_MAPPINGS
|
|
from .color_mask_node import NODE_CLASS_MAPPINGS as CM_NODE_CLASS_MAPPINGS
|
|
from .color_mask_node import NODE_DISPLAY_NAME_MAPPINGS as CM_NODE_DISPLAY_NAME_MAPPINGS
|
|
try:
|
|
from .minimax_h3_singleframe_vae import NODE_CLASS_MAPPINGS as MMVAE_NODE_CLASS_MAPPINGS
|
|
from .minimax_h3_singleframe_vae import NODE_DISPLAY_NAME_MAPPINGS as MMVAE_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] MiniMax-H3 VAE loaders not loaded: {_e!r}")
|
|
MMVAE_NODE_CLASS_MAPPINGS, MMVAE_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .sharpest_frame import NODE_CLASS_MAPPINGS as SHARP_NODE_CLASS_MAPPINGS
|
|
from .sharpest_frame import NODE_DISPLAY_NAME_MAPPINGS as SHARP_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] Sharpest Frame node not loaded: {_e!r}")
|
|
SHARP_NODE_CLASS_MAPPINGS, SHARP_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .minimax_h3_direct_decode import NODE_CLASS_MAPPINGS as MMDD_NODE_CLASS_MAPPINGS
|
|
from .minimax_h3_direct_decode import NODE_DISPLAY_NAME_MAPPINGS as MMDD_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] MiniMax-H3 direct decode node not loaded: {_e!r}")
|
|
MMDD_NODE_CLASS_MAPPINGS, MMDD_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .save_h3_latent import NODE_CLASS_MAPPINGS as SVH3_NODE_CLASS_MAPPINGS
|
|
from .save_h3_latent import NODE_DISPLAY_NAME_MAPPINGS as SVH3_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] Save H3 Latent node not loaded: {_e!r}")
|
|
SVH3_NODE_CLASS_MAPPINGS, SVH3_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .edit_prompt_fixer import NODE_CLASS_MAPPINGS as EPF_NODE_CLASS_MAPPINGS
|
|
from .edit_prompt_fixer import NODE_DISPLAY_NAME_MAPPINGS as EPF_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] Edit Anything Prompt Fixer not loaded: {_e!r}")
|
|
EPF_NODE_CLASS_MAPPINGS, EPF_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .ltx_identity_multiangle import NODE_CLASS_MAPPINGS as MA_NODE_CLASS_MAPPINGS
|
|
from .ltx_identity_multiangle import NODE_DISPLAY_NAME_MAPPINGS as MA_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] LTX Identity Multiple Angles node not loaded: {_e!r}")
|
|
MA_NODE_CLASS_MAPPINGS, MA_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .ltx_identity_gemma_vision import NODE_CLASS_MAPPINGS as GV_NODE_CLASS_MAPPINGS
|
|
from .ltx_identity_gemma_vision import NODE_DISPLAY_NAME_MAPPINGS as GV_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] LTX Identity Gemma-Vision node not loaded: {_e!r}")
|
|
GV_NODE_CLASS_MAPPINGS, GV_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .multiref_sheet_node import NODE_CLASS_MAPPINGS as MRS_NODE_CLASS_MAPPINGS
|
|
from .multiref_sheet_node import NODE_DISPLAY_NAME_MAPPINGS as MRS_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] Multi-Ref Sheet Builder node not loaded: {_e!r}")
|
|
MRS_NODE_CLASS_MAPPINGS, MRS_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
try:
|
|
from .ltx_multishot_prompt import NODE_CLASS_MAPPINGS as MSP_NODE_CLASS_MAPPINGS
|
|
from .ltx_multishot_prompt import NODE_DISPLAY_NAME_MAPPINGS as MSP_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] LTX Multishot Prompt node not loaded: {_e!r}")
|
|
MSP_NODE_CLASS_MAPPINGS, MSP_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
# CAN / AdaLN node disabled: empirically the AdaLN modulation degrades the video (the identity
|
|
# gain came from the projector + LoRA, not the CAN). Kept the file but not registered.
|
|
CAN_NODE_CLASS_MAPPINGS, CAN_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
|
|
try:
|
|
from .headswap_ltx_masked_sampler import NODE_CLASS_MAPPINGS as HSMS_NODE_CLASS_MAPPINGS
|
|
from .headswap_ltx_masked_sampler import NODE_DISPLAY_NAME_MAPPINGS as HSMS_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] BFS Sampler not loaded: {_e!r}")
|
|
HSMS_NODE_CLASS_MAPPINGS, HSMS_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
|
|
try:
|
|
from .bfs_lora_surgery import NODE_CLASS_MAPPINGS as LSURG_NODE_CLASS_MAPPINGS
|
|
from .bfs_lora_surgery import NODE_DISPLAY_NAME_MAPPINGS as LSURG_NODE_DISPLAY_NAME_MAPPINGS
|
|
except Exception as _e: # noqa
|
|
print(f"[BFSNodes] LoRA Surgery node not loaded: {_e!r}")
|
|
LSURG_NODE_CLASS_MAPPINGS, LSURG_NODE_DISPLAY_NAME_MAPPINGS = {}, {}
|
|
|
|
NODE_CLASS_MAPPINGS = {
|
|
**GV_NODE_CLASS_MAPPINGS,
|
|
**CAN_NODE_CLASS_MAPPINGS,
|
|
**BFS_NODE_CLASS_MAPPINGS,
|
|
**LTXV_EA_NODE_CLASS_MAPPINGS,
|
|
**HEADSWAP_NODE_CLASS_MAPPINGS,
|
|
**A2R_NODE_CLASS_MAPPINGS,
|
|
**AMV_NODE_CLASS_MAPPINGS,
|
|
**IDT_NODE_CLASS_MAPPINGS,
|
|
**MC_NODE_CLASS_MAPPINGS,
|
|
**MRSLOT_NODE_CLASS_MAPPINGS,
|
|
**MA_NODE_CLASS_MAPPINGS,
|
|
**MRS_NODE_CLASS_MAPPINGS,
|
|
**CM_NODE_CLASS_MAPPINGS,
|
|
**MSP_NODE_CLASS_MAPPINGS,
|
|
**MMVAE_NODE_CLASS_MAPPINGS,
|
|
**SHARP_NODE_CLASS_MAPPINGS,
|
|
**MMDD_NODE_CLASS_MAPPINGS,
|
|
**SVH3_NODE_CLASS_MAPPINGS,
|
|
**EPF_NODE_CLASS_MAPPINGS,
|
|
**HSMS_NODE_CLASS_MAPPINGS,
|
|
**LSURG_NODE_CLASS_MAPPINGS,
|
|
}
|
|
|
|
NODE_DISPLAY_NAME_MAPPINGS = {
|
|
**GV_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**CAN_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**BFS_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**LTXV_EA_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**HEADSWAP_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**A2R_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**AMV_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**IDT_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MC_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MRSLOT_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MA_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MRS_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**CM_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MSP_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MMVAE_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**SHARP_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**MMDD_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**SVH3_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**EPF_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**HSMS_NODE_DISPLAY_NAME_MAPPINGS,
|
|
**LSURG_NODE_DISPLAY_NAME_MAPPINGS,
|
|
}
|
|
|
|
WEB_DIRECTORY = "./web/js"
|
|
|
|
__all__ = ["NODE_CLASS_MAPPINGS", "NODE_DISPLAY_NAME_MAPPINGS", "WEB_DIRECTORY"]
|