MemPalace/mempalace · error · LLMError

Unknown provider '{name}'. Choices: {sorted(PROVIDERS.keys()

Error message

Unknown provider '{name}'. Choices: {sorted(PROVIDERS.keys())}

What it means

LLMError raised by build_provider() when the requested provider name is not a key in the PROVIDERS registry (ollama, openai-compat, anthropic). The message lists the valid choices, making typos and stale names easy to spot.

Source

Thrown at mempalace/llm_client.py:464

}


def get_provider(
    name: str,
    model: str,
    endpoint: Optional[str] = None,
    api_key: Optional[str] = None,
    timeout: int = 120,
    **provider_kwargs: object,
) -> LLMProvider:
    """Build a provider by name. Raises LLMError on unknown provider.

    Extra kwargs (e.g. num_ctx for Ollama) are forwarded to the provider's
    constructor; providers that don't recognize them ignore via **_.
    """
    cls = PROVIDERS.get(name)
    if cls is None:
        raise LLMError(f"Unknown provider '{name}'. Choices: {sorted(PROVIDERS.keys())}")
    return cls(model=model, endpoint=endpoint, api_key=api_key, timeout=timeout, **provider_kwargs)

View on GitHub (pinned to 06cb6987f0)

Solutions

  1. Use one of the listed choices exactly: ollama, openai-compat, anthropic
  2. For any /v1/chat/completions server (vLLM, LM Studio, llama.cpp), the name is openai-compat
  3. Trim/normalize the provider string in config before passing it

Example fix

# before
provider = build_provider("openai", model="gpt-4o-mini", endpoint="http://localhost:8000")  # Unknown provider 'openai'

# after
provider = build_provider("openai-compat", model="gpt-4o-mini", endpoint="http://localhost:8000")
Defensive patterns

Strategy: type-guard

Type guard

from mempalace.llm_client import PROVIDERS

def is_known_provider(name: str) -> bool:
    return isinstance(name, str) and name in PROVIDERS

Try / catch

from mempalace.llm_client import LLMError, PROVIDERS

try:
    provider = build_provider(name, model=m)
except LLMError as e:
    if "Unknown provider" in str(e):
        name = "ollama" if "ollama" in name.lower() else "openai-compat"
        provider = build_provider(name, model=m)
    else:
        raise

Prevention

When it happens

Trigger: build_provider("openai", ...), build_provider("OpenAI-Compat", ...), or any name not exactly matching a registry key — including case mismatches and old names from earlier versions.

Common situations: Config files or CLI flags written against an older/newer provider list; users naturally typing "openai" instead of "openai-compat"; YAML/JSON config with trailing whitespace in the provider field.

Related errors


AI-assisted analysis of MemPalace/mempalace@06cb6987f0 (2026-08-15). Data as JSON: /api/errors/fde49e15a13cf9e5. Report an issue: GitHub.