xtekky/gpt4free · error · KeyError

Provider '{item}' not found

Error message

Provider '{item}' not found

What it means

KeyError raised from _ConvertDict.__getitem__ (the __map__ object backing ProviderUtils.convert) when __getattr__(item) raises AttributeError — i.e. the requested provider name cannot be resolved to a module. It gives dict-style access (g4f.Provider.__map__['X']) a proper KeyError instead of a leaked AttributeError.

Source

Thrown at g4f/Provider/__init__.py:491

    try:
        return _resolve_provider(name)
    except ImportError as e:
        raise AttributeError(f"module '{__name__}' has no attribute '{name}'") from e


def __dir__():
    return __all__


class _ConvertDict(dict):
    def __contains__(self, item):
        return item in _provider_names

    def __getitem__(self, item):
        try:
            return __getattr__(item)
        except AttributeError:
            raise KeyError(f"Provider '{item}' not found")

    def keys(self):
        return _provider_names

    def items(self):
        return [(k, self[k]) for k in _provider_names]

    def get(self, item, default=None):
        try:
            return self[item]
        except KeyError:
            return default


__map__ = _ConvertDict()


class ProviderUtils:

View on GitHub (pinned to 973504e177)

Solutions

  1. Validate names against __map__.keys() (i.e. _provider_names) before indexing
  2. Use __map__.get(name) which returns None instead of raising
  3. Correct the typo/renamed provider in your config
  4. Regenerate provider lists from the installed g4f version rather than hardcoding

Example fix

# before
provider = ProviderUtils.convert[config['provider']]

# after
provider = ProviderUtils.convert.get(config['provider'])
if provider is None:
    raise ConfigError(f"unknown provider {config['provider']}; valid: {list(ProviderUtils.convert.keys())}")
Defensive patterns

Strategy: validation

Validate before calling

name = 'SomeProvider'
if name not in ProviderUtils.convert:  # __contains__ checks _provider_names
    raise ConfigError(f'unknown provider: {name}')

Type guard

def is_known_provider(name: str) -> bool:
    return name in ProviderUtils.convert

Try / catch

provider = ProviderUtils.convert.get(name)  # returns None, never raises
if provider is None:
    handle_unknown(name)

Prevention

When it happens

Trigger: Indexing the provider map with an unknown name: ProviderUtils.convert['NonExistent'] or __map__['typoName'], including names whose lazy import fails.

Common situations: Dynamically selecting providers from config or user input; config files referencing providers that no longer exist after a g4f upgrade; case mismatches.

Related errors


AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14). Data as JSON: /api/errors/d1a2a4536312a510. Report an issue: GitHub.