Skip to main content
Generate images from text prompts using the generateImage() function with support for various AI image models.

Basic Usage

Generate an image from a text prompt:
import { generateImage } from '@core-ai/core-ai';
import { createOpenAI } from '@core-ai/openai';

const openai = createOpenAI({ apiKey: process.env.OPENAI_API_KEY });
const model = openai.imageModel('gpt-image-1');

const result = await generateImage({
  model,
  prompt: 'A watercolor painting of a robot coding in a quiet mountain cabin at sunrise',
  n: 1,
  size: '1024x1024',
});

for (const [index, image] of result.images.entries()) {
  console.log(`Image ${index + 1}:`);
  if (image.url) {
    console.log('URL:', image.url);
  } else if (image.base64) {
    console.log('Base64 preview:', image.base64.slice(0, 80), '...');
  } else {
    console.log('No image payload found.');
  }
  if (image.revisedPrompt) {
    console.log('Revised prompt:', image.revisedPrompt);
  }
}

Configuration Options

Customize image generation:
const result = await generateImage({
  model,
  prompt: 'A futuristic cityscape at sunset',
  n: 3,                    // Generate 3 images
  size: '1024x1024',       // Image dimensions
});
Available sizes depend on the provider and model. Common sizes include:
  • 256x256
  • 512x512
  • 1024x1024
  • 1792x1024 (landscape)
  • 1024x1792 (portrait)

Image Response Format

The generateImage() function returns:
type ImageGenerateResult = {
  images: GeneratedImage[];
};

type GeneratedImage = {
  base64?: string;        // Base64-encoded image data
  url?: string;           // URL to the generated image
  revisedPrompt?: string; // AI-revised prompt (if modified)
};

Multiple Images

Generate multiple variations:
const result = await generateImage({
  model,
  prompt: 'A minimalist logo for a tech startup',
  n: 4, // Generate 4 variations
  size: '512x512',
});

console.log(`Generated ${result.images.length} images`);

result.images.forEach((image, index) => {
  console.log(`\nImage ${index + 1}:`);
  if (image.url) {
    console.log('URL:', image.url);
  }
});

Handling Image Data

import { writeFile } from 'fs/promises';
import { generateImage } from '@core-ai/core-ai';

const result = await generateImage({
  model,
  prompt: 'A beautiful landscape',
});

const image = result.images[0];

if (image.base64) {
  // Save base64 data
  const buffer = Buffer.from(image.base64, 'base64');
  await writeFile('generated-image.png', buffer);
  console.log('Saved image to generated-image.png');
} else if (image.url) {
  // Download from URL
  const response = await fetch(image.url);
  const buffer = await response.arrayBuffer();
  await writeFile('generated-image.png', Buffer.from(buffer));
  console.log('Downloaded and saved image');
}

Revised Prompts

Some providers modify your prompt for better results:
const result = await generateImage({
  model,
  prompt: 'a robot',
});

const image = result.images[0];

if (image.revisedPrompt) {
  console.log('Original prompt:', 'a robot');
  console.log('Revised prompt:', image.revisedPrompt);
  // Revised prompt: "A humanoid robot with sleek metallic surfaces..."
}

Image Sizes

Different models support different sizes:
const result = await generateImage({
  model,
  prompt: 'A centered logo design',
  size: '1024x1024', // Square format
});

Prompt Engineering Tips

Write effective prompts for better results:
// Vague
const result = await generateImage({
  model,
  prompt: 'a dog',
});

// Better
const result = await generateImage({
  model,
  prompt: 'a golden retriever puppy sitting on grass in a sunny park, ' +
          'photorealistic, 8k, natural lighting',
});
const result = await generateImage({
  model,
  prompt: 'a mountain landscape at sunset, ' +
          'oil painting style, impressionist, ' +
          'vibrant colors, detailed brushstrokes',
});
const result = await generateImage({
  model,
  prompt: 'a modern kitchen, ' +
          'wide angle shot, ' +
          'centered composition, ' +
          'eye-level perspective, ' +
          'well-lit interior',
});
const result = await generateImage({
  model,
  prompt: 'portrait of a woman, ' +
          'Canon EOS R5, 85mm f/1.4, ' +
          'shallow depth of field, ' +
          'natural window lighting, ' +
          'bokeh background',
});

Error Handling

Handle image generation errors:
import { LLMError, ProviderError } from '@core-ai/core-ai';

try {
  const result = await generateImage({
    model,
    prompt: 'A beautiful landscape',
  });

  if (result.images.length === 0) {
    console.error('No images generated');
  }

  result.images.forEach((image, i) => {
    if (!image.url && !image.base64) {
      console.error(`Image ${i} has no data`);
    }
  });
} catch (error) {
  if (error instanceof ProviderError) {
    console.error('Provider error:', error.message);
    console.error('Status code:', error.statusCode);
  } else if (error instanceof LLMError) {
    console.error('LLM error:', error.message);
  } else {
    console.error('Unknown error:', error);
  }
}

Provider-Specific Options

Use provider-specific features:
const result = await generateImage({
  model,
  prompt: 'A futuristic vehicle',
  n: 2,
  size: '1024x1024',
  providerOptions: {
    // Provider-specific options
    quality: 'hd',
    style: 'vivid',
  },
});
Provider-specific options vary by provider. Check your provider’s documentation for available options.

Practical Examples

async function generateLogo(companyName: string, industry: string) {
  const result = await generateImage({
    model,
    prompt: `A modern, minimalist logo for "${companyName}", ` +
            `a ${industry} company, ` +
            `clean design, professional, vector style, ` +
            `white background, high contrast`,
    n: 3,
    size: '512x512',
  });

  return result.images;
}

const logos = await generateLogo('TechFlow', 'software development');
console.log(`Generated ${logos.length} logo options`);

Best Practices

Different providers return different formats:
const image = result.images[0];

let imageData: string;
if (image.url) {
  imageData = image.url;
} else if (image.base64) {
  imageData = `data:image/png;base64,${image.base64}`;
} else {
  throw new Error('No image data available');
}
URLs may expire - save images you need:
if (image.url) {
  // URL might expire, download and store
  const response = await fetch(image.url);
  const buffer = await response.arrayBuffer();
  await saveToStorage(buffer);
}
Smaller sizes are faster and cheaper:
// Thumbnail: use smaller size
const thumbnail = await generateImage({
  model,
  prompt: 'icon design',
  size: '256x256',
});

// High quality print: use larger size
const print = await generateImage({
  model,
  prompt: 'artwork',
  size: '1024x1024',
});

Next Steps