9.1 KiB
Advanced Image Generation
Advanced generation features: reference images, aliases, flows, and regeneration. For basic generation, see image-generation.md.
All endpoints require Project Key authentication via X-API-Key header.
Reference Images
Use existing images as style or content references for generation.
Using References
Add referenceImages array to your generation request:
{
"prompt": "A product photo with the logo in the corner",
"referenceImages": ["@brand-logo", "@product-style"]
}
References can be:
- Project aliases:
@logo,@brand-style - Flow aliases:
@hero(with flowId context) - Technical aliases:
@last,@first,@upload - Image UUIDs:
550e8400-e29b-41d4-a716-446655440000
Auto-Detection from Prompt
Aliases in the prompt are automatically detected and used as references:
{
"prompt": "Create a banner using @brand-logo with blue background"
}
// @brand-logo is auto-detected and added to referenceImages
Reference Limits
| Constraint | Limit |
|---|---|
| Max references | 3 images |
| Max file size | 5MB per image |
| Supported formats | PNG, JPEG, WebP |
Response with References
{
"data": {
"id": "550e8400-...",
"prompt": "Create a banner using @brand-logo",
"referencedImages": [
{ "imageId": "7c4ccf47-...", "alias": "@brand-logo" }
],
"referenceImages": [
{
"id": "7c4ccf47-...",
"storageUrl": "http://...",
"alias": "@brand-logo"
}
]
}
}
Alias Assignment
Assign aliases to generated images for easy referencing.
Project-Scoped Alias
Use alias parameter to assign a project-wide alias:
{
"prompt": "A hero banner image",
"alias": "@hero-banner"
}
The output image will be accessible via @hero-banner anywhere in the project.
Flow-Scoped Alias
Use flowAlias parameter to assign a flow-specific alias:
{
"prompt": "A hero image variation",
"flowId": "550e8400-...",
"flowAlias": "@best"
}
The alias @best is only accessible within this flow's context.
Alias Format
| Rule | Description |
|---|---|
| Prefix | Must start with @ |
| Characters | Alphanumeric, underscore, hyphen |
| Pattern | @[a-zA-Z0-9_-]+ |
| Max length | 50 characters |
| Examples | @logo, @hero-bg, @image_1 |
Reserved Aliases
These aliases are computed automatically and cannot be assigned:
| Alias | Description |
|---|---|
@last |
Most recently generated image in flow |
@first |
First generated image in flow |
@upload |
Most recently uploaded image in flow |
Override Behavior
When assigning an alias that already exists:
- The new image gets the alias
- The old image loses the alias (alias set to null)
- The old image is not deleted, just unlinked
3-Tier Alias Resolution
Aliases are resolved in this order of precedence:
1. Technical Aliases (Highest Priority)
Computed on-the-fly, require flow context:
GET /api/v1/images/@last?flowId=550e8400-...
| Alias | Returns |
|---|---|
@last |
Last generated image in flow |
@first |
First generated image in flow |
@upload |
Last uploaded image in flow |
2. Flow Aliases
Stored in flow's aliases JSONB field:
GET /api/v1/images/@hero?flowId=550e8400-...
Different flows can have the same alias pointing to different images.
3. Project Aliases (Lowest Priority)
Stored in image's alias column:
GET /api/v1/images/@logo
Global across the project, unique per project.
Resolution Example
// Request with flowId
GET /api/v1/images/@hero?flowId=abc-123
// Resolution order:
// 1. Is "@hero" a technical alias? No
// 2. Does flow abc-123 have "@hero" in aliases? Check flows.aliases JSONB
// 3. Does any image have alias = "@hero"? Check images.alias column
Flow Integration
Flows organize related generations into chains.
Lazy Flow Creation
When flowId is not provided, a pending flow ID is generated:
// Request
{
"prompt": "A red car"
// No flowId
}
// Response
{
"data": {
"id": "gen-123",
"flowId": "flow-456" // Auto-generated, flow record not created yet
}
}
The flow record is created when:
- A second generation uses the same
flowId - A
flowAliasis assigned to any generation in the flow
Eager Flow Creation
When flowAlias is provided, the flow is created immediately:
{
"prompt": "A hero banner",
"flowAlias": "@hero-flow"
}
No Flow Association
To explicitly create without flow association:
{
"prompt": "A standalone image",
"flowId": null
}
flowId Behavior Summary
| Value | Behavior |
|---|---|
undefined (not provided) |
Auto-generate pendingFlowId, lazy creation |
null (explicitly null) |
No flow association |
"uuid-string" |
Use provided ID, create flow if doesn't exist |
Regeneration
Regenerate Generation
Recreate an image using the exact same parameters:
POST /api/v1/generations/:id/regenerate
Behavior:
- Uses exact same prompt, aspect ratio, references
- Preserves output image ID and URL
- Works regardless of current status
- No request body needed
Response: Same as original generation with new image
Update and Regenerate
Use PUT to modify parameters with smart regeneration:
PUT /api/v1/generations/:id
{
"prompt": "A blue car instead",
"aspectRatio": "1:1"
}
Smart Behavior:
| Changed Field | Triggers Regeneration |
|---|---|
prompt |
Yes |
aspectRatio |
Yes |
flowId |
No (metadata only) |
meta |
No (metadata only) |
Flow Regenerate
Regenerate the most recent generation in a flow:
POST /api/v1/flows/:id/regenerate
Behavior:
- Finds the most recent generation in flow
- Regenerates with exact same parameters
- Returns error if flow has no generations
Flow Management
List Flows
GET /api/v1/flows
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
limit |
number | 20 |
Results per page (max: 100) |
offset |
number | 0 |
Pagination offset |
Response:
{
"data": [
{
"id": "flow-456",
"projectId": "project-123",
"aliases": { "@hero": "img-789", "@best": "img-abc" },
"generationCount": 5,
"imageCount": 7,
"createdAt": "2025-11-28T10:00:00.000Z"
}
],
"pagination": { "limit": 20, "offset": 0, "total": 3, "hasMore": false }
}
Get Flow
GET /api/v1/flows/:id
Returns flow with computed counts and aliases.
List Flow Generations
GET /api/v1/flows/:id/generations
Returns all generations in the flow, ordered by creation date (newest first).
List Flow Images
GET /api/v1/flows/:id/images
Returns all images in the flow (generated and uploaded).
Update Flow Aliases
PUT /api/v1/flows/:id/aliases
{
"aliases": {
"@hero": "image-id-123",
"@best": "image-id-456"
}
}
Behavior: Merges with existing aliases (does not replace all).
Remove Flow Alias
DELETE /api/v1/flows/:id/aliases/:alias
Example: DELETE /api/v1/flows/flow-456/aliases/@hero
Delete Flow
DELETE /api/v1/flows/:id
Cascade Behavior:
- Flow record is hard deleted
- All generations in flow are hard deleted
- Images without project alias: hard deleted with MinIO cleanup
- Images with project alias: kept, but
flowIdset to null
Full Request Example
// POST /api/v1/generations
{
"prompt": "A professional product photo using @brand-style and @product-template",
"aspectRatio": "1:1",
"autoEnhance": true,
"enhancementOptions": { "template": "product" },
"flowId": "campaign-flow-123",
"alias": "@latest-product",
"flowAlias": "@hero",
"meta": { "campaign": "summer-2025" }
}
What happens:
@brand-styleand@product-templateresolved and used as references- Prompt enhanced using "product" template
- Generation created in flow
campaign-flow-123 - Output image assigned project alias
@latest-product - Output image assigned flow alias
@heroin the flow - Custom metadata stored
Response Fields (Additional)
| Field | Type | Description |
|---|---|---|
flowId |
string | Associated flow UUID |
alias |
string | Project-scoped alias (on outputImage) |
referencedImages |
array | Resolved references: [{ imageId, alias }] |
referenceImages |
array | Full image details of references |
Error Codes
| HTTP Status | Code | Description |
|---|---|---|
| 400 | ALIAS_FORMAT_CHECK |
Alias must start with @ |
| 400 | RESERVED_ALIAS |
Cannot use technical alias |
| 404 | ALIAS_NOT_FOUND |
Referenced alias doesn't exist |
| 404 | FLOW_NOT_FOUND |
Flow does not exist |
See Also
- Basic Generation - Simple generation
- Image Upload - Upload with aliases
- Live URLs - CDN and live generation