rename field

This commit is contained in:
Brandon Thomas committed 2026-04-18 08:05:29 -04:00
1 parent 489390c881
commit f14b496c75
12 files changed
+129 -125

No files matched your search

@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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,
@@ -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<Vec<String>>,
pub reference_video_urls: Option<Vec<String>>,
pub reference_audio_urls: Option<Vec<String>>,
pub resolution: KinoviResolution,
pub aspect_ratio: KinoviAspectRatio,
pub output_resolution: Option<KinoviOutputResolution>,
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<CommonAspectRatio>,
strategy: RequestMismatchMitigationStrategy,
) -> Result<KinoviResolution, ArtcraftRouterError> {
) -> Result<KinoviAspectRatio, ArtcraftRouterError> {
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,
}
}
@@ -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<Vec<String>>,
pub reference_video_urls: Option<Vec<String>>,
pub reference_audio_urls: Option<Vec<String>>,
pub resolution: KinoviResolution,
pub aspect_ratio: KinoviAspectRatio,
pub output_resolution: Option<KinoviOutputResolution>,
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<CommonAspectRatio>,
strategy: RequestMismatchMitigationStrategy,
) -> Result<KinoviResolution, ArtcraftRouterError> {
) -> Result<KinoviAspectRatio, ArtcraftRouterError> {
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,
}
}
@@ -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<KinoviOutputResolution>,
/// 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<Vec<String>>,
/// Output resolution quality (480p, 720p, 1080p). None defaults to 720p.
pub output_resolution: Option<KinoviOutputResolution>,
/// Controls the `faceBlurMode` field: true sends "on", false sends "off", None omits it.
pub use_face_blur_hack: Option<bool>,
}
@@ -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<GenerateVideo
info!(
"Generating video: mode={}, resolution={}, duration={}, batch={}",
video_input_mode, req.resolution.as_str(), duration, batch_count_value
video_input_mode, req.aspect_ratio.as_str(), duration, batch_count_value
);
let request_body = BatchRequest {
@@ -329,7 +333,7 @@ pub async fn generate_video(args: GenerateVideoArgs<'_>) -> Result<GenerateVideo
business_type: "wan22-video-generation",
api_params: ApiParams {
prompt: req.prompt,
resolution: req.resolution.as_str().to_string(),
resolution: req.aspect_ratio.as_str().to_string(),
content_mode: "normal",
model: req.model_type.as_api_str(),
duration,
@@ -439,7 +443,7 @@ mod tests {
GenerateVideoRequest {
model_type,
prompt: String::new(),
resolution: KinoviResolution::Square1x1,
aspect_ratio: KinoviAspectRatio::Square1x1,
duration_seconds,
batch_count,
start_frame_url: None,
@@ -612,11 +616,11 @@ mod tests {
#[test]
fn aspect_ratio_does_not_affect_credits() {
let resolutions = [
KinoviResolution::Landscape16x9,
KinoviResolution::Portrait9x16,
KinoviResolution::Square1x1,
KinoviResolution::Standard4x3,
KinoviResolution::Portrait3x4,
KinoviAspectRatio::Landscape16x9,
KinoviAspectRatio::Portrait9x16,
KinoviAspectRatio::Square1x1,
KinoviAspectRatio::Standard4x3,
KinoviAspectRatio::Portrait3x4,
];
let baseline = pro(5, KinoviBatchCount::One).estimate_credits();
@@ -625,7 +629,7 @@ mod tests {
let req = GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: String::new(),
resolution: *res,
aspect_ratio: *res,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -730,7 +734,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "A corgi eating a cake in a fancy kitchen.".to_string(),
resolution: KinoviResolution::Square1x1,
aspect_ratio: KinoviAspectRatio::Square1x1,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -763,7 +767,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "A dog shakes the glasses off its head. The camera pans out as the shiba shakes. The shiba barks.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: Some("https://static.seedance2-pro.com/materials/20260219/1771496300184-fb32e08c.jpg".to_string()),
@@ -795,7 +799,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "The dog in @2 is in the office at @1 without the man. The office is dark and moonlight streams in through the windows. Particles of dust gleam in the moon beams. Suddenly, the dog jumps walks in front of the desk and barks.".to_string(),
resolution: KinoviResolution::Standard4x3,
aspect_ratio: KinoviAspectRatio::Standard4x3,
duration_seconds: 10,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -830,7 +834,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "Change the Video @video1 to night time.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -864,7 +868,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "Put the robot in @video1 next to the house in @image1".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -924,7 +928,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "Change @video1 to night time".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -979,7 +983,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "The corgi dog watches the lake.".to_string(),
resolution: KinoviResolution::Portrait9x16,
aspect_ratio: KinoviAspectRatio::Portrait9x16,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: Some(upload_result.public_url),
@@ -1034,7 +1038,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Fast,
prompt: "A corgi dog runs along the lake shore, splashing water. Camera follows.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: Some(upload_result.public_url),
@@ -1096,7 +1100,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Fast,
prompt: "The dog in @1 is running through the scenery in @3 towards the building in @2. Golden hour lighting.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -1151,7 +1155,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Fast,
prompt: "A fantasy forest with mushrooms glowing in the dark. Fireflies dance between the trees. A small character walks along a winding path.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -1190,7 +1194,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "@Steampunk Clown is juggling flaming torches in a circus tent.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -1223,7 +1227,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Fast,
prompt: "@Mochi the female shiba inu is eating a cheese pizza while standing on the table".to_string(),
resolution: KinoviResolution::Portrait9x16,
aspect_ratio: KinoviAspectRatio::Portrait9x16,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -1256,7 +1260,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Pro,
prompt: "@Steampunk Clown is walking up to pet a dog on the couch.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -1291,7 +1295,7 @@ mod tests {
request: GenerateVideoRequest {
model_type: KinoviModelType::Seedance2Fast,
prompt: "@Steampunk Clown and @Mochi are playing fetch in a sunny park.".to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 5,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -1338,7 +1342,7 @@ mod tests {
request: GenerateVideoRequest {
model_type,
prompt: prompt.to_string(),
resolution: KinoviResolution::Landscape16x9,
aspect_ratio: KinoviAspectRatio::Landscape16x9,
duration_seconds: 4,
batch_count: KinoviBatchCount::One,
start_frame_url: None,
@@ -39,7 +39,7 @@ use pager::notification::notification_details_builder::NotificationDetailsBuilde
use pager::notification::notification_urgency::NotificationUrgency;
use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession;
use seedance2pro_client::requests::generate_video::generate_video::{
generate_video, KinoviBatchCount, GenerateVideoArgs, GenerateVideoRequest, GenerateVideoResponse, KinoviModelType, KinoviOutputResolution, KinoviResolution,
generate_video, KinoviBatchCount, GenerateVideoArgs, GenerateVideoRequest, GenerateVideoResponse, KinoviModelType, KinoviOutputResolution, KinoviAspectRatio,
};
use seedance2pro_client::requests::prepare_file_upload::prepare_file_upload::{
prepare_file_upload, PrepareFileUploadArgs,
@@ -163,12 +163,12 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
// --- Calculate cost and charge wallet upfront (before uploads) ---
let resolution = map_resolution(request.aspect_ratio);
let aspect_ratio = map_resolution(request.aspect_ratio);
let output_resolution = map_output_resolution(request.output_resolution);
let batch_count = map_batch_count(request.batch_count);
let duration_seconds = request.duration_seconds.unwrap_or(5).clamp(4, 15);
let cost_in_cents = estimate_cost_upfront(resolution, output_resolution, batch_count, duration_seconds);
let cost_in_cents = estimate_cost_upfront(aspect_ratio, output_resolution, batch_count, duration_seconds);
let apriori_job_token = InferenceJobToken::generate();
@@ -199,7 +199,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
&whitelist_session,
&request,
&file_urls_by_token,
resolution,
aspect_ratio,
output_resolution,
batch_count,
duration_seconds,
@@ -222,7 +222,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
&regular_session,
&request,
&file_urls_by_token,
resolution,
aspect_ratio,
output_resolution,
batch_count,
duration_seconds,
@@ -260,7 +260,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
&regular_session,
&request,
&file_urls_by_token,
resolution,
aspect_ratio,
output_resolution,
batch_count,
duration_seconds,
@@ -462,14 +462,14 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
// ======================== Helpers ========================
fn map_resolution(aspect_ratio: Option<Seedance2p0AspectRatio>) -> KinoviResolution {
fn map_resolution(aspect_ratio: Option<Seedance2p0AspectRatio>) -> 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<Seedance2p0BatchCount>) -> 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<KinoviOutputResolution>,
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<MediaFileToken, Url>,
resolution: KinoviResolution,
aspect_ratio: KinoviAspectRatio,
output_resolution: Option<KinoviOutputResolution>,
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,
@@ -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<CommonAspectRatio>) -> KinoviResolution {
/// Map a CommonAspectRatio to the Seedance2Pro KinoviAspectRatio enum.
fn map_common_aspect_ratio_to_kinovi_resolution(aspect_ratio: Option<CommonAspectRatio>) -> 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,
}
}
@@ -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"); }
}
}