Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
import { client } from "@gradio/client" | |
import { VideoGenerationOptions } from "./types.mts" | |
import { getNegativePrompt, getPositivePrompt } from "./defaultPrompts.mts" | |
import { generateSeed } from "../../utils/misc/generateSeed.mts" | |
// we don't use replicas yet, because it ain't easy to get their hostname | |
const instances: string[] = [ | |
`${process.env.VC_HOTSHOT_XL_GRADIO_SPACE_API_URL_1 || ""}`, | |
].filter(instance => instance?.length > 0) | |
const secretToken = `${process.env.VC_MICROSERVICE_SECRET_TOKEN || ""}` | |
export const generateVideo = async ({ | |
positivePrompt, | |
negativePrompt = "", | |
seed, | |
nbFrames = 8, // for now the only values that make sense are 1 (for a jpg) or 8 (for a video) | |
videoDuration = 1000, // for now Hotshot doesn't really supports anything else | |
nbSteps = 30, // when rendering a final video, we want a value like 50 or 70 here | |
size = "768x320", | |
// for jbilcke-hf/sdxl-cinematic-2 it is "cinematic-2" | |
triggerWord = "cinematic-2", | |
huggingFaceLora = "jbilcke-hf/sdxl-cinematic-2", | |
}: VideoGenerationOptions) => { | |
const instance = instances.shift() | |
instances.push(instance) | |
const api = await client(instance, { | |
hf_token: `${process.env.VC_HF_API_TOKEN}` as any | |
}) | |
// pimp the prompt | |
positivePrompt = getPositivePrompt(positivePrompt, triggerWord) | |
negativePrompt = getNegativePrompt(negativePrompt) | |
try { | |
const rawResponse = await api.predict('/run', [ | |
secretToken, | |
positivePrompt, // string in 'Prompt' Textbox component | |
negativePrompt || "", | |
huggingFaceLora?.length || undefined, // string in 'Public LoRA ID' Textbox component | |
size || '512x512', // string (Option from: [('320x768', '320x768'), ('384x672', '384x672'), ('416x608', '416x608'), ('512x512', '512x512'), ('608x416', '608x416'), ('672x384', '672x384'), ('768x320', '768x320')]) in 'Size' Dropdown component | |
!isNaN(seed) && isFinite(seed) ? seed : generateSeed(), // number (numeric value between -1 and 423538377342) in 'Seed' Slider component, -1 to set to random | |
nbSteps || 30, | |
nbFrames || 8, | |
videoDuration || 1000, | |
]) as any | |
// console.log("rawResponse:", rawResponse) | |
console.log("data:", rawResponse?.data) | |
const { name } = rawResponse?.data?.[0]?.[0] as { name: string, orig_name: string } | |
return `${instance}/file=${name}` | |
} catch (err) { | |
throw err | |
} | |
} | |