{"record":{"id":"c1cf56b1d543f9ac","repo":"Lightning-AI/pytorch-lightning","slug":"cannot-add-arguments-from-lightning-class-you","errorCode":null,"errorMessage":"Cannot add arguments from: {lightning_class}. You should provide either a callable or a subclass of: Trainer, LightningModule, LightningDataModule, or Callback.","messagePattern":"Cannot add arguments from: (.+?)\\. You should provide either a callable or a subclass of: Trainer, LightningModule, LightningDataModule, or Callback\\.","errorType":"exception","errorClass":"MisconfigurationException","httpStatus":null,"severity":"error","filePath":"src/lightning/pytorch/cli.py","lineNumber":165,"sourceCode":"        \"\"\"\n        if callable(lightning_class) and not isinstance(lightning_class, type):\n            lightning_class = class_from_function(lightning_class)\n\n        if isinstance(lightning_class, type) and issubclass(\n            lightning_class, (Trainer, LightningModule, LightningDataModule, Callback)\n        ):\n            if issubclass(lightning_class, Callback):\n                self.callback_keys.append(nested_key)\n            if subclass_mode:\n                return self.add_subclass_arguments(lightning_class, nested_key, fail_untyped=False, required=required)\n            return self.add_class_arguments(\n                lightning_class,\n                nested_key,\n                fail_untyped=False,\n                instantiate=not issubclass(lightning_class, Trainer),\n                sub_configs=True,\n            )\n        raise MisconfigurationException(\n            f\"Cannot add arguments from: {lightning_class}. You should provide either a callable or a subclass of: \"\n            \"Trainer, LightningModule, LightningDataModule, or Callback.\"\n        )\n\n    def add_optimizer_args(\n        self,\n        optimizer_class: Union[type[Optimizer], tuple[type[Optimizer], ...]] = (Optimizer,),\n        nested_key: str = \"optimizer\",\n        link_to: str = \"AUTOMATIC\",\n    ) -> None:\n        \"\"\"Adds arguments from an optimizer class to a nested key of the parser.\n\n        Args:\n            optimizer_class: Any subclass of :class:`torch.optim.Optimizer`. Use tuple to allow subclasses.\n            nested_key: Name of the nested namespace to store arguments.\n            link_to: Dot notation of a parser key to set arguments or AUTOMATIC.\n\n        \"\"\"","sourceCodeStart":147,"sourceCodeEnd":183,"githubUrl":"https://github.com/Lightning-AI/pytorch-lightning/blob/9fed5c27d2a62ff0efd6c3573599921d6ff67c14/src/lightning/pytorch/cli.py#L147-L183","documentation":"LightningCLI.add_lightning_class_args (also used internally when building the parser) only accepts callables or subclasses of Trainer, LightningModule, LightningDataModule, or Callback. Passing any other class/instance (e.g. a plain nn.Module, a torch optim class directly, or an arbitrary object) raises this MisconfigurationException.","triggerScenarios":"cli.add_lightning_class_args(torch.optim.Adam, 'optimizer') (not via add_optimizer_args), add_lightning_class_args(SomePlainClass), or add_core_arguments_to_parser encountering an unregistered type.","commonSituations":"Extending LightningCLI and trying to add arguments for arbitrary classes instead of the dedicated add_optimizer_args / add_lr_scheduler_args helpers; passing an instance instead of a class.","solutions":["Use a supported base: subclass LightningModule/LightningDataModule/Callback/Trainer","Use the dedicated helpers add_optimizer_args / add_lr_scheduler_args for optimizers and schedulers","Pass the class (callable), not an instance"],"exampleFix":"# before\nclass MyWrapper: ...\nparser.add_lightning_class_args(MyWrapper, \"wrapper\")  # MisconfigurationException\n# after\nclass MyWrapper(Callback): ...\nparser.add_lightning_class_args(MyWrapper, \"wrapper\")","handlingStrategy":"type-guard","validationCode":"from lightning.pytorch import Trainer, LightningModule, LightningDataModule, Callback\n\ndef addable(cls) -> bool:\n    return callable(cls) or (isinstance(cls, type) and issubclass(cls, (Trainer, LightningModule, LightningDataModule, Callback)))\nassert addable(MyClass)","typeGuard":"from lightning.pytorch import Trainer, LightningModule, LightningDataModule, Callback\n\ndef is_addable_class(cls) -> bool:\n    \"\"\"True if cls can be passed to LightningCLI.add_lightning_class_args.\"\"\"\n    return callable(cls) or (isinstance(cls, type) and issubclass(cls, (Trainer, LightningModule, LightningDataModule, Callback)))","tryCatchPattern":null,"preventionTips":["Use add_optimizer_args/add_lr_scheduler_args for optimizers","Always pass classes (or callables), never instances"],"tags":["lightning-cli","add-arguments","type-validation","parser"],"backgroundTag":"invalid-argument-type","analyzedSha":"9fed5c27d2a62ff0efd6c3573599921d6ff67c14","analyzedAt":"2026-08-28T11:52:41.083Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}