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
- Use a real embedding model with an explicit provider prefix: litellm.embedding(model='openai/text-embedding-3-small', input=[...])
- If passing custom_llm_provider=..., pick a value from litellm.provider_list that actually supports embeddings (openai, azure, cohere, bedrock, vertex_ai, ...)
- For custom providers, make sure the CustomLLM handler's embedding()/aembedding() returns a litellm.EmbeddingResponse, never None
- 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
- Always prefix embedding models with the provider ('openai/...', 'azure/...')
- Run a 1-token embedding smoke test at startup to fail fast on bad model names
- Keep model names in one config location instead of scattering literals
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
- image generation config is not supported for {custom_llm_pro
- Provider '{provider}' not supported for Focus export
- Provider '{provider}' not supported for Focus export configu
- raw_response.text
- raw_response.text
AI-assisted analysis of BerriAI/litellm@77b7c6c40c (2026-08-18).
Data as JSON: /api/errors/5c2e282e77a21b75.
Report an issue: GitHub.