Files
graph_explorer/issues/0002-enricher-gliner-glirel.md
egutierrez a36530bb6f feat: docking host + add-node toolbar + node context menu
- 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
2026-04-30 22:55:30 +02:00

2.2 KiB

id, title, status, priority, created
id title status priority created
0002 Enricher GLiNER + GLiREL — emitir entidades/relaciones desde un nodo texto pending high 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.