{"record":{"id":"6b6e58a4e3cbd1de","repo":"xtekky/gpt4free","slug":"provider-name-does-not-implement-a-create-me","errorCode":null,"errorMessage":"{provider.__name__} does not implement a create method","messagePattern":"(.+?) does not implement a create method","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"g4f/providers/base_provider.py","lineNumber":159,"sourceCode":"def get_provider_method(provider: type) -> Optional[callable]:\n    if hasattr(provider, \"create_completion\"):\n        return provider.create_completion\n    if hasattr(provider, \"create_async_generator\"):\n\n        def wrapper(*args, **kwargs):\n            return to_sync_generator(\n                provider.create_async_generator(*args, **kwargs),\n                stream=provider.supports_stream,\n            )\n\n        return wrapper\n    if hasattr(provider, \"create_async\"):\n\n        def wrapper(*args, **kwargs):\n            yield asyncio.run(provider.create_async(*args, **kwargs))\n\n        return wrapper\n    raise NotImplementedError(f\"{provider.__name__} does not implement a create method\")\n\n\nclass AbstractProvider(BaseProvider):\n    @classmethod\n    def get_parameters(cls, as_json: bool = False) -> dict[str, Parameter]:\n        params = {\n            name: parameter\n            for name, parameter in signature(\n                cls.create_async_generator\n                if issubclass(cls, AsyncGeneratorProvider)\n                else cls.create_async\n                if issubclass(cls, AsyncProvider)\n                else cls.create_completion\n            ).parameters.items()\n            if name in SAFE_PARAMETERS and (name != \"stream\" or cls.supports_stream)\n        }\n        if as_json:\n","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/providers/base_provider.py#L141-L177","documentation":"Sync counterpart of the previous error: get_provider_method raises it when the provider class has none of create_completion, create_async_generator, or create_async. The helper wraps whichever exists (including bridging async generators via to_sync_generator); if all three are missing it cannot produce a callable.","triggerScenarios":"Calling get_provider_method(Cls) on a class lacking all three create hooks — e.g. a data-only subclass, a provider defining only deprecated method names, or a mock used in tests.","commonSituations":"Test doubles that subclass a provider without implementing the create method; renaming methods during refactoring; providers written for a different g4f generation whose method names changed.","solutions":["Implement create_completion(model, messages, **kwargs) for a sync provider","Or implement create_async_generator and the helper bridges it automatically","Guard with hasattr(provider, 'create_completion') before routing to the sync path"],"exampleFix":"# before\nclass MyProvider(BaseProvider):\n    def run(self, model, messages):\n        ...\n\n# after\nclass MyProvider(BaseProvider):\n    @staticmethod\n    def create_completion(model, messages, **kwargs):\n        yield ...","handlingStrategy":"type-guard","validationCode":"hooks = (\"create_completion\", \"create_async_generator\", \"create_async\")\nassert any(hasattr(provider, h) for h in hooks), \"provider implements no create method\"","typeGuard":"def is_callable_provider(provider: type) -> bool:\n    return any(hasattr(provider, h) for h in\n               (\"create_completion\", \"create_async_generator\", \"create_async\"))","tryCatchPattern":"try:\n    method = get_provider_method(provider)\nexcept NotImplementedError:\n    method = None  # route to error reporting instead of crashing the caller","preventionTips":["Use the exact hook names g4f expects; avoid custom names like 'run' or 'generate'","Validate providers with hasattr checks when loading them dynamically"],"tags":["provider","api-contract","not-implemented"],"backgroundTag":null,"analyzedSha":"973504e1770928ed5fb82f43da528f441ad9ddc3","analyzedAt":"2026-08-14T23:45:32.408Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}