From 767e23ea71e6d2b3d20f3957d91b14fdc10f9577 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 17 Jun 2025 01:05:59 -0400 Subject: [PATCH] seedance --- ...nerate_seedance_1_0_lite_image_to_video.rs | 45 ++++ .../src/generate/video/mod.rs | 1 + .../web/storyteller_web/src/docs/api_doc.rs | 58 ++--- ...eedance_1_0_lite_image_to_video_handler.rs | 205 ++++++++++++++++++ .../endpoints/generate/video/mod.rs | 1 + .../http_server/routes/add_generate_routes.rs | 7 +- 6 files changed, 291 insertions(+), 26 deletions(-) create mode 100644 crates/schema/public/api/artcraft_api_defs/src/generate/video/generate_seedance_1_0_lite_image_to_video.rs create mode 100644 crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs diff --git a/crates/schema/public/api/artcraft_api_defs/src/generate/video/generate_seedance_1_0_lite_image_to_video.rs b/crates/schema/public/api/artcraft_api_defs/src/generate/video/generate_seedance_1_0_lite_image_to_video.rs new file mode 100644 index 0000000000..a0464bf8cf --- /dev/null +++ b/crates/schema/public/api/artcraft_api_defs/src/generate/video/generate_seedance_1_0_lite_image_to_video.rs @@ -0,0 +1,45 @@ +use serde::{Deserialize, Serialize}; +use tokens::tokens::generic_inference_jobs::InferenceJobToken; +use tokens::tokens::media_files::MediaFileToken; +use utoipa::ToSchema; + +pub const GENERATE_SEEDANCE_1_0_LITE_IMAGE_TO_VIDEO_URL_PATH: &str = "/v1/generate/video/seedance_1.0_lite_image_to_video"; + +#[derive(Serialize, Deserialize, ToSchema)] +pub struct GenerateSeedance10LiteImageToVideoRequest { + /// Idempotency token to prevent duplicate requests. + pub uuid_idempotency_token: String, + + /// Source of the image file to convert to video. + /// It must be an image. + pub media_file_token: Option, + + /// Optional text prompt. + pub prompt: Option, + + /// Optional: aspect ratio of the generated video. + pub resolution: Option, + + /// Optional: aspect ratio of the generated video. + pub duration: Option, +} + +#[derive(Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum GenerateSeedance10LiteResolution { + FourEightyP, + SevenTwentyP, +} + +#[derive(Serialize, Deserialize, ToSchema)] +#[serde(rename_all = "snake_case")] +pub enum GenerateSeedance10LiteDuration { + FiveSeconds, + TenSeconds, +} + +#[derive(Serialize, Deserialize, ToSchema)] +pub struct GenerateSeedance10LiteImageToVideoResponse { + pub success: bool, + pub inference_job_token: InferenceJobToken, +} diff --git a/crates/schema/public/api/artcraft_api_defs/src/generate/video/mod.rs b/crates/schema/public/api/artcraft_api_defs/src/generate/video/mod.rs index efd762b81e..9dae98d730 100644 --- a/crates/schema/public/api/artcraft_api_defs/src/generate/video/mod.rs +++ b/crates/schema/public/api/artcraft_api_defs/src/generate/video/mod.rs @@ -1,4 +1,5 @@ pub mod generate_kling_1_6_pro_image_to_video; pub mod generate_kling_2_1_master_image_to_video; pub mod generate_kling_2_1_pro_image_to_video; +pub mod generate_seedance_1_0_lite_image_to_video; pub mod generate_veo_2_image_to_video; \ No newline at end of file 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 08c4aac8c4..316efd69c8 100644 --- a/crates/service/web/storyteller_web/src/docs/api_doc.rs +++ b/crates/service/web/storyteller_web/src/docs/api_doc.rs @@ -2,10 +2,6 @@ use utoipa::OpenApi; use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageAspectRatio; use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageNumImages; -use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2AspectRatio; -use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2Duration; -use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoRequest; -use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoResponse; use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageRequest; use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::GenerateFlux1DevTextToImageResponse; use artcraft_api_defs::generate::image::generate_flux_1_schnell_text_to_image::GenerateFlux1SchnellTextToImageAspectRatio; @@ -38,6 +34,14 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::G use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::GenerateKling21ProDuration; use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::GenerateKling21ProImageToVideoRequest; use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::GenerateKling21ProImageToVideoResponse; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteDuration; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteImageToVideoRequest; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteImageToVideoResponse; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteResolution; +use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2AspectRatio; +use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2Duration; +use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoRequest; +use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoResponse; use billing_component::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_error::CreateCheckoutSessionError; use billing_component::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_json_handler::*; use billing_component::users::http_endpoints::list_active_user_subscriptions_handler::*; @@ -83,7 +87,6 @@ use crate::http_server::common_responses::media::media_file_cover_image_details: use crate::http_server::common_responses::media::media_file_cover_image_details::MediaFileDefaultCover; use crate::http_server::common_responses::media::media_links::*; use crate::http_server::common_responses::media::weights_cover_image_details::*; -use crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler; use crate::http_server::common_responses::media_file_origin_details::*; use crate::http_server::common_responses::media_file_social_meta_lite::MediaFileSocialMetaLight; use crate::http_server::common_responses::pagination_cursors::PaginationCursors; @@ -218,9 +221,7 @@ use crate::http_server::web_utils::response_success_helpers::*; crate::http_server::endpoints::beta_keys::create_beta_keys_handler::create_beta_keys_handler, crate::http_server::endpoints::beta_keys::edit_beta_key_distributed_flag_handler::edit_beta_key_distributed_flag_handler, crate::http_server::endpoints::beta_keys::edit_beta_key_note_handler::edit_beta_key_note_handler, - crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler, crate::http_server::endpoints::beta_keys::list_beta_keys_handler::list_beta_keys_handler, - crate::http_server::endpoints::generate::video::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler, crate::http_server::endpoints::beta_keys::redeem_beta_key_handler::redeem_beta_key_handler, crate::http_server::endpoints::comments::create_comment_handler::create_comment_handler, crate::http_server::endpoints::comments::delete_comment_handler::delete_comment_handler, @@ -235,6 +236,11 @@ use crate::http_server::web_utils::response_success_helpers::*; crate::http_server::endpoints::generate::image::remove_image_background_handler::remove_image_background_handler, crate::http_server::endpoints::generate::object::generate_hunyuan_21_image_to_3d_handler::generate_hunyuan_21_image_to_3d_handler, crate::http_server::endpoints::generate::object::generate_hunyuan_2_image_to_3d_handler::generate_hunyuan_2_image_to_3d_handler, + crate::http_server::endpoints::generate::video::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler, + crate::http_server::endpoints::generate::video::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler, + crate::http_server::endpoints::generate::video::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler, + crate::http_server::endpoints::generate::video::generate_seedance_1_0_lite_image_to_video_handler::generate_seedance_1_0_lite_image_to_video_handler, + crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler, crate::http_server::endpoints::image_studio::prompt::enqueue_studio_image_generation_handler::enqueue_studio_image_generation_handler, crate::http_server::endpoints::image_studio::upload::upload_snapshot_media_file_handler::upload_snapshot_media_file_handler, crate::http_server::endpoints::inference_job::delete::dismiss_finished_session_jobs_handler::dismiss_finished_session_jobs_handler, @@ -242,11 +248,9 @@ use crate::http_server::web_utils::response_success_helpers::*; crate::http_server::endpoints::inference_job::get::batch_get_inference_job_status_handler::batch_get_inference_job_status_handler, crate::http_server::endpoints::inference_job::get::get_inference_job_status_handler::get_inference_job_status_handler, crate::http_server::endpoints::inference_job::list::list_session_jobs_handler::list_session_jobs_handler, - crate::http_server::endpoints::generate::video::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler, crate::http_server::endpoints::media_files::delete::delete_media_file_handler::delete_media_file_handler, crate::http_server::endpoints::media_files::edit::change_media_file_animation_type_handler::change_media_file_animation_type_handler, crate::http_server::endpoints::media_files::edit::change_media_file_engine_category_handler::change_media_file_engine_category_handler, - crate::http_server::endpoints::generate::video::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler, crate::http_server::endpoints::media_files::edit::change_media_file_visibility_handler::change_media_file_visibility_handler, crate::http_server::endpoints::media_files::edit::rename_media_file_handler::rename_media_file_handler, crate::http_server::endpoints::media_files::edit::set_media_file_cover_image_handler::set_media_file_cover_image_handler, @@ -426,10 +430,6 @@ use crate::http_server::web_utils::response_success_helpers::*; CreateAccountSuccessResponse, CreateBetaKeysError, CreateBetaKeysRequest, - GenerateKling21ProAspectRatio, - GenerateKling21ProDuration, - GenerateKling21ProImageToVideoRequest, - GenerateKling21ProImageToVideoResponse, CreateBetaKeysSuccessResponse, CreateCheckoutSessionError, CreateCheckoutSessionRequest, @@ -439,10 +439,6 @@ use crate::http_server::web_utils::response_success_helpers::*; CreateCommentSuccessResponse, CreateFeaturedItemError, CreateFeaturedItemRequest, - GenerateVeo2AspectRatio, - GenerateVeo2Duration, - GenerateVeo2ImageToVideoRequest, - GenerateVeo2ImageToVideoResponse, CreateFeaturedItemSuccessResponse, CreateSceneError, CreateSceneSuccessResponse, @@ -454,10 +450,6 @@ use crate::http_server::web_utils::response_success_helpers::*; DeleteCommentRequest, DeleteFeaturedItemError, DeleteFeaturedItemRequest, - GenerateKling21MasterImageToVideoResponse, - GenerateKling21MasterDuration, - GenerateKling21MasterAspectRatio, - GenerateKling21MasterImageToVideoRequest, DeleteMediaFileError, DeleteMediaFilePathInfo, DeleteMediaFileRequest, @@ -534,10 +526,29 @@ use crate::http_server::web_utils::response_success_helpers::*; GenerateFluxPro11UltraTextToImageRequest, GenerateFluxPro11UltraTextToImageResponse, GenerateHunyuan21ImageTo3dRequest, - GenerateKling16ProDuration, GenerateHunyuan21ImageTo3dResponse, GenerateHunyuan2ImageTo3dRequest, GenerateHunyuan2ImageTo3dResponse, + GenerateKling16ProAspectRatio, + GenerateKling16ProDuration, + GenerateKling16ProImageToVideoRequest, + GenerateKling16ProImageToVideoResponse, + GenerateKling21MasterAspectRatio, + GenerateKling21MasterDuration, + GenerateKling21MasterImageToVideoRequest, + GenerateKling21MasterImageToVideoResponse, + GenerateKling21ProAspectRatio, + GenerateKling21ProDuration, + GenerateKling21ProImageToVideoRequest, + GenerateKling21ProImageToVideoResponse, + GenerateSeedance10LiteDuration, + GenerateSeedance10LiteImageToVideoRequest, + GenerateSeedance10LiteImageToVideoResponse, + GenerateSeedance10LiteResolution, + GenerateVeo2AspectRatio, + GenerateVeo2Duration, + GenerateVeo2ImageToVideoRequest, + GenerateVeo2ImageToVideoResponse, GetInferenceJobStatusError, GetInferenceJobStatusPathInfo, GetInferenceJobStatusSuccessResponse, @@ -548,9 +559,6 @@ use crate::http_server::web_utils::response_success_helpers::*; GetMediaFileModelInfo, GetMediaFileModeratorFields, GetMediaFilePathInfo, - GenerateKling16ProImageToVideoResponse, - GenerateKling16ProAspectRatio, - GenerateKling16ProImageToVideoRequest, GetMediaFileSuccessResponse, GetProfilePathInfo, GetPromptError, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs new file mode 100644 index 0000000000..d557243495 --- /dev/null +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/generate_seedance_1_0_lite_image_to_video_handler.rs @@ -0,0 +1,205 @@ +use std::fmt; +use std::sync::Arc; + +use crate::http_server::common_requests::media_file_token_path_info::MediaFileTokenPathInfo; +use crate::http_server::common_responses::common_web_error::CommonWebError; +use crate::http_server::common_responses::media::media_links::MediaLinks; +use crate::http_server::deprecated_endpoints::engine::create_scene_handler::CreateSceneError; +use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; +use crate::http_server::endpoints::media_files::upload::upload_error::MediaFileUploadError; +use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; +use crate::http_server::web_utils::response_success_helpers::simple_json_success; +use crate::state::server_state::ServerState; +use crate::util::delete_role_disambiguation::{delete_role_disambiguation, DeleteRole}; +use actix_web::error::ResponseError; +use actix_web::http::StatusCode; +use actix_web::web::Json; +use actix_web::web::Path; +use actix_web::{web, HttpRequest, HttpResponse}; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteDuration; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteImageToVideoRequest; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteImageToVideoResponse; +use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::GenerateSeedance10LiteResolution; +use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use enums::common::visibility::Visibility; +use fal_client::requests::webhook::video::enqueue_seedance_1_lite_image_to_video_webhook::enqueue_seedance_1_lite_image_to_video_webhook; +use fal_client::requests::webhook::video::enqueue_seedance_1_lite_image_to_video_webhook::Seedance1LiteDuration; +use fal_client::requests::webhook::video::enqueue_seedance_1_lite_image_to_video_webhook::{Seedance1LiteArgs, Seedance1LiteResolution}; +use http_server_common::request::get_request_ip::get_request_ip; +use http_server_common::response::serialize_as_json_error::serialize_as_json_error; +use idempotency::uuid::generate_random_uuid; +use log::{error, info, warn}; +use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::insert_generic_inference_job_for_fal_queue; +use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::FalCategory; +use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job_for_fal_queue::InsertGenericInferenceForFalArgs; +use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; +use mysql_queries::queries::media_files::get::get_media_file::{get_media_file, MediaFile}; +use tokens::tokens::media_files::MediaFileToken; +use utoipa::ToSchema; + +/// Seedance 1.0 Lite Image to Video +#[utoipa::path( + post, + tag = "Generate Videos", + path = "/v1/generate/video/seedance_1.0_lite_image_to_video", + responses( + (status = 200, description = "Success", body = GenerateSeedance10LiteImageToVideoResponse), + ), + params( + ("request" = GenerateSeedance10LiteImageToVideoRequest, description = "Payload for Request"), + ) +)] +pub async fn generate_seedance_1_0_lite_image_to_video_handler( + http_request: HttpRequest, + request: Json, + server_state: web::Data> +) -> Result, CommonWebError> { + let maybe_user_session = server_state + .session_checker + .maybe_get_user_session(&http_request, &server_state.mysql_pool) + .await + .map_err(|e| { + warn!("Session checker error: {:?}", e); + CommonWebError::ServerError + })?; + + let maybe_avt_token = server_state + .avt_cookie_manager + .get_avt_token_from_request(&http_request); + + // TODO: Limit usage for new accounts. Billing, free credits metering, etc. + + //let user_session = match maybe_user_session { + // Some(session) => session, + // None => { + // warn!("not logged in"); + // return Err(RemoveImageBackgroundError::NotAuthorized); + // } + //}; + + let media_file_token = match &request.media_file_token { + Some(token) => token, + None => { + warn!("No media file token provided"); + return Err(CommonWebError::BadInputWithSimpleMessage("No media file token provided".to_string())); + } + }; + + if let Err(reason) = validate_idempotency_token_format(&request.uuid_idempotency_token) { + return Err(CommonWebError::BadInputWithSimpleMessage(reason)); + } + + insert_idempotency_token(&request.uuid_idempotency_token, &server_state.mysql_pool) + .await + .map_err(|err| { + error!("Error inserting idempotency token: {:?}", err); + CommonWebError::BadInputWithSimpleMessage("invalid idempotency token".to_string()) + })?; + const IS_MOD : bool = false; + + let media_file_lookup_result = get_media_file( + media_file_token, + IS_MOD, + &server_state.mysql_pool, + ).await; + + let media_file = match media_file_lookup_result { + Ok(Some(media_file)) => media_file, + Ok(None) => { + warn!("MediaFile not found: {:?}", media_file_token); + return Err(CommonWebError::NotFound); + }, + Err(err) => { + warn!("Error looking up media_file: {:?}", err); + return Err(CommonWebError::ServerError); + } + }; + + if !media_file.media_type.is_jpg_or_png_or_legacy_image() { + return Err(CommonWebError::BadInputWithSimpleMessage("Media file must be a JPG or PNG image".to_string())); + } + + let media_domain = get_media_domain(&http_request); + + let bucket_path = MediaFileBucketPath::from_object_hash( + &media_file.public_bucket_directory_hash, + media_file.maybe_public_bucket_prefix.as_deref(), + media_file.maybe_public_bucket_extension.as_deref()); + + let media_links = MediaLinks::from_media_path_and_env( + media_domain, + server_state.server_environment, + &bucket_path); + + info!("Fal webhook URL: {}", server_state.fal.webhook_url); + + let prompt = request.prompt + .as_deref() + .map(|prompt| prompt.trim()) + .unwrap_or_else(|| ""); + + let resolution = match &request.resolution { + Some(GenerateSeedance10LiteResolution::FourEightyP) => Seedance1LiteResolution::FourEightyP, + Some(GenerateSeedance10LiteResolution::SevenTwentyP) => Seedance1LiteResolution::SevenTwentyP, + None => Seedance1LiteResolution::SevenTwentyP, + }; + + let duration = match &request.duration { + Some(GenerateSeedance10LiteDuration::FiveSeconds) => Seedance1LiteDuration::FiveSeconds, + Some(GenerateSeedance10LiteDuration::TenSeconds) => Seedance1LiteDuration::TenSeconds, + None => Seedance1LiteDuration::FiveSeconds, + }; + + let args = Seedance1LiteArgs { + image_url: media_links.cdn_url, + webhook_url: &server_state.fal.webhook_url, + api_key: &server_state.fal.api_key, + duration, + resolution, + prompt, + camera_fixed: false, // TODO: Parameterize + seed: None, // TODO: Parameterize + }; + + let fal_result = enqueue_seedance_1_lite_image_to_video_webhook(args) + .await + .map_err(|err| { + warn!("Error calling enqueue_seedance_1_lite_image_to_video_webhook: {:?}", err); + CommonWebError::ServerError + })?; + + let external_job_id = fal_result.request_id + .ok_or_else(|| { + warn!("Fal request_id is None"); + CommonWebError::ServerError + })?; + + info!("Fal request_id: {}", external_job_id); + + let ip_address = get_request_ip(&http_request); + + let db_result = insert_generic_inference_job_for_fal_queue(InsertGenericInferenceForFalArgs { + uuid_idempotency_token: &request.uuid_idempotency_token, + maybe_external_third_party_id: &external_job_id, + fal_category: FalCategory::VideoGeneration, + maybe_inference_args: None, + maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token), + maybe_avt_token: maybe_avt_token.as_ref(), + creator_ip_address: &ip_address, + creator_set_visibility: Visibility::Public, + mysql_pool: &server_state.mysql_pool, + }).await; + + let job_token = match db_result { + Ok(token) => token, + Err(err) => { + warn!("Error inserting generic inference job for FAL queue: {:?}", err); + return Err(CommonWebError::ServerError); + } + }; + + Ok(Json(GenerateSeedance10LiteImageToVideoResponse { + success: true, + inference_job_token: job_token, + })) +} diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs index 53b178d850..0dacc10a6c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs @@ -1,4 +1,5 @@ pub mod generate_kling_1_6_pro_video_handler; pub mod generate_kling_2_1_master_video_handler; pub mod generate_kling_2_1_pro_video_handler; +pub mod generate_seedance_1_0_lite_image_to_video_handler; pub mod generate_veo_2_image_to_video_handler; \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/routes/add_generate_routes.rs b/crates/service/web/storyteller_web/src/http_server/routes/add_generate_routes.rs index ec08a55a97..3c2ca01780 100644 --- a/crates/service/web/storyteller_web/src/http_server/routes/add_generate_routes.rs +++ b/crates/service/web/storyteller_web/src/http_server/routes/add_generate_routes.rs @@ -8,11 +8,12 @@ use crate::http_server::endpoints::generate::object::generate_hunyuan_2_image_to use crate::http_server::endpoints::generate::video::generate_kling_1_6_pro_video_handler::generate_kling_1_6_pro_video_handler; use crate::http_server::endpoints::generate::video::generate_kling_2_1_master_video_handler::generate_kling_2_1_master_video_handler; use crate::http_server::endpoints::generate::video::generate_kling_2_1_pro_video_handler::generate_kling_2_1_pro_video_handler; +use crate::http_server::endpoints::generate::video::generate_seedance_1_0_lite_image_to_video_handler::generate_seedance_1_0_lite_image_to_video_handler; +use crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler; use actix_http::body::MessageBody; use actix_service::ServiceFactory; use actix_web::dev::{ServiceRequest, ServiceResponse}; use actix_web::{web, App, Error, HttpResponse}; -use crate::http_server::endpoints::generate::video::generate_veo_2_image_to_video_handler::generate_veo_2_image_to_video_handler; pub fn add_generate_routes (app: App) -> App where @@ -61,6 +62,10 @@ where .route(web::post().to(generate_kling_2_1_pro_video_handler)) .route(web::head().to(|| HttpResponse::Ok())) ) + .service(web::resource("/seedance_1.0_lite_image_to_video") + .route(web::post().to(generate_seedance_1_0_lite_image_to_video_handler)) + .route(web::head().to(|| HttpResponse::Ok())) + ) .service(web::resource("/veo_2_image_to_video") .route(web::post().to(generate_veo_2_image_to_video_handler)) .route(web::head().to(|| HttpResponse::Ok()))