Skip to main content
The Decart adapter for TanStack AI adds image and video generation to any TanStack project.
Decart is listed as an official community adapter on the TanStack AI docs.

Prerequisites

Installation

Install both the Decart adapter and TanStack AI:
npm install @decartai/tanstack-ai-adapter @tanstack/ai

Setup

Set your Decart API key as an environment variable:
export DECART_API_KEY="your-api-key"
Get your API key from platform.decart.ai. See authentication for details. Or pass your API key directly when creating adapters:
import { createDecartImage } from '@decartai/tanstack-ai-adapter';

const adapter = createDecartImage('lucy-pro-t2i', 'your-api-key');

Image generation

Generate images with generateImage() and the decartImage() adapter:
import { generateImage } from '@tanstack/ai';
import { decartImage } from '@decartai/tanstack-ai-adapter';

const result = await generateImage({
  adapter: decartImage('lucy-pro-t2i'),
  prompt: 'A serene mountain landscape at sunset, cinematic lighting',
});

console.log(result.images[0].b64Json); // Base64-encoded image data

With explicit API key

Use createDecartImage() to pass your API key directly:
import { generateImage } from '@tanstack/ai';
import { createDecartImage } from '@decartai/tanstack-ai-adapter';

const result = await generateImage({
  adapter: createDecartImage('lucy-pro-t2i', 'your-api-key'),
  prompt: 'A serene mountain landscape at sunset, cinematic lighting',
});

Video generation

Video generation uses an async job and polling pattern — you submit a job, then poll for the result.
Unlike generateImage(), video generation is asynchronous. You submit a generation job with generateVideo(), then poll its status with getVideoJobStatus() until it completes.
import { setTimeout } from 'node:timers/promises';
import { generateVideo, getVideoJobStatus } from '@tanstack/ai';
import { decartVideo } from '@decartai/tanstack-ai-adapter';

const { jobId } = await generateVideo({
  adapter: decartVideo('lucy-pro-t2v'),
  prompt: 'A cat walking through a miniature lego city',
});

let videoUrl: string | undefined;
while (true) {
  const status = await getVideoJobStatus({
    adapter: decartVideo('lucy-pro-t2v'),
    jobId,
  });

  if (status.status === 'failed') {
    throw new Error('Video generation failed');
  }

  if (status.status === 'completed') {
    videoUrl = status.url;
    break;
  }

  await setTimeout(2000);
}

console.log('Video ready:', videoUrl);

Models

ModelTypeDescription
lucy-pro-t2iText-to-imageHigh-quality image generation
lucy-pro-t2vText-to-videoVideo generation from text prompts

Options

seed
number
Seed value for reproducible results.
resolution
"720p" | "480p"
Output resolution. Defaults to 720p.

Next steps