From 0efb72fe66f41505d10a88a70d0f8a19f49154e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Renault?= Date: Tue, 13 May 2025 11:19:32 +0200 Subject: [PATCH] Introduce the first version of the /chat route that mimics the OpenAI API --- Cargo.lock | 4 ++-- crates/meilisearch-types/src/keys.rs | 1 + crates/meilisearch/src/routes/chat.rs | 32 +++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 crates/meilisearch/src/routes/chat.rs diff --git a/Cargo.lock b/Cargo.lock index a7bebe2c6..4a21d2ab6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6067,9 +6067,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.45.0" +version = "1.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" dependencies = [ "backtrace", "bytes", diff --git a/crates/meilisearch-types/src/keys.rs b/crates/meilisearch-types/src/keys.rs index e30ef1008..4fd1842ad 100644 --- a/crates/meilisearch-types/src/keys.rs +++ b/crates/meilisearch-types/src/keys.rs @@ -389,6 +389,7 @@ impl Action { EXPERIMENTAL_FEATURES_UPDATE => Some(Self::ExperimentalFeaturesUpdate), NETWORK_GET => Some(Self::NetworkGet), NETWORK_UPDATE => Some(Self::NetworkUpdate), + CHAT_GET => Some(Self::ChatGet), _otherwise => None, } } diff --git a/crates/meilisearch/src/routes/chat.rs b/crates/meilisearch/src/routes/chat.rs new file mode 100644 index 000000000..1cb813acd --- /dev/null +++ b/crates/meilisearch/src/routes/chat.rs @@ -0,0 +1,32 @@ +use actix_web::web::{self, Data}; +use actix_web::HttpResponse; +use async_openai::config::OpenAIConfig; +use async_openai::types::CreateChatCompletionRequest; +use async_openai::Client; +use index_scheduler::IndexScheduler; +use meilisearch_types::error::ResponseError; +use meilisearch_types::keys::actions; + +use crate::extractors::authentication::policies::ActionPolicy; +use crate::extractors::authentication::GuardedData; + +pub fn configure(cfg: &mut web::ServiceConfig) { + cfg.service(web::resource("").route(web::post().to(chat))); +} + +/// Get a chat completion +async fn chat( + _index_scheduler: GuardedData, Data>, + web::Json(chat_completion): web::Json, +) -> Result { + // To enable later on, when the feature will be experimental + // index_scheduler.features().check_chat("Using the /chat route")?; + + let api_key = std::env::var("MEILI_OPENAI_API_KEY") + .expect("cannot find OpenAI API Key (MEILI_OPENAI_API_KEY)"); + let config = OpenAIConfig::default().with_api_key(&api_key); // we can also change the API base + let client = Client::with_config(config); + let response = client.chat().create(chat_completion).await.unwrap(); + + Ok(HttpResponse::Ok().json(response)) +}