Action_Maker / app.py
JeCabrera's picture
Update app.py
4d3ea69 verified
raw
history blame
8 kB
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.35, 0.25, 0.40]
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 llamados a la acción por tipo
cta_types = {
"directos": [
"Descarga la guía para mejorar mi productividad diaria.",
"Suscribite a la página para recibir actualizaciones y promociones exclusivas.",
"Únete a la prueba gratis de 14 días y descubrir nuevas funciones.",
"Registrate a la página para acceder a contenido premium y estrategias efectivas.",
"Compra ahora y obtén un regalo especial con tu pedido."
],
"urgencia": [
"Inscribete ahora para asegurar tu lugar, antes de que se agoten las plazas.",
"Únete ahora para comenzar tu transformación hoy y no pierdas más tiempo."
],
"descuento": [
"Compra ahora y aprovecha el 50% de descuento.",
"Haz tu pedido ahora y obten un 30% de descuento adicional."
],
"exclusividad": [
"Accede al contenido exclusivo solo para miembros.",
"Se parte de un grupo selecto y disfruta de beneficios únicos."
],
"beneficio_claro": [
"Mejora tu productividad en solo una semana.",
"Transforma tu carrera profesional con herramientas avanzadas."
],
"personalización": [
"Descubre cómo personalizar esta oferta.",
"Elige las opciones que mejor se adapten a tus necesidades."
]
}
# Función para que el modelo elija automáticamente el tipo de CTA y el CTA específico
def get_random_cta():
cta_type = random.choice(list(cta_types.keys())) # Selección aleatoria del tipo de CTA
cta = random.choice(cta_types[cta_type]) # Selección aleatoria del CTA dentro del tipo
return cta
# Función para generar los textos, incluyendo el texto introductorio y el CTA
def generate_texts(number_of_texts, target_audience, product, call_to_action, temperature):
product_mention = get_random_product_mention()
mention_instruction = get_mention_instruction(product_mention, product)
# Configuración del modelo
generation_config = {
"temperature": temperature,
"top_p": 0.85,
"top_k": 128,
"max_output_tokens": 2048,
"response_mime_type": "text/plain",
}
# Configuración del modelo generativo y las instrucciones del sistema
model = genai.GenerativeModel(
model_name="gemini-1.5-flash", # Nombre del modelo que estamos utilizando
generation_config=generation_config, # Configuración de generación
system_instruction=(
f"Eres un experto copywriter especializado en escribir mensajes o textos que atraen la atención de {target_audience} para promover {product} que soluciona los problemas de {target_audience}. "
"Tu tarea es crear textos que incluyan un mensaje introductorio breve, atractivo y directo, seguido de un llamado a la acción (CTA) efectivo para promover {product}, tomando en cuenta los puntos dolorosos de {target_audience} y el {call_to_action} a realizar."
"El texto introductorio debe ser corto, pero inspirador, y el CTA debe ser claro, directo y persuasivo, siguiendo la estructura 'Acción + conector + Valor'."
"Asegúrate de que el texto sea creativo, fluido, y adaptado al tono que genera confianza y deseo de actuar."
)
)
# Crear un mensaje para el modelo que incluye los CTAs generados según los tipos seleccionados
texts_instruction = (
f"Tu tarea es generar {number_of_texts} combinaciones de textos. Cada texto debe comenzar con un mensaje introductorio corto y atractivo, seguido de un CTA relacionado con {call_to_action}. "
f"Puedes usar frases introductorias como 'Y si a ti te gustaría aprender todo esto...', pero asegúrate de que sea breve y poderosa. "
f"Recuerda que el CTA debe tener la estructura 'Acción + conector + Valor', como los ejemplos proporcionados."
)
# Generar el resultado utilizando el modelo con la instrucción de CTA específica
try:
response = model.generate_content([texts_instruction])
# Extraer el texto de la respuesta
generated_texts = response.candidates[0].content.parts[0].text.strip() # Modificado aquí
# Retornar el resultado
return generated_texts
except Exception as e:
raise ValueError(f"Error al generar los textos: {str(e)}")
# Configurar la interfaz de usuario con Streamlit
st.set_page_config(page_title="QuickPrompt", layout="wide")
# Centrar el título y el subtítulo
st.markdown("<h1 style='text-align: center;'>Quick Prompt</h1>", unsafe_allow_html=True)
st.markdown("<h4 style='text-align: center;'>Transforma tu mensaje en llamados de acción que inspiren a tu audiencia a tomar decisiones al instante.</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")
call_to_action = st.text_input("¿Qué acción deseas que tomen?", placeholder="Ejemplo: Inscribirse al curso")
number_of_texts = st.selectbox("Número de textos", options=[1, 2, 3, 4, 5], index=2)
temperature = st.slider("Creatividad", min_value=0.0, max_value=2.0, value=0.8, step=0.1)
# Botón de enviar
submit = st.button("Generar Textos")
# Mostrar los textos generados
if submit:
if target_audience and product and call_to_action:
try:
# Obtener la respuesta del modelo
generated_texts = generate_texts(number_of_texts, target_audience, product, call_to_action, temperature)
col2.markdown(f"""
<div style="border: 1px solid #000000; padding: 5px; border-radius: 8px; background-color: #ffffff;">
<h4>Mira la magia en acción:</h4>
<p>{generated_texts}</p>
</div>
""", unsafe_allow_html=True)
except ValueError as e:
col2.error(f"Error: {str(e)}")
except Exception as e:
col2.error(f"Error inesperado: {str(e)}")
else:
col2.error("Por favor, proporciona el público objetivo, el producto y la acción.")