Construct the configured embedding provider, falling back to hash on missing deps.
(config: Optional[ProviderConfig] = None)
| 161 | |
| 162 | |
| 163 | def build_embedding_provider(config: Optional[ProviderConfig] = None) -> EmbeddingProvider: |
| 164 | """Construct the configured embedding provider, falling back to hash on missing deps.""" |
| 165 | |
| 166 | cfg = config or load_provider_config() |
| 167 | |
| 168 | if cfg.embed_provider == "openai": |
| 169 | api_key = os.environ.get("OPENAI_API_KEY", "") |
| 170 | if _is_placeholder(api_key): |
| 171 | return HashEmbedding(dimensions=cfg.embed_dimensions) |
| 172 | base_url = os.environ.get("OPENAI_BASE_URL") or None |
| 173 | timeout = float(os.environ.get("OPENAI_API_TIMEOUT", "60") or 60) |
| 174 | return OpenAIEmbedding( |
| 175 | model=cfg.embed_model, |
| 176 | dimensions=cfg.embed_dimensions, |
| 177 | api_key=api_key, |
| 178 | base_url=base_url, |
| 179 | timeout=timeout, |
| 180 | ) |
| 181 | |
| 182 | if cfg.embed_provider == "sentence_transformers": |
| 183 | try: |
| 184 | return SentenceTransformersEmbedding(model=cfg.embed_model, dimensions=cfg.embed_dimensions) |
| 185 | except ImportError: |
| 186 | return HashEmbedding(dimensions=cfg.embed_dimensions) |
| 187 | |
| 188 | if cfg.embed_provider == "ollama": |
| 189 | base_url = os.environ.get("OLLAMA_BASE_URL", "http://localhost:11434") |
| 190 | timeout = float(os.environ.get("OLLAMA_API_TIMEOUT", "60") or 60) |
| 191 | return OllamaEmbedding( |
| 192 | model=cfg.embed_model, |
| 193 | dimensions=cfg.embed_dimensions, |
| 194 | base_url=base_url, |
| 195 | timeout=timeout, |
| 196 | ) |
| 197 | |
| 198 | return HashEmbedding(dimensions=cfg.embed_dimensions) |
| 199 | |
| 200 | |
| 201 | __all__ = [ |