{"record":{"id":"a79d9c053c567a00","repo":"xtekky/gpt4free","slug":"provider-name-does-not-implement-an-async-me","errorCode":null,"errorMessage":"{provider.__name__} does not implement an async method","messagePattern":"(.+?) does not implement an async method","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"g4f/providers/base_provider.py","lineNumber":138,"sourceCode":"\n\ndef get_async_provider_method(provider: type) -> Optional[callable]:\n    if hasattr(provider, \"create_async_generator\"):\n        return provider.create_async_generator\n    if hasattr(provider, \"create_async\"):\n\n        async def wrapper(*args, **kwargs):\n            yield await provider.create_async(*args, **kwargs)\n\n        return wrapper\n    if hasattr(provider, \"create_completion\"):\n\n        async def wrapper(*args, **kwargs):\n            for chunk in provider.create_completion(*args, **kwargs):\n                yield chunk\n\n        return wrapper\n    raise NotImplementedError(f\"{provider.__name__} does not implement an async method\")\n\n\ndef 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))","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/xtekky/gpt4free/blob/973504e1770928ed5fb82f43da528f441ad9ddc3/g4f/providers/base_provider.py#L120-L156","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Implement create_async_generator(model, messages, **kwargs) on the class — the canonical hook","Alternatively implement create_async or create_completion and the helper will wrap it","Check for typos/renames in the method definition (exact names are required)"],"exampleFix":"# before\nclass MyProvider(AsyncGeneratorProvider):\n    def generate(self, model, messages, **kwargs):\n        ...\n\n# after\nclass MyProvider(AsyncGeneratorProvider):\n    @staticmethod\n    async def create_async_generator(model, messages, **kwargs):\n        yield ...","handlingStrategy":"type-guard","validationCode":"hooks = (\"create_async_generator\", \"create_async\", \"create_completion\")\nassert any(hasattr(provider, h) for h in hooks), \"provider implements no create hook\"","typeGuard":"def is_async_callable_provider(provider: type) -> bool:\n    return any(hasattr(provider, h) for h in\n               (\"create_async_generator\", \"create_async\", \"create_completion\"))","tryCatchPattern":"try:\n    method = get_async_provider_method(provider)\nexcept NotImplementedError:\n    method = None  # skip or report unsupported provider","preventionTips":["Implement create_async_generator on every custom provider","Unit-test that get_async_provider_method(cls) returns a callable for each provider you ship"],"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"}