diff --git a/frontend/libs/components/promptbox/src/lib/PromptBoxVideo.tsx b/frontend/libs/components/promptbox/src/lib/PromptBoxVideo.tsx index c6883f9d55..17a01b8819 100644 --- a/frontend/libs/components/promptbox/src/lib/PromptBoxVideo.tsx +++ b/frontend/libs/components/promptbox/src/lib/PromptBoxVideo.tsx @@ -510,7 +510,6 @@ export const PromptBoxVideo = ({ gtagEvent("enqueue_video"); const isSeedance2 = selectedModel.id === "seedance_2p0"; - const count = isSeedance2 ? generationCount : 1; const isRefMode = inputMode === "reference" && !!selectedModel.supportsReferenceMode; @@ -544,6 +543,10 @@ export const PromptBoxVideo = ({ request.provider = selectedProvider; } + if (isSeedance2 && generationCount > 1) { + request.video_batch_count = generationCount; + } + if (selectedModel.generateWithSound) { request.generate_audio = !!generateWithSound; } @@ -605,27 +608,18 @@ export const PromptBoxVideo = ({ return request; }; - const subscriberIds: string[] = []; - const enqueuePromises: Promise[] = []; - - for (let i = 0; i < count; i++) { - const subscriberId = crypto.randomUUID - ? crypto.randomUUID() - : Math.random().toString(36).slice(2); - subscriberIds.push(subscriberId); - enqueuePromises.push( - EnqueueImageToVideo(buildRequest(subscriberId)) as Promise, - ); - } + const subscriberId = crypto.randomUUID + ? crypto.randomUUID() + : Math.random().toString(36).slice(2); try { - await Promise.all(enqueuePromises); + await EnqueueImageToVideo(buildRequest(subscriberId)); } catch (err) { console.error("PromptBoxVideo - enqueue failed", err); toast.error("Failed to start video generation. Please try again."); } - onEnqueuePressed?.(prompt, subscriberIds); + onEnqueuePressed?.(prompt, [subscriberId]); setIsEnqueueing(false); }; diff --git a/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageToVideo.ts b/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageToVideo.ts index c12a032dbe..37fa017bd3 100644 --- a/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageToVideo.ts +++ b/frontend/libs/tauri-api/src/lib/enqueue/EnqueueImageToVideo.ts @@ -60,6 +60,9 @@ export interface EnqueueImageToVideoRequest { // Optional. Reference audio media tokens (for audio reference). reference_audio_media_tokens?: string[]; + + // Optional. Number of videos to generate in one batch (e.g. Seedance 2.0). + video_batch_count?: number; } interface RawEnqueueImageToVideoRequest { @@ -78,6 +81,7 @@ interface RawEnqueueImageToVideoRequest { reference_image_media_tokens?: string[]; reference_video_media_tokens?: string[]; reference_audio_media_tokens?: string[]; + video_batch_count?: number; } export interface EnqueueImageToVideoError extends CommandResult { @@ -168,6 +172,10 @@ export const EnqueueImageToVideo = async ( request.reference_audio_media_tokens; } + if (request.video_batch_count && request.video_batch_count > 1) { + mutableRequest.video_batch_count = request.video_batch_count; + } + const result = await invoke("enqueue_image_to_video_command", { request: mutableRequest, });