@imgly/plugin-ai-image-generation-web
Version:
AI image generation plugin for the CE.SDK editor
998 lines (802 loc) • 34.8 kB
Markdown
# IMG.LY AI Image Generation for Web
A plugin for integrating AI image generation capabilities into CreativeEditor SDK.
## Overview
The `@imgly/plugin-ai-image-generation-web` package enables users to generate and modify images using AI directly within CreativeEditor SDK. This shipped provider leverages the [fal.ai](https://fal.ai) platform to provide high-quality image generation from text-to-image and image-to-image transformations.
Features include:
- Text-to-image generation
- Image-to-image transformations
- Multiple style options (realistic, illustration, vector)
- Various size presets and custom dimensions
- Automatic history tracking
- Canvas menu quick actions
- Seamless integration with CreativeEditor SDK
## Installation
```bash
npm install @imgly/plugin-ai-image-generation-web
```
## Usage
### Basic Configuration
To use the plugin, import it and configure it with your preferred providers:
#### Single Provider Configuration
```typescript
import CreativeEditorSDK from '@cesdk/cesdk-js';
import ImageGeneration from '@imgly/plugin-ai-image-generation-web';
import FalAiImage from '@imgly/plugin-ai-image-generation-web/fal-ai';
// For OpenAI providers
import OpenAiImage from '@imgly/plugin-ai-image-generation-web/open-ai';
// Initialize CreativeEditor SDK
CreativeEditorSDK.create(domElement, {
license: 'your-license-key',
// Other configuration options...
}).then(async (cesdk) => {
// Add the image generation plugin with fal.ai providers
cesdk.addPlugin(
ImageGeneration({
// Text-to-image provider
text2image: FalAiImage.RecraftV3({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
// Alternative: Use Recraft20b with icon style support
// text2image: FalAiImage.Recraft20b({
// proxyUrl: 'http://your-proxy-server.com/api/proxy',
// headers: {
// 'x-custom-header': 'value',
// 'x-client-version': '1.0.0'
// }
// }),
// Image-to-image provider (optional)
image2image: FalAiImage.GeminiFlashEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
// Optional configuration
debug: false,
dryRun: false
})
);
});
```
#### Multiple Providers Configuration
You can configure multiple providers for each generation type, and users will see a selection box to choose between them:
```typescript
import CreativeEditorSDK from '@cesdk/cesdk-js';
import ImageGeneration from '@imgly/plugin-ai-image-generation-web';
import FalAiImage from '@imgly/plugin-ai-image-generation-web/fal-ai';
import OpenAiImage from '@imgly/plugin-ai-image-generation-web/open-ai';
// Initialize CreativeEditor SDK
CreativeEditorSDK.create(domElement, {
license: 'your-license-key',
// Other configuration options...
}).then(async (cesdk) => {
// Add the image generation plugin with multiple providers
cesdk.addPlugin(
ImageGeneration({
// Multiple text-to-image providers
text2image: [
FalAiImage.RecraftV3({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
FalAiImage.NanoBanana({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
FalAiImage.Recraft20b({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
OpenAiImage.GptImage1.Text2Image({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-api-key': 'your-key',
'x-request-source': 'cesdk-plugin'
}
})
],
// Multiple image-to-image providers (optional)
image2image: [
FalAiImage.GeminiFlashEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
FalAiImage.NanoBananaEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
}),
OpenAiImage.GptImage1.Image2Image({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-api-key': 'your-key',
'x-request-source': 'cesdk-plugin'
}
})
],
// Optional configuration
debug: false,
dryRun: false
})
);
});
```
### Providers
The plugin comes with pre-configured providers for fal.ai and OpenAI models:
#### 1. RecraftV3 (Text-to-Image)
A versatile text-to-image model from fal.ai that generates images based on text prompts:
```typescript
text2image: FalAiImage.RecraftV3({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- Multiple style options (realistic, illustration, vector)
- Various image size presets
- Custom dimensions support
- Adjustable quality settings
- Custom headers support for API requests
**Style Group Control:**
You can control which style groups (image/vector) are available using the Feature API:
```typescript
// Disable vector styles, only allow image styles
cesdk.feature.enable('ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.style.vector', false);
// Or disable image styles, only allow vector styles
cesdk.feature.enable('ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.style.image', false);
```
**Custom Translations:**
```typescript
cesdk.i18n.setTranslations({
en: {
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.prompt': 'Your image description',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.style': 'Art Style',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.style.realistic_image': 'Photorealistic',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.style.illustration': 'Illustration',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.image_size': 'Canvas Size'
}
});
```
#### 2. Recraft20b (Text-to-Image)
An enhanced text-to-image model from fal.ai with additional icon style support:
```typescript
text2image: FalAiImage.Recraft20b({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- All RecraftV3 features (realistic, illustration, vector styles)
- **New icon styles**: broken_line, colored_outline, colored_shapes, doodle_fill, and more
- Three-way style selection (image/vector/icon)
- Same image size presets and custom dimensions support
- Cost-effective alternative to RecraftV3
**Style Group Control:**
You can control which style groups (image/vector/icon) are available using the Feature API:
```typescript
// Only allow icon styles
cesdk.feature.enable('ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.style.image', false);
cesdk.feature.enable('ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.style.vector', false);
// Only allow image and vector styles (disable icon)
cesdk.feature.enable('ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.style.icon', false);
```
Note: When all style groups are disabled, the provider automatically falls back to the 'any' style.
**Custom Translations:**
```typescript
cesdk.i18n.setTranslations({
en: {
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.property.prompt': 'Icon description',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.property.style': 'Icon Style',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.property.style.icon': 'Standard Icon',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.property.style.logo': 'Logo Icon',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft/v2/text-to-image.property.n_colors': 'Number of Colors'
}
});
```
- Custom headers support for API requests
#### 3. GptImage1.Text2Image (Text-to-Image)
OpenAI's GPT-4 Vision based text-to-image model that generates high-quality images:
```typescript
text2image: OpenAiImage.GptImage1.Text2Image({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-api-key': 'your-key',
'x-request-source': 'cesdk-plugin'
}
})
```
Key features:
- High-quality image generation
- Multiple size options (1024×1024, 1536×1024, 1024×1536)
- Background transparency options
- Automatic prompt optimization
- Custom headers support for API requests
#### 4. GeminiFlashEdit (Image-to-Image)
An image modification model from fal.ai that transforms existing images:
```typescript
image2image: FalAiImage.GeminiFlashEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- Transform existing images with text prompts
- Available directly through canvas quick actions
- Maintains original image dimensions
- Includes style presets and artist-specific transformations
- Custom headers support for API requests
**Custom Translations:**
```typescript
cesdk.i18n.setTranslations({
en: {
'ly.img.plugin-ai-image-generation-web.fal-ai/gemini-flash-edit.property.prompt': 'Transformation instructions',
'ly.img.plugin-ai-image-generation-web.fal-ai/gemini-flash-edit.property.image_url': 'Source Image'
}
});
```
#### 5. GptImage1.Image2Image (Image-to-Image)
OpenAI's GPT-4 Vision based image editing model that can transform existing images:
```typescript
image2image: OpenAiImage.GptImage1.Image2Image({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-api-key': 'your-key',
'x-request-source': 'cesdk-plugin'
}
})
```
Key features:
- Powerful image transformation capabilities
- Supports the same quick actions as GeminiFlashEdit
- Maintains original image dimensions
- Can be used as a direct alternative to GeminiFlashEdit
- Custom headers support for API requests
#### 5. IdeogramV3 (Text-to-Image)
A high-quality text-to-image model from fal.ai featuring advanced generation capabilities:
```typescript
text2image: FalAiImage.IdeogramV3({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- Four distinct style modes: AUTO, GENERAL, REALISTIC, and DESIGN
- Multiple image size presets: square HD, square, portrait 4:3/16:9, landscape 4:3/16:9
- Custom dimensions support (64x64 to 14142x14142 pixels)
#### 6. IdeogramV3Remix (Image-to-Image)
A powerful image remixing model from fal.ai that transforms existing images while preserving core elements:
```typescript
image2image: FalAiImage.IdeogramV3Remix({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- **Remix existing images** with text prompts while maintaining core characteristics
- Four distinct style modes: AUTO, GENERAL, REALISTIC, and DESIGN
- Multiple image size presets: square HD, square, portrait 4:3/16:9, landscape 4:3/16:9
- Custom dimensions support (64x64 to 14142x14142 pixels)
#### 7. FluxProKontextEdit (Image-to-Image)
A versatile image editing model that applies stylistic changes and transformations:
```typescript
image2image: FalAiImage.FluxProKontextEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy'
})
```
Key features:
- Change existing images with text prompts
- Built-in quick actions for style transfer, artist styles, background swapping, and variants
- Keeps original image dimensions
#### 8. FluxProKontextMaxEdit (Image-to-Image)
A high-quality variant of FluxProKontext offering more detailed results:
```typescript
image2image: FalAiImage.FluxProKontextMaxEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy'
})
```
Key features:
- All capabilities of FluxProKontextEdit with enhanced quality
- Style transfer & artist presets
- Maintains original dimensions
- Canvas quick-action integration
#### 9. NanoBanana (Text-to-Image)
A fast and efficient text-to-image model from fal.ai that generates high-quality images:
```typescript
text2image: FalAiImage.NanoBanana({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- Fast generation times for quick prototyping
- High-quality image output at 1024×1024 resolution
- Simple prompt-based interface
- Support for multiple output formats (JPEG, PNG)
- Configurable number of images (1-4)
- Supports page remixing with custom prompts
- Custom headers support for API requests
**Custom Translations:**
```typescript
cesdk.i18n.setTranslations({
en: {
'ly.img.plugin-ai-image-generation-web.fal-ai/nano-banana.property.prompt': 'Describe your image',
'ly.img.plugin-ai-image-generation-web.fal-ai/nano-banana.property.num_images': 'Number of Images',
'ly.img.plugin-ai-image-generation-web.fal-ai/nano-banana.property.output_format': 'Output Format'
}
});
```
#### 10. NanoBananaEdit (Image-to-Image)
An image editing model from fal.ai that transforms existing images using text prompts:
```typescript
image2image: FalAiImage.NanoBananaEdit({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
```
Key features:
- Edit existing images with text prompts
- Supports combining multiple images (up to 10 images)
- Maintains original image dimensions automatically
- Supports all standard image editing quick actions
- Fast processing times
- Canvas quick-action integration
- Custom headers support for API requests
**Custom Translations:**
```typescript
cesdk.i18n.setTranslations({
en: {
'ly.img.plugin-ai-image-generation-web.fal-ai/nano-banana/edit.property.prompt': 'Edit instructions',
'ly.img.plugin-ai-image-generation-web.fal-ai/nano-banana/edit.property.image_url': 'Source Image'
}
});
```
### Customizing Labels and Translations
You can customize all labels and text in the AI image generation interface using the translation system. This allows you to provide better labels for your users in any language.
#### Translation Key Structure
The system checks for translations in this order (highest to lowest priority):
1. **Provider-specific**: `ly.img.plugin-ai-image-generation-web.${provider}.property.${field}` - Override labels for a specific AI provider
2. **Generic**: `ly.img.plugin-ai-generation-web.property.${field}` - Override labels for all AI plugins
#### Basic Example
```typescript
// Customize labels for your AI image generation interface
cesdk.i18n.setTranslations({
en: {
// Generic labels (applies to ALL AI plugins)
'ly.img.plugin-ai-generation-web.property.prompt': 'Describe what you want to create',
'ly.img.plugin-ai-generation-web.property.image_size': 'Image Dimensions',
// Provider-specific for RecraftV3
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.prompt': 'Describe your Recraft image',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.image_size': 'Canvas Size',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.image_size.square_hd': 'Square HD (1024×1024)',
'ly.img.plugin-ai-image-generation-web.fal-ai/recraft-v3.property.image_size.portrait_4_3': 'Portrait 4:3 (768×1024)',
// Provider-specific for IdeogramV3
'ly.img.plugin-ai-image-generation-web.fal-ai/ideogram/v3.property.prompt': 'Describe your Ideogram image',
'ly.img.plugin-ai-image-generation-web.fal-ai/ideogram/v3.property.style_mode': 'Style Mode',
'ly.img.plugin-ai-image-generation-web.fal-ai/ideogram/v3.property.style_mode.REALISTIC': 'Photorealistic'
}
});
```
#### QuickAction Translations
QuickActions (like "Edit Image", "Style Transfer", etc.) use their own translation keys with provider-specific overrides:
```typescript
cesdk.i18n.setTranslations({
en: {
// Provider-specific translations (highest priority)
'ly.img.plugin-ai-image-generation-web.fal-ai/gemini-flash-edit.quickAction.editImage': 'Edit with Gemini',
'ly.img.plugin-ai-image-generation-web.fal-ai/flux-pro/kontext.quickAction.styleTransfer': 'Style with Flux Pro Kontext',
'ly.img.plugin-ai-image-generation-web.open-ai/gpt-image-1/image2image.quickAction.editImage': 'Edit with GPT',
// Generic plugin translations
'ly.img.plugin-ai-image-generation-web.quickAction.editImage': 'Edit Image...',
'ly.img.plugin-ai-image-generation-web.quickAction.swapBackground': 'Swap Background...',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer': 'Style Transfer...',
'ly.img.plugin-ai-image-generation-web.quickAction.createVariant': 'Create Variant...',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer': 'Painted By...',
// QuickAction input fields and buttons
'ly.img.plugin-ai-image-generation-web.quickAction.editImage.prompt': 'Edit Image...',
'ly.img.plugin-ai-image-generation-web.quickAction.editImage.prompt.placeholder': 'e.g. "Add a sunset"',
'ly.img.plugin-ai-image-generation-web.quickAction.editImage.apply': 'Change',
'ly.img.plugin-ai-image-generation-web.quickAction.swapBackground.prompt': 'Swap Background...',
'ly.img.plugin-ai-image-generation-web.quickAction.swapBackground.prompt.placeholder': 'e.g. "Beach at sunset"',
'ly.img.plugin-ai-image-generation-web.quickAction.swapBackground.apply': 'Swap'
}
});
```
**QuickAction Translation Priority:**
1. Provider-specific: `ly.img.plugin-ai-image-generation-web.${provider}.quickAction.${action}.${field}`
2. Generic plugin: `ly.img.plugin-ai-image-generation-web.quickAction.${action}.${field}`
**Translation Structure:**
- Base key (e.g., `.quickAction.editImage`): Button text when QuickAction is collapsed
- `.prompt`: Label for input field when expanded
- `.prompt.placeholder`: Placeholder text for input field
- `.apply`: Text for action/submit button
#### QuickAction Dropdown Options
Some QuickActions like Artist Transfer and Style Transfer include dropdown menus with predefined options. You can customize these dropdown labels using provider-specific translation keys:
```typescript
cesdk.i18n.setTranslations({
en: {
// Artist Transfer dropdown options (provider-specific)
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.van-gogh': 'Van Gogh',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.monet': 'Monet',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.picasso': 'Picasso',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.dali': 'Dalí',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.matisse': 'Matisse',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.warhol': 'Warhol',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.michelangelo': 'Michelangelo',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.da-vinci': 'Da Vinci',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.rembrandt': 'Rembrandt',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.mondrian': 'Mondrian',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.kahlo': 'Frida Kahlo',
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.fal-ai/gemini-flash-edit.property.artist.hokusai': 'Hokusai',
// Style Transfer dropdown options (provider-specific)
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.water': 'Watercolor Painting',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.oil': 'Oil Painting',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.charcoal': 'Charcoal Sketch',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.pencil': 'Pencil Drawing',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.pastel': 'Pastel Artwork',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.ink': 'Ink Wash',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.stained-glass': 'Stained Glass Window',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.fal-ai/gemini-flash-edit.property.style.japanese': 'Japanese Woodblock Print',
// Generic fallback options (applies to all providers)
'ly.img.plugin-ai-image-generation-web.quickAction.artistTransfer.property.artist.van-gogh': 'Van Gogh',
'ly.img.plugin-ai-image-generation-web.quickAction.styleTransfer.property.style.water': 'Watercolor Painting'
}
});
```
The system checks for translations in this order (highest to lowest priority):
1. **Provider-specific**: `ly.img.plugin-ai-image-generation-web.quickAction.${actionName}.${providerId}.property.${field}.${option}` - Override labels for a specific AI provider
2. **Generic**: `ly.img.plugin-ai-image-generation-web.quickAction.${actionName}.property.${field}.${option}` - Override labels for all AI plugins
### Configuration Options
The plugin accepts the following configuration options:
| Option | Type | Description | Default |
|--------|------|-------------|---------|
| `text2image` | Provider \| Provider[] | Provider(s) for text-to-image generation. When multiple providers are provided, users can select between them | undefined |
| `image2image` | Provider \| Provider[] | Provider(s) for image-to-image transformation. When multiple providers are provided, users can select between them | undefined |
| `debug` | boolean | Enable debug logging | false |
| `dryRun` | boolean | Simulate generation without API calls | false |
| `middleware` | Function[] | Array of middleware functions to extend the generation process | undefined |
### Middleware Configuration
The `middleware` option allows you to add pre-processing and post-processing capabilities to the generation process:
```typescript
import ImageGeneration from '@imgly/plugin-ai-image-generation-web';
import FalAiImage from '@imgly/plugin-ai-image-generation-web/fal-ai';
import { loggingMiddleware, rateLimitMiddleware } from '@imgly/plugin-ai-generation-web';
// Create middleware functions
const logging = loggingMiddleware();
const rateLimit = rateLimitMiddleware({
maxRequests: 10,
timeWindowMs: 60000, // 1 minute
onRateLimitExceeded: (input, options, info) => {
console.log(`Rate limit exceeded: ${info.currentCount}/${info.maxRequests}`);
return false; // Reject request
}
});
// Apply middleware to plugin
cesdk.addPlugin(
ImageGeneration({
text2image: FalAiImage.RecraftV3({
proxyUrl: 'http://your-proxy-server.com/api/proxy'
}),
// Or use: FalAiImage.Recraft20b({ proxyUrl: 'http://your-proxy-server.com/api/proxy' }),
middleware: [logging, rateLimit] // Apply middleware in order
})
);
```
Built-in middleware options:
- **loggingMiddleware**: Logs generation requests and responses
- **rateLimitMiddleware**: Limits the number of generation requests in a time window
#### Creating Custom Middleware
Custom middleware functions follow this pattern:
```typescript
const customMiddleware = async (input, options, next) => {
// Pre-processing logic
console.log('Before generation:', input);
// Add custom fields or modify the input if needed
const modifiedInput = {
...input,
customField: 'custom value'
};
// Call the next middleware or generation function
const result = await next(modifiedInput, options);
// Post-processing logic
console.log('After generation:', result);
// You can also modify the result before returning it
return result;
};
```
The middleware function signature is:
```typescript
type Middleware<I, O extends Output> = (
input: I,
options: GenerationOptions & {
// The block IDs the generation is applied on
blockIds?: number[] | null;
// Function to add a cleanup handler
addDisposer: (dispose: () => Promise<void>) => void;
},
next: (input: I, options: GenerationOptions) => Promise<GenerationResult<O>>
) => Promise<GenerationResult<O>>;
```
Middleware functions are applied in order, creating a chain of processing steps. The `next` parameter calls the next middleware in the chain or the generation function itself.
### Using a Proxy
For security reasons, it's recommended to use a proxy server to handle API requests to fal.ai. The proxy URL is required when configuring providers:
```typescript
text2image: FalAiImage.RecraftV3({
proxyUrl: 'http://your-proxy-server.com/api/proxy',
headers: {
'x-custom-header': 'value',
'x-client-version': '1.0.0'
}
})
// Or use Recraft20b with icon style support:
// text2image: FalAiImage.Recraft20b({
// proxyUrl: 'http://your-proxy-server.com/api/proxy',
// headers: {
// 'x-custom-header': 'value',
// 'x-client-version': '1.0.0'
// }
// })
```
The `headers` option allows you to include custom HTTP headers in all API requests. This is useful for:
- Adding custom client identification headers
- Including version information
- Passing through metadata required by your API
- Adding correlation IDs for request tracing
You'll need to implement a proxy server that forwards requests to fal.ai and handles authentication.
## API Reference
### Main Plugin
```typescript
ImageGeneration(options: PluginConfiguration): EditorPlugin
```
Creates and returns a plugin that can be added to CreativeEditor SDK.
### Plugin Configuration
```typescript
interface PluginConfiguration {
// Provider(s) for text-to-image generation
text2image?: AiImageProvider | AiImageProvider[];
// Provider(s) for image-to-image generation
image2image?: AiImageProvider | AiImageProvider[];
// Enable debug logging
debug?: boolean;
// Skip actual API calls for testing
dryRun?: boolean;
// Extend the generation process
middleware?: GenerationMiddleware;
}
```
### Fal.ai Providers
#### RecraftV3
```typescript
FalAiImage.RecraftV3(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### Recraft20b
```typescript
FalAiImage.Recraft20b(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### IdeogramV3
```typescript
FalAiImage.IdeogramV3(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### IdeogramV3Remix
```typescript
FalAiImage.IdeogramV3Remix(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### GeminiFlashEdit
```typescript
FalAiImage.GeminiFlashEdit(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
### OpenAI Providers
#### GptImage1.Text2Image
```typescript
OpenAiImage.GptImage1.Text2Image(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### GptImage1.Image2Image
```typescript
OpenAiImage.GptImage1.Image2Image(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### FluxProKontextEdit
```typescript
FalAiImage.FluxProKontextEdit(config: {
proxyUrl: string;
debug?: boolean;
})
```
#### FluxProKontextMaxEdit
```typescript
FalAiImage.FluxProKontextMaxEdit(config: {
proxyUrl: string;
debug?: boolean;
})
```
#### NanoBanana
```typescript
FalAiImage.NanoBanana(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
#### NanoBananaEdit
```typescript
FalAiImage.NanoBananaEdit(config: {
proxyUrl: string;
headers?: Record<string, string>;
debug?: boolean;
})
```
## UI Integration
The plugin automatically registers the following UI components:
1. **Generation Panel**: A sidebar panel for text-to-image generation
2. **Quick Actions**: Canvas menu items for image-to-image transformations
3. **History Library**: Displays previously generated images
4. **Dock Component**: A button in the dock area to open the image generation panel
### Quick Action Features
The plugin includes several pre-configured quick actions for image generation providers:
#### Available Quick Actions
- **`ly.img.editImage`**: Change image based on description
- Input: `{ prompt: string, uri: string }`
- **`ly.img.swapBackground`**: Change the background of the image
- Input: `{ prompt: string, uri: string }`
- **`ly.img.createVariant`**: Create a variation of the image
- Input: `{ prompt: string, uri: string }`
- **`ly.img.styleTransfer`**: Transform image into different art styles
- Input: `{ style: string, uri: string }`
- **`ly.img.artistTransfer`**: Transform image in the style of famous artists
- Input: `{ artist: string, uri: string }`
- **`ly.img.combineImages`**: Combine multiple images with instructions
- Input: `{ prompt: string, uris: string[], exportFromBlockIds: number[] }`
- **`ly.img.remixPage`**: Convert the page into a single image
- Input: `{ prompt: string, uri: string }`
- **`ly.img.remixPageWithPrompt`**: Remix the page with custom instructions
- Input: `{ prompt: string, uri: string }`
- **`ly.img.gpt-image-1.changeStyleLibrary`**: Apply different art styles (GPT-specific)
- Input: `{ prompt: string, uri: string }`
#### Provider Quick Action Support
Providers declare which quick actions they support through their configuration:
```typescript
const myImageProvider = {
// ... other provider config
input: {
// ... panel config
quickActions: {
supported: {
'ly.img.editImage': {
mapInput: (quickActionInput) => ({
prompt: quickActionInput.prompt,
image_url: quickActionInput.uri
})
},
'ly.img.swapBackground': {
mapInput: (quickActionInput) => ({
prompt: quickActionInput.prompt,
image_url: quickActionInput.uri
})
},
'ly.img.styleTransfer': {
mapInput: (quickActionInput) => ({
style: quickActionInput.style,
image_url: quickActionInput.uri
})
}
// Add more supported quick actions as needed
}
}
}
};
```
### Panel IDs
- Main panel: `ly.img.ai.image-generation`
- Canvas quick actions: `ly.img.ai.image.canvasMenu`
- Provider-specific panels:
- RecraftV3: `ly.img.ai.fal-ai/recraft-v3`
- Recraft20b: `ly.img.ai.fal-ai/recraft/v2/text-to-image`
- IdeogramV3: `ly.img.ai.fal-ai/ideogram/v3`
- IdeogramV3Remix: `ly.img.ai.fal-ai/ideogram/v3/remix`
- GeminiFlashEdit: `ly.img.ai.fal-ai/gemini-flash-edit`
- GptImage1.Text2Image: `ly.img.ai.open-ai/gpt-image-1/text2image`
- GptImage1.Image2Image: `ly.img.ai.open-ai/gpt-image-1/image2image`
- FluxProKontextEdit: `ly.img.ai.fal-ai/flux-pro/kontext`
- FluxProKontextMaxEdit: `ly.img.ai.fal-ai/flux-pro/kontext/max`
- NanoBanana: `ly.img.ai.fal-ai/nano-banana`
- NanoBananaEdit: `ly.img.ai.fal-ai/nano-banana/edit`
### Asset History
Generated images are automatically stored in asset sources with the following IDs:
- RecraftV3: `fal-ai/recraft-v3.history`
- Recraft20b: `fal-ai/recraft/v2/text-to-image.history`
- IdeogramV3: `fal-ai/ideogram/v3.history`
- IdeogramV3Remix: `fal-ai/ideogram/v3/remix.history`
- GeminiFlashEdit: `fal-ai/gemini-flash-edit.history`
- GptImage1.Text2Image: `open-ai/gpt-image-1/text2image.history`
- GptImage1.Image2Image: `open-ai/gpt-image-1/image2image.history`
- FluxProKontextEdit: `fal-ai/flux-pro/kontext.history`
- FluxProKontextMaxEdit: `fal-ai/flux-pro/kontext/max.history`
- NanoBanana: `fal-ai/nano-banana.history`
- NanoBananaEdit: `fal-ai/nano-banana/edit.history`
### Dock Integration
The plugin automatically registers a dock component with a sparkle icon that opens the image generation panel. To customize the component's position in the dock, use the `setDockOrder` method:
```typescript
// Add the AI Image component to the beginning of the dock
cesdk.ui.setDockOrder([
'ly.img.ai.image-generation.dock',
...cesdk.ui.getDockOrder()
]);
// Or add it at a specific position
const currentOrder = cesdk.ui.getDockOrder();
currentOrder.splice(2, 0, 'ly.img.ai.image-generation.dock');
cesdk.ui.setDockOrder(currentOrder);
```
## Translations
For customization and localization, see the [translations.json](https://github.com/imgly/plugins/tree/main/packages/plugin-ai-image-generation-web/translations.json) file which contains provider-specific translation keys for image generation interfaces.
## Related Packages
- [@imgly/plugin-ai-generation-web](https://github.com/imgly/plugins/tree/main/packages/plugin-ai-generation-web) - Core utilities for AI generation
- [@imgly/plugin-ai-video-generation-web](https://github.com/imgly/plugins/tree/main/packages/plugin-ai-video-generation-web) - AI video generation
- [@imgly/plugin-ai-audio-generation-web](https://github.com/imgly/plugins/tree/main/packages/plugin-ai-audio-generation-web) - AI audio generation
## License
This plugin is part of the IMG.LY plugin ecosystem for CreativeEditor SDK. Please refer to the license terms in the package.