diff --git a/.env b/.env index dfa8b4c..9c297a4 100644 --- a/.env +++ b/.env @@ -19,7 +19,8 @@ APPWRITE_COLLECTION_AI_CONVERSATIONS_ID="aiconversation" # =========================================== TOKEN=OTkxMDYyNzUxNjMzODgzMTM2.Gjzppb.OsdqEDhl_tiQmw4KL7ITbEZ1e-s9VeoF_xJvQQ guildTest=1316592320954630144 -GOOGLE_AI_API_KEY=AIzaSyDNTHsqpbiYaEpe5AwykSqtgWGjsZcc_RA #AIzaSyDcqOndCJw02xFs305iQE7KVptBoBH8aPk +GOOGLE_AI_API_KEY=AIzaSyDNTHsqpbiYaEpe5AwykSqtgWGjsZcc_RA +GEMINI_API_KEY=AIzaSyDcqOndCJw02xFs305iQE7KVptBoBH8aPk CLIENT=991062751633883136 # =========================================== diff --git a/src/commands/messages/AI/image.ts b/src/commands/messages/AI/image.ts index 84e7236..74f8687 100644 --- a/src/commands/messages/AI/image.ts +++ b/src/commands/messages/AI/image.ts @@ -4,16 +4,13 @@ import logger from '../../../core/lib/logger'; export default { name: 'image', + aliases: ['imagen', 'img', 'aiimage'], description: 'Genera una imagen usando IA', - type: 'message', - aliases: ['imagen', 'img', 'draw', 'dibuja'], - category: 'AI', - usage: 'imagen ', cooldown: 10, async run(message: Message, args: string[]) { // Verificar que hay un prompt if (!args || args.length === 0) { - await message.reply('❌ **Error**: Debes proporcionar una descripción para generar la imagen.\n\n**Ejemplo**: `imagen un gato espacial flotando entre estrellas`'); + await message.reply('❌ **Error**: Debes proporcionar una descripción para generar la imagen.\n\n**Ejemplo**: `!image un gato espacial flotando entre estrellas`'); return; } diff --git a/src/core/services/AIService.ts b/src/core/services/AIService.ts index 114ae80..5e37c52 100644 --- a/src/core/services/AIService.ts +++ b/src/core/services/AIService.ts @@ -1,5 +1,4 @@ import { GoogleGenerativeAI, HarmCategory, HarmBlockThreshold } from "@google/generative-ai"; -// New: modern GenAI SDK for image generation import { GoogleGenAI, PersonGeneration } from "@google/genai"; import logger from "../lib/logger"; import { Collection } from "discord.js"; @@ -116,9 +115,9 @@ export class AIService { } as const; constructor() { - const apiKey = process.env.GOOGLE_AI_API_KEY; + const apiKey = process.env.GOOGLE_AI_API_KEY || process.env.GEMINI_API_KEY; if (!apiKey) { - throw new Error('GOOGLE_AI_API_KEY no está configurada'); + throw new Error('Falta la clave de Google AI. Define GOOGLE_AI_API_KEY o GEMINI_API_KEY en las variables de entorno.'); } this.genAI = new GoogleGenerativeAI(apiKey); @@ -131,6 +130,13 @@ export class AIService { this.genAIv2 = null; } + // Permitir override de modelo por variable de entorno + const envImageModel = process.env.GENAI_IMAGE_MODEL; + if (envImageModel && envImageModel.trim()) { + this.imageModelName = envImageModel.trim(); + logger.info({ model: this.imageModelName }, 'Modelo de imágenes fijado por GENAI_IMAGE_MODEL'); + } + this.startQueueProcessor(); this.startCleanupService(); this.detectImageModel(); @@ -145,10 +151,14 @@ export class AIService { return null; } - // Lista de candidatos de modelos de imagen ordenados por preferencia (actualizada según Google AI Studio) + // Lista de candidatos de modelos de imagen ordenados por preferencia (actualizada + retrocompatibilidad) const candidates = [ 'models/imagen-4.0-generate-001', 'imagen-4.0-generate-001', + 'models/imagen-3.0-fast', + 'imagen-3.0-fast', + 'models/imagen-3.0', + 'imagen-3.0', 'models/gemini-2.5-flash-image', 'gemini-2.5-flash-image', ]; @@ -198,8 +208,7 @@ export class AIService { // Fallback: probar modelos uno por uno for (const candidate of candidates) { try { - // Probar con la nueva API de generateImages - const testRes: any = await (this.genAIv2 as any).models.generateImages({ + await (this.genAIv2 as any).models.generateImages({ model: candidate, prompt: 'test', config: {