Upload 9 files
Browse files- app.py +69 -12
- formulas/email_formulas.py +0 -0
app.py
CHANGED
|
@@ -22,7 +22,7 @@ genai.configure(api_key=os.getenv("GOOGLE_API_KEY"))
|
|
| 22 |
# email_formulas dictionary has been moved to formulas/email_formulas.py
|
| 23 |
|
| 24 |
# Cambiar el nombre de la función
|
| 25 |
-
def generate_emails(target_audience, product, temperature, selected_formula, selected_angle, file_content="", image_parts=None, is_image=False, emotion="", desired_action="", creative_idea=""):
|
| 26 |
# Crear la configuración del modelo
|
| 27 |
generation_config = {
|
| 28 |
"temperature": temperature,
|
|
@@ -54,8 +54,44 @@ FORMAT RULES:
|
|
| 54 |
# Incluir las instrucciones del sistema en el prompt principal
|
| 55 |
system_prompt = f"""You are a world-class direct response copywriter trained by Gary Halbert, Gary Bencivenga, and David Ogilvy.
|
| 56 |
|
| 57 |
-
You
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
|
| 60 |
{format_instructions}
|
| 61 |
|
|
@@ -116,12 +152,25 @@ CREATIVE CONCEPT:
|
|
| 116 |
Use the following creative concept as the central theme for all emails in the sequence:
|
| 117 |
"{creative_idea}"
|
| 118 |
|
| 119 |
-
CREATIVE CONCEPT
|
| 120 |
-
1.
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
"""
|
| 126 |
|
| 127 |
# Añadir contenido del archivo si existe
|
|
@@ -430,10 +479,17 @@ with col1:
|
|
| 430 |
# 5. Emoción
|
| 431 |
emotion = st.selectbox(
|
| 432 |
"¿Qué emoción quieres evocar?",
|
| 433 |
-
options=["Curiosidad", "Miedo", "Esperanza", "Entusiasmo", "Confianza", "Urgencia"],
|
| 434 |
key="emotion_selectbox" # Add a unique key
|
| 435 |
)
|
| 436 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 437 |
# 6. Creatividad (slider)
|
| 438 |
temperature = st.slider("Creatividad", min_value=0.0, max_value=2.0, value=1.0, step=0.1)
|
| 439 |
|
|
@@ -481,7 +537,7 @@ if submit:
|
|
| 481 |
# Use spinner within col2 context
|
| 482 |
with col2:
|
| 483 |
with st.spinner("Creando los emails..."):
|
| 484 |
-
# Update the function call to include
|
| 485 |
generated_emails = generate_emails(
|
| 486 |
target_audience,
|
| 487 |
product,
|
|
@@ -493,7 +549,8 @@ if submit:
|
|
| 493 |
is_image,
|
| 494 |
emotion,
|
| 495 |
desired_action,
|
| 496 |
-
creative_idea
|
|
|
|
| 497 |
)
|
| 498 |
|
| 499 |
# Check if the response starts with "Error:"
|
|
|
|
| 22 |
# email_formulas dictionary has been moved to formulas/email_formulas.py
|
| 23 |
|
| 24 |
# Cambiar el nombre de la función
|
| 25 |
+
def generate_emails(target_audience, product, temperature, selected_formula, selected_angle, file_content="", image_parts=None, is_image=False, emotion="", desired_action="", creative_idea="", brand_tone=""):
|
| 26 |
# Crear la configuración del modelo
|
| 27 |
generation_config = {
|
| 28 |
"temperature": temperature,
|
|
|
|
| 54 |
# Incluir las instrucciones del sistema en el prompt principal
|
| 55 |
system_prompt = f"""You are a world-class direct response copywriter trained by Gary Halbert, Gary Bencivenga, and David Ogilvy.
|
| 56 |
|
| 57 |
+
You understand how real people interact with emails in their busy inboxes:
|
| 58 |
+
- They quickly scan and delete anything that looks like generic marketing
|
| 59 |
+
- They only open emails that feel personal or spark genuine curiosity
|
| 60 |
+
- They respond to messages that seem written by a real person, not a corporation
|
| 61 |
+
- They engage with content that hooks them from the first line and maintains interest
|
| 62 |
+
|
| 63 |
+
Your task is to create a 5-email sequence that makes {target_audience} feel {'' if emotion == 'NINGUNO' else emotion + ' '}about {product} and convince them to {desired_action}.
|
| 64 |
+
|
| 65 |
+
AUDIENCE-SPECIFIC LANGUAGE ADAPTATION:
|
| 66 |
+
- Analyze the language patterns typical of {target_audience} and mirror them in your writing
|
| 67 |
+
- Adjust formality level based on audience demographics (more formal for professionals/executives, more casual for younger audiences)
|
| 68 |
+
- Use vocabulary, references, and examples that will resonate specifically with {target_audience}
|
| 69 |
+
- Match the communication style preferences of this audience (direct vs indirect, detailed vs concise)
|
| 70 |
+
- Include cultural touchpoints or shared experiences relevant to this specific audience
|
| 71 |
+
"""
|
| 72 |
+
|
| 73 |
+
# Add brand tone instructions only if a specific tone is selected
|
| 74 |
+
if brand_tone != "NINGUNO":
|
| 75 |
+
system_prompt += f"""
|
| 76 |
+
BRAND TONE: {brand_tone}
|
| 77 |
+
- Write all emails using a consistent {brand_tone} tone of voice
|
| 78 |
+
- Ensure language, expressions, and style reflect this tone throughout
|
| 79 |
+
- Maintain this tone while still being persuasive and effective
|
| 80 |
+
"""
|
| 81 |
+
|
| 82 |
+
system_prompt += f"""
|
| 83 |
+
Each email must follow these four essential actions:
|
| 84 |
+
1. ATTRACT with a subject line that feels personal and creates curiosity (never screaming "Buy me!")
|
| 85 |
+
2. CONNECT through rhythm, emotion, and storytelling that maintains interest until the end
|
| 86 |
+
3. CONVINCE with authentic language that feels believable and relevant
|
| 87 |
+
4. GUIDE to action naturally, making readers click almost without realizing it
|
| 88 |
+
|
| 89 |
+
WRITING STYLE:
|
| 90 |
+
- Write as if speaking to one person, not an audience
|
| 91 |
+
- Vary sentence length deliberately (mix short punchy sentences with occasional longer ones)
|
| 92 |
+
- Create natural paragraph rhythm (1-3 sentences per paragraph)
|
| 93 |
+
- Use conversational transitions between ideas
|
| 94 |
+
- Include specific details that make scenarios feel real
|
| 95 |
|
| 96 |
{format_instructions}
|
| 97 |
|
|
|
|
| 152 |
Use the following creative concept as the central theme for all emails in the sequence:
|
| 153 |
"{creative_idea}"
|
| 154 |
|
| 155 |
+
CREATIVE CONCEPT INTEGRATION:
|
| 156 |
+
1. WEAVING TECHNIQUE: Integrate this concept naturally throughout each email:
|
| 157 |
+
* Use it as a metaphor or analogy that connects to your product benefits
|
| 158 |
+
* Reference it in subject lines to create continuity across the sequence
|
| 159 |
+
* Develop different aspects of this concept in each email
|
| 160 |
+
|
| 161 |
+
2. PROGRESSIVE DEVELOPMENT:
|
| 162 |
+
* Email 1: Introduce the concept in a simple, intriguing way
|
| 163 |
+
* Email 2: Expand on the concept, showing its relevance to the audience's situation
|
| 164 |
+
* Email 3: Deepen the concept by connecting it to specific product features
|
| 165 |
+
* Email 4: Apply the concept to overcome common objections
|
| 166 |
+
* Email 5: Bring the concept full circle, using it to drive the final call to action
|
| 167 |
+
|
| 168 |
+
3. CREATIVE CONCEPT EXAMPLES:
|
| 169 |
+
* "Life is a journey" → Email 1 focuses on starting points, Email 5 on destinations
|
| 170 |
+
* "Your business as a garden" → Email 1 plants seeds, Email 5 shows full bloom
|
| 171 |
+
* "Breaking through walls" → Email 1 identifies walls, Email 5 celebrates freedom
|
| 172 |
+
|
| 173 |
+
The concept should make your emails more memorable, cohesive, and engaging while naturally leading to your product as the solution.
|
| 174 |
"""
|
| 175 |
|
| 176 |
# Añadir contenido del archivo si existe
|
|
|
|
| 479 |
# 5. Emoción
|
| 480 |
emotion = st.selectbox(
|
| 481 |
"¿Qué emoción quieres evocar?",
|
| 482 |
+
options=["NINGUNO", "Curiosidad", "Miedo", "Esperanza", "Entusiasmo", "Confianza", "Urgencia"],
|
| 483 |
key="emotion_selectbox" # Add a unique key
|
| 484 |
)
|
| 485 |
|
| 486 |
+
# Añadir selector de tono de marca
|
| 487 |
+
brand_tone = st.selectbox(
|
| 488 |
+
"Tono de marca",
|
| 489 |
+
options=["NINGUNO", "Profesional", "Conversacional", "Entusiasta", "Formal", "Informal", "Humorístico", "Sarcástico", "Serio", "Inspirador", "Educativo"],
|
| 490 |
+
key="brand_tone_selectbox"
|
| 491 |
+
)
|
| 492 |
+
|
| 493 |
# 6. Creatividad (slider)
|
| 494 |
temperature = st.slider("Creatividad", min_value=0.0, max_value=2.0, value=1.0, step=0.1)
|
| 495 |
|
|
|
|
| 537 |
# Use spinner within col2 context
|
| 538 |
with col2:
|
| 539 |
with st.spinner("Creando los emails..."):
|
| 540 |
+
# Update the function call to include brand_tone
|
| 541 |
generated_emails = generate_emails(
|
| 542 |
target_audience,
|
| 543 |
product,
|
|
|
|
| 549 |
is_image,
|
| 550 |
emotion,
|
| 551 |
desired_action,
|
| 552 |
+
creative_idea,
|
| 553 |
+
brand_tone # Add the brand tone parameter
|
| 554 |
)
|
| 555 |
|
| 556 |
# Check if the response starts with "Error:"
|
formulas/email_formulas.py
CHANGED
|
The diff for this file is too large to render.
See raw diff
|
|
|