{"record":{"id":"d1a2a4536312a510","repo":"xtekky/gpt4free","slug":"provider-item-not-found","errorCode":null,"errorMessage":"Provider '{item}' not found","messagePattern":"Provider '(.+?)' not found","errorType":"exception","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"g4f/Provider/__init__.py","lineNumber":491,"sourceCode":"    try:\n        return _resolve_provider(name)\n    except ImportError as e:\n        raise AttributeError(f\"module '{__name__}' has no attribute '{name}'\") from e\n\n\ndef __dir__():\n    return __all__\n\n\nclass _ConvertDict(dict):\n    def __contains__(self, item):\n        return item in _provider_names\n\n    def __getitem__(self, item):\n        try:\n            return __getattr__(item)\n        except AttributeError:\n            raise KeyError(f\"Provider '{item}' not found\")\n\n    def keys(self):\n        return _provider_names\n\n    def items(self):\n        return [(k, self[k]) for k in _provider_names]\n\n    def get(self, item, default=None):\n        try:\n            return self[item]\n        except KeyError:\n            return default\n\n\n__map__ = _ConvertDict()\n\n\nclass ProviderUtils:","sourceCodeStart":473,"sourceCodeEnd":509,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/Provider/__init__.py#L473-L509","documentation":"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.","triggerScenarios":"Indexing the provider map with an unknown name: ProviderUtils.convert['NonExistent'] or __map__['typoName'], including names whose lazy import fails.","commonSituations":"Dynamically selecting providers from config or user input; config files referencing providers that no longer exist after a g4f upgrade; case mismatches.","solutions":["Validate names against __map__.keys() (i.e. _provider_names) before indexing","Use __map__.get(name) which returns None instead of raising","Correct the typo/renamed provider in your config","Regenerate provider lists from the installed g4f version rather than hardcoding"],"exampleFix":"# before\nprovider = ProviderUtils.convert[config['provider']]\n\n# after\nprovider = ProviderUtils.convert.get(config['provider'])\nif provider is None:\n    raise ConfigError(f\"unknown provider {config['provider']}; valid: {list(ProviderUtils.convert.keys())}\")","handlingStrategy":"validation","validationCode":"name = 'SomeProvider'\nif name not in ProviderUtils.convert:  # __contains__ checks _provider_names\n    raise ConfigError(f'unknown provider: {name}')","typeGuard":"def is_known_provider(name: str) -> bool:\n    return name in ProviderUtils.convert","tryCatchPattern":"provider = ProviderUtils.convert.get(name)  # returns None, never raises\nif provider is None:\n    handle_unknown(name)","preventionTips":["Prefer .get() over [] for map access with external input","Snapshot valid keys once (list(ProviderUtils.convert.keys())) for config validation"],"tags":["provider-registry","dict-access","validation"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}