{"record":{"id":"55b5cf8f363191b1","repo":"zylon-ai/private-gpt","slug":"openai-embeddings-dependencies-are-not-installed","errorCode":null,"errorMessage":"OpenAI embeddings dependencies are not installed. Install with `uv sync --inexact --extra embedding-openai`.","messagePattern":"OpenAI embeddings dependencies are not installed\\. Install with `uv sync --inexact --extra embedding-openai`\\.","errorType":"exception","errorClass":"ImportError","httpStatus":400,"severity":"error","filePath":"private_gpt/components/embedding/factories/openai.py","lineNumber":21,"sourceCode":"from private_gpt.components.embedding.factories.base import EmbeddingFactory\nfrom private_gpt.components.model_discovery.url_utils import is_openai_api_base\nfrom private_gpt.settings.settings import EmbeddingModelConfig, Settings\nfrom private_gpt.utils.dependencies import format_missing_dependency_message\n\n\nclass OpenAIGPTEmbeddingFactory(EmbeddingFactory):\n    def __init__(self, settings: Settings) -> None:\n        super().__init__(settings)\n\n    def _create_embedding(\n        self, model_config: EmbeddingModelConfig\n    ) -> tuple[BaseEmbedding, str | None]:\n        try:\n            from llama_index.embeddings.openai import (  # ty:ignore[unresolved-import]\n                OpenAIEmbedding,\n            )\n        except ImportError as e:\n            raise ImportError(\n                format_missing_dependency_message(\n                    \"OpenAI embeddings\",\n                    extras=\"embedding-openai\",\n                )\n            ) from e\n\n        api_base = (\n            self.settings.openai.embedding_api_base or self.settings.openai.api_base\n        )\n        api_key = self.settings.openai.embedding_api_key or self.settings.openai.api_key\n        model = model_config.name\n\n        embedding_model = OpenAIEmbedding(\n            api_base=api_base,\n            api_key=api_key,\n            model=model,\n        )\n        return embedding_model, model_config.name","sourceCodeStart":3,"sourceCodeEnd":39,"githubUrl":"https://github.com/zylon-ai/private-gpt/blob/4a030776a31a901ad80b1bf4d7faa2c1a367efbb/private_gpt/components/embedding/factories/openai.py#L3-L39","documentation":"ImportError raised inside OpenAIGPTEmbeddingFactory._create_embedding when llama_index.embeddings.openai (OpenAIEmbedding) cannot be imported. It is chained from the original ImportError and the message names the exact uv extra: embedding-openai. Because the import happens per model creation, the error surfaces at the first attempt to build an OpenAI embedding, not at application start.","triggerScenarios":"Selecting embedding mode 'openai' (or a model routed to this factory) in an environment where the llama-index OpenAI embeddings integration is not installed.","commonSituations":"Base install without embedding extras; dependency pruning/lockfile regeneration that dropped the integration; running the app inside a different container/venv than the one that was synced; partial upgrade of llama-index packages.","solutions":["Run: uv sync --inexact --extra embedding-openai","Verify in the same environment: python -c \"from llama_index.embeddings.openai import OpenAIEmbedding\"","If install is present but failing, inspect the chained ImportError for version conflicts among llama-index packages","As a stopgap for tests, switch embedding mode to 'mock'"],"exampleFix":"# before: embedding mode 'openai' -> ImportError on first embed\n# after\n# uv sync --inexact --extra embedding-openai","handlingStrategy":"validation","validationCode":"import importlib.util\n\nif importlib.util.find_spec('llama_index.embeddings.openai') is None:\n    raise SystemExit('run: uv sync --inexact --extra embedding-openai')","typeGuard":null,"tryCatchPattern":"try:\n    embed = factory.create(model_config)\nexcept ImportError as e:\n    if 'embedding-openai' in str(e):\n        raise SystemExit('OpenAI embeddings missing; run: uv sync --inexact --extra embedding-openai') from e\n    raise","preventionTips":["Include the embedding-openai extra in production images by default","Check find_spec for the integration at deploy time","Keep llama-index packages on one coherent version set in the lockfile"],"tags":["embedding","openai","dependencies","import","installation"],"backgroundTag":null,"analyzedSha":"4a030776a31a901ad80b1bf4d7faa2c1a367efbb","analyzedAt":"2026-08-15T03:51:26.951Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}