""" App de Mejora de Prompts para Generación de Imágenes Compatible con Gradio 6.0+ """ import gradio as gr from prompt_engine import PromptEnhancer, PromptBuilder, PromptAnalyzer from model_configs import MODEL_CONFIGS, ARTIST_STYLES, ENHANCEMENT_RULES # Inicializar componentes enhancer = PromptEnhancer() analyzer = PromptAnalyzer() # ===== FUNCIONES PRINCIPALES ===== def enhance_prompt(prompt: str, model: str, style: str, add_quality: bool, add_negative: bool) -> tuple: """Función principal de mejora de prompts""" if not prompt or not prompt.strip(): return ("⚠️ Por favor, ingresa un prompt", "", "", "", "") model_map = { "Stable Diffusion 1.5": "stable-diffusion-1.5", "Stable Diffusion XL": "sdxl", "FLUX.1": "flux", "Midjourney": "midjourney", "DALL-E 3": "dall-e-3" } model_key = model_map.get(model, "stable-diffusion-1.5") style_key = style.lower() if style and style != "Ninguno" else None result = enhancer.enhance_for_model( prompt=prompt, model=model_key, style=style_key, add_quality=add_quality, add_negative=add_negative ) analysis = result["analysis"] score_emoji = "🟢" if analysis["score"] >= 70 else "🟡" if analysis["score"] >= 40 else "🔴" suggestions_text = '\n'.join(analysis['suggestions']) if analysis['suggestions'] else '✅ ¡El prompt está bien estructurado!' analysis_text = f"""### 📊 Análisis del Prompt **Puntuación:** {score_emoji} {analysis['score']}/100 **Estadísticas:** - Palabras: {analysis['word_count']} - Caracteres: {analysis['char_count']} - Tokens estimados: {result['tokens_estimate']}/{result['max_tokens']} **Sugerencias:** {suggestions_text} """ variations = enhancer.suggest_variations(result["enhanced"], 3) variations_text = "\n\n".join([f"**Variación {i+1}:**\n`{v}`" for i, v in enumerate(variations)]) return ( result["enhanced"], result["negative_prompt"], analysis_text, variations_text, f"✅ Optimizado para: **{result['model']}**" ) def fix_prompt(prompt: str) -> tuple: """Corrige errores comunes en el prompt""" if not prompt or not prompt.strip(): return ("⚠️ Por favor, ingresa un prompt", "") fixed, fixes = enhancer.fix_common_errors(prompt) if fixes: fixes_text = "### 🔧 Correcciones aplicadas:\n" + "\n".join([f"- {f}" for f in fixes]) else: fixes_text = "### ✅ No se encontraron errores que corregir" return fixed, fixes_text def build_prompt(subject: str, style: str, lighting: str, mood: str, camera: str, quality_opts: list, extra_details: str) -> str: """Construye un prompt desde componentes""" if not subject or not subject.strip(): return "⚠️ Por favor, ingresa al menos un sujeto" builder = PromptBuilder() builder.set_subject(subject) if style and style != "Ninguno": builder.set_style(style.lower()) if lighting and lighting != "Ninguno": builder.set_lighting(lighting.lower()) if mood and mood != "Ninguno": builder.set_mood(mood.lower()) if camera and camera != "Ninguno": builder.set_camera(camera.lower()) if quality_opts: quality_map = { "Alta definición (8K)": ["8k uhd", "high resolution"], "Muy detallado": ["highly detailed", "intricate details"], "Masterpiece": ["masterpiece", "best quality"], "Fotografía profesional": ["professional photography", "DSLR"], "Arte de alta calidad": ["high quality art", "artstation"] } quality_terms = [] for opt in quality_opts: if opt in quality_map: quality_terms.extend(quality_map[opt]) builder.add_quality(quality_terms) if extra_details and extra_details.strip(): builder.add_details([extra_details.strip()]) return builder.build() def analyze_only(prompt: str) -> str: """Solo analiza el prompt sin mejorarlo""" if not prompt or not prompt.strip(): return "⚠️ Por favor, ingresa un prompt para analizar" analysis = analyzer.analyze(prompt) score = analysis["score"] if score >= 80: grade = "🏆 Excelente" elif score >= 60: grade = "👍 Bueno" elif score >= 40: grade = "⚠️ Mejorable" else: grade = "❌ Necesita trabajo" if analysis["issues"]: issue_names = { "muy_corto": "❌ Prompt muy corto", "sin_estilo": "🎨 Falta especificar estilo artístico", "sin_calidad": "✨ Faltan modificadores de calidad", "sin_iluminacion": "💡 No se describe la iluminación", "sin_composicion": "📷 Falta información de composición/encuadre", "palabras_vagas": "📝 Contiene palabras demasiado vagas" } issues_text = "\n".join([issue_names.get(i, i) for i in analysis["issues"]]) else: issues_text = "✅ No se detectaron problemas" suggestions_text = '\n'.join(analysis['suggestions']) if analysis['suggestions'] else '¡El prompt está bien estructurado!' report = f"""## 📊 Análisis Detallado ### Calificación: {grade} ({score}/100) --- ### 📈 Estadísticas | Métrica | Valor | |---------|-------| | Palabras | {analysis['word_count']} | | Caracteres | {analysis['char_count']} | --- ### 🔍 Problemas Detectados {issues_text} --- ### 💡 Sugerencias de Mejora {suggestions_text} --- ### 📚 Tips Generales - Los prompts más efectivos tienen entre 15-40 palabras - Incluye siempre el estilo visual deseado - Especifica la iluminación para mayor control - Usa modificadores de calidad al inicio del prompt - Evita palabras genéricas como "bonito" o "bueno" """ return report def get_style_examples(style: str) -> str: """Muestra ejemplos para un estilo específico""" if not style or style == "Ninguno": return "Selecciona un estilo para ver ejemplos" examples = { "Fotorealista": ( "**Ejemplos de prompts fotorealistas:**\n\n" "1. `professional photograph of a woman, natural lighting, 85mm lens, shallow depth of field, photorealistic, 8k uhd`\n\n" "2. `hyperrealistic photo of a mountain landscape, golden hour, dramatic clouds, raw photo, high dynamic range`\n\n" "3. `product photography of a luxury watch, studio lighting, macro shot, commercial photography, pristine details`" ), "Anime": ( "**Ejemplos de prompts anime:**\n\n" "1. `anime girl with blue hair, cherry blossom background, studio ghibli style, vibrant colors, detailed eyes, key visual`\n\n" "2. `epic anime battle scene, dynamic action pose, energy effects, dramatic lighting, anime key visual, trending on pixiv`\n\n" "3. `cozy anime room interior, warm lighting, detailed background, slice of life aesthetic, makoto shinkai style`" ), "Arte Digital": ( "**Ejemplos de arte digital:**\n\n" "1. `digital painting of a fantasy castle, dramatic sky, concept art, artstation trending, highly detailed, epic composition`\n\n" "2. `character design, full body portrait, detailed armor, digital art, fantasy warrior, professional illustration`\n\n" "3. `environment concept art, alien planet, sci-fi landscape, matte painting, cinematic, artstation winner`" ), "Pintura": ( "**Ejemplos de pintura:**\n\n" "1. `oil painting of a serene lake, impressionist style, visible brush strokes, golden hour lighting, museum quality`\n\n" "2. `renaissance portrait, classical technique, dramatic chiaroscuro, oil on canvas, by old masters`\n\n" "3. `watercolor landscape, soft edges, wet on wet technique, delicate colors, paper texture visible`" ), "3D": ( "**Ejemplos de 3D/CGI:**\n\n" "1. `3D render of a cute robot character, octane render, subsurface scattering, studio lighting, pixar style`\n\n" "2. `architectural visualization, modern house, ray tracing, unreal engine 5, photorealistic materials`\n\n" "3. `3D character model, fantasy creature, zbrush detail, substance painter textures, turntable view`" ), "Cinematico": ( "**Ejemplos cinematográficos:**\n\n" "1. `cinematic still from a sci-fi movie, anamorphic lens, dramatic lighting, movie poster composition, 4k`\n\n" "2. `film noir scene, high contrast, dramatic shadows, mysterious atmosphere, classic hollywood style`\n\n" "3. `epic movie landscape, sweeping vista, volumetric fog, golden hour, widescreen composition`" ) } return examples.get(style, "No hay ejemplos disponibles para este estilo") # ===== TEXTOS LARGOS ===== GUIDE_TEXT = """## 📖 Guía Rápida de Prompts ### Estructura recomendada: [Calidad] + [Sujeto principal] + [Estilo] + [Detalles] + [Iluminación] + [Composición] ### Ejemplo práctico: masterpiece, best quality, a beautiful elven princess with silver hair, fantasy art style, intricate jewelry, magical forest background, ethereal lighting, portrait shot, highly detailed --- ### ⚡ Diferencias entre modelos: | Modelo | Tokens | Pesos | Estilo de prompt | |--------|--------|-------|------------------| | SD 1.5 | 77 | ✅ (word:1.2) | Tags separados por comas | | SDXL | 77 | ✅ (word:1.2) | Similar a SD, más natural | | FLUX | 256 | ❌ | Descripciones naturales | | Midjourney | 500 | ✅ ::peso | Natural + parámetros | | DALL-E 3 | 4000 | ❌ | Oraciones descriptivas | --- ### 🎯 Palabras clave por categoría: **Calidad:** masterpiece, best quality, highly detailed, 8k, uhd, professional **Iluminación:** dramatic lighting, soft light, golden hour, studio lighting, rim light **Composición:** portrait, full body, close-up, wide shot, bird's eye view **Estilos:** oil painting, digital art, photograph, 3d render, watercolor, sketch """ TIPS_TEXT = """### 💡 Tips para cada componente: - **Sujeto**: Sé específico. "young woman with curly red hair" > "woman" - **Estilo**: Define la estética visual del resultado - **Iluminación**: Afecta dramáticamente el mood de la imagen - **Ambiente**: Establece el tono emocional - **Encuadre**: Controla la composición de la imagen """ FOOTER_TEXT = """---
Mejora y optimiza tus prompts para generación de imágenes con IA