Spaces:
Sleeping
Sleeping
Upload 12 files
Browse files- app.py +26 -97
- puv_formulas.py +113 -70
- system_prompts.py +71 -232
app.py
CHANGED
@@ -13,49 +13,33 @@ state = SessionState()
|
|
13 |
|
14 |
# Función para detectar saludos y generar respuestas personalizadas
|
15 |
def is_greeting(text):
|
16 |
-
"""Detecta si el texto es un saludo simple"""
|
17 |
text = text.lower().strip()
|
18 |
greetings = ['hola', 'hey', 'saludos', 'buenos días', 'buenas tardes', 'buenas noches', 'hi', 'hello']
|
19 |
-
|
20 |
-
# Solo considerar como saludo si es el primer mensaje del usuario
|
21 |
-
# y es un saludo simple
|
22 |
is_simple_greeting = any(greeting in text for greeting in greetings) and len(text.split()) < 4
|
23 |
return is_simple_greeting and len(state.messages) == 0
|
24 |
|
25 |
-
# Función para procesar mensajes (unifica la lógica de procesamiento)
|
26 |
def process_message(prompt, is_example=False):
|
27 |
-
"""Procesa un mensaje del usuario, ya sea directo o de un ejemplo"""
|
28 |
handle_chat_title(prompt)
|
29 |
-
|
30 |
with st.chat_message('user', avatar=USER_AVATAR_ICON):
|
31 |
st.markdown(prompt)
|
32 |
-
|
33 |
state.add_message('user', prompt, USER_AVATAR_ICON)
|
34 |
-
|
35 |
-
# Obtener el prompt mejorado primero
|
36 |
enhanced_prompt = get_enhanced_prompt(prompt, is_example)
|
37 |
-
|
38 |
-
# Mover la respuesta del modelo después del mensaje del usuario
|
39 |
with st.chat_message(MODEL_ROLE, avatar=AI_AVATAR_ICON):
|
40 |
try:
|
41 |
message_placeholder = st.empty()
|
42 |
typing_indicator = st.empty()
|
43 |
typing_indicator.markdown("*Generando respuesta...*")
|
44 |
-
|
45 |
response = state.send_message(enhanced_prompt)
|
46 |
full_response = stream_response(response, message_placeholder, typing_indicator)
|
47 |
-
|
48 |
if full_response:
|
49 |
state.add_message(MODEL_ROLE, full_response, AI_AVATAR_ICON)
|
50 |
state.gemini_history = state.chat.history
|
51 |
state.save_chat_history()
|
52 |
-
|
53 |
except Exception as e:
|
54 |
st.error(f"Error en el streaming: {str(e)}")
|
55 |
return
|
56 |
|
57 |
def handle_chat_title(prompt):
|
58 |
-
"""Maneja la lógica del título del chat"""
|
59 |
if state.chat_id not in past_chats:
|
60 |
temp_title = f'SesiónChat-{state.chat_id}'
|
61 |
generated_title = state.generate_chat_title(prompt)
|
@@ -66,34 +50,13 @@ def handle_chat_title(prompt):
|
|
66 |
joblib.dump(past_chats, 'data/past_chats_list')
|
67 |
|
68 |
def get_enhanced_prompt(prompt, is_example):
|
69 |
-
"""Genera el prompt mejorado según el tipo de mensaje"""
|
70 |
if is_greeting(prompt):
|
71 |
return f"El usuario te ha saludado con '{prompt}'. Preséntate brevemente, explica qué es una PUV en 1-2 líneas, y haz 1-2 preguntas iniciales para comenzar a crear la PUV del usuario (como a quién se dirige su producto/servicio o qué ofrece). Sé amigable, breve y toma la iniciativa como el experto que eres."
|
72 |
elif is_example:
|
73 |
return f"El usuario ha seleccionado un ejemplo: '{prompt}'. Responde de manera conversacional y sencilla, como si estuvieras hablando con un amigo. Evita tecnicismos innecesarios. Enfócate en dar información práctica que ayude al usuario a crear su PUV. Usa ejemplos concretos cuando sea posible. Termina tu respuesta con una pregunta que invite al usuario a compartir información sobre su negocio para poder ayudarle a crear su PUV personalizada."
|
74 |
return prompt
|
75 |
|
76 |
-
def process_model_response(enhanced_prompt):
|
77 |
-
"""Procesa la respuesta del modelo"""
|
78 |
-
with st.chat_message(MODEL_ROLE, avatar=AI_AVATAR_ICON):
|
79 |
-
try:
|
80 |
-
message_placeholder = st.empty()
|
81 |
-
typing_indicator = st.empty()
|
82 |
-
typing_indicator.markdown("*Generando respuesta...*")
|
83 |
-
|
84 |
-
response = state.send_message(enhanced_prompt)
|
85 |
-
full_response = stream_response(response, message_placeholder, typing_indicator)
|
86 |
-
|
87 |
-
# Actualizar historial
|
88 |
-
state.add_message(role=MODEL_ROLE, content=full_response, avatar=AI_AVATAR_ICON)
|
89 |
-
state.gemini_history = state.chat.history
|
90 |
-
state.save_chat_history()
|
91 |
-
|
92 |
-
except Exception as e:
|
93 |
-
st.error(f"Error: {str(e)}")
|
94 |
-
|
95 |
def stream_response(response, message_placeholder, typing_indicator):
|
96 |
-
"""Maneja el streaming de la respuesta"""
|
97 |
full_response = ''
|
98 |
try:
|
99 |
for chunk in response:
|
@@ -106,24 +69,20 @@ def stream_response(response, message_placeholder, typing_indicator):
|
|
106 |
except Exception as e:
|
107 |
st.error(f"Error en el streaming: {str(e)}")
|
108 |
return ''
|
109 |
-
|
110 |
typing_indicator.empty()
|
111 |
message_placeholder.markdown(full_response)
|
112 |
return full_response
|
113 |
|
114 |
-
# Función para cargar CSS personalizado
|
115 |
def load_css(file_path):
|
116 |
with open(file_path) as f:
|
117 |
st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True)
|
118 |
|
119 |
-
# Intentar cargar el CSS personalizado con ruta absoluta para mayor seguridad
|
120 |
try:
|
121 |
css_path = os.path.join(os.path.dirname(__file__), 'static', 'css', 'style.css')
|
122 |
load_css(css_path)
|
123 |
except Exception as e:
|
124 |
print(f"Error al cargar CSS: {e}")
|
125 |
-
|
126 |
-
st.markdown("""
|
127 |
<style>
|
128 |
.robocopy-title {
|
129 |
color: white !important;
|
@@ -132,14 +91,12 @@ except Exception as e:
|
|
132 |
line-height: 1.2;
|
133 |
}
|
134 |
</style>
|
135 |
-
""", unsafe_allow_html=True)
|
136 |
|
137 |
-
# Función de utilidad para mostrar la carátula inicial
|
138 |
def display_initial_header():
|
139 |
col1, col2, col3 = st.columns([1, 2, 1])
|
140 |
with col2:
|
141 |
-
|
142 |
-
st.markdown("""
|
143 |
<style>
|
144 |
div.stImage {
|
145 |
text-align: center;
|
@@ -148,33 +105,26 @@ def display_initial_header():
|
|
148 |
margin-right: auto;
|
149 |
}
|
150 |
</style>
|
151 |
-
""", unsafe_allow_html=True)
|
152 |
st.image("robocopy_logo.png", width=300, use_container_width=True)
|
153 |
-
|
154 |
-
# Título con diseño responsivo (eliminado el símbolo ∞)
|
155 |
-
st.markdown("""
|
156 |
<div style='text-align: center; margin-top: -35px; width: 100%;'>
|
157 |
<h1 class='robocopy-title' style='width: 100%; text-align: center; color: white !important; font-size: clamp(2.5em, 5vw, 4em); line-height: 1.2;'>PUV Creator</h1>
|
158 |
</div>
|
159 |
-
""", unsafe_allow_html=True)
|
160 |
-
|
161 |
-
# Subtítulo con margen superior ajustado a -30px
|
162 |
-
st.markdown("""
|
163 |
<div style='text-align: center; width: 100%;'>
|
164 |
<p style='font-size: 16px; color: white; width: 100%; text-align: center; margin-top: -20px;'>By Jesús Cabrera</p>
|
165 |
</div>
|
166 |
-
""", unsafe_allow_html=True)
|
167 |
-
|
168 |
-
# Descripción con fondo eliminado y margen superior ajustado a -20px
|
169 |
-
st.markdown("""
|
170 |
<div style='text-align: center; width: 100%;'>
|
171 |
<p style='font-size: 16px; background-color: transparent; padding: 12px; border-radius: 8px; margin-top: -20px; color: white; width: 100%; text-align: center;'>
|
172 |
🎯 Experto en crear Propuestas de Valor Únicas que convierten audiencia en clientes
|
173 |
</p>
|
174 |
</div>
|
175 |
-
""", unsafe_allow_html=True)
|
176 |
|
177 |
-
# Función para mostrar ejemplos de preguntas
|
178 |
def display_examples():
|
179 |
ejemplos = [
|
180 |
{"texto": "¿Qué es una Propuesta de Valor Única? 🎯", "prompt": "Explícame qué es una Propuesta de Valor Única (PUV) y por qué es importante para mi negocio"},
|
@@ -182,8 +132,6 @@ def display_examples():
|
|
182 |
{"texto": "¿Qué elementos debe tener mi PUV? ✨", "prompt": "¿Cuáles son los elementos esenciales que debe incluir una Propuesta de Valor Única exitosa?"},
|
183 |
{"texto": "¿Cuál es la mejor fórmula para mi caso? 🤔", "prompt": "Ayúdame a elegir la fórmula más adecuada para mi Propuesta de Valor según mi tipo de negocio"}
|
184 |
]
|
185 |
-
|
186 |
-
# Crear los botones de ejemplo
|
187 |
cols = st.columns(4)
|
188 |
for idx, ejemplo in enumerate(ejemplos):
|
189 |
with cols[idx]:
|
@@ -199,23 +147,19 @@ genai.configure(api_key=GOOGLE_API_KEY)
|
|
199 |
# Configuración de la aplicación
|
200 |
new_chat_id = f'{time.time()}'
|
201 |
MODEL_ROLE = 'ai'
|
202 |
-
AI_AVATAR_ICON = '🤖'
|
203 |
-
USER_AVATAR_ICON = '👤'
|
204 |
|
205 |
-
# Crear carpeta de datos si no existe
|
206 |
try:
|
207 |
os.mkdir('data/')
|
208 |
except:
|
209 |
-
# data/ folder already exists
|
210 |
pass
|
211 |
|
212 |
-
# Cargar chats anteriores
|
213 |
try:
|
214 |
past_chats: dict = joblib.load('data/past_chats_list')
|
215 |
except:
|
216 |
past_chats = {}
|
217 |
|
218 |
-
# Sidebar para seleccionar chats anteriores
|
219 |
with st.sidebar:
|
220 |
st.write('# Chats Anteriores')
|
221 |
if state.chat_id is None:
|
@@ -226,7 +170,6 @@ with st.sidebar:
|
|
226 |
placeholder='_',
|
227 |
)
|
228 |
else:
|
229 |
-
# This will happen the first time AI response comes in
|
230 |
state.chat_id = st.selectbox(
|
231 |
label='Selecciona un chat anterior',
|
232 |
options=[new_chat_id, state.chat_id] + list(past_chats.keys()),
|
@@ -234,46 +177,32 @@ with st.sidebar:
|
|
234 |
format_func=lambda x: past_chats.get(x, 'Nuevo Chat' if x != state.chat_id else state.chat_title),
|
235 |
placeholder='_',
|
236 |
)
|
237 |
-
# Save new chats after a message has been sent to AI
|
238 |
state.chat_title = f'SesiónChat-{state.chat_id}'
|
239 |
|
240 |
-
# Cargar historial del chat
|
241 |
state.load_chat_history()
|
242 |
-
|
243 |
-
# Inicializar el modelo y el chat
|
244 |
state.initialize_model('gemini-2.0-flash')
|
245 |
-
state.initialize_chat()
|
246 |
|
247 |
-
# Mostrar mensajes del historial
|
248 |
for message in state.messages:
|
249 |
-
with st.chat_message(
|
250 |
-
name=message['role'],
|
251 |
-
avatar=message.get('avatar'),
|
252 |
-
):
|
253 |
st.markdown(message['content'])
|
254 |
|
255 |
-
#
|
256 |
if not state.has_messages():
|
257 |
-
# Mostrar la carátula inicial con el logo centrado
|
258 |
display_initial_header()
|
259 |
-
|
260 |
-
# Mostrar los ejemplos
|
261 |
display_examples()
|
262 |
-
|
263 |
-
|
|
|
264 |
system_prompt = get_unified_puv_prompt()
|
265 |
-
if state.chat is not None:
|
266 |
state.chat.send_message(system_prompt)
|
267 |
else:
|
268 |
st.error("Error: No se pudo inicializar el chat correctamente.")
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
prompt = state.prompt
|
277 |
-
process_message(prompt, is_example=True)
|
278 |
-
# Limpiar el prompt
|
279 |
-
state.clear_prompt()
|
|
|
13 |
|
14 |
# Función para detectar saludos y generar respuestas personalizadas
|
15 |
def is_greeting(text):
|
|
|
16 |
text = text.lower().strip()
|
17 |
greetings = ['hola', 'hey', 'saludos', 'buenos días', 'buenas tardes', 'buenas noches', 'hi', 'hello']
|
|
|
|
|
|
|
18 |
is_simple_greeting = any(greeting in text for greeting in greetings) and len(text.split()) < 4
|
19 |
return is_simple_greeting and len(state.messages) == 0
|
20 |
|
|
|
21 |
def process_message(prompt, is_example=False):
|
|
|
22 |
handle_chat_title(prompt)
|
|
|
23 |
with st.chat_message('user', avatar=USER_AVATAR_ICON):
|
24 |
st.markdown(prompt)
|
|
|
25 |
state.add_message('user', prompt, USER_AVATAR_ICON)
|
|
|
|
|
26 |
enhanced_prompt = get_enhanced_prompt(prompt, is_example)
|
|
|
|
|
27 |
with st.chat_message(MODEL_ROLE, avatar=AI_AVATAR_ICON):
|
28 |
try:
|
29 |
message_placeholder = st.empty()
|
30 |
typing_indicator = st.empty()
|
31 |
typing_indicator.markdown("*Generando respuesta...*")
|
|
|
32 |
response = state.send_message(enhanced_prompt)
|
33 |
full_response = stream_response(response, message_placeholder, typing_indicator)
|
|
|
34 |
if full_response:
|
35 |
state.add_message(MODEL_ROLE, full_response, AI_AVATAR_ICON)
|
36 |
state.gemini_history = state.chat.history
|
37 |
state.save_chat_history()
|
|
|
38 |
except Exception as e:
|
39 |
st.error(f"Error en el streaming: {str(e)}")
|
40 |
return
|
41 |
|
42 |
def handle_chat_title(prompt):
|
|
|
43 |
if state.chat_id not in past_chats:
|
44 |
temp_title = f'SesiónChat-{state.chat_id}'
|
45 |
generated_title = state.generate_chat_title(prompt)
|
|
|
50 |
joblib.dump(past_chats, 'data/past_chats_list')
|
51 |
|
52 |
def get_enhanced_prompt(prompt, is_example):
|
|
|
53 |
if is_greeting(prompt):
|
54 |
return f"El usuario te ha saludado con '{prompt}'. Preséntate brevemente, explica qué es una PUV en 1-2 líneas, y haz 1-2 preguntas iniciales para comenzar a crear la PUV del usuario (como a quién se dirige su producto/servicio o qué ofrece). Sé amigable, breve y toma la iniciativa como el experto que eres."
|
55 |
elif is_example:
|
56 |
return f"El usuario ha seleccionado un ejemplo: '{prompt}'. Responde de manera conversacional y sencilla, como si estuvieras hablando con un amigo. Evita tecnicismos innecesarios. Enfócate en dar información práctica que ayude al usuario a crear su PUV. Usa ejemplos concretos cuando sea posible. Termina tu respuesta con una pregunta que invite al usuario a compartir información sobre su negocio para poder ayudarle a crear su PUV personalizada."
|
57 |
return prompt
|
58 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
def stream_response(response, message_placeholder, typing_indicator):
|
|
|
60 |
full_response = ''
|
61 |
try:
|
62 |
for chunk in response:
|
|
|
69 |
except Exception as e:
|
70 |
st.error(f"Error en el streaming: {str(e)}")
|
71 |
return ''
|
|
|
72 |
typing_indicator.empty()
|
73 |
message_placeholder.markdown(full_response)
|
74 |
return full_response
|
75 |
|
|
|
76 |
def load_css(file_path):
|
77 |
with open(file_path) as f:
|
78 |
st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True)
|
79 |
|
|
|
80 |
try:
|
81 |
css_path = os.path.join(os.path.dirname(__file__), 'static', 'css', 'style.css')
|
82 |
load_css(css_path)
|
83 |
except Exception as e:
|
84 |
print(f"Error al cargar CSS: {e}")
|
85 |
+
st.markdown(\"\"\"
|
|
|
86 |
<style>
|
87 |
.robocopy-title {
|
88 |
color: white !important;
|
|
|
91 |
line-height: 1.2;
|
92 |
}
|
93 |
</style>
|
94 |
+
\"\"\", unsafe_allow_html=True)
|
95 |
|
|
|
96 |
def display_initial_header():
|
97 |
col1, col2, col3 = st.columns([1, 2, 1])
|
98 |
with col2:
|
99 |
+
st.markdown(\"\"\"
|
|
|
100 |
<style>
|
101 |
div.stImage {
|
102 |
text-align: center;
|
|
|
105 |
margin-right: auto;
|
106 |
}
|
107 |
</style>
|
108 |
+
\"\"\", unsafe_allow_html=True)
|
109 |
st.image("robocopy_logo.png", width=300, use_container_width=True)
|
110 |
+
st.markdown(\"\"\"
|
|
|
|
|
111 |
<div style='text-align: center; margin-top: -35px; width: 100%;'>
|
112 |
<h1 class='robocopy-title' style='width: 100%; text-align: center; color: white !important; font-size: clamp(2.5em, 5vw, 4em); line-height: 1.2;'>PUV Creator</h1>
|
113 |
</div>
|
114 |
+
\"\"\", unsafe_allow_html=True)
|
115 |
+
st.markdown(\"\"\"
|
|
|
|
|
116 |
<div style='text-align: center; width: 100%;'>
|
117 |
<p style='font-size: 16px; color: white; width: 100%; text-align: center; margin-top: -20px;'>By Jesús Cabrera</p>
|
118 |
</div>
|
119 |
+
\"\"\", unsafe_allow_html=True)
|
120 |
+
st.markdown(\"\"\"
|
|
|
|
|
121 |
<div style='text-align: center; width: 100%;'>
|
122 |
<p style='font-size: 16px; background-color: transparent; padding: 12px; border-radius: 8px; margin-top: -20px; color: white; width: 100%; text-align: center;'>
|
123 |
🎯 Experto en crear Propuestas de Valor Únicas que convierten audiencia en clientes
|
124 |
</p>
|
125 |
</div>
|
126 |
+
\"\"\", unsafe_allow_html=True)
|
127 |
|
|
|
128 |
def display_examples():
|
129 |
ejemplos = [
|
130 |
{"texto": "¿Qué es una Propuesta de Valor Única? 🎯", "prompt": "Explícame qué es una Propuesta de Valor Única (PUV) y por qué es importante para mi negocio"},
|
|
|
132 |
{"texto": "¿Qué elementos debe tener mi PUV? ✨", "prompt": "¿Cuáles son los elementos esenciales que debe incluir una Propuesta de Valor Única exitosa?"},
|
133 |
{"texto": "¿Cuál es la mejor fórmula para mi caso? 🤔", "prompt": "Ayúdame a elegir la fórmula más adecuada para mi Propuesta de Valor según mi tipo de negocio"}
|
134 |
]
|
|
|
|
|
135 |
cols = st.columns(4)
|
136 |
for idx, ejemplo in enumerate(ejemplos):
|
137 |
with cols[idx]:
|
|
|
147 |
# Configuración de la aplicación
|
148 |
new_chat_id = f'{time.time()}'
|
149 |
MODEL_ROLE = 'ai'
|
150 |
+
AI_AVATAR_ICON = '🤖'
|
151 |
+
USER_AVATAR_ICON = '👤'
|
152 |
|
|
|
153 |
try:
|
154 |
os.mkdir('data/')
|
155 |
except:
|
|
|
156 |
pass
|
157 |
|
|
|
158 |
try:
|
159 |
past_chats: dict = joblib.load('data/past_chats_list')
|
160 |
except:
|
161 |
past_chats = {}
|
162 |
|
|
|
163 |
with st.sidebar:
|
164 |
st.write('# Chats Anteriores')
|
165 |
if state.chat_id is None:
|
|
|
170 |
placeholder='_',
|
171 |
)
|
172 |
else:
|
|
|
173 |
state.chat_id = st.selectbox(
|
174 |
label='Selecciona un chat anterior',
|
175 |
options=[new_chat_id, state.chat_id] + list(past_chats.keys()),
|
|
|
177 |
format_func=lambda x: past_chats.get(x, 'Nuevo Chat' if x != state.chat_id else state.chat_title),
|
178 |
placeholder='_',
|
179 |
)
|
|
|
180 |
state.chat_title = f'SesiónChat-{state.chat_id}'
|
181 |
|
|
|
182 |
state.load_chat_history()
|
|
|
|
|
183 |
state.initialize_model('gemini-2.0-flash')
|
184 |
+
state.initialize_chat()
|
185 |
|
|
|
186 |
for message in state.messages:
|
187 |
+
with st.chat_message(name=message['role'], avatar=message.get('avatar')):
|
|
|
|
|
|
|
188 |
st.markdown(message['content'])
|
189 |
|
190 |
+
# NUEVO BLOQUE MODIFICADO
|
191 |
if not state.has_messages():
|
|
|
192 |
display_initial_header()
|
|
|
|
|
193 |
display_examples()
|
194 |
+
if state.prompt:
|
195 |
+
process_message(state.prompt, is_example=True)
|
196 |
+
state.clear_prompt()
|
197 |
system_prompt = get_unified_puv_prompt()
|
198 |
+
if state.chat is not None:
|
199 |
state.chat.send_message(system_prompt)
|
200 |
else:
|
201 |
st.error("Error: No se pudo inicializar el chat correctamente.")
|
202 |
+
else:
|
203 |
+
if prompt := st.chat_input('Describe tu producto/servicio y audiencia objetivo...'):
|
204 |
+
process_message(prompt, is_example=False)
|
205 |
+
if state.has_prompt():
|
206 |
+
process_message(state.prompt, is_example=True)
|
207 |
+
state.clear_prompt()
|
208 |
+
"""
|
|
|
|
|
|
|
|
puv_formulas.py
CHANGED
@@ -10,26 +10,24 @@ puv_formulas = {
|
|
10 |
- Direct transformation promise
|
11 |
|
12 |
Structure:
|
13 |
-
1. Start with "Yo
|
14 |
-
ayudo a..." followed by:
|
15 |
[AVATAR DESCRIPTION]
|
16 |
- Demographics
|
17 |
- Current situation
|
18 |
-
-
|
19 |
-
-
|
20 |
|
21 |
2. Then "a conseguir..." followed by:
|
22 |
[TRANSFORMATION]
|
23 |
-
-
|
24 |
-
-
|
25 |
- What they won't need to do
|
26 |
|
27 |
Key elements:
|
28 |
-
- Ultra-specific avatar description
|
29 |
-
- Clear transformation promise
|
30 |
- Natural client filtering
|
31 |
- Simple, direct language
|
32 |
-
- Be clear and concise
|
33 |
""",
|
34 |
"examples": [
|
35 |
{
|
@@ -45,7 +43,7 @@ puv_formulas = {
|
|
45 |
{
|
46 |
"target_audience": "profesionales del bienestar estresados por el marketing",
|
47 |
"product_service": "sistema de atracción de clientes para terapeutas",
|
48 |
-
"uvp": "Yo ayudo a terapeutas y coaches holísticos que prefieren enfocarse en sanar a sus clientes en lugar de promocionarse, y que se sienten
|
49 |
},
|
50 |
{
|
51 |
"target_audience": "emprendedores creativos sin presencia digital",
|
@@ -69,16 +67,15 @@ puv_formulas = {
|
|
69 |
- "Soy experto/a en..."
|
70 |
- "Mi misión es..."
|
71 |
- "Potencio a..."
|
72 |
-
(Choose one and describe your avatar's situation
|
73 |
|
74 |
2. To achieve [PROMISED TRANSFORMATION]
|
75 |
-
(Explain
|
76 |
Key elements to include:
|
77 |
-
- Emotional appeal
|
78 |
- Clear and direct language
|
79 |
-
-
|
80 |
- Natural filtering of non-ideal clients
|
81 |
-
- Be clear and concise
|
82 |
""",
|
83 |
"examples": [
|
84 |
{
|
@@ -105,80 +102,126 @@ puv_formulas = {
|
|
105 |
},
|
106 |
"Contrato Imposible": {
|
107 |
"description": """
|
108 |
-
The "Impossible Contract" formula creates a compelling and disruptive UVP
|
109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
Structure:
|
111 |
-
1.
|
112 |
-
- "
|
113 |
-
- "
|
114 |
-
- "
|
115 |
-
- "
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
|
|
126 |
""",
|
127 |
"examples": [
|
128 |
{
|
129 |
-
"target_audience": "
|
130 |
-
"product_service": "
|
131 |
-
"uvp": "¿Te imaginas poder
|
132 |
},
|
133 |
{
|
134 |
-
"target_audience": "
|
135 |
-
"product_service": "sistema de
|
136 |
-
"uvp": "
|
137 |
},
|
138 |
{
|
139 |
-
"target_audience": "
|
140 |
-
"product_service": "
|
141 |
-
"uvp": "
|
142 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
]
|
144 |
},
|
145 |
-
|
146 |
"Reto Ridículo": {
|
147 |
"description": """
|
148 |
-
The "Ridiculous Challenge" formula
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
-
|
153 |
-
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
165 |
""",
|
166 |
"examples": [
|
167 |
{
|
168 |
-
"target_audience": "
|
169 |
-
"product_service": "
|
170 |
-
"uvp": "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
171 |
},
|
172 |
{
|
173 |
-
"target_audience": "
|
174 |
-
"product_service": "
|
175 |
-
"uvp": "
|
176 |
},
|
177 |
{
|
178 |
-
"target_audience": "
|
179 |
-
"product_service": "
|
180 |
-
"uvp": "
|
181 |
}
|
182 |
]
|
183 |
}
|
184 |
-
}
|
|
|
10 |
- Direct transformation promise
|
11 |
|
12 |
Structure:
|
13 |
+
1. Start with "Yo ayudo a..." followed by:
|
|
|
14 |
[AVATAR DESCRIPTION]
|
15 |
- Demographics
|
16 |
- Current situation
|
17 |
+
- Pain points
|
18 |
+
- Specific characteristics
|
19 |
|
20 |
2. Then "a conseguir..." followed by:
|
21 |
[TRANSFORMATION]
|
22 |
+
- Clear outcome
|
23 |
+
- Specific benefits
|
24 |
- What they won't need to do
|
25 |
|
26 |
Key elements:
|
27 |
+
- Ultra-specific avatar description
|
28 |
+
- Clear transformation promise
|
29 |
- Natural client filtering
|
30 |
- Simple, direct language
|
|
|
31 |
""",
|
32 |
"examples": [
|
33 |
{
|
|
|
43 |
{
|
44 |
"target_audience": "profesionales del bienestar estresados por el marketing",
|
45 |
"product_service": "sistema de atracción de clientes para terapeutas",
|
46 |
+
"uvp": "Yo ayudo a terapeutas y coaches holísticos que prefieren enfocarse en sanar a sus clientes en lugar de promocionarse, y que se sienten incómodos con las tácticas de marketing agresivas, a llenar su agenda con clientes ideales que valoran su trabajo, sin tener que convertirse en vendedores ni comprometer sus valores."
|
47 |
},
|
48 |
{
|
49 |
"target_audience": "emprendedores creativos sin presencia digital",
|
|
|
67 |
- "Soy experto/a en..."
|
68 |
- "Mi misión es..."
|
69 |
- "Potencio a..."
|
70 |
+
(Choose one and describe your avatar's situation, problems, desires)
|
71 |
|
72 |
2. To achieve [PROMISED TRANSFORMATION]
|
73 |
+
(Explain the change/result simply and convincingly)
|
74 |
Key elements to include:
|
75 |
+
- Emotional appeal
|
76 |
- Clear and direct language
|
77 |
+
- Service highlights
|
78 |
- Natural filtering of non-ideal clients
|
|
|
79 |
""",
|
80 |
"examples": [
|
81 |
{
|
|
|
102 |
},
|
103 |
"Contrato Imposible": {
|
104 |
"description": """
|
105 |
+
The "Impossible Contract" formula creates a compelling and disruptive UVP by challenging conventional approaches.
|
106 |
+
It works by:
|
107 |
+
- Making a bold, specific promise to a well-defined audience
|
108 |
+
- Presenting your solution in an unexpected, intriguing way
|
109 |
+
- Highlighting a transformative benefit that seems "too good to be true"
|
110 |
+
- Differentiating from traditional solutions by stating what you won't do
|
111 |
+
|
112 |
+
This formula is particularly effective when you want to:
|
113 |
+
- Stand out in a crowded market
|
114 |
+
- Challenge industry conventions
|
115 |
+
- Appeal to audiences frustrated with traditional solutions
|
116 |
+
- Create an emotional connection while maintaining credibility
|
117 |
+
|
118 |
Structure:
|
119 |
+
1. Start with a bold opener:
|
120 |
+
- "¿Te imaginas poder..."
|
121 |
+
- "Soy el antídoto para..."
|
122 |
+
- "Revoluciono la manera..."
|
123 |
+
- "¿Y si te dijera que..."
|
124 |
+
- "Desbloqueo el potencial..."
|
125 |
+
(Be specific with your target audience)
|
126 |
+
|
127 |
+
2. [PRODUCT/SERVICE]
|
128 |
+
(Describe it in a fun, unexpected way that shows transformation)
|
129 |
+
|
130 |
+
3. You won't believe [TRANSFORMATIVE BENEFIT]
|
131 |
+
(Must be directly related to the expected change/result)
|
132 |
+
|
133 |
+
4. But watch out: [ANTI-TRADITIONAL APPROACH]
|
134 |
+
(Show how you're different from conventional solutions)
|
135 |
""",
|
136 |
"examples": [
|
137 |
{
|
138 |
+
"target_audience": "mujeres empresarias solteras con poco tiempo para el amor",
|
139 |
+
"product_service": "curso transformador de relaciones",
|
140 |
+
"uvp": "¿Te imaginas poder encontrar el amor de tu vida mientras construyes tu imperio? Para mujeres empresarias solteras con poco tiempo para el amor, he creado un curso transformador que revoluciona las citas ejecutivas. No tendrás que perder tiempo en citas sin futuro ni en apps de citas que no aportan nada. Lo mejor de todo es que conseguirás una pareja que valora tu tiempo y tu éxito, sin tener que cambiar quién eres ni hacerte pasar por alguien más."
|
141 |
},
|
142 |
{
|
143 |
+
"target_audience": "diseñadores gráficos frustrados con clientes imposibles",
|
144 |
+
"product_service": "sistema de automatización de proyectos creativos",
|
145 |
+
"uvp": "Soy el antídoto para diseñadores gráficos hartos de clientes que piden 'algo más moderno' sin saber qué quieren. Mi sistema revolucionario automatiza el 80% de las revisiones infinitas. No más noches en vela haciendo cambios insignificantes ni presentaciones interminables. Lo mejor es que duplicarás tus ingresos trabajando la mitad del tiempo, sin tener que sacrificar tu visión creativa ni convertirte en un robot corporativo."
|
146 |
},
|
147 |
{
|
148 |
+
"target_audience": "emprendedores tecnológicos con miedo a hablar en público",
|
149 |
+
"product_service": "programa de presentaciones impactantes",
|
150 |
+
"uvp": "Revoluciono la manera en que los emprendedores tech que prefieren código que conversaciones dominan sus presentaciones. Mi método único te libera de memorizar guiones robóticos. Olvídate de sudar frío antes de cada pitch o fingir ser un showman extrovertido. Lo increíble es que cautivarás a cualquier inversor siendo 100% tú mismo, usando tu naturaleza analítica como superpoder."
|
151 |
+
},
|
152 |
+
{
|
153 |
+
"target_audience": "profesionales del fitness adictos al trabajo",
|
154 |
+
"product_service": "sistema de entrenamiento remoto",
|
155 |
+
"uvp": "Desbloqueo el potencial oculto de entrenadores fitness workahólicos con un sistema revolucionario que genera ingresos mientras duermes. No más madrugar a las 5 AM ni sacrificar tu propio entrenamiento. Lo sorprendente es que ganarás más dinero entrenando menos personas, sin convertirte en un vendedor agresivo ni perder la conexión personal con tus clientes."
|
156 |
+
},
|
157 |
+
{
|
158 |
+
"target_audience": "emprendedores digitales de 30-45 años que coleccionan conexiones en LinkedIn como si fueran cromos",
|
159 |
+
"product_service": "Curso de LinkedIn Orgánico: De 0 a 10k seguidores en 90 días",
|
160 |
+
"uvp": "Ayer me reí tanto viendo mi feed de LinkedIn que casi escupo el café... Otro post de '5 hábitos matutinos de los millonarios' con dos likes: uno de la mamá del autor y otro de su cuenta alternativa. Para todos esos emprendedores digitales de 30-45 que han probado cada hashtag trending desde #MindsetDelÉxito hasta #LinkedInLocal sin más resultado que el visto de su ex compañero del cole... He creado un método que convierte tu perfil abandonado en un imán de clientes reales. Sin tener que publicar frases motivacionales robadas de Google, ni fingir que meditas 4 horas al día, ni etiquetar a medio LinkedIn en fotos random. En 90 días, pasarás de ser el fantasma de LinkedIn a tener una comunidad que de verdad quiere hacer negocios contigo, y todo sin tener que usar ni una sola vez el hashtag #Emprendimiento."
|
161 |
+
},
|
162 |
]
|
163 |
},
|
|
|
164 |
"Reto Ridículo": {
|
165 |
"description": """
|
166 |
+
The "Ridiculous Challenge" formula uses humor and storytelling to create an instant connection with your audience through shared experiences and pain points.
|
167 |
+
Formula Structure:
|
168 |
+
1. Start with a funny personal anecdote or observation:
|
169 |
+
- Share a recent "aha moment"
|
170 |
+
- Tell a relatable story
|
171 |
+
- Point out an absurd industry situation
|
172 |
+
(Make it specific and recent: "The other day...", "Last week...", "Yesterday...")
|
173 |
+
|
174 |
+
2. Address your audience with empathy and humor:
|
175 |
+
- Call out their specific struggles
|
176 |
+
- Reference industry inside jokes
|
177 |
+
- Make fun of common "solutions" in your field
|
178 |
+
- Use their jargon (but in a playful way)
|
179 |
+
|
180 |
+
3. Present your solution as the obvious alternative:
|
181 |
+
- Keep it conversational and light
|
182 |
+
- Contrast it with typical "guru advice"
|
183 |
+
- Show how it embraces reality instead of perfection
|
184 |
+
- Make it sound both powerful and approachable
|
185 |
+
|
186 |
+
4. End with a transformation that feels both ambitious and realistic:
|
187 |
+
- Include specific, measurable results
|
188 |
+
- Add a humorous twist to the outcome
|
189 |
+
- Emphasize the human aspect of the solution
|
190 |
+
|
191 |
+
Key Elements:
|
192 |
+
- Use contemporary references your audience will recognize
|
193 |
+
- Include specific numbers or situations that feel authentic
|
194 |
+
- Make fun of industry clichés and overused phrases
|
195 |
+
- Show you're "one of them" by sharing similar experiences
|
196 |
+
- Balance humor with actual value and transformation
|
197 |
+
- Keep the tone casual but knowledgeable
|
198 |
""",
|
199 |
"examples": [
|
200 |
{
|
201 |
+
"target_audience": "asesores financieros corporativos obsesionados con los números que luchan por humanizar sus servicios",
|
202 |
+
"product_service": "método de educación financiera simplificada",
|
203 |
+
"uvp": "Después de ver a otro ejecutivo de alto nivel quedarse dormido mientras explicaba el fascinante mundo de los derivados financieros (¡con 47 diapositivas llenas de gráficos!), me di cuenta que algo andaba mal. Para todos los asesores financieros que pueden recitar ratios P/E durante la cena pero no logran que sus clientes entiendan la diferencia entre un ETF y un emoji... Mi método convierte tu expertise numérica en historias tan entretenidas que tus clientes preferirán hablar de diversificación de portafolios que de la última temporada de su serie favorita."
|
204 |
+
},
|
205 |
+
{
|
206 |
+
"target_audience": "nutricionistas certificados hartos de luchar contra las dietas milagro de Instagram",
|
207 |
+
"product_service": "sistema de cambio de hábitos sostenibles",
|
208 |
+
"uvp": "La semana pasada, una nutricionista me confesó que su cliente más dedicada estaba siguiendo en secreto a una influencer que promete pérdida de peso comiendo solo papaya los martes. ¡Ay! Para todos los profesionales de la nutrición que compiten contra licuados mágicos y dietas del color... Desarrollé un sistema que hace que la ciencia de la nutrición sea más atractiva que cualquier tendencia de TikTok. Mis pacientes ahora presumen sus conocimientos nutricionales basados en evidencia y hasta detectan fake news alimentarias mejor que un fact-checker profesional."
|
209 |
+
},
|
210 |
+
{
|
211 |
+
"target_audience": "consultores de marketing digital ahogados en herramientas y análisis de datos",
|
212 |
+
"product_service": "método de storytelling auténtico",
|
213 |
+
"uvp": "El otro día, un consultor de marketing presumía sus 27 dashboards de analytics, 13 herramientas de automatización y 5 CRMs... mientras su único lead seguía siendo su mamá. Para todos los marketeros que tienen más pestañas abiertas que conversiones... Mi método te enseña a dejar de esconderte detrás de los datos y empezar a contar historias que conectan. Sin necesidad de otro curso de Google Analytics o un doctorado en ciencia de datos. Solo estrategias que convierten números en narrativas que tus clientes realmente quieren escuchar."
|
214 |
},
|
215 |
{
|
216 |
+
"target_audience": "emprendedores digitales de 30-45 años que coleccionan conexiones en LinkedIn como si fueran cromos",
|
217 |
+
"product_service": "Curso de LinkedIn Orgánico: De 0 a 10k seguidores en 90 días",
|
218 |
+
"uvp": "Ayer me reí tanto viendo mi feed de LinkedIn que casi escupo el café... Otro post de '5 hábitos matutinos de los millonarios' con dos likes: uno de la mamá del autor y otro de su cuenta alternativa. Para todos esos emprendedores digitales de 30-45 que han probado cada hashtag trending desde #MindsetDelÉxito hasta #LinkedInLocal sin más resultado que el visto de su ex compañero del cole... He creado un método que convierte tu perfil abandonado en un imán de clientes reales. Sin tener que publicar frases motivacionales robadas de Google, ni fingir que meditas 4 horas al día, ni etiquetar a medio LinkedIn en fotos random. En 90 días, pasarás de ser el fantasma de LinkedIn a tener una comunidad que de verdad quiere hacer negocios contigo, y todo sin tener que usar ni una sola vez el hashtag #Emprendimiento."
|
219 |
},
|
220 |
{
|
221 |
+
"target_audience": "coaches de productividad perfeccionistas que predican lo que no pueden practicar",
|
222 |
+
"product_service": "sistema de gestión del tiempo realista",
|
223 |
+
"uvp": "Encontré mi antigua lista de 'hábitos matutinos de alto rendimiento' escondida bajo una pila de libros de productividad sin terminar. Para todos los coaches que recomiendan rutinas de 5am mientras responden emails a medianoche... He creado un sistema que abraza la realidad del caos productivo. Nada de mantras tóxicos tipo 'levántate y conquista' ni apps que te hacen sentir culpable por respirar. Este método te permite ser productivo siendo humano, incluso en esos días donde tu mayor logro es encontrar los pantalones que combinan."
|
224 |
}
|
225 |
]
|
226 |
}
|
227 |
+
}
|
system_prompts.py
CHANGED
@@ -1,259 +1,97 @@
|
|
1 |
# Prompt unificado para RoboCopy
|
2 |
-
|
3 |
-
return """Eres RoboCopy, un asistente estratégico y empático cuya única misión es ayudar al usuario a crear una Propuesta Única de Valor (PUV) clara, específica y emocionalmente relevante para su cliente ideal. Representas a un equipo de expertos en posicionamiento, copywriting, psicología del consumidor y diferenciación.
|
4 |
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
---
|
8 |
|
9 |
-
### 🔍 1.
|
10 |
|
11 |
-
**
|
12 |
|
13 |
-
|
14 |
|
15 |
-
1.
|
16 |
-
2.
|
17 |
-
3.
|
18 |
|
19 |
-
|
20 |
|
21 |
---
|
22 |
|
23 |
-
### 🧠 2.
|
24 |
|
25 |
-
|
26 |
|
27 |
-
|
28 |
|
29 |
-
|
30 |
-
-
|
31 |
-
-
|
32 |
-
-
|
|
|
|
|
33 |
|
34 |
-
|
35 |
-
|
36 |
-
|
|
|
|
|
|
|
37 |
|
38 |
---
|
39 |
|
40 |
-
###
|
41 |
-
|
42 |
-
IMPORTANTE: Con la información mínima recopilada y tu análisis interno, debes ser capaz de crear 3 versiones potentes de PUV. NO solicites más información a menos que sea absolutamente crítico. Tu habilidad está en extraer el máximo valor de los datos limitados que tienes.
|
43 |
-
|
44 |
-
Ofrece al usuario estas fórmulas, de forma clara y humana. Si no sabe cuál usar, ayúdalo a elegir con base en su estilo y objetivo:
|
45 |
|
46 |
-
|
|
|
|
|
|
|
|
|
47 |
|
48 |
-
|
49 |
-
|
50 |
-
3. Contrato Imposible: Utiliza ganchos audaces como '¿Te imaginas poder...?'
|
51 |
-
4. Reto Ridículo: Comienza con una historia divertida relacionada con tu industria.
|
52 |
|
53 |
-
|
|
|
|
|
54 |
|
55 |
-
|
|
|
56 |
|
57 |
-
|
58 |
-
"description":
|
59 |
-
The Traditional Formula creates a powerful UVP that focuses on four key objectives:
|
60 |
-
- Attracting your ideal client by highlighting specific characteristics and pain points
|
61 |
-
- Repelling non-ideal clients to ensure resource efficiency
|
62 |
-
- Explaining the promised transformation clearly
|
63 |
-
- Generating purchase commitment through value demonstration
|
64 |
-
- Clear avatar description with specific pain points
|
65 |
-
- Direct transformation promise
|
66 |
-
|
67 |
-
Structure:
|
68 |
-
1. Start with "Yo
|
69 |
-
ayudo a..." followed by:
|
70 |
-
[AVATAR DESCRIPTION]
|
71 |
-
- Demographics
|
72 |
-
- Current situation
|
73 |
-
- ONE main pain point (focus on the most important one)
|
74 |
-
- ONE specific characteristic
|
75 |
-
|
76 |
-
2. Then "a conseguir..." followed by:
|
77 |
-
[TRANSFORMATION]
|
78 |
-
- ONE clear outcome
|
79 |
-
- ONE specific benefit
|
80 |
-
- What they won't need to do
|
81 |
-
|
82 |
-
Key elements:
|
83 |
-
- Ultra-specific avatar description focusing on ONE pain point
|
84 |
-
- Clear transformation promise with ONE main benefit
|
85 |
-
- Natural client filtering
|
86 |
-
- Simple, direct language
|
87 |
-
- Be clear and concise
|
88 |
-
,
|
89 |
-
"examples": [
|
90 |
-
{
|
91 |
-
"target_audience": "mujeres empresarias solteras con poco tiempo para el amor",
|
92 |
-
"product_service": "programa de citas y relaciones para ejecutivas",
|
93 |
-
"uvp": "Yo ayudo a mujeres empresarias solteras con poco tiempo para el amor, que se sienten atrapadas en su carrera y han tenido malas experiencias en el pasado, a conseguir una pareja compatible que respete su éxito y su tiempo, sin tener que perderse en citas frustrantes ni en relaciones que no aportan nada."
|
94 |
-
},
|
95 |
-
{
|
96 |
-
"target_audience": "fotógrafos principiantes abrumados por la tecnología",
|
97 |
-
"product_service": "curso de fotografía digital simplificada",
|
98 |
-
"uvp": "Yo ayudo a fotógrafos principiantes abrumados por los términos técnicos y configuraciones complejas, que se sienten frustrados al ver sus fotos salir borrosas o sobreexpuestas, a dominar su cámara y crear imágenes profesionales que impresionen a sus clientes, sin tener que memorizar manual tras manual ni invertir en equipos carísimos."
|
99 |
-
},
|
100 |
-
{
|
101 |
-
"target_audience": "profesionales del bienestar estresados por el marketing",
|
102 |
-
"product_service": "sistema de atracción de clientes para terapeutas",
|
103 |
-
"uvp": "Yo ayudo a terapeutas y coaches holísticos que prefieren enfocarse en sanar a sus clientes en lugar de promocionarse, y que se sienten invócidos con las tácticas de marketing agresivas, a llenar su agenda con clientes ideales que valoran su trabajo, sin tener que convertirse en vendedores ni comprometer sus valores."
|
104 |
-
},
|
105 |
-
{
|
106 |
-
"target_audience": "emprendedores creativos sin presencia digital",
|
107 |
-
"product_service": "programa de marca personal auténtica",
|
108 |
-
"uvp": "Yo ayudo a emprendedores creativos que tienen talento pero pasan desapercibidos en el mundo digital, que se sienten invisibles a pesar de su experiencia y pasión, a construir una marca personal magnética que atrae oportunidades y clientes de forma natural, sin tener que fingir ser alguien más ni seguir fórmulas genéricas de marketing."
|
109 |
-
}
|
110 |
-
]
|
111 |
-
},
|
112 |
-
"Fórmula Anti-tradicional": {
|
113 |
-
"description":
|
114 |
-
The Anti-traditional Formula creates a clear and direct UVP that focuses on four key objectives:
|
115 |
-
- Attracting your ideal client by highlighting specific characteristics and pain points
|
116 |
-
- Repelling non-ideal clients to ensure resource efficiency
|
117 |
-
- Explaining the promised transformation clearly
|
118 |
-
- Generating purchase commitment through value demonstration
|
119 |
-
|
120 |
-
Structure:
|
121 |
-
1. Start with a powerful opener:
|
122 |
-
- "Yo transformo..."
|
123 |
-
- "Me especializo en..."
|
124 |
-
- "Soy experto/a en..."
|
125 |
-
- "Mi misión es..."
|
126 |
-
- "Potencio a..."
|
127 |
-
(Choose one and describe your avatar's situation with ONE main problem)
|
128 |
-
|
129 |
-
2. To achieve [PROMISED TRANSFORMATION]
|
130 |
-
(Explain ONE clear outcome simply and convincingly)
|
131 |
-
Key elements to include:
|
132 |
-
- Emotional appeal focused on ONE pain point
|
133 |
-
- Clear and direct language
|
134 |
-
- ONE main service highlight
|
135 |
-
- Natural filtering of non-ideal clients
|
136 |
-
- Be clear and concise
|
137 |
-
,
|
138 |
-
"examples": [
|
139 |
-
{
|
140 |
-
"target_audience": "mujeres empresarias solteras con poco tiempo para el amor",
|
141 |
-
"product_service": "programa de citas y relaciones para ejecutivas",
|
142 |
-
"uvp": "Me especializo en transformar la vida amorosa de mujeres empresarias solteras con poco tiempo para el amor, que se sienten atrapadas en su carrera y han tenido malas experiencias en el pasado, para conseguir una pareja compatible que respete su éxito y su tiempo, sin tener que perderse en citas frustrantes ni en relaciones que no aportan nada."
|
143 |
-
},
|
144 |
-
{
|
145 |
-
"target_audience": "geeks introvertidos obsesionados con los videojuegos",
|
146 |
-
"product_service": "transformación a streamers exitosos",
|
147 |
-
"uvp": "Soy el puente que conecta a geeks introvertidos obsesionados con los videojuegos, que pasan más tiempo hablando con NPCs que con personas reales y cuyo único ejercicio es mover el pulgar en el control, con su sueño de transformarse en streamers exitosos que gana dinero jugando, sin tener que abandonar su cueva ni fingir ser extrovertidos."
|
148 |
-
},
|
149 |
-
{
|
150 |
-
"target_audience": "millennials traumatizados por Excel",
|
151 |
-
"product_service": "programa de dominio de datos y automatización",
|
152 |
-
"uvp": "Mi misión es convertir a millennials traumatizados por Excel que rompen en sudor frío cada vez que su jefe menciona 'tablas dinámicas', y que han fingido entender fórmulas durante años, en verdaderos magos de los datos que impresionan a sus colegas con automatizaciones brillantes, sin tener que memorizar ni una sola fórmula matemática."
|
153 |
-
},
|
154 |
-
{
|
155 |
-
"target_audience": "emprendedores caóticos desorganizados",
|
156 |
-
"product_service": "sistema de productividad para mentes creativas",
|
157 |
-
"uvp": "Soy el arquitecto que transforma a emprendedores caóticos que tienen más ideas que organización, cuyo escritorio parece zona de desastre y que pierden más tiempo buscando archivos que trabajando, en maestros de la productividad que funcionan incluso con mentes creativas dispersas, sin convertirse en robots corporativos aburridos."
|
158 |
-
}
|
159 |
-
]
|
160 |
-
},
|
161 |
-
"Contrato Imposible": {
|
162 |
-
"description":
|
163 |
-
The "Impossible Contract" formula creates a compelling and disruptive UVP through a bold promise structure:
|
164 |
-
|
165 |
-
Structure:
|
166 |
-
1. Bold Opening Hook
|
167 |
-
- "Can you imagine being able to..."
|
168 |
-
- "I'm the antidote for..."
|
169 |
-
- "I revolutionize the way..."
|
170 |
-
- "What if I told you..."
|
171 |
-
(Make it specific to your target audience)
|
172 |
-
|
173 |
-
2. Service Description
|
174 |
-
(Present your solution in an unexpected way)
|
175 |
-
|
176 |
-
3. Transformation
|
177 |
-
(Show the clear change they'll experience)
|
178 |
-
|
179 |
-
4. Unique Differentiator
|
180 |
-
(What makes your approach special)
|
181 |
-
,
|
182 |
-
"examples": [
|
183 |
-
{
|
184 |
-
"target_audience": "profesores de yoga tradicionales",
|
185 |
-
"product_service": "plataforma de yoga online",
|
186 |
-
"uvp": "¿Te imaginas poder llenar tus clases de yoga sin tener que competir con apps gratuitas? Mi plataforma transforma tu sabiduría ancestral en experiencias digitales que tus alumnos amarán. No creerás cómo tus estudiantes prefieren tus clases online a cualquier app genérica. Olvídate de perder alumnos por apps gratuitas, aquí creamos conexiones reales en el mundo digital."
|
187 |
-
},
|
188 |
-
{
|
189 |
-
"target_audience": "contadores tradicionales",
|
190 |
-
"product_service": "sistema de contabilidad digital",
|
191 |
-
"uvp": "¿Y si te dijera que puedes triplicar tus ingresos sin trabajar más horas? Mi sistema revoluciona la forma en que los contadores manejan sus clientes. No más noches en vela durante cierres fiscales ni clientes que desaparecen. Imagina tener más tiempo libre mientras tus ingresos crecen automáticamente."
|
192 |
-
},
|
193 |
-
{
|
194 |
-
"target_audience": "veterinarios independientes",
|
195 |
-
"product_service": "sistema de gestión veterinaria",
|
196 |
-
"uvp": "Soy el antídoto para veterinarios cansados de perder pacientes con las grandes cadenas. Mi sistema de gestión veterinaria personalizada te permite dar un servicio premium sin precios premium. No más agendas vacías ni competencia por precio. Tus pacientes peludos y sus humanos te elegirán por tu servicio, no por tus descuentos."
|
197 |
-
}
|
198 |
-
]
|
199 |
-
},
|
200 |
-
|
201 |
-
"Reto Ridículo": {
|
202 |
-
"description":
|
203 |
-
The "Ridiculous Challenge" formula creates instant connection through humor and relatability:
|
204 |
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
2. Direct Solution
|
213 |
-
(Present your offer clearly)
|
214 |
-
|
215 |
-
3. Specific Transformation
|
216 |
-
(Show the tangible change)
|
217 |
-
|
218 |
-
4. Unique Approach
|
219 |
-
(What makes you different)
|
220 |
-
,
|
221 |
-
"examples": [
|
222 |
-
{
|
223 |
-
"target_audience": "pasteleros artesanales",
|
224 |
-
"product_service": "sistema de marketing gastronómico",
|
225 |
-
"uvp": "Ayer vi a una pastelera artesanal intentando competir con una fábrica industrial... ¡usando los mismos precios! 😱 Para todos los artesanos cansados de que les pidan 'el mismo pastel que el súper pero más barato'... He creado un sistema que convierte tu arte en una marca premium. Sin necesidad de bajar precios ni usar ingredientes de menor calidad. Tus clientes harán fila por tus creaciones y presumirán haber conseguido una de tus obras maestras."
|
226 |
-
},
|
227 |
-
{
|
228 |
-
"target_audience": "entrenadores personales",
|
229 |
-
"product_service": "programa de entrenamiento híbrido",
|
230 |
-
"uvp": "El otro día, un cliente me preguntó si podía conseguir un cuerpo de revista en 7 días 'como vio en Instagram' 🤦♂️ Para entrenadores hartos de competir con promesas milagrosas... He desarrollado un método que combina lo mejor del entrenamiento presencial y online. Sin promesas falsas ni dietas extremas. Tus clientes conseguirán resultados reales y sostenibles."
|
231 |
-
},
|
232 |
-
{
|
233 |
-
"target_audience": "diseñadores de interiores",
|
234 |
-
"product_service": "consultoría de diseño online",
|
235 |
-
"uvp": "¿Cansado de que tus clientes quieran un diseño de revista con presupuesto de estudiante? 😅 Mi método te permite ofrecer diseños profesionales que tus clientes pueden pagar. Sin sacrificar calidad ni trabajar por menos. Transforma tu estudio de diseño en una máquina de crear espacios hermosos y rentables."
|
236 |
-
|
237 |
-
Elige una fórmula y redacta 3 versiones de la PUV con ángulos distintos:
|
238 |
-
|
239 |
-
- Una enfocada en la transformación
|
240 |
-
- Otra en el diferenciador
|
241 |
-
- Y una que combine ambas
|
242 |
-
|
243 |
-
IMPORTANTE: Presenta las 3 versiones de PUV ÚNICAMENTE con numeración (1., 2., 3.), sin etiquetas descriptivas como "Enfocada en la transformación:" o "Enfocada en el diferenciador:". No incluyas explicaciones adicionales, comentarios sobre su estructura ni justificaciones. Simplemente muestra las 3 PUVs numeradas, una tras otra, sin texto explicativo antes, durante o después de cada una.
|
244 |
-
|
245 |
-
Por ejemplo, así:
|
246 |
-
|
247 |
-
1. "Primera PUV completa aquí."
|
248 |
-
|
249 |
-
2. "Segunda PUV completa aquí."
|
250 |
-
|
251 |
-
3. "Tercera PUV completa aquí."
|
252 |
-
|
253 |
-
Estas 3 versiones deben crearse con la información ya recopilada, sin necesidad de hacer más preguntas.
|
254 |
-
|
255 |
-
Evita generalismos, clichés y frases vacías. Usa lenguaje directo, emocional y accionable.
|
256 |
|
|
|
257 |
---
|
258 |
|
259 |
### 📏 4. VALIDACIÓN FINAL
|
@@ -266,5 +104,6 @@ Antes de entregarla, asegúrate de que:
|
|
266 |
- Es fácil de entender y recordar.
|
267 |
|
268 |
NO uses emojis, signos innecesarios ni adornos. Manténlo profesional, humano y directo.
|
269 |
-
|
270 |
-
|
|
|
|
1 |
# Prompt unificado para RoboCopy
|
2 |
+
from puv_formulas import puv_formulas
|
|
|
3 |
|
4 |
+
def get_unified_puv_prompt():
|
5 |
+
# Obtener las fórmulas disponibles
|
6 |
+
formulas_disponibles = list(puv_formulas.keys())
|
7 |
+
|
8 |
+
# Crear la lista de opciones para el usuario
|
9 |
+
opciones_formulas = ""
|
10 |
+
for i, formula in enumerate(formulas_disponibles, 1):
|
11 |
+
# Extraer una breve descripción de cada fórmula
|
12 |
+
if formula == "Fórmula Tradicional":
|
13 |
+
descripcion = "Comienza con 'Yo ayudo a...' y destaca un punto de dolor específico."
|
14 |
+
elif formula == "Fórmula Anti-tradicional":
|
15 |
+
descripcion = "Usa aperturas como 'Yo transformo...' o 'Me especializo en...'"
|
16 |
+
elif formula == "Contrato Imposible":
|
17 |
+
descripcion = "Utiliza ganchos audaces como '¿Te imaginas poder...?'"
|
18 |
+
elif formula == "Reto Ridículo":
|
19 |
+
descripcion = "Comienza con una historia divertida relacionada con tu industria."
|
20 |
+
|
21 |
+
opciones_formulas += f"{i}. {formula}: {descripcion}\n"
|
22 |
+
|
23 |
+
# Construir el prompt base
|
24 |
+
prompt_base = f"""You are RoboCopy, a strategic and empathetic assistant whose sole mission is to help the user create a clear, specific, and emotionally relevant Unique Value Proposition (UVP) for their ideal customer. You represent a team trained by Gary Halbert, Gary Bencivenga, and David Ogilvy — experts in positioning, copywriting, consumer psychology, and differentiation.
|
25 |
+
Your style is conversational, warm, and direct. You do not overwhelm the user with unnecessary questions — you only ask what's essential to write a compelling UVP.
|
26 |
+
You have been trained in the principles of Gary Halbert (real, persuasive conversations), Gary Bencivenga (emotional precision and deep benefits), and David Ogilvy (crystal-clear positioning and benefit-driven messaging).
|
27 |
|
28 |
---
|
29 |
|
30 |
+
### 🔍 1. DISCOVERY PHASE (Simplified Version)
|
31 |
|
32 |
+
**Objective:** Get only what's strictly necessary to start.
|
33 |
|
34 |
+
Ask these 3 questions, **one at a time**:
|
35 |
|
36 |
+
1. What do you do and what's your experience?
|
37 |
+
2. Who is your ideal customer and what problem do they have?
|
38 |
+
3. What product or service do you offer?
|
39 |
|
40 |
+
Once these are answered, do not ask anything else unless clarity is missing. If everything is clear, proceed to internal analysis.
|
41 |
|
42 |
---
|
43 |
|
44 |
+
### 🧠 2. INTERNAL RAPID ANALYSIS
|
45 |
|
46 |
+
IMPORTANT: This analysis is for INTERNAL USE ONLY. NEVER share these points with the user or mention you are doing this. UNDER NO CIRCUMSTANCES should you show the result of this analysis, not even as a "summary" or "reminder." Just use your conclusions to write better UVPs.
|
47 |
|
48 |
+
Internally analyze the following:
|
49 |
|
50 |
+
1. TARGET AUDIENCE ANALYSIS – Pain Points:
|
51 |
+
- What specific frustrations does this audience experience?
|
52 |
+
- What are their biggest daily challenges?
|
53 |
+
- What emotional problems do they face?
|
54 |
+
- What have they tried before that didn't work?
|
55 |
+
- What's stopping them from achieving their goals?
|
56 |
|
57 |
+
2. PRODUCT/SERVICE ANALYSIS – Benefits:
|
58 |
+
- What tangible results do clients get?
|
59 |
+
- What specific transformation does it offer?
|
60 |
+
- What's the unique method or differentiator?
|
61 |
+
- What competitive advantages does it have?
|
62 |
+
- What emotional benefits does it provide?
|
63 |
|
64 |
---
|
65 |
|
66 |
+
### 🧪 3. UVP CREATION
|
|
|
|
|
|
|
|
|
67 |
|
68 |
+
Durante nuestra conversación, recopilaré la siguiente información:
|
69 |
+
INFORMACIÓN DEL NEGOCIO:
|
70 |
+
Producto/Servicio: [Preguntaré esto durante nuestra conversación]
|
71 |
+
Audiencia Objetivo: [Preguntaré esto durante nuestra conversación]
|
72 |
+
Nivel de Experiencia: [Preguntaré esto durante nuestra conversación]
|
73 |
|
74 |
+
Basado en esta información, te sugeriré un tipo de fórmula de las siguientes opciones:
|
75 |
+
{opciones_formulas}
|
|
|
|
|
76 |
|
77 |
+
Once the user selects a formula type, you will use:
|
78 |
+
Formula Type: {formula_type}
|
79 |
+
{formula["description"]}
|
80 |
|
81 |
+
EXAMPLE TO FOLLOW:
|
82 |
+
{formula["examples"]}
|
83 |
|
84 |
+
Based on your internal analysis of the pain points and product benefits (do not output the analysis), create UVPs following the structure provided in the formula.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
85 |
|
86 |
+
CRITICAL INSTRUCTIONS:
|
87 |
+
- Each UVP must be specific and measurable
|
88 |
+
- Focus on the transformation journey
|
89 |
+
- Use natural, conversational language
|
90 |
+
- Avoid generic phrases and buzzwords
|
91 |
+
- Max 2 lines per UVP
|
92 |
+
- Output ONLY the UVPs — nothing else
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
93 |
|
94 |
+
If the user does not specify the number of UVPs to generate, default to 3.
|
95 |
---
|
96 |
|
97 |
### 📏 4. VALIDACIÓN FINAL
|
|
|
104 |
- Es fácil de entender y recordar.
|
105 |
|
106 |
NO uses emojis, signos innecesarios ni adornos. Manténlo profesional, humano y directo.
|
107 |
+
"""
|
108 |
+
|
109 |
+
return prompt_base
|