From ef419e564654aaea689f55fe04c2b2040bf8c868 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 3 Oct 2025 22:01:21 -0400 Subject: [PATCH] landscape --- ...ate_sora2_video_with_session_auto_renew.rs | 4 +- .../generate_sora2_video.rs | 38 ++++++++++++++++--- .../generate_sora2_video/http_request.rs | 12 +++++- .../gallery-modal/src/lib/gallery-modal.tsx | 18 ++++++++- .../src/lib/classes/metadata/ModelMapping.ts | 2 + 5 files changed, 66 insertions(+), 8 deletions(-) diff --git a/crates/api_clients/openai_sora_client/src/recipes/generate_sora2_video/generate_sora2_video_with_session_auto_renew.rs b/crates/api_clients/openai_sora_client/src/recipes/generate_sora2_video/generate_sora2_video_with_session_auto_renew.rs index 0efe308dce..fb4e386a1f 100644 --- a/crates/api_clients/openai_sora_client/src/recipes/generate_sora2_video/generate_sora2_video_with_session_auto_renew.rs +++ b/crates/api_clients/openai_sora_client/src/recipes/generate_sora2_video/generate_sora2_video_with_session_auto_renew.rs @@ -27,7 +27,7 @@ pub async fn generate_sora2_video_with_session_auto_renew( #[cfg(test)] mod tests { use crate::recipes::generate_sora2_video::generate_sora2_video_with_session_auto_renew::generate_sora2_video_with_session_auto_renew; - use crate::requests::generate_sora2_video::generate_sora2_video::GenerateSora2VideoArgs; + use crate::requests::generate_sora2_video::generate_sora2_video::{GenerateSora2VideoArgs, Orientation}; use crate::test_utils::get_test_credentials::get_test_credentials; use errors::AnyhowResult; @@ -40,6 +40,8 @@ mod tests { prompt: "a dog playing tennis", credentials: &creds, request_timeout: None, + orientation: Orientation::Landscape, + image_reference_media_ids: None, }; let (result , creds) = diff --git a/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/generate_sora2_video.rs b/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/generate_sora2_video.rs index c635fa749d..e1aa043f25 100644 --- a/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/generate_sora2_video.rs +++ b/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/generate_sora2_video.rs @@ -4,7 +4,7 @@ use crate::error::sora_client_error::SoraClientError; use crate::error::sora_error::SoraError; use crate::error::sora_generic_api_error::SoraGenericApiError; use crate::requests::common::task_id::TaskId; -use crate::requests::generate_sora2_video::http_request::HttpCreateRequest; +use crate::requests::generate_sora2_video::http_request::{HttpCreateRequest, InpaintItem}; use crate::requests::generate_sora2_video::http_response::HttpCreateResponse; use crate::requests::image_gen::image_gen_http_request::{RawSoraImageGenRequest, RawSoraResponse}; use log::error; @@ -19,6 +19,14 @@ pub struct GenerateSora2VideoArgs<'a> { pub prompt: &'a str, pub credentials: &'a SoraCredentialSet, pub request_timeout: Option, + pub orientation: Orientation, + pub image_reference_media_ids: Option<&'a Vec>, +} + +#[derive(Clone, Copy)] +pub enum Orientation { + Portrait, + Landscape, } #[derive(Debug)] @@ -68,14 +76,32 @@ pub (crate) async fn generate_sora2_video( http_request = http_request.timeout(timeout); } + let orientation = match args.orientation { + Orientation::Portrait => "portrait", + Orientation::Landscape => "landscape", + }; + + let inpaint_items; + + if let Some(media_ids) = args.image_reference_media_ids { + inpaint_items = media_ids.iter() + .map(|item_id| InpaintItem { + kind: "upload".to_string(), + upload_id: item_id.to_string(), + }) + .collect(); + } else { + inpaint_items = Vec::new(); + } + let request_body = HttpCreateRequest { kind: "video".to_string(), prompt: args.prompt.to_string(), title: None, - orientation: "portrait".to_string(), + orientation: orientation.to_string(), size: "small".to_string(), n_frames: 300, - inpaint_items: vec![], + inpaint_items, cameo_ids: None, cameo_replacements: None, model: "sy_8".to_string(), @@ -126,7 +152,7 @@ pub (crate) async fn generate_sora2_video( #[cfg(test)] mod tests { - use crate::requests::generate_sora2_video::generate_sora2_video::{generate_sora2_video, GenerateSora2VideoArgs}; + use crate::requests::generate_sora2_video::generate_sora2_video::{generate_sora2_video, GenerateSora2VideoArgs, Orientation}; use crate::test_utils::get_test_credentials::get_test_credentials; use errors::AnyhowResult; @@ -135,9 +161,11 @@ mod tests { pub async fn manual_test() -> AnyhowResult<()> { let creds = get_test_credentials()?; let request = GenerateSora2VideoArgs { - prompt: "A cute baby sea otter wearing a beret and glasses, sitting on a rock and reading a book, digital art", + prompt: "A cute corgi wearing glasses, sitting on a picnic blanket and reading a book, digital art", credentials: &creds, request_timeout: None, + orientation: Orientation::Landscape, + image_reference_media_ids: None, }; let result = generate_sora2_video(request).await?; println!("result: {:#?}", result); diff --git a/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/http_request.rs b/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/http_request.rs index c96b08c5c1..5afb5d7e19 100644 --- a/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/http_request.rs +++ b/crates/api_clients/openai_sora_client/src/requests/generate_sora2_video/http_request.rs @@ -22,7 +22,7 @@ pub (super) struct HttpCreateRequest { pub n_frames: u16, // NB: sent as empty array - pub inpaint_items: Vec, + pub inpaint_items: Vec, // NB: Sent as null pub cameo_ids: Option, @@ -48,3 +48,13 @@ pub (super) struct HttpCreateRequest { // NB: Sent as null pub storyboard_id: Option, } + +#[derive(Serialize)] +#[serde(rename_all = "snake_case")] +pub (super) struct InpaintItem { + // eg. "upload" + pub kind: String, + + // eg. "media_01abc..." + pub upload_id: String, +} diff --git a/frontend/libs/components/gallery-modal/src/lib/gallery-modal.tsx b/frontend/libs/components/gallery-modal/src/lib/gallery-modal.tsx index 8c0f4891a3..fd7e9cc15f 100644 --- a/frontend/libs/components/gallery-modal/src/lib/gallery-modal.tsx +++ b/frontend/libs/components/gallery-modal/src/lib/gallery-modal.tsx @@ -212,6 +212,22 @@ export const GalleryModal = React.memo( } }; + const getLabel = (item: any) => { + if (!!item.maybe_title) { + return item.maybe_title; + } + switch (item.media_class) { + case "image": + return "Image Generation"; + case "video": + return "Video Generation"; + case "dimensional": + return "3D Object Generation"; + default: + return "Generation"; + } + }; + const loadItems = async (reset = false) => { if (!username) return; setLoading(true); @@ -240,7 +256,7 @@ export const GalleryModal = React.memo( ) .map((item: any) => ({ id: item.token, - label: item.maybe_title || "Image Generation", + label: getLabel(item), thumbnail: item.media_class === "video" ? item.media_links.maybe_video_previews.animated diff --git a/frontend/libs/model-list/src/lib/classes/metadata/ModelMapping.ts b/frontend/libs/model-list/src/lib/classes/metadata/ModelMapping.ts index b6c1c3aa80..291e8e402c 100644 --- a/frontend/libs/model-list/src/lib/classes/metadata/ModelMapping.ts +++ b/frontend/libs/model-list/src/lib/classes/metadata/ModelMapping.ts @@ -13,6 +13,7 @@ export const MODEL_TYPE_TO_CREATOR: Record = { kling_2p1_pro: ModelCreator.Kling, kling_2p1_master: ModelCreator.Kling, seedance_1p0_lite: ModelCreator.Bytedance, + sora_2: ModelCreator.OpenAi, veo_2: ModelCreator.Google, recraft_3: ModelCreator.Recraft, hunyuan_3d: ModelCreator.Tencent, @@ -96,6 +97,7 @@ export const getModelDisplayName = (modelType: string): string => { kling_2p1_master: "Kling 2.1 Master", seedance_1p0_lite: "Seedance 1.0 Lite", veo_2: "Veo 2", + sora_2: "Sora 2", recraft_3: "Recraft 3", hunyuan_3d_2p0: "Hunyuan 3D 2.0", hunyuan_3d_2p1: "Hunyuan 3D 2.1",