From 4e5729e0883e089f50e581729097b567298398a0 Mon Sep 17 00:00:00 2001 From: xavidop Date: Tue, 26 Aug 2025 10:48:50 -0400 Subject: [PATCH] feat: add imodel selector --- src/ai/flows/generate-pokemon-card.ts | 3 +- src/components/cards/CardGenerator.tsx | 29 +++++++++++++++++++ .../cards/CardGeneratorFormOnly.tsx | 29 +++++++++++++++++++ src/types/index.ts | 1 + 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/ai/flows/generate-pokemon-card.ts b/src/ai/flows/generate-pokemon-card.ts index 54c2416..edfc7c7 100644 --- a/src/ai/flows/generate-pokemon-card.ts +++ b/src/ai/flows/generate-pokemon-card.ts @@ -22,6 +22,7 @@ const GeneratePokemonCardInputSchema = z.object({ backgroundDescription: z.string().min(1, "Background description is required"), pokemonDescription: z.string().min(1, "Pokemon description is required"), language: z.enum(['english', 'japanese', 'chinese', 'korean', 'spanish', 'french', 'german', 'italian']), + model: z.enum(['imagen-4.0-ultra-generate-001', 'imagen-4.0-generate-001', 'imagen-4.0-fast-generate-001', 'gemini-2.5-flash-image-preview']).default('imagen-4.0-ultra-generate-001'), hp: z.number().optional(), attackName1: z.string().optional(), attackDamage1: z.number().optional(), @@ -63,7 +64,7 @@ export async function generatePokemonCard(input: GeneratePokemonCardInput): Prom console.log("Generated prompt:", prompt); const response = await genAI.models.generateImages({ - model: 'models/imagen-4.0-ultra-generate-preview-06-06', + model: `models/${input.model}`, prompt: prompt, config: { numberOfImages: 1, diff --git a/src/components/cards/CardGenerator.tsx b/src/components/cards/CardGenerator.tsx index 5f4775a..2c1e1c2 100644 --- a/src/components/cards/CardGenerator.tsx +++ b/src/components/cards/CardGenerator.tsx @@ -26,6 +26,7 @@ export interface GeneratePokemonCardInput { backgroundDescription: string; pokemonDescription: string; language: 'english' | 'japanese' | 'chinese' | 'korean' | 'spanish' | 'french' | 'german' | 'italian'; + model: 'imagen-4.0-ultra-generate-001' | 'imagen-4.0-generate-001' | 'imagen-4.0-fast-generate-001' | 'gemini-2.5-flash-image-preview'; hp?: number; attackName1?: string; attackDamage1?: number; @@ -53,6 +54,13 @@ const languages = [ { value: 'italian', label: 'Italian' }, ] as const; +const models = [ + { value: 'imagen-4.0-ultra-generate-001', label: 'Imagen 4.0 Ultra' }, + { value: 'imagen-4.0-generate-001', label: 'Imagen 4.0 Standard' }, + { value: 'imagen-4.0-fast-generate-001', label: 'Imagen 4.0 Fast' }, + { value: 'gemini-2.5-flash-image-preview', label: 'Gemini 2.5 Flash' }, +] as const; + const cardGeneratorSchema = z.object({ pokemonName: z.string().min(1, 'Pokemon name is required'), pokemonType: z.string().min(1, 'Pokemon type is required'), @@ -61,6 +69,7 @@ const cardGeneratorSchema = z.object({ backgroundDescription: z.string().min(10, 'Background description must be at least 10 characters'), pokemonDescription: z.string().min(10, 'Pokemon description must be at least 10 characters'), language: z.enum(['english', 'japanese', 'chinese', 'korean', 'spanish', 'french', 'german', 'italian']), + model: z.enum(['imagen-4.0-ultra-generate-001', 'imagen-4.0-generate-001', 'imagen-4.0-fast-generate-001', 'gemini-2.5-flash-image-preview']), hp: z.number().min(10).max(999).optional(), attackName1: z.string().optional(), attackDamage1: z.number().min(0).max(999).optional(), @@ -102,6 +111,7 @@ export function CardGenerator({ onCardGenerated, initialValues }: CardGeneratorP backgroundDescription: initialValues?.backgroundDescription || '', pokemonDescription: initialValues?.pokemonDescription || '', language: initialValues?.language || 'english', + model: initialValues?.model || 'imagen-4.0-ultra-generate-001', hp: initialValues?.hp || 130, attackName1: initialValues?.attackName1 || 'Quick Attack', attackDamage1: initialValues?.attackDamage1 || 60, @@ -252,6 +262,25 @@ export function CardGenerator({ onCardGenerated, initialValues }: CardGeneratorP + +
+ + + {errors.model && ( +

{errors.model.message}

+ )} +
diff --git a/src/components/cards/CardGeneratorFormOnly.tsx b/src/components/cards/CardGeneratorFormOnly.tsx index 5de0a66..ddcd5fb 100644 --- a/src/components/cards/CardGeneratorFormOnly.tsx +++ b/src/components/cards/CardGeneratorFormOnly.tsx @@ -24,6 +24,7 @@ export interface GeneratePokemonCardInput { backgroundDescription: string; pokemonDescription: string; language: 'english' | 'japanese' | 'chinese' | 'korean' | 'spanish' | 'french' | 'german' | 'italian'; + model: 'imagen-4.0-ultra-generate-001' | 'imagen-4.0-generate-001' | 'imagen-4.0-fast-generate-001' | 'gemini-2.5-flash-image-preview'; hp?: number; attackName1?: string; attackDamage1?: number; @@ -51,6 +52,13 @@ const languages = [ { value: 'italian', label: 'Italian' }, ] as const; +const models = [ + { value: 'imagen-4.0-ultra-generate-001', label: 'Imagen 4.0 Ultra' }, + { value: 'imagen-4.0-generate-001', label: 'Imagen 4.0 Standard' }, + { value: 'imagen-4.0-fast-generate-001', label: 'Imagen 4.0 Fast' }, + { value: 'gemini-2.5-flash-image-preview', label: 'Gemini 2.5 Flash' }, +] as const; + const cardGeneratorSchema = z.object({ pokemonName: z.string().min(1, 'Pokemon name is required'), pokemonType: z.string().min(1, 'Pokemon type is required'), @@ -59,6 +67,7 @@ const cardGeneratorSchema = z.object({ backgroundDescription: z.string().min(10, 'Background description must be at least 10 characters'), pokemonDescription: z.string().min(10, 'Pokemon description must be at least 10 characters'), language: z.enum(['english', 'japanese', 'chinese', 'korean', 'spanish', 'french', 'german', 'italian']), + model: z.enum(['imagen-4.0-ultra-generate-001', 'imagen-4.0-generate-001', 'imagen-4.0-fast-generate-001', 'gemini-2.5-flash-image-preview']), hp: z.number().min(10).max(999).optional(), attackName1: z.string().optional(), attackDamage1: z.number().min(0).max(999).optional(), @@ -98,6 +107,7 @@ export function CardGeneratorFormOnly({ onCardGenerated, initialValues }: CardGe backgroundDescription: initialValues?.backgroundDescription || '', pokemonDescription: initialValues?.pokemonDescription || '', language: initialValues?.language || 'english', + model: initialValues?.model || 'imagen-4.0-ultra-generate-001', hp: initialValues?.hp || 130, attackName1: initialValues?.attackName1 || 'Quick Attack', attackDamage1: initialValues?.attackDamage1 || 60, @@ -221,6 +231,25 @@ export function CardGeneratorFormOnly({ onCardGenerated, initialValues }: CardGe + +
+ + + {errors.model && ( +

{errors.model.message}

+ )} +
diff --git a/src/types/index.ts b/src/types/index.ts index 63bd4c0..3561c02 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -35,6 +35,7 @@ export interface CardGenerationParams { backgroundDescription: string; pokemonDescription: string; language: 'english' | 'japanese' | 'chinese' | 'korean' | 'spanish' | 'french' | 'german' | 'italian'; + model: 'imagen-4.0-ultra-generate-001' | 'imagen-4.0-generate-001' | 'imagen-4.0-fast-generate-001' | 'gemini-2.5-flash-image-preview'; hp?: number; attackName1?: string; attackDamage1?: number;