--- id: 0002 title: Enricher GLiNER + GLiREL — emitir entidades/relaciones desde un nodo texto status: pending priority: high created: 2026-04-30 --- ## Objetivo Right-click sobre un nodo de tipo `text` → "Run enricher → Extract entities (GLiNER+GLiREL)". El enricher procesa el texto del nodo y crea: - Nuevas entidades (person, org, email, location, ...) con tipos detectados. - Relaciones entre el nodo origen y las nuevas, etiquetadas con `EXTRACTED_FROM`. - Relaciones entre las nuevas entidades cuando GLiREL las detecte, etiquetadas con el tipo predicho por el modelo (`employed_by`, `located_in`, ...). ## Trabajo previo en el registry Ya existen las funciones Python: - `python/functions/extraction/gliner_extract_*` (varios) - `python/functions/extraction/glirel_extract_*` - Pipeline `extract_graph_hybrid_py_pipelines` (issue 0040 cerrado, ver commit 1a353878) que ya hace exactamente esto sobre un texto y devuelve un grafo estructurado. El analysis `analysis/retrieving_graphs/` lo usa en notebooks. ## Alcance tecnico (C++ side) - Definir interfaz de enricher: `enricher_run(node_id, db_path) -> int n_added`. - Implementacion `enricher_gliner_glirel`: - Spawn `python/.venv/bin/python3` con un script wrapper que recibe el texto por stdin (JSON `{"text": "..."}`) y devuelve por stdout el grafo estructurado (JSON `{"entities": [...], "relations": [...]}`). - Wrapper Python en `projects/osint_graph/apps/graph_explorer/enrichers/gliner_glirel.py`. - C++ usa `popen` o `CreateProcess` segun plataforma. - Insertar las entidades nuevas (entity_insert) y relaciones (relation_insert) con etiquetas semanticas. - UI: spinner en el menu mientras corre (cold start del modelo ~5s). ## Riesgos / decisiones - Modelos pesados → cold start lento. Considerar pre-cargar al primer uso. - Streaming de progreso desde Python via stderr line-by-line. - Fallback si el venv no existe: mostrar mensaje en el menu en vez de fallar. ## Definicion de hecho - Click derecho en nodo `text` → "Extract entities" muestra opcion. - Tras correr, el grafo se recarga con las nuevas entidades visibles y conectadas con `EXTRACTED_FROM`. - Las relaciones entre entidades extraidas llevan el tipo que GLiREL predice.