# Tipos: EntityNode / FilteredEntities

Fuente conceptual: MiroFish `backend/app/services/zep_entity_reader.py` (AGPL-3.0)
Reimplementar desde cero. No copiar codigo.

## Tipos a implementar

### 1. EntityNode (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class EntityNode:
      uuid: str                                   # identificador unico
      name: str                                   # nombre de la entidad
      labels: list[str] = field(default_factory=list)  # tipos/etiquetas (ej: ["Person", "Professor"])
      summary: str = ""                           # resumen textual
      attributes: dict = field(default_factory=dict)   # atributos adicionales
      related_edges: list[dict] = field(default_factory=list)  # relaciones
      related_nodes: list[dict] = field(default_factory=list)  # nodos conectados
  ```
- **Metodos:**
  - `to_dict() -> dict`
  - `get_entity_type() -> str | None` — retorna el primer label que no sea generico ("Entity"), o None
- **Descripcion:** Nodo de entidad extraido de un knowledge graph. Contiene la identidad, tipo(s), atributos y relaciones de una entidad. Generico — no acoplado a Zep o ningun graph DB especifico.

### 2. FilteredEntities (product)

- **Dominio:** core
- **Lang:** Python
- **Algebraic:** product
- **Definicion:**
  ```python
  @dataclass
  class FilteredEntities:
      entities: list[EntityNode]
      entity_types: set[str]                      # tipos unicos encontrados
      total_count: int                            # total antes de filtrar
      filtered_count: int                         # total despues de filtrar
  ```
- **Metodos:** `to_dict() -> dict`
- **Descripcion:** Resultado de filtrar entidades de un graph por tipos definidos. Captura tanto las entidades filtradas como los conteos para reporting.
- **Uso:** Despues de construir un knowledge graph, se filtran las entidades por tipos definidos en la ontologia para obtener solo las relevantes. El total_count vs filtered_count muestra cuantas entidades se descartaron.
