{"record":{"id":"fde49e15a13cf9e5","repo":"MemPalace/mempalace","slug":"unknown-provider-name-choices-sorted-provid","errorCode":null,"errorMessage":"Unknown provider '{name}'. Choices: {sorted(PROVIDERS.keys())}","messagePattern":"Unknown provider '(.+?)'\\. Choices: (.+?)","errorType":"exception","errorClass":"LLMError","httpStatus":null,"severity":"error","filePath":"mempalace/llm_client.py","lineNumber":464,"sourceCode":"}\n\n\ndef get_provider(\n    name: str,\n    model: str,\n    endpoint: Optional[str] = None,\n    api_key: Optional[str] = None,\n    timeout: int = 120,\n    **provider_kwargs: object,\n) -> LLMProvider:\n    \"\"\"Build a provider by name. Raises LLMError on unknown provider.\n\n    Extra kwargs (e.g. num_ctx for Ollama) are forwarded to the provider's\n    constructor; providers that don't recognize them ignore via **_.\n    \"\"\"\n    cls = PROVIDERS.get(name)\n    if cls is None:\n        raise LLMError(f\"Unknown provider '{name}'. Choices: {sorted(PROVIDERS.keys())}\")\n    return cls(model=model, endpoint=endpoint, api_key=api_key, timeout=timeout, **provider_kwargs)\n","sourceCodeStart":446,"sourceCodeEnd":466,"githubUrl":"https://github.com/MemPalace/mempalace/blob/06cb6987f02610784fefbad4b2bd5d026d164ba6/mempalace/llm_client.py#L446-L466","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Use one of the listed choices exactly: ollama, openai-compat, anthropic","For any /v1/chat/completions server (vLLM, LM Studio, llama.cpp), the name is openai-compat","Trim/normalize the provider string in config before passing it"],"exampleFix":"# before\nprovider = build_provider(\"openai\", model=\"gpt-4o-mini\", endpoint=\"http://localhost:8000\")  # Unknown provider 'openai'\n\n# after\nprovider = build_provider(\"openai-compat\", model=\"gpt-4o-mini\", endpoint=\"http://localhost:8000\")","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"from mempalace.llm_client import PROVIDERS\n\ndef is_known_provider(name: str) -> bool:\n    return isinstance(name, str) and name in PROVIDERS","tryCatchPattern":"from mempalace.llm_client import LLMError, PROVIDERS\n\ntry:\n    provider = build_provider(name, model=m)\nexcept LLMError as e:\n    if \"Unknown provider\" in str(e):\n        name = \"ollama\" if \"ollama\" in name.lower() else \"openai-compat\"\n        provider = build_provider(name, model=m)\n    else:\n        raise","preventionTips":["Validate provider names against PROVIDERS keys at config load time","Strip whitespace and lowercase before comparison","Remember any /v1/chat/completions server (vLLM, LM Studio) is 'openai-compat'"],"tags":["llm","configuration","provider","factory"],"backgroundTag":null,"analyzedSha":"06cb6987f02610784fefbad4b2bd5d026d164ba6","analyzedAt":"2026-08-15T03:03:36.213Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}