From f900f14b0b365b48c4c4c30c9ab2a63c87504d78 Mon Sep 17 00:00:00 2001 From: Jedrzej Kosinski Date: Fri, 17 Jul 2026 15:44:56 -0700 Subject: [PATCH] Support Anima LLLite v2 models Amp-Thread-ID: https://ampcode.com/threads/T-019f7088-85bf-7703-87c3-f9c0ca5d711d Co-authored-by: Amp --- AGENTS.md | 272 ++ README.md | 8 +- adv_control/control.py | 13 +- adv_control/control_lllite.py | 237 ++ adv_control/nodes.py | 11 +- adv_control/nodes_main.py | 22 + adv_control/nodes_weight.py | 60 + examples/anima_lllite_v2/README.md | 144 + .../anima_lllite_any_grayscale_a.json | 941 +++++++ .../anima_lllite_any_grayscale_b.json | 941 +++++++ .../anima_lllite_any_hed_scribble.json | 941 +++++++ .../anima_lllite_any_lineart.json | 941 +++++++ .../anima_lllite_any_pidinet_scribble.json | 941 +++++++ .../anima_lllite_inpainting.json | 1053 ++++++++ .../anima_lllite_v2_any_effect_mask.json | 2374 +++++++++++++++++ .../anima_lllite_v2_inpaint_comparison.json | 1753 ++++++++++++ 16 files changed, 10645 insertions(+), 7 deletions(-) create mode 100644 AGENTS.md create mode 100644 examples/anima_lllite_v2/README.md create mode 100644 examples/anima_lllite_v2/anima_lllite_any_grayscale_a.json create mode 100644 examples/anima_lllite_v2/anima_lllite_any_grayscale_b.json create mode 100644 examples/anima_lllite_v2/anima_lllite_any_hed_scribble.json create mode 100644 examples/anima_lllite_v2/anima_lllite_any_lineart.json create mode 100644 examples/anima_lllite_v2/anima_lllite_any_pidinet_scribble.json create mode 100644 examples/anima_lllite_v2/anima_lllite_inpainting.json create mode 100644 examples/anima_lllite_v2/anima_lllite_v2_any_effect_mask.json create mode 100644 examples/anima_lllite_v2/anima_lllite_v2_inpaint_comparison.json diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..ef995ef --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,272 @@ +# Advanced-ControlNet Contributor Guide + +This repository is expected to receive substantial AI-authored code. Treat this +file as the implementation and verification contract for all changes, especially +ports of new ControlNet families from ComfyUI. + +## Engineering Rules + +- Read the relevant ComfyUI implementation and this repository's equivalent + control path before editing. Do not design from a model card alone. +- Make the smallest change that preserves vanilla ComfyUI behavior and adds the + established Advanced-ControlNet capabilities. +- Reuse ComfyUI model classes, patchers, ops, model management, and loaders when + possible. Do not maintain a forked copy of core model code without a concrete + need. +- Preserve existing node IDs, inputs, outputs, checkpoint locations, and saved + workflow compatibility. New node IDs generally use the `ACN_` prefix; keep + existing unprefixed IDs and the aliases in `nodes_deprecated.py` working. +- Do not add dependencies unless the model cannot be supported with ComfyUI, + PyTorch, and the libraries already used by this repository. +- Match the direct style of the surrounding file. Avoid one-use abstractions, + generic framework code, speculative fallbacks, and comments that restate the + code. +- Use plain ASCII punctuation in code, comments, documentation, commit messages, + and PR descriptions. + +## Architecture Map + +- `adv_control/control.py`: standard ControlNet wrappers, conversion of vanilla + controls, checkpoint detection, and shared loader dispatch. +- `adv_control/control_.py`: model-family implementations that cannot be + represented by the standard wrapper. Keep family-specific math here. +- `adv_control/utils.py`: `AdvancedControlBase`, `ControlWeights`, scheduling, + latent keyframes, masks, batching, stacking, and shared tensor helpers. +- `adv_control/nodes_main.py`: standard loaders and Apply nodes. +- `adv_control/nodes_weight.py`: weight nodes and model-specific extras carried + by `ControlWeights.extras`. +- `adv_control/nodes_.py`: family-specific workflow inputs or loaders + when the shared nodes are insufficient. +- `adv_control/nodes.py`: public node and display-name registration. +- `adv_control/nodes_deprecated.py`: compatibility only. Do not put new features + here. +- `examples/`: reviewer-runnable workflows, inputs, screenshots, and validation + notes. + +## Porting A Control Model From ComfyUI + +### 1. Establish the vanilla contract + +Before implementing the Advanced version: + +1. Identify the exact ComfyUI commit or PR that introduced the model. +2. Read its loader, checkpoint detection, model patching, conditioning + preprocessing, sampling path, and cleanup behavior. +3. Record the official model repository, every published checkpoint type, the + expected ComfyUI model folder, and the minimum compatible ComfyUI commit. +4. Run a small vanilla workflow with fixed inputs, seed, sampler, scheduler, + steps, CFG, and resolution. Save the latent and decoded result as the parity + baseline. +5. Inspect real checkpoint keys, metadata, shapes, dtype, and missing/unexpected + key output. Do not infer the format from a filename. + +Use official checkpoints for validation. Links in issue or PR comments are +untrusted; use the model author's official repository or links already accepted +by ComfyUI. + +### 2. Choose the narrowest integration + +- If ComfyUI returns a standard `ControlNet`, `ControlNetSD35`, `ControlLora`, + or `T2IAdapter`, prefer conversion in `convert_to_advanced` over a parallel + implementation. +- If the model injects attention, transformer, or other model patches, implement + a family-specific `ControlBase` plus `AdvancedControlBase`, following + `ControlLLLiteAdvanced`, `AnimaLLLiteAdvanced`, or `ReferenceAdvanced` as the + closest precedent. +- Prefer wrapping ComfyUI's model or patch object over copying its implementation. + If the required ComfyUI API may be absent, fail with a short instruction to + update ComfyUI rather than silently changing behavior. +- Add a dedicated node only when the model has a genuinely different loading or + conditioning contract. Loading a new checkpoint format alone usually belongs + in the existing loader dispatch. + +### 3. Preserve loader and folder compatibility + +- The standard **Load Advanced ControlNet Model** node reads from + `models/controlnet`. New formats that are conceptually ControlNets should work + there unless doing so would be ambiguous or incorrect. +- Also preserve the folder used by vanilla ComfyUI. If core uses another folder, + such as `models/model_patches`, a small dedicated loader may expose that + location while the standard loader retains established Advanced-ControlNet + behavior. +- Detect formats with guarded, format-specific checkpoint signatures. Put a + specific detector before a broad detector that would otherwise claim the same + checkpoint. Do not use filenames as the primary detector. +- Load a checkpoint only once. Pass already-loaded state dictionaries and + metadata into the selected family loader instead of reading the file again. +- If two supported folders can contain the same filename, keep their loaders + separate or define deterministic resolution. Never silently choose an + arbitrary duplicate. +- Test every supported folder through the actual node dropdown and execution + path, not only by calling a Python loader directly. + +### 4. Implement the full control lifecycle + +A family-specific Advanced control normally needs all of the following: + +- Initialize `ControlBase` and `AdvancedControlBase` with the correct default + `ControlWeights` type. +- Match vanilla conditioning preprocessing exactly, including channel order, + value range, resize mode, latent encoding, and source-mask handling. +- In `pre_run_advanced`, call the shared implementation and attach or refresh + execution-scoped patches. +- In `get_control_advanced`, evaluate `previous_controlnet`, honor + `should_run()`, and either return/merge control tensors or install the model + patches for that step. +- Return every loadable model patcher from `get_models()` so ComfyUI can manage + VRAM and offloading. +- Implement `copy()` using both ComfyUI's `copy_to()` and this repository's + `copy_to_advanced()`. Copies must not share mutable execution state that can + leak between conditioning branches or queued runs. +- Clear prepared tensors, patch references, cached shapes, and other + execution-scoped state in `cleanup_advanced()`. +- Use ComfyUI device, dtype, manual-cast, operations, and model-patcher APIs. + Do not hardcode CUDA, force float32, or move models manually when ComfyUI + already owns that lifecycle. +- Preserve `previous_controlnet` behavior so same-family and mixed-family + controls can be stacked. + +## Advanced Feature Contract + +A port is not complete merely because default-strength generation works. Unless +the model architecture makes a capability impossible, verify that it supports: + +- Apply-node strength and start/end percentage. +- Timestep keyframes, including changing strength and inherited values. +- Latent keyframes on a batch of at least two latents. +- Apply-node effect masks and timestep-keyframe masks. +- Default, universal/soft, and architecture-specific per-layer weights. +- Weight overrides and model-specific weight extras. +- Conditional/unconditional weighting when the selected weight node exposes it. +- Stacking with another control, including correct `previous_controlnet` output. +- Batched conditioning and sliding-context subset indexes where applicable. +- Repeated execution, copying, cleanup, model offloading, and reload. + +Do not claim unsupported features in documentation. If an architecture cannot +support a feature, document the reason and make incompatible weight types fail +clearly through `compatible_weights`. + +### Masks and model-specific inputs + +- `mask_optional` on **Apply Advanced ControlNet** is always an effect mask. It + controls where this control influences generation. +- A model's source mask, control-type selector, or other family-specific data is + not an effect mask. Do not overload `mask_optional` with a second meaning. +- Do not add a model-specific input to the shared Apply node unless it is a + coherent capability needed by multiple model families. +- Prefer a small family-specific extras node that stores auxiliary values in + `ControlWeights.extras`, then pass those weights through `weights_override`. + Define extras keys next to the model implementation rather than as unrelated + strings spread across nodes. +- Validate required extras where they are first consumed and raise an actionable + error that names the exact nodes and connections needed to fix the workflow. +- Apply effect masks at the actual injection representation. Attention-patch and + DiT controls may need token-space masks rather than the normal spatial control + tensor path. +- Verify mask semantics with all-zero, all-one, and half-frame masks. All-zero + must equal no control and all-one must equal unmasked full control. Inspect the + multiplier at the injection site as well as the final image; global attention + can propagate influence outside directly controlled tokens. + +### Per-layer weights + +- Map custom weights to real architecture blocks in execution order. Confirm the + count from the loaded model, not from a model-card claim alone. +- Default weights must reproduce vanilla output exactly. +- Universal/soft weights must follow this repository's established progression + semantics. Implement a family-specific conversion only when the normal + `ControlWeights` layout does not represent the architecture. +- Ordinary example workflows should use default weights. Do not connect an + advanced custom-weight node merely to demonstrate that it exists. + +## Required Validation + +Python import or compile checks are necessary but are not model validation. Use +a real local ComfyUI installation, preferably managed by comfy-runner, with this +repository linked as the custom node. + +### Vanilla parity + +For every published control type and materially different checkpoint format: + +1. Run vanilla ComfyUI and Advanced-ControlNet with identical model files, + conditioning, seed, sampler settings, and latent. +2. Compare latent tensors before decode and decoded pixel arrays. +3. Target maximum absolute latent difference `0.0` and identical pixels when + both paths implement the same math. If exact parity is impossible, explain + why and report a justified numerical tolerance plus image metrics. +4. Confirm strength zero matches no control and strength one matches vanilla. +5. Check logs for missing/unexpected keys, dtype/device errors, repeated model + loads, and cleanup failures. + +### Advanced behavior + +At minimum, execute focused workflows for: + +- A nontrivial start/end schedule or two timestep keyframes. +- Batch size two with different latent-keyframe strengths. +- All-zero, all-one, and half-frame effect masks. +- Default weights and one nonuniform custom or soft-weight configuration. +- Conditional/unconditional weighting when supported. +- A stacked control path. +- Missing required model-specific extras and the resulting readable error. +- Both the vanilla model folder and any historical Advanced-ControlNet folder. +- Re-queueing the same workflow to exercise copy and cleanup behavior. + +For model families with several control types, test every type. Do not assume +that lineart, depth, pose, inpainting, union, or channel-count variants share the +same conditioning contract. + +### Basic checks + +- Run `python -m compileall adv_control __init__.py` with the target ComfyUI + environment. +- Parse every added workflow JSON. +- Load each committed workflow in the real frontend, serialize it to an API + prompt, and execute that round-tripped prompt. This catches stale node IDs, + renamed inputs, invalid widgets, and missing model metadata. +- Run `git diff --check`. + +There is currently no repository unit-test suite. Add focused tests when they +can exercise pure detection, shape, mask, or scheduling logic without building +a fake ComfyUI runtime. Do not add a large test framework solely for one port. + +## Examples and Review Evidence + +Every model-family port must be independently checkable by a reviewer: + +- Add one simple workflow for every public control type. Include required input + images or masks when licensing permits. +- Keep ComfyUI's default node names. Use colored groups or regions to explain + branches; do not rename nodes, because reviewers need to identify their types. +- Keep the normal workflows simple. Leave custom per-layer weights disconnected + unless a workflow specifically validates those advanced weights. +- Include direct links to the official base model, encoder, VAE, and control + checkpoint repositories, plus the exact destination folder for each file. +- Include a workflow screenshot and labeled output comparison in the PR. For + parity tests, show vanilla, Advanced-ControlNet, and an absolute-difference + result when practical. +- Commit reusable workflows and small review images under `examples//`. + Do not commit model files, latent dumps, or large intermediate artifacts. +- Document exact seeds/settings, expected numerical results, known limitations, + and reproduction steps in the example README and PR description. +- If final-image interpretation is subtle, include the direct tensor-level + evidence needed to distinguish a real bug from model behavior. + +## Definition Of Done For A Model Port + +- [ ] The official checkpoint is detected without relying on its filename. +- [ ] Vanilla and historical Advanced-ControlNet model folders are preserved. +- [ ] Default output matches vanilla for every published control type. +- [ ] Strength scheduling, keyframes, masks, weights, batching, and stacking are + tested or an architectural limitation is documented. +- [ ] Effect masks are tested at the injection site and in decoded output. +- [ ] Model-specific inputs use a narrow family boundary, not shared Apply-node + expansion. +- [ ] `get_models`, `copy`, cleanup, dtype/device handling, and repeated runs are + verified. +- [ ] Missing required inputs produce actionable errors. +- [ ] Simple workflows, input assets, download links, screenshots, and exact + reproduction instructions are included. +- [ ] Real frontend/API execution, compile checks, JSON parsing, and + `git diff --check` pass. diff --git a/README.md b/README.md index b44d912..5545299 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ControlNet preprocessors are available through [comfyui_controlnet_aux](https:// - Replicate ***"ControlNet is more important"*** feature from sd-webui-controlnet extension via ***uncond_multiplier*** on ***Soft Weights*** - uncond_multiplier=0.0 gives identical results of auto1111's feature, but values between 0.0 and 1.0 can be used without issue to granularly control the setting. - ControlNet, T2IAdapter, and ControlLoRA support for sliding context windows -- ControlLLLite support +- ControlLLLite support, including Anima LLLite v2 and inpainting models - ControlNet++ support - CtrLoRA support - Relevant models linked on [CtrLoRA github page](https://github.com/xyfJASON/ctrlora) @@ -83,6 +83,12 @@ Loads a ControlNet model and converts it into an Advanced version that supports ### Outputs - 🟪***CONTROL_NET***: loaded Advanced ControlNet +## Anima LLLite v2 + +Place Anima LLLite v2 files in `ComfyUI/models/model_patches` and load them with **Load Anima LLLite Model**. The regular Advanced ControlNet loader also recognizes these models when they are placed in `ComfyUI/models/controlnet`. + +Use the loaded model with **Apply Advanced ControlNet**. For the 4-channel inpainting model, pass the source mask through **Anima LLLite Extras** into the `cn_extras` input of a weights node; `mask_optional` on the Apply node remains the Advanced-ControlNet effect mask. **ControlNet Custom Weights [Anima]** provides one weight for each of Anima's 28 transformer blocks. Timestep keyframes, latent keyframes, soft weights, CFG/unconditional weighting, effect masks, and stacked controls work the same as with other Advanced-ControlNet models. + ## Timestep Keyframe ![image](https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet/assets/7365912/404f3cfe-5852-4eed-935b-37e32493d1b5) diff --git a/adv_control/control.py b/adv_control/control.py index 5c09140..556b363 100644 --- a/adv_control/control.py +++ b/adv_control/control.py @@ -13,7 +13,7 @@ from comfy.controlnet import ControlBase, ControlNet, ControlNetSD35, ControlLor from comfy.model_patcher import ModelPatcher from .control_sparsectrl import SparseControlNet, SparseSettings, SparseConst, InterfaceAnimateDiffModel, create_sparse_modelpatcher, load_sparsectrl_motionmodel -from .control_lllite import LLLiteModule, LLLitePatch, load_controllllite +from .control_lllite import LLLiteModule, LLLitePatch, load_anima_lllite, load_controllllite from .control_svd import svd_unet_config_from_diffusers_unet, SVDControlNet, svd_unet_to_diffusers from .utils import (AdvancedControlBase, TimestepKeyframeGroup, LatentKeyframeGroup, AbstractPreprocWrapper, ControlWeightType, ControlWeights, WeightTypeException, Extras, manual_cast_clean_groupnorm, disable_weight_init_clean_groupnorm, WrapperConsts, prepare_mask_batch, get_properly_arranged_t2i_weights, load_torch_file_with_dict_factory, @@ -510,7 +510,7 @@ class SparseCtrlAdvanced(ControlNetAdvanced): def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, model=None): - controlnet_data = comfy.utils.load_torch_file(ckpt_path, safe_load=True) + controlnet_data, metadata = comfy.utils.load_torch_file(ckpt_path, safe_load=True, return_metadata=True) # from pathlib import Path # log_name = ckpt_path.split('\\')[-1] # with open(Path(__file__).parent.parent.parent / rf"keys_{log_name}.txt", "w") as afile: @@ -519,6 +519,10 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo control = None # check if a non-vanilla ControlNet controlnet_type = ControlWeightType.DEFAULT + is_anima_lllite = ( + "lllite_conditioning1.conv1.weight" in controlnet_data + and any(key.startswith("lllite_dit_blocks_") for key in controlnet_data) + ) has_controlnet_key = False has_motion_modules_key = False has_temporal_res_block_key = False @@ -548,7 +552,9 @@ def load_controlnet(ckpt_path, timestep_keyframe: TimestepKeyframeGroup=None, mo elif has_controlnet_key and has_temporal_res_block_key: controlnet_type = ControlWeightType.SVD_CONTROLNET - if controlnet_type != ControlWeightType.DEFAULT: + if is_anima_lllite: + control = load_anima_lllite(ckpt_path, controlnet_data=controlnet_data, metadata=metadata, timestep_keyframe=timestep_keyframe) + elif controlnet_type != ControlWeightType.DEFAULT: if controlnet_type == ControlWeightType.CONTROLLLLITE: control = load_controllllite(ckpt_path, controlnet_data=controlnet_data, timestep_keyframe=timestep_keyframe) elif controlnet_type == ControlWeightType.SPARSECTRL: @@ -990,4 +996,3 @@ def load_svdcontrolnet(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, control = SVDControlNetAdvanced(control_model, timestep_keyframes=timestep_keyframe, global_average_pooling=global_average_pooling, load_device=load_device, manual_cast_dtype=manual_cast_dtype) return control - diff --git a/adv_control/control_lllite.py b/adv_control/control_lllite.py index c5820a8..efc2779 100644 --- a/adv_control/control_lllite.py +++ b/adv_control/control_lllite.py @@ -10,14 +10,24 @@ import os import comfy.utils import comfy.ops import comfy.model_management +import comfy.model_patcher from comfy.model_patcher import ModelPatcher from comfy.controlnet import ControlBase +try: + import comfy.ldm.anima.lllite as comfy_anima_lllite +except ImportError: + comfy_anima_lllite = None + from .logger import logger from .utils import (AdvancedControlBase, TimestepKeyframeGroup, ControlWeights, broadcast_image_to_extend, extend_to_batch_size, prepare_mask_batch) +class AnimaLLLiteConst: + INPAINT_MASK = "anima_lllite_inpaint_mask" + + # based on set_model_patch code in comfy/model_patcher.py def set_model_patch(transformer_options, patch, name): to = transformer_options @@ -371,6 +381,233 @@ class ControlLLLiteAdvanced(ControlBase, AdvancedControlBase): return c +class AnimaLLLiteAdvancedPatch: + def __init__(self, model_patch, control: 'AnimaLLLiteAdvanced'=None): + self.model_patch = model_patch + self.control = control + + def set_control(self, control: 'AnimaLLLiteAdvanced') -> 'AnimaLLLiteAdvancedPatch': + self.control = control + return self + + def clone_with_control(self, control: 'AnimaLLLiteAdvanced') -> 'AnimaLLLiteAdvancedPatch': + return AnimaLLLiteAdvancedPatch(self.model_patch, control) + + def __call__(self, args): + if not self.control.should_run(): + return args + + x = args["x"] + if x.shape[2] != 1: + raise ValueError(f"Anima LLLite only supports T=1, got T={x.shape[2]}") + + target_height = x.shape[-2] * 8 + target_width = x.shape[-1] * 8 + image = self.control.prepare_batched_tensor(self.control.cond_hint_original, x.shape[0])[:, :3] + image = comfy.utils.common_upscale(image, target_width, target_height, "bicubic", crop="center").clamp(0.0, 1.0) + image = image.to(device=x.device, dtype=x.dtype) * 2.0 - 1.0 + + if self.model_patch.model.cond_in_channels == 4: + mask = self.control.weights.extras.get(AnimaLLLiteConst.INPAINT_MASK) + if mask is None: + raise ValueError( + "Anima LLLite inpainting models require an inpaint mask. Connect a MASK to Anima LLLite Extras, " + "connect its cn_extras output to Default Weights, then connect CN_WEIGHTS to weights_override on Apply Advanced ControlNet." + ) + if mask.ndim == 3: + mask = mask.unsqueeze(1) + if mask.ndim != 4 or mask.shape[1] != 1: + raise ValueError(f"Anima LLLite mask must have one channel, got shape {tuple(mask.shape)}") + if image.shape[0] > 1: + mask = self.control.prepare_batched_tensor(mask, image.shape[0], except_one=False) + mask = comfy.utils.common_upscale(mask.float(), target_width, target_height, "nearest-exact", crop="center") + if mask.shape[0] != image.shape[0]: + if image.shape[0] % mask.shape[0] != 0: + raise ValueError(f"Anima LLLite mask batch {mask.shape[0]} cannot be broadcast to image batch {image.shape[0]}") + mask = mask.repeat(image.shape[0] // mask.shape[0], 1, 1, 1) + mask = (mask >= 0.5).to(device=x.device, dtype=x.dtype) + if self.model_patch.model.inpaint_masked_input: + image = image * (mask < 0.5).to(image.dtype) + image = torch.cat((image, mask * 2.0 - 1.0), dim=1) + + cond_emb = self.model_patch.model.encode_conditioning(image) + multiplier, weight_mask = self.control.prepare_multiplier(args["img"]) + args["transformer_options"]["model_patch_data"][self] = (cond_emb, multiplier, weight_mask) + return args + + def to(self, device_or_dtype): + return self + + def models(self): + return [self.model_patch] + + +class AnimaLLLiteAdvancedAttentionPatch: + def __init__(self, patch: AnimaLLLiteAdvancedPatch, targets): + self.patch = patch + self.targets = targets + + def __call__(self, q, k, v, pe=None, attn_mask=None, extra_options=None): + patch_data = extra_options["model_patch_data"].get(self.patch) + if patch_data is None: + return {"q": q, "k": k, "v": v, "pe": pe, "attn_mask": attn_mask} + + cond_emb, multiplier, weight_mask = patch_data + block_index = extra_options["block_index"] + strength = self.patch.control.get_block_strength(block_index, multiplier, weight_mask) + values = {"q": q, "k": k, "v": v} + for value_name, target in self.targets.items(): + values[value_name] = self.patch.model_patch.model.apply(values[value_name], cond_emb, block_index, target, strength) + return {"q": values["q"], "k": values["k"], "v": values["v"], "pe": pe, "attn_mask": attn_mask} + + +class AnimaLLLiteAdvancedMLPPatch: + def __init__(self, patch: AnimaLLLiteAdvancedPatch): + self.patch = patch + + def __call__(self, args): + patch_data = args["transformer_options"]["model_patch_data"].get(self.patch) + if patch_data is None: + return args + + cond_emb, multiplier, weight_mask = patch_data + block_index = args["transformer_options"]["block_index"] + strength = self.patch.control.get_block_strength(block_index, multiplier, weight_mask) + args["x"] = self.patch.model_patch.model.apply(args["x"], cond_emb, block_index, "mlp_layer1", strength) + return args + + +class AnimaLLLiteAdvanced(ControlBase, AdvancedControlBase): + def __init__(self, model_patch, timestep_keyframes: TimestepKeyframeGroup): + ControlBase.__init__(self) + AdvancedControlBase.__init__(self, super(), timestep_keyframes=timestep_keyframes, weights_default=ControlWeights.controllllite()) + self.model_patch = model_patch + self.patch = AnimaLLLiteAdvancedPatch(model_patch, self) + self.patch_attn1 = AnimaLLLiteAdvancedAttentionPatch( + self.patch, + {"q": "self_attn_q_proj", "k": "self_attn_k_proj", "v": "self_attn_v_proj"}, + ) + self.patch_attn2 = AnimaLLLiteAdvancedAttentionPatch(self.patch, {"q": "cross_attn_q_proj"}) + self.patch_mlp = AnimaLLLiteAdvancedMLPPatch(self.patch) + + def prepare_batched_tensor(self, tensor: Tensor, target_batch: int, except_one=True) -> Tensor: + if self.sub_idxs is not None: + if tensor.shape[0] < self.full_latent_length: + tensor = extend_to_batch_size(tensor, self.full_latent_length) + tensor = tensor[self.sub_idxs] + if tensor.shape[0] != target_batch: + tensor = broadcast_image_to_extend(tensor, target_batch, self.batched_number, except_one=except_one) + return tensor + + def prepare_effect_mask(self, mask: Tensor, img: Tensor) -> Tensor: + mask = self.prepare_batched_tensor(mask, img.shape[0], except_one=False) + mask = torch.nn.functional.interpolate( + mask.reshape((-1, 1, mask.shape[-2], mask.shape[-1])).float(), + size=(img.shape[2], img.shape[3]), + mode="bilinear", + ) + return mask.flatten(2).transpose(1, 2).to(device=img.device, dtype=img.dtype) + + def prepare_multiplier(self, img: Tensor): + multiplier = self.strength * self._current_timestep_keyframe.strength + token_multiplier = None + + masks = [self.mask_cond_hint_original, self._current_timestep_keyframe.mask_hint_orig] + for mask in masks: + if mask is not None: + mask_multiplier = self.prepare_effect_mask(mask, img) + token_multiplier = mask_multiplier if token_multiplier is None else token_multiplier * mask_multiplier + + flat_img = img.flatten(1, 3) + if self.latent_keyframes is not None: + latent_multiplier = self.calc_latent_keyframe_mults(flat_img, self.batched_number) + token_multiplier = latent_multiplier if token_multiplier is None else token_multiplier * latent_multiplier + + if self.weights.has_uncond_multiplier and self.cond_or_uncond is not None: + batch_multiplier = torch.ones((img.shape[0], 1, 1), dtype=img.dtype, device=img.device) + actual_length = img.shape[0] // self.batched_number + for idx, cond_type in enumerate(self.cond_or_uncond): + if cond_type == 1: + batch_multiplier[actual_length * idx:actual_length * (idx + 1)] *= self.weights.uncond_multiplier + token_multiplier = batch_multiplier if token_multiplier is None else token_multiplier * batch_multiplier + + weight_mask = None + if self.weights.weight_mask is not None: + weight_mask = self.prepare_effect_mask(self.weights.weight_mask, img) + + if token_multiplier is not None: + multiplier = token_multiplier * multiplier + return multiplier, weight_mask + + def get_block_strength(self, block_index: int, multiplier, weight_mask): + block_weight = 1.0 + if self.weights.weight_type == "universal": + exponent = self.model_patch.model.block_count - block_index + if weight_mask is not None: + block_weight = torch.pow(weight_mask, exponent) + else: + block_weight = self.weights.base_multiplier ** exponent + elif self.weights.weights_input is not None and block_index < len(self.weights.weights_input): + block_weight = self.weights.weights_input[block_index] + return multiplier * block_weight + + def pre_run_advanced(self, *args, **kwargs): + AdvancedControlBase.pre_run_advanced(self, *args, **kwargs) + self.patch.set_control(self) + + def get_control_advanced(self, x_noisy: Tensor, t, cond, batched_number: int, transformer_options: dict): + control_prev = None + if self.previous_controlnet is not None: + control_prev = self.previous_controlnet.get_control(x_noisy, t, cond, batched_number, transformer_options) + if not self.should_run(): + return control_prev + + set_model_patch(transformer_options, self.patch.set_control(self), "post_input") + set_model_attn1_patch(transformer_options, self.patch_attn1) + set_model_attn2_patch(transformer_options, self.patch_attn2) + set_model_patch(transformer_options, self.patch_mlp, "mlp_patch") + return control_prev + + def get_models(self): + models = super().get_models() + models.append(self.model_patch) + return models + + def copy(self): + copied = AnimaLLLiteAdvanced(self.model_patch, self.timestep_keyframes) + self.copy_to(copied) + self.copy_to_advanced(copied) + return copied + + +def load_anima_lllite(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, metadata=None, timestep_keyframe: TimestepKeyframeGroup=None): + if comfy_anima_lllite is None: + raise RuntimeError("Anima LLLite requires a newer version of ComfyUI. Please update ComfyUI.") + if controlnet_data is None or metadata is None: + loaded_data, loaded_metadata = comfy.utils.load_torch_file(ckpt_path, safe_load=True, return_metadata=True) + if controlnet_data is None: + controlnet_data = loaded_data + metadata = loaded_metadata + + dtype = comfy.utils.weight_dtype(controlnet_data) + model = comfy_anima_lllite.AnimaLLLite( + controlnet_data, + metadata, + device=comfy.model_management.unet_offload_device(), + dtype=dtype, + operations=comfy.ops.manual_cast, + ) + patcher_type = getattr(comfy.model_patcher, "CoreModelPatcher", ModelPatcher) + model_patcher = patcher_type( + model, + load_device=comfy.model_management.get_torch_device(), + offload_device=comfy.model_management.unet_offload_device(), + ) + is_dynamic = getattr(model_patcher, "is_dynamic", lambda: False)() + model.load_state_dict(controlnet_data, assign=is_dynamic) + return AnimaLLLiteAdvanced(model_patcher, timestep_keyframe) + + def load_controllllite(ckpt_path: str, controlnet_data: dict[str, Tensor]=None, timestep_keyframe: TimestepKeyframeGroup=None): if controlnet_data is None: controlnet_data = comfy.utils.load_torch_file(ckpt_path, safe_load=True) diff --git a/adv_control/nodes.py b/adv_control/nodes.py index 32b9b43..18eea35 100644 --- a/adv_control/nodes.py +++ b/adv_control/nodes.py @@ -1,10 +1,11 @@ import comfy.sample -from .nodes_main import (ControlNetLoaderAdvanced, DiffControlNetLoaderAdvanced, +from .nodes_main import (ControlNetLoaderAdvanced, DiffControlNetLoaderAdvanced, AnimaLLLiteLoaderAdvanced, AdvancedControlNetApply, AdvancedControlNetApplySingle) from .nodes_weight import (DefaultWeights, ScaledSoftMaskedUniversalWeights, ScaledSoftUniversalWeights, SoftControlNetWeightsSD15, CustomControlNetWeightsSD15, CustomControlNetWeightsFlux, - SoftT2IAdapterWeights, CustomT2IAdapterWeights, ExtrasMiddleMultNode) + CustomControlNetWeightsAnima, SoftT2IAdapterWeights, CustomT2IAdapterWeights, ExtrasMiddleMultNode, + AnimaLLLiteExtras) from .nodes_keyframes import (LatentKeyframeGroupNode, LatentKeyframeInterpolationNode, LatentKeyframeBatchedGroupNode, LatentKeyframeNode, TimestepKeyframeNode, TimestepKeyframeInterpolationNode, TimestepKeyframeFromStrengthListNode) from .nodes_sparsectrl import SparseCtrlMergedLoaderAdvanced, SparseCtrlLoaderAdvanced, SparseIndexMethodNode, SparseSpreadMethodNode, RgbSparseCtrlPreprocessor, SparseWeightExtras @@ -36,16 +37,19 @@ NODE_CLASS_MAPPINGS = { # Loaders "ACN_ControlNetLoaderAdvanced": ControlNetLoaderAdvanced, "ACN_DiffControlNetLoaderAdvanced": DiffControlNetLoaderAdvanced, + "ACN_AnimaLLLiteLoaderAdvanced": AnimaLLLiteLoaderAdvanced, # Weights "ACN_ScaledSoftControlNetWeights": ScaledSoftUniversalWeights, "ScaledSoftMaskedUniversalWeights": ScaledSoftMaskedUniversalWeights, "ACN_SoftControlNetWeightsSD15": SoftControlNetWeightsSD15, "ACN_CustomControlNetWeightsSD15": CustomControlNetWeightsSD15, "ACN_CustomControlNetWeightsFlux": CustomControlNetWeightsFlux, + "ACN_CustomControlNetWeightsAnima": CustomControlNetWeightsAnima, "ACN_SoftT2IAdapterWeights": SoftT2IAdapterWeights, "ACN_CustomT2IAdapterWeights": CustomT2IAdapterWeights, "ACN_DefaultUniversalWeights": DefaultWeights, "ACN_ExtrasMiddleMult": ExtrasMiddleMultNode, + "ACN_AnimaLLLiteExtras": AnimaLLLiteExtras, # SparseCtrl "ACN_SparseCtrlRGBPreprocessor": RgbSparseCtrlPreprocessor, "ACN_SparseCtrlLoaderAdvanced": SparseCtrlLoaderAdvanced, @@ -93,16 +97,19 @@ NODE_DISPLAY_NAME_MAPPINGS = { # Loaders "ACN_ControlNetLoaderAdvanced": "Load Advanced ControlNet Model 🛂🅐🅒🅝", "ACN_DiffControlNetLoaderAdvanced": "Load Advanced ControlNet Model (diff) 🛂🅐🅒🅝", + "ACN_AnimaLLLiteLoaderAdvanced": "Load Anima LLLite Model 🛂🅐🅒🅝", # Weights "ACN_ScaledSoftControlNetWeights": "Scaled Soft Weights 🛂🅐🅒🅝", "ScaledSoftMaskedUniversalWeights": "Scaled Soft Masked Weights 🛂🅐🅒🅝", "ACN_SoftControlNetWeightsSD15": "ControlNet Soft Weights [SD1.5] 🛂🅐🅒🅝", "ACN_CustomControlNetWeightsSD15": "ControlNet Custom Weights [SD1.5] 🛂🅐🅒🅝", "ACN_CustomControlNetWeightsFlux": "ControlNet Custom Weights [Flux] 🛂🅐🅒🅝", + "ACN_CustomControlNetWeightsAnima": "ControlNet Custom Weights [Anima] 🛂🅐🅒🅝", "ACN_SoftT2IAdapterWeights": "T2IAdapter Soft Weights 🛂🅐🅒🅝", "ACN_CustomT2IAdapterWeights": "T2IAdapter Custom Weights 🛂🅐🅒🅝", "ACN_DefaultUniversalWeights": "Default Weights 🛂🅐🅒🅝", "ACN_ExtrasMiddleMult": "Middle Weight Extras 🛂🅐🅒🅝", + "ACN_AnimaLLLiteExtras": "Anima LLLite Extras 🛂🅐🅒🅝", # SparseCtrl "ACN_SparseCtrlRGBPreprocessor": "RGB SparseCtrl 🛂🅐🅒🅝", "ACN_SparseCtrlLoaderAdvanced": "Load SparseCtrl Model 🛂🅐🅒🅝", diff --git a/adv_control/nodes_main.py b/adv_control/nodes_main.py index acb9ef2..4d68910 100644 --- a/adv_control/nodes_main.py +++ b/adv_control/nodes_main.py @@ -4,6 +4,7 @@ import folder_paths from comfy.model_patcher import ModelPatcher from .control import load_controlnet, convert_to_advanced, is_advanced_controlnet, is_sd3_advanced_controlnet +from .control_lllite import load_anima_lllite from .utils import ControlWeights, LatentKeyframeGroup, TimestepKeyframeGroup, AbstractPreprocWrapper, BIGMAX from .logger import logger @@ -65,6 +66,27 @@ class DiffControlNetLoaderAdvanced: return (controlnet,) +class AnimaLLLiteLoaderAdvanced: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "model_patch": (folder_paths.get_filename_list("model_patches"), ), + }, + "optional": { + "timestep_kf": ("TIMESTEP_KEYFRAME", ), + }, + } + + RETURN_TYPES = ("CONTROL_NET", ) + FUNCTION = "load_controlnet" + CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/loaders" + + def load_controlnet(self, model_patch, timestep_kf: TimestepKeyframeGroup=None): + model_patch_path = folder_paths.get_full_path_or_raise("model_patches", model_patch) + return (load_anima_lllite(model_patch_path, timestep_keyframe=timestep_kf),) + + class AdvancedControlNetApply: @classmethod def INPUT_TYPES(s): diff --git a/adv_control/nodes_weight.py b/adv_control/nodes_weight.py index 454bbc8..7f3aad0 100644 --- a/adv_control/nodes_weight.py +++ b/adv_control/nodes_weight.py @@ -1,6 +1,7 @@ from torch import Tensor import torch from .utils import TimestepKeyframe, TimestepKeyframeGroup, ControlWeights, Extras, get_properly_arranged_t2i_weights, linear_conversion +from .control_lllite import AnimaLLLiteConst from .logger import logger @@ -238,6 +239,39 @@ class CustomControlNetWeightsFlux: return (weights, TimestepKeyframeGroup.default(TimestepKeyframe(control_weights=weights))) +class CustomControlNetWeightsAnima: + @classmethod + def INPUT_TYPES(s): + required = { + f"block_{index}": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 10.0, "step": 0.001}) + for index in range(28) + } + return { + "required": required, + "optional": { + "uncond_multiplier": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}), + "cn_extras": ("CN_WEIGHTS_EXTRAS",), + }, + "hidden": { + "autosize": ("ACNAUTOSIZE", {"padding": 0}), + }, + } + + RETURN_TYPES = ("CONTROL_NET_WEIGHTS", "TIMESTEP_KEYFRAME",) + RETURN_NAMES = WEIGHTS_RETURN_NAMES + FUNCTION = "load_weights" + CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/weights/ControlNet" + + def load_weights(self, uncond_multiplier: float=1.0, cn_extras: dict[str]={}, **kwargs): + weights = [kwargs[f"block_{index}"] for index in range(28)] + control_weights = ControlWeights.controllllite( + weights_input=weights, + uncond_multiplier=uncond_multiplier, + extras=cn_extras, + ) + return (control_weights, TimestepKeyframeGroup.default(TimestepKeyframe(control_weights=control_weights))) + + class SoftT2IAdapterWeights: @classmethod def INPUT_TYPES(s): @@ -327,3 +361,29 @@ class ExtrasMiddleMultNode: cn_extras = cn_extras.copy() cn_extras[Extras.MIDDLE_MULT] = middle_mult return (cn_extras,) + + +class AnimaLLLiteExtras: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "inpaint_mask": ("MASK",), + }, + "optional": { + "cn_extras": ("CN_WEIGHTS_EXTRAS",), + }, + "hidden": { + "autosize": ("ACNAUTOSIZE", {"padding": 0}), + }, + } + + RETURN_TYPES = ("CN_WEIGHTS_EXTRAS",) + RETURN_NAMES = ("cn_extras",) + FUNCTION = "create_extras" + CATEGORY = "Adv-ControlNet 🛂🅐🅒🅝/weights/extras" + + def create_extras(self, inpaint_mask: Tensor, cn_extras: dict[str]={}): + cn_extras = cn_extras.copy() + cn_extras[AnimaLLLiteConst.INPAINT_MASK] = inpaint_mask.clone() + return (cn_extras,) diff --git a/examples/anima_lllite_v2/README.md b/examples/anima_lllite_v2/README.md new file mode 100644 index 0000000..fb491b9 --- /dev/null +++ b/examples/anima_lllite_v2/README.md @@ -0,0 +1,144 @@ +# Anima LLLite validation workflows + +This folder contains simple Advanced-ControlNet workflows for the two Anima +LLLite v2 checkpoints: the five conditioning inputs documented for the v2 +any-test-like model and the v2 inpainting model. It also includes vanilla parity +and effect-mask validation workflows. + +![Simple workflows for all six v2 examples](https://ampcode.com/attachments/3ef84a8ad6947c624cd82b5ac6fb9c664b224678c774a5eba79f4f7e6e8d5c3f.jpeg) + +![Control images and tested results for all six v2 examples](https://ampcode.com/attachments/addd1fdb85aa331cc622ef55a9397a996f34c5243e268a1b9bcc42ca39a25120.jpeg) + +## Simple v2 workflows + +| Type | Workflow | Input image | Checkpoint | +| --- | --- | --- | --- | +| Any - Grayscale A | [`anima_lllite_any_grayscale_a.json`](anima_lllite_any_grayscale_a.json) | [`anima_lllite_any_grayscale_a_control.png`](https://ampcode.com/attachments/911b31c414bcf5c9aeaa254356c89f04e1133ce2181d0414cd8b7e9a7fa7847c.png) | `anima-lllite-any-test-like-v2.safetensors` | +| Any - Grayscale B | [`anima_lllite_any_grayscale_b.json`](anima_lllite_any_grayscale_b.json) | [`anima_lllite_any_grayscale_b_control.png`](https://ampcode.com/attachments/6950b3c8a47ff62311cc8ac147e2c8aa6aad9176abe7046db3a1bd6cf97cf705.png) | `anima-lllite-any-test-like-v2.safetensors` | +| Any - Lineart | [`anima_lllite_any_lineart.json`](anima_lllite_any_lineart.json) | [`anima_lllite_any_lineart_control.png`](https://ampcode.com/attachments/338c2f07267d564ca9fb60bf79c229b5689509202734875f0cb674efb8d691b1.png) | `anima-lllite-any-test-like-v2.safetensors` | +| Any - HED scribble | [`anima_lllite_any_hed_scribble.json`](anima_lllite_any_hed_scribble.json) | [`anima_lllite_any_hed_scribble_control.png`](https://ampcode.com/attachments/a52217f09c5852652667152cb901b98c3472c2e4cbf86a6cae53a36ec7e84192.png) | `anima-lllite-any-test-like-v2.safetensors` | +| Any - PiDiNet scribble | [`anima_lllite_any_pidinet_scribble.json`](anima_lllite_any_pidinet_scribble.json) | [`anima_lllite_any_pidinet_scribble_control.png`](https://ampcode.com/attachments/57bc6b0d8cba0df17f92115917bfc6ccfce83107e56af624f0be1db32c402579.png) | `anima-lllite-any-test-like-v2.safetensors` | +| Inpainting | [`anima_lllite_inpainting.json`](anima_lllite_inpainting.json) | [`anima_lllite_v2_control.png`](https://ampcode.com/attachments/3220b2f533a014619e3c0422eca8a3343e8488eb113795af5bae5f05d38a8ada.png) | `anima-lllite-inpainting-v2.safetensors` | + +Download the selected input image from the table and save it under the displayed +filename in `ComfyUI/input`. Load its workflow and queue it unchanged. Results +are saved under `ComfyUI/output/acn_anima_examples`. Binary inputs and +screenshots are linked externally instead of being committed to this repository. + +These examples use default node names and do not connect the custom 28-layer +Anima weights node. The inpainting workflow uses Anima LLLite Extras and +Default Weights only because the model's source mask must be carried through +`cn_extras`. Strength, start/end scheduling, effect masks, timestep keyframes, +latent keyframes, and stacking remain available on the standard +Advanced-ControlNet nodes. + +The model author trained the v2 any-test-like checkpoint on five conditioning +types: HED scribble, PiDiNet scribble, Grayscale A, Grayscale B, and lineart, +all with heavy augmentation. The examples above exercise each input type using +that one v2 checkpoint instead of the lower-quality Preview3 depth, pose, +lineart, and scribble checkpoints. + +The HED and PiDiNet controls were prepared with the +[comfyui_controlnet_aux](https://github.com/Fannovel16/comfyui_controlnet_aux) +HED and Scribble PiDiNet preprocessors. The HED soft-edge output was thresholded +at 80 to make the documented white-on-black scribble representation. The model +card names two grayscale generation patterns but does not define their +individual construction; Grayscale A is the author's sample and Grayscale B +demonstrates the documented inversion, contrast, and blur augmentation. + +## Requirements + +Official Hugging Face repositories: + +- [circlestone-labs/Anima](https://huggingface.co/circlestone-labs/Anima) - base model, text encoder, and VAE +- [kohya-ss/Anima-LLLite](https://huggingface.co/kohya-ss/Anima-LLLite) - Anima LLLite control models + +Use ComfyUI commit `0f42ba514631` or later and place these files in the listed +model folders. These are direct downloads from the official model repositories: + +| Download | ComfyUI model folder | +| --- | --- | +| [`anima-base-v1.0.safetensors`](https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors?download=true) | `models/diffusion_models` | +| [`qwen_3_06b_base.safetensors`](https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors?download=true) | `models/text_encoders` | +| [`qwen_image_vae.safetensors`](https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors?download=true) | `models/vae` | +| [`anima-lllite-inpainting-v2.safetensors`](https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-inpainting-v2.safetensors?download=true) | `models/model_patches` | +| [`anima-lllite-any-test-like-v2.safetensors`](https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors?download=true) (3-channel any-type model) | `models/model_patches` | + +The included workflows use **Load Anima LLLite Model**, so their LLLite files +belong in `models/model_patches`, matching vanilla ComfyUI. For compatibility +with existing Advanced-ControlNet LLLite workflows, the files may instead be +placed in `models/controlnet` and loaded with **Load Advanced ControlNet +Model**. The standard loader automatically distinguishes Anima checkpoints +from older SDXL LLLite checkpoints. + +## Run the inpainting comparison + +This validation workflow runs the inpainting model through vanilla ComfyUI and +Advanced-ControlNet with identical inputs and sampling settings. It saves both +decoded results, both latent tensors, and an absolute pixel-difference image. + +![Workflow showing the vanilla and Advanced-ControlNet branches](https://ampcode.com/attachments/f056cae89132c45bc133f456a2832a81255fee9c0782968a24adce2095b2fe1b.jpeg) + +![Bit-exact result comparison](https://ampcode.com/attachments/fcf073d1253ea721a2d46d34efde0e45ff6ccfb751fbd295a438ab459cc26037.jpeg) + +1. Download [`anima_lllite_v2_control.png`](https://ampcode.com/attachments/3220b2f533a014619e3c0422eca8a3343e8488eb113795af5bae5f05d38a8ada.png) + to `ComfyUI/input`. +2. Load `anima_lllite_v2_inpaint_comparison.json` in ComfyUI. +3. Queue the workflow without changing its settings. +4. Inspect `ComfyUI/output/acn_anima_pr`. + +The control PNG contains a transparent edit region. ComfyUI's Load Image node +provides that alpha channel as the source inpainting mask. + +The vanilla branch passes the mask directly to Apply Anima LLLite. The +Advanced-ControlNet branch passes it through Anima LLLite Extras, the +`cn_extras` input on Default Weights, and `weights_override` on Apply Advanced +ControlNet. + +If an inpainting checkpoint reaches sampling without that source mask, +Advanced-ControlNet raises an error that describes these connections instead +of silently substituting an empty mask. + +With the included seed and settings, the expected results are: + +- Identical latent tensors with maximum and mean absolute differences of `0.0`. +- Identical decoded PNG pixels. +- A completely black `absolute_difference` image. + +## Run the any-type effect-mask comparison + +This workflow verifies the official 3-channel any-type checkpoint against +vanilla ComfyUI and applies an Advanced-ControlNet effect mask to only the left +half of the image. Its nodes retain their default names; the colored regions +identify the comparison branches. + +![Any-type effect-mask workflow](https://ampcode.com/attachments/3a547b4914a84f0d578b0223149d3ed14e9b22542093e4bc51b6501aeb18f29f.jpeg) + +![Any-type parity and effect-mask results](https://ampcode.com/attachments/340c286b28d74d943f03a95d71208f2408c94934f0809fbb060cc774ae8c1b67.jpeg) + +1. Download [`anima_lllite_v2_any_control.png`](https://ampcode.com/attachments/db18d41c476324bdf5a5b6117476ed117cc590f8f48e193f6316d08b959bc49c.png) + and [`anima_lllite_v2_left_half_mask.png`](https://ampcode.com/attachments/e4fe3a88415357f29315c9afb124ee975a48dee8abccad1fe1903dd5d21b91b6.png) + to `ComfyUI/input`. +2. Load `anima_lllite_v2_any_effect_mask.json` in ComfyUI. +3. Queue the workflow without changing its settings. +4. Inspect `ComfyUI/output/acn_anima_any_mask`. + +The expected results are: + +- Advanced-ControlNet full control and vanilla full control have identical + latent tensors and decoded pixels, with maximum absolute difference `0.0`. +- A completely black effect mask produces the no-control latent exactly. +- A completely white effect mask produces the unmasked full-control latent + exactly. +- At the model token resolution, the included half mask is exactly `1.0` on + the left and `0.0` on the right. Direct LLLite injection is therefore zero + for every right-side token. +- In the final image, the masked right side is closer to the no-control + baseline than full control: PSNR improves from `16.39` to `17.69`, and SSIM + improves from `0.554` to `0.600`. + +The final right half is not pixel-identical to the no-control image. This model +patches self-attention Q, so controlled left-side tokens can influence +right-side tokens through global self-attention and later diffusion steps. +The effect mask guarantees local control injection, not hard image-space +isolation after attention. diff --git a/examples/anima_lllite_v2/anima_lllite_any_grayscale_a.json b/examples/anima_lllite_v2/anima_lllite_any_grayscale_a.json new file mode 100644 index 0000000..66f42f9 --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_any_grayscale_a.json @@ -0,0 +1,941 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 12, + "last_link_id": 26, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 20 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 250 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 14, + 15 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 360, + 190 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 14 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "anime illustration of a female knight in ornate silver plate armor holding a sword, side profile in a dense forest, detailed" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 360, + 440 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 15 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 470 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 23 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 650 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_any_grayscale_a_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 360, + 700 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 25 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 860, + 120 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 18 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 9, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1210, + 130 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 18 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 19 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 21 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 22 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1580, + 110 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 20 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 21 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 22 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 23 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 82000, + "fixed", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 1940, + 140 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 24 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2190, + 110 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 26 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_examples/any_grayscale_a" + ] + } + ], + "links": [ + [ + 14, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 15, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 16, + 3, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 17, + 4, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 18, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 19, + 6, + 0, + 9, + 3, + "IMAGE" + ], + [ + 20, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 21, + 9, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 22, + 9, + 1, + 10, + 2, + "CONDITIONING" + ], + [ + 23, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 24, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 25, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 26, + 11, + 0, + 12, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 20, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 740, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 21, + "title": "ANIMA LLLITE V2 ANY - GRAYSCALE A", + "bounding": [ + 810, + 35, + 1660, + 900 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite v2 any - grayscale A", + "author": "Kosinkadink", + "description": "Advanced-ControlNet example for Anima LLLite v2 any with grayscale A conditioning." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_any_grayscale_b.json b/examples/anima_lllite_v2/anima_lllite_any_grayscale_b.json new file mode 100644 index 0000000..2a2565e --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_any_grayscale_b.json @@ -0,0 +1,941 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 12, + "last_link_id": 26, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 20 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 250 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 14, + 15 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 360, + 190 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 14 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "anime illustration of a female knight in ornate silver plate armor holding a sword, side profile in a dense forest, detailed" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 360, + 440 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 15 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 470 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 23 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 650 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_any_grayscale_b_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 360, + 700 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 25 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 860, + 120 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 18 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 9, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1210, + 130 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 18 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 19 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 21 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 22 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1580, + 110 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 20 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 21 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 22 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 23 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 82000, + "fixed", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 1940, + 140 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 24 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2190, + 110 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 26 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_examples/any_grayscale_b" + ] + } + ], + "links": [ + [ + 14, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 15, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 16, + 3, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 17, + 4, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 18, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 19, + 6, + 0, + 9, + 3, + "IMAGE" + ], + [ + 20, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 21, + 9, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 22, + 9, + 1, + 10, + 2, + "CONDITIONING" + ], + [ + 23, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 24, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 25, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 26, + 11, + 0, + 12, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 20, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 740, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 21, + "title": "ANIMA LLLITE V2 ANY - GRAYSCALE B", + "bounding": [ + 810, + 35, + 1660, + 900 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite v2 any - grayscale B", + "author": "Kosinkadink", + "description": "Advanced-ControlNet example for Anima LLLite v2 any with grayscale B conditioning." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_any_hed_scribble.json b/examples/anima_lllite_v2/anima_lllite_any_hed_scribble.json new file mode 100644 index 0000000..bf7a500 --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_any_hed_scribble.json @@ -0,0 +1,941 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 12, + "last_link_id": 26, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 20 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 250 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 14, + 15 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 360, + 190 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 14 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "anime illustration of a female knight in ornate silver plate armor holding a sword, side profile in a dense forest, detailed" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 360, + 440 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 15 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 470 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 23 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 650 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_any_hed_scribble_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 360, + 700 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 25 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 860, + 120 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 18 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 9, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1210, + 130 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 18 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 19 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 21 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 22 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1580, + 110 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 20 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 21 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 22 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 23 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 82000, + "fixed", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 1940, + 140 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 24 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2190, + 110 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 26 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_examples/any_hed_scribble" + ] + } + ], + "links": [ + [ + 14, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 15, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 16, + 3, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 17, + 4, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 18, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 19, + 6, + 0, + 9, + 3, + "IMAGE" + ], + [ + 20, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 21, + 9, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 22, + 9, + 1, + 10, + 2, + "CONDITIONING" + ], + [ + 23, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 24, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 25, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 26, + 11, + 0, + 12, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 20, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 740, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 21, + "title": "ANIMA LLLITE V2 ANY - HED SCRIBBLE", + "bounding": [ + 810, + 35, + 1660, + 900 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite v2 any - HED scribble", + "author": "Kosinkadink", + "description": "Advanced-ControlNet example for Anima LLLite v2 any with HED scribble conditioning." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_any_lineart.json b/examples/anima_lllite_v2/anima_lllite_any_lineart.json new file mode 100644 index 0000000..c19e83e --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_any_lineart.json @@ -0,0 +1,941 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 12, + "last_link_id": 26, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 20 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 250 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 14, + 15 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 360, + 190 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 14 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "anime illustration of a female knight in ornate silver plate armor holding a sword, side profile in a dense forest, detailed" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 360, + 440 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 15 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 470 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 23 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 650 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_any_lineart_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 360, + 700 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 25 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 860, + 120 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 18 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 9, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1210, + 130 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 18 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 19 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 21 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 22 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1580, + 110 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 20 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 21 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 22 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 23 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 82000, + "fixed", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 1940, + 140 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 24 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2190, + 110 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 26 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_examples/any_lineart" + ] + } + ], + "links": [ + [ + 14, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 15, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 16, + 3, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 17, + 4, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 18, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 19, + 6, + 0, + 9, + 3, + "IMAGE" + ], + [ + 20, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 21, + 9, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 22, + 9, + 1, + 10, + 2, + "CONDITIONING" + ], + [ + 23, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 24, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 25, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 26, + 11, + 0, + 12, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 20, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 740, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 21, + "title": "ANIMA LLLITE V2 ANY - LINEART", + "bounding": [ + 810, + 35, + 1660, + 900 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite v2 any - lineart", + "author": "Kosinkadink", + "description": "Advanced-ControlNet example for Anima LLLite v2 any with lineart conditioning." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_any_pidinet_scribble.json b/examples/anima_lllite_v2/anima_lllite_any_pidinet_scribble.json new file mode 100644 index 0000000..8228d5b --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_any_pidinet_scribble.json @@ -0,0 +1,941 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 12, + "last_link_id": 26, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 20 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 250 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 14, + 15 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 360, + 190 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 14 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "anime illustration of a female knight in ornate silver plate armor holding a sword, side profile in a dense forest, detailed" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 360, + 440 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 15 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 470 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 23 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 650 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 19 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_any_pidinet_scribble_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 360, + 700 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 25 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 860, + 120 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 18 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 9, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1210, + 130 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 18 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 19 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 21 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 22 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1580, + 110 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 20 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 21 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 22 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 23 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 82000, + "fixed", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 1940, + 140 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 24 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 25 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2190, + 110 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 26 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_examples/any_pidinet_scribble" + ] + } + ], + "links": [ + [ + 14, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 15, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 16, + 3, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 17, + 4, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 18, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 19, + 6, + 0, + 9, + 3, + "IMAGE" + ], + [ + 20, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 21, + 9, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 22, + 9, + 1, + 10, + 2, + "CONDITIONING" + ], + [ + 23, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 24, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 25, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 26, + 11, + 0, + 12, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 20, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 740, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 21, + "title": "ANIMA LLLITE V2 ANY - PIDINET SCRIBBLE", + "bounding": [ + 810, + 35, + 1660, + 900 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite v2 any - PiDiNet scribble", + "author": "Kosinkadink", + "description": "Advanced-ControlNet example for Anima LLLite v2 any with PiDiNet scribble conditioning." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_inpainting.json b/examples/anima_lllite_v2/anima_lllite_inpainting.json new file mode 100644 index 0000000..e51b48f --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_inpainting.json @@ -0,0 +1,1053 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 14, + "last_link_id": 32, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 24 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 250 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 17, + 18 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 360, + 190 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 17 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 19 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "portrait of a woman with short blue hair, colorful anime illustration, detailed" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 360, + 440 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 18 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 20 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 470 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 27 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 650 + ], + "size": [ + 282.798828125, + 102 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 22 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": [ + 31 + ] + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_v2_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 360, + 700 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 29 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 860, + 120 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 21 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-inpainting-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-inpainting-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-inpainting-v2.safetensors" + ] + }, + { + "id": 9, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1210, + 130 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 19 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 20 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 21 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 22 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": 23 + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 25 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 26 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1580, + 110 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 24 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 25 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 26 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 27 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 28 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 82001, + "fixed", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 1940, + 140 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 28 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 29 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 30 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2190, + 110 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 30 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_examples/inpainting" + ] + }, + { + "id": 13, + "type": "ACN_AnimaLLLiteExtras", + "pos": [ + 860, + 520 + ], + "size": [ + 233.8032440185547, + 46 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "inpaint_mask", + "name": "inpaint_mask", + "type": "MASK", + "link": 31 + }, + { + "localized_name": "cn_extras", + "name": "cn_extras", + "shape": 7, + "type": "CN_WEIGHTS_EXTRAS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "cn_extras", + "name": "cn_extras", + "type": "CN_WEIGHTS_EXTRAS", + "links": [ + 32 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteExtras" + } + }, + { + "id": 14, + "type": "ACN_DefaultUniversalWeights", + "pos": [ + 1110, + 500 + ], + "size": [ + 208.1206268310547, + 46 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "cn_extras", + "name": "cn_extras", + "shape": 7, + "type": "CN_WEIGHTS_EXTRAS", + "link": 32 + } + ], + "outputs": [ + { + "localized_name": "CN_WEIGHTS", + "name": "CN_WEIGHTS", + "type": "CONTROL_NET_WEIGHTS", + "links": [ + 23 + ] + }, + { + "localized_name": "TK_SHORTCUT", + "name": "TK_SHORTCUT", + "type": "TIMESTEP_KEYFRAME", + "links": null + } + ], + "properties": { + "Node name for S&R": "ACN_DefaultUniversalWeights" + } + } + ], + "links": [ + [ + 17, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 18, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 19, + 3, + 0, + 9, + 0, + "CONDITIONING" + ], + [ + 20, + 4, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 21, + 8, + 0, + 9, + 2, + "CONTROL_NET" + ], + [ + 22, + 6, + 0, + 9, + 3, + "IMAGE" + ], + [ + 23, + 14, + 0, + 9, + 7, + "CONTROL_NET_WEIGHTS" + ], + [ + 24, + 1, + 0, + 10, + 0, + "MODEL" + ], + [ + 25, + 9, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 26, + 9, + 1, + 10, + 2, + "CONDITIONING" + ], + [ + 27, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 28, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 29, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 30, + 11, + 0, + 12, + 0, + "IMAGE" + ], + [ + 31, + 6, + 1, + 13, + 0, + "MASK" + ], + [ + 32, + 13, + 0, + 14, + 0, + "CN_WEIGHTS_EXTRAS" + ] + ], + "groups": [ + { + "id": 20, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 740, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 21, + "title": "ANIMA LLLITE - INPAINTING", + "bounding": [ + 810, + 35, + 1660, + 900 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite inpainting", + "author": "Kosinkadink", + "description": "Advanced-ControlNet example for the Anima LLLite inpainting checkpoint." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_v2_any_effect_mask.json b/examples/anima_lllite_v2/anima_lllite_v2_any_effect_mask.json new file mode 100644 index 0000000..a747491 --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_v2_any_effect_mask.json @@ -0,0 +1,2374 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 29, + "last_link_id": 92, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 100 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 49, + 57, + 72, + 85 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 280 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 47, + 48 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 370, + 250 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 47 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 50, + 61, + 68, + 80 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "a colorful fantasy castle with tall ornate towers in a green mountain valley, anime illustration, warm sunset" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 370, + 500 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 48 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 51, + 62, + 69, + 81 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 500 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 52, + 63, + 75, + 88 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 730 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 59, + 71, + 83 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_v2_any_control.png", + "image" + ] + }, + { + "id": 7, + "type": "LoadImage", + "pos": [ + 370, + 730 + ], + "size": [ + 282.798828125, + 314 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": null + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": [ + 84 + ] + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_v2_left_half_mask.png", + "image" + ] + }, + { + "id": 8, + "type": "VAELoader", + "pos": [ + 50, + 950 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 54, + 65, + 77, + 90 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 9, + "type": "KSampler", + "pos": [ + 960, + 90 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 49 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 50 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 51 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 52 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 53, + 56 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 246813579, + "fixed", + 16, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 10, + "type": "VAEDecode", + "pos": [ + 1320, + 110 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 53 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 54 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 55 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 11, + "type": "SaveImage", + "pos": [ + 1550, + 70 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 55 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/baseline_no_control" + ] + }, + { + "id": 12, + "type": "SaveLatent", + "pos": [ + 1550, + 180 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 56 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/baseline_no_control" + ] + }, + { + "id": 13, + "type": "ModelPatchLoader", + "pos": [ + 960, + 420 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "name", + "name": "name", + "type": "COMBO", + "widget": { + "name": "name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL_PATCH", + "name": "MODEL_PATCH", + "type": "MODEL_PATCH", + "links": [ + 58 + ] + } + ], + "properties": { + "Node name for S&R": "ModelPatchLoader", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 14, + "type": "AnimaLLLiteApply", + "pos": [ + 1280, + 400 + ], + "size": [ + 270, + 166 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 57 + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "MODEL_PATCH", + "link": 58 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 59 + }, + { + "localized_name": "mask", + "name": "mask", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 60 + ] + } + ], + "properties": { + "Node name for S&R": "AnimaLLLiteApply" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 15, + "type": "KSampler", + "pos": [ + 1640, + 390 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 60 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 61 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 62 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 63 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 64, + 67 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 246813579, + "fixed", + 16, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 16, + "type": "VAEDecode", + "pos": [ + 2000, + 410 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 64 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 65 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 66 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 17, + "type": "SaveImage", + "pos": [ + 2240, + 370 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 26, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 66 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/vanilla_full_control" + ] + }, + { + "id": 18, + "type": "SaveLatent", + "pos": [ + 2240, + 480 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 67 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/vanilla_full_control" + ] + }, + { + "id": 19, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 960, + 790 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 70, + 82 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-any-test-like-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-any-test-like-v2.safetensors" + ] + }, + { + "id": 20, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1280, + 760 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 68 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 69 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 70 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 71 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 73 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 74 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 21, + "type": "KSampler", + "pos": [ + 1640, + 750 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 72 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 73 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 74 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 75 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 76, + 79 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 246813579, + "fixed", + 16, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 22, + "type": "VAEDecode", + "pos": [ + 2000, + 770 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 76 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 77 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 78 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 23, + "type": "SaveImage", + "pos": [ + 2240, + 730 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 27, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 78 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/advanced_full_control" + ] + }, + { + "id": 24, + "type": "SaveLatent", + "pos": [ + 2240, + 840 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 23, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 79 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/advanced_full_control" + ] + }, + { + "id": 25, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1280, + 1110 + ], + "size": [ + 287.86183776855466, + 266 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 80 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 81 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 82 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 83 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": 84 + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": null + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 86 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 87 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 26, + "type": "KSampler", + "pos": [ + 1640, + 1100 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 85 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 86 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 87 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 88 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 89, + 92 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 246813579, + "fixed", + 16, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 27, + "type": "VAEDecode", + "pos": [ + 2000, + 1120 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 24, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 89 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 90 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 91 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 28, + "type": "SaveImage", + "pos": [ + 2240, + 1080 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 28, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 91 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/advanced_left_half_mask" + ] + }, + { + "id": 29, + "type": "SaveLatent", + "pos": [ + 2240, + 1190 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 25, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 92 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_any_mask/advanced_left_half_mask" + ] + } + ], + "links": [ + [ + 47, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 48, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 49, + 1, + 0, + 9, + 0, + "MODEL" + ], + [ + 50, + 3, + 0, + 9, + 1, + "CONDITIONING" + ], + [ + 51, + 4, + 0, + 9, + 2, + "CONDITIONING" + ], + [ + 52, + 5, + 0, + 9, + 3, + "LATENT" + ], + [ + 53, + 9, + 0, + 10, + 0, + "LATENT" + ], + [ + 54, + 8, + 0, + 10, + 1, + "VAE" + ], + [ + 55, + 10, + 0, + 11, + 0, + "IMAGE" + ], + [ + 56, + 9, + 0, + 12, + 0, + "LATENT" + ], + [ + 57, + 1, + 0, + 14, + 0, + "MODEL" + ], + [ + 58, + 13, + 0, + 14, + 1, + "MODEL_PATCH" + ], + [ + 59, + 6, + 0, + 14, + 2, + "IMAGE" + ], + [ + 60, + 14, + 0, + 15, + 0, + "MODEL" + ], + [ + 61, + 3, + 0, + 15, + 1, + "CONDITIONING" + ], + [ + 62, + 4, + 0, + 15, + 2, + "CONDITIONING" + ], + [ + 63, + 5, + 0, + 15, + 3, + "LATENT" + ], + [ + 64, + 15, + 0, + 16, + 0, + "LATENT" + ], + [ + 65, + 8, + 0, + 16, + 1, + "VAE" + ], + [ + 66, + 16, + 0, + 17, + 0, + "IMAGE" + ], + [ + 67, + 15, + 0, + 18, + 0, + "LATENT" + ], + [ + 68, + 3, + 0, + 20, + 0, + "CONDITIONING" + ], + [ + 69, + 4, + 0, + 20, + 1, + "CONDITIONING" + ], + [ + 70, + 19, + 0, + 20, + 2, + "CONTROL_NET" + ], + [ + 71, + 6, + 0, + 20, + 3, + "IMAGE" + ], + [ + 72, + 1, + 0, + 21, + 0, + "MODEL" + ], + [ + 73, + 20, + 0, + 21, + 1, + "CONDITIONING" + ], + [ + 74, + 20, + 1, + 21, + 2, + "CONDITIONING" + ], + [ + 75, + 5, + 0, + 21, + 3, + "LATENT" + ], + [ + 76, + 21, + 0, + 22, + 0, + "LATENT" + ], + [ + 77, + 8, + 0, + 22, + 1, + "VAE" + ], + [ + 78, + 22, + 0, + 23, + 0, + "IMAGE" + ], + [ + 79, + 21, + 0, + 24, + 0, + "LATENT" + ], + [ + 80, + 3, + 0, + 25, + 0, + "CONDITIONING" + ], + [ + 81, + 4, + 0, + 25, + 1, + "CONDITIONING" + ], + [ + 82, + 19, + 0, + 25, + 2, + "CONTROL_NET" + ], + [ + 83, + 6, + 0, + 25, + 3, + "IMAGE" + ], + [ + 84, + 7, + 1, + 25, + 4, + "MASK" + ], + [ + 85, + 1, + 0, + 26, + 0, + "MODEL" + ], + [ + 86, + 25, + 0, + 26, + 1, + "CONDITIONING" + ], + [ + 87, + 25, + 1, + 26, + 2, + "CONDITIONING" + ], + [ + 88, + 5, + 0, + 26, + 3, + "LATENT" + ], + [ + 89, + 26, + 0, + 27, + 0, + "LATENT" + ], + [ + 90, + 8, + 0, + 27, + 1, + "VAE" + ], + [ + 91, + 27, + 0, + 28, + 0, + "IMAGE" + ], + [ + 92, + 26, + 0, + 29, + 0, + "LATENT" + ] + ], + "groups": [ + { + "id": 30, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 35, + 800, + 1080 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 31, + "title": "NO CONTROL BASELINE", + "bounding": [ + 900, + 35, + 1000, + 300 + ], + "color": "#666666", + "font_size": 32, + "flags": {} + }, + { + "id": 32, + "title": "VANILLA COMFYUI - FULL CONTROL", + "bounding": [ + 900, + 350, + 1700, + 340 + ], + "color": "#8f6844", + "font_size": 32, + "flags": {} + }, + { + "id": 33, + "title": "ADVANCED-CONTROLNET - FULL CONTROL", + "bounding": [ + 900, + 720, + 1700, + 340 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 34, + "title": "ADVANCED-CONTROLNET - LEFT-HALF MASK", + "bounding": [ + 1200, + 1070, + 1400, + 330 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 1.0, + "offset": [ + 0, + 0 + ] + }, + "info": { + "name": "Anima LLLite v2 any-type effect mask validation", + "author": "Kosinkadink", + "description": "Compares no control, vanilla full control, Advanced-ControlNet full control, and Advanced-ControlNet with a left-half effect mask." + } + }, + "version": 0.4 +} diff --git a/examples/anima_lllite_v2/anima_lllite_v2_inpaint_comparison.json b/examples/anima_lllite_v2/anima_lllite_v2_inpaint_comparison.json new file mode 100644 index 0000000..fc7738c --- /dev/null +++ b/examples/anima_lllite_v2/anima_lllite_v2_inpaint_comparison.json @@ -0,0 +1,1753 @@ +{ + "id": "00000000-0000-0000-0000-000000000000", + "revision": 0, + "last_node_id": 23, + "last_link_id": 64, + "nodes": [ + { + "id": 1, + "type": "UNETLoader", + "pos": [ + 50, + 90 + ], + "size": [ + 270, + 82 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "localized_name": "unet_name", + "name": "unet_name", + "type": "COMBO", + "widget": { + "name": "unet_name" + }, + "link": null + }, + { + "localized_name": "weight_dtype", + "name": "weight_dtype", + "type": "COMBO", + "widget": { + "name": "weight_dtype" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 35, + 53 + ] + } + ], + "properties": { + "Node name for S&R": "UNETLoader", + "models": [ + { + "name": "anima-base-v1.0.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors", + "directory": "diffusion_models" + } + ] + }, + "widgets_values": [ + "anima-base-v1.0.safetensors", + "default" + ] + }, + { + "id": 2, + "type": "CLIPLoader", + "pos": [ + 50, + 290 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "localized_name": "clip_name", + "name": "clip_name", + "type": "COMBO", + "widget": { + "name": "clip_name" + }, + "link": null + }, + { + "localized_name": "type", + "name": "type", + "type": "COMBO", + "widget": { + "name": "type" + }, + "link": null + }, + { + "localized_name": "device", + "name": "device", + "shape": 7, + "type": "COMBO", + "widget": { + "name": "device" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CLIP", + "name": "CLIP", + "type": "CLIP", + "links": [ + 33, + 34 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPLoader", + "models": [ + { + "name": "qwen_3_06b_base.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/text_encoders/qwen_3_06b_base.safetensors", + "directory": "text_encoders" + } + ] + }, + "widgets_values": [ + "qwen_3_06b_base.safetensors", + "qwen_image", + "default" + ] + }, + { + "id": 3, + "type": "CLIPTextEncode", + "pos": [ + 390, + 260 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 33 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 40, + 48 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "a cozy red cottage in a green mountain valley, highly detailed photograph, warm golden hour" + ] + }, + { + "id": 4, + "type": "CLIPTextEncode", + "pos": [ + 390, + 510 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "localized_name": "clip", + "name": "clip", + "type": "CLIP", + "link": 34 + }, + { + "localized_name": "text", + "name": "text", + "type": "STRING", + "widget": { + "name": "text" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONDITIONING", + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 41, + 49 + ] + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ] + }, + { + "id": 5, + "type": "EmptySD3LatentImage", + "pos": [ + 50, + 510 + ], + "size": [ + 270, + 106 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "localized_name": "width", + "name": "width", + "type": "INT", + "widget": { + "name": "width" + }, + "link": null + }, + { + "localized_name": "height", + "name": "height", + "type": "INT", + "widget": { + "name": "height" + }, + "link": null + }, + { + "localized_name": "batch_size", + "name": "batch_size", + "type": "INT", + "widget": { + "name": "batch_size" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 42, + 56 + ] + } + ], + "properties": { + "Node name for S&R": "EmptySD3LatentImage" + }, + "widgets_values": [ + 512, + 512, + 1 + ] + }, + { + "id": 6, + "type": "LoadImage", + "pos": [ + 50, + 720 + ], + "size": [ + 280, + 102 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "localized_name": "image", + "name": "image", + "type": "COMBO", + "widget": { + "name": "image" + }, + "link": null + }, + { + "localized_name": "choose file to upload", + "name": "upload", + "type": "IMAGEUPLOAD", + "widget": { + "name": "upload" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 37, + 51 + ] + }, + { + "localized_name": "MASK", + "name": "MASK", + "type": "MASK", + "links": [ + 38, + 46 + ] + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "anima_lllite_v2_control.png", + "image" + ] + }, + { + "id": 7, + "type": "VAELoader", + "pos": [ + 50, + 950 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "localized_name": "vae_name", + "name": "vae_name", + "type": "COMBO", + "widget": { + "name": "vae_name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "VAE", + "name": "VAE", + "type": "VAE", + "links": [ + 44, + 58 + ] + } + ], + "properties": { + "Node name for S&R": "VAELoader", + "models": [ + { + "name": "qwen_image_vae.safetensors", + "url": "https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors", + "directory": "vae" + } + ] + }, + "widgets_values": [ + "qwen_image_vae.safetensors" + ] + }, + { + "id": 8, + "type": "ModelPatchLoader", + "pos": [ + 950, + 100 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "localized_name": "name", + "name": "name", + "type": "COMBO", + "widget": { + "name": "name" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL_PATCH", + "name": "MODEL_PATCH", + "type": "MODEL_PATCH", + "links": [ + 36 + ] + } + ], + "properties": { + "Node name for S&R": "ModelPatchLoader", + "models": [ + { + "name": "anima-lllite-inpainting-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-inpainting-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-inpainting-v2.safetensors" + ] + }, + { + "id": 9, + "type": "AnimaLLLiteApply", + "pos": [ + 1280, + 90 + ], + "size": [ + 270, + 166 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 35 + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "MODEL_PATCH", + "link": 36 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 37 + }, + { + "localized_name": "mask", + "name": "mask", + "shape": 7, + "type": "MASK", + "link": 38 + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "MODEL", + "name": "MODEL", + "type": "MODEL", + "links": [ + 39 + ] + } + ], + "properties": { + "Node name for S&R": "AnimaLLLiteApply" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 10, + "type": "KSampler", + "pos": [ + 1660, + 70 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 39 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 40 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 41 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 42 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 43, + 63 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 8675309, + "randomize", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 11, + "type": "VAEDecode", + "pos": [ + 2030, + 90 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 43 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 44 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 45, + 60 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 12, + "type": "SaveImage", + "pos": [ + 2310, + 60 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 45 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_pr/vanilla_core" + ] + }, + { + "id": 13, + "type": "ACN_AnimaLLLiteLoaderAdvanced", + "pos": [ + 950, + 650 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "model_patch", + "name": "model_patch", + "type": "COMBO", + "widget": { + "name": "model_patch" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "CONTROL_NET", + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 50 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteLoaderAdvanced", + "models": [ + { + "name": "anima-lllite-inpainting-v2.safetensors", + "url": "https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-inpainting-v2.safetensors", + "directory": "model_patches" + } + ] + }, + "widgets_values": [ + "anima-lllite-inpainting-v2.safetensors" + ] + }, + { + "id": 14, + "type": "ACN_AnimaLLLiteExtras", + "pos": [ + 950, + 800 + ], + "size": [ + 232.9, + 46 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "localized_name": "inpaint_mask", + "name": "inpaint_mask", + "type": "MASK", + "link": 46 + }, + { + "localized_name": "cn_extras", + "name": "cn_extras", + "shape": 7, + "type": "CN_WEIGHTS_EXTRAS", + "link": null + } + ], + "outputs": [ + { + "localized_name": "cn_extras", + "name": "cn_extras", + "type": "CN_WEIGHTS_EXTRAS", + "links": [ + 47 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AnimaLLLiteExtras" + } + }, + { + "id": 15, + "type": "ACN_DefaultUniversalWeights", + "pos": [ + 1290, + 710 + ], + "size": [ + 208.1206268310547, + 46 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "localized_name": "cn_extras", + "name": "cn_extras", + "shape": 7, + "type": "CN_WEIGHTS_EXTRAS", + "link": 47 + } + ], + "outputs": [ + { + "localized_name": "CN_WEIGHTS", + "name": "CN_WEIGHTS", + "type": "CONTROL_NET_WEIGHTS", + "links": [ + 52 + ] + }, + { + "localized_name": "TK_SHORTCUT", + "name": "TK_SHORTCUT", + "type": "TIMESTEP_KEYFRAME", + "links": null + } + ], + "properties": { + "Node name for S&R": "ACN_DefaultUniversalWeights" + } + }, + { + "id": 16, + "type": "ACN_AdvancedControlNetApply_v2", + "pos": [ + 1720, + 650 + ], + "size": [ + 288.9, + 266 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 48 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 49 + }, + { + "localized_name": "control_net", + "name": "control_net", + "type": "CONTROL_NET", + "link": 50 + }, + { + "localized_name": "image", + "name": "image", + "type": "IMAGE", + "link": 51 + }, + { + "localized_name": "mask_optional", + "name": "mask_optional", + "shape": 7, + "type": "MASK", + "link": null + }, + { + "localized_name": "timestep_kf", + "name": "timestep_kf", + "shape": 7, + "type": "TIMESTEP_KEYFRAME", + "link": null + }, + { + "localized_name": "latent_kf_override", + "name": "latent_kf_override", + "shape": 7, + "type": "LATENT_KEYFRAME", + "link": null + }, + { + "localized_name": "weights_override", + "name": "weights_override", + "shape": 7, + "type": "CONTROL_NET_WEIGHTS", + "link": 52 + }, + { + "localized_name": "vae_optional", + "name": "vae_optional", + "shape": 7, + "type": "VAE", + "link": null + }, + { + "localized_name": "strength", + "name": "strength", + "type": "FLOAT", + "widget": { + "name": "strength" + }, + "link": null + }, + { + "localized_name": "start_percent", + "name": "start_percent", + "type": "FLOAT", + "widget": { + "name": "start_percent" + }, + "link": null + }, + { + "localized_name": "end_percent", + "name": "end_percent", + "type": "FLOAT", + "widget": { + "name": "end_percent" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "links": [ + 54 + ] + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "links": [ + 55 + ] + } + ], + "properties": { + "Node name for S&R": "ACN_AdvancedControlNetApply_v2" + }, + "widgets_values": [ + 1, + 0, + 1 + ] + }, + { + "id": 17, + "type": "KSampler", + "pos": [ + 2110, + 630 + ], + "size": [ + 270, + 262 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "localized_name": "model", + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "localized_name": "positive", + "name": "positive", + "type": "CONDITIONING", + "link": 54 + }, + { + "localized_name": "negative", + "name": "negative", + "type": "CONDITIONING", + "link": 55 + }, + { + "localized_name": "latent_image", + "name": "latent_image", + "type": "LATENT", + "link": 56 + }, + { + "localized_name": "seed", + "name": "seed", + "type": "INT", + "widget": { + "name": "seed" + }, + "link": null + }, + { + "localized_name": "steps", + "name": "steps", + "type": "INT", + "widget": { + "name": "steps" + }, + "link": null + }, + { + "localized_name": "cfg", + "name": "cfg", + "type": "FLOAT", + "widget": { + "name": "cfg" + }, + "link": null + }, + { + "localized_name": "sampler_name", + "name": "sampler_name", + "type": "COMBO", + "widget": { + "name": "sampler_name" + }, + "link": null + }, + { + "localized_name": "scheduler", + "name": "scheduler", + "type": "COMBO", + "widget": { + "name": "scheduler" + }, + "link": null + }, + { + "localized_name": "denoise", + "name": "denoise", + "type": "FLOAT", + "widget": { + "name": "denoise" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "LATENT", + "name": "LATENT", + "type": "LATENT", + "links": [ + 57, + 64 + ] + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 8675309, + "randomize", + 12, + 1, + "euler", + "simple", + 1 + ] + }, + { + "id": 18, + "type": "VAEDecode", + "pos": [ + 2480, + 650 + ], + "size": [ + 140, + 46 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 57 + }, + { + "localized_name": "vae", + "name": "vae", + "type": "VAE", + "link": 58 + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 59, + 61 + ] + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 19, + "type": "SaveImage", + "pos": [ + 2760, + 610 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 20, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 59 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_pr/advanced_controlnet" + ] + }, + { + "id": 20, + "type": "ImageBlend", + "pos": [ + 3100, + 360 + ], + "size": [ + 270, + 102 + ], + "flags": {}, + "order": 21, + "mode": 0, + "inputs": [ + { + "localized_name": "image1", + "name": "image1", + "type": "IMAGE", + "link": 60 + }, + { + "localized_name": "image2", + "name": "image2", + "type": "IMAGE", + "link": 61 + }, + { + "localized_name": "blend_factor", + "name": "blend_factor", + "type": "FLOAT", + "widget": { + "name": "blend_factor" + }, + "link": null + }, + { + "localized_name": "blend_mode", + "name": "blend_mode", + "type": "COMBO", + "widget": { + "name": "blend_mode" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "IMAGE", + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 62 + ] + } + ], + "properties": { + "Node name for S&R": "ImageBlend" + }, + "widgets_values": [ + 1, + "difference" + ] + }, + { + "id": 21, + "type": "SaveImage", + "pos": [ + 3470, + 360 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 22, + "mode": 0, + "inputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "link": 62 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "images", + "name": "images", + "type": "IMAGE", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_pr/absolute_difference" + ] + }, + { + "id": 22, + "type": "SaveLatent", + "pos": [ + 2310, + 180 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 63 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_pr/vanilla_core" + ] + }, + { + "id": 23, + "type": "SaveLatent", + "pos": [ + 2760, + 750 + ], + "size": [ + 270, + 58 + ], + "flags": {}, + "order": 19, + "mode": 0, + "inputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "link": 64 + }, + { + "localized_name": "filename_prefix", + "name": "filename_prefix", + "type": "STRING", + "widget": { + "name": "filename_prefix" + }, + "link": null + } + ], + "outputs": [ + { + "localized_name": "samples", + "name": "samples", + "type": "LATENT", + "links": null + } + ], + "properties": {}, + "widgets_values": [ + "acn_anima_pr/advanced_controlnet" + ] + } + ], + "links": [ + [ + 33, + 2, + 0, + 3, + 0, + "CLIP" + ], + [ + 34, + 2, + 0, + 4, + 0, + "CLIP" + ], + [ + 35, + 1, + 0, + 9, + 0, + "MODEL" + ], + [ + 36, + 8, + 0, + 9, + 1, + "MODEL_PATCH" + ], + [ + 37, + 6, + 0, + 9, + 2, + "IMAGE" + ], + [ + 38, + 6, + 1, + 9, + 3, + "MASK" + ], + [ + 39, + 9, + 0, + 10, + 0, + "MODEL" + ], + [ + 40, + 3, + 0, + 10, + 1, + "CONDITIONING" + ], + [ + 41, + 4, + 0, + 10, + 2, + "CONDITIONING" + ], + [ + 42, + 5, + 0, + 10, + 3, + "LATENT" + ], + [ + 43, + 10, + 0, + 11, + 0, + "LATENT" + ], + [ + 44, + 7, + 0, + 11, + 1, + "VAE" + ], + [ + 45, + 11, + 0, + 12, + 0, + "IMAGE" + ], + [ + 46, + 6, + 1, + 14, + 0, + "MASK" + ], + [ + 47, + 14, + 0, + 15, + 0, + "CN_WEIGHTS_EXTRAS" + ], + [ + 48, + 3, + 0, + 16, + 0, + "CONDITIONING" + ], + [ + 49, + 4, + 0, + 16, + 1, + "CONDITIONING" + ], + [ + 50, + 13, + 0, + 16, + 2, + "CONTROL_NET" + ], + [ + 51, + 6, + 0, + 16, + 3, + "IMAGE" + ], + [ + 52, + 15, + 0, + 16, + 7, + "CONTROL_NET_WEIGHTS" + ], + [ + 53, + 1, + 0, + 17, + 0, + "MODEL" + ], + [ + 54, + 16, + 0, + 17, + 1, + "CONDITIONING" + ], + [ + 55, + 16, + 1, + 17, + 2, + "CONDITIONING" + ], + [ + 56, + 5, + 0, + 17, + 3, + "LATENT" + ], + [ + 57, + 17, + 0, + 18, + 0, + "LATENT" + ], + [ + 58, + 7, + 0, + 18, + 1, + "VAE" + ], + [ + 59, + 18, + 0, + 19, + 0, + "IMAGE" + ], + [ + 60, + 11, + 0, + 20, + 0, + "IMAGE" + ], + [ + 61, + 18, + 0, + 20, + 1, + "IMAGE" + ], + [ + 62, + 20, + 0, + 21, + 0, + "IMAGE" + ], + [ + 63, + 10, + 0, + 22, + 0, + "LATENT" + ], + [ + 64, + 17, + 0, + 23, + 0, + "LATENT" + ] + ], + "groups": [ + { + "id": 24, + "title": "SHARED INPUTS", + "bounding": [ + 10, + 25, + 820, + 1090 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 25, + "title": "VANILLA COMFYUI CORE", + "bounding": [ + 900, + 25, + 1760, + 390 + ], + "color": "#8f6844", + "font_size": 32, + "flags": {} + }, + { + "id": 26, + "title": "ADVANCED-CONTROLNET", + "bounding": [ + 900, + 460, + 2080, + 900 + ], + "color": "#3f789e", + "font_size": 32, + "flags": {} + }, + { + "id": 27, + "title": "EXACT COMPARISON", + "bounding": [ + 3030, + 300, + 760, + 300 + ], + "color": "#6f4d86", + "font_size": 32, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.9, + "offset": [ + 416, + 110 + ] + }, + "info": { + "name": "Anima LLLite v2 - Core vs Advanced-ControlNet", + "author": "Kosinkadink", + "description": "Runs the official Anima LLLite inpainting v2 model through vanilla ComfyUI core and Advanced-ControlNet with identical settings." + } + }, + "version": 0.4 +}