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
- Set every entry of down_block_types to "DownEncoderBlock3D" (one per block_out_channels entry).
- Start from the SeedVR2 checkpoint's embedded config instead of an unrelated VAE config.
- Remove custom block-type entries — this encoder has no 2D or attention down-block variants.
- 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
- Start SeedVR2 VAE configs from the checkpoint's embedded config, not from an SD VAE template.
- Validate block type names against the allowed set before constructing the encoder.
- Keep len(down_block_types) == len(block_out_channels).
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
- Minimum cutoff must be larger than zero.
- A cutoff above 0.5 does not make sense.
- SeedVR2 upsample expected {self.channels} channels, got {hid
- SeedVR2 downsample expected {self.channels} channels, got {h
- Unknown normalization type: {norm_type}
AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14).
Data as JSON: /api/errors/1e3559792d3e4feb.
Report an issue: GitHub.