From 00d1006cd9968b5bb2eb4842a0d8671c286d6ddb Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Mon, 1 Sep 2025 16:16:24 +0200 Subject: [PATCH] add experimental feature --- crates/index-scheduler/src/features.rs | 13 +++++++++++++ crates/meilisearch-types/src/features.rs | 1 + .../meilisearch/src/analytics/segment_analytics.rs | 3 +++ crates/meilisearch/src/routes/features.rs | 14 ++++++++++++++ 4 files changed, 31 insertions(+) diff --git a/crates/index-scheduler/src/features.rs b/crates/index-scheduler/src/features.rs index 1b01f89de..5646a5d80 100644 --- a/crates/index-scheduler/src/features.rs +++ b/crates/index-scheduler/src/features.rs @@ -158,6 +158,19 @@ impl RoFeatures { .into()) } } + + pub fn check_vector_store_setting(&self, disabled_action: &'static str) -> Result<()> { + if self.runtime.vector_store_setting { + Ok(()) + } else { + Err(FeatureNotEnabledError { + disabled_action, + feature: "vector_store_setting", + issue_link: "https://github.com/orgs/meilisearch/discussions/860", + } + .into()) + } + } } impl FeatureData { diff --git a/crates/meilisearch-types/src/features.rs b/crates/meilisearch-types/src/features.rs index cf66422b2..9c2a6a135 100644 --- a/crates/meilisearch-types/src/features.rs +++ b/crates/meilisearch-types/src/features.rs @@ -21,6 +21,7 @@ pub struct RuntimeTogglableFeatures { pub composite_embedders: bool, pub chat_completions: bool, pub multimodal: bool, + pub vector_store_setting: bool, } #[derive(Default, Debug, Clone, Copy)] diff --git a/crates/meilisearch/src/analytics/segment_analytics.rs b/crates/meilisearch/src/analytics/segment_analytics.rs index a2a0f0c05..04020a74f 100644 --- a/crates/meilisearch/src/analytics/segment_analytics.rs +++ b/crates/meilisearch/src/analytics/segment_analytics.rs @@ -205,6 +205,7 @@ struct Infos { experimental_no_snapshot_compaction: bool, experimental_no_edition_2024_for_dumps: bool, experimental_no_edition_2024_for_settings: bool, + experimental_vector_store_setting: bool, gpu_enabled: bool, db_path: bool, import_dump: bool, @@ -307,6 +308,7 @@ impl Infos { composite_embedders, chat_completions, multimodal, + vector_store_setting, } = features; // We're going to override every sensible information. @@ -332,6 +334,7 @@ impl Infos { experimental_embedding_cache_entries, experimental_no_snapshot_compaction, experimental_no_edition_2024_for_dumps, + experimental_vector_store_setting: vector_store_setting, gpu_enabled: meilisearch_types::milli::vector::is_cuda_enabled(), db_path: db_path != PathBuf::from("./data.ms"), import_dump: import_dump.is_some(), diff --git a/crates/meilisearch/src/routes/features.rs b/crates/meilisearch/src/routes/features.rs index 1a1f89b2d..3d4219a12 100644 --- a/crates/meilisearch/src/routes/features.rs +++ b/crates/meilisearch/src/routes/features.rs @@ -55,6 +55,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) { composite_embedders: Some(false), chat_completions: Some(false), multimodal: Some(false), + vector_store_setting: Some(false), })), (status = 401, description = "The authorization header is missing", body = ResponseError, content_type = "application/json", example = json!( { @@ -103,6 +104,8 @@ pub struct RuntimeTogglableFeatures { pub chat_completions: Option, #[deserr(default)] pub multimodal: Option, + #[deserr(default)] + pub vector_store_setting: Option, } impl From for RuntimeTogglableFeatures { @@ -117,6 +120,7 @@ impl From for RuntimeTogg composite_embedders, chat_completions, multimodal, + vector_store_setting, } = value; Self { @@ -129,6 +133,7 @@ impl From for RuntimeTogg composite_embedders: Some(composite_embedders), chat_completions: Some(chat_completions), multimodal: Some(multimodal), + vector_store_setting: Some(vector_store_setting), } } } @@ -144,6 +149,7 @@ pub struct PatchExperimentalFeatureAnalytics { composite_embedders: bool, chat_completions: bool, multimodal: bool, + vector_store_setting: bool, } impl Aggregate for PatchExperimentalFeatureAnalytics { @@ -162,6 +168,7 @@ impl Aggregate for PatchExperimentalFeatureAnalytics { composite_embedders: new.composite_embedders, chat_completions: new.chat_completions, multimodal: new.multimodal, + vector_store_setting: new.vector_store_setting, }) } @@ -189,6 +196,7 @@ impl Aggregate for PatchExperimentalFeatureAnalytics { composite_embedders: Some(false), chat_completions: Some(false), multimodal: Some(false), + vector_store_setting: Some(false), })), (status = 401, description = "The authorization header is missing", body = ResponseError, content_type = "application/json", example = json!( { @@ -232,6 +240,10 @@ async fn patch_features( .unwrap_or(old_features.composite_embedders), chat_completions: new_features.0.chat_completions.unwrap_or(old_features.chat_completions), multimodal: new_features.0.multimodal.unwrap_or(old_features.multimodal), + vector_store_setting: new_features + .0 + .vector_store_setting + .unwrap_or(old_features.vector_store_setting), }; // explicitly destructure for analytics rather than using the `Serialize` implementation, because @@ -247,6 +259,7 @@ async fn patch_features( composite_embedders, chat_completions, multimodal, + vector_store_setting, } = new_features; analytics.publish( @@ -260,6 +273,7 @@ async fn patch_features( composite_embedders, chat_completions, multimodal, + vector_store_setting, }, &req, );