diff --git a/crates/omnigraph/src/embedding.rs b/crates/omnigraph/src/embedding.rs index 0210fe2..2af6167 100644 --- a/crates/omnigraph/src/embedding.rs +++ b/crates/omnigraph/src/embedding.rs @@ -113,7 +113,16 @@ impl EmbeddingConfig { api_key: String, ) -> Result { if provider == Some("mock") { - return Ok(Self::mock()); + // An explicit `model` (e.g. a cluster `embeddings` profile) is + // authoritative — it is what the same-space check compares against — + // so honor it; fall back to `mock()`'s env-based model only when the + // caller supplied none. Without this, a profile's `model` is silently + // dropped and the same-space check resolves to OMNIGRAPH_EMBED_MODEL. + let mut config = Self::mock(); + if let Some(model) = model { + config.model = model; + } + return Ok(config); } let (provider, default_base, default_model, _key_envs) = provider_profile(provider)?; let base_url = base_url @@ -939,6 +948,25 @@ mod tests { ); } + #[test] + #[serial] + fn from_parts_mock_honors_an_explicit_model() { + // A cluster `embeddings` profile that sets `provider: mock, model: X` + // must resolve to model X — it is what the query-time same-space check + // compares against. Env cleared so the assertion isolates the arg. + let _guard = cleared_env(&[]); + let pinned = + EmbeddingConfig::from_parts(Some("mock"), None, Some("recorded-x".to_string()), String::new()) + .unwrap(); + assert_eq!(pinned.provider, Provider::Mock); + assert_eq!(pinned.model, "recorded-x"); + // With no explicit model, mock falls back to its env-based default (here + // empty, since the env is cleared). + let bare = EmbeddingConfig::from_parts(Some("mock"), None, None, String::new()).unwrap(); + assert_eq!(bare.provider, Provider::Mock); + assert_eq!(bare.model, ""); + } + #[test] #[serial] fn from_env_openai_compatible_prefers_openrouter_key() {