deepfakes/faceswap · error · ValueError

is not a valid plugin type. Select from

Error message

{extractor_type} is not a valid plugin type. Select from {list(cls.extract_plugins)}

What it means

Raised by PluginLoader.get_available_extract_plugins when the extractor_type argument is not a key of the extract_plugins registry. This is the list-producing API used by the GUI/CLI to populate plugin dropdowns, and it validates the category with the same ValueError as the loader itself.

Solutions

  1. Pass one of the registry keys printed in the message (align, detect, mask, recognition).
  2. Re-use constants or fetch list(cls.extract_plugins) instead of hard-coding the category string.
  3. Prefer letting the GUI/CLI enumerate plugins rather than reimplementing it.

Example fix

# before
names = PluginLoader.get_available_extract_plugins('masks')

# after
names = PluginLoader.get_available_extract_plugins('mask')
Defensive patterns

Strategy: type-guard

Validate before calling

from plugins.plugin_loader import PluginLoader
assert extractor_type in PluginLoader.extract_plugins, "invalid extractor type"

Type guard

def is_valid_extractor_type(etype: str) -> bool:
    from plugins.plugin_loader import PluginLoader
    return etype in PluginLoader.extract_plugins

Prevention

When it happens

Trigger: Calling PluginLoader.get_available_extract_plugins('invalid') — same category typos as error 50 ('alignment', 'masks' plural, etc.) — typically from custom tooling or scripts that enumerate plugins.

Common situations: Custom launchers/scripts enumerating plugins with a guessed category name; code drift after a Faceswap upgrade renamed categories.

Related errors


AI-assisted analysis of deepfakes/faceswap@f530cb7508 (2026-08-15). Data as JSON: /api/errors/fd125a3ac6d44019. Report an issue: GitHub.

Appendix: source

Thrown at plugins/plugin_loader.py:224

        ----------
        extractor_type
            The type of extractor to return the plugins for
        add_none
            Append "none" to the list of returned plugins. Default: False
        extend_plugin
            Some plugins have configuration options that mean that multiple 'pseudo-plugins'
            can be generated based on their settings. An example of this is the bisenet-fp mask
            which, whilst selected as 'bisenet-fp' can be stored as 'bisenet-fp-face' and
            'bisenet-fp-head' depending on whether hair has been included in the mask or not.
            ``True`` will generate each pseudo-plugin, ``False`` will generate the original
            plugin name. Default: ``False``

        Returns
        -------
        A list of the available extractor plugin names for the given type
        """
        if extractor_type not in cls.extract_plugins:
            raise ValueError(f"{extractor_type} is not a valid plugin type. Select from "
                             f"{list(cls.extract_plugins)}")
        plugins = [x.split(".")[-2].replace("_", "-") for x in cls.extract_plugins[extractor_type]]
        if extend_plugin and extractor_type == "mask":
            extendable = ["bisenet-fp", "custom"]
            for plugin in extendable:
                if plugin not in plugins:
                    continue
                plugins.remove(plugin)
                plugins.extend([f"{plugin}_face", f"{plugin}_head"])
        plugins = sorted(plugins)
        if add_none:
            plugins.insert(0, "none")
        return plugins

    @staticmethod
    def get_available_models() -> list[str]:
        """Return a list of available training models

View on GitHub (pinned to f530cb7508)