Fix the chat, chats, and chatsSettings actions

This commit is contained in:
Clément Renault 2025-06-03 15:13:42 +02:00
parent 82313a4444
commit c4e1407e77
No known key found for this signature in database
GPG Key ID: F250A4C4E3AE5F5F
4 changed files with 30 additions and 14 deletions

View File

@ -125,6 +125,13 @@ impl HeedAuthStore {
Action::MetricsAll => { Action::MetricsAll => {
actions.insert(Action::MetricsGet); actions.insert(Action::MetricsGet);
} }
Action::ChatsSettingsAll => {
actions.extend([
Action::ChatsSettingsGet,
Action::ChatsSettingsUpdate,
Action::ChatsSettingsDelete,
]);
}
other => { other => {
actions.insert(*other); actions.insert(*other);
} }

View File

@ -53,7 +53,7 @@ pub struct CreateApiKey {
#[schema(example = json!(["documents.add"]))] #[schema(example = json!(["documents.add"]))]
#[deserr(error = DeserrJsonError<InvalidApiKeyActions>, missing_field_error = DeserrJsonError::missing_api_key_actions)] #[deserr(error = DeserrJsonError<InvalidApiKeyActions>, missing_field_error = DeserrJsonError::missing_api_key_actions)]
pub actions: Vec<Action>, pub actions: Vec<Action>,
/// 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<InvalidApiKeyIndexes>, missing_field_error = DeserrJsonError::missing_api_key_indexes)] #[deserr(error = DeserrJsonError<InvalidApiKeyIndexes>, missing_field_error = DeserrJsonError::missing_api_key_indexes)]
#[schema(value_type = Vec<String>, example = json!(["products"]))] #[schema(value_type = Vec<String>, example = json!(["products"]))]
pub indexes: Vec<IndexUidPattern>, pub indexes: Vec<IndexUidPattern>,
@ -166,7 +166,7 @@ impl Key {
name: Some("Default Chat API Key".to_string()), name: Some("Default Chat API Key".to_string()),
description: Some("Use it to chat and search from the frontend".to_string()), description: Some("Use it to chat and search from the frontend".to_string()),
uid, uid,
actions: vec![Action::Chat, Action::Search], actions: vec![Action::ChatCompletions, Action::Search],
indexes: vec![IndexUidPattern::all()], indexes: vec![IndexUidPattern::all()],
expires_at: None, expires_at: None,
created_at: now, created_at: now,
@ -324,9 +324,9 @@ pub enum Action {
#[deserr(rename = "network.update")] #[deserr(rename = "network.update")]
NetworkUpdate, NetworkUpdate,
// TODO should we rename it chatCompletions.get ? // TODO should we rename it chatCompletions.get ?
#[serde(rename = "chat")] #[serde(rename = "chatCompletion")]
#[deserr(rename = "chat")] #[deserr(rename = "chatCompletion")]
Chat, ChatCompletions,
#[serde(rename = "chats.get")] #[serde(rename = "chats.get")]
#[deserr(rename = "chats.get")] #[deserr(rename = "chats.get")]
ChatsGet, ChatsGet,
@ -367,7 +367,7 @@ impl Action {
SETTINGS_ALL => Some(Self::SettingsAll), SETTINGS_ALL => Some(Self::SettingsAll),
SETTINGS_GET => Some(Self::SettingsGet), SETTINGS_GET => Some(Self::SettingsGet),
SETTINGS_UPDATE => Some(Self::SettingsUpdate), SETTINGS_UPDATE => Some(Self::SettingsUpdate),
CHAT => Some(Self::Chat), CHAT_COMPLETIONS => Some(Self::ChatCompletions),
CHATS_GET => Some(Self::ChatsGet), CHATS_GET => Some(Self::ChatsGet),
CHATS_SETTINGS_ALL => Some(Self::ChatsSettingsAll), CHATS_SETTINGS_ALL => Some(Self::ChatsSettingsAll),
CHATS_SETTINGS_GET => Some(Self::ChatsSettingsGet), CHATS_SETTINGS_GET => Some(Self::ChatsSettingsGet),
@ -438,7 +438,7 @@ pub mod actions {
pub const NETWORK_GET: u8 = NetworkGet.repr(); pub const NETWORK_GET: u8 = NetworkGet.repr();
pub const NETWORK_UPDATE: u8 = NetworkUpdate.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_GET: u8 = ChatsGet.repr();
pub const CHATS_SETTINGS_ALL: u8 = ChatsSettingsAll.repr(); pub const CHATS_SETTINGS_ALL: u8 = ChatsSettingsAll.repr();
pub const CHATS_SETTINGS_GET: u8 = ChatsSettingsGet.repr(); pub const CHATS_SETTINGS_GET: u8 = ChatsSettingsGet.repr();

View File

@ -309,7 +309,7 @@ pub mod policies {
token: &str, token: &str,
) -> Result<TenantTokenOutcome, AuthError> { ) -> Result<TenantTokenOutcome, AuthError> {
// Only search and chat actions can be accessed by a tenant token. // 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); return Ok(TenantTokenOutcome::NotATenantToken);
} }

View File

@ -56,7 +56,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
/// Get a chat completion /// Get a chat completion
async fn chat( async fn chat(
index_scheduler: GuardedData<ActionPolicy<{ actions::CHAT }>, Data<IndexScheduler>>, index_scheduler: GuardedData<ActionPolicy<{ actions::CHAT_COMPLETIONS }>, Data<IndexScheduler>>,
auth_ctrl: web::Data<AuthController>, auth_ctrl: web::Data<AuthController>,
chats_param: web::Path<ChatsParam>, chats_param: web::Path<ChatsParam>,
req: HttpRequest, req: HttpRequest,
@ -208,7 +208,10 @@ fn setup_search_tool(
/// Process search request and return formatted results /// Process search request and return formatted results
async fn process_search_request( async fn process_search_request(
index_scheduler: &GuardedData<ActionPolicy<{ actions::CHAT }>, Data<IndexScheduler>>, index_scheduler: &GuardedData<
ActionPolicy<{ actions::CHAT_COMPLETIONS }>,
Data<IndexScheduler>,
>,
auth_ctrl: web::Data<AuthController>, auth_ctrl: web::Data<AuthController>,
search_queue: &web::Data<SearchQueue>, search_queue: &web::Data<SearchQueue>,
auth_token: &str, auth_token: &str,
@ -288,7 +291,7 @@ async fn process_search_request(
} }
async fn non_streamed_chat( async fn non_streamed_chat(
index_scheduler: GuardedData<ActionPolicy<{ actions::CHAT }>, Data<IndexScheduler>>, index_scheduler: GuardedData<ActionPolicy<{ actions::CHAT_COMPLETIONS }>, Data<IndexScheduler>>,
auth_ctrl: web::Data<AuthController>, auth_ctrl: web::Data<AuthController>,
search_queue: web::Data<SearchQueue>, search_queue: web::Data<SearchQueue>,
workspace_uid: &str, workspace_uid: &str,
@ -388,7 +391,7 @@ async fn non_streamed_chat(
} }
async fn streamed_chat( async fn streamed_chat(
index_scheduler: GuardedData<ActionPolicy<{ actions::CHAT }>, Data<IndexScheduler>>, index_scheduler: GuardedData<ActionPolicy<{ actions::CHAT_COMPLETIONS }>, Data<IndexScheduler>>,
auth_ctrl: web::Data<AuthController>, auth_ctrl: web::Data<AuthController>,
search_queue: web::Data<SearchQueue>, search_queue: web::Data<SearchQueue>,
workspace_uid: &str, workspace_uid: &str,
@ -463,7 +466,10 @@ async fn streamed_chat(
/// and report progress and errors. /// and report progress and errors.
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
async fn run_conversation<C: Config>( async fn run_conversation<C: Config>(
index_scheduler: &GuardedData<ActionPolicy<{ actions::CHAT }>, Data<IndexScheduler>>, index_scheduler: &GuardedData<
ActionPolicy<{ actions::CHAT_COMPLETIONS }>,
Data<IndexScheduler>,
>,
auth_ctrl: &web::Data<AuthController>, auth_ctrl: &web::Data<AuthController>,
search_queue: &web::Data<SearchQueue>, search_queue: &web::Data<SearchQueue>,
auth_token: &str, auth_token: &str,
@ -589,7 +595,10 @@ async fn run_conversation<C: Config>(
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
async fn handle_meili_tools( async fn handle_meili_tools(
index_scheduler: &GuardedData<ActionPolicy<{ actions::CHAT }>, Data<IndexScheduler>>, index_scheduler: &GuardedData<
ActionPolicy<{ actions::CHAT_COMPLETIONS }>,
Data<IndexScheduler>,
>,
auth_ctrl: &web::Data<AuthController>, auth_ctrl: &web::Data<AuthController>,
search_queue: &web::Data<SearchQueue>, search_queue: &web::Data<SearchQueue>,
auth_token: &str, auth_token: &str,