feat: add support for GEMINI_API_KEY and improve error messages in AI service

This commit is contained in:
2025-10-04 04:49:28 -05:00
parent 109f51d2a6
commit 95a83d9bdb
3 changed files with 19 additions and 12 deletions

3
.env
View File

@@ -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
# ===========================================

View File

@@ -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 <descripción>',
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;
}

View File

@@ -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: {