xtekky/gpt4free · error · NotImplementedError

{provider.__name__} does not implement an async method

Error message

{provider.__name__} does not implement an async method

What it means

Raised by get_async_provider_method when the provider class implements none of the hooks it looks for: create_async_generator, create_async, or create_completion. The function's whole purpose is to adapt whichever method exists into an async generator; with none present there is nothing to adapt, so it raises NotImplementedError naming the class.

Source

Thrown at g4f/providers/base_provider.py:138


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

        async def wrapper(*args, **kwargs):
            yield await provider.create_async(*args, **kwargs)

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

        async def wrapper(*args, **kwargs):
            for chunk in provider.create_completion(*args, **kwargs):
                yield chunk

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


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))

View on GitHub (pinned to 973504e177)

Solutions

  1. Implement create_async_generator(model, messages, **kwargs) on the class — the canonical hook
  2. Alternatively implement create_async or create_completion and the helper will wrap it
  3. Check for typos/renames in the method definition (exact names are required)

Example fix

# before
class MyProvider(AsyncGeneratorProvider):
    def generate(self, model, messages, **kwargs):
        ...

# after
class MyProvider(AsyncGeneratorProvider):
    @staticmethod
    async def create_async_generator(model, messages, **kwargs):
        yield ...
Defensive patterns

Strategy: type-guard

Validate before calling

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

Type guard

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

Try / catch

try:
    method = get_async_provider_method(provider)
except NotImplementedError:
    method = None  # skip or report unsupported provider

Prevention

When it happens

Trigger: Calling get_async_provider_method(CustomProvider) where CustomProvider subclasses a g4f provider base but defines no create_async_generator, create_async, or create_completion — e.g. only get_quota or only helper attributes were implemented.

Common situations: Half-finished custom providers (PA or local) where the create method was renamed or never written; refactors renaming create to something else; providers that implement only the sync 'create' name which this helper does not check.

Related errors


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