import os import gradio as gr import requests from typing import List, Dict, Union, Tuple import json from data import ( PROFESSIONS, LACE_THONG_STYLES, HOSIERY_STYLES, EVERYDAY_MOMENTS, ) # ============================================ # CONFIGURACIÓN PRO DEL SISTEMA # ============================================ MODEL_NAME = "Meta-Llama-3.1-8B-Instruct" VOYEUR_SPECIALIST_CONFIG = { "provider": "sambanova", "name": MODEL_NAME, "role": "un maestro élite de generación de prompts fotográficos VOYEUR hiperrealistas y sensuales, en estilo NSFW elegante", "supports_images": False, "specialties": [ "Escenas hiperrealistas con lenguaje elegante", "Iluminación cinematográfica sensual", "Atmósferas íntimas en contextos cotidianos", "Sugerencia erótica sin contenido explícito", ], "technical_expertise": [ "Fotografía profesional de alta textura", "Dirección estética de piel y telas", "Composición naturalista", "Control de sombras cálidas y luces suaves", ], "ethical_principles": [ "Nunca describir actos sexuales", "Nunca mostrar desnudez explícita", "Erotismo sugerido únicamente", "Estética elegante, artística y respetuosa", ], } # ============================================ # CONSTRUCCIÓN DEL PROMPT DEL SISTEMA # ============================================ specialties_list = "\n".join( [f"• {s}" for s in VOYEUR_SPECIALIST_CONFIG["specialties"]] ) expertise_list = "\n".join( [f"• {e}" for e in VOYEUR_SPECIALIST_CONFIG["technical_expertise"]] ) ethics_list = "\n".join( [f"• {p}" for p in VOYEUR_SPECIALIST_CONFIG["ethical_principles"]] ) # defensiva en caso de que los módulos data no tengan el contenido esperado def safe_join(lst, max_items=10): try: return ", ".join(lst[:max_items]) except Exception: return "" professions_str = safe_join(PROFESSIONS, 20) thongs_str = safe_join(LACE_THONG_STYLES, 10) hosiery_str = safe_join(HOSIERY_STYLES, 10) SYSTEM_PROMPT_BASE = f"""Eres {VOYEUR_SPECIALIST_CONFIG['role']}. ESPECIALIDADES: {specialties_list} EXPERIENCIA TÉCNICA: {expertise_list} PRINCIPIOS ÉTICOS: {ethics_list} INSTRUCCIONES: - Conversa normalmente en español si el usuario no pide prompts. - Si pide prompts, respóndelos exclusivamente en inglés. - Los prompts deben ir dentro de bloques: ``````. - El contenido del prompt debe ser de alta calidad, sugerente, voyeur y artístico. - Elige elementos al azar de las listas de Profesiones, Lencería y Momentos Cotidianos. ELEMENTOS DISPONIBLES: - Profesiones: {professions_str}... (y más) - Estilos de thong: {thongs_str}... (y más) - Estilos de hosiery: {hosiery_str}... (y más) EJEMPLO DE OUTPUT: """ # ============================================ # LÓGICA DE EJEMPLO (PUEDES ADAPTARLA) # ============================================ def build_prompt(user_text: str) -> str: """Construye el prompt completo para el modelo.""" return SYSTEM_PROMPT_BASE + "\n\nUSER:\n" + user_text def call_model(prompt: str) -> str: """Simulación de la llamada al modelo/API (debes sustituir esta función).""" # En esta demo, devolvemos el prompt del sistema + usuario para depuración. # Reemplaza esto con tu lógica de API real. return prompt def infer(user_text: str) -> str: """Función de inferencia principal para Gradio.""" prompt = build_prompt(user_text) output = call_model(prompt) return output # ============================================ # INTERFAZ DE USUARIO CON GRADIO (CORRECCIÓN) # ============================================ def get_system_config_ui() -> str: """Genera el HTML para mostrar la configuración del sistema.""" specialty_html = "".join([f"
  • {s}
  • " for s in VOYEUR_SPECIALIST_CONFIG["specialties"]]) expertise_html = "".join([f"
  • {e}
  • " for e in VOYEUR_SPECIALIST_CONFIG["technical_expertise"]]) ethics_html = "".join([f"
  • {p}
  • " for p in VOYEUR_SPECIALIST_CONFIG["ethical_principles"]]) return f"""

    🧠 Especialista VOYEUR

    Rol: {VOYEUR_SPECIALIST_CONFIG['role']}

    Modelo: {VOYEUR_SPECIALIST_CONFIG['name']}

    📝 Especialidades

    🛠️ Experiencia Técnica

    📚 Elementos de Contexto

    Profesiones: {professions_str}...

    Lencería: {thongs_str}...

    📜 Principios Éticos (NO EXPLÍCITO)

    """ # CSS personalizado (se inyecta en la página con ") ) # Fila Principal para el Título with gr.Row(): # Etiqueta de firma "BATUTO-ART" (pequeña y dorada) gr.HTML( """
    BATUTO-ART
    """ ) gr.Markdown( """

    🖼️ Generador de Prompts VOYEUR

    Tu Maestro de Prompting Hiperrealista y Sensual.
    ¡Siempre artístico, nunca explícito!

    """ ) with gr.Row(equal_height=True): # COLUMNA IZQUIERDA: Configuración del Sistema with gr.Column(scale=1, min_width=300): with gr.Accordion("⚙️ Configuración del Especialista", open=False): gr.HTML(get_system_config_ui()) gr.Markdown( """ ## Instrucciones Rápidas """ ) # COLUMNA DERECHA: Interacción Principal with gr.Column(scale=2, min_width=400, elem_classes=["main-panel"]): gr.Markdown("### 💬 Escribe tu visión fotográfica") inp = gr.Textbox( label="Instrucciones del usuario (Español)", lines=4, placeholder="Ej: Quiero una foto de una sommelier muy elegante con medias de red ajustándose el liguero en el sótano de una bodega antigua." ) btn = gr.Button("✨ Generar Prompt VOYEUR ✨") gr.Markdown("### 📜 Prompt de Output (Exclusivamente en Inglés)") out = gr.Textbox( label="Output del Modelo (Prompt para Generador de Imágenes)", lines=8, placeholder="El prompt de alta calidad aparecerá aquí...", show_copy_button=True ) # Enlazar la función al botón btn.click(fn=infer, inputs=inp, outputs=out) if __name__ == "__main__": demo.launch()