5b10b419a2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.9 KiB
3.9 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | |||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cdp_perceive_outline | pipeline | py | pipelines | 1.0.0 | impure | def cdp_perceive_outline(debug_port: int, tab_id: str, max_chars: int = 20000) -> str | Pipeline de percepción: conecta a Chrome via CDP, obtiene el AX tree completo, lo poda y lo convierte en un outline indentado legible para LLMs. Cada nodo accionable lleva #ref=nodeId. Reemplaza enviar 1k-50k nodos JSON crudos al modelo. |
|
|
false | error_go_core |
|
|
String multi-línea con el outline indentado de la página. Nodos accionables tienen ' #ref=nodeId' alineado. El LLM puede responder 'haz clic en #ref=44' para operar la página. | false | python/functions/pipelines/cdp_perceive_outline.py |
Ejemplo
# Via fn run (patrón canónico para agentes)
./fn run cdp_perceive_outline --debug-port 9333 --tab-id <id>
# Obtener tab_id primero:
curl -s http://127.0.0.1:9333/json/list | python3 -m json.tool | grep '"id"'
./fn run cdp_perceive_outline --debug-port 9333 --tab-id "A1B2C3D4..." --max-chars 15000
# Uso desde Python (heredoc o pipeline propio)
import sys, os
sys.path.insert(0, os.path.join("python", "functions"))
from pipelines.cdp_perceive_outline import cdp_perceive_outline
outline = cdp_perceive_outline(debug_port=9333, tab_id="A1B2C3D4...")
print(outline)
# RootWebArea "GitHub"
# navigation "Site navigation"
# link "Homepage" #ref=12
# button "Search" #ref=18
# main
# heading "Repositories"
# link "fn_registry" #ref=44
# textbox "Filter repositories" #ref=51
Cuando usarla
Cuando un agente LLM necesita "ver" una página Chrome ya abierta para decidir qué elemento accionar a continuación. Sustituye enviar el AX tree crudo (1k-50k nodos JSON) al modelo por un outline compacto de ~200-500 líneas. El #ref=nodeId hace que el LLM pueda responder con una referencia exacta sin ambigüedad.
Flujo típico de un agente browser:
cdp_list_tabs→ obtenertab_idcdp_perceive_outline→ outline compacto de la página- LLM decide acción (clic en #ref=44, texto en #ref=51, etc.)
cdp_click_node/cdp_type_textcon el nodeId extraído del #ref
Gotchas
- Chrome debe estar corriendo con
--remote-debugging-port=<port>. En Linux nativo:chromium --remote-debugging-port=9333 &. Con CDP global activado en/etc/chromium.d/cdp, el puerto 9222 siempre está disponible. - El tab no puede tener DevTools abierto (toma el debugger exclusivo). Cerrar DevTools antes de llamar.
Accessibility.getFullAXTreepuede tardar 2-10s en páginas muy pesadas (SPAs tipo Gmail con miles de nodos). El timeout total es 15s.- El outline resultante puede superar
max_charsen ~100 chars si el último nodo visible es muy largo. Usar margen holgado (ej. 18000 en vez de 20000 si el context window es ajustado). - Si la página no tiene contenido accesible (ej. canvas puro, PDF embebido), el outline estará vacío o solo tendrá el RootWebArea. En ese caso usar CDP JS evaluation directamente.
tab_ides el campo"id"del JSON de/json/list, no"targetId". Son diferentes.