from __future__ import annotations import json import logging import os from datetime import datetime import folder_paths import comfy.ldm.modules.attention import comfy.sd import comfy.utils from nodes import CLIPTextEncode, EmptyLatentImage, ControlNetApplyAdvanced, ControlNetLoader from . import flake_families, flake_io from .flake_io import _resolve_model_name def _split_stem_for_filename(stem: str) -> tuple[str, str, str, str]: """Parse one filename-prefix stem into placement buckets, honoring the ``**`` suffix marker (#290). The last path segment is the filename contribution; preceding segments are folders. A ``**`` before the folder portion makes that folder a *suffix* (placed after other flakes' folders); a ``**`` before the file portion makes that name a *suffix* (placed after other flakes' names). Returns ``(folder_prefix, folder_suffix, file_prefix, file_suffix)`` with each element possibly empty. Folder values keep their trailing ``/``. """ folder_prefix = folder_suffix = "" file_prefix = file_suffix = "" slash = stem.rfind("/") if slash >= 0: folder_region = stem[:slash + 1] file_region = stem[slash + 1:] else: folder_region = "" file_region = stem if folder_region: if folder_region.startswith("**"): folder_suffix = folder_region[2:].replace("**", "") else: folder_prefix = folder_region.replace("**", "") if file_region: before, sep, after = file_region.partition("**") file_prefix = before.replace("**", "") if sep: file_suffix = after.replace("**", "") return folder_prefix, folder_suffix, file_prefix, file_suffix def _build_filename_prefix(preset_name: str, stems: list[str]) -> str: """Build a filename prefix from preset name and flake stems. Folders accumulate as ```` and the filename as ``