Create the configured embedder, make one request, and validate vector shape.
(
embedding: dict[str, Any],
dense: dict[str, Any],
)
| 196 | |
| 197 | |
| 198 | def _probe_embedding_provider( |
| 199 | embedding: dict[str, Any], |
| 200 | dense: dict[str, Any], |
| 201 | ) -> tuple[bool, str, Optional[str]]: |
| 202 | """Create the configured embedder, make one request, and validate vector shape.""" |
| 203 | from openviking.models.embedder.base import embed_compat |
| 204 | from openviking_cli.utils.config.embedding_config import EmbeddingConfig, EmbeddingModelConfig |
| 205 | |
| 206 | provider = dense.get("provider", "local") |
| 207 | model = dense.get("model", "bge-small-zh-v1.5-f16") |
| 208 | label = _embedding_probe_label(provider, model, dense) |
| 209 | |
| 210 | try: |
| 211 | model_config = EmbeddingModelConfig(**dense) |
| 212 | config_kwargs = { |
| 213 | key: embedding[key] |
| 214 | for key in ("max_concurrent", "max_retries", "text_source", "max_input_tokens") |
| 215 | if key in embedding |
| 216 | } |
| 217 | embedding_config = EmbeddingConfig(dense=model_config, **config_kwargs) |
| 218 | embedder = embedding_config.get_embedder() |
| 219 | expected_dimension = ( |
| 220 | model_config.dimension |
| 221 | if model_config.dimension is not None |
| 222 | else embedder.get_dimension() |
| 223 | ) |
| 224 | except Exception as exc: |
| 225 | return ( |
| 226 | False, |
| 227 | f"{label} (invalid embedding config: {exc})", |
| 228 | "Fix embedding.dense provider/model/api_base/dimension in ov.conf", |
| 229 | ) |
| 230 | |
| 231 | async def _run_probe(): |
| 232 | return await asyncio.wait_for( |
| 233 | embed_compat(embedder, "OpenViking doctor embedding probe", is_query=True), |
| 234 | timeout=10.0, |
| 235 | ) |
| 236 | |
| 237 | try: |
| 238 | result = asyncio.run(_run_probe()) |
| 239 | except TimeoutError: |
| 240 | return ( |
| 241 | False, |
| 242 | f"{label} (probe timed out)", |
| 243 | "Check embedding.dense.api_base and make sure the embedding provider is reachable", |
| 244 | ) |
| 245 | except Exception as exc: |
| 246 | return ( |
| 247 | False, |
| 248 | f"{label} (probe failed: {exc})", |
| 249 | "Check the embedding provider service, model name, API key, and api_base", |
| 250 | ) |
| 251 | |
| 252 | vector = getattr(result, "dense_vector", None) |
| 253 | if not vector: |
| 254 | return ( |
| 255 | False, |