Comfy-Org/ComfyUI · error · RuntimeError

SeedVR2Conditioning: model object does not match expected Se

Error message

SeedVR2Conditioning: model object does not match expected SeedVR2 structure: 'model.model' has no 'diffusion_model' attribute (got type {type(inner).__name__}).

What it means

Raised by the SeedVR2 resolver when input.model exists and is non-None but lacks a 'diffusion_model' attribute. The node specifically needs the ComfyUI BaseModel (model.model.diffusion_model) to reach the SeedVR2 network internals; a wrapper of a different shape fails here with the inner object's type name.

Source

Thrown at comfy_extras/nodes_seedvr.py:50

_SEEDVR2_INVALID_MODEL_MSG_PREFIX = "SeedVR2Conditioning: model object does not match expected SeedVR2 structure"
_ATTR_MISSING = object()


def _resolve_seedvr2_diffusion_model(model):
    inner = getattr(model, "model", _ATTR_MISSING)
    if inner is _ATTR_MISSING:
        raise RuntimeError(
            f"{_SEEDVR2_INVALID_MODEL_MSG_PREFIX}: input has no 'model' attribute "
            f"(got type {type(model).__name__})."
        )
    if inner is None:
        raise RuntimeError(
            f"{_SEEDVR2_INVALID_MODEL_MSG_PREFIX}: input.model is None "
            f"(input type {type(model).__name__})."
        )
    diffusion_model = getattr(inner, "diffusion_model", _ATTR_MISSING)
    if diffusion_model is _ATTR_MISSING:
        raise RuntimeError(
            f"{_SEEDVR2_INVALID_MODEL_MSG_PREFIX}: 'model.model' has no "
            f"'diffusion_model' attribute (got type {type(inner).__name__})."
        )
    if diffusion_model is None:
        raise RuntimeError(
            f"{_SEEDVR2_INVALID_MODEL_MSG_PREFIX}: 'model.model.diffusion_model' "
            f"is None (model.model type {type(inner).__name__})."
        )
    return diffusion_model


def div_pad(image, factor):
    height_factor, width_factor = factor
    height, width = image.shape[-2:]

    pad_height = (height_factor - (height % height_factor)) % height_factor
    pad_width = (width_factor - (width % width_factor)) % width_factor

View on GitHub (pinned to 1c6d8d45b3)

Solutions

  1. Use the standard model loader output (ModelPatcher over BaseModel) as the node's model input.
  2. If writing a custom wrapper, expose .diffusion_model on the inner object the node receives.
  3. Audit the graph for a mis-connected CLIP/VAE output on the model line.
Defensive patterns

Strategy: validation

Validate before calling

inner = getattr(model, 'model', None)
if inner is not None and not hasattr(inner, 'diffusion_model'):
    raise TypeError(f"model.model is {type(inner).__name__}, not a BaseModel with diffusion_model")

Type guard

def has_diffusion_model(model) -> bool:
    inner = getattr(model, 'model', None)
    return inner is not None and getattr(inner, 'diffusion_model', None) is not None

Prevention

When it happens

Trigger: Connecting an object whose .model is a CLIP, VAE, or other component instead of a BaseModel; custom model classes that nest the network differently (e.g. .network instead of .diffusion_model); adapters that wrap without forwarding the attribute.

Common situations: Cross-wiring CLIP/VAE loader outputs that happen to have a .model field; using an alternative loader from a custom node pack that builds a non-standard wrapper; version changes in wrapper class layout.

Related errors


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