{"record":{"id":"9eb24e9166e80f8c","repo":"Stability-AI/generative-models","slug":"need-either-input-key-or-input-keys-for-embedd","errorCode":null,"errorMessage":"need either 'input_key' or 'input_keys' for embedder {embedder.__class__.__name__}","messagePattern":"need either 'input_key' or 'input_keys' for embedder (.+?)","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"sgm/modules/encoders/modules.py","lineNumber":100,"sourceCode":"            ), f\"embedder model {embedder.__class__.__name__} has to inherit from AbstractEmbModel\"\n            embedder.is_trainable = embconfig.get(\"is_trainable\", False)\n            embedder.ucg_rate = embconfig.get(\"ucg_rate\", 0.0)\n            if not embedder.is_trainable:\n                embedder.train = disabled_train\n                for param in embedder.parameters():\n                    param.requires_grad = False\n                embedder.eval()\n            print(\n                f\"Initialized embedder #{n}: {embedder.__class__.__name__} \"\n                f\"with {count_params(embedder, False)} params. Trainable: {embedder.is_trainable}\"\n            )\n\n            if \"input_key\" in embconfig:\n                embedder.input_key = embconfig[\"input_key\"]\n            elif \"input_keys\" in embconfig:\n                embedder.input_keys = embconfig[\"input_keys\"]\n            else:\n                raise KeyError(\n                    f\"need either 'input_key' or 'input_keys' for embedder {embedder.__class__.__name__}\"\n                )\n\n            embedder.legacy_ucg_val = embconfig.get(\"legacy_ucg_value\", None)\n            if embedder.legacy_ucg_val is not None:\n                embedder.ucg_prng = np.random.RandomState()\n\n            embedders.append(embedder)\n        self.embedders = nn.ModuleList(embedders)\n\n    def possibly_get_ucg_val(self, embedder: AbstractEmbModel, batch: Dict) -> Dict:\n        assert embedder.legacy_ucg_val is not None\n        p = embedder.ucg_rate\n        val = embedder.legacy_ucg_val\n        for i in range(len(batch[embedder.input_key])):\n            if embedder.ucg_prng.choice(2, p=[1 - p, p]):\n                batch[embedder.input_key][i] = val\n        return batch","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/Stability-AI/generative-models/blob/e8cd657656fa5d61688191730d0e03242bf4ed44/sgm/modules/encoders/modules.py#L82-L118","documentation":"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.","triggerScenarios":"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}.","commonSituations":"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.","solutions":["Add input_key (e.g. 'txt') or input_keys (e.g. ['txt','mask']) to the embedder's config entry","Compare with a working config in sgm/modules/encoders/modules.py to see the expected shape","Check the embedder class you target to confirm which key names it consumes downstream"],"exampleFix":"// before\nembedder:\n  target: sgm.modules.encoders.modules.FrozenCLIPEmbedder\n// after\nembedder:\n  target: sgm.modules.encoders.modules.FrozenCLIPEmbedder\n  params:\n    layer: hidden\nembedder:\n  input_key: txt\n  target: sgm.modules.encoders.modules.FrozenCLIPEmbedder","handlingStrategy":"validation","validationCode":"def validate_embedder_config(embconfig):\n    assert 'target' in embconfig, 'embedder missing target'\n    assert 'input_key' in embconfig or 'input_keys' in embconfig, \\\n        f\"embedder {embconfig.get('target')} needs input_key or input_keys\"\nfor e in config['embedder']:\n    validate_embedder_config(e)","typeGuard":"def has_input_config(embconfig: dict) -> bool:\n    return 'input_key' in embconfig or 'input_keys' in embconfig","tryCatchPattern":"try:\n    model = instantiate_from_config(config)\nexcept KeyError as e:\n    if 'input_key' in str(e):\n        for i, ec in enumerate(config['embedder']):\n            if 'input_key' not in ec and 'input_keys' not in ec:\n                logging.error('embedder %d (%s) missing input_key/input_keys', i, ec.get('target'))\n    raise","preventionTips":["Keep a reference model YAML and copy the input_key pattern from it","Lint configs for required keys per embedder class before training runs","When adding an embedder, always declare which batch key it consumes"],"tags":["python","config","keyerror","embedder"],"backgroundTag":"missing-config-key","analyzedSha":"e8cd657656fa5d61688191730d0e03242bf4ed44","analyzedAt":"2026-08-29T11:23:43.234Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}