searxng/searxng · error · ValueError

resolver {fqn} is not implemented

Error message

resolver {fqn} is not implemented

What it means

favicon proxy resolves a resolver by fully-qualified name from config (fqn) via importlib; if the imported module lacks the attribute, getattr returns None and ValueError is raised. (Note: for a truly missing attribute getattr raises AttributeError instead; None means the attribute exists but is set to None.)

Source

Thrown at searx/favicons/proxy.py:80

    resolver_map: dict[str, str] = msgspec.field(default_factory=_initial_resolver_map)
    """The resolver_map is a key / value dictionary where the key is the name of
    the resolver and the value is the fully qualifying name (fqn) of resolver's
    function (the callable).  The resolvers from the python module
    :py:obj:`searx.favicons.resolver` are available by default."""

    def get_resolver(self, name: str) -> Callable | None:
        """Returns the callable object (function) of the resolver with the
        ``name``.  If no resolver is registered for the ``name``, ``None`` is
        returned.
        """
        fqn = self.resolver_map.get(name)
        if fqn is None:
            return None
        mod_name, _, func_name = fqn.rpartition('.')
        mod = importlib.import_module(mod_name)
        func = getattr(mod, func_name)
        if func is None:
            raise ValueError(f"resolver {fqn} is not implemented")
        return func

    favicon_path: str = get_setting("ui.static_path") + "/themes/{theme}/img/empty_favicon.svg"  # type: ignore
    favicon_mime_type: str = "image/svg+xml"

    def favicon(self, **replacements):
        """Returns pathname and mimetype of the default favicon."""
        return (
            pathlib.Path(self.favicon_path.format(**replacements)),
            self.favicon_mime_type,
        )

    def favicon_data_url(self, **replacements):
        """Returns data image URL of the default favicon."""

        cache_key = ", ".join(f"{x}:{replacements[x]}" for x in sorted(list(replacements.keys()), key=str))
        data_url = DEFAULT_FAVICON_URL.get(cache_key)
        if data_url is not None:

View on GitHub (pinned to 9fea41204f)

Solutions

  1. Verify the dotted path in your favicons config points to an existing function (check searx.favicons.resolvers module)
  2. Fix typos in module/class names
  3. Set the resolver key to null to use the default behavior
Defensive patterns

Strategy: validation

Validate before calling

import importlib
mod_name, _, fn = fqn.rpartition('.')
obj = getattr(importlib.import_module(mod_name), fn, None)
if not callable(obj):
    print('bad resolver fqn')

Type guard

def is_valid_resolver(fqn: str) -> bool:
    mod_name, _, fn = fqn.rpartition('.')
    try:
        return callable(getattr(importlib.import_module(mod_name), fn, None))
    except ImportError:
        return False

Try / catch

try:
    get_resolver(fqn)
except (ValueError, AttributeError, ImportError) as e:
    logger.error('favicon resolver %s invalid: %s', fqn, e)

Prevention

When it happens

Trigger: Configuring favicons.resolver or a strategy's favicon resolver to a dotted path where the symbol resolves to None (e.g. a placeholder or misspelled function that was renamed to None).

Common situations: Custom resolver modules, typos in FQNs, or version changes that renamed resolver functions.

Related errors


AI-assisted analysis of searxng/searxng@9fea41204f (2026-08-27). Data as JSON: /api/errors/1b17619113f5f4fd. Report an issue: GitHub.