C2MV commited on
Commit
4b06f5e
·
verified ·
1 Parent(s): e0286e2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +75 -104
app.py CHANGED
@@ -16,7 +16,7 @@ CLAUDE_MODELS = {
16
  "name": "Claude Opus 4 (Latest)",
17
  "description": "Modelo más potente para desafíos complejos",
18
  "max_tokens": 4000,
19
- "best_for": "Análisis muy detallados y complejos, tareas que requieren máximo rendimiento"
20
  },
21
  "claude-sonnet-4-20250514": {
22
  "name": "Claude Sonnet 4 (Latest)",
@@ -28,7 +28,7 @@ CLAUDE_MODELS = {
28
  "name": "Claude 3.5 Haiku (Latest)",
29
  "description": "Modelo más rápido para tareas diarias",
30
  "max_tokens": 4000,
31
- "best_for": "Análisis rápidos y económicos, tareas simples"
32
  },
33
  "claude-3-7-sonnet-20250219": {
34
  "name": "Claude 3.7 Sonnet",
@@ -41,24 +41,6 @@ CLAUDE_MODELS = {
41
  "description": "Excelente balance entre velocidad y capacidad",
42
  "max_tokens": 4000,
43
  "best_for": "Análisis rápidos y precisos"
44
- },
45
- "claude-3-5-sonnet-20240620": {
46
- "name": "Claude 3.5 Sonnet (Jun 2024)",
47
- "description": "Versión anterior de 3.5 Sonnet",
48
- "max_tokens": 4000,
49
- "best_for": "Análisis estándar confiable"
50
- },
51
- "claude-3-haiku-20240307": {
52
- "name": "Claude 3 Haiku",
53
- "description": "Modelo rápido y eficiente de la serie 3",
54
- "max_tokens": 4000,
55
- "best_for": "Análisis rápidos básicos"
56
- },
57
- "claude-3-opus-20240229": {
58
- "name": "Claude 3 Opus",
59
- "description": "Modelo más potente de la serie 3",
60
- "max_tokens": 4000,
61
- "best_for": "Análisis complejos avanzados"
62
  }
63
  }
64
 
@@ -186,7 +168,7 @@ def extract_text_from_pdf(pdf_file) -> str:
186
  except Exception as e:
187
  return f"Error al leer PDF: {str(e)}"
188
 
189
- def analyze_with_ai(pdf_text: str, analysis_type: str, claude_model: str = "claude-sonnet-4-20250514") -> str:
190
  """Analiza el texto del PDF usando IA con el modelo de Claude seleccionado"""
191
 
192
  prompts = {
@@ -228,7 +210,7 @@ def analyze_with_ai(pdf_text: str, analysis_type: str, claude_model: str = "clau
228
 
229
  try:
230
  # Obtener configuración del modelo seleccionado
231
- model_config = CLAUDE_MODELS.get(claude_model, CLAUDE_MODELS["claude-sonnet-4-20250514"])
232
 
233
  response = client.messages.create(
234
  model=claude_model,
@@ -339,42 +321,40 @@ print("Personaliza los parámetros según tus datos experimentales.")
339
 
340
  return code
341
 
342
- def comprehensive_analysis(pdf_file, claude_model: str) -> Tuple[str, str, str, str]:
343
  """Análisis completo del PDF con el modelo de Claude seleccionado"""
344
  if pdf_file is None:
345
- return "❌ Por favor sube un archivo PDF", "", "", ""
346
-
347
- # Extraer texto
348
- pdf_text = extract_text_from_pdf(pdf_file)
349
- if "Error" in pdf_text:
350
- return pdf_text, "", "", ""
351
-
352
- # Mostrar modelo seleccionado
353
- model_info = CLAUDE_MODELS.get(claude_model, CLAUDE_MODELS["claude-sonnet-4-20250514"])
354
- status_msg = f"🤖 Analizando con {model_info['name']}..."
355
-
356
- # Análisis por etapas
357
- process_analysis = analyze_with_ai(pdf_text, "identificar_proceso", claude_model)
358
- model_recommendations = analyze_with_ai(pdf_text, "recomendar_modelos", claude_model)
359
- parameter_analysis = analyze_with_ai(pdf_text, "parametros_estimacion", claude_model)
360
-
361
- # Extraer modelos recomendados para obtener detalles
362
- recommended_models = []
363
- for category, models in BIOTECH_MODELS.items():
364
- for model_name in models.keys():
365
- if model_name.lower() in model_recommendations.lower():
366
- recommended_models.append(model_name)
367
 
368
- model_details = get_model_details(recommended_models)
369
- implementation_code = generate_implementation_code(recommended_models)
370
-
371
- # Formatear respuesta final
372
- final_report = f"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
  # 🧬 ANÁLISIS BIOTECNOLÓGICO COMPLETO
374
 
375
- ## 🤖 Modelo de IA Utilizado
376
- **{model_info['name']}** - {model_info['description']}
377
-
378
  ## 🔍 IDENTIFICACIÓN DEL PROCESO
379
  {process_analysis}
380
 
@@ -391,14 +371,14 @@ def comprehensive_analysis(pdf_file, claude_model: str) -> Tuple[str, str, str,
391
  - Considerar efectos de escala en el reactor
392
  - Monitorear parámetros críticos identificados
393
  - Implementar control adaptativo si es necesario
394
-
395
- ---
396
- *Análisis realizado con {model_info['name']} basado en 140+ modelos de universidades prestigiosas*
397
  """
398
-
399
- final_status = f"✅ Análisis completado con {model_info['name']} - {len(recommended_models)} modelos identificados"
400
-
401
- return final_report, implementation_code, final_status, ""
 
 
 
402
 
403
  # Crear interfaz Gradio
404
  def create_interface():
@@ -418,21 +398,30 @@ def create_interface():
418
 
419
  with gr.Row():
420
  with gr.Column(scale=1):
421
- # Selector de modelo de Claude
422
- claude_model_selector = gr.Dropdown(
423
- choices=[(f"{info['name']} - {info['best_for']}", model_id)
424
- for model_id, info in CLAUDE_MODELS.items()],
425
- value="claude-sonnet-4-20250514",
426
- label="🤖 Seleccionar Modelo de Claude",
427
- info="Elige el modelo de IA para el análisis"
428
- )
429
-
430
  pdf_input = gr.File(
431
  label="📄 Subir PDF Científico",
432
  file_types=[".pdf"],
433
  type="binary"
434
  )
435
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
436
  analyze_btn = gr.Button(
437
  "🚀 Analizar con IA",
438
  variant="primary",
@@ -442,67 +431,49 @@ def create_interface():
442
  status = gr.Textbox(
443
  label="📊 Estado del Análisis",
444
  interactive=False,
445
- value="Selecciona modelo y sube PDF para comenzar..."
446
  )
447
 
448
  with gr.Column(scale=2):
449
  analysis_output = gr.Markdown(
450
  label="📋 Reporte de Análisis",
451
- value="Sube un PDF para comenzar el análisis..."
452
  )
453
 
454
  with gr.Row():
455
  code_output = gr.Code(
456
  label="🐍 Código Python Generado",
457
  language="python",
458
- interactive=True
 
459
  )
460
 
461
  with gr.Row():
462
  gr.Markdown("""
463
- ### 🤖 Modelos de Claude Disponibles:
464
- - **Claude Sonnet 4 (Recomendado):** Modelo más reciente y eficiente
465
- - **Claude 3.5 Sonnet:** Balance óptimo velocidad-precisión
466
- - **Claude 3 Opus:** Máxima potencia para análisis complejos
467
- - **Claude 3 Sonnet:** Modelo equilibrado y confiable
468
- - **Claude 3 Haiku:** Rápido y económico
469
-
470
- ### 📚 Base de Conocimientos:
471
  - **35+ Universidades:** MIT, Cambridge, UCL, Cornell, TU Delft, DTU, etc.
472
  - **8 Categorías:** Crecimiento, Sustrato, Producto, Reactores, Transferencia, Metabólicos
473
  - **40+ Modelos:** Desde Monod clásico hasta FBA avanzado
474
  - **Validación académica:** 140 PDFs científicos analizados
 
 
 
 
 
475
  """)
476
 
477
- # Función para mostrar info del modelo seleccionado
478
- def update_model_info(selected_model):
479
- if selected_model in CLAUDE_MODELS:
480
- info = CLAUDE_MODELS[selected_model]
481
- return f"🤖 {info['name']}: {info['description']} | Ideal para: {info['best_for']}"
482
- return "Modelo seleccionado"
483
-
484
- claude_model_selector.change(
485
- update_model_info,
486
- inputs=[claude_model_selector],
487
- outputs=[status]
488
- )
489
-
490
  # Conectar eventos
491
  analyze_btn.click(
492
  comprehensive_analysis,
493
- inputs=[pdf_input, claude_model_selector],
494
- outputs=[analysis_output, code_output, status, gr.Textbox(visible=False)]
495
  )
496
 
497
- # Ejemplos
498
- gr.Examples(
499
- examples=[
500
- ["Ejemplo: paper_fermentacion.pdf"],
501
- ["Ejemplo: biorreactor_continuo.pdf"],
502
- ["Ejemplo: cultivo_microalgas.pdf"]
503
- ],
504
- inputs=[pdf_input],
505
- label="📎 Ejemplos de PDFs típicos"
506
  )
507
 
508
  return demo
 
16
  "name": "Claude Opus 4 (Latest)",
17
  "description": "Modelo más potente para desafíos complejos",
18
  "max_tokens": 4000,
19
+ "best_for": "Análisis muy detallados y complejos"
20
  },
21
  "claude-sonnet-4-20250514": {
22
  "name": "Claude Sonnet 4 (Latest)",
 
28
  "name": "Claude 3.5 Haiku (Latest)",
29
  "description": "Modelo más rápido para tareas diarias",
30
  "max_tokens": 4000,
31
+ "best_for": "Análisis rápidos y económicos"
32
  },
33
  "claude-3-7-sonnet-20250219": {
34
  "name": "Claude 3.7 Sonnet",
 
41
  "description": "Excelente balance entre velocidad y capacidad",
42
  "max_tokens": 4000,
43
  "best_for": "Análisis rápidos y precisos"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
45
  }
46
 
 
168
  except Exception as e:
169
  return f"Error al leer PDF: {str(e)}"
170
 
171
+ def analyze_with_ai(pdf_text: str, analysis_type: str, claude_model: str = "claude-opus-4-20250514") -> str:
172
  """Analiza el texto del PDF usando IA con el modelo de Claude seleccionado"""
173
 
174
  prompts = {
 
210
 
211
  try:
212
  # Obtener configuración del modelo seleccionado
213
+ model_config = CLAUDE_MODELS.get(claude_model, CLAUDE_MODELS["claude-opus-4-20250514"])
214
 
215
  response = client.messages.create(
216
  model=claude_model,
 
321
 
322
  return code
323
 
324
+ def comprehensive_analysis(pdf_file, claude_model: str = "claude-opus-4-20250514") -> Tuple[str, str, str]:
325
  """Análisis completo del PDF con el modelo de Claude seleccionado"""
326
  if pdf_file is None:
327
+ return "❌ Por favor sube un archivo PDF", "", "⚠️ No hay archivo para analizar"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328
 
329
+ try:
330
+ # Extraer texto
331
+ pdf_text = extract_text_from_pdf(pdf_file)
332
+ if "Error" in pdf_text:
333
+ return pdf_text, "", "❌ Error al procesar PDF"
334
+
335
+ # Mostrar modelo seleccionado
336
+ model_info = CLAUDE_MODELS.get(claude_model, CLAUDE_MODELS["claude-opus-4-20250514"])
337
+ status_msg = f"🤖 Analizando con {model_info['name']}..."
338
+
339
+ # Análisis por etapas
340
+ process_analysis = analyze_with_ai(pdf_text, "identificar_proceso", claude_model)
341
+ model_recommendations = analyze_with_ai(pdf_text, "recomendar_modelos", claude_model)
342
+ parameter_analysis = analyze_with_ai(pdf_text, "parametros_estimacion", claude_model)
343
+
344
+ # Extraer modelos recomendados para obtener detalles
345
+ recommended_models = []
346
+ for category, models in BIOTECH_MODELS.items():
347
+ for model_name in models.keys():
348
+ if model_name.lower() in model_recommendations.lower():
349
+ recommended_models.append(model_name)
350
+
351
+ model_details = get_model_details(recommended_models)
352
+ implementation_code = generate_implementation_code(recommended_models)
353
+
354
+ # Formatear respuesta final
355
+ final_report = f"""
356
  # 🧬 ANÁLISIS BIOTECNOLÓGICO COMPLETO
357
 
 
 
 
358
  ## 🔍 IDENTIFICACIÓN DEL PROCESO
359
  {process_analysis}
360
 
 
371
  - Considerar efectos de escala en el reactor
372
  - Monitorear parámetros críticos identificados
373
  - Implementar control adaptativo si es necesario
 
 
 
374
  """
375
+
376
+ success_msg = f"✅ Análisis completado con {model_info['name']} - {len(recommended_models)} modelos identificados"
377
+
378
+ return final_report, implementation_code, success_msg
379
+
380
+ except Exception as e:
381
+ return f"❌ Error durante el análisis: {str(e)}", "", "❌ Error en el procesamiento"
382
 
383
  # Crear interfaz Gradio
384
  def create_interface():
 
398
 
399
  with gr.Row():
400
  with gr.Column(scale=1):
 
 
 
 
 
 
 
 
 
401
  pdf_input = gr.File(
402
  label="📄 Subir PDF Científico",
403
  file_types=[".pdf"],
404
  type="binary"
405
  )
406
 
407
+ # Selector de modelo Claude
408
+ model_selector = gr.Dropdown(
409
+ choices=list(CLAUDE_MODELS.keys()),
410
+ value="claude-opus-4-20250514",
411
+ label="🤖 Seleccionar Modelo Claude",
412
+ info="Elige el modelo que mejor se adapte a tu análisis"
413
+ )
414
+
415
+ # Mostrar información del modelo seleccionado
416
+ def update_model_info(selected_model):
417
+ model_info = CLAUDE_MODELS.get(selected_model, {})
418
+ return f"**{model_info.get('name', 'N/A')}**\n{model_info.get('description', 'N/A')}\n\n*Mejor para:* {model_info.get('best_for', 'N/A')}"
419
+
420
+ model_info_display = gr.Markdown(
421
+ value=update_model_info("claude-opus-4-20250514"),
422
+ label="ℹ️ Información del Modelo"
423
+ )
424
+
425
  analyze_btn = gr.Button(
426
  "🚀 Analizar con IA",
427
  variant="primary",
 
431
  status = gr.Textbox(
432
  label="📊 Estado del Análisis",
433
  interactive=False,
434
+ value="Listo para analizar..."
435
  )
436
 
437
  with gr.Column(scale=2):
438
  analysis_output = gr.Markdown(
439
  label="📋 Reporte de Análisis",
440
+ value="**Instrucciones:**\n1. Sube un archivo PDF con contenido biotecnológico\n2. Selecciona el modelo Claude apropiado\n3. Haz clic en 'Analizar con IA'\n4. Revisa el análisis y código generado"
441
  )
442
 
443
  with gr.Row():
444
  code_output = gr.Code(
445
  label="🐍 Código Python Generado",
446
  language="python",
447
+ interactive=True,
448
+ value="# El código Python se generará aquí después del análisis..."
449
  )
450
 
451
  with gr.Row():
452
  gr.Markdown("""
453
+ ### 📚 Base de Conocimientos Incluye:
 
 
 
 
 
 
 
454
  - **35+ Universidades:** MIT, Cambridge, UCL, Cornell, TU Delft, DTU, etc.
455
  - **8 Categorías:** Crecimiento, Sustrato, Producto, Reactores, Transferencia, Metabólicos
456
  - **40+ Modelos:** Desde Monod clásico hasta FBA avanzado
457
  - **Validación académica:** 140 PDFs científicos analizados
458
+
459
+ ### 🔧 Modelos Claude Disponibles:
460
+ - **Opus 4:** Máximo rendimiento para análisis complejos
461
+ - **Sonnet 4:** Equilibrio perfecto para uso general
462
+ - **Haiku 3.5:** Velocidad optimizada para análisis rápidos
463
  """)
464
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
  # Conectar eventos
466
  analyze_btn.click(
467
  comprehensive_analysis,
468
+ inputs=[pdf_input, model_selector],
469
+ outputs=[analysis_output, code_output, status]
470
  )
471
 
472
+ # Actualizar información del modelo cuando se cambie la selección
473
+ model_selector.change(
474
+ update_model_info,
475
+ inputs=[model_selector],
476
+ outputs=[model_info_display]
 
 
 
 
477
  )
478
 
479
  return demo