7b. Web Intelligence
Les outils de Web Intelligence confèrent à ECHO la capacité de naviguer sur le Web de manière
autonome, de lire et d'interagir avec des pages dynamiques, d'en extraire le contenu sémantique,
et d'effectuer des recherches via un moteur souverain. Ces capacités reposent sur deux
composants complémentaires : le Browser Agent (micro-service Docker FastAPI +
Playwright) et le SearxNG Proxy (moteur de recherche méta souverain, outil
séparé sovereign_web_search.py).
Architecture — Browser Agent (Playwright)
Le Browser Agent est un micro-service Docker dédié (browser_api.py v9.2, FastAPI
+ Playwright asyncio). Il pilote une instance Chromium headless via Playwright.
Il gère plusieurs sessions navigateur simultanées (jusqu'à 20), chacune liée à un
chat_id ECHO et nettoyée automatiquement après 1 heure d'inactivité.
| Attribut | Valeur |
|---|---|
| Conteneur | echo-browser-agent |
| Port interne | 5002 (exposé via uvicorn host="0.0.0.0" port=5002) |
| Source | 22-docker-browser-agent/browser_api.py |
| Version | 9.2 (HEALTHCHECK) |
| Moteur | Playwright Chromium headless, mode Mobile (iPad) ou Desktop configurable |
| Bibliothèques | fastapi, playwright, orjson, pybase64, html2text |
| Max sessions simultanées | 20 (MAX_SESSIONS) |
| Timeout inactivité | 3 600 s = 1 heure (IDLE_TIMEOUT_DEFAULT) |
Actions disponibles (API /action)
Toutes les actions transitent par le endpoint POST /action avec un champ
action identifiant l'opération. Le tool ECHO navigation_engine_tool.py
encapsule ces appels HTTP REST.
| Action | Description |
|---|---|
goto |
Navigue vers une URL. Attend networkidle (timeout 60 s). Retourne title et url. |
click |
Clique sur un élément par index (data-echo-index) ou selector CSS/XPath. Mouse shake anti-bot. |
type |
Saisit du texte dans un champ via page.fill() (remplace le contenu). Cible par index ou selector. |
press |
Presse une touche clavier (ex. Enter, Tab). Attend networkidle après. |
hover |
Survole un élément (déclenche les menus déroulants, tooltips). |
scroll |
Fait défiler la page : down, up, top, bottom. |
read |
Extrait le contenu textuel de la page en Markdown via html2text. Limité à 30 000 caractères. |
read_html |
Retourne le code HTML source complet, encodé en Base64 pour protéger le JSON. |
get_attribute |
Récupère un attribut HTML (ex. href, src) d'un élément ciblé par index. |
highlight |
Cartographie tous les éléments interactifs de la page avec numérotation visuelle (ECHO markers), prend un screenshot. Retourne screenshot_b64, liste des éléments (metadata) et count. |
tab_new |
Ouvre un nouvel onglet (jusqu'à N onglets simultanés par session). Retourne l'index du nouvel onglet. |
tab_switch |
Bascule sur l'onglet d'index donné. |
tab_close |
Ferme l'onglet actif (refuse si dernier onglet restant). |
reset |
Réinitialisation complète de la session : ferme le contexte Playwright et purge l'entrée dans SESSIONS. |
⚙️ ECHO DOM Markers — cartographie visuelle
L'action highlight injecte un script JS (HIGHLIGHT_JS) qui scanne tous
les éléments interactifs (liens, boutons, inputs, éléments cursor:pointer) et leur
attache une étiquette numérotée rouge (.echo-marker). Le modèle peut alors cibler
un élément précis par son index — plus fiable qu'un sélecteur CSS fragile sur des
pages dynamiques.
Session Navigateur et Profils
Chaque session est initialisée via POST /start_session avec un session_id
(= chat_id ECHO). Deux profils de navigateur sont disponibles :
- mobile (défaut) : iPad 820×1180, User-Agent Safari iOS 16 — contourne une majorité de protections anti-bot.
- desktop : Chrome 120, 1280×800 — pour les sites nécessitant un viewport large.
Recherche Web Souveraine
La recherche Web est fournie par l'outil séparé sovereign_web_search.py, qui offre un double moteur :
une recherche instantanée via DuckDuckGo (mode anonyme) et une recherche approfondie (deep search)
via l'instance SearxNG interne (http://echo-searxng:8080).
Aucune donnée de recherche ne transite par un moteur tiers tracé.
v9.3-9.4 — Distillation via call_cascade() centralisé
L'action distill_page utilise désormais EchoGeminiClient.call_cascade()
(au lieu d'un appel direct) avec MODEL_FLASH clampé par la politique Pipe.
La propagation du user_id vers clamp_model garantit que le fallback
SQLite echo_settings est lu correctement même si OWUI ne propage pas les
métadonnées du Pipe.
Cockpit de Replay Web
Après une session de navigation, l'action web_navigation_replay_action.py génère
une interface HUD listant toutes les actions effectuées avec leurs captures d'écran. L'utilisateur
peut rejouer ou exporter la session.