Two bugs in one:
1. `_load_preset_bundle` used the preset's full yaml-relative name
(e.g. img/illustrious/nova/nova_anime_xl_v17) as filename_state["preset"],
which leaked into the output directory structure. The user expects
the output path to derive only from the explicit Filename Prefix
field on the preset — not from where the yaml file happens to live
on disk. Set preset to "" and let the explicit prefix (added via
stems) be the sole contributor.
2. The preset modal's syncOutputPath() unconditionally rewrote
filenamePrefixInput.value from the Name field every time the user
typed in Name. The user could never keep an empty or customized
prefix. Add filenamePrefixManuallyEdited tracking (mirroring the
existing pathManuallyEdited pattern) so once the user touches the
field, sync stops clobbering it.
Closes#217
Skip empty stem values when building the filename prefix so that
generations without prefixes produce 09-58-35_00001.png instead of
09-58-35_00001_.png
Stems no longer reset to [] on each FlakeStack — they accumulate across
the chain by preserving the incoming list. Runtime output_stem overrides
from the option panel dropdown are now applied by resolve() reading
_pendingData.output_stem from the serialised entry.
Creates FlakeGenerate node that takes flake_data input, runs KSampler, VAE Decode, and SaveImage internally. Displays seed widget with randomize/increment/decrement controls, 2x2 preview grid (reusing flake-preview.js), and generated image preview in a single DOM widget.
- Clicking the ribbon toggles a flake between active and bypassed states
- Bypassed flakes show greyed out appearance with a red strikethrough line
- Bypassed ribbon is dimmed with click-to-activate tooltip
- Backend (FlakeStack.execute) skips bypassed flakes during processing
- Bypassed state stored as 'bypassed' field in flakes_json entries
- Works in both FlakeStack and FlakeCombo grid items
Closes#121
The _shorten_filenames function was adding both the full filename and the
stem (without extension) to dropdown lists, causing models like VAEs and
text encoders to appear twice (e.g. 'ae' and 'ae.safetensors'). Now only
the stem is returned.
Backend resolution helpers (_resolve_model_name) are added to translate
stem-only names back to full filenames when loading checkpoin/vae/
text_encoder/controlnet models, ensuring backwards compatibility with
existing YAML files that store full filenames.
- FlakeModelPreset now outputs a single FLAKE_DATA pin
- FlakeStack now takes and returns a single FLAKE_DATA pin
- FlakeDataSplit(All/Select) now output all 12 individual types directly
- IntoFlakeData(All/Select) now take individual Comfy types as optional inputs
- Removed FlakesModel, FlakesCond, FlakesSampler (replaced by FlakeDataSplitAll)
- Removed flake_unpack_nodes.py entirely
FlakeStack.execute() was appending to generation_data[7]['stems'] in
place. When ComfyUI re-used the cached tuple from a prior run, each
queued generation compounded the output_stem, producing paths like
frieren/frieren/frieren/... after a few runs.
Build a fresh stems list every execution; preserve only the preset name
from any upstream filename state.
Backend:
- Add LoraEntry dataclass with name, url, path, strength
- Flake dataclass now has loras[] list; legacy lora_path/strength kept for compat
- _flake_from_raw parses both new multi-LoRA and legacy single-LoRA formats
- resolve() applies multi-LoRA strength overrides from grid entries
- full_flake_node.py applies all LoRAs in order
Frontend:
- Flake edit modal: each LoRA gets its own section with name, URL, path picker,
strength slider. +Add LoRA button to add more. [...] button edits name/URL.
- Grid dropdown: shows one strength slider per LoRA, labeled with LoRA name
- Grid entries store loras[] array of strengths for overrides
- Backward compatibility: old entries with single strength auto-converted
Closes#30
- Model Preset initializes filename prefix with <PresetName>/
- New optional 'Output Filename Stem' field in flakes editor
- FlakeStack collects stems from all flakes and builds prefix:
- Folder stems (containing '/') are appended to path
- Date folder <YYYY-MM-DD> inserted after last folder stem
- Filename starts with <HH-MM-SS> followed by _ separated file stems
- FlakesGenerationData converter outputs filename_prefix as 6th pin
Closes#24