From c4e1407e77be9fdb34964725513b312e2627db3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Tue, 3 Jun 2025 15:13:42 +0200 Subject: [PATCH] Fix the chat, chats, and chatsSettings actions --- crates/meilisearch-auth/src/store.rs | 7 +++++++ crates/meilisearch-types/src/keys.rs | 14 ++++++------- .../src/extractors/authentication/mod.rs | 2 +- .../src/routes/chats/chat_completions.rs | 21 +++++++++++++------ 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/crates/meilisearch-auth/src/store.rs b/crates/meilisearch-auth/src/store.rs index 2fd380194..e20f259ee 100644 --- a/crates/meilisearch-auth/src/store.rs +++ b/crates/meilisearch-auth/src/store.rs @@ -125,6 +125,13 @@ impl HeedAuthStore { Action::MetricsAll => { actions.insert(Action::MetricsGet); } + Action::ChatsSettingsAll => { + actions.extend([ + Action::ChatsSettingsGet, + Action::ChatsSettingsUpdate, + Action::ChatsSettingsDelete, + ]); + } other => { actions.insert(*other); } diff --git a/crates/meilisearch-types/src/keys.rs b/crates/meilisearch-types/src/keys.rs index a3f6ff046..5634d585f 100644 --- a/crates/meilisearch-types/src/keys.rs +++ b/crates/meilisearch-types/src/keys.rs @@ -53,7 +53,7 @@ pub struct CreateApiKey { #[schema(example = json!(["documents.add"]))] #[deserr(error = DeserrJsonError, missing_field_error = DeserrJsonError::missing_api_key_actions)] pub actions: Vec, - /// A list of accesible indexes permitted for the key. `["*"]` for all indexes. The `*` character can be used as a wildcard when located at the last position. e.g. `products_*` to allow access to all indexes whose names start with `products_`. + /// A list of accessible indexes permitted for the key. `["*"]` for all indexes. The `*` character can be used as a wildcard when located at the last position. e.g. `products_*` to allow access to all indexes whose names start with `products_`. #[deserr(error = DeserrJsonError, missing_field_error = DeserrJsonError::missing_api_key_indexes)] #[schema(value_type = Vec, example = json!(["products"]))] pub indexes: Vec, @@ -166,7 +166,7 @@ impl Key { name: Some("Default Chat API Key".to_string()), description: Some("Use it to chat and search from the frontend".to_string()), uid, - actions: vec![Action::Chat, Action::Search], + actions: vec![Action::ChatCompletions, Action::Search], indexes: vec![IndexUidPattern::all()], expires_at: None, created_at: now, @@ -324,9 +324,9 @@ pub enum Action { #[deserr(rename = "network.update")] NetworkUpdate, // TODO should we rename it chatCompletions.get ? - #[serde(rename = "chat")] - #[deserr(rename = "chat")] - Chat, + #[serde(rename = "chatCompletion")] + #[deserr(rename = "chatCompletion")] + ChatCompletions, #[serde(rename = "chats.get")] #[deserr(rename = "chats.get")] ChatsGet, @@ -367,7 +367,7 @@ impl Action { SETTINGS_ALL => Some(Self::SettingsAll), SETTINGS_GET => Some(Self::SettingsGet), SETTINGS_UPDATE => Some(Self::SettingsUpdate), - CHAT => Some(Self::Chat), + CHAT_COMPLETIONS => Some(Self::ChatCompletions), CHATS_GET => Some(Self::ChatsGet), CHATS_SETTINGS_ALL => Some(Self::ChatsSettingsAll), CHATS_SETTINGS_GET => Some(Self::ChatsSettingsGet), @@ -438,7 +438,7 @@ pub mod actions { pub const NETWORK_GET: u8 = NetworkGet.repr(); pub const NETWORK_UPDATE: u8 = NetworkUpdate.repr(); - pub const CHAT: u8 = Chat.repr(); + pub const CHAT_COMPLETIONS: u8 = ChatCompletions.repr(); pub const CHATS_GET: u8 = ChatsGet.repr(); pub const CHATS_SETTINGS_ALL: u8 = ChatsSettingsAll.repr(); pub const CHATS_SETTINGS_GET: u8 = ChatsSettingsGet.repr(); diff --git a/crates/meilisearch/src/extractors/authentication/mod.rs b/crates/meilisearch/src/extractors/authentication/mod.rs index eb250190d..86614f153 100644 --- a/crates/meilisearch/src/extractors/authentication/mod.rs +++ b/crates/meilisearch/src/extractors/authentication/mod.rs @@ -309,7 +309,7 @@ pub mod policies { token: &str, ) -> Result { // Only search and chat actions can be accessed by a tenant token. - if A != actions::SEARCH && A != actions::CHAT { + if A != actions::SEARCH && A != actions::CHAT_COMPLETIONS { return Ok(TenantTokenOutcome::NotATenantToken); } diff --git a/crates/meilisearch/src/routes/chats/chat_completions.rs b/crates/meilisearch/src/routes/chats/chat_completions.rs index 01e22d6f8..8b7ff2689 100644 --- a/crates/meilisearch/src/routes/chats/chat_completions.rs +++ b/crates/meilisearch/src/routes/chats/chat_completions.rs @@ -56,7 +56,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) { /// Get a chat completion async fn chat( - index_scheduler: GuardedData, Data>, + index_scheduler: GuardedData, Data>, auth_ctrl: web::Data, chats_param: web::Path, req: HttpRequest, @@ -208,7 +208,10 @@ fn setup_search_tool( /// Process search request and return formatted results async fn process_search_request( - index_scheduler: &GuardedData, Data>, + index_scheduler: &GuardedData< + ActionPolicy<{ actions::CHAT_COMPLETIONS }>, + Data, + >, auth_ctrl: web::Data, search_queue: &web::Data, auth_token: &str, @@ -288,7 +291,7 @@ async fn process_search_request( } async fn non_streamed_chat( - index_scheduler: GuardedData, Data>, + index_scheduler: GuardedData, Data>, auth_ctrl: web::Data, search_queue: web::Data, workspace_uid: &str, @@ -388,7 +391,7 @@ async fn non_streamed_chat( } async fn streamed_chat( - index_scheduler: GuardedData, Data>, + index_scheduler: GuardedData, Data>, auth_ctrl: web::Data, search_queue: web::Data, workspace_uid: &str, @@ -463,7 +466,10 @@ async fn streamed_chat( /// and report progress and errors. #[allow(clippy::too_many_arguments)] async fn run_conversation( - index_scheduler: &GuardedData, Data>, + index_scheduler: &GuardedData< + ActionPolicy<{ actions::CHAT_COMPLETIONS }>, + Data, + >, auth_ctrl: &web::Data, search_queue: &web::Data, auth_token: &str, @@ -589,7 +595,10 @@ async fn run_conversation( #[allow(clippy::too_many_arguments)] async fn handle_meili_tools( - index_scheduler: &GuardedData, Data>, + index_scheduler: &GuardedData< + ActionPolicy<{ actions::CHAT_COMPLETIONS }>, + Data, + >, auth_ctrl: &web::Data, search_queue: &web::Data, auth_token: &str,