diff --git a/crates/index-scheduler/src/features.rs b/crates/index-scheduler/src/features.rs index 78ffc0766..dd487b9fd 100644 --- a/crates/index-scheduler/src/features.rs +++ b/crates/index-scheduler/src/features.rs @@ -24,6 +24,7 @@ pub(crate) struct FeatureData { persisted: Database>, runtime: Arc>, network: Arc>, + experimental_personalization_api_key: Option, } #[derive(Debug, Clone, Copy)] @@ -161,7 +162,12 @@ impl FeatureData { let persisted_features: RuntimeTogglableFeatures = runtime_features_db.get(wtxn, db_keys::EXPERIMENTAL_FEATURES)?.unwrap_or_default(); - let InstanceTogglableFeatures { metrics, logs_route, contains_filter } = instance_features; + let InstanceTogglableFeatures { + metrics, + logs_route, + contains_filter, + experimental_personalization_api_key, + } = instance_features; let runtime = Arc::new(RwLock::new(RuntimeTogglableFeatures { metrics: metrics || persisted_features.metrics, logs_route: logs_route || persisted_features.logs_route, @@ -176,6 +182,7 @@ impl FeatureData { persisted: runtime_features_db, runtime, network: Arc::new(RwLock::new(network)), + experimental_personalization_api_key, }) } @@ -206,6 +213,10 @@ impl FeatureData { RoFeatures::new(self) } + pub fn experimental_personalization_api_key(&self) -> Option<&String> { + self.experimental_personalization_api_key.as_ref() + } + pub fn put_network(&self, mut wtxn: RwTxn, new_network: Network) -> Result<()> { self.persisted.remap_data_type::>().put( &mut wtxn, diff --git a/crates/index-scheduler/src/lib.rs b/crates/index-scheduler/src/lib.rs index 505ce23f8..8134b40ce 100644 --- a/crates/index-scheduler/src/lib.rs +++ b/crates/index-scheduler/src/lib.rs @@ -277,7 +277,8 @@ impl IndexScheduler { let version = versioning::Versioning::new(&env, from_db_version)?; let mut wtxn = env.write_txn()?; - let features = features::FeatureData::new(&env, &mut wtxn, options.instance_features)?; + let features = + features::FeatureData::new(&env, &mut wtxn, options.instance_features.clone())?; let queue = Queue::new(&env, &mut wtxn, &options)?; let index_mapper = IndexMapper::new(&env, &mut wtxn, &options, budget)?; let chat_settings = env.create_database(&mut wtxn, Some(CHAT_SETTINGS_DB_NAME))?; @@ -831,6 +832,10 @@ impl IndexScheduler { self.features.features() } + pub fn experimental_personalization_api_key(&self) -> Option<&String> { + self.features.experimental_personalization_api_key() + } + pub fn put_runtime_features(&self, features: RuntimeTogglableFeatures) -> Result<()> { let wtxn = self.env.write_txn().map_err(Error::HeedTransaction)?; self.features.put_runtime_features(wtxn, features)?; diff --git a/crates/meilisearch-types/src/features.rs b/crates/meilisearch-types/src/features.rs index 83054e784..4c48b1927 100644 --- a/crates/meilisearch-types/src/features.rs +++ b/crates/meilisearch-types/src/features.rs @@ -23,11 +23,12 @@ pub struct RuntimeTogglableFeatures { pub chat_completions: bool, } -#[derive(Default, Debug, Clone, Copy)] +#[derive(Default, Debug, Clone)] pub struct InstanceTogglableFeatures { pub metrics: bool, pub logs_route: bool, pub contains_filter: bool, + pub experimental_personalization_api_key: Option, } #[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)] diff --git a/crates/meilisearch/src/analytics/segment_analytics.rs b/crates/meilisearch/src/analytics/segment_analytics.rs index c7e0634f4..3316f95a8 100644 --- a/crates/meilisearch/src/analytics/segment_analytics.rs +++ b/crates/meilisearch/src/analytics/segment_analytics.rs @@ -279,6 +279,7 @@ impl Infos { indexer_options, config_file_path, no_analytics: _, + experimental_personalization_api_key: _, } = options; let schedule_snapshot = match schedule_snapshot { diff --git a/crates/meilisearch/src/option.rs b/crates/meilisearch/src/option.rs index 6e06b161d..a0540ec04 100644 --- a/crates/meilisearch/src/option.rs +++ b/crates/meilisearch/src/option.rs @@ -66,6 +66,10 @@ const MEILI_EXPERIMENTAL_LIMIT_BATCHED_TASKS_TOTAL_SIZE: &str = const MEILI_EXPERIMENTAL_EMBEDDING_CACHE_ENTRIES: &str = "MEILI_EXPERIMENTAL_EMBEDDING_CACHE_ENTRIES"; const MEILI_EXPERIMENTAL_NO_SNAPSHOT_COMPACTION: &str = "MEILI_EXPERIMENTAL_NO_SNAPSHOT_COMPACTION"; +const MEILI_EXPERIMENTAL_NO_EDITION_2024_FOR_DUMPS: &str = + "MEILI_EXPERIMENTAL_NO_EDITION_2024_FOR_DUMPS"; +const MEILI_EXPERIMENTAL_PERSONALIZATION_API_KEY: &str = + "MEILI_EXPERIMENTAL_PERSONALIZATION_API_KEY"; const DEFAULT_CONFIG_FILE_PATH: &str = "./config.toml"; const DEFAULT_DB_PATH: &str = "./data.ms"; const DEFAULT_HTTP_ADDR: &str = "localhost:7700"; @@ -465,6 +469,12 @@ pub struct Opt { #[serde(default)] pub experimental_no_snapshot_compaction: bool, + /// Experimental personalization API key feature. + /// + /// Sets the API key for personalization features. + #[clap(long, env = MEILI_EXPERIMENTAL_PERSONALIZATION_API_KEY)] + pub experimental_personalization_api_key: Option, + #[serde(flatten)] #[clap(flatten)] pub indexer_options: IndexerOpts, @@ -570,6 +580,7 @@ impl Opt { experimental_limit_batched_tasks_total_size, experimental_embedding_cache_entries, experimental_no_snapshot_compaction, + experimental_personalization_api_key, } = self; export_to_env_if_not_present(MEILI_DB_PATH, db_path); export_to_env_if_not_present(MEILI_HTTP_ADDR, http_addr); @@ -670,6 +681,12 @@ impl Opt { MEILI_EXPERIMENTAL_NO_SNAPSHOT_COMPACTION, experimental_no_snapshot_compaction.to_string(), ); + if let Some(experimental_personalization_api_key) = experimental_personalization_api_key { + export_to_env_if_not_present( + MEILI_EXPERIMENTAL_PERSONALIZATION_API_KEY, + experimental_personalization_api_key, + ); + } indexer_options.export_to_env(); } @@ -722,6 +739,7 @@ impl Opt { metrics: self.experimental_enable_metrics, logs_route: self.experimental_enable_logs_route, contains_filter: self.experimental_contains_filter, + experimental_personalization_api_key: self.experimental_personalization_api_key.clone(), } } }