JairoCesar commited on
Commit
229738a
·
verified ·
1 Parent(s): 8deeb4a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +16 -15
app.py CHANGED
@@ -12,7 +12,7 @@ import re
12
 
13
  st.set_page_config(
14
  page_title="Asistente de Bienestar Digestivo",
15
- page_icon="🍎", # Ícono cambiado para reflejar el tema de alimentos
16
  layout="wide"
17
  )
18
 
@@ -46,7 +46,6 @@ def get_gemini_model():
46
  """Carga el modelo generativo de Gemini."""
47
  logger.info("🔄 Cargando modelo Gemini (gemini-1.5-flash)...")
48
  try:
49
- # Usamos un modelo más reciente y potente para tareas de extracción y análisis
50
  return genai.GenerativeModel("gemini-1.5-flash")
51
  except Exception as e:
52
  st.error(f"❌ No se pudo cargar el modelo Gemini: {e}")
@@ -117,8 +116,13 @@ def extract_entities_with_gemini(query):
117
  """
118
  try:
119
  response = model.generate_content(system_prompt)
120
- # Limpiar y parsear la respuesta JSON
121
- json_text = re.search(r'\{.*\}', response.text, re.DOTALL).group(0)
 
 
 
 
 
122
  return json.loads(json_text)
123
  except Exception as e:
124
  logger.error(f"Error extrayendo entidades con Gemini: {e}")
@@ -141,7 +145,7 @@ def find_best_matches(entities, data):
141
  scores = {}
142
  for index, entry in enumerate(data):
143
  score = 0
144
- entry_compound = entry.get("Compuesto / Alimento Intolerante", "").split('(')[0].strip()
145
  entry_symptoms = entry.get("Posibles Síntomas (Presentación Clínica Representativa)", "").lower()
146
 
147
  # Puntuar por coincidencia de compuesto
@@ -180,7 +184,7 @@ def generate_detailed_analysis(query, match):
180
  - **Recomendaciones Generales:** {match.get("Recomendaciones Médicas / Exámenes Confirmatorios")}
181
 
182
  **Tu Tarea:**
183
- Redacta una respuesta completa para el usuario. La respuesta debe estar estructurada en las siguientes secciones (usa los títulos en negrita):
184
 
185
  1. **Posible Causa:** Comienza resumiendo por qué sus síntomas podrían estar relacionados con este compuesto, vinculando directamente su caso con la información proporcionada.
186
  2. **¿Qué podría estar pasando en tu cuerpo?:** Explica el "Mecanismo Fisiológico" en términos sencillos que cualquiera pueda entender.
@@ -198,11 +202,8 @@ def generate_detailed_analysis(query, match):
198
  return "No se pudo generar el análisis detallado. Por favor, inténtalo de nuevo."
199
 
200
  # --- INTERFAZ DE USUARIO (UI) ---
201
- col_img, col_text = st.columns([1, 6])
202
- with col_img: st.image("🍎", width=100) # Ícono actualizado
203
- with col_text:
204
- st.title("Asistente de Bienestar Digestivo")
205
- st.markdown("Explora la posible relación entre lo que comes y cómo te sientes.")
206
 
207
  # Manejo de estado
208
  if 'search_results' not in st.session_state: st.session_state.search_results = None
@@ -223,12 +224,12 @@ if submitted:
223
  st.error("La base de datos de alimentos no está disponible. No se puede continuar.")
224
  else:
225
  st.session_state.user_query = query
226
- with st.spinner("Interpretando tu caso con IA..."):
227
  entities = extract_entities_with_gemini(query)
228
 
229
- if entities:
230
  st.info(f"IA identificó - Alimentos: {', '.join(entities.get('alimentos',[])) or 'Ninguno'}, Síntomas: {', '.join(entities.get('sintomas',[])) or 'Ninguno'}")
231
- with st.spinner("Buscando posibles causas en la base de conocimiento..."):
232
  results = find_best_matches(entities, alimentos_data)
233
  st.session_state.search_results = results
234
  else:
@@ -249,7 +250,7 @@ if st.session_state.search_results is not None:
249
  best_match = results[0]
250
 
251
  with st.expander(f"**Principal Coincidencia: {best_match.get('Compuesto / Alimento Intolerante')}**", expanded=True):
252
- with st.spinner("Generando un análisis detallado con IA..."):
253
  detailed_analysis = generate_detailed_analysis(st.session_state.user_query, best_match)
254
  st.markdown(detailed_analysis)
255
 
 
12
 
13
  st.set_page_config(
14
  page_title="Asistente de Bienestar Digestivo",
15
+ page_icon="🍎", # El ícono para la pestaña del navegador
16
  layout="wide"
17
  )
18
 
 
46
  """Carga el modelo generativo de Gemini."""
47
  logger.info("🔄 Cargando modelo Gemini (gemini-1.5-flash)...")
48
  try:
 
49
  return genai.GenerativeModel("gemini-1.5-flash")
50
  except Exception as e:
51
  st.error(f"❌ No se pudo cargar el modelo Gemini: {e}")
 
116
  """
117
  try:
118
  response = model.generate_content(system_prompt)
119
+ # Limpiar y parsear la respuesta JSON del texto que puede venir con Markdown
120
+ json_text_match = re.search(r'```json\s*(\{.*?\})\s*```', response.text, re.DOTALL)
121
+ if json_text_match:
122
+ json_text = json_text_match.group(1)
123
+ else: # Si no encuentra el formato Markdown, busca un JSON simple
124
+ json_text = re.search(r'\{.*\}', response.text, re.DOTALL).group(0)
125
+
126
  return json.loads(json_text)
127
  except Exception as e:
128
  logger.error(f"Error extrayendo entidades con Gemini: {e}")
 
145
  scores = {}
146
  for index, entry in enumerate(data):
147
  score = 0
148
+ entry_compound = entry.get("Compuesto / Alimento Intolerante", "").split('(')[0].strip().lower()
149
  entry_symptoms = entry.get("Posibles Síntomas (Presentación Clínica Representativa)", "").lower()
150
 
151
  # Puntuar por coincidencia de compuesto
 
184
  - **Recomendaciones Generales:** {match.get("Recomendaciones Médicas / Exámenes Confirmatorios")}
185
 
186
  **Tu Tarea:**
187
+ Redacta una respuesta completa para el usuario. La respuesta debe estar estructurada en las siguientes secciones (usa los títulos en negrita y formato Markdown):
188
 
189
  1. **Posible Causa:** Comienza resumiendo por qué sus síntomas podrían estar relacionados con este compuesto, vinculando directamente su caso con la información proporcionada.
190
  2. **¿Qué podría estar pasando en tu cuerpo?:** Explica el "Mecanismo Fisiológico" en términos sencillos que cualquiera pueda entender.
 
202
  return "No se pudo generar el análisis detallado. Por favor, inténtalo de nuevo."
203
 
204
  # --- INTERFAZ DE USUARIO (UI) ---
205
+ st.title("🍎 Asistente de Bienestar Digestivo")
206
+ st.markdown("Explora la posible relación entre lo que comes y cómo te sientes.")
 
 
 
207
 
208
  # Manejo de estado
209
  if 'search_results' not in st.session_state: st.session_state.search_results = None
 
224
  st.error("La base de datos de alimentos no está disponible. No se puede continuar.")
225
  else:
226
  st.session_state.user_query = query
227
+ with st.spinner("🧠 Interpretando tu caso con IA..."):
228
  entities = extract_entities_with_gemini(query)
229
 
230
+ if entities and (entities.get("alimentos") or entities.get("sintomas")):
231
  st.info(f"IA identificó - Alimentos: {', '.join(entities.get('alimentos',[])) or 'Ninguno'}, Síntomas: {', '.join(entities.get('sintomas',[])) or 'Ninguno'}")
232
+ with st.spinner("🔬 Buscando posibles causas en la base de conocimiento..."):
233
  results = find_best_matches(entities, alimentos_data)
234
  st.session_state.search_results = results
235
  else:
 
250
  best_match = results[0]
251
 
252
  with st.expander(f"**Principal Coincidencia: {best_match.get('Compuesto / Alimento Intolerante')}**", expanded=True):
253
+ with st.spinner("✍️ Generando un análisis detallado con IA..."):
254
  detailed_analysis = generate_detailed_analysis(st.session_state.user_query, best_match)
255
  st.markdown(detailed_analysis)
256