diff --git a/crates/api_clients/artcraft/artcraft_api_defs/src/prompts/batch_get_prompts.rs b/crates/api_clients/artcraft/artcraft_api_defs/src/prompts/batch_get_prompts.rs index 10b7e5638a..5ab9aa7487 100644 --- a/crates/api_clients/artcraft/artcraft_api_defs/src/prompts/batch_get_prompts.rs +++ b/crates/api_clients/artcraft/artcraft_api_defs/src/prompts/batch_get_prompts.rs @@ -7,15 +7,18 @@ use enums::common::generation::common_model_class::CommonModelClass; use enums::common::generation::common_model_type::CommonModelType; use enums::common::generation::common_resolution::CommonResolution; use enums::common::generation_provider::GenerationProvider; +use std::collections::HashSet; + use serde_derive::{Deserialize, Serialize}; use tokens::tokens::prompts::PromptToken; -use utoipa::ToSchema; +use utoipa::{IntoParams, ToSchema}; pub const BATCH_GET_PROMPTS_PATH: &str = "/v1/prompt/batch"; -#[derive(Deserialize, ToSchema)] -pub struct BatchGetPromptsRequest { - pub tokens: Vec, +#[derive(Deserialize, ToSchema, IntoParams)] +pub struct BatchGetPromptsQuery { + /// Prompt tokens to look up. + pub tokens: HashSet, } #[derive(Serialize, ToSchema)] diff --git a/crates/service/web/storyteller_web/src/docs/api_doc.rs b/crates/service/web/storyteller_web/src/docs/api_doc.rs index 348aadafd9..35210bc1d7 100644 --- a/crates/service/web/storyteller_web/src/docs/api_doc.rs +++ b/crates/service/web/storyteller_web/src/docs/api_doc.rs @@ -625,7 +625,7 @@ use crate::http_server::endpoints::media_files::list::list_batch_generated_redux BatchGetInferenceJobStatusQueryParams, BatchGetInferenceJobStatusSuccessResponse, BatchGetMediaFilesModelInfo, - BatchGetPromptsRequest, + BatchGetPromptsQuery, BatchGetPromptsResponse, BatchPromptInfo, CreatePromptRequest, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/prompts/batch_get_prompts_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/prompts/batch_get_prompts_handler.rs index e5d45a35fc..2626fb02b5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/prompts/batch_get_prompts_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/prompts/batch_get_prompts_handler.rs @@ -3,8 +3,9 @@ use std::sync::Arc; use actix_web::web::Json; use actix_web::{web, HttpRequest}; +use actix_web_lab::extract::Query; use artcraft_api_defs::prompts::batch_get_prompts::{ - BatchGetPromptsRequest, BatchGetPromptsResponse, BatchPromptInfo, + BatchGetPromptsQuery, BatchGetPromptsResponse, BatchPromptInfo, }; use artcraft_api_defs::prompts::get_prompt::GetPromptImageContextItem; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; @@ -22,11 +23,13 @@ use crate::state::server_state::ServerState; const MAX_BATCH_SIZE: usize = 100; /// Batch get details on multiple prompts. +/// +/// Called, eg. {{api_host}}/v1/prompt/batch?tokens={val}&tokens={val}&tokens=... #[utoipa::path( - post, + get, tag = "Prompts", path = "/v1/prompt/batch", - request_body = BatchGetPromptsRequest, + params(BatchGetPromptsQuery), responses( (status = 200, description = "Found", body = BatchGetPromptsResponse), (status = 400, description = "Bad request"), @@ -35,22 +38,19 @@ const MAX_BATCH_SIZE: usize = 100; )] pub async fn batch_get_prompts_handler( http_request: HttpRequest, - body: Json, + query: Query, server_state: web::Data>, ) -> Result, AdvancedCommonWebError> { - let request = body.into_inner(); - - if request.tokens.len() > MAX_BATCH_SIZE { + if query.tokens.len() > MAX_BATCH_SIZE { return Err(AdvancedCommonWebError::BadInputWithSimpleMessage( - format!("tokens must contain between 0 and {} items", MAX_BATCH_SIZE), + format!("tokens must contain at most {} items", MAX_BATCH_SIZE), )); } // Deduplicate and trim whitespace - let unique_tokens: Vec = request - .tokens - .into_iter() - .map(|t| PromptToken::new_from_str(t.as_str().trim())) + let unique_tokens: Vec = query.tokens + .iter() + .map(|t| PromptToken::new_from_str(t.trim())) .filter(|t| !t.as_str().is_empty()) .collect::>() .into_iter() diff --git a/crates/service/web/storyteller_web/src/http_server/routes/application_routes/prompts_routes.rs b/crates/service/web/storyteller_web/src/http_server/routes/application_routes/prompts_routes.rs index abfc69b8e7..fa34a7dbfd 100644 --- a/crates/service/web/storyteller_web/src/http_server/routes/application_routes/prompts_routes.rs +++ b/crates/service/web/storyteller_web/src/http_server/routes/application_routes/prompts_routes.rs @@ -22,7 +22,7 @@ where RouteBuilder::from_app(app) // NB: This poor RouteBuilder utility requires that POST comes first, otherwise the GET glob // will capture it and force 504 Method Not Allowed for all POSTs. - .add_post("/v1/prompt/batch", batch_get_prompts_handler) + .add_get("/v1/prompt/batch", batch_get_prompts_handler) .add_post("/v1/prompts/create", create_prompt_handler) .add_get("/v1/prompts/{token}", get_prompt_handler) .into_app()