{"record":{"id":"81f2665b88275cc1","repo":"affaan-m/ECC","slug":"unknown-provider-type-provider-type-valid-type","errorCode":null,"errorMessage":"Unknown provider type: {provider_type}. Valid types: {[p.value for p in ProviderType]}","messagePattern":"Unknown provider type: (.+?)\\. Valid types: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/llm/providers/resolver.py","lineNumber":69,"sourceCode":"    if provider_type is not None:\n        return provider_type\n\n    env_provider = os.environ.get(\"LLM_PROVIDER\")\n    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":51,"sourceCodeEnd":80,"githubUrl":"https://github.com/affaan-m/ECC/blob/01e15490f04e29cfefe3896951f43db46994d8ee/src/llm/providers/resolver.py#L51-L80","documentation":"get_provider() coerces the resolved provider string via ProviderType(provider_type); on ValueError it re-raises with a message listing all valid enum values. Valid values come from ProviderType: claude, openai, ollama, astraflow, astraflow_cn, atlas. Note _resolve_provider_type lowercases env/file-sourced values, but an explicit string arg passed to get_provider() is NOT lowercased before coercion, so a capitalized explicit arg ('Claude') will fail while the env var 'Claude' would pass.","triggerScenarios":"Passing get_provider('gpt4') or similar typo; LLM_PROVIDER env set to a non-enum string (e.g. 'gemini'); .llm.env has LLM_PROVIDER=gemini; an explicit capitalized string arg like get_provider('Claude') that is not lowercased before coercion.","commonSituations":"Typo in the provider name; LLM_PROVIDER=gemini (unsupported); case mismatch on an explicit arg; a .llm.env from another tool with a different provider vocabulary.","solutions":["Use a value from ProviderType: claude, openai, ollama, astraflow, astraflow_cn, atlas.","Lowercase explicit string args before passing (env/file values are already lowercased).","Fix LLM_PROVIDER in the environment or .llm_env to a valid value.","Pass a ProviderType enum member instead of a raw string."],"exampleFix":"// before\nprovider = get_provider(\"Claude\")\nprovider = get_provider(\"gemini\")\n\n// after\nfrom llm.core.types import ProviderType\nprovider = get_provider(ProviderType.CLAUDE)\nprovider = get_provider(\"claude\")","handlingStrategy":"validation","validationCode":"from llm.core.types import ProviderType\n\ndef is_known_provider(name: str) -> bool:\n    return isinstance(name, str) and name.lower() in {p.value for p in ProviderType}","typeGuard":"from llm.core.types import ProviderType\n\ndef is_provider_type(v) -> bool:\n    if isinstance(v, ProviderType):\n        return True\n    return isinstance(v, str) and v.lower() in {p.value for p in ProviderType}","tryCatchPattern":"from llm.core.types import ProviderType\n\ntry:\n    provider = get_provider(requested)\nexcept ValueError as e:\n    if \"Unknown provider type\" in str(e):\n        provider = get_provider(ProviderType.CLAUDE)  # safe fallback\n    else:\n        raise","preventionTips":["Pass ProviderType enum members, not strings, when calling get_provider().","Validate user-supplied provider strings against {p.value for p in ProviderType}.","Lowercase explicit string args before passing; env/file values are already lowercased.","Document the valid set wherever LLM_PROVIDER is configured."],"tags":["resolver","provider","config","validation"],"backgroundTag":null,"analyzedSha":"01e15490f04e29cfefe3896951f43db46994d8ee","analyzedAt":"2026-08-13T00:31:08.655Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}