BerriAI/litellm · error · ValueError

Unable to get Embedding Response. Please pass a valid llm_pr

Error message

Unable to get Embedding Response. Please pass a valid llm_provider.

What it means

Raised at the end of litellm's embedding response resolution: the provider call's return value was neither a dict, an EmbeddingResponse, nor a coroutine, so `response` stayed None. In practice the model/provider combination never routed to a working embedding handler, and litellm refuses to fabricate a response.

Source

Thrown at litellm/main.py:5943

            custom_llm_provider=custom_llm_provider,
            api_base=kwargs.get("api_base", None),
        )

        # Await normally
        init_response: Final = await loop.run_in_executor(None, func_with_context)

        response: EmbeddingResponse | None = None
        if isinstance(init_response, dict):
            response = EmbeddingResponse(**init_response)
        elif isinstance(init_response, EmbeddingResponse):  ## CACHING SCENARIO
            response = init_response
        elif asyncio.iscoroutine(init_response):
            response = await init_response
        if response is not None and isinstance(response, EmbeddingResponse) and hasattr(response, "_hidden_params"):
            response._hidden_params["custom_llm_provider"] = custom_llm_provider

        if response is None:
            raise ValueError("Unable to get Embedding Response. Please pass a valid llm_provider.")
        return response
    except Exception as e:
        custom_llm_provider = custom_llm_provider or "openai"
        raise exception_type(
            model=model,
            custom_llm_provider=custom_llm_provider,
            original_exception=e,
            completion_kwargs=args,
            extra_kwargs=kwargs,
        )


# fmt: off

# Overload for when aembedding=True (returns coroutine)
@overload
def embedding(
    model,

View on GitHub (pinned to 77b7c6c40c)

Solutions

  1. Use a real embedding model with an explicit provider prefix: litellm.embedding(model='openai/text-embedding-3-small', input=[...])
  2. If passing custom_llm_provider=..., pick a value from litellm.provider_list that actually supports embeddings (openai, azure, cohere, bedrock, vertex_ai, ...)
  3. For custom providers, make sure the CustomLLM handler's embedding()/aembedding() returns a litellm.EmbeddingResponse, never None
  4. pip install -U litellm to pick up newly mapped embedding providers

Example fix

# before
resp = litellm.embedding(model="gpt-4o-mini", input=["hello"])

# after
resp = litellm.embedding(model="openai/text-embedding-3-small", input=["hello"])
Defensive patterns

Strategy: validation

Validate before calling

import litellm

model = "openai/text-embedding-3-small"
provider = model.split("/", 1)[0] if "/" in model else "openai"
if provider not in litellm.provider_list:
    raise SystemExit(f"unknown embedding provider: {provider}")

Try / catch

try:
    resp = litellm.embedding(model=model, input=["hi"])
except ValueError as e:
    if "valid llm_provider" in str(e):
        # routing problem: fix model/provider, do not blind-retry
        raise

Prevention

When it happens

Trigger: Calling litellm.embedding() with a chat-only model (e.g. 'gpt-4o'), a typo'd provider prefix, a custom_llm_provider with no embedding route, or a custom handler whose embedding()/aembedding() returns None.

Common situations: Reusing a chat model name for embeddings; passing custom_llm_provider of a provider that only supports completion; an outdated litellm version predating a provider's embedding route; a half-registered custom provider.

Related errors


AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18). Data as JSON: /api/errors/5c2e282e77a21b75. Report an issue: GitHub.