xtekky/gpt4free · error · NotImplementedError

{provider.__name__} does not implement a create method

Error message

{provider.__name__} does not implement a create method

What it means

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.

Source

Thrown at g4f/providers/base_provider.py:159

def get_provider_method(provider: type) -> Optional[callable]:
    if hasattr(provider, "create_completion"):
        return provider.create_completion
    if hasattr(provider, "create_async_generator"):

        def wrapper(*args, **kwargs):
            return to_sync_generator(
                provider.create_async_generator(*args, **kwargs),
                stream=provider.supports_stream,
            )

        return wrapper
    if hasattr(provider, "create_async"):

        def wrapper(*args, **kwargs):
            yield asyncio.run(provider.create_async(*args, **kwargs))

        return wrapper
    raise NotImplementedError(f"{provider.__name__} does not implement a create method")


class AbstractProvider(BaseProvider):
    @classmethod
    def get_parameters(cls, as_json: bool = False) -> dict[str, Parameter]:
        params = {
            name: parameter
            for name, parameter in signature(
                cls.create_async_generator
                if issubclass(cls, AsyncGeneratorProvider)
                else cls.create_async
                if issubclass(cls, AsyncProvider)
                else cls.create_completion
            ).parameters.items()
            if name in SAFE_PARAMETERS and (name != "stream" or cls.supports_stream)
        }
        if as_json:

View on GitHub (pinned to 973504e177)

Solutions

  1. Implement create_completion(model, messages, **kwargs) for a sync provider
  2. Or implement create_async_generator and the helper bridges it automatically
  3. Guard with hasattr(provider, 'create_completion') before routing to the sync path

Example fix

# before
class MyProvider(BaseProvider):
    def run(self, model, messages):
        ...

# after
class MyProvider(BaseProvider):
    @staticmethod
    def create_completion(model, messages, **kwargs):
        yield ...
Defensive patterns

Strategy: type-guard

Validate before calling

hooks = ("create_completion", "create_async_generator", "create_async")
assert any(hasattr(provider, h) for h in hooks), "provider implements no create method"

Type guard

def is_callable_provider(provider: type) -> bool:
    return any(hasattr(provider, h) for h in
               ("create_completion", "create_async_generator", "create_async"))

Try / catch

try:
    method = get_provider_method(provider)
except NotImplementedError:
    method = None  # route to error reporting instead of crashing the caller

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


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