{"record":{"id":"4d69f279778ca9ec","repo":"headroomlabs-ai/headroom","slug":"openai-is-required-for-openaiembedder-install-it","errorCode":null,"errorMessage":"openai is required for OpenAIEmbedder. Install it with: pip install openai","messagePattern":"openai is required for OpenAIEmbedder\\. Install it with: pip install openai","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"headroom/memory/adapters/embedders.py","lineNumber":651,"sourceCode":"        self._check_dependencies()\n\n        self._api_key = api_key or os.environ.get(\"OPENAI_API_KEY\")\n        if not self._api_key:\n            raise ValueError(\n                \"OpenAI API key required. Provide api_key parameter or set \"\n                \"OPENAI_API_KEY environment variable.\"\n            )\n\n        self._model_name = model_name or self.DEFAULT_MODEL\n        self._max_retries = max_retries if max_retries is not None else self.MAX_RETRIES\n        self._client = None\n\n    def _check_dependencies(self) -> None:\n        \"\"\"Check that required dependencies are installed.\"\"\"\n        try:\n            import openai  # noqa: F401\n        except ImportError as e:\n            raise ImportError(\n                \"openai is required for OpenAIEmbedder. Install it with: pip install openai\"\n            ) from e\n\n    @cached_property\n    def _async_client(self) -> Any:\n        \"\"\"Lazy initialization of async OpenAI client.\"\"\"\n        from openai import AsyncOpenAI\n\n        return AsyncOpenAI(api_key=self._api_key)\n\n    async def _embed_with_retry(self, texts: list[str]) -> list[np.ndarray]:\n        \"\"\"Call OpenAI API with retry logic for transient failures.\n\n        Args:\n            texts: List of texts to embed.\n\n        Returns:\n            List of embedding vectors.","sourceCodeStart":633,"sourceCodeEnd":669,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/memory/adapters/embedders.py#L633-L669","documentation":"OpenAIEmbedder._check_dependencies probes for the openai package during __init__ and raises this ImportError (chaining the original) when it is missing. The heavy client (AsyncOpenAI) is created lazily afterwards, so this check is the gate that fails before any API interaction.","triggerScenarios":"Constructing OpenAIEmbedder in an environment without the openai pip package — base headroom install lacking the embeddings extra, trimmed CI images, or a venv recreated without the lockfile.","commonSituations":"Minimal Docker images; 'works on my machine' divergence between dev and prod envs; dependency conflicts removing openai; using Ollama-only setups that accidentally instantiate the OpenAI embedder via a shared factory default.","solutions":["pip install openai in the active interpreter.","Install via headroom's extras if available so openai stays pinned with the rest.","Confirm the right interpreter: which python / pip list | grep openai — often installed in a different venv.","If offline-only, use LocalEmbedder or OllamaEmbedder instead."],"exampleFix":"# before\nemb = OpenAIEmbedder()  # ImportError: openai is required\n\n# after (shell)\npip install openai\nemb = OpenAIEmbedder()","handlingStrategy":"validation","validationCode":"def openai_dep_available() -> bool:\n    try:\n        import openai  # noqa: F401\n        return True\n    except ImportError:\n        return False","typeGuard":null,"tryCatchPattern":"try:\n    emb = OpenAIEmbedder(api_key=KEY)\nexcept ImportError as e:\n    if \"openai\" in str(e):\n        raise SystemExit(\"pip install openai to use OpenAIEmbedder\") from e\n    raise","preventionTips":["Pin the embeddings extra in requirements so openai is always present in deployed envs.","Add a dependency preflight to container entrypoints.","Verify pip and python point at the same environment when installs 'disappear'."],"tags":["dependencies","import","embeddings","memory","optional-extra"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}