--- id: 0028b title: Enrichers extract_domain, extract_links, extract_text_entities status: pending priority: high created: 2026-05-01 depends_on: [0028] --- ## Objetivo Tres enrichers Python adicionales que reusan el contrato validado por `fetch_webpage`. Cada uno cubre un eje de extraccion distinto. ## 1. `extract_domain` ``` applies_to: [Url, Webpage, Email] emits: [Domain] relations: [BELONGS_TO] ``` - Saca el dominio de `metadata.url` o `metadata.address`. - Crea nodo `Domain` si no existe + relacion `BELONGS_TO`. - Util cuando el usuario tiene un Url/Email que aun no ha sido fetched pero quiere ver el dominio en el grafo. ## 2. `extract_links` ``` applies_to: [Webpage] emits: [Url] relations: [LINKS_TO] ``` - Lee `metadata.markdown_path`. Si vacio → exit con error "run fetch_webpage first". - `extract_urls_py_cybersecurity` sobre el contenido. - Para cada URL distinta encontrada: - Crea nodo `Url` con `metadata.url` (si no existe). - Relacion `LINKS_TO` desde la Webpage origen. - Param: `max_links` (default 50) para no saturar el grafo. ## 3. `extract_text_entities` ``` applies_to: [Webpage] emits: [Person, Org, Email, Phone, Domain, Location, IPAddress, CVE, ...] relations: [EXTRACTED_FROM, ...relaciones que GLiREL detecte] ``` - Lee `metadata.markdown_path`. - Llama `extract_graph_hybrid_py_pipelines` (regex IoCs + GLiNER + GLiREL + LLM fallback). - Para cada entidad detectada: - Resuelve por `(name, type)` en operations.db. Si no existe la crea. - Relacion `EXTRACTED_FROM` desde la entidad nueva al nodo Webpage. - Para cada relacion detectada por GLiREL: - Relacion entre las dos entidades con el `kind` predicho. - Params: - `chunk_size` (default 2000) - `use_llm_fallback` (default false — evitar coste; el usuario lo activa en jobs concretos) ## Definicion de hecho - Los tres enrichers aparecen en el menu "Run enricher" segun el tipo del nodo right-clickado. - En un nodo Webpage el menu muestra los 3 + fetch_webpage. - Test integracion: - Crear Url → fetch_webpage → run extract_links sobre el resultado → run extract_text_entities → grafo se llena con persons/orgs/etc. - Cada paso es un job independiente visible en panel Jobs. - `extract_text_entities` con LLM off termina sin coste y produce entidades de IoC + entidades GLiNER (gratis).