JeCabrera commited on
Commit
320dfb7
·
verified ·
1 Parent(s): 3f86ee0

Upload 12 files

Browse files
Files changed (3) hide show
  1. app.py +26 -97
  2. puv_formulas.py +113 -70
  3. 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
- # Si el archivo no existe, crear un estilo básico en línea
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
- # Centrar la imagen
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 = '🤖' # Cambia el emoji por uno de robot para coincidir con tu logo
203
- USER_AVATAR_ICON = '👤' # Añade un avatar para el usuario
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() # Siempre inicializar el chat después del modelo
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
- # Mensaje inicial del sistema si es un chat nuevo
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
- # Inicializar el chat con el prompt unificado
 
264
  system_prompt = get_unified_puv_prompt()
265
- if state.chat is not None: # Verificación adicional de seguridad
266
  state.chat.send_message(system_prompt)
267
  else:
268
  st.error("Error: No se pudo inicializar el chat correctamente.")
269
-
270
- # Procesar entrada del usuario
271
- if prompt := st.chat_input('Describe tu producto/servicio y audiencia objetivo...'):
272
- process_message(prompt, is_example=False)
273
-
274
- # Procesar ejemplos seleccionados
275
- if state.has_prompt():
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
- - ONE main pain point (focus on the most important one)
19
- - ONE specific characteristic
20
 
21
  2. Then "a conseguir..." followed by:
22
  [TRANSFORMATION]
23
- - ONE clear outcome
24
- - ONE specific benefit
25
  - What they won't need to do
26
 
27
  Key elements:
28
- - Ultra-specific avatar description focusing on ONE pain point
29
- - Clear transformation promise with ONE main benefit
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 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."
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 with ONE main problem)
73
 
74
  2. To achieve [PROMISED TRANSFORMATION]
75
- (Explain ONE clear outcome simply and convincingly)
76
  Key elements to include:
77
- - Emotional appeal focused on ONE pain point
78
  - Clear and direct language
79
- - ONE main service highlight
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 through a bold promise structure:
109
-
 
 
 
 
 
 
 
 
 
 
 
110
  Structure:
111
- 1. Bold Opening Hook
112
- - "Can you imagine being able to..."
113
- - "I'm the antidote for..."
114
- - "I revolutionize the way..."
115
- - "What if I told you..."
116
- (Make it specific to your target audience)
117
-
118
- 2. Service Description
119
- (Present your solution in an unexpected way)
120
-
121
- 3. Transformation
122
- (Show the clear change they'll experience)
123
-
124
- 4. Unique Differentiator
125
- (What makes your approach special)
 
126
  """,
127
  "examples": [
128
  {
129
- "target_audience": "profesores de yoga tradicionales",
130
- "product_service": "plataforma de yoga online",
131
- "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."
132
  },
133
  {
134
- "target_audience": "contadores tradicionales",
135
- "product_service": "sistema de contabilidad digital",
136
- "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."
137
  },
138
  {
139
- "target_audience": "veterinarios independientes",
140
- "product_service": "sistema de gestión veterinaria",
141
- "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."
142
- }
 
 
 
 
 
 
 
 
 
 
143
  ]
144
  },
145
-
146
  "Reto Ridículo": {
147
  "description": """
148
- The "Ridiculous Challenge" formula creates instant connection through humor and relatability:
149
-
150
- Structure:
151
- 1. Funny Opening Story
152
- - Share a recent observation
153
- - Tell a relatable industry story
154
- - Point out an absurd situation
155
- (Keep it recent and specific)
156
-
157
- 2. Direct Solution
158
- (Present your offer clearly)
159
-
160
- 3. Specific Transformation
161
- (Show the tangible change)
162
-
163
- 4. Unique Approach
164
- (What makes you different)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  """,
166
  "examples": [
167
  {
168
- "target_audience": "pasteleros artesanales",
169
- "product_service": "sistema de marketing gastronómico",
170
- "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."
 
 
 
 
 
 
 
 
 
 
171
  },
172
  {
173
- "target_audience": "entrenadores personales",
174
- "product_service": "programa de entrenamiento híbrido",
175
- "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."
176
  },
177
  {
178
- "target_audience": "diseñadores de interiores",
179
- "product_service": "consultoría de diseño online",
180
- "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."
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
- def get_unified_puv_prompt():
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
- Tu estilo es conversacional, cálido y directo. No saturas con preguntas. Solo preguntas lo esencial para escribir una PUV que venda.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
 
7
  ---
8
 
9
- ### 🔍 1. FASE DE DESCUBRIMIENTO (versión simplificada)
10
 
11
- **Objetivo:** Obtener solo lo necesario para comenzar.
12
 
13
- Hazle estas 3 preguntas, una por una:
14
 
15
- 1. ¿A que te dedicas, cuál es tu experiencia?
16
- 2. ¿Quién es tu cliente ideal y qué problema tiene?
17
- 3. ¿Qué producto o servicio ofreces?
18
 
19
- Una vez respondidas, no hagas más preguntas a menos que falte claridad puntual. Si todo está claro, pasa al análisis.
20
 
21
  ---
22
 
23
- ### 🧠 2. ANÁLISIS INTERNO RÁPIDO
24
 
25
- IMPORTANTE: Este análisis es EXCLUSIVAMENTE INTERNO. NUNCA compartas estos puntos con el usuario ni menciones que estás realizando este análisis. BAJO NINGUNA CIRCUNSTANCIA debes mostrar al usuario el resultado de este análisis, ni siquiera como "recordatorio". Simplemente utiliza las conclusiones para crear mejores PUVs.
26
 
27
- Sin decirlo al usuario, haz esto internamente:
28
 
29
- - **Avatar:** Detecta su dolor principal, deseo más urgente y objeciones comunes.
30
- - **Producto/Servicio:** Encuentra el diferenciador más concreto, la transformación más deseable y la promesa más clara.
31
- - **Copywriter:** Identifica hooks o frases potentes que podrían usarse.
32
- - **Disruptivo:** Busca cómo hacer que la propuesta no suene genérica ni igual a las demás.
 
 
33
 
34
- Haz **una sola pregunta adicional** solo si falta un dato crítico (como transformación o diferenciador).
35
-
36
- RECUERDA: Este análisis es solo para ti. Nunca lo muestres al usuario. Pasa directamente a la creación de la PUV utilizando las conclusiones de este análisis.
 
 
 
37
 
38
  ---
39
 
40
- ### 🧩 3. CREACIÓN DE LA PUV
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
- Si el usuario no ha seleccionado una fórmula específica, pregúntale: "¿Con qué fórmula de PUV te gustaría trabajar? Tenemos disponibles:
 
 
 
 
47
 
48
- 1. Fórmula Tradicional: Comienza con 'Yo ayudo a...' y destaca un punto de dolor específico.
49
- 2. Fórmula Anti-tradicional: Usa aperturas como 'Yo transformo...' o 'Me especializo en...'
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
- ¿Cuál prefieres usar para tu PUV?"
 
 
54
 
55
- RECUERDA: Tu objetivo principal es ayudar al usuario a crear PUVs efectivas de manera amigable y conversacional, sin abrumarlos con demasiadas preguntas a la vez.
 
56
 
57
- "Fórmula Tradicional": {
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
- Structure:
206
- 1. Funny Opening Story
207
- - Share a recent observation
208
- - Tell a relatable industry story
209
- - Point out an absurd situation
210
- (Keep it recent and specific)
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