FirstParagraph / app.py
JeCabrera's picture
Update app.py
0b38acb verified
raw
history blame
6.98 kB
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.")