home / skills / hoodini / ai-agents-skills / fal-ai
This skill helps you generate images, videos, and audio using fal.ai serverless AI for rapid media creation.
npx playbooks add skill hoodini/ai-agents-skills --skill fal-aiReview the files below or copy the command above to add this skill to your agents.
---
name: fal-ai
description: Generate images, videos, and audio with fal.ai serverless AI. Use when building AI image generation, video generation, image editing, or real-time AI features. Triggers on fal.ai, fal, AI image generation, Flux, SDXL, real-time AI, serverless AI.
---
# fal.ai - Serverless AI Platform
Generate images, videos, and audio with fal.ai's fast serverless inference.
## Quick Start
```bash
npm install @fal-ai/serverless-client
```
```typescript
import * as fal from '@fal-ai/serverless-client';
fal.config({
credentials: process.env.FAL_KEY,
});
// Generate image with Flux
const result = await fal.subscribe('fal-ai/flux/dev', {
input: {
prompt: 'A serene Japanese garden with cherry blossoms',
image_size: 'landscape_16_9',
num_images: 1,
},
});
console.log(result.images[0].url);
```
## Authentication
```typescript
// Option 1: Environment variable (recommended)
// Set FAL_KEY in .env
fal.config({ credentials: process.env.FAL_KEY });
// Option 2: Direct config
fal.config({ credentials: 'your-api-key' });
// Option 3: Proxy (for client-side apps)
// Use fal.config({ proxyUrl: '/api/fal/proxy' }) on client
```
## Image Generation Models
### Flux (Fastest, High Quality)
```typescript
// Flux Dev - Best quality
const result = await fal.subscribe('fal-ai/flux/dev', {
input: {
prompt: 'Professional headshot of a business executive',
image_size: 'square_hd', // 1024x1024
num_inference_steps: 28,
guidance_scale: 3.5,
num_images: 1,
enable_safety_checker: true,
},
});
// Flux Schnell - Ultra fast (~0.5s)
const fast = await fal.subscribe('fal-ai/flux/schnell', {
input: {
prompt: 'A cute robot',
image_size: 'square',
num_inference_steps: 4, // Schnell needs fewer steps
},
});
// Flux Pro - Highest quality
const pro = await fal.subscribe('fal-ai/flux-pro', {
input: {
prompt: 'Hyperrealistic portrait',
image_size: 'portrait_4_3',
safety_tolerance: '2',
},
});
```
### Image Sizes
```typescript
type ImageSize =
| 'square_hd' // 1024x1024
| 'square' // 512x512
| 'portrait_4_3' // 768x1024
| 'portrait_16_9' // 576x1024
| 'landscape_4_3' // 1024x768
| 'landscape_16_9' // 1024x576
| { width: number; height: number }; // Custom
```
### SDXL & Stable Diffusion
```typescript
// SDXL
const sdxl = await fal.subscribe('fal-ai/fast-sdxl', {
input: {
prompt: 'Fantasy landscape',
negative_prompt: 'blurry, low quality',
image_size: 'landscape_16_9',
num_inference_steps: 25,
guidance_scale: 7.5,
scheduler: 'DPM++ 2M Karras',
},
});
// Stable Diffusion 3
const sd3 = await fal.subscribe('fal-ai/stable-diffusion-v3-medium', {
input: {
prompt: 'A mountain lake at sunset',
negative_prompt: 'ugly, deformed',
image_size: 'landscape_16_9',
},
});
```
## Image-to-Image
### Image Editing with Flux
```typescript
// Image to image
const result = await fal.subscribe('fal-ai/flux/dev/image-to-image', {
input: {
prompt: 'Transform to watercolor painting style',
image_url: 'https://example.com/photo.jpg',
strength: 0.75, // How much to change (0-1)
num_inference_steps: 28,
},
});
// Inpainting (edit specific areas)
const inpaint = await fal.subscribe('fal-ai/flux/dev/inpainting', {
input: {
prompt: 'A red sports car',
image_url: 'https://example.com/street.jpg',
mask_url: 'https://example.com/mask.png', // White = edit area
},
});
```
### ControlNet
```typescript
// Generate with pose/edge control
const controlled = await fal.subscribe('fal-ai/flux-controlnet', {
input: {
prompt: 'A professional dancer',
control_image_url: 'https://example.com/pose.jpg',
controlnet_conditioning_scale: 0.8,
},
});
```
## Video Generation
### Kling Video
```typescript
const video = await fal.subscribe('fal-ai/kling-video/v1/standard/text-to-video', {
input: {
prompt: 'A golden retriever running through a field of flowers',
duration: '5', // seconds
aspect_ratio: '16:9',
},
});
console.log(video.video.url);
```
### Image to Video
```typescript
const i2v = await fal.subscribe('fal-ai/kling-video/v1/standard/image-to-video', {
input: {
prompt: 'The person starts walking forward',
image_url: 'https://example.com/person.jpg',
duration: '5',
},
});
```
### Luma Dream Machine
```typescript
const luma = await fal.subscribe('fal-ai/luma-dream-machine', {
input: {
prompt: 'A timelapse of clouds moving over mountains',
aspect_ratio: '16:9',
},
});
```
## Real-Time Generation
### WebSocket Streaming
```typescript
import * as fal from '@fal-ai/serverless-client';
// Real-time image generation with streaming
const stream = await fal.stream('fal-ai/flux/dev', {
input: {
prompt: 'A beautiful sunset',
image_size: 'landscape_16_9',
},
});
for await (const event of stream) {
if (event.images) {
console.log('Generated:', event.images[0].url);
}
}
```
### Real-Time SDXL (Low Latency)
```typescript
// Ultra-low latency for interactive apps
const realtime = await fal.subscribe('fal-ai/fast-lcm-diffusion', {
input: {
prompt: 'Abstract art',
image_size: 'square',
num_inference_steps: 4, // LCM needs very few steps
},
});
```
## Background Removal & Editing
```typescript
// Remove background
const nobg = await fal.subscribe('fal-ai/birefnet', {
input: {
image_url: 'https://example.com/photo.jpg',
},
});
// Upscale image
const upscaled = await fal.subscribe('fal-ai/creative-upscaler', {
input: {
image_url: 'https://example.com/small.jpg',
scale: 2,
creativity: 0.5,
prompt: 'High quality, detailed',
},
});
// Face swap
const swapped = await fal.subscribe('fal-ai/face-swap', {
input: {
base_image_url: 'https://example.com/target.jpg',
swap_image_url: 'https://example.com/face.jpg',
},
});
```
## Next.js Integration
### API Route (App Router)
```typescript
// app/api/generate/route.ts
import * as fal from '@fal-ai/serverless-client';
import { NextRequest, NextResponse } from 'next/server';
fal.config({ credentials: process.env.FAL_KEY });
export async function POST(request: NextRequest) {
const { prompt, model = 'fal-ai/flux/schnell' } = await request.json();
try {
const result = await fal.subscribe(model, {
input: {
prompt,
image_size: 'landscape_16_9',
num_images: 1,
},
});
return NextResponse.json({
imageUrl: result.images[0].url,
seed: result.seed,
});
} catch (error) {
return NextResponse.json({ error: 'Generation failed' }, { status: 500 });
}
}
```
### Proxy Route for Client-Side
```typescript
// app/api/fal/proxy/route.ts
import { route } from '@fal-ai/serverless-client/server-proxy';
export const { GET, POST, PUT, DELETE } = route;
```
```typescript
// Client-side usage
'use client';
import * as fal from '@fal-ai/serverless-client';
fal.config({ proxyUrl: '/api/fal/proxy' });
async function generateImage(prompt: string) {
const result = await fal.subscribe('fal-ai/flux/schnell', {
input: { prompt, image_size: 'square_hd' },
});
return result.images[0].url;
}
```
## Queue System for Long Tasks
```typescript
// Submit to queue (returns immediately)
const { request_id } = await fal.queue.submit('fal-ai/flux/dev', {
input: { prompt: 'Complex scene', num_images: 4 },
});
// Check status
const status = await fal.queue.status('fal-ai/flux/dev', {
requestId: request_id,
});
console.log(status.status); // 'IN_QUEUE' | 'IN_PROGRESS' | 'COMPLETED'
// Get result when ready
if (status.status === 'COMPLETED') {
const result = await fal.queue.result('fal-ai/flux/dev', {
requestId: request_id,
});
}
// Or use webhooks
await fal.queue.submit('fal-ai/flux/dev', {
input: { prompt: 'Scene' },
webhookUrl: 'https://your-server.com/webhook',
});
```
## Model Comparison
| Model | Speed | Quality | Best For |
|-------|-------|---------|----------|
| flux/schnell | ~0.5s | Good | Real-time, previews |
| flux/dev | ~3s | Excellent | Production images |
| flux-pro | ~5s | Best | Professional work |
| fast-sdxl | ~2s | Good | General purpose |
| sd-v3-medium | ~4s | Excellent | Detailed scenes |
| kling-video | ~60s | Good | Video generation |
## Resources
- **fal.ai Docs**: https://fal.ai/docs
- **Model Gallery**: https://fal.ai/models
- **API Reference**: https://fal.ai/docs/api-reference
- **Pricing**: https://fal.ai/pricing
This skill connects your app to fal.ai's serverless AI platform for generating images, video, and audio. It exposes fast, production-ready models (Flux, SDXL, Kling) and supports image editing, inpainting, background removal, upscaling, and real-time streaming. Use it to add serverless, low-latency generative features without managing GPUs.
It calls fal.ai model endpoints via the serverless client to subscribe, stream, queue, or proxy requests. You send a prompt and optional assets (images, masks, control images) and receive URLs or streamed events with generated results. It supports model selection, size presets, inference tuning (steps, guidance, scheduler), and webhook or queue workflows for long-running jobs.
How do I authenticate safely from a browser?
Keep your FAL_KEY on the server and expose a proxy API route. Configure fal.config with proxyUrl on the client to avoid leaking keys.
Which model is best for production quality?
Use flux/dev for a balance of speed and quality or flux-pro for the highest fidelity. For detailed scenes try fast-sdxl or stable-diffusion-v3-medium.
How can I handle long-running video or large-batch jobs?
Use fal.queue.submit to enqueue jobs and poll fal.queue.status or configure a webhook to receive results when ready.