feat: add imodel selector

This commit is contained in:
xavidop
2025-08-26 10:48:50 -04:00
parent 7c83fd1d06
commit 4e5729e088
4 changed files with 61 additions and 1 deletions
+2 -1
View File
@@ -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,
+29
View File
@@ -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
</SelectContent>
</Select>
</div>
<div>
<Label htmlFor="model">AI Model</Label>
<Select onValueChange={(value) => setValue('model', value as any)}>
<SelectTrigger>
<SelectValue placeholder="Select model" />
</SelectTrigger>
<SelectContent>
{models.map((model) => (
<SelectItem key={model.value} value={model.value}>
{model.label}
</SelectItem>
))}
</SelectContent>
</Select>
{errors.model && (
<p className="text-sm text-red-500 mt-1">{errors.model.message}</p>
)}
</div>
</div>
<Separator />
@@ -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
</SelectContent>
</Select>
</div>
<div>
<Label htmlFor="model">AI Model</Label>
<Select value={watchedValues.model} onValueChange={(value: any) => setValue('model', value)}>
<SelectTrigger>
<SelectValue placeholder="Select model" />
</SelectTrigger>
<SelectContent>
{models.map((model) => (
<SelectItem key={model.value} value={model.value}>
{model.label}
</SelectItem>
))}
</SelectContent>
</Select>
{errors.model && (
<p className="text-sm text-red-500 mt-1">{errors.model.message}</p>
)}
</div>
</div>
<Separator />
+1
View File
@@ -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;