Image Generation Quickstart
This quickstart walks you through generating your first image with AI Gateway.
Create a new directory and initialize a Node.js project:
Terminalmkdir ai-image-demo cd ai-image-demo pnpm initInstall the AI SDK and development dependencies:
Terminalnpm install ai dotenv @types/node tsx typescriptTerminalyarn add ai dotenv @types/node tsx typescriptTerminalpnpm add ai dotenv @types/node tsx typescriptTerminalbun add ai dotenv @types/node tsx typescriptGo to the AI Gateway API Keys page in your Vercel dashboard and click Create key to generate a new API key.
Create a
.env.localfile and save your API key:.env.localAI_GATEWAY_API_KEY=your_ai_gateway_api_keyCreate an
index.tsfile. This example uses Nano Banana Pro (google/gemini-3-pro-image), a multimodal model that generates high-quality images:index.tsimport { generateText } from 'ai'; import fs from 'node:fs'; import 'dotenv/config'; async function main() { const result = await generateText({ model: 'google/gemini-3-pro-image', prompt: 'A serene mountain landscape at sunset with a calm lake reflection', }); // Nano Banana models return images in result.files with uint8Array const imageFiles = result.files.filter((f) => f.mediaType?.startsWith('image/'), ); if (imageFiles.length > 0) { const extension = imageFiles[0].mediaType?.split('/')[1] || 'png'; fs.writeFileSync(`output.${extension}`, imageFiles[0].uint8Array); console.log(`Image saved to output.${extension}`); } } main().catch(console.error);Run your script:
Terminalpnpm tsx index.tsThe generated image will be saved in your project directory.
- See supported image generation models
- Learn about multimodal LLMs that can generate images alongside text
- Explore image editing capabilities with OpenAI models
Fast image generation with Gemini 2.5 Flash. Uses the same generateText function and saves images the same way as Nano Banana Pro:
import { generateText } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
const result = await generateText({
model: 'google/gemini-2.5-flash-image',
prompt: 'Create an illustration of a hummingbird at sunrise',
});
// Nano Banana models return images in result.files with uint8Array
const imageFiles = result.files.filter((f) =>
f.mediaType?.startsWith('image/'),
);
if (imageFiles.length > 0) {
fs.writeFileSync('output.png', imageFiles[0].uint8Array);
}Fast, high-quality image generation from Black Forest Labs. Image-only models use experimental_generateImage and return images in result.images with base64 encoding:
import { experimental_generateImage as generateImage } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
const result = await generateImage({
model: 'bfl/flux-2-flex',
prompt: 'A vibrant coral reef with tropical fish',
aspectRatio: '4:3',
});
// Image-only models return images in result.images with base64
const image = result.images[0];
const buffer = Buffer.from(image.base64, 'base64');
fs.writeFileSync('output.png', buffer);Professional-grade image generation. Same pattern as Flux:
import { experimental_generateImage as generateImage } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
const result = await generateImage({
model: 'recraft/recraft-v3',
prompt: 'A minimalist logo design for a tech startup',
});
const buffer = Buffer.from(result.images[0].base64, 'base64');
fs.writeFileSync('output.png', buffer);Google's Imagen model for high-fidelity image generation:
import { experimental_generateImage as generateImage } from 'ai';
import fs from 'node:fs';
import 'dotenv/config';
const result = await generateImage({
model: 'google/imagen-4.0-generate-001',
prompt: 'A photorealistic image of a mountain landscape at golden hour',
aspectRatio: '16:9',
});
const buffer = Buffer.from(result.images[0].base64, 'base64');
fs.writeFileSync('output.png', buffer);How you save images depends on the model type:
| Model type | Function | Image location | Format |
|---|---|---|---|
| Nano Banana models | generateText | result.files | uint8Array |
| Image-only models (Flux, Recraft, Imagen) | experimental_generateImage | result.images | base64 string |
For more details, see the Image Generation Capabilities docs.
Was this helpful?