Skip to content
Dashboard

Seedance v1.5 Pro

Seedance v1.5 Pro is ByteDance's first audio-visual joint generation video model, released December 16, 2025. It produces synchronized dialogue, sound effects, and ambient audio alongside 1080p video in one generation pass, with multilingual voice and regional dialect support. Your use is subject to ByteDance's Terms & Privacy Policies.

Video Gentext-to-video
import { experimental_generateVideo as generateVideo } from 'ai';
const result = await generateVideo({
model: 'bytedance/seedance-v1.5-pro',
prompt: 'A serene mountain lake at sunrise.'
});
Read docs

Getting started

Generate videos with Seedance v1.5 Pro using the experimental_generateVideo function from AI SDK 6 or later. AI Gateway handles routing and polls until the video is ready.

Install the AI SDK (pnpm add ai dotenv), create an API key from the API Keys page, and set it as AI_GATEWAY_API_KEY in your environment. Full setup is covered in the video generation quickstart.

index.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'bytedance/seedance-v1.5-pro',
prompt: 'A chicken flying into the sunset in the style of 90s anime',
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Top-level parameters

Exercise the supported top-level params: prompt, aspectRatio, resolution, and duration.

seedance-text-to-video.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'bytedance/seedance-v1.5-pro',
prompt: 'A chicken flying into the sunset in the style of 90s anime',
aspectRatio: '16:9',
resolution: '1280x720',
duration: 5,
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);
ParameterTypeRequiredDescription
promptstringNoText description of the video to generate.
durationnumberNoVideo length in seconds. 4-12 seconds.
resolutionstringNoResolution ('854x480', '1280x720', '1920x1080').
aspectRatiostringNoAspect ratio ('16:9', '4:3', '1:1', '3:4', '9:16', '21:9').
generateAudiobooleanNoGenerate synchronized audio with the video.
frameImagesArray<{ image: string; frameType: 'first_frame' | 'last_frame' }>NoFirst and last frames of the clip. A first_frame entry replaces prompt.image and wins when both are set, and adding a last_frame transitions between the two. Seedance accepts image URLs only, so host local files on Vercel Blob first.

Input limits

InputFormatsSourcesMax countMax sizeLimits
Imagejpeg, png, webp, bmp, tiff, gif, heic, heifurl230 MB≥300px · ≤6000px · aspect 2:5–5:2

Provider options (bytedance)

Load the compatible Seedance options under providerOptions.bytedance. Frames and references are passed at the top level through frameImages and inputReferences, which change the call shape and are shown in their own examples below.

seedance-provider-options.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'bytedance/seedance-v1.5-pro',
prompt: 'A chicken flying into the sunset in the style of 90s anime',
resolution: '1280x720',
duration: 5,
providerOptions: {
bytedance: {
cameraFixed: true,
serviceTier: 'default',
watermark: false,
returnLastFrame: true,
pollIntervalMs: 5000,
pollTimeoutMs: 600000,
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

Pass these Seedance-specific options under providerOptions.bytedance in your generateVideo call.

ParameterTypeRequiredDescription
lastFrameImagestringNoURL of the last frame image, enabling first+last frame mode. Legacy alternative to the top-level frameImages, used only when frameImages is omitted.
draftbooleanNoGenerate a 480p preview for fast iteration. Seedance v1.5 Pro only.
watermarkbooleanNoAdd a watermark to the video.
cameraFixedbooleanNoFix the camera position during generation.
returnLastFramebooleanNoReturn the last frame of the generated video. Useful for chaining consecutive videos.
serviceTier'default' | 'flex'No'default' for online inference. 'flex' for offline at 50% cost, higher latency.
pollIntervalMsnumberNoHow often to check task status. Defaults to 3000.
pollTimeoutMsnumberNoMaximum wait time. Defaults to 300000 (5 minutes).

Frames take priority over references

Frames and references are mutually exclusive. When frameImages is set, inputReferences and the legacy providerOptions.bytedance.referenceImages / referenceVideos are dropped with a warning.

The top-level parameters win over their provider-option equivalents: frameImages overrides prompt.image and lastFrameImage, and inputReferences overrides referenceImages and referenceVideos. Set one or the other, not both.

providerOptions.bytedance.referenceAudio has no top-level equivalent, so it stays a provider option and is sent alongside whichever reference path you use.

Text-to-video with audio

Generate video with synchronized audio. Requires Seedance v1.5 Pro or a Seedance 2.0 series model.

seedance-text-to-video-audio.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'bytedance/seedance-v1.5-pro',
prompt:
'A thunderstorm rolling over a vast wheat field, lightning illuminating the clouds, rain beginning to fall',
resolution: '1280x720',
duration: 5,
generateAudio: true,
providerOptions: {
bytedance: {
pollTimeoutMs: 600000,
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);

First and last frame

Generate a video that transitions smoothly between a starting and ending image. Pass both frames through the top-level frameImages, tagging one first_frame and one last_frame. Seedance requires image URLs, so host local images on Vercel Blob first.

seedance-first-last-frame.ts
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
async function main() {
const result = await generateVideo({
model: 'bytedance/seedance-v1.5-pro',
prompt: 'Create a 360-degree orbiting camera shot based on this photo',
frameImages: [
{
image: 'https://example.com/first-frame.jpg',
frameType: 'first_frame',
},
{ image: 'https://example.com/last-frame.jpg', frameType: 'last_frame' },
],
duration: 5,
providerOptions: {
bytedance: {
watermark: false,
pollTimeoutMs: 600000,
},
},
});
// Save the generated video
fs.writeFileSync('output.mp4', result.videos[0].uint8Array);
console.log('Video saved to output.mp4');
}
main().catch(console.error);