8b. 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 via une boucle OODA (Observation, Orientation, Décision, Action), 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-worker |
| Port interne | 5002 (exposé via uvicorn host="0.0.0.0" port=5002) |
| Source | 22-docker-browser-worker/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) |
Agent Navigateur : Boucle OODA et API à 4 Piliers
La navigation n'est plus manuelle : elle est déléguée à un agent autonome via delegate_web_browsing.
Cet agent opère de manière strictement isolée dans une boucle fermée : il n'a ni l'autorisation ni la capacité technique d'invoquer d'autres sous-agents.
Il fonctionne selon sa propre boucle OODA (Observe, Orient, Decide, Act) et interagit avec la page via une API structurée en 4 piliers :
- Inspect (
action_inspect_page) : Perception séquentielle de la page (A11y tree, lecture texte brut, HTML). - A11y (
action_interact_a11y) : Interaction prioritaire basée sur l'arbre d'accessibilité (rôle, nom textuel). - DOM (
action_interact_dom) : Interaction par index DOM strict ou sélecteur (clics, saisies). - Control (
action_browser_control) : Manipulation du navigateur (navigation, scroll, gestion des onglets, touches clavier).
⚙️ Optimisation de l'Exécution (Gemini 3.x)
- Parallel Function Calling : L'agent est autorisé à grouper plusieurs actions non mutantes dans le même tour (règle 3), et à demander simultanément plusieurs extractions de l'état (règle 1) pour accélérer sa boucle OODA.
- Injection Multimodale Native : Les captures d'écran sont injectées directement via l'attribut
partsde lafunctionResponse, évitant la perte du contexte visuel et les erreurs 400.
Vision-On-Demand et Mode Lidar
Pour limiter l'explosion du contexte, la vision multimodale n'est plus systématique. L'agent utilise le Vision-On-Demand : il doit explicitement demander une capture d'écran s'il est bloqué (ex: bouton sans texte). Il dispose également d'un mode hybride Lidar/Vision générant une grille de coordonnées (VISION_GRID_STEP, défaut 100px) pour cibler spatialement les éléments récalcitrants.
🚨 Restriction de Recherche Strictement Codée
Bien que l'outil de recherche search_web accepte techniquement l'argument moteur google via SearXNG, le Navigateur Autonome (Browser Agent) et l'Agent de Recherche Profonde ont formellement l'interdiction de l'utiliser. Les règles 5 et 8 de leurs System Prompts internes proscrivent l'usage des moteurs de recherche généralistes. Le navigateur est strictement restreint à l'extraction sur URL absolue précise. Toute recherche doit obligatoirement passer par les outils dédiés (search_web, search_instant_answer).
⚙️ La Descente Cognitive (Superoutils)
L'ancienne méthode de distillation monolithique a été supprimée au profit de la Descente Cognitive.
Le schéma injecte dynamiquement deux "superoutils" dans le contexte de l'Agent Navigateur :
action_analyze_page (qui exploite le Streaming Sémantique natif d'ECHO pour lire le DOM en temps réel) et
action_archive_page (qui procède à un archivage asynchrone RAG). L'agent devient totalement autonome dans son traitement.
Actions internes 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.
- desktop : Chrome 120, 1280×800 - pour les sites nécessitant un viewport large.
Défense Passive et Gestion du Contexte
Pour éviter l'explosion du contexte avec de multiples itérations et des DOM lourds, le système implémente une double approche :
- Proactive Context Pruning : Élagage dynamique des cartes DOM, arbres A11y et images obsolètes dans les anciens messages de l'historique (seuil configurable via
PRUNE_CONTENT_THRESHOLD). - Troncature Silencieuse (Smart Pop) : Évaluation de la taille globale en tokens (
estimate_token_size). Si le contexte approche la limite maximale (CONTEXT_TRUNCATE_THRESHOLD), les messages les plus anciens sont purgés en garantissant l'intégrité des paires ToolCall/ToolResponse pour prévenir tout crash de l'API Gemini.
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é. Conformément aux principes de souveraineté, l'usage de moteurs de recherche généralistes (comme Google ou Bing) est proscrit.
Distillation via call_cascade() centralisé
L'action action_archive_page utilise EchoGeminiClient.call_cascade()
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.
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.