crewAIInc/crewAI · error · RuntimeError
Failed to initialize {self.config.provider} embedding servic
Error message
Failed to initialize {self.config.provider} embedding service: {e} What it means
The generic except in EmbeddingService initialization: build_embedder(config) ran but raised (invalid provider name, bad API key format caught at construction, unknown config keys, provider client instantiation failure). The service wraps it as RuntimeError naming the provider, and logs the underlying error before raising. The chained exception carries the root cause.
Source
Thrown at lib/crewai-tools/src/crewai_tools/rag/embedding_service.py:132
from crewai.rag.embeddings.factory import build_embedder
config = self._build_provider_config()
self._embedding_function = build_embedder(config)
logger.info(
f"Initialized {self.config.provider} embedding service with model "
f"{self.config.model}"
)
except ImportError as e:
raise ImportError(
f"CrewAI embedding providers not available. "
f"Make sure crewai is installed: {e}"
) from e
except Exception as e:
logger.error(f"Failed to initialize embedding function: {e}")
raise RuntimeError(
f"Failed to initialize {self.config.provider} embedding service: {e}"
) from e
def _build_provider_config(self) -> dict[str, Any]:
"""Build configuration dictionary for CrewAI's embedding factory."""
base_config = {"provider": self.config.provider, "config": {}}
# Provider-specific configuration mapping
if self.config.provider == "openai":
base_config["config"] = {
"api_key": self.config.api_key,
"model_name": self.config.model,
**self.config.extra_config,
}
elif self.config.provider == "azure":
base_config["config"] = {
"api_key": self.config.api_key,
"model_name": self.config.model,View on GitHub (pinned to 754d7323be)
Solutions
- Check the logged error / e.__cause__ for the factory's specific complaint
- Verify the provider string against crewai's supported providers (exact spelling, e.g. 'openai')
- Pass required credentials in config (api_key) and correct per-provider keys (model_name etc.)
- Upgrade crewai-tools and crewai in lockstep so the config schema matches
Example fix
# before svc = EmbeddingService(config=EmbeddingConfig(provider='open_ai', model='text-embedding-3-small')) # after svc = EmbeddingService(config=EmbeddingConfig(provider='openai', model='text-embedding-3-small', api_key=os.environ['OPENAI_API_KEY']))
Defensive patterns
Strategy: validation
Validate before calling
KNOWN_PROVIDERS = {'openai', 'google', 'cohere', 'azure', 'vertexai', 'ollama', 'anthropic', 'huggingface'}
if cfg.provider not in KNOWN_PROVIDERS:
raise ValueError(f'unknown embedding provider: {cfg.provider}')
if cfg.provider == 'openai' and not (cfg.api_key or os.getenv('OPENAI_API_KEY')):
raise ValueError('OPENAI_API_KEY not set') Type guard
def is_known_provider(p: str) -> bool:
return p in KNOWN_PROVIDERS Try / catch
try:
svc = EmbeddingService(config=cfg)
except RuntimeError as e:
logger.error('embedder init failed: %s', e.__cause__)
raise Prevention
- Validate provider strings against crewai's factory docs before config load
- Supply per-provider required keys (api_key, model) explicitly
- Upgrade crewai and crewai-tools together when the factory schema changes
When it happens
Trigger: config.provider set to a string build_embedder doesn't recognize (typo like 'open_ai' vs 'openai'); missing required provider config (api_key None passed to a client that validates); incompatible provider config schema after a crewai upgrade changed the factory's expected keys.
Common situations: Config-driven provider selection with typos; switching embedding providers (openai, gemini, cohere, etc.) while reusing the wrong config keys; crewai version changes to the embedder factory schema.
Related errors
- Invalid configuration for embedding provider '{provider}':\n
- CrewAI embedding providers not available. Make sure crewai i
- Failed to generate embedding: {e}
- Failed to generate batch embeddings: {e}
- No content could be loaded from repository: {repo_url}
AI-assisted analysis of crewAIInc/crewAI@754d7323be (2026-08-15).
Data as JSON: /api/errors/2b700bb7971eb5de.
Report an issue: GitHub.