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é.

AttributValeur
Conteneurecho-browser-worker
Port interne5002 (exposé via uvicorn host="0.0.0.0" port=5002)
Source22-docker-browser-worker/browser_api.py
Version9.2 (HEALTHCHECK)
MoteurPlaywright Chromium headless, mode Mobile (iPad) ou Desktop configurable
Bibliothèquesfastapi, playwright, orjson, pybase64, html2text
Max sessions simultanées20 (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 :

⚙️ Optimisation de l'Exécution (Gemini 3.x)

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.

ActionDescription
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 :

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 :

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.

← Planification Stratégique    Explorateur de l'Espace Personnel →