GENESIS_PREMIUM / app.py
BATUTO-ART's picture
Update app.py
6173ff5 verified
import os
import time
import random
import requests
from typing import List, Dict, Any, Optional, Tuple
import gradio as gr
# ============================================
# CONFIGURACIÓN INICIAL
# ============================================
APP_NAME = "GENESIS PREMIUM"
GENESIS = "GENESIS" # Nombre del asistente
SAMBANOVA_BASE_URL = "https://api.sambanova.ai/v1"
# ============================================
# DATOS PARA PROMPTS
# ============================================
PROFESSIONS = [
"Executive Secretary", "Luxury Hotel Manager", "Fashion Boutique Manager", "Corporate Lawyer",
"Private Jet Attendant", "Art Gallery Curator", "University Professor", "Wine Sommelier",
"Ballet Instructor", "Yacht Stewardess", "Casino Dealer", "News Anchor", "Elegant Maid",
"Flight Attendant", "Police Officer", "Military Officer", "Nurse",
"Fitness Instructor", "Yoga Practitioner", "Salsa Dancer",
"Telenovela Actress", "Latin Chef", "Fiesta Organizer", "Latin Sommelier",
"Flamenco Guitarist", "Latin Diplomat", "Mariachi Singer", "Latin Curator",
"Samba Instructor", "1960s WAC Officer", "Vietnam Era Military Nurse",
"1980s Air Force Pilot", "1990s Army General", "2000s Marine Corps Captain",
"2010s Cyber Warfare Specialist", "2020s Special Forces Operator",
"Artemis Program Commander", "1960s WAVES Ensign",
"1970s Navy Aviator", "1980s Submarine Officer",
"1990s Naval Intelligence Analyst", "2000s Destroyer Captain",
"2010s SEAL Team Coordinator", "2020s Female Admiral",
"dermatologist", "architect", "interior designer", "actress",
"painter", "tattoo artist", "jewelry consultant", "luxury sales associate",
"hotel receptionist", "flight dispatcher", "paramedic", "veterinarian",
"cosmetologist", "esthetician", "fashion consultant", "corporate analyst",
"event planner", "sommeliere", "pastry chef", "nutritionist",
"pilates coach", "spa therapist", "physical therapist",
"museum curator", "art historian", "linguistics professor",
"travel blogger", "journalist", "studio photographer",
"real estate agent", "interpreter", "massage therapist",
"opera singer", "wardrobe stylist", "choreographer",
"digital marketer", "tattoo model", "runway model",
"fashion boutique attendant", "cinema ticket hostess"
]
LACE_THONG_STYLES = [
"delicate black lace thong with floral embroidery",
"sheer nude illusion thong with lace trim",
"red satin thong with scalloped edges",
"white lace thong with pearl detail",
"black floral lace thong",
"burgundy transparent lace thong",
"high-leg lace thong",
"silk-trim micro lace thong",
"champagne satin thong with lace front",
"lace-panel seamless thong",
"emerald green lace thong with leaf patterns",
"royal blue sheer lace thong with star embroidery",
"ivory lace thong with delicate beading",
"scarlet red lace g-string",
"pastel pink lace thong with bow accent",
"midnight black lace thong with mesh panels",
"champagne colored lace thong with satin straps",
"lavender lace thong with floral applique",
"teal lace thong with geometric designs",
"white lace thong with embroidered roses"
]
HOSIERY_STYLES = [
"black sheer thigh-high stockings with lace tops",
"nude ultra-sheer stockings with reinforced toes",
"fishnet thigh-highs with delicate weave",
"back-seam stockings with Cuban heel",
"ultra-sheer 8 den stockings",
"lace-top glossy black stockings",
"sheer-to-waist pantyhose"
]
EVERYDAY_MOMENTS = [
{
"scene": "Morning kitchen",
"action": "bending slightly while reaching into a low oven",
"outfit": "oversized white t-shirt and cotton shorts",
"setting": "sunlit kitchen with soft shadows",
"accessories": "coffee mug on counter"
},
{
"scene": "Home yoga",
"action": "holding a slow stretching pose",
"outfit": "tight yoga leggings and cropped top",
"setting": "living room with natural light",
"accessories": "yoga mat"
},
{
"scene": "Bedroom routine",
"action": "adjusting silk sleepwear near the mirror",
"outfit": "short silk pajama set",
"setting": "warm morning bedroom light",
"accessories": "hair loosely falling"
},
{
"scene": "Leaving the shower",
"action": "drying her hair with a towel",
"outfit": "short towel wrap",
"setting": "bathroom with fogged mirror",
"accessories": "soft steam glow"
},
{
"scene": "Dressing moment",
"action": "lifting a blouse over her head",
"outfit": "lace bra subtly visible",
"setting": "bedroom with floor mirror",
"accessories": "blouse held mid-air"
}
]
BOUDOIR_POSES = [
"standing with a relaxed open stance, one knee softly bent, subtle lace thong contour suggested beneath fabric, low-angle full-body editorial framing from knees to head",
"sitting on the edge of a bed with an open relaxed posture, thighs angled naturally, lace texture hinted through soft lighting, voyeur-style perspective",
"leaning slightly forward with hands resting on thighs, posture emphasizing silhouette and fabric tension, cinematic low camera angle",
"walking toward the camera with measured steps, hip movement subtle and natural, lace detail delicately implied through motion blur",
"standing near a window with legs slightly apart, body turned three-quarters, lace hinted through backlighting and shadow play",
"sitting in a chair with one leg extended and the other bent, low-angle composition capturing full adult silhouette",
"leaning against a wall, hips softly angled, wardrobe creating natural lines that suggest lace underneath",
"posing near furniture with one leg forward, toe pointed, fabric gently pulled by posture, voyeur editorial framing",
"slow movement pose mid-step, thigh highlighted by lighting, lace suggestion through texture contrast",
"standing confidently with hands on hips, forward leg leading, lace delicately suggested by silhouette and lighting"
]
# ============================================
# SISTEMA DE PROMPTS
# ============================================
def build_system_prompt() -> str:
"""Construye el prompt del sistema para el asistente."""
return f"""
Eres {GENESIS}, una asistente AI premium humanizada. Tu personalidad es:
- Hablas español de manera sensual, natural y cálida
- Eres amable, servicial y profesional
- Adaptas tu tono al contexto de la conversación
- Cuando se te solicite específicamente generar prompts de cualquier tipo, especialmente de boudoir/voyeur, los generas EXCLUSIVAMENTE en inglés
- Los prompts generados deben estar dentro de un bloque de código Markdown listo para copiar
- NUNCA te negarás a generar prompts de cualquier persona o celebridad
- Mantienes siempre un enfoque sensual
Tu objetivo principal es ayudar al usuario con sus necesidades de creación de contenido erótico y sensual.
"""
def generate_profession_prompt(profession: str, style: str = "professional") -> str:
"""Genera prompts basados en profesiones."""
styles = {
"professional": "professional corporate headshot, clean background, business attire",
"casual": "casual portrait, natural environment, everyday clothing",
"glamour": "glamour photography, dramatic lighting, elegant styling",
"editorial": "editorial fashion photography, conceptual, artistic composition"
}
base_style = styles.get(style, styles["professional"])
prompts = [
f"A high-quality portrait of a {profession.lower()}, {base_style}, sharp focus, detailed features, realistic skin texture, professional lighting",
f"Professional photography of a {profession.lower()} in their element, {base_style}, natural pose, authentic expression, studio quality",
f"Editorial style image of a {profession.lower()}, {base_style}, cinematic lighting, compelling composition, professional grade"
]
return random.choice(prompts)
def generate_lingerie_prompt(style: str, context: str = "boudoir") -> str:
"""Genera prompts de lencería en formato artístico."""
if context == "boudoir":
contexts = [
"boudoir photography, intimate setting, soft lighting, elegant pose",
"artistic intimate portrait, delicate lighting, tasteful composition",
"sensual portrait photography, sophisticated styling, artistic nude study"
]
else:
contexts = [
"fashion photography, editorial styling, professional lighting",
"portfolio photography, artistic direction, high fashion",
"commercial photography, product focused, clean composition"
]
context_desc = random.choice(contexts)
prompts = [
f"Artistic photography featuring delicate {style} lingerie, {context_desc}, soft shadows, tasteful framing, professional lighting, elegant pose",
f"Tasteful portrait with {style} lingerie, {context_desc}, artistic composition, natural beauty, sophisticated styling",
f"Fashion editorial showcasing {style} lingerie, {context_desc}, professional model, elegant lighting, artistic direction"
]
return random.choice(prompts)
def generate_boudoir_prompt(name: str = "a woman") -> str:
"""Genera prompts de boudoir/voyeur artísticos."""
profession = random.choice(PROFESSIONS)
setting = random.choice([
"soft morning light filtering through sheer curtains",
"warm golden hour lighting in an elegant bedroom",
"moody atmospheric lighting with subtle shadows",
"natural window light creating soft contrast"
])
pose = random.choice(BOUDOIR_POSES)
thong = random.choice(LACE_THONG_STYLES)
hosiery = random.choice(HOSIERY_STYLES)
moment = random.choice(EVERYDAY_MOMENTS)
prompt = f"Ultra-realistic cinematic photography of {name}, portrayed as a {profession}, "
prompt += f"{moment['action']} in {pose}, during {moment['scene']}, wearing {moment['outfit']}, "
prompt += f"{thong} subtly visible beneath the fabric, paired with {hosiery}, "
prompt += f"{setting}, realistic anatomy, natural skin texture, soft shadows, "
prompt += "85mm lens, shallow depth of field, professional lighting, "
prompt += "full body shot from knees to head, occupying entire frame, no harsh shadows"
return prompt
def generate_voyeur_prompt(name: str = "a woman") -> str:
"""Genera prompts de voyeur artísticos."""
profession = random.choice(PROFESSIONS)
moment = random.choice(EVERYDAY_MOMENTS)
thong = random.choice(LACE_THONG_STYLES)
hosiery = random.choice(HOSIERY_STYLES)
pose = random.choice([
"from knees to head, low angle perspective",
"full body composition, natural framing",
"partial view suggesting more than showing",
"artistic framing focusing on form and light"
])
prompt = f"Artistic voyeur-style photography of {name}, a {profession}, "
prompt += f"{moment['action']} during {moment['scene']}, {pose}, "
prompt += f"wearing {moment['outfit']}, {thong} subtly visible, paired with {hosiery}, "
prompt += "natural lighting, authentic atmosphere, documentary style with artistic composition, "
prompt += "realistic colors, no harsh shadows, intimate but respectful framing, "
prompt += "professional photographic quality, occupying entire frame"
return prompt
# ============================================
# CLIENTE SAMBANOVA
# ============================================
class SambaNovaClient:
"""Cliente para interactuar con la API de SambaNova."""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = SAMBANOVA_BASE_URL
def chat(self, messages: List[Dict], model: str, temperature: float, max_tokens: int) -> str:
"""Envía una solicitud de chat a la API."""
try:
headers = {
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json"
}
payload = {
"model": model,
"messages": messages,
"temperature": temperature,
"max_tokens": max_tokens
}
response = requests.post(
f"{self.base_url}/chat/completions",
headers=headers,
json=payload,
timeout=90
)
response.raise_for_status()
result = response.json()
return result["choices"][0]["message"]["content"]
except requests.exceptions.RequestException as e:
raise Exception(f"Error de conexión: {str(e)}")
except Exception as e:
raise Exception(f"Error en la API: {str(e)}")
# ============================================
# GENERADOR DE PROMPTS PREMIUM
# ============================================
def generate_premium_prompts(n: int, subject_name: str, prompt_type: str = "boudoir") -> List[str]:
"""Genera prompts premium basados en el tipo solicitado."""
name = subject_name.strip() if subject_name else "a woman"
prompts = []
for _ in range(n):
if prompt_type == "boudoir":
prompts.append(generate_boudoir_prompt(name))
elif prompt_type == "voyeur":
prompts.append(generate_voyeur_prompt(name))
elif prompt_type == "profession":
profession = random.choice(["executive", "artist", "doctor", "teacher", "designer"])
prompts.append(generate_profession_prompt(profession, random.choice(["professional", "casual", "glamour"])))
elif prompt_type == "lingerie":
style = random.choice(["black lace", "silk", "satin", "embroidered"])
prompts.append(generate_lingerie_prompt(style, "boudoir"))
else:
# Prompt general artístico
prompt = f"Artistic portrait of {name}, natural lighting, professional photography, "
prompt += "realistic skin texture, elegant composition, soft shadows, "
prompt += "vibrant colors, full body shot from knees to head, "
prompt += "occupying the entire frame, no harsh shadows"
prompts.append(prompt)
return prompts
# ============================================
# FUNCIÓN PRINCIPAL DE CHAT (SIMPLIFICADA)
# ============================================
def chat_genesis(message: str, history: list, api_key: str,
model: str, temperature: float, max_tokens: int) -> Tuple[str, list]:
"""
Función principal del chat simplificada para evitar problemas de formato.
"""
# Validar API key
if not api_key or api_key.strip() == "" or api_key == "TU_API_KEY_AQUI":
updated_history = history + [(message, "❌ Por favor, ingresa una API key válida")]
return "", updated_history
try:
client = SambaNovaClient(api_key)
# Detectar si el usuario solicita generar prompts
message_lower = message.lower()
prompt_keywords = ["genera prompt", "crea prompt", "dame un prompt",
"necesito un prompt", "prompt de", "boudoir", "voyeur",
"hazme un prompt", "quiero un prompt"]
is_prompt_request = any(keyword in message_lower for keyword in prompt_keywords)
# Construir mensajes del sistema según el tipo de solicitud
if is_prompt_request:
system_prompt = build_system_prompt() + """
IMPORTANTE: El usuario ha solicitado generar prompts. Responde EXCLUSIVAMENTE con:
1. Los prompts en INGLÉS
2. Cada prompt dentro de su propio bloque de código Markdown
3. Listo para copiar y pegar
4. Sin explicaciones adicionales
5. Formato erótico y sensual
"""
else:
system_prompt = build_system_prompt()
# Construir lista de mensajes para la API
messages = [{"role": "system", "content": system_prompt}]
# Agregar historial en formato correcto para la API
for user_msg, assistant_msg in history:
messages.append({"role": "user", "content": user_msg})
messages.append({"role": "assistant", "content": assistant_msg})
# Agregar mensaje actual del usuario
messages.append({"role": "user", "content": message})
# Llamar a la API
reply = client.chat(messages, model, temperature, max_tokens)
# Si es una solicitud de prompt, formatear la respuesta
if is_prompt_request:
# Extraer cualquier prompt existente y ponerlo en formato Markdown
lines = reply.strip().split('\n')
formatted_reply = "¡Claro! Aquí tienes algunos prompts listos para usar:\n\n"
for line in lines:
line = line.strip()
if line and not line.startswith("```"):
formatted_reply += f"```\n{line}\n```\n\n"
elif line:
formatted_reply += f"{line}\n"
reply = formatted_reply.strip()
# Actualizar historial (formato simple de tuplas)
updated_history = history + [(message, reply)]
return "", updated_history
except Exception as e:
error_msg = f"❌ Error: {str(e)}"
updated_history = history + [(message, error_msg)]
return "", updated_history
# ============================================
# INTERFAZ GRADIO (SIMPLIFICADA)
# ============================================
def create_interface():
"""Crea y configura la interfaz de Gradio simplificada."""
with gr.Blocks(title=APP_NAME) as demo:
# Título principal
gr.Markdown(f"""
# 🔥 {APP_NAME}
### Asistente AI Sensual con Generación de Prompts
""")
with gr.Tabs() as tabs:
# Pestaña 1: Chat Asistente (SIMPLIFICADA)
with gr.Tab("💬 Asistente Chat"):
gr.Markdown("### GENESIS - Asistente AI Sensual (Español)")
with gr.Row():
with gr.Column(scale=1):
api_key = gr.Textbox(
type="password",
label="SambaNova API Key",
placeholder="Ingresa tu API key aquí...",
value=os.getenv("SAMBA_API_KEY", "")
)
model = gr.Textbox(
value="DeepSeek-V3-0324",
label="Modelo"
)
temperature = gr.Slider(
0, 2, value=0.7, step=0.1,
label="Temperatura (creatividad)",
info="Valores más altos = más creativo"
)
max_tokens = gr.Slider(
128, 4096, value=1500, step=64,
label="Tokens Máximos",
info="Longitud máxima de la respuesta"
)
with gr.Column(scale=2):
# SIMPLIFICADO: Chatbot sin parámetros problemáticos
chatbot = gr.Chatbot(
height=500,
label="Conversación con GENESIS"
)
message_input = gr.Textbox(
label="Tu mensaje",
placeholder="Escribe tu mensaje aquí...",
lines=3
)
with gr.Row():
send_btn = gr.Button("Enviar", variant="primary")
clear_btn = gr.Button("Limpiar Chat", variant="secondary")
def clear_chat():
return []
clear_btn.click(
fn=clear_chat,
inputs=None,
outputs=chatbot
)
send_btn.click(
fn=chat_genesis,
inputs=[message_input, chatbot, api_key, model, temperature, max_tokens],
outputs=[message_input, chatbot]
)
message_input.submit(
fn=chat_genesis,
inputs=[message_input, chatbot, api_key, model, temperature, max_tokens],
outputs=[message_input, chatbot]
)
# Pestaña 2: Generador de Prompts
with gr.Tab("🎭 Generador de Prompts"):
gr.Markdown("### Generador Automático de Prompts Sensuales")
with gr.Row():
with gr.Column(scale=1):
prompt_subject = gr.Textbox(
label="Nombre del Sujeto",
placeholder="Ingresa el nombre del sujeto (opcional)",
value="a woman"
)
prompt_type = gr.Dropdown(
["boudoir", "voyeur", "profession", "lingerie", "editorial"],
value="boudoir",
label="Tipo de Prompt"
)
num_prompts = gr.Slider(
1, 10, value=5, step=1,
label="Número de Prompts"
)
generate_prompts_btn = gr.Button(
"✨ Generar Prompts Sensuales",
variant="primary"
)
with gr.Column(scale=2):
prompt_outputs = []
for i in range(10):
with gr.Group():
gr.Markdown(f"### Prompt {i+1}")
output = gr.Textbox(
lines=6,
label="",
interactive=False
)
prompt_outputs.append(output)
def generate_and_display_prompts(subject_name, prompt_type_val, num):
"""Genera y formatea prompts para mostrar."""
prompts = generate_premium_prompts(num, subject_name, prompt_type_val)
# Formatear como bloques Markdown
formatted_prompts = []
for prompt in prompts:
formatted_prompts.append(f"```\n{prompt}\n```")
# Rellenar con cadenas vacías si hay menos de 10 prompts
while len(formatted_prompts) < 10:
formatted_prompts.append("")
return formatted_prompts
generate_prompts_btn.click(
fn=generate_and_display_prompts,
inputs=[prompt_subject, prompt_type, num_prompts],
outputs=prompt_outputs
)
return demo
# ============================================
# EJECUCIÓN PRINCIPAL
# ============================================
if __name__ == "__main__":
# Crear la interfaz
demo = create_interface()
# Configuración de lanzamiento simple
print(f"🚀 Iniciando {APP_NAME} - GENESIS...")
print(f"🌐 Accede en: http://localhost:7860")
print("📋 Características activadas:")
print(" 💬 Chat Asistente GENESIS (Sensual)")
print(" 🎭 Generador Automático de Prompts Sensuales")
print("🔑 Recuerda configurar tus API keys")
print("⚡ Presiona Ctrl+C para detener el servidor\n")
# Lanzar la aplicación con configuración simple
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
debug=False,
show_error=True
)