File size: 23,148 Bytes
91a0d7e
a8fd769
 
 
1c11e93
d51e47b
 
a8fd769
d51e47b
de356ae
 
 
241c725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de356ae
 
c868d6c
 
 
 
 
 
 
 
5668ab1
 
c868d6c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241c725
 
5668ab1
 
 
241c725
5668ab1
 
 
241c725
5668ab1
241c725
5668ab1
 
 
 
 
 
 
 
 
 
 
 
 
241c725
5668ab1
241c725
5668ab1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241c725
 
 
 
 
 
 
2bef2ae
241c725
 
2bef2ae
ea8d9b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b44807b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc96b9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f64c5bf
 
 
 
 
 
 
bc96b9a
 
 
 
 
 
 
875b3a0
b44807b
241c725
e6db63d
 
fd06656
 
 
 
 
 
 
 
 
 
e6db63d
 
 
 
 
 
 
 
 
 
 
 
 
 
875b3a0
241c725
875b3a0
 
 
 
 
 
f64c5bf
 
 
 
 
875b3a0
241c725
875b3a0
 
 
 
241c725
063a515
875b3a0
 
 
 
 
 
 
241c725
875b3a0
 
 
5668ab1
875b3a0
241c725
 
 
875b3a0
 
 
 
 
 
 
 
 
 
241c725
522d135
875b3a0
 
52fe894
875b3a0
 
 
 
 
 
 
 
 
 
 
f64c5bf
875b3a0
52fe894
f64c5bf
 
 
 
 
ea8d9b4
 
 
 
241c725
52fe894
 
 
6c969bc
1ff0df4
522d135
d51e47b
ae4c2eb
 
 
bef3dc5
34cb5f8
 
a8fd769
8ac4d65
34cb5f8
8ac4d65
 
 
 
 
 
60ce54c
34cb5f8
 
d0e8042
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8ac4d65
 
1da5874
8ac4d65
 
 
1da5874
8ac4d65
 
34cb5f8
d0e8042
8ac4d65
 
 
 
 
 
34cb5f8
 
 
 
 
 
 
 
 
8ac4d65
 
34cb5f8
8ac4d65
 
34cb5f8
 
 
8ac4d65
 
 
ec618b2
34cb5f8
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
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 con un titular
       - Que 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": "Congreso de Marketing Digital 2024",
                "target": "Marketers y dueños de negocio",
                "action": "Comprar entrada Early Bird con 40% descuento",
                "story": """
                El evento que convierte estrategias obsoletas en casos de éxito viral
                
                Mis campañas de marketing parecían gritar en un cuarto vacío. Mientras otros conseguían resultados espectaculares, yo seguía atascado con las mismas métricas mediocres. Los cursos online y tutoriales de YouTube solo me daban fragmentos del puzzle.

                Todo cambió cuando asistí a mi primer congreso de marketing. En dos días, aprendí más que en meses de autoaprendizaje. Las conexiones que hice me abrieron puertas que ni sabía que existían, y las estrategias que implementé triplicaron mis resultados en 90 días.

                Asegura tu lugar en el Congreso de Marketing Digital 2024 con precio Early Bird (40% descuento). Incluye acceso a todas las conferencias, networking VIP y grabaciones exclusivas. ¡Últimas 50 entradas disponibles!
                """
            },
            {
                "title": "Curso de Fotografía con Celular",
                "target": "Aficionados a la fotografía con presupuesto limitado",
                "action": "Inscribirse a la masterclass con 50% de descuento",
                "story": """
                Tu celular tiene más potencial que esa cámara profesional que nunca te animaste a comprar
                
                Mi Instagram parecía el muro de los lamentos fotográficos: fotos movidas, mal iluminadas y con zoom digital que las hacía parecer pinturas impresionistas. Cada vez que veía las fotos espectaculares de otros, me convencía de que necesitaba una cámara profesional (que nunca podría pagar).

                Todo cambió cuando descubrí que mi "simple" celular tenía funciones que ni siquiera sabía que existían. Con algunos ajustes básicos y técnicas específicas, mis fotos comenzaron a destacar. Ahora, mis seguidores me preguntan qué cámara uso, y sonrío al decirles que es el mismo celular que uso para pedir comida a domicilio.

                Aprovecha el 50% de descuento en la masterclass de esta semana y descubre el fotógrafo que llevas dentro. Incluye guía de configuración personalizada para tu modelo de celular y acceso a nuestra comunidad privada de fotógrafos móviles.
                """
            },
            {
                "title": "Webinar: Ventas con LinkedIn",
                "target": "Emprendedores y profesionales de ventas",
                "action": "Registrarse al webinar gratuito",
                "story": """
                El perfil de LinkedIn que genera más ventas que un equipo comercial completo

                Pasaba horas enviando mensajes fríos en LinkedIn sin respuesta. Mi perfil parecía más un currículum abandonado que una herramienta de ventas. Mientras otros cerraban deals importantes, yo apenas conseguía algunas vistas a mi perfil.

                La revelación llegó cuando un mentor me mostró cómo había conseguido 15 clientes en un mes solo optimizando su perfil de LinkedIn. Implementé sus estrategias y en dos semanas ya tenía 3 reuniones agendadas con clientes potenciales.

                Regístrate gratis a nuestro webinar este jueves y descubre las 3 estrategias que están revolucionando las ventas en LinkedIn. Incluye plantillas de mensajes probados y guía de optimización de perfil. ¡Plazas limitadas!
                """
            },
            {
                "title": "Silla Ergonómica ProComfort",
                "target": "Profesionales que trabajan desde casa",
                "action": "Comprar con 30% de descuento y envío gratis",
                "story": """
                La silla que transformó mi dolor de espalda en productividad

                Mi espalda me recordaba cada día que trabajar desde la silla del comedor era una mala idea. Los dolores comenzaban a media mañana y para la tarde ya estaba más concentrado en mi postura que en mi trabajo. Los masajes y estiramientos solo eran soluciones temporales.

                Cuando finalmente invertí en una silla ergonómica profesional, el cambio fue inmediato. No solo desapareció el dolor, sino que mi productividad aumentó. Ahora puedo concentrarme en mis proyectos sin interrupciones y terminar mi jornada sintiéndome energizado.

                Aprovecha 30% de descuento en la Silla ProComfort y transforma tu espacio de trabajo. Incluye envío gratuito, garantía de 5 años y guía de ajuste personalizado. ¡Stock limitado!
                """
            },
        ]
    }
}

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")

    # Añadir instrucciones de naturalidad al inicio del prompt
    natural_instruction = f"""
IMPORTANTE - NATURALIDAD EN LA HISTORIA:
- NO menciones "{product}" de forma literal o forzada
- Introduce el producto/servicio de manera sutil y orgánica en la narrativa
- Evita que suene como una fórmula publicitaria
- La solución debe surgir naturalmente de la historia
- Usa variaciones y descripciones naturales en lugar del nombre exacto
- La historia debe fluir como una conversación real, no como un anuncio

Por ejemplo, si el producto es "Webinar sobre Yoga":
❌ "Entonces descubrí el Webinar sobre Yoga"
✅ "Encontré estas clases en línea donde aprendí a conectar con mi cuerpo"

Si es un curso:
❌ "Me inscribí en el Curso de Marketing Digital"
✅ "Comencé a aprender sobre el mundo del marketing en línea"
"""
    
    # 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']}
Acción: {example['action']}
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
"""

    # Asegúrate de que las instrucciones de naturalidad estén al inicio del prompt
    story_instruction = f"{natural_instruction}\n\n{story_instruction}"
    
    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)

# 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"):
        # Código de selección de fórmula movido aquí
        available_formulas = list(story_formulas.keys())
        formula_display_names = []
        formula_mapping = {}

        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

        formula = st.radio(
            "Selecciona la fórmula para generar tu historia:",
            formula_display_names
        )

        selected_formula = formula_mapping[formula]

        # Resto de las opciones de personalización
        mood = st.selectbox("Tono de la historia:",
                           ["Emocional", "Triste", "Feliz", "Horror", "Comedia", "Romántico"])

        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)

    # Campo story_topic fuera del expander pero dependiente de la fórmula seleccionada
    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).")