File size: 16,827 Bytes
91a0d7e
a8fd769
 
 
1c11e93
d51e47b
 
a8fd769
d51e47b
de356ae
 
 
241c725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de356ae
 
 
241c725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2bef2ae
241c725
 
2bef2ae
bc96b9a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f64c5bf
 
 
 
 
 
 
bc96b9a
 
 
 
 
 
 
875b3a0
241c725
 
e6db63d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
875b3a0
241c725
875b3a0
 
 
 
 
 
f64c5bf
 
 
 
 
875b3a0
241c725
875b3a0
 
 
 
241c725
063a515
875b3a0
 
 
 
 
 
 
241c725
875b3a0
 
 
 
241c725
 
 
875b3a0
 
 
 
 
 
 
 
 
 
241c725
522d135
875b3a0
 
52fe894
875b3a0
 
 
 
 
 
 
 
 
 
 
f64c5bf
875b3a0
52fe894
f64c5bf
 
 
 
 
241c725
52fe894
 
 
6c969bc
1ff0df4
522d135
d51e47b
ae4c2eb
 
 
bef3dc5
070b033
 
af53b67
8ac4d65
af53b67
 
 
 
 
 
 
 
8ac4d65
af53b67
151411d
8ac4d65
 
 
af53b67
 
 
85052d2
34cb5f8
 
a8fd769
8ac4d65
34cb5f8
8ac4d65
 
 
 
 
 
60ce54c
34cb5f8
 
8ac4d65
 
1da5874
 
8ac4d65
 
 
1da5874
8ac4d65
 
34cb5f8
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
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 psicolog铆a narrativa y el poder de la identificaci贸n personal.

        ESTRUCTURA:
        1. Gancho:
           - Abre con un elemento sorpresa o intriga
           - Genera curiosidad inmediata
           - Plantea una pregunta o situaci贸n provocativa
           - Conecta emocionalmente desde la primera l铆nea

        2. Historia:
           - Desarrolla una narrativa personal o relatable
           - Incluye elementos de conflicto y superaci贸n
           - Mantiene la tensi贸n narrativa
           - Incorpora detalles sensoriales y emocionales

        3. Acci贸n:
           - Surge naturalmente de la resoluci贸n
           - Conecta la moraleja con la soluci贸n
           - Motiva desde la inspiraci贸n
           - Propone un camino claro hacia el cambio
        """,
        "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")

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

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