OpenAI: support for gpt-image-1.5

This commit is contained in:
Enrico Ros
2026-01-09 01:22:26 -08:00
parent c7c01a5d7c
commit a091d3f011
5 changed files with 23 additions and 18 deletions
@@ -748,10 +748,11 @@ export namespace OpenAIWire_API_Images_Generations {
export type Request = z.infer<typeof Request_schema>;
const Request_schema = z.object({
// 32,000 for gpt-image-1/gpt-image-1-mini, 4,000 for dall-e-3, 1,000 for dall-e-2
// 32,000 for gpt-image-1.5/gpt-image-1/gpt-image-1-mini, 4,000 for dall-e-3, 1,000 for dall-e-2
prompt: z.string().max(32000),
model: z.enum([
'gpt-image-1.5',
'gpt-image-1',
'gpt-image-1-mini',
'dall-e-3',
@@ -764,7 +765,7 @@ export namespace OpenAIWire_API_Images_Generations {
// Image quality
quality: z.enum([
'auto', // default
'high', 'medium', 'low', // gpt-image-1, gpt-image-1-mini
'high', 'medium', 'low', // gpt-image-1.5, gpt-image-1, gpt-image-1-mini
'hd', 'standard', // dall-e-3: hd | standard, dall-e-2: only standard
]).optional(),
@@ -790,7 +791,7 @@ export namespace OpenAIWire_API_Images_Generations {
user: z.string().optional(),
// -- GPT Image Family Specific Parameters (gpt-image-1, gpt-image-1-mini) --
// -- GPT Image Family Specific Parameters (gpt-image-1.5, gpt-image-1, gpt-image-1-mini) --
// Allows to set transparency (in that case, format = png or webp)
background: z.enum(['transparent', 'opaque', 'auto' /* default */]).optional(),
@@ -821,7 +822,7 @@ export namespace OpenAIWire_API_Images_Generations {
url: z.url().optional(), // if the response_format is 'url' - DEPRECATED
})),
// GPT Image models only (gpt-image-1, gpt-image-1-mini)
// GPT Image models only (gpt-image-1.5, gpt-image-1, gpt-image-1-mini)
usage: z.object({
total_tokens: z.number(),
input_tokens: z.number() // images + text tokens in the input prompt
@@ -849,14 +850,14 @@ export namespace OpenAIWire_API_Images_Edits {
*/
export const Request_schema = z.object({
// 32,000 for gpt-image-1/gpt-image-1-mini, 1,000 for dall-e-2
// 32,000 for gpt-image-1.5/gpt-image-1/gpt-image-1-mini, 1,000 for dall-e-2
prompt: z.string().max(32000),
// image: file | file[] - REQUIRED - Handled as file uploads in FormData ('image' field)
// mask: file - OPTIONAL - Handled as file upload in FormData ('mask' field)
model: z.enum(['gpt-image-1', 'gpt-image-1-mini', 'dall-e-2']).optional(),
model: z.enum(['gpt-image-1.5', 'gpt-image-1', 'gpt-image-1-mini', 'dall-e-2']).optional(),
// Number of images to generate, between 1 and 10
n: z.number().min(1).max(10).nullable().optional(),
@@ -864,7 +865,7 @@ export namespace OpenAIWire_API_Images_Edits {
// Image quality
quality: z.enum([
'auto', // default
'high', 'medium', 'low', // gpt-image-1, gpt-image-1-mini
'high', 'medium', 'low', // gpt-image-1.5, gpt-image-1, gpt-image-1-mini
'standard', // dall-e-2: only standard
]).optional(),
@@ -30,9 +30,9 @@ const _createImageConfigBase = z.object({
user: z.string().optional(),
});
// GPT Image family (gpt-image-1, gpt-image-1-mini share all parameters)
// GPT Image family (gpt-image-1.5, gpt-image-1, gpt-image-1-mini share all parameters)
const createImageConfigGI = _createImageConfigBase.extend({
model: z.enum(['gpt-image-1', 'gpt-image-1-mini']),
model: z.enum(['gpt-image-1.5', 'gpt-image-1', 'gpt-image-1-mini']),
prompt: z.string().max(32000),
size: z.enum([/*'auto',*/ '1024x1024', '1536x1024', '1024x1536']),
quality: z.enum(['high', 'medium', 'low']).optional(),
+2 -1
View File
@@ -17,7 +17,8 @@ import { openAIImageModelsPricing } from './openaiGenerateImages';
const CONF = {
MODEL_OPTS: [
{ value: 'gpt-image-1', label: 'GPT Image' },
{ value: 'gpt-image-1.5', label: 'GPT Image 1.5' },
{ value: 'gpt-image-1', label: 'GPT Image 1' },
{ value: 'gpt-image-1-mini', label: 'GPT Image Mini' },
{ value: 'dall-e-2', label: 'DALL·E 2' },
{ value: 'dall-e-3', label: 'DALL·E 3' },
@@ -98,7 +98,7 @@ export async function openAIGenerateImagesOrThrow(
: '1024x1024',
response_format: 'b64_json',
} : getImageModelFamily(dalleModelId) === 'gpt-image' ? {
model: dalleModelId as 'gpt-image-1' | 'gpt-image-1-mini', // gpt-image-1 or gpt-image-1-mini
model: dalleModelId as 'gpt-image-1.5' | 'gpt-image-1' | 'gpt-image-1-mini',
prompt: prompt.slice(0, 32000 - 1), // GPT Image family accepts much longer prompts
count: imageCount,
size: dalleSizeGI,
@@ -199,7 +199,8 @@ export async function openAIGenerateImagesOrThrow(
export function openAIImageModelsCurrentGeneratorName() {
const dalleModelSelection = useDalleStore.getState().dalleModelId;
const dalleModelId = resolveDalleModelId(dalleModelSelection);
if (dalleModelId === 'gpt-image-1') return 'GPT Image';
if (dalleModelId === 'gpt-image-1.5') return 'GPT Image 1.5';
if (dalleModelId === 'gpt-image-1') return 'GPT Image 1';
if (dalleModelId === 'gpt-image-1-mini') return 'GPT Image Mini';
if (dalleModelId === 'dall-e-3') return 'DALL·E 3';
if (dalleModelId === 'dall-e-2') return 'DALL·E 2';
@@ -216,7 +217,8 @@ export function openAIImageModelsCurrentGeneratorName() {
* - Deduct credits after successful generation
*/
const IMAGE_MODEL_PRICING = {
// Token-based pricing (GPT Image family)
// Token-based pricing (GPT Image family) - Note: chatgpt-image-latest has same pricing as gpt-image-1.5
'gpt-image-1.5': { inputText: 5.00, inputImage: 8.0, outputImage: 32.0 },
'gpt-image-1': { inputText: 5.00, inputImage: 10.0, outputImage: 40.0 },
'gpt-image-1-mini': { inputText: 2.00, inputImage: 2.50, outputImage: 8.00 },
// Fixed pricing models handled separately in openAIImageModelsPricing()
@@ -233,8 +235,8 @@ function openAIImageModelsPrice(modelId: DalleModelId): undefined | { inputText:
* TODO: update this when the OpenAI pricing changes.
*/
export function openAIImageModelsPricing(modelId: DalleModelId, quality: DalleImageQuality, size: DalleSize): string {
// GPT Image family (gpt-image-1, gpt-image-1-mini, future: gpt-image-2, etc.)
if (modelId === 'gpt-image-1' || modelId === 'gpt-image-1-mini') {
// GPT Image family (gpt-image-1.5, gpt-image-1, gpt-image-1-mini)
if (modelId === 'gpt-image-1.5' || modelId === 'gpt-image-1' || modelId === 'gpt-image-1-mini') {
// gpt-image-1-mini does not support high quality
if (modelId === 'gpt-image-1-mini' && quality === 'high') quality = 'medium';
+4 -3
View File
@@ -10,7 +10,8 @@ import { persist } from 'zustand/middleware';
export const DALLE_DEFAULT_IMAGE_SIZE: DalleImageSize = '1024x1024'; // this works in all
export type DalleImageSize = DalleSizeGI | DalleSizeD3 | DalleSizeD2;
export type DalleModelId = 'gpt-image-1' | 'gpt-image-1-mini' | 'dall-e-3' | 'dall-e-2';
// Note: 'chatgpt-image-latest' also exists with same pricing as gpt-image-1.5
export type DalleModelId = 'gpt-image-1.5' | 'gpt-image-1' | 'gpt-image-1-mini' | 'dall-e-3' | 'dall-e-2';
export type DalleModelSelection = DalleModelId | null; // null = auto-select latest
/**
@@ -21,7 +22,7 @@ export type DalleModelSelection = DalleModelId | null; // null = auto-select lat
export function resolveDalleModelId(selection: DalleModelSelection): DalleModelId {
// Auto-select latest model when null
if (selection === null) {
return 'gpt-image-1'; // Current latest model (prefer full model over mini)
return 'gpt-image-1.5'; // Current latest model
}
return selection;
}
@@ -39,7 +40,7 @@ export function resolveDalleModelId(selection: DalleModelSelection): DalleModelI
* - Each family can have its own settings/pricing structure
*/
export function getImageModelFamily(modelId: DalleModelId): 'gpt-image' | 'dall-e-3' | 'dall-e-2' {
if (modelId === 'gpt-image-1' || modelId === 'gpt-image-1-mini')
if (modelId === 'gpt-image-1.5' || modelId === 'gpt-image-1' || modelId === 'gpt-image-1-mini')
return 'gpt-image';
if (modelId === 'dall-e-3')
return 'dall-e-3';