Spaces:
Sleeping
Sleeping
from dotenv import load_dotenv | |
import streamlit as st | |
import os | |
import google.generativeai as genai | |
import random # Nueva importación para la selección aleatoria de mención | |
load_dotenv() | |
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] # Probabilidades de cada mención | |
return random.choices(mentions, probabilities)[0] | |
# Función para obtener una técnica de copywriting de manera aleatoria | |
def get_random_copywriting_technique(): | |
techniques = [ | |
"If/Then: This is one of the most commonly used opening paragraphs. It’s very simple, clear, and powerful.", | |
"If / Then + Authority: Adding a figure of authority or credibility to the opening.", | |
"Honesty: Being transparent is one of the best ways to get more customers.", | |
"Sensationalist: It grabs attention with unusual or provocative statements.", | |
"Ask a Question: It makes people stop if they’re interested.", | |
"Micro Openings: Keep it brief to encourage further reading." | |
] | |
return random.sample(techniques, k=random.randint(1, 3)) # Escoge entre 1 y 3 técnicas al azar | |
# Al crear el prompt completo, incluye el tamaño y las técnicas seleccionadas | |
def get_gemini_response(target_audience, product, text_type, length, mood): | |
product_mention = get_random_product_mention() | |
model_choice = "gemini-1.5-flash" # Modelo predeterminado | |
model = genai.GenerativeModel(model_choice) | |
# Obtener técnicas aleatorias | |
copywriting_techniques = get_random_copywriting_technique() | |
techniques_text = " ".join(copywriting_techniques) | |
# Instrucción específica para el tipo de texto | |
format_instruction = "" | |
if text_type == "Historia": | |
format_instruction = f""" | |
Write an engaging opening paragraph that introduces a relatable problem your audience is facing. Stir emotions by highlighting the impact of the problem on their life, and create curiosity with hints of a potential solution without revealing everything. The paragraph should be approximately {length} words long to maintain engagement and avoid losing the reader's attention. | |
""" | |
elif text_type == "Carta de venta": | |
format_instruction = f""" | |
Craft a persuasive lead paragraph for a sales letter that quickly identifies a common pain point your reader is experiencing. The paragraph should be around {length} words long and agitate the problem by emphasizing the negative consequences of not addressing it, and tease the possibility of a solution to spark curiosity. | |
""" | |
elif text_type == "Correo": | |
format_instruction = f""" | |
Write a concise but impactful opening paragraph for an email that captures the reader’s attention. The text should be approximately {length} words, addressing a challenge they are likely facing, and leave them intrigued by hinting at a valuable solution that will be revealed if they continue reading. | |
""" | |
elif text_type == "Landing page": | |
format_instruction = f""" | |
Design a compelling first paragraph for a landing page that immediately draws attention to a significant problem your target audience is encountering. The paragraph should be about {length} words long, stirring emotions and enticing them to keep scrolling by subtly suggesting a solution. | |
""" | |
# Crear el prompt completo basado en los campos del frontend | |
full_prompt = f""" | |
You are a creative writer skilled in the art of persuasion. The tone of the {text_type} should be {mood} and carefully crafted to emotionally resonate with a {target_audience}. {product_mention} {format_instruction} | |
Incorporate the following copywriting techniques: {techniques_text} | |
Use persuasive techniques to guide the reader towards an intuitive understanding of the product's benefits, focusing on creating a strong emotional connection with the audience. | |
Create an opening paragraph for a {text_type} of {length} words in Spanish, that makes {target_audience} aware they have a problem by explaining it with real-life situations, using a natural or conversational tone. The goal of this paragraph is to make them want to keep reading and find out what {product} is about. Use persuasion effectively in every word, mastering advanced techniques. | |
""" | |
response = model.generate_content([full_prompt]) | |
# Comprobar si la respuesta es válida y devolver el texto | |
if response and response.parts: | |
return response.parts[0].text | |
else: | |
raise ValueError("Lo sentimos, intenta con una combinación diferente de entradas.") | |
# Inicializar la aplicación Streamlit | |
st.set_page_config(page_title="VisionTales", layout="wide") | |
st.title("VisionTales: Crea historias inolvidables con IA") | |
# Añadir CSS personalizado para el botón | |
st.markdown(""" | |
<style> | |
div.stButton > button { | |
background-color: #FFCC00; /* Color llamativo */ | |
color: black; /* Texto en negro */ | |
width: 90%; | |
height: 60px; | |
font-weight: bold; | |
font-size: 22px; /* Tamaño más grande */ | |
text-transform: uppercase; /* Texto en mayúsculas */ | |
border: 1px solid #000000; /* Borde negro de 1px */ | |
border-radius: 8px; | |
display: block; | |
margin: 0 auto; /* Centramos el botón */ | |
} | |
div.stButton > button:hover { | |
background-color: #FFD700; /* Color al pasar el mouse */ | |
color: black; /* Texto sigue en negro */ | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# Crear dos columnas para el diseño (40% y 60%) | |
col1, col2 = st.columns([2, 3]) # 2 + 3 = 5 partes en total | |
with col1: | |
# Crear campos de entrada | |
target_audience = st.text_input("¿Quién es tu público objetivo?") | |
product = st.text_input("¿Qué producto tienes en mente?") | |
text_type = st.selectbox("Tipo de texto", ["Historia", "Carta de venta", "Correo", "Landing page"]) | |
length = st.slider("Número de palabras", min_value=50, max_value=300, value=150) | |
mood = st.selectbox("Tono de voz", ["Conversacional", "Formal", "Emocional", "Persuasivo", "Triste", "Feliz", "Horror", "Comedia", "Romántico"]) | |
# Botón para generar el texto (dentro de la interfaz principal) | |
if st.button("Escribir mi texto"): | |
if target_audience and product: # Verificar que se haya proporcionado el público objetivo y el producto | |
try: | |
# Obtener la respuesta del modelo | |
generated_text = get_gemini_response(target_audience, product, text_type, length, mood) | |
col2.subheader("Contenido generado:") | |
col2.write(generated_text) # Resultado del texto generado | |
except ValueError as e: | |
col2.error(f"Error: {str(e)}") | |
else: | |
col2.error("Por favor, proporciona el público objetivo y el producto.") | |