---
name: trim_ax_tree
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def trim_ax_tree(nodes: list[dict]) -> list[dict]"
description: "Compacta lista de AXNode CDP descartando nodos ignorados, roles genéricos sin contenido y StaticText vacíos. Colapsa nodos con un único hijo del mismo role."
tags: [navegator, accessibility, dom, scraping, pure, ax-tree]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: nodes
    desc: "Lista de AXNode en formato CDP (Accessibility.getFullAXTree). Cada nodo es un dict con nodeId, ignored, role, name, childIds."
output: "Lista reducida de AXNode con misma estructura. Nodos descartados y colapsados segun las reglas de trimming."
tested: true
tests:
  - "descarta nodo generic sin name ni childIds"
  - "mantiene nodo button con name"
  - "descarta nodo ignored"
  - "descarta StaticText con name vacio"
  - "colapsa nodo con un hijo del mismo role"
test_file_path: "python/functions/core/trim_ax_tree_test.py"
file_path: "python/functions/core/trim_ax_tree.py"
---

## Ejemplo

```python
from core.trim_ax_tree import trim_ax_tree

nodes = [
    {"nodeId": "1", "ignored": False, "role": {"value": "RootWebArea"}, "name": {"value": ""}, "childIds": ["2", "3"]},
    {"nodeId": "2", "ignored": False, "role": {"value": "generic"}, "name": {"value": ""}, "childIds": []},
    {"nodeId": "3", "ignored": False, "role": {"value": "button"}, "name": {"value": "Enviar"}, "childIds": []},
]
result = trim_ax_tree(nodes)
# result: nodo "2" descartado, quedan "1" y "3"
print([n["nodeId"] for n in result])  # ["1", "3"]
```

## Cuando usarla

Antes de pasar un AX tree a un LLM o de chunkear con `chunk_ax_tree` — reduce el numero de nodos eliminando ruido (wrappers genéricos, texto vacío, nodos ignorados) y mejora la relacion señal/ruido del contexto enviado al modelo.

## Gotchas

- Funcion pura: no modifica los dicts originales (crea copias al fusionar).
- El colapso iterativo puede cambiar la profundidad del arbol — parentIds de nodos externos no se actualizan.
- Los nodos cuyo nodeId ya no existe en el resultado pero aparecen como childIds de otros nodos quedan como referencias colgantes — filtrar antes de usar el arbol para navegacion.
