diff --git a/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0.rs b/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0.rs index aa5e1769a9..9df1cb0eea 100644 --- a/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0.rs +++ b/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0.rs @@ -38,6 +38,7 @@ pub struct GenerateSeedance2p0Request { #[derive(Debug, Clone, Copy)] pub enum KinoviSeedance2p0AspectRatio { Landscape16x9, + UltraWide21x9, Portrait9x16, Square1x1, Standard4x3, @@ -155,6 +156,7 @@ pub async fn generate_seedance_2p0( fn map_aspect_ratio(ar: Option) -> KinoviAspectRatioRaw { match ar { Some(KinoviSeedance2p0AspectRatio::Landscape16x9) => KinoviAspectRatioRaw::Landscape16x9, + Some(KinoviSeedance2p0AspectRatio::UltraWide21x9) => KinoviAspectRatioRaw::UltraWide21x9, Some(KinoviSeedance2p0AspectRatio::Portrait9x16) => KinoviAspectRatioRaw::Portrait9x16, Some(KinoviSeedance2p0AspectRatio::Square1x1) => KinoviAspectRatioRaw::Square1x1, Some(KinoviSeedance2p0AspectRatio::Standard4x3) => KinoviAspectRatioRaw::Landscape4x3, @@ -430,6 +432,7 @@ mod tests { let ratios = [ KinoviSeedance2p0AspectRatio::Landscape16x9, + KinoviSeedance2p0AspectRatio::UltraWide21x9, KinoviSeedance2p0AspectRatio::Portrait9x16, KinoviSeedance2p0AspectRatio::Square1x1, KinoviSeedance2p0AspectRatio::Standard4x3, @@ -528,6 +531,70 @@ mod tests { } } + mod ultra_wide { + use super::*; + + #[tokio::test] + #[ignore] + async fn test_text_to_video_21x9() -> AnyhowResult<()> { + setup_test_logging(LevelFilter::Trace); + let session = test_session()?; + let result = generate_seedance_2p0(GenerateSeedance2p0Args { + session: &session, + host_override: None, + request: GenerateSeedance2p0Request { + prompt: "A corgi is riding on the back of a sauropod dinosaur".to_string(), + aspect_ratio: Some(KinoviSeedance2p0AspectRatio::UltraWide21x9), + output_resolution: None, + batch_count: None, + duration_seconds: 5, + start_frame_url: None, + end_frame_url: None, + reference_image_urls: None, + reference_video_urls: None, + reference_audio_urls: None, + character_ids: None, + use_face_blur_hack: None, + }, + }).await?; + println!("t2v 21:9 — task_id={}, order_id={}", result.task_id, result.order_id); + assert!(!result.task_id.is_empty()); + assert_eq!(1, 2); + Ok(()) + } + + #[tokio::test] + #[ignore] + async fn test_keyframe_21x9() -> AnyhowResult<()> { + setup_test_logging(LevelFilter::Trace); + let session = test_session()?; + let start_frame_url = upload_test_image(&session, test_data::web::image_urls::WIDE_CORGI_SHIBA_TREASURE_OCEAN_URL).await?; + + let result = generate_seedance_2p0(GenerateSeedance2p0Args { + session: &session, + host_override: None, + request: GenerateSeedance2p0Request { + prompt: "The dogs sail across the ocean on a treasure ship.".to_string(), + aspect_ratio: Some(KinoviSeedance2p0AspectRatio::UltraWide21x9), + output_resolution: None, + batch_count: None, + duration_seconds: 5, + start_frame_url: Some(start_frame_url), + end_frame_url: None, + reference_image_urls: None, + reference_video_urls: None, + reference_audio_urls: None, + character_ids: None, + use_face_blur_hack: None, + }, + }).await?; + println!("keyframe 21:9 — task_id={}, order_id={}", result.task_id, result.order_id); + assert!(!result.task_id.is_empty()); + assert_eq!(1, 2); + Ok(()) + } + } + mod keyframe { use super::*; diff --git a/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0_fast.rs b/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0_fast.rs index 2047b1fb1e..9cc06e43aa 100644 --- a/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0_fast.rs +++ b/crates/api_clients/seedance2pro_client/src/generate/video/generate_seedance_2p0_fast.rs @@ -38,6 +38,7 @@ pub struct GenerateSeedance2p0FastRequest { #[derive(Debug, Clone, Copy)] pub enum KinoviSeedance2p0FastAspectRatio { Landscape16x9, + UltraWide21x9, Portrait9x16, Square1x1, Standard4x3, @@ -152,6 +153,7 @@ pub async fn generate_seedance_2p0_fast( fn map_aspect_ratio(ar: Option) -> KinoviAspectRatioRaw { match ar { Some(KinoviSeedance2p0FastAspectRatio::Landscape16x9) => KinoviAspectRatioRaw::Landscape16x9, + Some(KinoviSeedance2p0FastAspectRatio::UltraWide21x9) => KinoviAspectRatioRaw::UltraWide21x9, Some(KinoviSeedance2p0FastAspectRatio::Portrait9x16) => KinoviAspectRatioRaw::Portrait9x16, Some(KinoviSeedance2p0FastAspectRatio::Square1x1) => KinoviAspectRatioRaw::Square1x1, Some(KinoviSeedance2p0FastAspectRatio::Standard4x3) => KinoviAspectRatioRaw::Landscape4x3, @@ -382,6 +384,7 @@ mod tests { let ratios = [ KinoviSeedance2p0FastAspectRatio::Landscape16x9, + KinoviSeedance2p0FastAspectRatio::UltraWide21x9, KinoviSeedance2p0FastAspectRatio::Portrait9x16, KinoviSeedance2p0FastAspectRatio::Square1x1, KinoviSeedance2p0FastAspectRatio::Standard4x3, @@ -480,6 +483,70 @@ mod tests { } } + mod ultra_wide { + use super::*; + + #[tokio::test] + #[ignore] + async fn test_text_to_video_21x9() -> AnyhowResult<()> { + setup_test_logging(LevelFilter::Trace); + let session = test_session()?; + let result = generate_seedance_2p0_fast(GenerateSeedance2p0FastArgs { + session: &session, + host_override: None, + request: GenerateSeedance2p0FastRequest { + prompt: "A shiba is riding on the back of a sauropod dinosaur".to_string(), + aspect_ratio: Some(KinoviSeedance2p0FastAspectRatio::UltraWide21x9), + output_resolution: Some(KinoviSeedance2p0FastOutputResolution::FourEightyP), + batch_count: None, + duration_seconds: 5, + start_frame_url: None, + end_frame_url: None, + reference_image_urls: None, + reference_video_urls: None, + reference_audio_urls: None, + character_ids: None, + use_face_blur_hack: None, + }, + }).await?; + println!("fast t2v 21:9 480p — task_id={}, order_id={}", result.task_id, result.order_id); + assert!(!result.task_id.is_empty()); + assert_eq!(1, 2); + Ok(()) + } + + #[tokio::test] + #[ignore] + async fn test_keyframe_21x9() -> AnyhowResult<()> { + setup_test_logging(LevelFilter::Trace); + let session = test_session()?; + let start_frame_url = upload_test_image(&session, test_data::web::image_urls::WIDE_CORGI_SHIBA_TREASURE_OCEAN_URL).await?; + + let result = generate_seedance_2p0_fast(GenerateSeedance2p0FastArgs { + session: &session, + host_override: None, + request: GenerateSeedance2p0FastRequest { + prompt: "The dogs in @1 set sail across the ocean on a treasure ship.".to_string(), + aspect_ratio: Some(KinoviSeedance2p0FastAspectRatio::UltraWide21x9), + output_resolution: None, + batch_count: None, + duration_seconds: 5, + start_frame_url: None, + end_frame_url: None, + reference_image_urls: None, + reference_video_urls: Some(vec![start_frame_url]), + reference_audio_urls: None, + character_ids: None, + use_face_blur_hack: None, + }, + }).await?; + println!("fast keyframe 21:9 — task_id={}, order_id={}", result.task_id, result.order_id); + assert!(!result.task_id.is_empty()); + assert_eq!(1, 2); + Ok(()) + } + } + mod keyframe { use super::*; 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 aacbf351ea..38f186809f 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 @@ -172,6 +172,8 @@ impl KinoviGenerateVideoRequest { pub enum KinoviAspectRatio { /// 16:9 landscape (1280x720) Landscape16x9, + /// 21:9 ultra-wide (1280x540) + UltraWide21x9, /// 9:16 portrait (720x1280) Portrait9x16, /// 1:1 square (720x720) @@ -186,6 +188,7 @@ impl KinoviAspectRatio { fn as_str(&self) -> &'static str { match self { Self::Landscape16x9 => "1280x720", + Self::UltraWide21x9 => "1280x540", Self::Portrait9x16 => "720x1280", Self::Square1x1 => "720x720", Self::Standard4x3 => "960x720", diff --git a/crates/api_clients/seedance2pro_client/src/requests/workflow_run_task/workflow_run_task.rs b/crates/api_clients/seedance2pro_client/src/requests/workflow_run_task/workflow_run_task.rs index 1b44d3fe56..9c35e31b64 100644 --- a/crates/api_clients/seedance2pro_client/src/requests/workflow_run_task/workflow_run_task.rs +++ b/crates/api_clients/seedance2pro_client/src/requests/workflow_run_task/workflow_run_task.rs @@ -181,6 +181,8 @@ impl WorkflowRunTaskRequest { pub enum KinoviAspectRatioRaw { /// 16:9 landscape (1280x720) Landscape16x9, + /// 21:9 ultra-wide (1280x540) + UltraWide21x9, /// 9:16 portrait (720x1280) Portrait9x16, /// 1:1 square (720x720) @@ -195,6 +197,7 @@ impl KinoviAspectRatioRaw { fn as_str(&self) -> &'static str { match self { Self::Landscape16x9 => "1280x720", + Self::UltraWide21x9 => "1280x540", Self::Portrait9x16 => "720x1280", Self::Square1x1 => "720x720", Self::Landscape4x3 => "960x720",