JeCabrera's picture
Update app.py
b44807b verified
raw
history blame
18.6 kB
from dotenv import load_dotenv
import streamlit as st
import os
import google.generativeai as genai
import random
load_dotenv()
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
story_formulas = {
"PASA": {
"description": """
La f贸rmula P.A.S.A. es una de las estructuras m谩s efectivas en copywriting, dise帽ada para crear una conexi贸n emocional profunda que lleva a la acci贸n.
TEOR脥A:
Esta f贸rmula se basa en la psicolog铆a del dolor y el alivio, siguiendo el principio de que las personas est谩n m谩s motivadas a evitar el dolor que a buscar el placer.
ESTRUCTURA:
1. Problema:
- Identifica un dolor espec铆fico y real
- Debe ser inmediatamente reconocible por la audiencia
- Se presenta desde la perspectiva del lector
- Usa lenguaje emp谩tico y comprensivo
2. Agitaci贸n:
- Profundiza en las consecuencias emocionales
- Explora ramificaciones futuras
- Aumenta la tensi贸n psicol贸gica
- Crea un punto de inflexi贸n emocional
3. Soluci贸n:
- Presenta la respuesta de forma natural
- Enfoca en beneficios transformacionales
- Construye credibilidad gradualmente
- Demuestra el cambio positivo
4. Acci贸n:
- Propone el siguiente paso l贸gico
- Minimiza la fricci贸n y resistencia
- Crea sentido de urgencia
- Ofrece garant铆as impl铆citas
""",
"examples": [
{
"title": "App de Meditaci贸n",
"target": "Profesionales estresados",
"story": """
El insomnio se hab铆a convertido en su compa帽ero m谩s fiel. Sara miraba el reloj: 3 AM, otra vez.
Los d铆as se volv铆an borrosos, su concentraci贸n desaparec铆a. Las reuniones importantes se convert铆an en una lucha por mantener los ojos abiertos, mientras su productividad se desplomaba.
Todo cambi贸 cuando descubri贸 MeditaApp. Sus ejercicios de respiraci贸n guiada y meditaciones nocturnas la ayudaron a encontrar ese interruptor mental que necesitaba para desconectar.
Descarga MeditaApp hoy y recupera tus noches. Tus primeros 7 d铆as son gratuitos, porque creemos que una noche de buen sue帽o no tiene precio.
"""
},
{
"title": "Curso de Finanzas Personales",
"target": "J贸venes profesionales",
"story": """
Cada notificaci贸n del banco le provocaba un nudo en el est贸mago. Miguel evitaba revisar su cuenta, sabiendo que los n煤meros rojos lo esperaban.
Las deudas crec铆an mientras sus sue帽os se alejaban. La idea de comprar una casa o empezar un negocio parec铆a cada vez m谩s inalcanzable, y la ansiedad financiera lo consum铆a d铆a y noche.
Entonces encontr贸 FinanzasMaster. El curso no solo le ense帽贸 a manejar su dinero, sino a construir un futuro financiero s贸lido. En seis meses, elimin贸 sus deudas y comenz贸 a ver crecer sus ahorros.
脷nete a FinanzasMaster hoy. Transforma tu relaci贸n con el dinero con nuestro programa probado de 12 semanas. Matr铆cula con 50% de descuento esta semana.
"""
}
]
},
"GHA": {
"description": """
La f贸rmula G.H.A. (Gancho-Historia-Acci贸n) es una estructura narrativa poderosa que utiliza el storytelling para crear conexiones emocionales y motivar a la acci贸n.
TEOR脥A:
Esta f贸rmula aprovecha el poder de las historias para captar la atenci贸n, generar empat铆a y motivar el cambio, bas谩ndose en la identificaci贸n con los problemas y dolores de la audiencia.
ESTRUCTURA:
1. Gancho:
- Abre identificando un problema o dolor espec铆fico de la audiencia
- Conecta emocionalmente con la frustraci贸n o necesidad
- Genera identificaci贸n inmediata con la situaci贸n
- Plantea el escenario desde la perspectiva del dolor actual
2. Historia:
- Desarrolla la narrativa mostrando las consecuencias del problema
- Explora c贸mo el dolor afecta diferentes aspectos de la vida
- Mantiene la tensi贸n emocional sobre el problema
- Introduce el producto como soluci贸n natural al dolor
- Demuestra la transformaci贸n positiva posible
3. Acci贸n:
- Surge como respuesta natural al deseo de eliminar el dolor
- Presenta la acci贸n como el puente hacia el beneficio deseado
- Enfatiza la urgencia de resolver el problema
- Minimiza las barreras para tomar acci贸n
- Refuerza los beneficios espec铆ficos que se obtendr谩n
""",
"examples": [
{
"title": "Programa de Fitness",
"target": "Personas que quieren comenzar a ejercitarse",
"story": """
"Nunca ser茅 una persona fitness", me repet铆a cada vez que ve铆a esas fotos perfectas en Instagram. Mi realidad eran 3 minutos de ejercicio y 20 de excusas.
Un d铆a, mientras sub铆a las escaleras a mi departamento, tuve que detenerme en el segundo piso, jadeando. Mi hijo de 5 a帽os me mir贸 preocupado y me pregunt贸: "驴Mami, est谩s enferma?". Ese momento cambi贸 todo.
FitLife no me prometi贸 un cuerpo de revista, me ofreci贸 algo mejor: la capacidad de jugar con mi hijo sin quedarme sin aliento. Empec茅 con 10 minutos diarios, luego 15, y ahora corremos juntos en el parque.
Comienza tu historia de transformaci贸n hoy. 脷nete a FitLife y descubre c贸mo 15 minutos pueden cambiar tu vida. Primera semana gratis, porque tu bienestar no puede esperar.
"""
}
]
}
}
def generate_story(formula_type, target_audience, product, action, mood, length, story_topic=None):
"""Funci贸n unificada para generar historias"""
model = genai.GenerativeModel("gemini-2.0-flash")
if formula_type not in story_formulas:
raise ValueError("F贸rmula no v谩lida")
# An谩lisis del p煤blico objetivo
audience_analysis = f"""
AN脕LISIS DEL P脷BLICO OBJETIVO: {target_audience}
INSTRUCCIONES DE AN脕LISIS:
1. Dolores y Problemas:
- Identifica los problemas cotidianos espec铆ficos de {target_audience}
- Reconoce sus frustraciones y miedos m谩s profundos
- Analiza las consecuencias emocionales de estos problemas
- Considera el impacto en su vida diaria
2. Creencias y Valores:
- Comprende sus creencias limitantes
- Identifica sus aspiraciones y sue帽os
- Reconoce sus valores fundamentales
- Entiende sus motivaciones principales
3. Situaciones de Vida:
- Visualiza sus rutinas diarias
- Identifica momentos de tensi贸n o conflicto
- Reconoce sus contextos sociales y profesionales
- Comprende sus responsabilidades y presiones
4. Puntos de Dolor Espec铆ficos:
- Problemas pr谩cticos: [analiza sus dificultades concretas]
- Dolores emocionales: [identifica sus preocupaciones m谩s profundas]
- Miedos: [reconoce sus temores principales]
- Frustraciones: [entiende sus obst谩culos recurrentes]
CONTEXTO NARRATIVO:
- Si hay story_topic ("{story_topic if story_topic else 'No especificado'}"),
煤salo como escenario o contexto para desarrollar la historia
- El protagonista debe reflejar fielmente las caracter铆sticas de {target_audience}
- Los problemas y situaciones deben ser 100% reconocibles por la audiencia
- La transformaci贸n debe abordar directamente sus dolores espec铆ficos
"""
# Definir el system prompt dentro de la funci贸n
system_prompt = """You are a world-class copywriter, specialized in crafting persuasive stories that emotionally connect with readers and drive them to action.
FORMAT RULES:
- Story must be structured in clear paragraphs
- Each section must flow naturally into the next
- No explicit section labels
- Maintain consistent tone throughout
- Include smooth transitions between parts
- Story must feel complete and cohesive
IMPORTANT STRUCTURE INSTRUCTIONS:
- The selected formula MUST be applied to the entire story
- Review and follow the structure detailed in story_formulas[formula_type]["description"]
- Use the examples in story_formulas[formula_type]["examples"] as inspiration
- Formula provides the framework, tone provides the emotional layer
- Both must work together seamlessly
IMPORTANT:
- Each story must be unique and memorable
- Avoid clich茅s and generic scenarios
- Maintain a credible and authentic voice
- Adapt language to target audience
- Focus on emotional transformation
- Follow formula structure while maintaining selected tone
- Never explicitly label sections
- Integrate product and call-to-action organically
STORY STRUCTURE GUIDELINES:
1. Study the formula description carefully
2. Review provided examples for style and flow
3. Maintain similar paragraph length and structure
4. Use consistent emotional intensity
5. Mirror the narrative progression
6. Adapt content for target audience while keeping formula essence
TONE AND STYLE:
- Selected tone must remain consistent
- Tone modifies HOW the story is told
- Formula provides structure, tone provides emotion
- Both elements must complement each other
- Maintain voice appropriate for target audience
LANGUAGE INSTRUCTIONS:
- Generate the story in Spanish
- Use natural, fluent Spanish
- Maintain cultural relevance for Spanish-speaking audiences
- Ensure idioms and expressions are appropriate for Spanish
- Keep all story content in Spanish, only system instructions are in English
KEY ELEMENTS TO INCLUDE:
- Emotional hooks that grab attention
- Relatable situations and characters
- Sensory details and vivid descriptions
- Natural problem-solution progression
- Organic product integration
- Compelling but subtle call-to-action"""
story_instruction = f"{system_prompt}\n\n{audience_analysis}\n\n"
# Instrucciones espec铆ficas para GHA cuando hay story_topic
if formula_type == "GHA" and story_topic:
story_instruction += f"""
STORY TOPIC INTEGRATION GUIDELINES:
- The story topic "{story_topic}" MUST be the central theme of the narrative
- Build the entire story around this specific topic/experience
- Use the topic as the main hook to capture attention
- Weave the product naturally into this specific narrative
- Ensure the story feels authentic to the given topic
- Maintain the emotional core of the topic throughout
REQUIRED STORY ELEMENTS:
1. Opening hook must directly relate to "{story_topic}"
2. Story must maintain focus on this specific topic/experience
3. Product integration should feel natural within this context
4. Character development should align with the topic
5. Emotional journey must connect to the specific situation
6. Resolution should tie topic and product together seamlessly
STORY STRUCTURE FOR THIS TOPIC:
1. Hook: Begin with a compelling aspect of {story_topic}
2. Development: Explore the challenges/emotions related to this specific situation
3. Integration: Show how {product} naturally fits into this context
4. Resolution: Demonstrate transformation while staying true to the topic
"""
# A帽adir instrucciones sobre el producto y beneficios
story_instruction += f"""
PRODUCT INTEGRATION GUIDELINES:
- Evita menciones obvias de {product}
- Enf贸cate en despertar inter茅s genuino mostrando beneficios transformacionales
- Integra el producto de manera natural en la narrativa
- Destaca c贸mo el producto mejora la vida del protagonista
- Mant茅n el tono {mood} al describir los beneficios
IMPORTANT REMINDER:
- The entire story must be written in Spanish
- Use natural expressions and cultural references appropriate for Spanish-speaking audiences
- Ensure the story flows naturally in Spanish
"""
# Instrucciones de estudio de ejemplos
story_instruction += f"""
IMPORTANTE: Estudia cuidadosamente estos ejemplos de la f贸rmula seleccionada.
Cada ejemplo representa el estilo y estructura a seguir, adaptados al tono {mood}:
"""
# Seleccionar ejemplos aleatorios
random_examples = random.sample(story_formulas[formula_type]['examples'],
min(3, len(story_formulas[formula_type]['examples'])))
# Agregar ejemplos seleccionados
story_instruction += "\nEJEMPLOS DE LA F脫RMULA A SEGUIR:\n"
for i, example in enumerate(random_examples, 1):
story_instruction += f"""
Ejemplo {i}:
T铆tulo: {example['title']}
Audiencia: {example['target']}
Historia:
{example['story']}
"""
# Agregar instrucciones espec铆ficas
story_instruction += """
INSTRUCCIONES ESPEC脥FICAS:
1. Mant茅n la misma estructura y longitud que los ejemplos anteriores
2. Usa el mismo tono y estilo de escritura, adaptado al mood especificado
3. Replica los patrones de construcci贸n de frases y transiciones
4. Conserva el nivel de especificidad y detalle en las descripciones
5. Adapta el contenido para la audiencia manteniendo la esencia de los ejemplos
6. Integra los beneficios del producto de manera sutil y convincente
7. Asegura que la transformaci贸n del protagonista sea cre铆ble y emotiva
"""
# Agregar la descripci贸n de la f贸rmula
story_instruction += f"\nF脫RMULA A SEGUIR:\n{story_formulas[formula_type]['description']}\n\n"
# Recordatorio final
story_instruction += f"""
RECORDATORIO FINAL:
1. Sigue la estructura de la f贸rmula seleccionada
2. Aplica el tono {mood} de manera consistente
3. Mant茅n la coherencia narrativa
4. Asegura que la historia refleje una transformaci贸n aut茅ntica
5. Integra {product} y sus beneficios de forma natural
6. Culmina con un llamado a la acci贸n convincente: {action}
GENERA AHORA:
Crea una historia persuasiva de {length} palabras en espa帽ol que siga fielmente el estilo y estructura de los ejemplos mostrados,
manteniendo un tono {mood} y enfoc谩ndote en la transformaci贸n que {product} puede traer a la vida de {target_audience}.
IMPORTANT FINAL REMINDER:
- Write the complete story in Spanish
- Ensure natural flow and cultural relevance
- Maintain authentic Spanish expressions and tone
"""
response = model.generate_content([story_instruction])
if response and response.parts:
return response.parts[0].text.strip()
raise ValueError("No se pudo generar la historia")
# Inicializar la aplicaci贸n Streamlit
st.set_page_config(page_title="Generador de Historias", page_icon=":pencil:", layout="wide")
# T铆tulo y subt铆tulo
st.markdown("<h1 style='text-align: center;'>Story Genius Maker</h1>", unsafe_allow_html=True)
st.markdown("<h3 style='text-align: center;'>Teje historias inolvidables en segundos, guiado por la magia de la inteligencia artificial que da vida a tus ideas en relatos cautivadores.</h3>", unsafe_allow_html=True)
# Acorde贸n para elegir la f贸rmula
with st.expander("Selecciona la f贸rmula para generar tu historia"):
# Obtener las f贸rmulas disponibles del diccionario story_formulas y crear nombres de visualizaci贸n
available_formulas = list(story_formulas.keys())
formula_display_names = []
formula_mapping = {}
# Crear mapeo entre nombres de visualizaci贸n y claves internas
for formula in available_formulas:
display_name = '.'.join(list(formula)) if formula.isupper() else formula
formula_display_names.append(display_name)
formula_mapping[display_name] = formula
# Radio button con nombres de visualizaci贸n
formula = st.radio(
"Selecciona la f贸rmula para generar tu historia:",
formula_display_names
)
# Obtener la clave interna correspondiente al nombre seleccionado
selected_formula = formula_mapping[formula]
# Crear las columnas para el dise帽o (40% para la izquierda, 60% para la derecha)
col1, col2 = st.columns([2, 3])
# Cambiar el comportamiento del slider cuando se seleccione "GHA"
with col1:
target_audience = st.text_input("P煤blico objetivo",
placeholder="驴A qui茅n est谩 dirigido tu mensaje?")
product = st.text_input("Producto/Servicio",
placeholder="驴Qu茅 est谩s ofreciendo?")
action = st.text_area("Llamado a la acci贸n",
placeholder="驴Qu茅 acci贸n espec铆fica debe tomar tu audiencia?")
# Personalizaci贸n adicional
with st.expander("Personaliza tu historia"):
mood = st.selectbox("Tono de la historia:",
["Emocional", "Triste", "Feliz", "Horror", "Comedia", "Rom谩ntico"])
# Ajustar el slider seg煤n la f贸rmula seleccionada
if selected_formula == "GHA":
length = st.slider("Longitud de la historia (palabras):",
min_value=50, max_value=200, value=150, step=10)
else:
length = st.slider("Longitud de la historia (palabras):",
min_value=50, max_value=150, value=100, step=10)
# Mostrar campo adicional solo para GHA
story_topic = None
if selected_formula == "GHA":
story_topic = st.text_area(
"De qu茅 quieres que trate la historia",
placeholder="Explica si hay algo espec铆fico sobre lo que te gustar铆a contar (puede ser una vivencia personal, pel铆cula, cuento, personaje ficticio, etc.)."
)
# Bot贸n para generar contenido
submit = st.button("Generar mi historia")
# Mostrar el contenido generado en la columna derecha (col2)
with col2:
if submit:
if target_audience and product and action:
try:
# Verificar si es GHA y necesita story_topic
if selected_formula == "GHA":
if story_topic:
response = generate_story(selected_formula, target_audience, product,
action, mood, length, story_topic)
else:
st.error("Por favor, completa todos los campos requeridos para la f贸rmula G.H.A.")
response = ""
else:
response = generate_story(selected_formula, target_audience, product,
action, mood, length)
if response:
st.subheader("Historia generada:")
st.write(response)
except ValueError as e:
st.error(f"Error: {str(e)}")
else:
st.error("Por favor, completa todos los campos requeridos (P煤blico objetivo, Producto y Acci贸n).")