Spaces:
Sleeping
Sleeping
from dotenv import load_dotenv | |
import streamlit as st | |
import os | |
import google.generativeai as genai | |
import random | |
# Cargar las variables de entorno | |
load_dotenv() | |
# Configurar la API de Google | |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
# Función para obtener una mención del producto de manera probabilística | |
def get_random_product_mention(): | |
mentions = ["Directa", "Indirecta", "Metafórica"] | |
probabilities = [0.34, 0.33, 0.33] | |
return random.choices(mentions, probabilities)[0] | |
# Crear la instrucción de mención basada en la opción seleccionada | |
def get_mention_instruction(product_mention, product): | |
if product_mention == "Directa": | |
return f"Introduce directamente el producto '{product}' como la solución clara al problema que enfrenta el lector." | |
elif product_mention == "Indirecta": | |
return f"Referencia sutilmente el producto '{product}' como una posible solución al problema del lector sin nombrarlo explícitamente." | |
elif product_mention == "Metafórica": | |
return f"Introduce el producto '{product}' usando una metáfora, conectándolo simbólicamente a la solución que necesita el lector." | |
return "" | |
# Ejemplos de titulares por tipo | |
headline_types = { | |
"pregunta": [ | |
"¿Qué sorprendente secreto revela el éxito detrás de los grandes emprendedores?", | |
"¿Estás haciendo estos errores comunes en tu rutina diaria?", | |
], | |
"historia": [ | |
"La increíble transformación de alguien que decidió salir de su zona de confort.", | |
"El viaje inesperado que llevó a un joven a descubrir su pasión por la música.", | |
], | |
"afirmación": [ | |
"La clave para una vida más feliz está en tus decisiones diarias.", | |
"Cada fracaso es una oportunidad disfrazada para aprender y crecer.", | |
], | |
"llamado_a_la_accion": [ | |
"Descubre cómo mejorar tu productividad en solo una semana.", | |
"Únete a nuestro curso y transforma tu carrera profesional hoy mismo.", | |
], | |
"consejo": [ | |
"5 consejos para mejorar tu concentración mientras trabajas desde casa.", | |
"Aprende a gestionar tu tiempo de manera efectiva con estas simples estrategias.", | |
], | |
"frase_inspiradora": [ | |
"El único modo de hacer un gran trabajo es amar lo que haces.", | |
"La mejor forma de predecir el futuro es crearlo.", | |
], | |
"dato_impresionante": [ | |
"¿Sabías que el 70% de las personas no están satisfechas con su trabajo actual?", | |
"Los estudios muestran que dedicar al menos 30 minutos al día a la lectura puede aumentar tu productividad.", | |
], | |
"mitologia": [ | |
"La verdad detrás del mito de que solo los jóvenes pueden ser emprendedores exitosos.", | |
"Desmitificando la creencia de que necesitas un título universitario para tener éxito.", | |
], | |
"numerico": [ | |
"10 formas sorprendentes de aumentar tu productividad en el trabajo.", | |
"7 hábitos que transformarán tu vida en solo un mes.", | |
], | |
"impactante": [ | |
"¡Descubre el oscuro secreto que las empresas no quieren que sepas!", | |
"La verdad escalofriante sobre los ingredientes de tus alimentos favoritos.", | |
], | |
"amarillista": [ | |
"¡No podrás creer lo que esta persona hizo para hacerse rica de la noche a la mañana!", | |
"¡Alerta! Estos hábitos cotidianos podrían estar arruinando tu salud sin que te des cuenta.", | |
], | |
} | |
# Función para generar titulares | |
def generate_headlines(number_of_headlines, target_audience, product, temperature): | |
product_mention = get_random_product_mention() | |
mention_instruction = get_mention_instruction(product_mention, product) | |
# Crear la configuración del modelo | |
generation_config = { | |
"temperature": temperature, | |
"top_p": 0.85, # Considerar un poco menos de palabras probables | |
"top_k": 128, # Aumentar las palabras candidatas para más variedad | |
"max_output_tokens": 2048, # Mantenerlo igual, pero puedes aumentar si deseas más detalle | |
"response_mime_type": "text/plain", | |
} | |
model = genai.GenerativeModel( | |
model_name="gemini-1.5-flash", | |
generation_config=generation_config, | |
system_instruction="You are a world-class copywriter, with expertise in crafting hooks, headlines, and subject lines that immediately capture the reader's attention, prompting them to open the email or continue reading. Your skill lies in deeply understanding the emotions, desires, and challenges of a specific audience. You are also an expert in creating benefits that connect symptoms with problems, allowing you to design personalized strategies that resonate and motivate action. You know how to use proven structures to attract your target audience, generating interest and creating a powerful connection. Your task is to generate unusual, creative, and fascinating subject lines or headlines that spark curiosity and encourage the reader to engage further. Respond in Spanish and use a numbered list format. Important: Only answer with subject lines, never include explanations or categories, like this: 'La leyenda del padre soltero: Dice que nunca hay tiempo suficiente. El yoga te enseña a usar mejor el tiempo que tienes, incluso cuando te parece imposible (este bullet es curioso).'" | |
) | |
# Crear un mensaje para el modelo que incluye tipos específicos, pero no los menciona en la salida | |
selected_types = random.sample(list(headline_types.keys()), min(number_of_headlines, len(headline_types))) | |
headlines_instruction = ( | |
f"Tu tarea es crear {number_of_headlines} ganchos o encabezados titulares llamativos diseñados para {target_audience} " | |
f"con el fin de generar interés en {product}. Usa la siguiente mención: {mention_instruction}. " | |
"Asegúrate de utilizar diferentes tipos de titulares sin mencionar sus tipos en la salida." | |
) | |
chat_session = model.start_chat( | |
history=[ | |
{ | |
"role": "user", | |
"parts": [headlines_instruction], | |
}, | |
] | |
) | |
response = chat_session.send_message("Genera los titulares") # Enviar mensaje para obtener la respuesta | |
return response.text # Regresar la respuesta directamente | |
# Configurar la interfaz de usuario con Streamlit | |
st.set_page_config(page_title="Enchanted Hooks", layout="wide") | |
# Centrar el título y el subtítulo | |
st.markdown("<h1 style='text-align: center;'>Enchanted Hooks</h1>", unsafe_allow_html=True) | |
st.markdown("<h4 style='text-align: center;'>Imagina poder conjurar títulos que no solo informan, sino que encantan. Esta app es tu varita mágica en el mundo del copywriting, transformando cada concepto en un titular cautivador que deja a todos deseando más.</h4>", unsafe_allow_html=True) | |
# Añadir CSS personalizado para el botón | |
st.markdown(""" | |
<style> | |
div.stButton > button { | |
background-color: #FFCC00; | |
color: black; | |
width: 90%; | |
height: 60px; | |
font-weight: bold; | |
font-size: 22px; | |
text-transform: uppercase; | |
border: 1px solid #000000; | |
border-radius: 8px; | |
display: block; | |
margin: 0 auto; | |
} | |
div.stButton > button:hover { | |
background-color: #FFD700; | |
color: black; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Crear columnas | |
col1, col2 = st.columns([1, 2]) | |
# Columnas de entrada | |
with col1: | |
target_audience = st.text_input("¿Quién es tu público objetivo?", placeholder="Ejemplo: Estudiantes Universitarios") | |
product = st.text_input("¿Qué producto tienes en mente?", placeholder="Ejemplo: Curso de Inglés") | |
number_of_headlines = st.selectbox("Número de Titulares", options=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], index=4) | |
temperature = st.slider("Creatividad", min_value=0.0, max_value=1.0, value=0.5, step=0.1) | |
# Botón de enviar | |
submit = st.button("Generar Titulares") | |
# Mostrar los titulares generados | |
if submit: | |
if target_audience and product: | |
try: | |
# Obtener la respuesta del modelo | |
generated_headlines = generate_headlines(number_of_headlines, target_audience, product, temperature) | |
col2.markdown(f""" | |
<div style="border: 1px solid #000000; padding: 5px; border-radius: 8px; background-color: #ffffff;"> | |
<h4>Observa la magia en acción:</h4> | |
<p>{generated_headlines}</p> | |
</div> | |
""", unsafe_allow_html=True) | |
except ValueError as e: | |
col2.error(f"Error: {str(e)}") | |
else: | |
col2.error("Por favor, proporciona el público objetivo y el producto.") | |