# Interfaz web de demostración — EKG-Python

Aplicación para que el profesor pruebe el sistema. Pega código Python y recibe en
vivo la retroalimentación de los Sistemas A / B / C junto a la visualización
interactiva del subgrafo del grafo de conocimiento recuperado para ese código.

## Requisitos

- Ollama en ejecución con, al menos, `llama3.1:8b` y `nomic-embed-text`
  (`ollama serve`; los modelos ya están descargados).
- Dependencias Python (ya instaladas): `fastapi`, `uvicorn`, `rdflib`,
  `numpy`, `requests`.
- El grafo en `../grafo-ekg/ontologia/ekg-python.ttl`.

## Arranque

Desde `sistema-rag/web/`:

```bash
python app.py
# o:  python -m uvicorn app:app --host 127.0.0.1 --port 8000
```

Abrir el navegador en http://127.0.0.1:8000.

## Uso

1. Pegar código Python (o elegir un ejemplo del desplegable).
2. Seleccionar los sistemas a comparar (A, B, C).
3. Pulsar **Evaluar**.

La interfaz muestra:
- Una tarjeta por sistema con la retroalimentación generada y los conceptos
  del EKG implicados.
- El subgrafo recuperado (Cytoscape.js), con los nodos coloreados por tipo:
  recuperado (cian), prerrequisito (azul), error conceptual (rojo), tema (violeta).

## Endpoints (API REST)

- `GET /` — interfaz web.
- `GET /api/salud` — estado de Ollama y modelos disponibles.
- `POST /api/evaluar` — cuerpo `{"codigo": "...", "sistemas": ["A","C"]}` →
  `{"resultados": [...], "subgrafo": {"nodes": [...], "edges": [...]}}`.

## Notas

- **Sistema B** aparece como no disponible hasta que exista el modelo con
  fine-tuning. Entrénalo (`scripts/entrenar_qlora.py` en una GPU con PyTorch
  CUDA), fusiona el adaptador, conviértelo a GGUF y publícalo con
  `ollama create qlora-feedback -f Modelfile`. La interfaz lo detectará
  automáticamente.
- El Sistema C puede apuntarse al endpoint SPARQL de GraphDB en lugar del grafo
  local sin cambios en el frontend.
- Para acceso del profesor en red local, arrancar con `--host 0.0.0.0`.

  > **ADVERTENCIA DE SEGURIDAD:** este servicio no incluye autenticación ni
  > rate-limiting. Úsalo solo en loopback (`127.0.0.1`). No exponerlo con
  > `--host 0.0.0.0` en redes no confiables salvo que se añada una capa de
  > autenticación (y, preferiblemente, limitación de peticiones) por delante.
