{"record":{"id":"50ac333ca6952ea9","repo":"affaan-m/ECC","slug":"no-provider-registered-for-type-provider-type","errorCode":null,"errorMessage":"No provider registered for type: {provider_type}","messagePattern":"No provider registered for type: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/llm/providers/resolver.py","lineNumber":73,"sourceCode":"    if env_provider:\n        return _strip_env_value(env_provider).lower()\n\n    saved_config = _read_saved_llm_config()\n    return saved_config.get(\"LLM_PROVIDER\", \"claude\").lower()\n\n\ndef get_provider(provider_type: ProviderType | str | None = None, **kwargs: str) -> LLMProvider:\n    provider_type = _resolve_provider_type(provider_type)\n\n    if isinstance(provider_type, str):\n        try:\n            provider_type = ProviderType(provider_type)\n        except ValueError:\n            raise ValueError(f\"Unknown provider type: {provider_type}. Valid types: {[p.value for p in ProviderType]}\")\n\n    provider_cls = _PROVIDER_MAP.get(provider_type)\n    if not provider_cls:\n        raise ValueError(f\"No provider registered for type: {provider_type}\")\n\n    return provider_cls(**kwargs)\n\n\ndef register_provider(provider_type: ProviderType, provider_cls: type[LLMProvider]) -> None:\n    _PROVIDER_MAP[provider_type] = provider_cls\n","sourceCodeStart":55,"sourceCodeEnd":80,"githubUrl":"https://github.com/affaan-m/ECC/blob/01e15490f04e29cfefe3896951f43db46994d8ee/src/llm/providers/resolver.py#L55-L80","documentation":"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.","triggerScenarios":"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().","commonSituations":"Extending ProviderType without wiring the class; monkeypatching _PROVIDER_MAP in tests without restoring; a custom provider module not imported at app startup.","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."],"exampleFix":"// before\nfrom llm.core.types import ProviderType\nprovider = get_provider(\"gemini\")  # new enum member, never registered\n\n// after\nfrom llm.core.types import ProviderType\nfrom llm.providers.resolver import register_provider\n\nclass GeminiProvider(LLMProvider):\n    provider_type = ProviderType.GEMINI\n    ...\n\nregister_provider(ProviderType.GEMINI, GeminiProvider)\nprovider = get_provider(ProviderType.GEMINI)","handlingStrategy":"validation","validationCode":"from llm.core.types import ProviderType\nfrom llm.providers.resolver import _PROVIDER_MAP\n\ndef all_providers_registered() -> bool:\n    return all(pt in _PROVIDER_MAP for pt in ProviderType)","typeGuard":"from llm.core.types import ProviderType\nfrom llm.providers.resolver import _PROVIDER_MAP\n\ndef is_registered(pt) -> bool:\n    return pt in _PROVIDER_MAP","tryCatchPattern":"from llm.providers.resolver import register_provider\n\ntry:\n    provider = get_provider(pt)\nexcept ValueError as e:\n    if \"No provider registered\" in str(e):\n        register_provider(pt, MyProvider)\n        provider = get_provider(pt)\n    else:\n        raise","preventionTips":["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."],"tags":["resolver","provider","registration","config"],"backgroundTag":null,"analyzedSha":"01e15490f04e29cfefe3896951f43db46994d8ee","analyzedAt":"2026-08-13T00:31:08.655Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}