JeCabrera commited on
Commit
b6b7f7a
·
verified ·
1 Parent(s): 657617d

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -235
app.py CHANGED
@@ -105,142 +105,53 @@ for message in st.session_state.messages:
105
  ):
106
  st.markdown(message['content'])
107
 
108
- # Inicializar variables de estado
109
- if 'show_examples' not in st.session_state:
110
- st.session_state.show_examples = True
111
- if 'selected_persona' not in st.session_state:
112
- st.session_state.selected_persona = "estratega"
113
-
114
- # Función para seleccionar persona
115
- def select_puv_persona():
116
- st.sidebar.write("## 🧠 Selecciona un Experto")
117
-
118
- # Inicializar la selección de persona si no existe
119
- if 'selected_persona' not in st.session_state:
120
- st.session_state.selected_persona = "estratega"
121
-
122
- # Crear botones para cada persona
123
- cols = st.sidebar.columns(len(PUV_PERSONAS))
124
- for i, (persona_id, persona) in enumerate(PUV_PERSONAS.items()):
125
- with cols[i]:
126
- if st.button(f"{persona['emoji']}\n{persona['nombre']}", key=f"btn_{persona_id}"):
127
- st.session_state.selected_persona = persona_id
128
- st.rerun()
129
-
130
- # Mostrar descripción de la persona seleccionada
131
- persona_actual = PUV_PERSONAS[st.session_state.selected_persona]
132
- st.sidebar.markdown(f"**{persona_actual['emoji']} {persona_actual['nombre']}**")
133
- st.sidebar.markdown(f"_{persona_actual['descripcion']}_")
134
-
135
- return st.session_state.selected_persona
136
-
137
- # Función para modificar el prompt con la personalidad seleccionada
138
- def apply_persona_to_prompt(prompt, persona_id):
139
- if persona_id in PUV_PERSONAS:
140
- persona = PUV_PERSONAS[persona_id]
141
- return f"{persona['prompt_prefix']}\n\nConsulta original: {prompt}"
142
- return prompt
143
-
144
- # Función para manejar mensajes
145
- def add_message(role, content, avatar=None):
146
- message = {
147
- 'role': role,
148
- 'content': content
149
- }
150
- if avatar:
151
- message['avatar'] = avatar
152
- st.session_state.messages.append(message)
153
- return message
154
-
155
- # Función para guardar el estado del chat
156
- def save_chat_state():
157
- joblib.dump(
158
- st.session_state.messages,
159
- f'data/{st.session_state.chat_id}-st_messages',
160
- )
161
- joblib.dump(
162
- st.session_state.gemini_history,
163
- f'data/{st.session_state.chat_id}-gemini_messages',
164
- )
165
-
166
- # Función para generar título de chat
167
- def generate_chat_title(prompt):
168
- temp_title = f'SesiónChat-{st.session_state.chat_id}'
169
- try:
170
- title_generator = genai.GenerativeModel('gemini-2.0-flash')
171
- title_response = title_generator.generate_content(
172
- f"Genera un título corto (máximo 5 palabras) que describa de qué trata esta consulta, sin usar comillas ni puntuación: '{prompt}'")
173
-
174
- generated_title = title_response.text.strip()
175
- if generated_title:
176
- return generated_title
177
- except Exception as e:
178
- print(f"Error al generar título: {e}")
179
- return temp_title
180
-
181
- # Función para operaciones con manejo de errores
182
- def safe_operation(operation, default_value, error_message="Error en operación"):
183
- try:
184
- return operation()
185
- except Exception as e:
186
- print(f"{error_message}: {e}")
187
- return default_value
188
-
189
- # Definición de perfiles de expertos en PUV
190
- PUV_PERSONAS = {
191
- "estratega": {
192
- "nombre": "Estratega de Marketing",
193
- "descripcion": "Experto en posicionamiento estratégico y diferenciación de marca",
194
- "prompt_prefix": "Como estratega de marketing especializado en posicionamiento de marca, voy a ayudarte a crear una PUV que destaque tu ventaja competitiva. ",
195
- "emoji": "🎯"
196
- },
197
- "copywriter": {
198
- "nombre": "Copywriter Persuasivo",
199
- "descripcion": "Especialista en redacción persuasiva y mensajes de alto impacto",
200
- "prompt_prefix": "Como copywriter especializado en mensajes persuasivos, voy a ayudarte a crear una PUV que conecte emocionalmente con tu audiencia. ",
201
- "emoji": "✍️"
202
- },
203
- "analista": {
204
- "nombre": "Analista de Mercado",
205
- "descripcion": "Experto en análisis de mercado y comportamiento del consumidor",
206
- "prompt_prefix": "Como analista de mercado especializado en comportamiento del consumidor, voy a ayudarte a crear una PUV basada en insights de tu audiencia. ",
207
- "emoji": "📊"
208
- },
209
- "innovador": {
210
- "nombre": "Innovador Disruptivo",
211
- "descripcion": "Especialista en propuestas innovadoras y disruptivas",
212
- "prompt_prefix": "Como especialista en innovación disruptiva, voy a ayudarte a crear una PUV que rompa con los paradigmas de tu industria. ",
213
- "emoji": "💡"
214
- }
215
- }
216
-
217
- # Modificar el procesamiento del prompt
218
- if prompt := st.chat_input('¿En qué puedo ayudarte hoy con tu Propuesta Única de Valor?'):
219
- # Guardar el prompt original
220
- original_prompt = prompt
221
-
222
- # Aplicar la personalidad seleccionada al prompt
223
- enhanced_prompt = apply_persona_to_prompt(prompt, st.session_state.selected_persona)
224
-
225
- # Generar título para el chat si es nuevo
226
  if st.session_state.chat_id not in past_chats.keys():
227
- st.session_state.chat_title = generate_chat_title(original_prompt)
228
- past_chats[st.session_state.chat_id] = st.session_state.chat_title
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  else:
 
230
  st.session_state.chat_title = past_chats[st.session_state.chat_id]
231
 
232
  joblib.dump(past_chats, 'data/past_chats_list')
233
 
234
- # Mostrar mensaje del usuario (siempre el original)
235
- with st.chat_message('user', avatar=USER_AVATAR_ICON):
236
- st.markdown(original_prompt)
237
-
238
- # Añadir mensaje a la historia
239
- add_message('user', original_prompt, USER_AVATAR_ICON)
240
-
241
- # Enviar el prompt mejorado al modelo
 
 
 
242
  response = st.session_state.chat.send_message(
243
- enhanced_prompt,
244
  stream=True,
245
  )
246
  # Display assistant response in chat message container
@@ -259,12 +170,12 @@ if prompt := st.chat_input('¿En qué puedo ayudarte hoy con tu Propuesta Única
259
  # Streams in a chunk at a time
260
  for chunk in response:
261
  # Simulate stream of chunk
262
- for word in chunk.text.split(' '):
263
- full_response += word + ' '
264
- time.sleep(0.1) # Velocidad ajustada para mejor legibilidad
 
265
  # Rewrites with a cursor at end
266
  message_placeholder.write(full_response + '▌')
267
-
268
  # Elimina el indicador de escritura
269
  typing_indicator.empty()
270
  # Write full message with placeholder
@@ -280,105 +191,11 @@ if prompt := st.chat_input('¿En qué puedo ayudarte hoy con tu Propuesta Única
280
  )
281
  st.session_state.gemini_history = st.session_state.chat.history
282
  # Save to file
283
- # Función para manejar mensajes
284
- def add_message(role, content, avatar=None):
285
- message = {
286
- 'role': role,
287
- 'content': content
288
- }
289
- if avatar:
290
- message['avatar'] = avatar
291
- st.session_state.messages.append(message)
292
- return message
293
-
294
- # Función para guardar el estado del chat
295
- def save_chat_state():
296
- joblib.dump(
297
- st.session_state.messages,
298
- f'data/{st.session_state.chat_id}-st_messages',
299
- )
300
- joblib.dump(
301
- st.session_state.gemini_history,
302
- f'data/{st.session_state.chat_id}-gemini_messages',
303
- )
304
-
305
- # Función para generar título de chat
306
- def generate_chat_title(prompt):
307
- temp_title = f'SesiónChat-{st.session_state.chat_id}'
308
- try:
309
- title_generator = genai.GenerativeModel('gemini-2.0-flash')
310
- title_response = title_generator.generate_content(
311
- f"Genera un título corto (máximo 5 palabras) que describa de qué trata esta consulta, sin usar comillas ni puntuación: '{prompt}'")
312
-
313
- generated_title = title_response.text.strip()
314
- if generated_title:
315
- return generated_title
316
- except Exception as e:
317
- print(f"Error al generar título: {e}")
318
- return temp_title
319
-
320
- # Función para operaciones con manejo de errores
321
- def safe_operation(operation, default_value, error_message="Error en operación"):
322
- try:
323
- return operation()
324
- except Exception as e:
325
- print(f"{error_message}: {e}")
326
- return default_value
327
-
328
- # Definición de perfiles de expertos en PUV
329
- PUV_PERSONAS = {
330
- "estratega": {
331
- "nombre": "Estratega de Marketing",
332
- "descripcion": "Experto en posicionamiento estratégico y diferenciación de marca",
333
- "prompt_prefix": "Como estratega de marketing especializado en posicionamiento de marca, voy a ayudarte a crear una PUV que destaque tu ventaja competitiva. ",
334
- "emoji": "🎯"
335
- },
336
- "copywriter": {
337
- "nombre": "Copywriter Persuasivo",
338
- "descripcion": "Especialista en redacción persuasiva y mensajes de alto impacto",
339
- "prompt_prefix": "Como copywriter especializado en mensajes persuasivos, voy a ayudarte a crear una PUV que conecte emocionalmente con tu audiencia. ",
340
- "emoji": "✍️"
341
- },
342
- "analista": {
343
- "nombre": "Analista de Mercado",
344
- "descripcion": "Experto en análisis de mercado y comportamiento del consumidor",
345
- "prompt_prefix": "Como analista de mercado especializado en comportamiento del consumidor, voy a ayudarte a crear una PUV basada en insights de tu audiencia. ",
346
- "emoji": "📊"
347
- },
348
- "innovador": {
349
- "nombre": "Innovador Disruptivo",
350
- "descripcion": "Especialista en propuestas innovadoras y disruptivas",
351
- "prompt_prefix": "Como especialista en innovación disruptiva, voy a ayudarte a crear una PUV que rompa con los paradigmas de tu industria. ",
352
- "emoji": "💡"
353
- }
354
- }
355
-
356
- # Función para seleccionar persona
357
- def select_puv_persona():
358
- st.sidebar.write("## 🧠 Selecciona un Experto")
359
-
360
- # Inicializar la selección de persona si no existe
361
- if 'selected_persona' not in st.session_state:
362
- st.session_state.selected_persona = "estratega"
363
-
364
- # Crear botones para cada persona
365
- cols = st.sidebar.columns(len(PUV_PERSONAS))
366
- for i, (persona_id, persona) in enumerate(PUV_PERSONAS.items()):
367
- with cols[i]:
368
- if st.button(f"{persona['emoji']}\n{persona['nombre']}", key=f"btn_{persona_id}"):
369
- st.session_state.selected_persona = persona_id
370
- st.rerun()
371
-
372
- # Mostrar descripción de la persona seleccionada
373
- persona_actual = PUV_PERSONAS[st.session_state.selected_persona]
374
- st.sidebar.markdown(f"**{persona_actual['emoji']} {persona_actual['nombre']}**")
375
- st.sidebar.markdown(f"_{persona_actual['descripcion']}_")
376
-
377
- return st.session_state.selected_persona
378
-
379
- # Función para modificar el prompt con la personalidad seleccionada
380
- def apply_persona_to_prompt(prompt, persona_id):
381
- if persona_id in PUV_PERSONAS:
382
- persona = PUV_PERSONAS[persona_id]
383
- return f"{persona['prompt_prefix']}\n\nConsulta original: {prompt}"
384
- return prompt
 
105
  ):
106
  st.markdown(message['content'])
107
 
108
+ # React to user input
109
+ if prompt := st.chat_input('¿En qué puedo ayudarte hoy?'): # Mensaje más amigable
110
+ # Save this as a chat for later
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  if st.session_state.chat_id not in past_chats.keys():
112
+ # Es una nueva conversación, generemos un título basado en el primer mensaje
113
+ # Primero, guardamos un título temporal
114
+ temp_title = f'SesiónChat-{st.session_state.chat_id}'
115
+ past_chats[st.session_state.chat_id] = temp_title
116
+
117
+ # Generamos un título basado en el contenido del mensaje
118
+ try:
119
+ # Usamos el mismo modelo para generar un título corto
120
+ title_generator = genai.GenerativeModel('gemini-2.0-flash')
121
+ title_response = title_generator.generate_content(
122
+ f"Genera un título corto (máximo 5 palabras) que describa de qué trata esta consulta, sin usar comillas ni puntuación: '{prompt}'")
123
+
124
+ # Obtenemos el título generado
125
+ generated_title = title_response.text.strip()
126
+
127
+ # Actualizamos el título en past_chats
128
+ if generated_title:
129
+ st.session_state.chat_title = generated_title
130
+ past_chats[st.session_state.chat_id] = generated_title
131
+ else:
132
+ st.session_state.chat_title = temp_title
133
+ except Exception as e:
134
+ print(f"Error al generar título: {e}")
135
+ st.session_state.chat_title = temp_title
136
  else:
137
+ # Ya existe esta conversación, usamos el título guardado
138
  st.session_state.chat_title = past_chats[st.session_state.chat_id]
139
 
140
  joblib.dump(past_chats, 'data/past_chats_list')
141
 
142
+ # Display user message in chat message container
143
+ with st.chat_message('user', avatar=USER_AVATAR_ICON): # Añade el avatar del usuario
144
+ st.markdown(prompt)
145
+ # Add user message to chat history
146
+ st.session_state.messages.append(
147
+ dict(
148
+ role='user',
149
+ content=prompt,
150
+ )
151
+ )
152
+ ## Send message to AI
153
  response = st.session_state.chat.send_message(
154
+ prompt,
155
  stream=True,
156
  )
157
  # Display assistant response in chat message container
 
170
  # Streams in a chunk at a time
171
  for chunk in response:
172
  # Simulate stream of chunk
173
+ # TODO: Chunk missing `text` if API stops mid-stream ("safety"?)
174
+ for ch in chunk.text.split(' '):
175
+ full_response += ch + ' '
176
+ time.sleep(0.1) # Aumentado de 0.05 a 0.1 segundos para una velocidad más lenta
177
  # Rewrites with a cursor at end
178
  message_placeholder.write(full_response + '▌')
 
179
  # Elimina el indicador de escritura
180
  typing_indicator.empty()
181
  # Write full message with placeholder
 
191
  )
192
  st.session_state.gemini_history = st.session_state.chat.history
193
  # Save to file
194
+ joblib.dump(
195
+ st.session_state.messages,
196
+ f'data/{st.session_state.chat_id}-st_messages',
197
+ )
198
+ joblib.dump(
199
+ st.session_state.gemini_history,
200
+ f'data/{st.session_state.chat_id}-gemini_messages',
201
+ )