diff --git a/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts b/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts index 0662016cf..edd9aa048 100644 --- a/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts +++ b/src/modules/aix/server/dispatch/wiretypes/openai.wiretypes.ts @@ -748,10 +748,11 @@ export namespace OpenAIWire_API_Images_Generations { export type Request = z.infer; 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(), diff --git a/src/modules/llms/server/openai/openai.router.ts b/src/modules/llms/server/openai/openai.router.ts index f2f66ed9c..64b37b936 100644 --- a/src/modules/llms/server/openai/openai.router.ts +++ b/src/modules/llms/server/openai/openai.router.ts @@ -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(), diff --git a/src/modules/t2i/dalle/DallESettings.tsx b/src/modules/t2i/dalle/DallESettings.tsx index 35b6d2188..db444417e 100644 --- a/src/modules/t2i/dalle/DallESettings.tsx +++ b/src/modules/t2i/dalle/DallESettings.tsx @@ -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' }, diff --git a/src/modules/t2i/dalle/openaiGenerateImages.ts b/src/modules/t2i/dalle/openaiGenerateImages.ts index f4e7c9c39..0a8565e7a 100644 --- a/src/modules/t2i/dalle/openaiGenerateImages.ts +++ b/src/modules/t2i/dalle/openaiGenerateImages.ts @@ -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'; diff --git a/src/modules/t2i/dalle/store-module-dalle.ts b/src/modules/t2i/dalle/store-module-dalle.ts index 82902171f..1dd770513 100644 --- a/src/modules/t2i/dalle/store-module-dalle.ts +++ b/src/modules/t2i/dalle/store-module-dalle.ts @@ -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';