affaan-m/ECC · error · ValueError

No provider registered for type: {provider_type}

Error message

No provider registered for type: {provider_type}

What it means

After successful enum coercion, get_provider() looks up the provider class in the module-level _PROVIDER_MAP. The map is seeded at import with all six ProviderTypes (astraflow, astraflow_cn, atlas, claude, openai, ollama), so under normal use this is effectively unreachable. It fires only if _PROVIDER_MAP was mutated (an entry deleted) or a new ProviderType enum member was added without a matching register_provider() call.

Source

Thrown at src/llm/providers/resolver.py:73

    if env_provider:
        return _strip_env_value(env_provider).lower()

    saved_config = _read_saved_llm_config()
    return saved_config.get("LLM_PROVIDER", "claude").lower()


def get_provider(provider_type: ProviderType | str | None = None, **kwargs: str) -> LLMProvider:
    provider_type = _resolve_provider_type(provider_type)

    if isinstance(provider_type, str):
        try:
            provider_type = ProviderType(provider_type)
        except ValueError:
            raise ValueError(f"Unknown provider type: {provider_type}. Valid types: {[p.value for p in ProviderType]}")

    provider_cls = _PROVIDER_MAP.get(provider_type)
    if not provider_cls:
        raise ValueError(f"No provider registered for type: {provider_type}")

    return provider_cls(**kwargs)


def register_provider(provider_type: ProviderType, provider_cls: type[LLMProvider]) -> None:
    _PROVIDER_MAP[provider_type] = provider_cls

View on GitHub (pinned to 01e15490f0)

Solutions

  1. Call register_provider(ProviderType.NEW, NewProvider) for any new enum member.
  2. Ensure the new provider module is imported before the first get_provider() call.
  3. Do not mutate _PROVIDER_MAP directly; use register_provider().
  4. Add a startup assertion that every ProviderType is present in _PROVIDER_MAP.

Example fix

// before
from llm.core.types import ProviderType
provider = get_provider("gemini")  # new enum member, never registered

// after
from llm.core.types import ProviderType
from llm.providers.resolver import register_provider

class GeminiProvider(LLMProvider):
    provider_type = ProviderType.GEMINI
    ...

register_provider(ProviderType.GEMINI, GeminiProvider)
provider = get_provider(ProviderType.GEMINI)
Defensive patterns

Strategy: validation

Validate before calling

from llm.core.types import ProviderType
from llm.providers.resolver import _PROVIDER_MAP

def all_providers_registered() -> bool:
    return all(pt in _PROVIDER_MAP for pt in ProviderType)

Type guard

from llm.core.types import ProviderType
from llm.providers.resolver import _PROVIDER_MAP

def is_registered(pt) -> bool:
    return pt in _PROVIDER_MAP

Try / catch

from llm.providers.resolver import register_provider

try:
    provider = get_provider(pt)
except ValueError as e:
    if "No provider registered" in str(e):
        register_provider(pt, MyProvider)
        provider = get_provider(pt)
    else:
        raise

Prevention

When it happens

Trigger: Adding a new ProviderType enum value without calling register_provider(); manually deleting from _PROVIDER_MAP; a test isolation bug that clears the module-level map; an import-order issue where a custom provider module isn't imported before get_provider().

Common situations: Extending ProviderType without wiring the class; monkeypatching _PROVIDER_MAP in tests without restoring; a custom provider module not imported at app startup.

Related errors


AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13). Data as JSON: /api/errors/50ac333ca6952ea9. Report an issue: GitHub.