{"record":{"id":"cf4ba4b6f410008a","repo":"deezer/spleeter","slug":"adapter-class-name-is-not-a-valid-audioadapter-c","errorCode":null,"errorMessage":"{adapter_class_name} is not a valid AudioAdapter class","messagePattern":"(.+?) is not a valid AudioAdapter class","errorType":"exception","errorClass":"SpleeterError","httpStatus":null,"severity":"error","filePath":"spleeter/audio/adapter.py","lineNumber":197,"sourceCode":"        Load dynamically an AudioAdapter from given class descriptor.\n\n        Parameters:\n            descriptor (str):\n                Adapter class descriptor (module.Class)\n\n        Returns:\n            AudioAdapter:\n                Created adapter instance.\n        \"\"\"\n        if not descriptor:\n            return cls.default()\n        module_desc: List[str] = descriptor.split(\".\")\n        adapter_class_name: str = module_desc[-1]\n        module_path: str = \".\".join(module_desc[:-1])\n        adapter_module = import_module(module_path)\n        adapter_class = getattr(adapter_module, adapter_class_name)\n        if not issubclass(adapter_class, AudioAdapter):\n            raise SpleeterError(\n                f\"{adapter_class_name} is not a valid AudioAdapter class\"\n            )\n        return adapter_class()\n","sourceCodeStart":179,"sourceCodeEnd":201,"githubUrl":"https://github.com/deezer/spleeter/blob/c8854001ac8acad34a9bc2bd15f28475541828b1/spleeter/audio/adapter.py#L179-L201","documentation":"`AudioAdapter.get(descriptor)` resolves a dotted descriptor like `spleeter.audio.ffmpeg.FFMPEGAudioAdapter` by importing the module and fetching the class. If the resolved class is not a subclass of `AudioAdapter`, a `SpleeterError` is raised. This guards against descriptors pointing at arbitrary non-adapter classes.","triggerScenarios":"Calling `AudioAdapter.get('some.module.SomeClass')` where SomeClass exists but does not inherit from `AudioAdapter` (e.g. pointing at a module, a function, or an unrelated class).","commonSituations":"Typos in the class-name portion of the descriptor, passing a custom adapter that forgot to subclass `AudioAdapter`, or config-driven adapter strings built dynamically.","solutions":["Use the correct descriptor, e.g. `AudioAdapter.get('spleeter.audio.ffmpeg.FFMPEGAudioAdapter')`","If writing a custom adapter, make it inherit from `spleeter.audio.adapter.AudioAdapter` and implement its abstract methods","Check for typos or swapped module/class parts in the dotted descriptor"],"exampleFix":"// before\nAudioAdapter.get('spleeter.audio.ffmpeg.FFMPEG')  # not an AudioAdapter\n// after\nAudioAdapter.get('spleeter.audio.ffmpeg.FFMPEGAudioAdapter')","handlingStrategy":"validation","validationCode":"from spleeter.audio.adapter import AudioAdapter\ndescriptor = 'spleeter.audio.ffmpeg.FFMPEGAudioAdapter'\nmodule_name, _, class_name = descriptor.rpartition('.')\ncls = getattr(__import__(module_name, fromlist=[class_name]), class_name)\nassert issubclass(cls, AudioAdapter), f'{class_name} is not an AudioAdapter'\nadapter = AudioAdapter.get(descriptor)","typeGuard":"from spleeter.audio.adapter import AudioAdapter\ndef is_audio_adapter(obj) -> bool:\n    return isinstance(obj, type) and issubclass(obj, AudioAdapter)","tryCatchPattern":"from spleeter.audio.adapter import AudioAdapter\nfrom spleeter.utils.logging import SpleeterError  # or spleeter SpleeterError location\ntry:\n    adapter = AudioAdapter.get(descriptor)\nexcept Exception as e:\n    if 'is not a valid AudioAdapter class' in str(e):\n        adapter = AudioAdapter.default()\n    else:\n        raise","preventionTips":["Only use documented descriptors (e.g. spleeter.audio.ffmpeg.FFMPEGAudioAdapter)","Subclass AudioAdapter when writing custom adapters","Validate adapter strings from configs against issubclass before calling get()"],"tags":["configuration","python","invalid-argument"],"backgroundTag":"invalid-adapter-descriptor","analyzedSha":"c8854001ac8acad34a9bc2bd15f28475541828b1","analyzedAt":"2026-08-28T21:38:40.142Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}