"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var ImageGeneratorService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.ImageGeneratorService = void 0; const common_1 = require("@nestjs/common"); const config_1 = require("@nestjs/config"); const axios_1 = require("axios"); const OPENROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions'; let ImageGeneratorService = ImageGeneratorService_1 = class ImageGeneratorService { constructor(config) { this.config = config; this.logger = new common_1.Logger(ImageGeneratorService_1.name); } async generarRender(prompt, fotoAntesDataUri) { const apiKey = this.config.get('OPENROUTER_API_KEY'); const model = this.config.get('OPENROUTER_MODEL_IMAGEN', 'google/gemini-2.0-flash-exp-image-generation'); const intentosRateLimit = 1; for (let attempt = 0; attempt <= intentosRateLimit; attempt++) { try { const response = await axios_1.default.post(OPENROUTER_URL, { model, messages: [ { role: 'user', content: [ { type: 'text', text: prompt }, { type: 'image_url', image_url: { url: fotoAntesDataUri } }, ], }, ], }, { headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json', 'HTTP-Referer': 'https://reformix.es', 'X-Title': 'Reformix Image Worker', }, timeout: 60000, }); const content = response.data.choices?.[0]?.message?.content; if (!content) throw new Error('OpenRouter no devolvio contenido'); const imagen = this.extraerImagenDeRespuesta(content, response.data); if (!imagen) throw new Error('No se pudo extraer imagen de la respuesta'); return imagen; } catch (err) { if (err.response?.status === 429 && attempt < intentosRateLimit) { this.logger.warn('Rate limit (429), esperando 5s y reintentando...'); await new Promise((r) => setTimeout(r, 5000)); continue; } throw err; } } throw new Error('Fallaron todos los intentos de generacion de imagen'); } extraerImagenDeRespuesta(content, rawResponse) { if (content.startsWith('data:image')) return content; const dataUriMatch = content.match(/data:image\/[a-zA-Z]+;base64,[^\s"']+/); if (dataUriMatch) return dataUriMatch[0]; const urlMatch = content.match(/https?:\/\/[^\s"'()]+\.(png|jpg|jpeg|webp)/i); if (urlMatch) return urlMatch[0]; const parts = rawResponse?.choices?.[0]?.message?.content; if (Array.isArray(parts)) { for (const part of parts) { if (part.type === 'image_url' && part.image_url?.url) return part.image_url.url; if (part.image_url?.url?.startsWith('data:image')) return part.image_url.url; } } return null; } }; exports.ImageGeneratorService = ImageGeneratorService; exports.ImageGeneratorService = ImageGeneratorService = ImageGeneratorService_1 = __decorate([ (0, common_1.Injectable)(), __metadata("design:paramtypes", [config_1.ConfigService]) ], ImageGeneratorService); //# sourceMappingURL=image-generator.service.js.map