Generate a video from a prompt and any number of images and video.
The client provides a convenient way to interact with the model API.
npm install --save @fal-ai/clientThe @fal-ai/serverless-client package has been deprecated in favor of @fal-ai/client. Install the new package and update your imports — see client setup.
Set FAL_KEY as an environment variable in your runtime.
export FAL_KEY="YOUR_API_KEY"The client API handles the API submit protocol. It will handle the request status updates and return the result when the request is completed.
import { fal } from "@fal-ai/client";
const result = await fal.subscribe("fal-ai/ltxv-13b-098-distilled/multiconditioning", {
input: {
prompt: "A vibrant, abstract composition featuring a person with outstretched arms, rendered in a kaleidoscope of colors against a deep, dark background. The figure is composed of intricate, swirling patterns reminiscent of a mosaic, with hues of orange, yellow, blue, and green that evoke the style of artists such as Wassily Kandinsky or Bridget Riley. The camera zooms into the face striking portrait of a man, reimagined through the lens of old-school video-game graphics. The subject's face is rendered in a kaleidoscope of colors, with bold blues and reds set against a vibrant yellow backdrop. His dark hair is pulled back, framing his profile in a dramatic pose."
},
logs: true,
onQueueUpdate: (update) => {
if (update.status === "IN_PROGRESS") {
update.logs.map((log) => log.message).forEach(console.log);
}
},
});
console.log(result.data);
console.log(result.requestId);The API uses an API Key for authentication. It is recommended you set the FAL_KEY environment variable in your runtime when possible.
import { fal } from "@fal-ai/client";
fal.config({
credentials: "YOUR_FAL_KEY"
});When running code on the client-side (e.g. in a browser, mobile app or GUI applications), make sure to not expose your FAL_KEY. Instead, use a server-side proxy to make requests to the API. For more information, check out our server-side integration guide.
The client API provides a convenient way to submit requests to the model.
import { fal } from "@fal-ai/client";
const { request_id } = await fal.queue.submit("fal-ai/ltxv-13b-098-distilled/multiconditioning", {
input: {
prompt: "A vibrant, abstract composition featuring a person with outstretched arms, rendered in a kaleidoscope of colors against a deep, dark background. The figure is composed of intricate, swirling patterns reminiscent of a mosaic, with hues of orange, yellow, blue, and green that evoke the style of artists such as Wassily Kandinsky or Bridget Riley. The camera zooms into the face striking portrait of a man, reimagined through the lens of old-school video-game graphics. The subject's face is rendered in a kaleidoscope of colors, with bold blues and reds set against a vibrant yellow backdrop. His dark hair is pulled back, framing his profile in a dramatic pose."
},
webhookUrl: "https://optional.webhook.url/for/results",
});You can fetch the status of a request to check if it is completed or still in progress.
import { fal } from "@fal-ai/client";
const status = await fal.queue.status("fal-ai/ltxv-13b-098-distilled/multiconditioning", {
requestId: "764cabcf-b745-4b3e-ae38-1200304cf45b",
logs: true,
});Once the request is completed, you can fetch the result. See the Output Schema for the expected result format.
import { fal } from "@fal-ai/client";
const result = await fal.queue.result("fal-ai/ltxv-13b-098-distilled/multiconditioning", {
requestId: "764cabcf-b745-4b3e-ae38-1200304cf45b"
});
console.log(result.data);
console.log(result.requestId);Some attributes in the API accept file URLs as input. Whenever that's the case you can pass your own URL or a Base64 data URI.
You can pass a Base64 data URI as a file input. The API will handle the file decoding for you. Keep in mind that for large files, this alternative although convenient can impact the request performance.
You can also pass your own URLs as long as they are publicly accessible. Be aware that some hosts might block cross-site requests, rate-limit, or consider the request as a bot.
We provide a convenient file storage that allows you to upload files and use them in your requests. You can upload files using the client API and use the returned URL in your requests.
import { fal } from "@fal-ai/client";
const file = new File(["Hello, World!"], "hello.txt", { type: "text/plain" });
const url = await fal.storage.upload(file);The client will auto-upload the file for you if you pass a binary object (e.g. File, Data).
Read more about file handling in our file upload guide.
prompt string* requiredText prompt to guide generation
negative_prompt stringNegative prompt for generation Default value: "worst quality, inconsistent motion, blurry, jittery, distorted"
LoRA weights to use for generation
resolution ResolutionEnumResolution of the generated video. Default value: "720p"
Possible enum values: 480p, 720p
aspect_ratio AspectRatioEnumThe aspect ratio of the video. Default value: "auto"
Possible enum values: 9:16, 1:1, 16:9, auto
seed integerRandom seed for generation
num_frames integerThe number of frames in the video. Default value: 121
first_pass_num_inference_steps integerNumber of inference steps during the first pass. Default value: 8
second_pass_num_inference_steps integerNumber of inference steps during the second pass. Default value: 8
second_pass_skip_initial_steps integerThe number of inference steps to skip in the initial steps of the second pass. By skipping some steps at the beginning, the second pass can focus on smaller details instead of larger changes. Default value: 5
frame_rate integerThe frame rate of the video. Default value: 24
expand_prompt booleanWhether to expand the prompt using a language model.
reverse_video booleanWhether to reverse the video.
enable_safety_checker booleanWhether to enable the safety checker. Disabling it requires account authorization; unauthorized requests are always checked. Default value: true
enable_detail_pass booleanWhether to use a detail pass. If True, the model will perform a second pass to refine the video and enhance details. This incurs a 2.0x cost multiplier on the base price.
temporal_adain_factor floatThe factor for adaptive instance normalization (AdaIN) applied to generated video chunks after the first. This can help deal with a gradual increase in saturation/contrast in the generated video by normalizing the color distribution across the video. A high value will ensure the color distribution is more consistent across the video, while a low value will allow for more variation in color distribution. Default value: 0.5
tone_map_compression_ratio floatThe compression ratio for tone mapping. This is used to compress the dynamic range of the video to improve visual quality. A value of 0.0 means no compression, while a value of 1.0 means maximum compression.
constant_rate_factor integerThe constant rate factor (CRF) to compress input media with. Compressed input media more closely matches the model's training data, which can improve motion quality. Default value: 29
URL of images to use as conditioning
Videos to use as conditioning
{
"prompt": "A vibrant, abstract composition featuring a person with outstretched arms, rendered in a kaleidoscope of colors against a deep, dark background. The figure is composed of intricate, swirling patterns reminiscent of a mosaic, with hues of orange, yellow, blue, and green that evoke the style of artists such as Wassily Kandinsky or Bridget Riley. The camera zooms into the face striking portrait of a man, reimagined through the lens of old-school video-game graphics. The subject's face is rendered in a kaleidoscope of colors, with bold blues and reds set against a vibrant yellow backdrop. His dark hair is pulled back, framing his profile in a dramatic pose.",
"negative_prompt": "worst quality, inconsistent motion, blurry, jittery, distorted",
"loras": [],
"resolution": "720p",
"aspect_ratio": "auto",
"num_frames": 121,
"first_pass_num_inference_steps": 8,
"second_pass_num_inference_steps": 8,
"second_pass_skip_initial_steps": 5,
"frame_rate": 24,
"expand_prompt": false,
"reverse_video": false,
"enable_safety_checker": true,
"enable_detail_pass": false,
"temporal_adain_factor": 0.5,
"tone_map_compression_ratio": 0,
"constant_rate_factor": 29,
"images": [
{
"start_frame_num": 0,
"image_url": "https://storage.googleapis.com/falserverless/model_tests/ltx/NswO1P8sCLzrh1WefqQFK_9a6bdbfa54b944c9a770338159a113fd.jpg",
"strength": 1
},
{
"start_frame_num": 120,
"image_url": "https://storage.googleapis.com/falserverless/model_tests/ltx/YAPOGvmS2tM_Krdp7q6-d_267c97e017c34f679844a4477dfcec38.jpg",
"strength": 1
}
],
"videos": []
}The generated video file.
prompt string* requiredThe prompt used for generation.
seed integer* requiredThe seed used for generation.
{
"video": {
"url": "https://storage.googleapis.com/falserverless/example_outputs/ltxv-multiconditioning-output.mp4"
},
"prompt": "A vibrant, abstract composition featuring a person with outstretched arms, rendered in a kaleidoscope of colors against a deep, dark background. The figure is composed of intricate, swirling patterns reminiscent of a mosaic, with hues of orange, yellow, blue, and green that evoke the style of artists such as Wassily Kandinsky or Bridget Riley. The camera zooms into the face striking portrait of a man, reimagined through the lens of old-school video-game graphics. The subject's face is rendered in a kaleidoscope of colors, with bold blues and reds set against a vibrant yellow backdrop. His dark hair is pulled back, framing his profile in a dramatic pose."
}video_url string* requiredURL of video to use as conditioning
conditioning_type EnumType of conditioning this video provides. This is relevant to ensure in-context LoRA weights are applied correctly, as well as selecting the correct preprocessing pipeline, when enabled. Default value: rgb
Possible enum values: rgb, depth, pose, canny
preprocess booleanWhether to preprocess the video. If True, the video will be preprocessed to match the conditioning type. This is a no-op for RGB conditioning.
start_frame_num integerFrame number of the video from which the conditioning starts. Must be a multiple of 8.
strength floatStrength of the conditioning. 0.0 means no conditioning, 1.0 means full conditioning. Default value: 1
limit_num_frames booleanWhether to limit the number of frames used from the video. If True, the max_num_frames parameter will be used to limit the number of frames.
max_num_frames integerMaximum number of frames to use from the video. If None, all frames will be used. Default value: 1441
resample_fps booleanWhether to resample the video to a specific FPS. If True, the target_fps parameter will be used to resample the video.
target_fps integerTarget FPS to resample the video to. Only relevant if resample_fps is True. Default value: 24
reverse_video booleanWhether to reverse the video. This is useful for tasks where the video conditioning should be applied in reverse order.
image_url string* requiredURL of image to use as conditioning
start_frame_num integerFrame number of the image from which the conditioning starts. Must be a multiple of 8.
strength floatStrength of the conditioning. 0.0 means no conditioning, 1.0 means full conditioning. Default value: 1
path string* requiredURL or path to the LoRA weights.
weight_name stringName of the LoRA weight. Only used if path is a HuggingFace repository, and is only required when the repository contains multiple LoRA weights.
scale floatScale of the LoRA weight. This is a multiplier applied to the LoRA weight when loading it. Default value: 1
url string* requiredThe URL where the file can be downloaded from.
content_type stringThe mime type of the file.
file_name stringThe name of the file. It will be auto-generated if not provided.
file_size integerThe size of the file in bytes.