Files

140 lines
4.6 KiB
Markdown

# extraction
Servicio Python (FastAPI) de extracción de datos estructurados desde documentos médicos PDF.
Usa LLMs (compatible con OpenAI API) para descubrir campos, estimar costos y extraer datos por lotes.
También actúa como capa de persistencia para el flujo de conteo: guarda los resultados del `count-api` en PostgreSQL y orquesta la extracción de documentos validados.
---
## Endpoints principales
Puerto: **8001**
### Salud y configuración
| Método | Ruta | Descripción |
|--------|------|-------------|
| `GET` | `/health` | Liveness |
| `GET` | `/config` | Configuración LLM activa |
| `GET` | `/models` | Modelos disponibles en el backend LLM |
### Descubrimiento de esquema
| Método | Ruta | Descripción |
|--------|------|-------------|
| `POST` | `/schemas` | Descubrir campos desde ruta en disco |
| `POST` | `/schemas/upload` | Descubrir campos desde PDF subido |
### Estimación de costo
| Método | Ruta | Descripción |
|--------|------|-------------|
| `POST` | `/estimate/upload` | Estimar tokens/costo desde PDF subido |
### Tareas de extracción
| Método | Ruta | Descripción |
|--------|------|-------------|
| `POST` | `/tasks/extraction` | Crear tarea de extracción |
| `POST` | `/tasks/{id}/ingest` | Subir un PDF a la tarea |
| `POST` | `/tasks/{id}/ingest-many` | Subir varios PDFs en bulk |
| `GET` | `/tasks` | Listar tareas |
| `GET` | `/tasks/{id}` | Detalle de tarea |
| `GET` | `/tasks/{id}/rows` | Filas extraídas de la tarea |
| `POST` | `/tasks/extraction/from-count` | Crear extracción desde conteo previo |
### Jobs (contenedor de tareas)
| Método | Ruta | Descripción |
|--------|------|-------------|
| `GET` | `/jobs` | Listar jobs |
| `GET` | `/jobs/{id}` | Detalle de job |
| `GET` | `/jobs/{id}/tasks` | Tareas del job |
### Conteo (persistencia desde count-api)
| Método | Ruta | Descripción |
|--------|------|-------------|
| `POST` | `/count-jobs` | Guardar resultados de conteo en BD |
| `GET` | `/count-jobs` | Listar jobs de conteo |
| `GET` | `/count-jobs/{task_id}` | Detalle de job de conteo |
| `GET` | `/count-jobs/{task_id}/files` | Archivos del conteo |
| `PATCH` | `/count-jobs/{task_id}/files/{file_id}` | Marcar archivo como válido/inválido |
---
## Flujo de datos
```
PDF local (desktop) → POST /tasks/{id}/ingest-many → procesamiento LLM
↓
filas en extraction_rows (PG)
count-api results → POST /count-jobs → count_job_files (PG)
→ POST /tasks/extraction/from-count → lee file_path desde /data
```
---
## Variables de entorno
| Variable | Descripción |
|----------|-------------|
| `DATABASE_URL` | PostgreSQL (`postgresql+psycopg://...`) |
| `REDIS_URL` | Redis para cola ARQ (`redis://...`) |
| `EXTRACTOR_BASE_URL` | URL base del LLM (compatible OpenAI) |
| `EXTRACTOR_API_KEY` | API key del LLM extractor |
| `EXTRACTOR_MODEL` | Modelo de extracción (default: `gpt-5.6-luna`) |
| `NORMALIZER_BASE_URL` | URL base del LLM normalizador |
| `NORMALIZER_API_KEY` | API key del LLM normalizador |
| `NORMALIZER_MODEL` | Modelo normalizador (default: `gpt-5.6-luna`) |
| `EXTRACTOR_TIMEOUT_S` | Timeout por documento (default `120`) |
| `PDF_DPI` | DPI para renderizado PDF (default `150`) |
| `PDF_THREAD_COUNT` | Hilos de renderizado PDF (default `4`) |
| `CONCURRENCY_LIMIT` | Máximo de extracciones paralelas (default `50`) |
| `ALLOWED_DOCUMENT_TYPES` | Tipos de documento permitidos |
| `ASYNC_QUEUE` | `true` para encolar en ARQ/Redis (default: sync) |
---
## Modelo de datos (PostgreSQL)
```
jobs — contenedor de tareas del usuario
tasks — una tarea por módulo (counting / extraction / cleaning)
count_job_files — resultados de conteo por PDF
extraction_batches — lotes de extracción
extraction_rows — filas extraídas por documento
```
---
## Estructura del código
```
api/
main.py — FastAPI app (~1400 líneas), todos los endpoints
desktop_ingest.py — lógica de ingesta desde desktop Electron
domain/ — lógica de negocio: LLM, prompts, extractor, batch
core/ — utilidades PDF, CSV, texto
infrastructure/ — SQLAlchemy, migraciones, uploads temporales
worker/ — workers ARQ (procesamiento async)
main.py — punto de entrada del worker
tasks.py — tareas ARQ
settings.py — configuración del worker
Dockerfile
requirements.txt
```
---
## Arrancar localmente
```bash
# Desde la raíz del repositorio:
docker compose up --build extraction worker
```
API disponible en `http://localhost:8001`.