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(""" """, 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.")