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

  1. Use a value from ProviderType: claude, openai, ollama, astraflow, astraflow_cn, atlas.
  2. Lowercase explicit string args before passing (env/file values are already lowercased).
  3. Fix LLM_PROVIDER in the environment or .llm_env to a valid value.
  4. 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

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


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