Add VAE encode/decode option nodes across legacy and Comfy v3 exports, with tooltip and registration coverage. Preserve cloned model graph composition for differential diffusion in tiled and regional sampling paths.
144 lines
4.6 KiB
Python
144 lines
4.6 KiB
Python
# SimpleSyrup - workflow-focused ComfyUI extensions for image generation
|
|
# Copyright (C) 2026 Artificial Sweetener and contributors
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
"""Comfy v3 node wrapper for VAE Encode (Options)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from importlib import import_module
|
|
from typing import TYPE_CHECKING, Any, ClassVar
|
|
|
|
from ..nodes import tooltips
|
|
from ..nodes.vae_options import (
|
|
VAE_ENCODE_TILE_SIZE_STEP,
|
|
VAE_OVERLAP_DEFAULT,
|
|
VAE_OVERLAP_MAX,
|
|
VAE_OVERLAP_MIN,
|
|
VAE_OVERLAP_STEP,
|
|
VAE_TEMPORAL_OVERLAP_DEFAULT,
|
|
VAE_TEMPORAL_OVERLAP_MAX,
|
|
VAE_TEMPORAL_OVERLAP_MIN,
|
|
VAE_TEMPORAL_OVERLAP_STEP,
|
|
VAE_TEMPORAL_SIZE_DEFAULT,
|
|
VAE_TEMPORAL_SIZE_MAX,
|
|
VAE_TEMPORAL_SIZE_MIN,
|
|
VAE_TEMPORAL_SIZE_STEP,
|
|
VAE_TILE_SIZE_DEFAULT,
|
|
VAE_TILE_SIZE_MAX,
|
|
VAE_TILE_SIZE_MIN,
|
|
VAEEncodeOptions,
|
|
)
|
|
|
|
if TYPE_CHECKING:
|
|
|
|
class _ComfyNodeBase:
|
|
"""Type-checking base for Comfy v3 nodes."""
|
|
|
|
RETURN_TYPES: ClassVar[list[str]]
|
|
RETURN_NAMES: ClassVar[list[str]]
|
|
|
|
else:
|
|
_ComfyNodeBase = import_module("comfy_api.latest").io.ComfyNode
|
|
|
|
_comfy_io: Any = None if TYPE_CHECKING else import_module("comfy_api.latest").io
|
|
|
|
|
|
class VAEEncodeOptionsV3(_ComfyNodeBase):
|
|
"""Expose VAE Encode (Options) through Comfy's v3 extension API."""
|
|
|
|
@classmethod
|
|
def define_schema(cls) -> Any:
|
|
"""Declare the VAE Encode (Options) v3 schema."""
|
|
|
|
return _comfy_io.Schema(
|
|
node_id="SimpleSyrup.VAEEncodeOptions",
|
|
display_name="VAE Encode (Options)",
|
|
enable_expand=True,
|
|
category="SimpleSyrup/Latent",
|
|
description=VAEEncodeOptions.DESCRIPTION,
|
|
search_aliases=VAEEncodeOptions.SEARCH_ALIASES,
|
|
inputs=[
|
|
_comfy_io.Boolean.Input(
|
|
"use_tiling",
|
|
default=False,
|
|
tooltip=tooltips.VAE_OPTIONS_USE_TILING,
|
|
),
|
|
_comfy_io.Image.Input(
|
|
"pixels",
|
|
raw_link=True,
|
|
tooltip=tooltips.VAE_OPTIONS_ENCODE_PIXELS,
|
|
),
|
|
_comfy_io.Vae.Input(
|
|
"vae",
|
|
raw_link=True,
|
|
tooltip=tooltips.VAE_OPTIONS_VAE,
|
|
),
|
|
_comfy_io.Int.Input(
|
|
"tile_size",
|
|
default=VAE_TILE_SIZE_DEFAULT,
|
|
min=VAE_TILE_SIZE_MIN,
|
|
max=VAE_TILE_SIZE_MAX,
|
|
step=VAE_ENCODE_TILE_SIZE_STEP,
|
|
advanced=True,
|
|
tooltip=tooltips.VAE_OPTIONS_TILE_SIZE,
|
|
),
|
|
_comfy_io.Int.Input(
|
|
"overlap",
|
|
default=VAE_OVERLAP_DEFAULT,
|
|
min=VAE_OVERLAP_MIN,
|
|
max=VAE_OVERLAP_MAX,
|
|
step=VAE_OVERLAP_STEP,
|
|
advanced=True,
|
|
tooltip=tooltips.VAE_OPTIONS_OVERLAP,
|
|
),
|
|
_comfy_io.Int.Input(
|
|
"temporal_size",
|
|
default=VAE_TEMPORAL_SIZE_DEFAULT,
|
|
min=VAE_TEMPORAL_SIZE_MIN,
|
|
max=VAE_TEMPORAL_SIZE_MAX,
|
|
step=VAE_TEMPORAL_SIZE_STEP,
|
|
advanced=True,
|
|
tooltip=tooltips.VAE_OPTIONS_ENCODE_TEMPORAL_SIZE,
|
|
),
|
|
_comfy_io.Int.Input(
|
|
"temporal_overlap",
|
|
default=VAE_TEMPORAL_OVERLAP_DEFAULT,
|
|
min=VAE_TEMPORAL_OVERLAP_MIN,
|
|
max=VAE_TEMPORAL_OVERLAP_MAX,
|
|
step=VAE_TEMPORAL_OVERLAP_STEP,
|
|
advanced=True,
|
|
tooltip=tooltips.VAE_OPTIONS_TEMPORAL_OVERLAP,
|
|
),
|
|
],
|
|
outputs=[
|
|
_comfy_io.Latent.Output(
|
|
"latent",
|
|
tooltip=tooltips.VAE_OPTIONS_LATENT_OUTPUT,
|
|
),
|
|
],
|
|
)
|
|
|
|
@classmethod
|
|
def execute(
|
|
cls,
|
|
use_tiling: bool,
|
|
pixels: object,
|
|
vae: object,
|
|
tile_size: int,
|
|
overlap: int,
|
|
temporal_size: int,
|
|
temporal_overlap: int,
|
|
) -> Any:
|
|
"""Expand through the legacy VAE Encode (Options) implementation."""
|
|
|
|
return VAEEncodeOptions().encode(
|
|
use_tiling=use_tiling,
|
|
pixels=pixels,
|
|
vae=vae,
|
|
tile_size=tile_size,
|
|
overlap=overlap,
|
|
temporal_size=temporal_size,
|
|
temporal_overlap=temporal_overlap,
|
|
)
|