affaan-m/ECC · error · ValueError
Unknown provider type: {provider_type}. Valid types: {[p.val
Error message
Unknown provider type: {provider_type}. Valid types: {[p.value for p in ProviderType]} What it means
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.
Source
Thrown at src/llm/providers/resolver.py:69
if provider_type is not None:
return provider_type
env_provider = os.environ.get("LLM_PROVIDER")
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
- 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.
Example fix
// before
provider = get_provider("Claude")
provider = get_provider("gemini")
// after
from llm.core.types import ProviderType
provider = get_provider(ProviderType.CLAUDE)
provider = get_provider("claude") Defensive patterns
Strategy: validation
Validate before calling
from llm.core.types import ProviderType
def is_known_provider(name: str) -> bool:
return isinstance(name, str) and name.lower() in {p.value for p in ProviderType} Type guard
from llm.core.types import ProviderType
def is_provider_type(v) -> bool:
if isinstance(v, ProviderType):
return True
return isinstance(v, str) and v.lower() in {p.value for p in ProviderType} Try / catch
from llm.core.types import ProviderType
try:
provider = get_provider(requested)
except ValueError as e:
if "Unknown provider type" in str(e):
provider = get_provider(ProviderType.CLAUDE) # safe fallback
else:
raise Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- No provider registered for type: {provider_type}
- --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/81f2665b88275cc1.
Report an issue: GitHub.