BerriAI/litellm · error · ValueError
GEMINI_API_KEY or GOOGLE_API_KEY is required
Error message
GEMINI_API_KEY or GOOGLE_API_KEY is required
What it means
Raised in the Gemini vector-store search request transform when no API key is found: it checks litellm_params['api_key'] then falls back to GeminiModelInfo.get_api_key() (GEMINI_API_KEY / GOOGLE_API_KEY env). File Search grounds generateContent calls against a file search store, which requires a Google API key, so the request is aborted with ValueError.
Source
Thrown at litellm/llms/gemini/vector_stores/transformation.py:132
) -> tuple[str, dict]:
"""
Transform search request to Gemini's generateContent format.
Gemini File Search works by calling generateContent with a file_search tool.
"""
# Convert query list to single string if needed
if isinstance(query, list):
query = " ".join(query)
# Get model from litellm_params or use default
# Note: File Search requires gemini-2.5-flash or later
model = litellm_params.get("model") or "gemini-2.5-flash"
if model and model.startswith("gemini/"):
model = model.replace("gemini/", "")
api_key: Final = litellm_params.get("api_key") or GeminiModelInfo.get_api_key()
if not api_key:
raise ValueError("GEMINI_API_KEY or GOOGLE_API_KEY is required")
url: Final = f"{api_base}/models/{model}:generateContent"
# Build file_search tool configuration (using snake_case as per Gemini docs)
file_search_config: Final[dict[str, Any]] = {"file_search_store_names": [vector_store_id]}
# Add metadata filter if provided
metadata_filter: Final = vector_store_search_optional_params.get("filters")
if metadata_filter:
# Convert to Gemini filter syntax if it's a dict
if isinstance(metadata_filter, dict):
# Simple conversion - may need more sophisticated mapping
filter_parts: Final = []
for key, value in metadata_filter.items():
if isinstance(value, str):
filter_parts.append(f'{key} = "{value}"')
else:
filter_parts.append(f"{key} = {value}")
file_search_config["metadata_filter"] = " AND ".join(filter_parts)View on GitHub (pinned to 6c2dcb801b)
Solutions
- Pass api_key in litellm_params: {'api_key': 'AIza...'} on the search call.
- Export GEMINI_API_KEY or GOOGLE_API_KEY in the calling process.
- Ensure the value is non-empty (an empty string also fails the truthiness check).
Example fix
# before
results = litellm.vector_store_search(vector_store_id=vs_id, query='hello', litellm_params={'model': 'gemini-2.5-flash'})
# after
import os
results = litellm.vector_store_search(
vector_store_id=vs_id,
query='hello',
litellm_params={'model': 'gemini-2.5-flash', 'api_key': os.environ['GEMINI_API_KEY']},
)
Defensive patterns
Strategy: validation
Validate before calling
import os
def has_gemini_key(litellm_params=None) -> bool:
return bool(
(litellm_params or {}).get("api_key")
or os.environ.get("GEMINI_API_KEY")
or os.environ.get("GOOGLE_API_KEY")
)
if not has_gemini_key(params):
raise ConfigError("Gemini key required for File Search") Try / catch
try:
results = litellm.vector_store_search(vector_store_id=vs, query=q, litellm_params=params)
except ValueError as e:
if "GEMINI_API_KEY or GOOGLE_API_KEY is required" in str(e):
raise ConfigError("Missing Gemini key for File Search") from e
raise Prevention
- Pass api_key in litellm_params on every file-search call rather than trusting env.
- Check env keys are set AND non-empty at service startup.
- Use the same key-resolution check across chat and file-search paths.
When it happens
Trigger: Calling litellm.vector_store_search (Gemini File Search) with model gemini-2.5-flash and no api_key in litellm_params while GEMINI_API_KEY/GOOGLE_API_KEY are unset in the environment.
Common situations: Env vars configured for the LLM proxy but not the worker doing file search; key rotation leaving stale empty-string env values; CI pipelines lacking secrets.
Related errors
- api_key is required for Gemini API calls
- GEMINI_API_BASE is not set
- GEMINI_API_KEY or GOOGLE_API_KEY is required for Veo video g
- Missing Anthropic API Key
- Anthropic API key is required. Set ANTHROPIC_API_KEY or ANTH
AI-assisted analysis of BerriAI/litellm@6c2dcb801b (2026-08-15).
Data as JSON: /api/errors/2be7f7b3d727b4b8.
Report an issue: GitHub.