File size: 14,178 Bytes
91a0d7e
a8fd769
 
 
d51e47b
 
a8fd769
d51e47b
659c702
 
de356ae
659c702
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de356ae
659c702
de356ae
659c702
 
de356ae
659c702
 
 
de356ae
 
 
 
2bef2ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de356ae
 
 
 
2bef2ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
de356ae
2bef2ae
 
 
de356ae
2bef2ae
 
 
 
de356ae
2bef2ae
 
de356ae
 
 
522d135
ec618b2
de356ae
6c969bc
063a515
de356ae
 
522d135
52fe894
6c969bc
2bef2ae
6c969bc
2bef2ae
6c969bc
 
2bef2ae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6c969bc
52fe894
 
 
 
 
 
 
6c969bc
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
from dotenv import load_dotenv
import streamlit as st
import os
import google.generativeai as genai

load_dotenv()
genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))

system_prompt = """You are a world-class copywriter, specialized in creating persuasive and captivating stories that emotionally connect with readers and effectively convey messages.

FORMAT RULES:
- Story must follow the selected formula structure
- Use clear and well-defined paragraphs
- Maintain coherent narrative flow
- Include smooth transitions between sections
- Avoid unnecessary jargon or complex language
- Naturally weave the product and call-to-action into the narrative
- Never explicitly mention "this is the product" or "this is the call-to-action"

TONE INSTRUCTIONS:
- Selected tone must remain consistent throughout the story
- Tone modifies HOW the narrative is expressed, not its structure
- Think of tone as an "emotional layer" over the formula
- Formula provides structure, tone provides style
- Both elements must work seamlessly together

KEY ELEMENTS:
- Impactful opening that grabs attention
- Clear and progressive narrative development
- Emotional connection with target audience
- Natural integration of product/service benefits
- Subtle but effective call-to-action woven into the story
- Transformation journey that leads to the solution

STORYTELLING GUIDELINES:
- Build tension and resolution naturally
- Create relatable scenarios and characters
- Show don't tell (especially for product benefits)
- Use sensory details and emotional triggers
- Lead to the call-to-action organically

IMPORTANT:
- Each story must be unique and memorable
- Avoid clich茅s and generalities
- Maintain a credible and authentic tone
- Adapt language to target audience
- Focus on transformative benefits
- Follow formula structure while maintaining chosen tone
- Never make the product placement feel forced
- Ensure call-to-action feels like a natural next step in the story"""

story_formulas = {
    "PASA": {
        "description": """
        La f贸rmula P.A.S.A. es una estructura narrativa que convierte problemas en soluciones convincentes.

        Ejemplo para un producto de gesti贸n del tiempo:

        1. **Problema**:
           "Mar铆a nunca tiene tiempo suficiente. Entre reuniones interminables y deadlines ajustados,
           apenas puede respirar. Su bandeja de entrada est谩 desbordada y su lista de pendientes crece sin control."

        2. **Agitaci贸n**:
           "Las noches en vela se volvieron rutina. Sus hijos la extra帽an en los eventos escolares,
           y ese proyecto personal que tanto anhela sigue guardado en un caj贸n. El estr茅s comienza
           a afectar su salud y relaciones."

        3. **Soluci贸n**:
           "Todo cambi贸 cuando descubri贸 TimeFlow. Este sistema intuitivo reorganiz贸 su d铆a
           autom谩ticamente, priorizando lo importante y eliminando distracciones. Sus reuniones
           ahora son productivas y sus tareas fluyen naturalmente."

        4. **Acci贸n**:
           "脷nete a los profesionales que recuperaron el control de su tiempo.
           Prueba TimeFlow gratis durante 14 d铆as y transforma tu productividad sin riesgo."

        Otro ejemplo para un servicio de coaching financiero:

        1. **Problema**:
           "Carlos revisa su cuenta bancaria con temor. Cada mes es una lucha para llegar a fin de mes,
           a pesar de tener un buen salario. Las deudas se acumulan y los ahorros son inexistentes."

        2. **Agitaci贸n**:
           "El miedo a una emergencia lo mantiene despierto. Sus sue帽os de comprar una casa
           parecen cada vez m谩s lejanos. La culpa por no poder dar a su familia la vida que merecen
           lo consume cada d铆a."

        3. **Soluci贸n**:
           "Al trabajar con FinanzasPro, Carlos descubri贸 que peque帽os cambios generan grandes resultados.
           Su asesor personal dise帽贸 un plan realista que le permiti贸 eliminar deudas mientras constru铆a
           un futuro financiero s贸lido."

        4. **Acci贸n**:
           "Agenda tu consulta gratuita hoy y recibe tu plan financiero personalizado.
           Tu libertad financiera comienza con una simple decisi贸n."
        """
    },
    "GHA": {
        "description": """
        La f贸rmula G.H.A. captura la atenci贸n y motiva a trav茅s de historias memorables.

        Ejemplo para un curso de fotograf铆a:

        1. **Gancho**:
           "驴Alguna vez has visto una foto tan perfecta que parece magia?
           Yo tambi茅n pensaba que esas im谩genes eran imposibles... hasta que descubr铆 el secreto."

        2. **Historia**:
           "Mi primera c谩mara fue un desastre. Fotos borrosas, mal iluminadas, sin vida.
           Pero un encuentro casual con un fot贸grafo callejero cambi贸 todo.
           Me ense帽贸 que la fotograf铆a no se trata de equipos caros, sino de entender la luz y el momento."

        3. **Acci贸n**:
           "Ahora comparto esos secretos en mi taller 'Fotograf铆a con Alma'.
           脷nete y descubre c贸mo capturar momentos inolvidables con cualquier c谩mara."

        Ejemplo para un producto de bienestar:

        1. **Gancho**:
           "El d铆a que mi espalda me traicion贸 en medio de una presentaci贸n importante,
           supe que algo ten铆a que cambiar."

        2. **Historia**:
           "Prob茅 de todo: medicamentos, terapias, ejercicios... Nada funcionaba a largo plazo.
           La frustraci贸n me llev贸 a investigar t茅cnicas ancestrales de sanaci贸n,
           donde encontr茅 una soluci贸n sorprendentemente simple."

        3. **Acci贸n**:
           "Descubre c贸mo 5 minutos diarios pueden transformar tu salud.
           Prueba MindBody+ y recupera tu vitalidad naturalmente."
        """
    }
}

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

    if formula_type == "PASA":
        prompt = f"""
        Eres un copywriter experto especializado en crear historias persuasivas y memorables. Crea una historia cautivadora en espa帽ol de {length} palabras con un tono {mood} que siga la f贸rmula P.A.S.A.

        AUDIENCIA OBJETIVO:
        {target_audience}

        ESTRUCTURA P.A.S.A. (integrar de manera natural, sin mencionar expl铆citamente las secciones):

        1. PROBLEMA (25% de la historia):
        * Identifica y describe v铆vidamente el dolor principal de {target_audience}
        * Presenta una situaci贸n problem谩tica actual y relatable
        * Expone frustraciones y desaf铆os diarios espec铆ficos
        * Revela miedos ocultos y preocupaciones profundas
        * Describe las luchas cotidianas con detalles sensoriales
        * Menciona deseos no cumplidos que resuenan con la audiencia

        2. AGITACI脫N (30% de la historia):
        * Profundiza en el impacto emocional del problema
        * Muestra consecuencias en relaciones personales y profesionales
        * Describe el costo de la inacci贸n y oportunidades perdidas
        * Explora implicaciones futuras si el problema persiste
        * Detalla efectos en la vida social y personal
        * Presenta el "punto de quiebre" emocional

        3. SOLUCI脫N (25% de la historia):
        * Introduce sutilmente '{product}' como la respuesta natural
        * Describe la transformaci贸n y el viaje hacia el 茅xito
        * Presenta beneficios clave a trav茅s de historias de 茅xito
        * Destaca la propuesta de valor 煤nica
        * Menciona puntos de alivio inmediato
        * Incluye elementos de prueba social sutiles
        * Enfatiza ventajas a largo plazo

        4. ACCI脫N (20% de la historia):
        * Integra naturalmente '{action}' como siguiente paso l贸gico
        * Crea sentido de urgencia sin presi贸n
        * Presenta beneficios inmediatos de actuar ahora
        * Incluye elementos de reversi贸n de riesgo
        * Hace que la implementaci贸n parezca f谩cil y accesible
        * Motiva a trav茅s de la satisfacci贸n emocional

        ELEMENTOS ESTIL脥STICOS:
        * Usa lenguaje sensorial y descriptivo
        * Incluye di谩logo interno o pensamientos del personaje
        * Crea tensi贸n narrativa y resoluci贸n
        * Mant茅n un arco narrativo coherente
        * Usa met谩foras y analog铆as relevantes
        * Incorpora detalles espec铆ficos de la industria/contexto

        TONO Y ESTILO:
        * Mant茅n el tono {mood} consistente
        * Usa lenguaje que resuene con {target_audience}
        * Evita clich茅s y frases trilladas
        * Crea una voz narrativa aut茅ntica
        * Incluye elementos de storytelling modernos
        * Mant茅n un ritmo din谩mico

        IMPORTANTE:
        * La historia debe fluir naturalmente entre secciones
        * Evita mencionar expl铆citamente "problema", "agitaci贸n", "soluci贸n" o "acci贸n"
        * Integra el producto y llamado a la acci贸n de manera org谩nica
        * Usa ejemplos espec铆ficos y situaciones reales
        * Mant茅n un balance entre emoci贸n y racionalidad
        * Crea una conexi贸n emocional inmediata
        """
    else:
        formula_description = story_formulas[formula_type]["description"]
        prompt = f"""{system_prompt}

Como experto copywriter, crea una historia persuasiva en espa帽ol de {length} palabras con un tono {mood}, siguiendo la estructura:

{formula_description}

P煤blico objetivo: {target_audience}
Producto/Servicio: {product}
Llamada a acci贸n: {action}
"""

        if formula_type == "GHA" and story_topic:
            prompt += f"\nTema de la historia: {story_topic}"

    response = model.generate_content([prompt])
    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).")