Stability-AI/generative-models · error · KeyError

need either 'input_key' or 'input_keys' for embedder {embedd

Error message

need either 'input_key' or 'input_keys' for embedder {embedder.__class__.__name__}

What it means

When the Embedder (Inpainter) wrapper builds its list of embedders, each embedder config must declare which input(s) of the batch to embed, via 'input_key' (single) or 'input_keys' (list). If neither key is present in an embedder's config entry, a KeyError is raised naming the embedder class.

Source

Thrown at sgm/modules/encoders/modules.py:100

            ), f"embedder model {embedder.__class__.__name__} has to inherit from AbstractEmbModel"
            embedder.is_trainable = embconfig.get("is_trainable", False)
            embedder.ucg_rate = embconfig.get("ucg_rate", 0.0)
            if not embedder.is_trainable:
                embedder.train = disabled_train
                for param in embedder.parameters():
                    param.requires_grad = False
                embedder.eval()
            print(
                f"Initialized embedder #{n}: {embedder.__class__.__name__} "
                f"with {count_params(embedder, False)} params. Trainable: {embedder.is_trainable}"
            )

            if "input_key" in embconfig:
                embedder.input_key = embconfig["input_key"]
            elif "input_keys" in embconfig:
                embedder.input_keys = embconfig["input_keys"]
            else:
                raise KeyError(
                    f"need either 'input_key' or 'input_keys' for embedder {embedder.__class__.__name__}"
                )

            embedder.legacy_ucg_val = embconfig.get("legacy_ucg_value", None)
            if embedder.legacy_ucg_val is not None:
                embedder.ucg_prng = np.random.RandomState()

            embedders.append(embedder)
        self.embedders = nn.ModuleList(embedders)

    def possibly_get_ucg_val(self, embedder: AbstractEmbModel, batch: Dict) -> Dict:
        assert embedder.legacy_ucg_val is not None
        p = embedder.ucg_rate
        val = embedder.legacy_ucg_val
        for i in range(len(batch[embedder.input_key])):
            if embedder.ucg_prng.choice(2, p=[1 - p, p]):
                batch[embedder.input_key][i] = val
        return batch

View on GitHub (pinned to e8cd657656)

Solutions

  1. Add input_key (e.g. 'txt') or input_keys (e.g. ['txt','mask']) to the embedder's config entry
  2. Compare with a working config in sgm/modules/encoders/modules.py to see the expected shape
  3. Check the embedder class you target to confirm which key names it consumes downstream

Example fix

// before
embedder:
  target: sgm.modules.encoders.modules.FrozenCLIPEmbedder
// after
embedder:
  target: sgm.modules.encoders.modules.FrozenCLIPEmbedder
  params:
    layer: hidden
embedder:
  input_key: txt
  target: sgm.modules.encoders.modules.FrozenCLIPEmbedder
Defensive patterns

Strategy: validation

Validate before calling

def validate_embedder_config(embconfig):
    assert 'target' in embconfig, 'embedder missing target'
    assert 'input_key' in embconfig or 'input_keys' in embconfig, \
        f"embedder {embconfig.get('target')} needs input_key or input_keys"
for e in config['embedder']:
    validate_embedder_config(e)

Type guard

def has_input_config(embconfig: dict) -> bool:
    return 'input_key' in embconfig or 'input_keys' in embconfig

Try / catch

try:
    model = instantiate_from_config(config)
except KeyError as e:
    if 'input_key' in str(e):
        for i, ec in enumerate(config['embedder']):
            if 'input_key' not in ec and 'input_keys' not in ec:
                logging.error('embedder %d (%s) missing input_key/input_keys', i, ec.get('target'))
    raise

Prevention

When it happens

Trigger: Building a model whose 'embedder' config list contains a dict entry missing both 'input_key' and 'input_keys', e.g. {'embedder': {'target': '...FrozenCLIPEmbedder'}, 'ucg_rate': 0.1}.

Common situations: Hand-editing model YAML configs and dropping the input_key line; copying an embedder config from a repo where the key was named differently; adding a new embedder without wiring its input key.

Related errors


AI-assisted analysis of Stability-AI/generative-models@e8cd657656 (2026-08-29). Data as JSON: /api/errors/9eb24e9166e80f8c. Report an issue: GitHub.