diff --git a/config.toml b/config.toml index bbd70a63f..fefe9d3b7 100644 --- a/config.toml +++ b/config.toml @@ -132,3 +132,6 @@ experimental_reduce_indexing_memory_usage = false # Experimentally reduces the maximum number of tasks that will be processed at once, see: # experimental_max_number_of_batched_tasks = 100 + +# Experimental chat completions feature, see: +experimental_chat_completions = false diff --git a/crates/index-scheduler/src/features.rs b/crates/index-scheduler/src/features.rs index b52a659a6..2f156fad2 100644 --- a/crates/index-scheduler/src/features.rs +++ b/crates/index-scheduler/src/features.rs @@ -174,11 +174,13 @@ 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, chat_completions } = + instance_features; let runtime = Arc::new(RwLock::new(RuntimeTogglableFeatures { metrics: metrics || persisted_features.metrics, logs_route: logs_route || persisted_features.logs_route, contains_filter: contains_filter || persisted_features.contains_filter, + chat_completions: chat_completions || persisted_features.chat_completions, ..persisted_features })); diff --git a/crates/index-scheduler/src/lib.rs b/crates/index-scheduler/src/lib.rs index b2f27d66b..5716fb313 100644 --- a/crates/index-scheduler/src/lib.rs +++ b/crates/index-scheduler/src/lib.rs @@ -45,6 +45,8 @@ use std::path::{Path, PathBuf}; use std::sync::{Arc, RwLock}; use std::time::Duration; +use crate::index_mapper::IndexMapper; +use crate::utils::clamp_to_page_size; use dump::Dump; pub use error::Error; pub use features::RoFeatures; @@ -74,9 +76,6 @@ use scheduler::Scheduler; use time::OffsetDateTime; use versioning::Versioning; -use crate::index_mapper::IndexMapper; -use crate::utils::clamp_to_page_size; - pub(crate) type BEI128 = I128; const TASK_SCHEDULER_SIZE_THRESHOLD_PERCENT_INT: u64 = 40; @@ -276,7 +275,7 @@ impl IndexScheduler { .open(&options.tasks_path) }?; - // We **must** starts by upgrading the version because it'll also upgrade the required database before we can open them + // We **must** start by upgrading the version because it'll also upgrade the required database before we can open them let version = versioning::Versioning::new(&env, from_db_version)?; let mut wtxn = env.write_txn()?; diff --git a/crates/meilisearch-types/src/features.rs b/crates/meilisearch-types/src/features.rs index 3c78035e8..8ec98cf81 100644 --- a/crates/meilisearch-types/src/features.rs +++ b/crates/meilisearch-types/src/features.rs @@ -29,6 +29,7 @@ pub struct InstanceTogglableFeatures { pub metrics: bool, pub logs_route: bool, pub contains_filter: bool, + pub chat_completions: bool, } #[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 0abc5c817..aaef9bbde 100644 --- a/crates/meilisearch/src/analytics/segment_analytics.rs +++ b/crates/meilisearch/src/analytics/segment_analytics.rs @@ -281,6 +281,7 @@ impl Infos { indexer_options, config_file_path, no_analytics: _, + experimental_chat_completions: _, } = options; let schedule_snapshot = match schedule_snapshot { diff --git a/crates/meilisearch/src/option.rs b/crates/meilisearch/src/option.rs index 9658352c8..1a8781aec 100644 --- a/crates/meilisearch/src/option.rs +++ b/crates/meilisearch/src/option.rs @@ -68,6 +68,7 @@ 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_CHAT_COMPLETIONS: &str = "MEILI_EXPERIMENTAL_CHAT_COMPLETIONS"; const DEFAULT_CONFIG_FILE_PATH: &str = "./config.toml"; const DEFAULT_DB_PATH: &str = "./data.ms"; const DEFAULT_HTTP_ADDR: &str = "localhost:7700"; @@ -475,6 +476,11 @@ pub struct Opt { /// Format must be TOML. #[clap(long)] pub config_file_path: Option, + + /// Enables the chat completions functionality. + #[serde(default)] + #[clap(long, env = MEILI_EXPERIMENTAL_CHAT_COMPLETIONS, default_value_t = false)] + pub experimental_chat_completions: bool, } impl Opt { @@ -500,25 +506,21 @@ impl Opt { Ok(config) => { // If the file is successfully read, we deserialize it with `toml`. let opt_from_config = toml::from_str::(&config)?; - // Return an error if config file contains 'config_file_path' + // Return an error if the config file contains 'config_file_path' // Using that key in the config file doesn't make sense bc it creates a logical loop (config file referencing itself) if opt_from_config.config_file_path.is_some() { anyhow::bail!("`config_file_path` is not supported in the configuration file") } // We inject the values from the toml in the corresponding env vars if needs be. Doing so, we respect the priority toml < env vars < cli args. opt_from_config.export_to_env(); - // Once injected we parse the cli args once again to take the new env vars into scope. + // Once injected, we parse the cli args once again to take the new env vars into scope. opts = Opt::parse(); config_read_from = Some(config_file_path); } Err(e) => { if let Some(path) = user_specified_config_file_path { // If we have an error while reading the file defined by the user. - anyhow::bail!( - "unable to open or read the {:?} configuration file: {}.", - path, - e, - ) + anyhow::bail!("unable to open or read the {path:?} configuration file: {e}.") } } } @@ -572,6 +574,7 @@ impl Opt { experimental_limit_batched_tasks_total_size, experimental_embedding_cache_entries, experimental_no_snapshot_compaction, + experimental_chat_completions, } = self; export_to_env_if_not_present(MEILI_DB_PATH, db_path); export_to_env_if_not_present(MEILI_HTTP_ADDR, http_addr); @@ -672,6 +675,10 @@ impl Opt { MEILI_EXPERIMENTAL_NO_SNAPSHOT_COMPACTION, experimental_no_snapshot_compaction.to_string(), ); + export_to_env_if_not_present( + MEILI_EXPERIMENTAL_CHAT_COMPLETIONS, + experimental_chat_completions.to_string(), + ); indexer_options.export_to_env(); } @@ -724,6 +731,7 @@ impl Opt { metrics: self.experimental_enable_metrics, logs_route: self.experimental_enable_logs_route, contains_filter: self.experimental_contains_filter, + chat_completions: self.experimental_chat_completions, } } }