diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs index 6ff9663c6e..4fbe1fa34c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs @@ -1,5 +1,5 @@ use artcraft_api_defs::generate::video::multi_function::seedance_2p0_multi_function_video_gen::Seedance2p0BatchCount; -use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviBatchCount, KinoviModelType, KinoviOutputResolution, KinoviResolution}; +use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviBatchCount, KinoviModelType, KinoviOutputResolution, KinoviAspectRatio}; use crate::api::common_resolution::CommonResolution; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance2p0::PlanArtcraftSeedance2p0; @@ -21,7 +21,7 @@ pub (crate) fn estimate_video_cost_artcraft_seedance2p0( let request = GenerateVideoRequest { model_type: KinoviModelType::Seedance2Pro, prompt: String::new(), - resolution: KinoviResolution::Square1x1, + aspect_ratio: KinoviAspectRatio::Square1x1, duration_seconds, batch_count, output_resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs index 9e792f93a0..4ffd29f17d 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0_fast.rs @@ -1,5 +1,5 @@ use artcraft_api_defs::generate::video::multi_function::seedance_2p0_multi_function_video_gen::Seedance2p0BatchCount; -use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviBatchCount, KinoviModelType, KinoviOutputResolution, KinoviResolution}; +use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviBatchCount, KinoviModelType, KinoviOutputResolution, KinoviAspectRatio}; use crate::api::common_resolution::CommonResolution; use crate::generate::generate_video::plan::artcraft::plan_generate_video_artcraft_seedance2p0::PlanArtcraftSeedance2p0; @@ -21,7 +21,7 @@ pub(crate) fn estimate_video_cost_artcraft_seedance2p0_fast( let request = GenerateVideoRequest { model_type: KinoviModelType::Seedance2Fast, prompt: String::new(), - resolution: KinoviResolution::Square1x1, + aspect_ratio: KinoviAspectRatio::Square1x1, duration_seconds, batch_count, output_resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0.rs index 89d53d94e3..bfe9f085b6 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0.rs @@ -1,4 +1,4 @@ -use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviModelType, KinoviResolution}; +use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviModelType, KinoviAspectRatio}; use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0::PlanSeedance2proSeedance2p0; use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; @@ -9,7 +9,7 @@ pub(crate) fn estimate_video_cost_seedance2pro_seedance2p0( let request = GenerateVideoRequest { model_type: KinoviModelType::Seedance2Pro, prompt: String::new(), - resolution: KinoviResolution::Square1x1, // Resolution does not affect cost + aspect_ratio: KinoviAspectRatio::Square1x1, // Aspect ratio does not affect cost duration_seconds: plan.duration_seconds, batch_count: plan.batch_count, output_resolution: plan.output_resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0_fast.rs index b86f441e4c..786d939e55 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/seedance2pro/estimate_video_cost_seedance2pro_seedance2p0_fast.rs @@ -1,4 +1,4 @@ -use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviModelType, KinoviResolution}; +use seedance2pro_client::requests::generate_video::generate_video::{GenerateVideoRequest, KinoviModelType, KinoviAspectRatio}; use crate::generate::generate_video::plan::seedance2pro::plan_generate_video_seedance2pro_seedance2p0_fast::PlanSeedance2proSeedance2p0Fast; use crate::generate::generate_video::video_generation_cost_estimate::VideoGenerationCostEstimate; @@ -9,7 +9,7 @@ pub(crate) fn estimate_video_cost_seedance2pro_seedance2p0_fast( let request = GenerateVideoRequest { model_type: KinoviModelType::Seedance2Fast, // <-- Fast, not Pro prompt: String::new(), - resolution: KinoviResolution::Square1x1, // Resolution does not affect cost + aspect_ratio: KinoviAspectRatio::Square1x1, // Aspect ratio does not affect cost duration_seconds: plan.duration_seconds, batch_count: plan.batch_count, output_resolution: plan.output_resolution, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0.rs index 08d9187810..89278289a3 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0.rs @@ -38,7 +38,7 @@ pub async fn execute_seedance2pro_seedance2p0( request: GenerateVideoRequest { model_type: KinoviModelType::Seedance2Pro, prompt: plan.prompt.clone().unwrap_or_default(), - resolution: plan.resolution, + aspect_ratio: plan.aspect_ratio, output_resolution: plan.output_resolution, duration_seconds: plan.duration_seconds, batch_count: plan.batch_count, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0_fast.rs index 5c7c86565b..3ee4b2745c 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/execute/seedance2pro/execute_seedance2pro_seedance2p0_fast.rs @@ -35,7 +35,7 @@ pub async fn execute_seedance2pro_seedance2p0_fast( request: GenerateVideoRequest { model_type: KinoviModelType::Seedance2Fast, // <-- Fast, not Pro prompt: plan.prompt.clone().unwrap_or_default(), - resolution: plan.resolution, + aspect_ratio: plan.aspect_ratio, output_resolution: plan.output_resolution, duration_seconds: plan.duration_seconds, batch_count: plan.batch_count, diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs index 87bfa7ffb4..15327bbc40 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0.rs @@ -8,7 +8,7 @@ use crate::errors::artcraft_router_error::ArtcraftRouterError; use crate::errors::client_error::ClientError; use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; -use seedance2pro_client::requests::generate_video::generate_video::{KinoviBatchCount, KinoviOutputResolution, KinoviResolution}; +use seedance2pro_client::requests::generate_video::generate_video::{KinoviBatchCount, KinoviOutputResolution, KinoviAspectRatio}; use crate::api::common_resolution::CommonResolution; @@ -20,7 +20,7 @@ pub struct PlanSeedance2proSeedance2p0 { pub reference_image_urls: Option>, pub reference_video_urls: Option>, pub reference_audio_urls: Option>, - pub resolution: KinoviResolution, + pub aspect_ratio: KinoviAspectRatio, pub output_resolution: Option, pub duration_seconds: u8, pub batch_count: KinoviBatchCount, @@ -37,7 +37,7 @@ pub fn plan_generate_video_seedance2pro_seedance2p0( let reference_video_urls = resolve_video_list_ref_urls(request.reference_videos.clone())?; let reference_audio_urls = resolve_audio_list_ref_urls(request.reference_audio.clone())?; - let resolution = plan_resolution(request.aspect_ratio, strategy)?; + let aspect_ratio = plan_resolution(request.aspect_ratio, strategy)?; let batch_count = plan_batch_count(request.video_batch_count, strategy)?; let duration_seconds = plan_duration(request.duration_seconds, strategy)?; @@ -50,7 +50,7 @@ pub fn plan_generate_video_seedance2pro_seedance2p0( reference_image_urls, reference_video_urls, reference_audio_urls, - resolution, + aspect_ratio, output_resolution, duration_seconds, batch_count, @@ -122,26 +122,26 @@ fn resolve_audio_list_ref_urls( fn plan_resolution( aspect_ratio: Option, strategy: RequestMismatchMitigationStrategy, -) -> Result { +) -> Result { match aspect_ratio { // No preference or auto — default to landscape None | Some(CommonAspectRatio::Auto) | Some(CommonAspectRatio::Auto2k) - | Some(CommonAspectRatio::Auto4k) => Ok(KinoviResolution::Landscape16x9), + | Some(CommonAspectRatio::Auto4k) => Ok(KinoviAspectRatio::Landscape16x9), // Direct mappings Some(CommonAspectRatio::WideSixteenByNine) | Some(CommonAspectRatio::Wide) => { - Ok(KinoviResolution::Landscape16x9) + Ok(KinoviAspectRatio::Landscape16x9) } Some(CommonAspectRatio::TallNineBySixteen) | Some(CommonAspectRatio::Tall) => { - Ok(KinoviResolution::Portrait9x16) + Ok(KinoviAspectRatio::Portrait9x16) } Some(CommonAspectRatio::Square) | Some(CommonAspectRatio::SquareHd) => { - Ok(KinoviResolution::Square1x1) + Ok(KinoviAspectRatio::Square1x1) } - Some(CommonAspectRatio::WideFourByThree) => Ok(KinoviResolution::Standard4x3), - Some(CommonAspectRatio::TallThreeByFour) => Ok(KinoviResolution::Portrait3x4), + Some(CommonAspectRatio::WideFourByThree) => Ok(KinoviAspectRatio::Standard4x3), + Some(CommonAspectRatio::TallThreeByFour) => Ok(KinoviAspectRatio::Portrait3x4), // Mismatches — apply strategy Some(unsupported) => match strategy { @@ -160,15 +160,15 @@ fn plan_resolution( } /// Pick the nearest supported resolution by AR value (width / height). -fn nearest_resolution(aspect_ratio: CommonAspectRatio) -> KinoviResolution { +fn nearest_resolution(aspect_ratio: CommonAspectRatio) -> KinoviAspectRatio { match aspect_ratio { - CommonAspectRatio::WideFiveByFour => KinoviResolution::Standard4x3, // 1.25, nearest 1.33 - CommonAspectRatio::WideThreeByTwo => KinoviResolution::Standard4x3, // 1.50, nearest 1.33 - CommonAspectRatio::WideTwentyOneByNine => KinoviResolution::Landscape16x9, // 2.33, nearest 1.78 - CommonAspectRatio::TallFourByFive => KinoviResolution::Portrait3x4, // 0.80, nearest 0.75 - CommonAspectRatio::TallTwoByThree => KinoviResolution::Portrait3x4, // 0.67, nearest 0.75 - CommonAspectRatio::TallNineByTwentyOne => KinoviResolution::Portrait9x16, // 0.43, nearest 0.56 - _ => KinoviResolution::Square1x1, + CommonAspectRatio::WideFiveByFour => KinoviAspectRatio::Standard4x3, // 1.25, nearest 1.33 + CommonAspectRatio::WideThreeByTwo => KinoviAspectRatio::Standard4x3, // 1.50, nearest 1.33 + CommonAspectRatio::WideTwentyOneByNine => KinoviAspectRatio::Landscape16x9, // 2.33, nearest 1.78 + CommonAspectRatio::TallFourByFive => KinoviAspectRatio::Portrait3x4, // 0.80, nearest 0.75 + CommonAspectRatio::TallTwoByThree => KinoviAspectRatio::Portrait3x4, // 0.67, nearest 0.75 + CommonAspectRatio::TallNineByTwentyOne => KinoviAspectRatio::Portrait9x16, // 0.43, nearest 0.56 + _ => KinoviAspectRatio::Square1x1, } } diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs index 9327a03665..4f18cc7be7 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/plan/seedance2pro/plan_generate_video_seedance2pro_seedance2p0_fast.rs @@ -8,7 +8,7 @@ use crate::errors::artcraft_router_error::ArtcraftRouterError; use crate::errors::client_error::ClientError; use crate::generate::generate_video::generate_video_request::GenerateVideoRequest; use crate::generate::generate_video::video_generation_plan::VideoGenerationPlan; -use seedance2pro_client::requests::generate_video::generate_video::{KinoviBatchCount, KinoviOutputResolution, KinoviResolution}; +use seedance2pro_client::requests::generate_video::generate_video::{KinoviBatchCount, KinoviOutputResolution, KinoviAspectRatio}; use crate::api::common_resolution::CommonResolution; @@ -20,7 +20,7 @@ pub struct PlanSeedance2proSeedance2p0Fast { pub reference_image_urls: Option>, pub reference_video_urls: Option>, pub reference_audio_urls: Option>, - pub resolution: KinoviResolution, + pub aspect_ratio: KinoviAspectRatio, pub output_resolution: Option, pub duration_seconds: u8, pub batch_count: KinoviBatchCount, @@ -37,7 +37,7 @@ pub fn plan_generate_video_seedance2pro_seedance2p0_fast( let reference_video_urls = resolve_video_list_ref_urls(request.reference_videos.clone())?; let reference_audio_urls = resolve_audio_list_ref_urls(request.reference_audio.clone())?; - let resolution = plan_resolution(request.aspect_ratio, strategy)?; + let aspect_ratio = plan_resolution(request.aspect_ratio, strategy)?; let batch_count = plan_batch_count(request.video_batch_count, strategy)?; let duration_seconds = plan_duration(request.duration_seconds, strategy)?; @@ -50,7 +50,7 @@ pub fn plan_generate_video_seedance2pro_seedance2p0_fast( reference_image_urls, reference_video_urls, reference_audio_urls, - resolution, + aspect_ratio, output_resolution, duration_seconds, batch_count, @@ -117,24 +117,24 @@ fn resolve_audio_list_ref_urls( fn plan_resolution( aspect_ratio: Option, strategy: RequestMismatchMitigationStrategy, -) -> Result { +) -> Result { match aspect_ratio { None | Some(CommonAspectRatio::Auto) | Some(CommonAspectRatio::Auto2k) - | Some(CommonAspectRatio::Auto4k) => Ok(KinoviResolution::Landscape16x9), + | Some(CommonAspectRatio::Auto4k) => Ok(KinoviAspectRatio::Landscape16x9), Some(CommonAspectRatio::WideSixteenByNine) | Some(CommonAspectRatio::Wide) => { - Ok(KinoviResolution::Landscape16x9) + Ok(KinoviAspectRatio::Landscape16x9) } Some(CommonAspectRatio::TallNineBySixteen) | Some(CommonAspectRatio::Tall) => { - Ok(KinoviResolution::Portrait9x16) + Ok(KinoviAspectRatio::Portrait9x16) } Some(CommonAspectRatio::Square) | Some(CommonAspectRatio::SquareHd) => { - Ok(KinoviResolution::Square1x1) + Ok(KinoviAspectRatio::Square1x1) } - Some(CommonAspectRatio::WideFourByThree) => Ok(KinoviResolution::Standard4x3), - Some(CommonAspectRatio::TallThreeByFour) => Ok(KinoviResolution::Portrait3x4), + Some(CommonAspectRatio::WideFourByThree) => Ok(KinoviAspectRatio::Standard4x3), + Some(CommonAspectRatio::TallThreeByFour) => Ok(KinoviAspectRatio::Portrait3x4), Some(unsupported) => match strategy { RequestMismatchMitigationStrategy::ErrorOut => { @@ -151,15 +151,15 @@ fn plan_resolution( } } -fn nearest_resolution(aspect_ratio: CommonAspectRatio) -> KinoviResolution { +fn nearest_resolution(aspect_ratio: CommonAspectRatio) -> KinoviAspectRatio { match aspect_ratio { - CommonAspectRatio::WideFiveByFour => KinoviResolution::Standard4x3, - CommonAspectRatio::WideThreeByTwo => KinoviResolution::Standard4x3, - CommonAspectRatio::WideTwentyOneByNine => KinoviResolution::Landscape16x9, - CommonAspectRatio::TallFourByFive => KinoviResolution::Portrait3x4, - CommonAspectRatio::TallTwoByThree => KinoviResolution::Portrait3x4, - CommonAspectRatio::TallNineByTwentyOne => KinoviResolution::Portrait9x16, - _ => KinoviResolution::Square1x1, + CommonAspectRatio::WideFiveByFour => KinoviAspectRatio::Standard4x3, + CommonAspectRatio::WideThreeByTwo => KinoviAspectRatio::Standard4x3, + CommonAspectRatio::WideTwentyOneByNine => KinoviAspectRatio::Landscape16x9, + CommonAspectRatio::TallFourByFive => KinoviAspectRatio::Portrait3x4, + CommonAspectRatio::TallTwoByThree => KinoviAspectRatio::Portrait3x4, + CommonAspectRatio::TallNineByTwentyOne => KinoviAspectRatio::Portrait9x16, + _ => KinoviAspectRatio::Square1x1, } } diff --git a/crates/api_clients/seedance2pro_client/src/requests/generate_video/generate_video.rs b/crates/api_clients/seedance2pro_client/src/requests/generate_video/generate_video.rs index c991a49329..243cf70085 100644 --- a/crates/api_clients/seedance2pro_client/src/requests/generate_video/generate_video.rs +++ b/crates/api_clients/seedance2pro_client/src/requests/generate_video/generate_video.rs @@ -20,7 +20,14 @@ pub struct GenerateVideoRequest { pub prompt: String, - pub resolution: KinoviResolution, + /// The aspect ratio + /// (Kinovi terms this "resolution" in the API, confusingly.) + pub aspect_ratio: KinoviAspectRatio, + + /// The resolution + /// Output resolution quality (480p, 720p, 1080p). None defaults to 720p. + /// (Kinovi terms this "outputResolution" in the API, which is confusingly named) + pub output_resolution: Option, /// Duration in seconds (4–15). pub duration_seconds: u8, @@ -52,9 +59,6 @@ pub struct GenerateVideoRequest { /// Characters are referenced in prompts as @CharacterName. pub character_ids: Option>, - /// Output resolution quality (480p, 720p, 1080p). None defaults to 720p. - pub output_resolution: Option, - /// Controls the `faceBlurMode` field: true sends "on", false sends "off", None omits it. pub use_face_blur_hack: Option, } @@ -71,7 +75,7 @@ impl std::fmt::Debug for GenerateVideoRequest { f.debug_struct("GenerateVideoRequest") .field("model_type", &self.model_type) .field("prompt", &self.prompt) - .field("resolution", &self.resolution) + .field("aspect_ratio", &self.aspect_ratio) .field("duration_seconds", &self.duration_seconds) .field("batch_count", &self.batch_count) .field("start_frame_url", &self.start_frame_url) @@ -164,7 +168,7 @@ impl GenerateVideoRequest { /// Video resolution / aspect ratio. #[derive(Debug, Clone, Copy)] -pub enum KinoviResolution { +pub enum KinoviAspectRatio { /// 16:9 landscape (1280x720) Landscape16x9, /// 9:16 portrait (720x1280) @@ -177,7 +181,7 @@ pub enum KinoviResolution { Portrait3x4, } -impl KinoviResolution { +impl KinoviAspectRatio { fn as_str(&self) -> &'static str { match self { Self::Landscape16x9 => "1280x720", @@ -320,7 +324,7 @@ pub async fn generate_video(args: GenerateVideoArgs<'_>) -> Result) -> Result) -> KinoviResolution { +fn map_resolution(aspect_ratio: Option) -> KinoviAspectRatio { match aspect_ratio { - Some(Seedance2p0AspectRatio::Landscape16x9) => KinoviResolution::Landscape16x9, - Some(Seedance2p0AspectRatio::Portrait9x16) => KinoviResolution::Portrait9x16, - Some(Seedance2p0AspectRatio::Square1x1) => KinoviResolution::Square1x1, - Some(Seedance2p0AspectRatio::Standard4x3) => KinoviResolution::Standard4x3, - Some(Seedance2p0AspectRatio::Portrait3x4) => KinoviResolution::Portrait3x4, - None => KinoviResolution::Landscape16x9, + Some(Seedance2p0AspectRatio::Landscape16x9) => KinoviAspectRatio::Landscape16x9, + Some(Seedance2p0AspectRatio::Portrait9x16) => KinoviAspectRatio::Portrait9x16, + Some(Seedance2p0AspectRatio::Square1x1) => KinoviAspectRatio::Square1x1, + Some(Seedance2p0AspectRatio::Standard4x3) => KinoviAspectRatio::Standard4x3, + Some(Seedance2p0AspectRatio::Portrait3x4) => KinoviAspectRatio::Portrait3x4, + None => KinoviAspectRatio::Landscape16x9, } } @@ -492,7 +492,7 @@ fn map_batch_count(batch_count: Option) -> KinoviBatchCou /// Estimate the cost without needing uploaded URLs. We construct a temporary /// `GenerateVideoRequest` with dummy values for the URL fields. fn estimate_cost_upfront( - resolution: KinoviResolution, + aspect_ratio: KinoviAspectRatio, output_resolution: Option, batch_count: KinoviBatchCount, duration_seconds: u8, @@ -500,7 +500,7 @@ fn estimate_cost_upfront( let request = GenerateVideoRequest { model_type: KinoviModelType::Seedance2Pro, prompt: String::new(), - resolution, + aspect_ratio, duration_seconds, batch_count, output_resolution, @@ -521,7 +521,7 @@ async fn upload_and_generate( session: &Seedance2ProSession, request: &Seedance2p0MultiFunctionVideoGenRequest, file_urls_by_token: &HashMap, - resolution: KinoviResolution, + aspect_ratio: KinoviAspectRatio, output_resolution: Option, batch_count: KinoviBatchCount, duration_seconds: u8, @@ -594,7 +594,7 @@ async fn upload_and_generate( request: GenerateVideoRequest { model_type: KinoviModelType::Seedance2Pro, prompt, - resolution, + aspect_ratio, output_resolution, duration_seconds, batch_count, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/execute/execute_kinovi.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/execute/execute_kinovi.rs index e4a1c1dc8b..604ba4fbe7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/execute/execute_kinovi.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/execute/execute_kinovi.rs @@ -14,7 +14,7 @@ use enums::common::generation::common_generation_mode::CommonGenerationMode; use enums::common::generation::common_video_model::CommonVideoModel; use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession; use seedance2pro_client::requests::generate_video::generate_video::{ - generate_video, GenerateVideoArgs, GenerateVideoRequest, KinoviBatchCount, KinoviModelType, KinoviResolution, + generate_video, GenerateVideoArgs, GenerateVideoRequest, KinoviBatchCount, KinoviModelType, KinoviAspectRatio, }; use seedance2pro_client::requests::prepare_file_upload::prepare_file_upload::{ prepare_file_upload, PrepareFileUploadArgs, @@ -87,7 +87,7 @@ pub(super) async fn execute_generation_kinovi( }; // Map aspect ratio / duration / batch from the request. - let resolution = map_common_aspect_ratio_to_kinovi_resolution(request.aspect_ratio); + let aspect_ratio = map_common_aspect_ratio_to_kinovi_resolution(request.aspect_ratio); let duration_seconds = request.duration_seconds.unwrap_or(5).clamp(4, 15) as u8; @@ -110,7 +110,7 @@ pub(super) async fn execute_generation_kinovi( request: GenerateVideoRequest { model_type, prompt, - resolution, + aspect_ratio, duration_seconds, batch_count, start_frame_url, @@ -235,20 +235,20 @@ async fn upload_url_to_seedance2pro( Ok(upload_result.public_url) } -/// Map a CommonAspectRatio to the Seedance2Pro KinoviResolution enum. -fn map_common_aspect_ratio_to_kinovi_resolution(aspect_ratio: Option) -> KinoviResolution { +/// Map a CommonAspectRatio to the Seedance2Pro KinoviAspectRatio enum. +fn map_common_aspect_ratio_to_kinovi_resolution(aspect_ratio: Option) -> KinoviAspectRatio { match aspect_ratio { - Some(CommonAspectRatio::WideSixteenByNine) | Some(CommonAspectRatio::Wide) => KinoviResolution::Landscape16x9, - Some(CommonAspectRatio::TallNineBySixteen) | Some(CommonAspectRatio::Tall) => KinoviResolution::Portrait9x16, - Some(CommonAspectRatio::Square) | Some(CommonAspectRatio::SquareHd) => KinoviResolution::Square1x1, - Some(CommonAspectRatio::WideFourByThree) => KinoviResolution::Standard4x3, - Some(CommonAspectRatio::TallThreeByFour) => KinoviResolution::Portrait3x4, + Some(CommonAspectRatio::WideSixteenByNine) | Some(CommonAspectRatio::Wide) => KinoviAspectRatio::Landscape16x9, + Some(CommonAspectRatio::TallNineBySixteen) | Some(CommonAspectRatio::Tall) => KinoviAspectRatio::Portrait9x16, + Some(CommonAspectRatio::Square) | Some(CommonAspectRatio::SquareHd) => KinoviAspectRatio::Square1x1, + Some(CommonAspectRatio::WideFourByThree) => KinoviAspectRatio::Standard4x3, + Some(CommonAspectRatio::TallThreeByFour) => KinoviAspectRatio::Portrait3x4, // For unsupported aspect ratios, pick the nearest match. - Some(CommonAspectRatio::WideFiveByFour) | Some(CommonAspectRatio::WideThreeByTwo) => KinoviResolution::Standard4x3, - Some(CommonAspectRatio::WideTwentyOneByNine) => KinoviResolution::Landscape16x9, - Some(CommonAspectRatio::TallFourByFive) | Some(CommonAspectRatio::TallTwoByThree) => KinoviResolution::Portrait3x4, - Some(CommonAspectRatio::TallNineByTwentyOne) => KinoviResolution::Portrait9x16, + Some(CommonAspectRatio::WideFiveByFour) | Some(CommonAspectRatio::WideThreeByTwo) => KinoviAspectRatio::Standard4x3, + Some(CommonAspectRatio::WideTwentyOneByNine) => KinoviAspectRatio::Landscape16x9, + Some(CommonAspectRatio::TallFourByFive) | Some(CommonAspectRatio::TallTwoByThree) => KinoviAspectRatio::Portrait3x4, + Some(CommonAspectRatio::TallNineByTwentyOne) => KinoviAspectRatio::Portrait9x16, // Auto or None — default to landscape. - _ => KinoviResolution::Landscape16x9, + _ => KinoviAspectRatio::Landscape16x9, } } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/tests/kinovi/test_kinovi_seedance_2p0.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/tests/kinovi/test_kinovi_seedance_2p0.rs index 1b56cde6f0..5d472f1b47 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/tests/kinovi/test_kinovi_seedance_2p0.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/omni_gen/generate/video/tests/kinovi/test_kinovi_seedance_2p0.rs @@ -460,92 +460,92 @@ mod tests { #[test] fn aspect_ratio_wide_16x9() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), Some(CommonAspectRatio::WideSixteenByNine), Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Landscape16x9)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Landscape16x9)); } else { panic!("wrong plan variant"); } } #[test] fn aspect_ratio_tall_9x16() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), Some(CommonAspectRatio::TallNineBySixteen), Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Portrait9x16)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Portrait9x16)); } else { panic!("wrong plan variant"); } } #[test] fn aspect_ratio_square() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), Some(CommonAspectRatio::Square), Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Square1x1)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Square1x1)); } else { panic!("wrong plan variant"); } } #[test] fn aspect_ratio_4x3() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), Some(CommonAspectRatio::WideFourByThree), Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Standard4x3)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Standard4x3)); } else { panic!("wrong plan variant"); } } #[test] fn aspect_ratio_3x4() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), Some(CommonAspectRatio::TallThreeByFour), Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Portrait3x4)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Portrait3x4)); } else { panic!("wrong plan variant"); } } #[test] fn aspect_ratio_none_defaults_to_landscape() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), None, Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Landscape16x9)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Landscape16x9)); } else { panic!("wrong plan variant"); } } #[test] fn aspect_ratio_auto_defaults_to_landscape() { - use seedance2pro_client::requests::generate_video::generate_video::KinoviResolution; + use seedance2pro_client::requests::generate_video::generate_video::KinoviAspectRatio; let req = make_request( Some("test"), Some(CommonAspectRatio::Auto), Some(5), None, None, None, None, None, None, ); let d = distill_text(&req); if let VideoGenerationPlan::Seedance2proSeedance2p0(plan) = d.plan() { - assert!(matches!(plan.resolution, KinoviResolution::Landscape16x9)); + assert!(matches!(plan.aspect_ratio, KinoviAspectRatio::Landscape16x9)); } else { panic!("wrong plan variant"); } } }