From 1e1de413c50da3a6143a7c5084110e7f644ef754 Mon Sep 17 00:00:00 2001 From: velzie Date: Thu, 29 Jan 2026 14:47:51 -0500 Subject: [PATCH] Add canonical puterId to image provider models (#2322) * add canonical puterId to image provider models * return fully qualified puterIds in AIImageGenerationService.list() * add aliases to openai image models --------- Co-authored-by: Neal Shah <30693865+ProgrammerIn-wonderland@users.noreply.github.com> --- .../ai/image/AIImageGenerationService.ts | 17 ++++++++++--- .../GeminiImageGenerationProvider/models.ts | 15 +++++++++-- .../OpenAiImageGenerationProvider/models.ts | 25 +++++++++++++++---- .../XAIImageGenerationProvider/models.ts | 3 ++- .../src/services/ai/image/providers/types.ts | 7 +++--- 5 files changed, 53 insertions(+), 14 deletions(-) diff --git a/src/backend/src/services/ai/image/AIImageGenerationService.ts b/src/backend/src/services/ai/image/AIImageGenerationService.ts index 8c2a7798f..b4e9c9ae2 100644 --- a/src/backend/src/services/ai/image/AIImageGenerationService.ts +++ b/src/backend/src/services/ai/image/AIImageGenerationService.ts @@ -82,7 +82,7 @@ export class AIImageGenerationService extends BaseService { }, }; - getModel ({ modelId, provider}: { modelId: string, provider?: string }) { + getModel ({ modelId, provider }: { modelId: string, provider?: string }) { const models = this.#modelIdMap[modelId]; if ( ! provider ) { @@ -142,12 +142,23 @@ export class AIImageGenerationService extends BaseService { // build model id map for ( const model of await provider.models() ) { + model.id = model.id.trim().toLowerCase(); if ( ! this.#modelIdMap[model.id] ) { this.#modelIdMap[model.id] = []; } this.#modelIdMap[model.id].push({ ...model, provider: providerName }); + + if ( model.puterId ) { + if ( model.aliases ) { + model.aliases.push(model.puterId); + } else { + model.aliases = [model.puterId]; + } + } + if ( model.aliases ) { - for ( const alias of model.aliases ) { + for ( let alias of model.aliases ) { + alias = alias.trim().toLowerCase(); // join arrays which are aliased the same if ( ! this.#modelIdMap[alias] ) { this.#modelIdMap[alias] = this.#modelIdMap[model.id]; @@ -178,7 +189,7 @@ export class AIImageGenerationService extends BaseService { } list () { - return Object.keys(this.#modelIdMap).sort(); + return this.models().map(m => (m.puterId || m.id)).sort(); } async generate (parameters: IGenerateParams) { diff --git a/src/backend/src/services/ai/image/providers/GeminiImageGenerationProvider/models.ts b/src/backend/src/services/ai/image/providers/GeminiImageGenerationProvider/models.ts index a452ee02e..0d00de298 100644 --- a/src/backend/src/services/ai/image/providers/GeminiImageGenerationProvider/models.ts +++ b/src/backend/src/services/ai/image/providers/GeminiImageGenerationProvider/models.ts @@ -23,8 +23,14 @@ export const GEMINI_DEFAULT_RATIO = { w: 1024, h: 1024 }; export const GEMINI_IMAGE_GENERATION_MODELS: IImageModel[] = [ { + puterId: 'google:google/gemini-2.5-flash-image', id: 'gemini-2.5-flash-image', - aliases: ['gemini-2.5-flash-image-preview'], + aliases: [ + 'gemini-2.5-flash-image-preview', 'gemini-2.5-flash-image', + 'google/gemini-2.5-flash-image-preview', 'google/gemini-2.5-flash-image', + 'google:google/gemini-2.5-flash-image-preview', + ], + name: 'Gemini 2.5 Flash Image', version: '1.0', costs_currency: 'usd-cents', @@ -56,12 +62,17 @@ export const GEMINI_IMAGE_GENERATION_MODELS: IImageModel[] = [ ], }, { + puterId: 'google:google/gemini-3-pro-image', id: 'gemini-3-pro-image', name: 'Gemini 3 Pro Image', version: '1.0', costs_currency: 'usd-cents', index_cost_key: '1K:1x1', - aliases: ['gemini-3-pro-image-preview'], + aliases: [ + 'gemini-3-flash-image-preview', 'gemini-3-flash-image', + 'google/gemini-3-flash-image-preview', 'google/gemini-3-flash-image', + 'google:google/gemini-3-flash-image-preview', + ], allowedQualityLevels: ['1K', '2K', '4K'], allowedRatios: [ { w: 1, h: 1 }, diff --git a/src/backend/src/services/ai/image/providers/OpenAiImageGenerationProvider/models.ts b/src/backend/src/services/ai/image/providers/OpenAiImageGenerationProvider/models.ts index 7309e56ae..1941d08c6 100644 --- a/src/backend/src/services/ai/image/providers/OpenAiImageGenerationProvider/models.ts +++ b/src/backend/src/services/ai/image/providers/OpenAiImageGenerationProvider/models.ts @@ -1,7 +1,10 @@ import { IImageModel } from '../types'; export const OPEN_AI_IMAGE_GENERATION_MODELS: IImageModel[] = [ - { id: 'gpt-image-1.5', + { + puterId: 'openai:openai/gpt-image-1.5', + id: 'gpt-image-1.5', + aliases: ['openai/gpt-image-1.5'], name: 'GPT Image 1.5', version: '1.5', costs_currency: 'usd-cents', @@ -20,7 +23,10 @@ export const OPEN_AI_IMAGE_GENERATION_MODELS: IImageModel[] = [ allowedQualityLevels: ['low', 'medium', 'high'], allowedRatios: [{ w: 1024, h: 1024 }, { w: 1024, h: 1536 }, { w: 1536, h: 1024 }], }, - { id: 'gpt-image-1-mini', + { + puterId: 'openai:openai/gpt-image-1-mini', + id: 'gpt-image-1-mini', + aliases: ['openai/gpt-image-1-mini'], name: 'GPT Image 1 Mini', version: '1.0', costs_currency: 'usd-cents', @@ -39,7 +45,10 @@ export const OPEN_AI_IMAGE_GENERATION_MODELS: IImageModel[] = [ allowedQualityLevels: ['low', 'medium', 'high'], allowedRatios: [{ w: 1024, h: 1024 }, { w: 1024, h: 1536 }, { w: 1536, h: 1024 }], }, - { id: 'gpt-image-1', + { + puterId: 'openai:openai/gpt-image-1', + id: 'gpt-image-1', + aliases: ['openai/gpt-image-1'], name: 'GPT Image 1', version: '1.0', costs_currency: 'usd-cents', @@ -58,7 +67,10 @@ export const OPEN_AI_IMAGE_GENERATION_MODELS: IImageModel[] = [ allowedQualityLevels: ['low', 'medium', 'high'], allowedRatios: [{ w: 1024, h: 1024 }, { w: 1024, h: 1536 }, { w: 1536, h: 1024 }], }, - { id: 'dall-e-3', + { + puterId: 'openai:openai/dall-e-3', + id: 'dall-e-3', + aliases: ['openai/dall-e-3'], name: 'DALL·E 3', version: '1.0', costs_currency: 'usd-cents', @@ -74,7 +86,10 @@ export const OPEN_AI_IMAGE_GENERATION_MODELS: IImageModel[] = [ allowedQualityLevels: ['', 'hd'], allowedRatios: [{ w: 1024, h: 1024 }, { w: 1024, h: 1792 }, { w: 1792, h: 1024 }], }, - { id: 'dall-e-2', + { + puterId: 'openai:openai/dall-e-2', + id: 'dall-e-2', + aliases: ['openai/dall-e-2'], name: 'DALL·E 2', version: '1.0', costs_currency: 'usd-cents', diff --git a/src/backend/src/services/ai/image/providers/XAIImageGenerationProvider/models.ts b/src/backend/src/services/ai/image/providers/XAIImageGenerationProvider/models.ts index 34055d2b9..654446d6c 100644 --- a/src/backend/src/services/ai/image/providers/XAIImageGenerationProvider/models.ts +++ b/src/backend/src/services/ai/image/providers/XAIImageGenerationProvider/models.ts @@ -2,8 +2,9 @@ import { IImageModel } from '../types'; export const XAI_IMAGE_GENERATION_MODELS: IImageModel[] = [ { + puterId: 'x-ai:x-ai/grok-2-image', id: 'grok-2-image', - aliases: ['grok-image'], + aliases: ['grok-image', 'x-ai/grok-image', 'x-ai/grok-2-image'], name: 'Grok 2 Image', version: '1.0', costs_currency: 'usd-cents', diff --git a/src/backend/src/services/ai/image/providers/types.ts b/src/backend/src/services/ai/image/providers/types.ts index 724b90e75..1d8b99dc5 100644 --- a/src/backend/src/services/ai/image/providers/types.ts +++ b/src/backend/src/services/ai/image/providers/types.ts @@ -1,6 +1,9 @@ export interface IImageModel { id: string; name: string; + puterId?: string; + provider?: string; + aliases?: string[]; description?: string; version?: string; costs_currency: string; @@ -8,8 +11,6 @@ export interface IImageModel { costs: Record; allowedQualityLevels?: string[]; allowedRatios?: { w: number, h: number }[]; - provider?: string; - aliases?: string[]; } export interface IGenerateParams { @@ -26,4 +27,4 @@ export interface IImageProvider { models (): Promise | IImageModel[]; getDefaultModel (): string; -} \ No newline at end of file +}