Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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
|
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
|
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-
|
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-
|
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
|
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 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
400 |
-
|
401 |
-
|
|
|
|
|
|
|
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="
|
446 |
)
|
447 |
|
448 |
with gr.Column(scale=2):
|
449 |
analysis_output = gr.Markdown(
|
450 |
label="📋 Reporte de Análisis",
|
451 |
-
value="Sube un PDF
|
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 |
-
###
|
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,
|
494 |
-
outputs=[analysis_output, code_output, status
|
495 |
)
|
496 |
|
497 |
-
#
|
498 |
-
|
499 |
-
|
500 |
-
|
501 |
-
|
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
|