varg ā AI Video Generation SDK
Create AI videos with JSX. One SDK for Kling, Flux, ElevenLabs, Sora and more. Built on Vercel AI SDK.
Docs Ā· Dashboard Ā· Quickstart Ā· Models Ā· Discord
varg is an open-source TypeScript SDK for AI video generation. One API key, one gateway ā generate images, video, speech, music, lipsync, and captions through varg.* providers. Write videos as JSX components (like React), render locally or in the cloud.
Get started
For AI agents (recommended)
Install the varg skill into Claude Code, Cursor, Windsurf, or any agent that supports skills. Zero code ā just prompt.
npx -y skills add vargHQ/skills --all --copy -y
export VARG_API_KEY=varg_live_xxx
claude "create a 10-second product video for white sneakers, 9:16, UGC style, with captions and background music"
The agent writes declarative JSX, varg handles AI generation + caching + rendering.
For developers
bun install vargai ai
npm install vargai ai
bunx vargai init
vargai init handles everything: signs you in, installs the agent skill, creates a starter template, and sets up your project structure.
Then render the starter template:
bunx vargai render hello.tsx
Or ask your AI agent to create something from scratch.
How it works
Your prompt / JSX code
|
varg gateway (api.varg.ai)
/ | \ \
Kling Flux ElevenLabs Wan ... (AI providers)
\ | / /
varg render engine
|
output.mp4
- One API key (
VARG_API_KEY) routes to all providers through the varg gateway
- Declarative JSX ā compose videos like React components with
<Clip>, <Video>, <Music>, <Captions>
- Automatic caching ā same props = instant cache hit at $0. Re-render without re-generating
- Local or cloud ā render with
bunx vargai render locally, or submit via the Cloud Render API
Quick examples
Image to video
import { Render, Clip, Image, Video } from "vargai/react";
import { varg } from "vargai/ai";
const character = Image({
prompt: "cute kawaii orange cat, round body, big eyes, Pixar style",
model: varg.imageModel("nano-banana-pro"),
aspectRatio: "9:16",
});
export default (
<Render width={1080} height={1920}>
<Clip duration={5}>
<Video
prompt={{ text: "cat waves hello, bounces happily", images: [character] }}
model={varg.videoModel("kling-v3")}
/>
</Clip>
</Render>
);
bunx vargai render hello.tsx
With music and captions
import { Render, Clip, Image, Video, Speech, Captions, Music } from "vargai/react";
import { varg } from "vargai/ai";
const character = Image({
model: varg.imageModel("nano-banana-pro"),
prompt: "friendly robot, blue metallic, expressive eyes",
aspectRatio: "9:16",
});
const voiceover = Speech({
model: varg.speechModel("eleven_v3"),
voice: "adam",
children: "Hello! I'm your AI assistant. Let me show you something cool!",
});
export default (
<Render width={1080} height={1920}>
<Music prompt="upbeat electronic, cheerful" model={varg.musicModel()} volume={0.15} />
<Clip duration={5}>
<Video
prompt={{ text: "robot talking, subtle head movements", images: [character] }}
model={varg.videoModel("kling-v3")}
/>
</Clip>
<Captions src={voiceover} style="tiktok" color="#ffffff" withAudio />
</Render>
);
Talking head with lipsync
import { Render, Clip, Image, Video, Speech, Captions, Music } from "vargai/react";
import { varg } from "vargai/ai";
const voiceover = Speech({
model: varg.speechModel("eleven_v3"),
voice: "josh",
children: "With varg, you can create any videos at scale!",
});
const baseCharacter = Image({
prompt: "woman, sleek black bob hair, fitted black t-shirt, natural look",
model: varg.imageModel("nano-banana-pro"),
aspectRatio: "9:16",
});
const animatedCharacter = Video({
prompt: {
text: "woman speaking naturally, subtle head movements, friendly expression",
images: [baseCharacter],
},
model: varg.videoModel("kling-v3"),
});
export default (
<Render width={1080} height={1920}>
<Music prompt="modern tech ambient, subtle electronic" model={varg.musicModel()} volume={0.1} />
<Clip duration={5}>
<Video
prompt={{ video: animatedCharacter, audio: voiceover }}
model={varg.videoModel("sync-v2-pro")}
/>
</Clip>
<Captions src={voiceover} style="tiktok" color="#ffffff" withAudio />
</Render>
);
Components
<Render> | Root container | width, height, fps |
<Clip> | Time segment | duration, transition, cutFrom, cutTo |
<Image> | AI or static image | prompt, src, model, zoom, aspectRatio, resize |
<Video> | AI or source video | prompt, src, model, volume, cutFrom, cutTo |
<Speech> | Text-to-speech | voice, model, volume, children |
<Music> | Background music | prompt, src, model, volume, loop, ducking |
<Title> | Text overlay | position, color, start, end |
<Subtitle> | Subtitle text | backgroundColor |
<Captions> | Auto-generated subs | src, srt, style, color, activeColor, withAudio |
<Overlay> | Positioned layer | left, top, width, height, keepAudio |
<Split> | Side-by-side | direction |
<Slider> | Before/after reveal | direction |
<Swipe> | Tinder-style cards | direction, interval |
<TalkingHead> | Animated character | character, src, voice, model, lipsyncModel |
<Packshot> | End card with CTA | background, logo, cta, blinkCta |
Caption styles
<Captions src={voiceover} style="tiktok" />
<Captions src={voiceover} style="karaoke" />
<Captions src={voiceover} style="bounce" />
<Captions src={voiceover} style="typewriter" />
Transitions
67 GL transitions available:
<Clip transition={{ name: "fade", duration: 0.5 }}>
<Clip transition={{ name: "crossfade", duration: 0.5 }}>
<Clip transition={{ name: "wipeleft", duration: 0.5 }}>
<Clip transition={{ name: "cube", duration: 0.8 }}>
Models
All models are accessed through varg.* ā one API key, one provider.
import { varg } from "vargai/ai";
Video
varg.videoModel("kling-v3") | Best quality, latest | 150 |
varg.videoModel("kling-v3-standard") | Good quality, cheaper | 50 |
varg.videoModel("kling-v2.5") | Previous gen, reliable | 50 |
varg.videoModel("wan-2.5") | Good for characters | 50 |
varg.videoModel("minimax") | Alternative | 50 |
varg.videoModel("sync-v2-pro") | Lipsync (video + audio) | 50 |
Image
varg.imageModel("nano-banana-pro") | Versatile, fast | 5 |
varg.imageModel("nano-banana-pro/edit") | Image-to-image editing | 5 |
varg.imageModel("flux-schnell") | Fast generation | 5 |
varg.imageModel("flux-pro") | High quality | 25 |
varg.imageModel("recraft-v3") | Alternative | 10 |
Audio
varg.speechModel("eleven_v3") | Text-to-speech | 25 |
varg.speechModel("eleven_multilingual_v2") | Multilingual TTS | 25 |
varg.musicModel() | Music generation | 25 |
varg.transcriptionModel("whisper") | Speech-to-text | 5 |
1 credit = $0.01. Cache hits are always free.
CLI
bunx vargai login
bunx vargai init
bunx vargai render video.tsx
bunx vargai render video.tsx --preview
bunx vargai render video.tsx --verbose
bunx vargai balance
bunx vargai topup
bunx vargai run image --prompt "sunset"
bunx vargai run video --prompt "ocean waves"
bunx vargai list
bunx vargai studio
Environment
VARG_API_KEY=varg_live_xxx
Get your API key at app.varg.ai. Bun auto-loads .env files.
Bring your own keys (optional)
You can use provider keys directly if you prefer:
FAL_API_KEY=fal_xxx
ELEVENLABS_API_KEY=xxx
OPENAI_API_KEY=sk_xxx
REPLICATE_API_TOKEN=r8_xxx
See the BYOK docs for details.
Pricing
| Image | nano-banana-pro | 5 | $0.05 |
| Image | flux-pro | 25 | $0.25 |
| Video (5s) | kling-v3 | 150 | $1.50 |
| Speech | eleven_v3 | 25 | $0.25 |
| Music | music_v1 | 25 | $0.25 |
| Cache hit | any | 0 | $0.00 |
A typical 3-clip video costs $2-5. Cache hits are always free.
Star History
Contributing
See CONTRIBUTING.md for development setup.
License
Apache-2.0 ā see LICENSE.md