OpenAI Provider¶
The OpenAI provider supports GPT Image models and legacy DALL-E models for image generation, editing, and variations.
Setup¶
import (
"github.com/plexusone/omniimage"
"github.com/plexusone/omniimage/provider"
)
client, err := omniimage.NewClient(omniimage.ClientConfig{
Providers: []omniimage.ProviderConfig{
{
Provider: omniimage.ProviderNameOpenAI,
APIKey: "sk-...", // Or use OPENAI_API_KEY env var
},
},
})
Models¶
| Model | Constant | Quality | Max N | Edit | Variations |
|---|---|---|---|---|---|
| GPT Image 2 | ModelGPTImage2 |
HD | 10 | No | No |
| GPT Image 1 | ModelGPTImage1 |
HD | 10 | No | No |
| DALL-E 3 | ModelDALLE3 |
HD | 1 | No | No |
| DALL-E 2 | ModelDALLE2 |
Standard | 10 | Yes | Yes |
DALL-E 3 Retirement
DALL-E 3 was retired on March 4, 2026. Use GPT Image models for new projects.
Image Generation¶
Basic Generation¶
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "A serene Japanese garden with cherry blossoms",
Size: provider.Size1024x1024,
})
High Quality¶
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "Professional product photography",
Size: provider.Size1024x1024,
Quality: provider.QualityHD,
})
Style Options¶
// Vivid - dramatic, hyper-real images
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelDALLE3,
Prompt: "A fantasy dragon",
Style: provider.StyleVivid,
})
// Natural - realistic, less dramatic
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelDALLE3,
Prompt: "A forest landscape",
Style: provider.StyleNatural,
})
Portrait and Landscape¶
// Portrait (vertical)
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "A full-body portrait",
Size: provider.Size1024x1792,
})
// Landscape (horizontal)
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "A panoramic mountain view",
Size: provider.Size1792x1024,
})
Image Editing¶
Edit existing images with masks (DALL-E 2 only).
// Edit an image - replace masked area
resp, err := client.Edit(ctx, &provider.EditRequest{
Model: omniimage.ModelDALLE2,
Image: "data:image/png;base64,...", // Base64 encoded image
Mask: "data:image/png;base64,...", // Transparent areas = edit region
Prompt: "A red sports car",
Size: provider.Size1024x1024,
})
Multipart Upload
The Edit API traditionally requires multipart form data. For file-based uploads, you may need to use the OpenAI SDK directly or encode images as data URLs.
Image Variations¶
Create variations of existing images (DALL-E 2 only).
resp, err := client.Variations(ctx, &provider.VariationsRequest{
Model: omniimage.ModelDALLE2,
Image: "data:image/png;base64,...",
N: 4, // Generate 4 variations
Size: provider.Size1024x1024,
})
Response Format¶
URL Response (Default)¶
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "A test image",
ResponseFormat: provider.FormatURL, // Default
})
imageURL := resp.Images[0].URL
Base64 Response¶
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "A test image",
ResponseFormat: provider.FormatB64JSON,
})
b64Data := resp.Images[0].B64JSON
Revised Prompts¶
GPT Image and DALL-E 3 may revise your prompt for safety or clarity:
resp, err := client.Generate(ctx, &provider.GenerateRequest{
Model: omniimage.ModelGPTImage2,
Prompt: "A person",
})
fmt.Println("Original:", "A person")
fmt.Println("Revised:", resp.Images[0].RevisedPrompt)
// Output might be: "A person standing in a park on a sunny day..."
Supported Sizes¶
| Size | Constant | Models |
|---|---|---|
| 256x256 | Size256x256 |
DALL-E 2 |
| 512x512 | Size512x512 |
DALL-E 2 |
| 1024x1024 | Size1024x1024 |
All |
| 1024x1792 | Size1024x1792 |
GPT Image, DALL-E 3 |
| 1792x1024 | Size1792x1024 |
GPT Image, DALL-E 3 |
Error Handling¶
resp, err := client.Generate(ctx, req)
if err != nil {
var apiErr *openai.APIError
if errors.As(err, &apiErr) {
switch apiErr.Code {
case "content_policy_violation":
log.Println("Content violates policy")
case "rate_limit_exceeded":
log.Println("Rate limited, retry later")
default:
log.Printf("API error: %s", apiErr.Message)
}
}
return
}
Best Practices¶
- Use GPT Image models - DALL-E 3 is deprecated
- Be specific - Detailed prompts yield better results
- Handle revised prompts - Check if your prompt was modified
- Use appropriate sizes - Match size to use case
- Implement retries - Handle rate limits gracefully