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
- Call register_provider(ProviderType.NEW, NewProvider) for any new enum member.
- Ensure the new provider module is imported before the first get_provider() call.
- Do not mutate _PROVIDER_MAP directly; use register_provider().
- 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
- Register any new ProviderType via register_provider() before the first get_provider() call.
- Never mutate _PROVIDER_MAP directly; use register_provider().
- Import custom provider modules at app startup.
- Add a startup assertion that every ProviderType is present in _PROVIDER_MAP.
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
- Unknown provider type: {provider_type}. Valid types: {[p.val
- --config-dir must be an existing absolute directory.
- invalid qualification configuration
- --config-dir must exist and contain a regular sixtytwo.yaml
- invalid repo: expected non-empty string, got ${JSON.stringif
AI-assisted analysis of affaan-m/ECC@01e15490f0 (2026-08-13).
Data as JSON: /api/errors/50ac333ca6952ea9.
Report an issue: GitHub.