Aplicación web que ingesta informes de laboratorio en PDF (carpeta local + subida manual), agrupa por paciente, y genera un informe médico personalizado en español para cada persona: tablas comparativas, gráficos de evolución, evaluación por sistemas, recomendaciones priorizadas por urgencia, análisis de interacciones de medicamentos y —opcionalmente— un informe redactado por IA.
⚠️ Advertencia: esta herramienta es un apoyo informativo generado por IA. NO es un médico y no reemplaza una consulta médica. En caso de urgencia, acuda a un servicio de emergencias.
- Python 3.10+
- Instalar dependencias:
pip install -r requirements.txtpython run.pySe abre en http://127.0.0.1:8000. La carpeta monitoreada por defecto es
G:\My Drive\MyFiles\lab; se puede cambiar con la variable de entorno
LAB_FOLDER.
- Carpeta local
G:\My Drive\MyFiles\lab— es la fuente inicial: al escanear, cada PDF se copia a la biblioteca autocontenida (data/library/reports/). La aplicación no depende de esa carpeta después del ingreso: toda la información vive endata/(base SQLite + archivos), por lo que se puede desplegar en una VM en la nube copiando el proyecto.- Se observa automáticamente (polling cada 30 s) y se re-escanea con el botón "🔄 Buscar archivos nuevos".
- Los archivos duplicados (mismo contenido) se eliminan del disco, conservando una sola copia.
- Subida directa — en cada pestaña de paciente hay un formulario "📤 Subir estudio médico" para agregar PDFs, imágenes y otros estudios aunque no estén en la carpeta monitoreada. Se deduplican igualmente.
Cada pestaña de paciente permite subir cualquier tipo de estudio médico:
- PDF de laboratorio → se ingesta al historial y se analiza.
- Imágenes (JPG, PNG, GIF, WEBP, BMP, TIFF) → radiografías, IRM, ecografías: se muestran como miniaturas y se pueden abrir en grande.
- Carpetas DICOM completas → botón "📁 Subir carpeta" con selector de carpeta del navegador (preserva subcarpetas y rutas relativas) o un ZIP con la estructura interna (DICOMDIR, series…). El contenido se lista y cada archivo se puede abrir/descargar.
- Links de dicomlibrary.com → botón "🌐 Importar desde dicomlibrary.com". Se extrae el UID del estudio y se intenta la descarga; como ese sitio no expone API pública, si la descarga no es posible se muestra una guía clara para bajar el ZIP desde su visor y subirlo aquí (se descomprime solo).
- DICOM (.dcm) y otros (ZIP, DOC, XLS, TXT…) → se guardan y se pueden descargar.
Cada documento se puede acompañar de una nota y se puede eliminar. Los adjuntos no afectan la evaluación de laboratorio: son el archivo clínico.
Cada pestaña contiene:
- Resumen ejecutivo (tono: crítico / precaución / favorable).
- Medicamentos del paciente + detección de interacciones medicamento↔medicamento y medicamento↔laboratorio (rojo/amarillo/verde).
- Hallazgos anormales ordenados por severidad, con la fecha de la última medición y fuentes científicas verificables (PubMed / guías oficiales).
- Evaluación por sistemas (metabólico, cardiovascular, renal, hepático, tiroideo, hematológico, inflamación, electrolitos).
- Recomendaciones y próximos pasos ordenadas por urgencia: 🔴 urgentes → 🟡 precaución → 🟢 hábitos. Incluyen estadísticas reales (DPP, Framingham, INTERHEART, WHO, CDC…) con sus fuentes.
- Gráficos de evolución temporal de cada biomarcador (con banda de referencia).
- Tablas comparativas: últimos resultados vs. referencia, y comparativa entre fechas.
- Historial de informes y advertencia médica.
El informe usa siempre la última medición disponible de cada biomarcador: si un valor estaba alterado en 2025 pero se normalizó en 2026, no se genera la alerta (se conserva la tendencia como información).
Regla de antigüedad (12 meses): si un resultado está alterado pero su última medición tiene más de 12 meses, no se marca como crítico: se muestra en amarillo con la advertencia "⏳ hace más de 12 meses — repetir" y la recomendación de repetir el análisis para confirmar el estado actual. Los análisis que el laboratorio no informó (valor en blanco) se muestran como "no realizado" y no generan alertas.
Además de los análisis de laboratorio, cada pestaña de paciente permite subir cualquier tipo de estudio médico mediante el botón "📤 Subir estudio médico":
- PDF de laboratorio → se ingesta al historial y se analiza.
- Imágenes (JPG, PNG, GIF, WEBP, BMP, TIFF) → radiografías, IRM, ecografías, fotos de informes: se muestran como miniaturas y se pueden abrir en grande.
- DICOM (.dcm) → se guardan y se pueden descargar.
- Otros (ZIP, DOC, XLS, TXT…) → se guardan como adjuntos descargables.
Cada documento se puede acompañar de una nota (ej: "Radiografía de tórax", "IRM rodilla izquierda") y se puede eliminar. Los adjuntos no afectan la evaluación de laboratorio: son el archivo clínico del paciente.
Botón "✨ Generar informe IA" en la pestaña del paciente. Modelos seleccionables (solo estos dos):
- DeepSeek V4 Pro (
deepseek/deepseek-v4-pro) — por defecto. - Opus 4.8 (
anthropic/claude-opus-4.8) — alternativa si el usuario no queda conforme con el resultado.
Para usar la IA necesita una API key de OpenRouter válida. Cree una en
https://openrouter.ai/settings/keys y configúrela en data/.env:
cp data/.env.example data/.env
# editar data/.env y pegar la key:
# OPENROUTER_API_KEY=sk-or-v1-...También se puede guardar desde la interfaz: Configuración → IA (OpenRouter) →
Guardar API key (escribe en data/.env; no requiere reiniciar). data/.env
es la única fuente de la key. Si no hay key válida, el informe IA cae
automáticamente a un informe local estructurado (sin conexión) y la
interfaz avisa del motivo.
app/
parser.py # parsing de PDFs (5 formatos de laboratorio)
canonical.py # normalización de nombres de análisis
db.py # almacenamiento SQLite + deduplicación + biblioteca
assessment.py # motor de evaluación médica (determinista)
sources.py # fuentes científicas verificables
drugs.py # base de medicamentos e interacciones
ai_engine.py # informe IA vía OpenRouter (DeepSeek V4 Pro / Opus 4.8)
server.py # API FastAPI + observador + uploads (carpetas DICOM, links)
static/ # interfaz web (HTML/CSS/JS + Chart.js + marked)
data/ # TODO autocontenido (se copia a la nube)
labs.db # base de datos SQLite
library/reports/ # PDFs de laboratorio copiados (autocontenido)
uploads/ # estudios/imágenes/carpetas DICOM subidas
.env # API key de OpenRouter (opcional)
run.py # lanzador
Todas las rutas de archivos se guardan en la base relativas al proyecto
(data/library/reports/..., data/uploads/...). Al arrancar, la app migra
automáticamente cualquier ruta absoluta antigua (de otra máquina) a forma
relativa, y al servir archivos las resuelve contra la ubicación actual del
proyecto. Por eso el deploy en una VM/cloud es copiar la carpeta completa
(incluida data/) y ejecutar python run.py — no hay que tocar rutas.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/status |
estado de la carpeta y último escaneo |
| POST | /api/rescan |
buscar/ingerir archivos nuevos (elimina duplicados) |
| GET | /api/persons |
lista de pacientes |
| GET | /api/person/{id} |
detalle + evaluación completa |
| POST | /api/person/{id}/upload |
subir cualquier estudio (PDF, imagen, DICOM…) |
| POST | /api/person/{id}/upload-folder |
subir carpeta completa / ZIP DICOM (con subcarpetas) |
| POST | /api/person/{id}/fetch-dicomlibrary |
importar estudio desde link de dicomlibrary.com |
| GET | /api/person/{id}/documents |
listar adjuntos del paciente |
| GET | /api/documents/{id}/file |
abrir/descargar adjunto |
| GET | /api/documents/{id}/list |
listar contenido de una carpeta adjunta |
| GET | /api/documents/{id}/file/{ruta} |
servir archivo dentro de una carpeta |
| DELETE | /api/person/{id}/documents/{id} |
eliminar adjunto |
| GET/POST/DELETE | /api/person/{id}/meds |
gestionar medicamentos |
| GET | /api/ai/models |
modelos de IA disponibles |
| POST | /api/person/{id}/ai-report?model=deepseek|opus |
generar informe IA |
| GET | /api/drugs/search?q= |
autocompletado de medicamentos |