JeCabrera commited on
Commit
15ab203
·
verified ·
1 Parent(s): 274e6d4

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -106
app.py CHANGED
@@ -198,125 +198,147 @@ for message in st.session_state.messages:
198
 
199
  # React to user input
200
  if prompt := st.chat_input('¿Cuál es tu producto o servicio?'): # Mensaje más específico
201
- # Save this as a chat for later
202
- if st.session_state.chat_id not in past_chats.keys():
203
- # Es una nueva conversación, generemos un título basado en el primer mensaje
204
- # Primero, guardamos un título temporal
205
- temp_title = f'PUV-{st.session_state.chat_id}'
206
- past_chats[st.session_state.chat_id] = temp_title
207
-
208
- # Generamos un título basado en el contenido del mensaje
209
- try:
210
- # Usamos el mismo modelo para generar un título corto
211
- title_generator = genai.GenerativeModel('gemini-2.0-flash')
212
- title_response = title_generator.generate_content(
213
- f"Genera un título corto (máximo 5 palabras) que describa de qué producto o servicio trata esta consulta, sin usar comillas ni puntuación: '{prompt}'")
214
-
215
- # Obtenemos el título generado
216
- generated_title = title_response.text.strip()
217
-
218
- # Actualizamos el título en past_chats
219
- if generated_title:
220
- st.session_state.chat_title = f"PUV: {generated_title}"
221
- past_chats[st.session_state.chat_id] = f"PUV: {generated_title}"
222
- else:
223
- st.session_state.chat_title = temp_title
224
- except Exception as e:
225
- print(f"Error al generar título: {e}")
226
- st.session_state.chat_title = temp_title
227
- else:
228
- # Ya existe esta conversación, usamos el título guardado
229
- st.session_state.chat_title = past_chats[st.session_state.chat_id]
230
-
231
- joblib.dump(past_chats, 'data/past_chats_list')
232
-
233
- # Display user message in chat message container
234
- with st.chat_message('user', avatar=USER_AVATAR_ICON):
235
- st.markdown(prompt)
236
- # Add user message to chat history
237
- st.session_state.messages.append(
238
- dict(
239
- role='user',
240
- content=prompt,
241
- )
242
- )
243
 
244
- # Implementación de reintentos con retroceso exponencial
245
- max_retries = 3
246
- retry_count = 0
247
- while retry_count < max_retries:
248
- try:
249
- ## Send message to AI
250
- response = st.session_state.chat.send_message(
251
- prompt,
252
- stream=True,
 
 
 
 
 
253
  )
 
 
 
 
 
 
 
 
 
254
 
255
- # Display assistant response in chat message container
256
- with st.chat_message(
257
- name=MODEL_ROLE,
258
- avatar=AI_AVATAR_ICON,
259
- ):
260
- message_placeholder = st.empty()
261
- full_response = ''
262
- assistant_response = response
263
 
264
- # Añade un indicador de "escribiendo..."
265
- typing_indicator = st.empty()
266
- typing_indicator.markdown("*Nuestro equipo de expertos está analizando tu información...*")
267
 
268
- # Streams in a chunk at a time
269
- for chunk in response:
270
- # Simulate stream of chunk
271
- for ch in chunk.text.split(' '):
272
- full_response += ch + ' '
273
- time.sleep(0.1)
274
- # Rewrites with a cursor at end
275
- message_placeholder.write(full_response + '▌')
276
- # Elimina el indicador de escritura
277
- typing_indicator.empty()
278
- # Write full message with placeholder
279
- message_placeholder.write(full_response)
280
-
281
- # Add assistant response to chat history
282
- st.session_state.messages.append(
283
- dict(
284
- role=MODEL_ROLE,
285
- content=st.session_state.chat.history[-1].parts[0].text,
286
- avatar=AI_AVATAR_ICON,
287
- )
288
- )
289
- st.session_state.gemini_history = st.session_state.chat.history
290
- # Save to file
291
- joblib.dump(
292
- st.session_state.messages,
293
- f'data/{st.session_state.chat_id}-st_messages',
294
- )
295
- joblib.dump(
296
- st.session_state.gemini_history,
297
- f'data/{st.session_state.chat_id}-gemini_messages',
298
  )
299
- # Si llegamos aquí, la solicitud fue exitosa
300
- break
301
-
302
- except Exception as e:
303
- retry_count += 1
304
- if retry_count >= max_retries:
305
- # Si agotamos los reintentos, mostramos un mensaje de error
306
- with st.chat_message(name=MODEL_ROLE, avatar=AI_AVATAR_ICON):
307
- st.error(f"Lo sentimos, estamos experimentando problemas para procesar tu solicitud. Por favor, intenta de nuevo más tarde. Error: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  st.session_state.messages.append(
309
  dict(
310
  role=MODEL_ROLE,
311
- content=f"Lo sentimos, estamos experimentando problemas para procesar tu solicitud. Por favor, intenta de nuevo más tarde. Error: {str(e)}",
312
  avatar=AI_AVATAR_ICON,
313
  )
314
  )
 
 
315
  joblib.dump(
316
  st.session_state.messages,
317
  f'data/{st.session_state.chat_id}-st_messages',
318
  )
319
- else:
320
- # Esperamos antes de reintentar (retroceso exponencial)
321
- wait_time = (2 ** retry_count) + (time.time() % 1)
322
- time.sleep(wait_time)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
 
199
  # React to user input
200
  if prompt := st.chat_input('¿Cuál es tu producto o servicio?'): # Mensaje más específico
201
+ # Verificar si es la primera interacción y el usuario pregunta por las funciones
202
+ is_asking_about_functions = any(keyword in prompt.lower() for keyword in
203
+ ["qué haces", "funciones", "ayudar", "puedes hacer", "cómo funciona", "para qué sirves"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
 
205
+ if is_asking_about_functions and not past_chats.get(st.session_state.chat_id):
206
+ # Si pregunta por las funciones, mostrar el mensaje de bienvenida
207
+ response_content = WELCOME_MESSAGE
208
+
209
+ # Display assistant response in chat message container
210
+ with st.chat_message(name=MODEL_ROLE, avatar=AI_AVATAR_ICON):
211
+ st.markdown(response_content)
212
+
213
+ # Add to chat history
214
+ st.session_state.messages.append(
215
+ dict(
216
+ role=MODEL_ROLE,
217
+ content=response_content,
218
+ avatar=AI_AVATAR_ICON,
219
  )
220
+ )
221
+ else:
222
+ # Procesamiento normal para otras preguntas
223
+ # Save this as a chat for later
224
+ if st.session_state.chat_id not in past_chats.keys():
225
+ # Es una nueva conversación, generemos un título basado en el primer mensaje
226
+ # Primero, guardamos un título temporal
227
+ temp_title = f'PUV-{st.session_state.chat_id}'
228
+ past_chats[st.session_state.chat_id] = temp_title
229
 
230
+ # Generamos un título basado en el contenido del mensaje
231
+ try:
232
+ # Usamos el mismo modelo para generar un título corto
233
+ title_generator = genai.GenerativeModel('gemini-2.0-flash')
234
+ title_response = title_generator.generate_content(
235
+ f"Genera un título corto (máximo 5 palabras) que describa de qué producto o servicio trata esta consulta, sin usar comillas ni puntuación: '{prompt}'")
 
 
236
 
237
+ # Obtenemos el título generado
238
+ generated_title = title_response.text.strip()
 
239
 
240
+ # Actualizamos el título en past_chats
241
+ if generated_title:
242
+ st.session_state.chat_title = f"PUV: {generated_title}"
243
+ past_chats[st.session_state.chat_id] = f"PUV: {generated_title}"
244
+ else:
245
+ st.session_state.chat_title = temp_title
246
+ except Exception as e:
247
+ print(f"Error al generar título: {e}")
248
+ st.session_state.chat_title = temp_title
249
+ else:
250
+ # Ya existe esta conversación, usamos el título guardado
251
+ st.session_state.chat_title = past_chats[st.session_state.chat_id]
252
+
253
+ joblib.dump(past_chats, 'data/past_chats_list')
254
+
255
+ # Display user message in chat message container
256
+ with st.chat_message('user', avatar=USER_AVATAR_ICON):
257
+ st.markdown(prompt)
258
+ # Add user message to chat history
259
+ st.session_state.messages.append(
260
+ dict(
261
+ role='user',
262
+ content=prompt,
 
 
 
 
 
 
 
263
  )
264
+ )
265
+
266
+ # Implementación de reintentos con retroceso exponencial
267
+ max_retries = 3
268
+ retry_count = 0
269
+ while retry_count < max_retries:
270
+ try:
271
+ ## Send message to AI
272
+ response = st.session_state.chat.send_message(
273
+ prompt,
274
+ stream=True,
275
+ )
276
+
277
+ # Display assistant response in chat message container
278
+ with st.chat_message(
279
+ name=MODEL_ROLE,
280
+ avatar=AI_AVATAR_ICON,
281
+ ):
282
+ message_placeholder = st.empty()
283
+ full_response = ''
284
+ assistant_response = response
285
+
286
+ # Añade un indicador de "escribiendo..."
287
+ typing_indicator = st.empty()
288
+ typing_indicator.markdown("*Nuestro equipo de expertos está analizando tu información...*")
289
+
290
+ # Streams in a chunk at a time
291
+ for chunk in response:
292
+ # Simulate stream of chunk
293
+ for ch in chunk.text.split(' '):
294
+ full_response += ch + ' '
295
+ time.sleep(0.1)
296
+ # Rewrites with a cursor at end
297
+ message_placeholder.write(full_response + '▌')
298
+ # Elimina el indicador de escritura
299
+ typing_indicator.empty()
300
+ # Write full message with placeholder
301
+ message_placeholder.write(full_response)
302
+
303
+ # Add assistant response to chat history
304
  st.session_state.messages.append(
305
  dict(
306
  role=MODEL_ROLE,
307
+ content=st.session_state.chat.history[-1].parts[0].text,
308
  avatar=AI_AVATAR_ICON,
309
  )
310
  )
311
+ st.session_state.gemini_history = st.session_state.chat.history
312
+ # Save to file
313
  joblib.dump(
314
  st.session_state.messages,
315
  f'data/{st.session_state.chat_id}-st_messages',
316
  )
317
+ joblib.dump(
318
+ st.session_state.gemini_history,
319
+ f'data/{st.session_state.chat_id}-gemini_messages',
320
+ )
321
+ # Si llegamos aquí, la solicitud fue exitosa
322
+ break
323
+
324
+ except Exception as e:
325
+ retry_count += 1
326
+ if retry_count >= max_retries:
327
+ # Si agotamos los reintentos, mostramos un mensaje de error
328
+ with st.chat_message(name=MODEL_ROLE, avatar=AI_AVATAR_ICON):
329
+ st.error(f"Lo sentimos, estamos experimentando problemas para procesar tu solicitud. Por favor, intenta de nuevo más tarde. Error: {str(e)}")
330
+ st.session_state.messages.append(
331
+ dict(
332
+ role=MODEL_ROLE,
333
+ content=f"Lo sentimos, estamos experimentando problemas para procesar tu solicitud. Por favor, intenta de nuevo más tarde. Error: {str(e)}",
334
+ avatar=AI_AVATAR_ICON,
335
+ )
336
+ )
337
+ joblib.dump(
338
+ st.session_state.messages,
339
+ f'data/{st.session_state.chat_id}-st_messages',
340
+ )
341
+ else:
342
+ # Esperamos antes de reintentar (retroceso exponencial)
343
+ wait_time = (2 ** retry_count) + (time.time() % 1)
344
+ time.sleep(wait_time)