Spaces:
Sleeping
Sleeping
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).") | |