Comfy-Org/ComfyUI · error · ValueError

SeedVR2 encoder only supports DownEncoderBlock3D, got {down_

Error message

SeedVR2 encoder only supports DownEncoderBlock3D, got {down_block_type}.

What it means

The SeedVR2 VAE encoder constructor iterates down_block_types and only accepts the literal "DownEncoderBlock3D" — the single 3D ResNet block type this implementation provides. Any other block name (e.g. diffusers' "DownEncoderBlock2D" or a typo) raises during construction. This is a config-surface restriction of ComfyUI's SeedVR2 port, not a data-dependent error.

Source

Thrown at comfy/ldm/seedvr/vae.py:1138

            block_out_channels[0],
            kernel_size=3,
            stride=1,
            padding=1,
            inflation_mode=inflation_mode,
        )

        self.mid_block = None
        self.down_blocks = nn.ModuleList([])

        output_channel = block_out_channels[0]
        for i, down_block_type in enumerate(down_block_types):
            input_channel = output_channel
            output_channel = block_out_channels[i]
            is_final_block = i == len(block_out_channels) - 1
            is_temporal_down_block = i >= len(block_out_channels) - self.temporal_down_num - 1

            if down_block_type != "DownEncoderBlock3D":
                raise ValueError(f"SeedVR2 encoder only supports DownEncoderBlock3D, got {down_block_type}.")

            down_block = DownEncoderBlock3D(
                num_layers=self.layers_per_block,
                in_channels=input_channel,
                out_channels=output_channel,
                add_downsample=not is_final_block,
                resnet_eps=1e-6,
                resnet_groups=norm_num_groups,
                temporal_down=is_temporal_down_block,
                spatial_down=True,
                inflation_mode=inflation_mode,
                time_receptive_field=time_receptive_field,
            )
            self.down_blocks.append(down_block)

        self.mid_block = UNetMidBlock3D(
            in_channels=block_out_channels[-1],
            resnet_eps=1e-6,

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Set every entry of down_block_types to "DownEncoderBlock3D" (one per block_out_channels entry).
  2. Start from the SeedVR2 checkpoint's embedded config instead of an unrelated VAE config.
  3. Remove custom block-type entries — this encoder has no 2D or attention down-block variants.
  4. Verify the list length matches block_out_channels after fixing entries.

Example fix

# before
down_block_types=("DownEncoderBlock2D", "DownEncoderBlock2D")
# after
down_block_types=("DownEncoderBlock3D", "DownEncoderBlock3D")
Defensive patterns

Strategy: validation

Validate before calling

VALID_DOWN_BLOCKS = {"DownEncoderBlock3D"}

def validate_down_block_types(down_block_types):
    for bt in down_block_types:
        if bt not in VALID_DOWN_BLOCKS:
            raise ValueError(f"{bt!r} unsupported; SeedVR2 encoder accepts only 'DownEncoderBlock3D'")
    return down_block_types

Type guard

def is_valid_down_block_type(name) -> bool:
    return name == "DownEncoderBlock3D"

Prevention

When it happens

Trigger: Constructing SeedVR2Encoder with a down_block_types list containing anything other than "DownEncoderBlock3D" — typically a config copied from a diffusers image VAE (DownEncoderBlock2D) or hand-written with a typo.

Common situations: Reusing a Stable Diffusion VAE config as a template for SeedVR2; converting configs from another repo whose block names differ; LLM-assisted config generation inventing block names.

Related errors


AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14). Data as JSON: /api/errors/1e3559792d3e4feb. Report an issue: GitHub.