{"record":{"id":"9262051dffb5d91c","repo":"crewAIInc/crewAI","slug":"invalid-configuration-for-embedding-provider-pro","errorCode":null,"errorMessage":"Invalid configuration for embedding provider '{provider}':\\n{error_msgs}","messagePattern":"Invalid configuration for embedding provider '(.+?)':\\\\n(.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"lib/crewai-tools/src/crewai_tools/tools/rag/rag_tool.py","lineNumber":75,"sourceCode":"    try:\n        type_adapter: TypeAdapter[ProviderSpec] = TypeAdapter(ProviderSpec)\n        return type_adapter.validate_python(value)\n    except ValidationError as e:\n        provider_key = f\"{provider.lower()}providerspec\"\n        provider_errors = [\n            err for err in e.errors() if provider_key in str(err.get(\"loc\", \"\")).lower()\n        ]\n\n        if provider_errors:\n            error_msgs = []\n            for err in provider_errors:\n                loc_parts = err[\"loc\"]\n                if str(loc_parts[0]).lower() == provider_key:\n                    loc_parts = loc_parts[1:]\n                loc = \".\".join(str(x) for x in loc_parts)\n                error_msgs.append(f\"  - {loc}: {err['msg']}\")\n\n            raise ValueError(\n                f\"Invalid configuration for embedding provider '{provider}':\\n\"\n                + \"\\n\".join(error_msgs)\n            ) from e\n\n        raise\n\n\nclass Adapter(BaseModel, ABC):\n    \"\"\"Abstract base class for RAG adapters.\"\"\"\n\n    model_config = ConfigDict(arbitrary_types_allowed=True)\n\n    @abstractmethod\n    def query(\n        self,\n        question: str,\n        similarity_threshold: float | None = None,\n        limit: int | None = None,","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/crewAIInc/crewAI/blob/754d7323beb2fd042e33444a115ea2d5a47193f0/lib/crewai-tools/src/crewai_tools/tools/rag/rag_tool.py#L57-L93","documentation":"Raised while building a RAG tool config when the embedding_model provider spec fails Pydantic validation. CrewAI Tools routes embedding config through a provider-specific model (e.g. openai embedder config); if validation errors exist but none match the selected provider key, the original ValidationError is re-raised — this ValueError fires only for provider-scoped errors, listing each invalid field path and message.","triggerScenarios":"Passing rag_tool config like {'embedding_model': {'provider': 'openai', 'config': {'model': 'bad-name'}}} where the openai embedder config rejects a field (wrong type, unknown model key, missing required key). Validation is filtered by provider_key appearing in each error's `loc`, then humanized into 'loc: msg' lines.","commonSituations":"Wrong config key names (e.g. 'model_name' vs 'model'), forgetting api_key for a non-anonymous provider, version changes that renamed embedder config fields, or copy-pasting a vectordb config into the embedding_model block.","solutions":["Fix each listed field: the message enumerates exact dotted paths and reasons under the provider","Check the provider's expected config schema in crewai_tools/tools/rag/embeddings (e.g. OpenAIEmbedderConfig) for valid field names","Verify required keys such as model and api_key are present and correctly typed","After upgrading crewai-tools, re-check for renamed fields in embedding configs"],"exampleFix":"# before\nconfig = {\n    'embedding_model': {\n        'provider': 'openai',\n        'config': {'model_name': 'text-embedding-3-small'},  # wrong key -> ValueError\n    }\n}\n\n# after\nconfig = {\n    'embedding_model': {\n        'provider': 'openai',\n        'config': {'model': 'text-embedding-3-small'},\n    }\n}\n","handlingStrategy":"validation","validationCode":"from crewai_tools.tools.rag.rag_tool import RAGTool  # or the config validator directly\n\ndef validate_rag_config(config: dict) -> None:\n    try:\n        RAGTool().validate_config(config)  # or the module-level builder used internally\n    except ValueError as e:\n        raise ConfigError(str(e)) from e","typeGuard":"def is_valid_embedding_spec(spec: dict) -> bool:\n    return (\n        isinstance(spec, dict)\n        and spec.get(\"provider\") in {\"openai\", \"google\", \"cohere\", \"azure\", \"vertexai\", \"google_ai\", \"gemini\", \"nvidia\", \"bedrock\"}\n        and isinstance(spec.get(\"config\"), dict)\n    )","tryCatchPattern":"try:\n    tool = RAGTool(config=config)\nexcept ValueError as e:\n    if \"Invalid configuration for embedding provider\" in str(e):\n        # e lists exact field paths; surface to user/config UI\n        raise ConfigurationError(str(e)) from e\n    raise","preventionTips":["Copy embedding config keys verbatim from crewai_tools rag embedder dataclasses","Field is 'model', not 'model_name', for the openai provider","Run config through a dry validation call at app startup, not mid-agent-run","Re-validate configs after upgrading crewai-tools"],"tags":["configuration","validation","pydantic","embeddings","rag"],"backgroundTag":null,"analyzedSha":"754d7323beb2fd042e33444a115ea2d5a47193f0","analyzedAt":"2026-08-15T04:06:56.746Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}