Spaces:
Sleeping
Sleeping
Update formulas.py
Browse files- formulas.py +79 -15
formulas.py
CHANGED
@@ -13,6 +13,62 @@ CRITICAL OUTPUT RULES:
|
|
13 |
- Do not include phrases like "Aqu铆 tienes una oferta convincente" or "Esta es tu oferta"
|
14 |
"""
|
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
def create_offer_instruction(avatar_description, product_name, selected_formula_name):
|
17 |
"""
|
18 |
Creates instructions for generating an offer based on the selected formula.
|
@@ -25,6 +81,9 @@ def create_offer_instruction(avatar_description, product_name, selected_formula_
|
|
25 |
Returns:
|
26 |
str: Complete instruction for generating the offer
|
27 |
"""
|
|
|
|
|
|
|
28 |
# Get the selected formula
|
29 |
selected_formula = offer_formulas[selected_formula_name]
|
30 |
|
@@ -34,16 +93,14 @@ def create_offer_instruction(avatar_description, product_name, selected_formula_
|
|
34 |
additional_instructions = """
|
35 |
SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
36 |
1. PRODUCT/SERVICE NAME HANDLING:
|
37 |
-
- If
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
* Is specific to the niche or industry mentioned in avatar_description
|
43 |
-
- If product_name contains a full phrase like "Un curso llamado Ingl茅s sin problemas", extract only the real name ("Ingl茅s sin problemas")
|
44 |
|
45 |
2. Analyze ALL available information:
|
46 |
-
- Product/service name (
|
47 |
- Target audience description (avatar_description)
|
48 |
- Content from uploaded files (if any)
|
49 |
|
@@ -54,7 +111,7 @@ SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
|
54 |
|
55 |
4. Create a comprehensive offer by combining:
|
56 |
- The appropriate type (determined in step 3)
|
57 |
-
- The
|
58 |
- A compelling dream based on avatar_description
|
59 |
- A relevant obstacle based on avatar_description
|
60 |
|
@@ -77,23 +134,30 @@ SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
|
77 |
- "Ahora puedes acceder a un..."
|
78 |
- "Tenemos para ti un..."
|
79 |
- "Disfruta de un..."
|
80 |
-
"""
|
81 |
|
82 |
elif selected_formula_name == "Oferta Dorada":
|
83 |
additional_instructions = """
|
84 |
SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
85 |
-
1.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
- Analyze the avatar_description DEEPLY to understand their specific pain points, frustrations, and desires
|
87 |
- Select a powerful attention hook that DIRECTLY connects with the avatar's current reality
|
88 |
- DO NOT use questions as hooks - use statements, statistics, or shocking revelations instead
|
89 |
- CUSTOMIZE the hook specifically for this avatar - don't use generic examples
|
90 |
- The hook MUST address the SAME problem that your promise will solve
|
91 |
|
92 |
-
|
93 |
- The attention hook, quantifiable promise, and benefit statement MUST all address the SAME problem
|
94 |
- Create a LOGICAL PROGRESSION from problem (hook) to solution (promise) to implementation (benefit)
|
95 |
|
96 |
-
|
97 |
- Is written COMPLETELY IN CAPITAL LETTERS
|
98 |
- Includes concrete numbers (money, time, results)
|
99 |
- Uses powerful action verbs (EARN, MULTIPLY, ACHIEVE, MASTER)
|
@@ -102,12 +166,12 @@ SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
|
102 |
- NEVER uses exclamation marks (!)
|
103 |
- DIRECTLY addresses the same problem mentioned in the hook
|
104 |
|
105 |
-
|
106 |
- Clearly explains the result they will obtain
|
107 |
- Includes an authority element (proven method, studies, experience)
|
108 |
- Establishes a realistic timeframe or effort needed
|
109 |
- CONTINUES the same theme established in the hook and promise
|
110 |
-
"""
|
111 |
|
112 |
# Create the instruction using the system prompt at the beginning
|
113 |
instruction = f"""{offer_system_prompt}
|
|
|
13 |
- Do not include phrases like "Aqu铆 tienes una oferta convincente" or "Esta es tu oferta"
|
14 |
"""
|
15 |
|
16 |
+
def extract_product_name(product_name_input):
|
17 |
+
"""
|
18 |
+
Extracts the actual product name from user input, especially when it's enclosed in quotes.
|
19 |
+
|
20 |
+
Args:
|
21 |
+
product_name_input: The raw input string containing the product name
|
22 |
+
|
23 |
+
Returns:
|
24 |
+
str: The extracted product name, or empty string if generic
|
25 |
+
"""
|
26 |
+
import re
|
27 |
+
|
28 |
+
# If input is empty or None, return empty string
|
29 |
+
if not product_name_input or product_name_input.strip() == "":
|
30 |
+
return ""
|
31 |
+
|
32 |
+
# Check if there's a name in quotes
|
33 |
+
quote_pattern = r'"([^"]+)"'
|
34 |
+
matches = re.findall(quote_pattern, product_name_input)
|
35 |
+
|
36 |
+
if matches:
|
37 |
+
# Return the first quoted string found
|
38 |
+
return matches[0]
|
39 |
+
|
40 |
+
# If no quotes but contains "llamado" or similar phrases, extract what follows
|
41 |
+
called_patterns = [
|
42 |
+
r'llamado\s+(.+?)(?:\s+que|\s+con|\s+para|\.$|$)',
|
43 |
+
r'titulado\s+(.+?)(?:\s+que|\s+con|\s+para|\.$|$)',
|
44 |
+
r'denominado\s+(.+?)(?:\s+que|\s+con|\s+para|\.$|$)',
|
45 |
+
r'nombrado\s+(.+?)(?:\s+que|\s+con|\s+para|\.$|$)'
|
46 |
+
]
|
47 |
+
|
48 |
+
for pattern in called_patterns:
|
49 |
+
matches = re.search(pattern, product_name_input, re.IGNORECASE)
|
50 |
+
if matches:
|
51 |
+
extracted = matches.group(1).strip()
|
52 |
+
# If the extracted text has quotes, remove them
|
53 |
+
if extracted.startswith('"') and extracted.endswith('"'):
|
54 |
+
extracted = extracted[1:-1]
|
55 |
+
return extracted
|
56 |
+
|
57 |
+
# Check if the input is generic (common course/product types without specific names)
|
58 |
+
generic_patterns = [
|
59 |
+
r'^(curso|taller|programa|webinar|entrenamiento|sistema|m茅todo|servicio|producto|aplicaci贸n|comunidad|masterclass)(\s+de\s+.+)?$',
|
60 |
+
r'^(un|el|mi|nuestro)\s+(curso|taller|programa|webinar|entrenamiento|sistema|m茅todo|servicio|producto|aplicaci贸n|comunidad|masterclass)(\s+de\s+.+)?$'
|
61 |
+
]
|
62 |
+
|
63 |
+
for pattern in generic_patterns:
|
64 |
+
if re.match(pattern, product_name_input.lower(), re.IGNORECASE):
|
65 |
+
# This is a generic description, return empty string to trigger creative name generation
|
66 |
+
return ""
|
67 |
+
|
68 |
+
# If no patterns match, return the original input
|
69 |
+
return product_name_input.strip()
|
70 |
+
|
71 |
+
|
72 |
def create_offer_instruction(avatar_description, product_name, selected_formula_name):
|
73 |
"""
|
74 |
Creates instructions for generating an offer based on the selected formula.
|
|
|
81 |
Returns:
|
82 |
str: Complete instruction for generating the offer
|
83 |
"""
|
84 |
+
# Extract the actual product name if it's in quotes or after "llamado"
|
85 |
+
extracted_name = extract_product_name(product_name)
|
86 |
+
|
87 |
# Get the selected formula
|
88 |
selected_formula = offer_formulas[selected_formula_name]
|
89 |
|
|
|
93 |
additional_instructions = """
|
94 |
SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
95 |
1. PRODUCT/SERVICE NAME HANDLING:
|
96 |
+
- CRITICAL: If a product name is provided in quotes or after words like "llamado", "titulado", etc.,
|
97 |
+
YOU MUST USE THAT EXACT NAME. This is non-negotiable.
|
98 |
+
- The extracted product name is: "{extracted_name}"
|
99 |
+
- If this extracted name is not empty, use it EXACTLY as provided with no modifications
|
100 |
+
- Only create a new name if the extracted name is empty or contains generic placeholders
|
|
|
|
|
101 |
|
102 |
2. Analyze ALL available information:
|
103 |
+
- Product/service name (use the extracted name provided above)
|
104 |
- Target audience description (avatar_description)
|
105 |
- Content from uploaded files (if any)
|
106 |
|
|
|
111 |
|
112 |
4. Create a comprehensive offer by combining:
|
113 |
- The appropriate type (determined in step 3)
|
114 |
+
- The EXACT product name as extracted (if provided)
|
115 |
- A compelling dream based on avatar_description
|
116 |
- A relevant obstacle based on avatar_description
|
117 |
|
|
|
134 |
- "Ahora puedes acceder a un..."
|
135 |
- "Tenemos para ti un..."
|
136 |
- "Disfruta de un..."
|
137 |
+
""".format(extracted_name=extracted_name)
|
138 |
|
139 |
elif selected_formula_name == "Oferta Dorada":
|
140 |
additional_instructions = """
|
141 |
SPECIFIC INSTRUCTIONS FOR THIS FORMULA:
|
142 |
+
1. PRODUCT/SERVICE NAME HANDLING:
|
143 |
+
- CRITICAL: If a product name is provided in quotes or after words like "llamado", "titulado", etc.,
|
144 |
+
YOU MUST USE THAT EXACT NAME. This is non-negotiable.
|
145 |
+
- The extracted product name is: "{extracted_name}"
|
146 |
+
- If this extracted name is not empty, use it EXACTLY as provided with no modifications
|
147 |
+
- Only create a new name if the extracted name is empty or contains generic placeholders
|
148 |
+
|
149 |
+
2. ATTENTION HOOK HANDLING:
|
150 |
- Analyze the avatar_description DEEPLY to understand their specific pain points, frustrations, and desires
|
151 |
- Select a powerful attention hook that DIRECTLY connects with the avatar's current reality
|
152 |
- DO NOT use questions as hooks - use statements, statistics, or shocking revelations instead
|
153 |
- CUSTOMIZE the hook specifically for this avatar - don't use generic examples
|
154 |
- The hook MUST address the SAME problem that your promise will solve
|
155 |
|
156 |
+
3. MAINTAIN THEMATIC CONSISTENCY:
|
157 |
- The attention hook, quantifiable promise, and benefit statement MUST all address the SAME problem
|
158 |
- Create a LOGICAL PROGRESSION from problem (hook) to solution (promise) to implementation (benefit)
|
159 |
|
160 |
+
4. Create a compelling QUANTIFIABLE PROMISE that:
|
161 |
- Is written COMPLETELY IN CAPITAL LETTERS
|
162 |
- Includes concrete numbers (money, time, results)
|
163 |
- Uses powerful action verbs (EARN, MULTIPLY, ACHIEVE, MASTER)
|
|
|
166 |
- NEVER uses exclamation marks (!)
|
167 |
- DIRECTLY addresses the same problem mentioned in the hook
|
168 |
|
169 |
+
5. Craft a benefit statement that:
|
170 |
- Clearly explains the result they will obtain
|
171 |
- Includes an authority element (proven method, studies, experience)
|
172 |
- Establishes a realistic timeframe or effort needed
|
173 |
- CONTINUES the same theme established in the hook and promise
|
174 |
+
""".format(extracted_name=extracted_name)
|
175 |
|
176 |
# Create the instruction using the system prompt at the beginning
|
177 |
instruction = f"""{offer_system_prompt}
|