a36530bb6f
- Dockspace host (PassthruCentralNode) bajo la toolbar para que las
ventanas Viewport/Legend/Inspector/Stats puedan dockearse dentro de la
app principal.
- Toolbar: input "Add node" con auto-deteccion de tipo (text/email/
ip_address/url/domain/phone). Insert en operations.db + reload.
- Context menu (right-click sobre nodo): Change type, Duplicate, Delete,
submenu "Run enricher" (placeholder hasta issues 0001-0003).
- Inspector: vecinos ahora muestran etiqueta de relacion ("-> employs",
"<- owns") usando rel_types[].name como label de arista.
- Default relation label k_default_relation_name="RELATED_TO" para
relaciones creadas sin nombre semantico explicito.
- Indice EntityIndex (FNV1a hash -> sql id) reconstruido tras cada load
para resolver mutaciones desde el grafo en memoria.
Issues planteadas para iteraciones siguientes:
- 0001: chat con Claude sobre el grafo (HTTP + tool-use)
- 0002: enricher GLiNER+GLiREL desde nodo texto
- 0003: enricher web (fetch URL/dominio + extract text)
- 0004: vista tabla por tipo de entidad
55 lines
2.2 KiB
Markdown
55 lines
2.2 KiB
Markdown
---
|
|
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.
|