BerriAI/litellm · error · ValueError

Provider {custom_llm_provider} not found

Error message

Provider {custom_llm_provider} not found

What it means

Raised in _get_openai_compatible_provider_info when a provider exists in the JSONProviderRegistry (JSON-defined custom providers) but JSONProviderRegistry.get() returns None — an inconsistent registry state where exists() and get() disagree (e.g. a malformed provider JSON entry).

Source

Thrown at litellm/litellm_core_utils/get_llm_provider_logic.py:539

    Returns:
        Tuple[str, str, Optional[str], Optional[str]]:
            model: str
            custom_llm_provider: str
            dynamic_api_key: Optional[str]
            api_base: Optional[str]
    """

    custom_llm_provider = model.split("/", 1)[0]
    model = model.split("/", 1)[1]

    # Check JSON providers FIRST (before hardcoded ones)
    from litellm.llms.openai_like.dynamic_config import create_config_class
    from litellm.llms.openai_like.json_loader import JSONProviderRegistry

    if JSONProviderRegistry.exists(custom_llm_provider):
        provider_config: Final = JSONProviderRegistry.get(custom_llm_provider)
        if provider_config is None:
            raise ValueError(f"Provider {custom_llm_provider} not found")
        config_class: Final = create_config_class(provider_config)
        api_base, dynamic_api_key = config_class()._get_openai_compatible_provider_info(api_base, api_key)
        return model, custom_llm_provider, dynamic_api_key, api_base

    if custom_llm_provider == "perplexity":
        # perplexity is openai compatible, we just need to set this to custom_openai and have the api_base be https://api.perplexity.ai
        (
            api_base,
            dynamic_api_key,
        ) = litellm.PerplexityChatConfig()._get_openai_compatible_provider_info(api_base, api_key)
    elif custom_llm_provider == "aiohttp_openai":
        return model, "aiohttp_openai", api_key, api_base
    elif custom_llm_provider == "anyscale":
        # anyscale is openai compatible, we just need to set this to custom_openai and have the api_base be https://api.endpoints.anyscale.com/v1
        api_base = api_base or get_secret_str("ANYSCALE_API_BASE") or "https://api.endpoints.anyscale.com/v1"
        dynamic_api_key = api_key or get_secret_str("ANYSCALE_API_KEY")
    elif custom_llm_provider == "deepinfra":
        (

View on GitHub (pinned to 6c2dcb801b)

Solutions

  1. Inspect your provider JSON definition and fix missing/invalid fields per the openai_like JSON provider docs.
  2. Run JSONProviderRegistry.get(provider) yourself to see the None result and debug loading.
  3. Validate the JSON against the schema litellm documents for JSON-defined providers.
  4. Upgrade litellm if the loader had a bug handling your config shape.

Example fix

// before
{ "myprovider": { "models": {} } }  // missing required fields -> registry.get() returns None

// after
{ "myprovider": { "api_base": "https://api.myprovider.com/v1", "models": { "m1": {} } } }
Defensive patterns

Strategy: validation

Validate before calling

from litellm.llms.openai_like.json_loader import JSONProviderRegistry

def provider_config_loads(provider: str) -> bool:
    return JSONProviderRegistry.exists(provider) and JSONProviderRegistry.get(provider) is not None

Try / catch

try {
  await litellm.completion({ model: 'myprov/m1', ... });
} catch (e) {
  if (/Provider \S+ not found/.test(e.message)) { /* fix provider JSON definition */ }
}

Prevention

When it happens

Trigger: Defining a custom provider via litellm's JSON provider registry (openai_like JSON config) with an entry that registers its name but fails to load its config, then calling model='that-provider/model'.

Common situations: Malformed custom provider JSON (missing required fields so config parsing yields None), partially written config files, or version drift in the JSON schema expected by the loader.

Related errors


AI-assisted analysis of BerriAI/litellm@6c2dcb801b (2026-08-15). Data as JSON: /api/errors/ffa48fba41eee1c2. Report an issue: GitHub.