This page provides complete, runnable examples for all video generation use cases. All examples are from the actual source repository.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/DecartAI/ai-sdk-provider/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
All examples assume you have:npm install @decartai/ai-sdk-provider ai
export DECART_API_KEY='your-api-key'
Text-to-Video
Generate videos from text prompts usinglucy-pro-t2v.
Basic Example
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
export const modelId = 'lucy-pro-t2v';
export async function run() {
const result = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt: 'A man is riding a horse in a field',
});
return result;
}
examples/tasks/video-generation-t2v.ts
With All Settings
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function generateTextToVideo() {
const { videos, warnings } = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt: 'A sunset over the ocean with waves crashing',
aspectRatio: '16:9',
resolution: '1280x720',
seed: 42,
providerOptions: {
decart: {
pollIntervalMs: 2000,
pollTimeoutMs: 600000, // 10 minutes
},
},
});
// Save the video
const filename = `video-${Date.now()}.mp4`;
fs.writeFileSync(filename, videos[0].uint8Array);
console.log(`Saved to ${filename}`);
// Check warnings
if (warnings.length > 0) {
console.warn('Warnings:', warnings);
}
return videos[0];
}
generateTextToVideo();
Batch Generation
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
const prompts = [
'A person walking through a forest',
'Clouds moving across a blue sky',
'A cat playing with a toy',
];
async function batchGenerate() {
for (const [index, prompt] of prompts.entries()) {
console.log(`Generating video ${index + 1}/${prompts.length}...`);
const { videos } = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt,
aspectRatio: '16:9',
});
const filename = `batch-${index + 1}.mp4`;
fs.writeFileSync(filename, videos[0].uint8Array);
console.log(`Saved ${filename}`);
}
}
batchGenerate();
Image-to-Video
Animate images into videos usinglucy-pro-i2v or lucy-dev-i2v.
Basic Example
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
export const modelId = 'lucy-pro-i2v';
export async function run(image: Uint8Array) {
const result = await generateVideo({
model: decart.video('lucy-pro-i2v'),
prompt: {
image,
text: 'The subject begins to walk forward slowly',
},
});
return result;
}
examples/tasks/video-generation-i2v.ts
From File
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function animateImage() {
// Load image from file
const imageData = fs.readFileSync('input-image.jpg');
const { videos } = await generateVideo({
model: decart.video('lucy-pro-i2v'),
prompt: {
image: imageData,
text: 'The subject begins to walk forward slowly',
},
aspectRatio: '16:9',
seed: 42,
});
// Save the animated video
fs.writeFileSync('animated.mp4', videos[0].uint8Array);
console.log('Animation complete!');
}
animateImage();
From URL
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function animateFromUrl() {
const { videos } = await generateVideo({
model: decart.video('lucy-pro-i2v'),
prompt: {
image: {
type: 'url',
url: 'https://example.com/portrait.jpg',
},
text: 'The person smiles and nods',
},
});
fs.writeFileSync('from-url.mp4', videos[0].uint8Array);
}
animateFromUrl();
Development vs Production
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function compareModels() {
const imageData = fs.readFileSync('test-image.jpg');
const prompt = {
image: imageData,
text: 'The subject looks around',
};
// Fast iteration with dev model
console.log('Generating with lucy-dev-i2v...');
const devResult = await generateVideo({
model: decart.video('lucy-dev-i2v'),
prompt,
});
fs.writeFileSync('dev-output.mp4', devResult.videos[0].uint8Array);
// High quality with pro model
console.log('Generating with lucy-pro-i2v...');
const proResult = await generateVideo({
model: decart.video('lucy-pro-i2v'),
prompt,
});
fs.writeFileSync('pro-output.mp4', proResult.videos[0].uint8Array);
console.log('Both models complete!');
}
compareModels();
Motion Control
Control camera and subject movement withlucy-motion.
Basic Trajectory
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
export const modelId = 'lucy-motion';
export async function run(image: Uint8Array) {
const result = await generateVideo({
model: decart.video('lucy-motion'),
prompt: {
image,
text: 'The subject moves along the specified path',
},
providerOptions: {
decart: {
trajectory: [
{ frame: 0, x: 0.5, y: 0.5 },
{ frame: 12, x: 0.7, y: 0.9 },
{ frame: 25, x: 0.3, y: 0.1 },
],
},
},
});
return result;
}
examples/tasks/video-generation-motion.ts
Horizontal Pan
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function horizontalPan() {
const imageData = fs.readFileSync('landscape.jpg');
const { videos } = await generateVideo({
model: decart.video('lucy-motion'),
prompt: {
image: imageData,
text: 'Camera pans across the scene',
},
providerOptions: {
decart: {
trajectory: [
{ frame: 0, x: 0.0, y: 0.5 }, // Start left
{ frame: 25, x: 1.0, y: 0.5 }, // End right
],
},
},
});
fs.writeFileSync('pan.mp4', videos[0].uint8Array);
}
horizontalPan();
Circular Motion
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function circularMotion() {
const imageData = fs.readFileSync('subject.jpg');
const { videos } = await generateVideo({
model: decart.video('lucy-motion'),
prompt: {
image: imageData,
text: 'Smooth circular camera movement',
},
aspectRatio: '16:9',
resolution: '1280x720',
providerOptions: {
decart: {
trajectory: [
{ frame: 0, x: 0.5, y: 0.3 }, // Top
{ frame: 6, x: 0.7, y: 0.5 }, // Right
{ frame: 12, x: 0.5, y: 0.7 }, // Bottom
{ frame: 18, x: 0.3, y: 0.5 }, // Left
{ frame: 24, x: 0.5, y: 0.3 }, // Back to top
],
},
},
});
fs.writeFileSync('circular.mp4', videos[0].uint8Array);
}
circularMotion();
Complex Path
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function complexPath() {
const imageData = fs.readFileSync('scene.jpg');
// Define a zigzag motion path
const trajectory = [
{ frame: 0, x: 0.2, y: 0.5 },
{ frame: 5, x: 0.4, y: 0.3 },
{ frame: 10, x: 0.6, y: 0.7 },
{ frame: 15, x: 0.8, y: 0.4 },
{ frame: 20, x: 0.6, y: 0.6 },
{ frame: 25, x: 0.5, y: 0.5 },
];
const { videos } = await generateVideo({
model: decart.video('lucy-motion'),
prompt: {
image: imageData,
text: 'Dynamic camera movement through the scene',
},
seed: 42,
providerOptions: {
decart: {
trajectory,
pollTimeoutMs: 600000, // Complex paths may take longer
},
},
});
fs.writeFileSync('complex-motion.mp4', videos[0].uint8Array);
console.log('Complex motion video generated!');
}
complexPath();
Advanced Patterns
Error Handling
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
async function generateWithErrorHandling() {
try {
const { videos, warnings } = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt: 'A beautiful landscape',
aspectRatio: '16:9',
});
// Check for warnings
if (warnings.length > 0) {
console.warn('Generation completed with warnings:');
warnings.forEach(w => {
console.warn(`- ${w.feature}: ${w.details || 'unsupported'}`);
});
}
// Save video
const filename = `video-${Date.now()}.mp4`;
fs.writeFileSync(filename, videos[0].uint8Array);
console.log(`Successfully saved to ${filename}`);
return videos[0];
} catch (error: any) {
if (error.name === 'AI_APICallError') {
console.error('API Error:', error.message);
// Handle specific error cases
if (error.message.includes('timed out')) {
console.error('Generation took too long. Try increasing pollTimeoutMs.');
} else if (error.message.includes('failed')) {
console.error('Generation job failed. Check your input parameters.');
} else if (error.message.includes('aborted')) {
console.error('Request was cancelled.');
}
} else {
console.error('Unexpected error:', error);
}
throw error;
}
}
generateWithErrorHandling();
With Abort Signal
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
async function cancellableGeneration() {
const controller = new AbortController();
// Cancel after 2 minutes
const timeoutId = setTimeout(() => {
console.log('Cancelling generation...');
controller.abort();
}, 120000);
try {
const { videos } = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt: 'A long video sequence',
abortSignal: controller.signal,
});
clearTimeout(timeoutId);
return videos[0];
} catch (error: any) {
if (error.message.includes('aborted')) {
console.log('Generation was cancelled successfully');
} else {
throw error;
}
}
}
cancellableGeneration();
Progress Tracking
import { decart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
async function generateWithProgress() {
console.log('Starting video generation...');
const startTime = Date.now();
const { videos } = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt: 'A cinematic scene',
providerOptions: {
decart: {
pollIntervalMs: 2000,
},
},
});
const duration = (Date.now() - startTime) / 1000;
console.log(`Generation completed in ${duration.toFixed(1)}s`);
console.log(`Video size: ${videos[0].uint8Array.length} bytes`);
return videos[0];
}
generateWithProgress();
Custom Provider Instance
import { createDecart } from '@decartai/ai-sdk-provider';
import { experimental_generateVideo as generateVideo } from 'ai';
import fs from 'fs';
// Create custom provider with specific configuration
const customDecart = createDecart({
apiKey: process.env.CUSTOM_API_KEY,
baseURL: 'https://custom.decart.ai',
headers: {
'X-Custom-Header': 'value',
},
});
async function generateWithCustomProvider() {
const { videos } = await generateVideo({
model: customDecart.video('lucy-pro-t2v'),
prompt: 'A custom generated video',
});
fs.writeFileSync('custom.mp4', videos[0].uint8Array);
}
generateWithCustomProvider();
TypeScript Types
Example with full type safety:import { decart } from '@decartai/ai-sdk-provider';
import {
experimental_generateVideo as generateVideo,
type Experimental_VideoGenerationResult as VideoGenerationResult,
} from 'ai';
import fs from 'fs';
interface GenerationOptions {
prompt: string;
aspectRatio?: '16:9' | '9:16';
resolution?: '1280x720' | '854x480';
seed?: number;
}
async function typedGeneration(
options: GenerationOptions
): Promise<VideoGenerationResult> {
const result: VideoGenerationResult = await generateVideo({
model: decart.video('lucy-pro-t2v'),
prompt: options.prompt,
aspectRatio: options.aspectRatio,
resolution: options.resolution,
seed: options.seed,
});
// Type-safe access
const video = result.videos[0];
console.log(`Generated video: ${video.mediaType}`);
console.log(`Size: ${video.uint8Array.length} bytes`);
return result;
}
typedGeneration({
prompt: 'A typed video generation',
aspectRatio: '16:9',
resolution: '1280x720',
seed: 42,
});
Next Steps
View All Models
Explore model specifications
Settings Reference
View all configuration options
Motion Control Guide
Learn trajectory-based generation
Overview
Back to video generation overview