14 KiB
Moli
English | 简体中文 | 日本語 | Deutsch | Français | Español
Moli est un navigateur headless destiné aux agents d'IA, conçu autour du principe de « rendu à la demande » et déjà prêt pour la production.
Par défaut, il exécute du code JavaScript réel, maintient un véritable DOM et fournit de véritables API de navigateur. Il ne calcule la mise en page et ne rend les pixels que lorsqu'ils sont réellement nécessaires.
Utilisez-le via la CLI, CDP, WebDriver Classic ou WebDriver BiDi.
Démonstration
Un jeu HTML5 rendu par Moli et inspecté en direct avec Chrome DevTools.
Le site rust-lang.org rendu par Moli, avec son DOM, son CSS et sa géométrie en direct dans Chrome DevTools.
Démarrage rapide
Donnez cette instruction à votre agent de programmation IA :
Installe les skills sous
https://github.com/lexmount/moli/tree/main/skills, suis leurs instructions pour télécharger et installer le dernier binaire Moli précompilé, puis utilisemoli-webfetchpour récupérerhttps://example.comet montre-moi le résultat.
Utilisation de la CLI
Extraire une page
Effectuez le rendu de la page au format Markdown avec la stratégie d'achèvement par défaut de Moli :
moli fetch \
--dump markdown \
--wait-until done \
https://example.com
Ou renvoyez directement un arbre sémantique compact et adapté aux modèles :
moli fetch \
--dump semantic_tree_text \
--wait-selector body \
https://example.com
Exécutez fetch --help pour obtenir la liste complète des paramètres, notamment les formats de sortie, les attentes de chargement de page ou de réponse, les profils, les réglages du proxy, les politiques de ressources et les options de traçage.
Démarrer le serveur d'automatisation
# Serveur d'automatisation de base pour les charges de travail privilégiant le DOM
moli serve
# Activer la géométrie réelle, les entrées par coordonnées et les fonctions de capture/screencast
moli serve --layout
# Récupérer aussi les ressources facultatives d'image, de police, d'audio, de vidéo, de média et de piste de texte
moli serve --layout --resource
Le même point de terminaison fournit les trois protocoles : CDP, WebDriver Classic et WebDriver BiDi. Playwright peut s'y connecter directement via CDP :
import { chromium } from "playwright";
const browser = await chromium.connectOverCDP("http://127.0.0.1:9222");
const context = browser.contexts()[0];
const page = context.pages()[0] ?? await context.newPage();
await page.goto("https://example.com");
console.log(await page.locator("body").innerText());
await browser.close();
Pourquoi Moli ?
Trois qualités sont essentielles aux charges de travail des agents, et Moli les réunit :
- Complet — JavaScript, DOM, CSS, réseau, stockage, mise en page, captures d'écran et protocoles d'automatisation standard réels, tous intégrés dans un seul navigateur headless.
- Rapide — la plupart des requêtes d'automatisation n'ont aucun besoin de rendu visuel ; les opérations axées sur la structure ignorent donc entièrement la mise en page et le dessin.
- Économe en ressources — la mise en page et les pixels ne sont produits que lorsqu'ils sont nécessaires ; Moli n'a donc pas à maintenir et actualiser en permanence un état visuel entièrement rendu.
Ce dont la plupart des tâches d'automatisation ont réellement besoin, c'est de la structure de la page, pas d'un univers visuel rendu en continu. Moli traite le DOM natif et l'état des styles comme l'unique source de vérité, et ne déclenche la mise en page ou le dessin logiciel que pour les opérations qui exigent réellement ces calculs.
| Requête de l'agent | Traitement par Moli |
|---|---|
| Extraire du HTML/Markdown, interroger le DOM, exécuter du JS, inspecter le réseau ou le stockage | Lit directement l'état de l'environnement d'exécution du navigateur — ne déclenche ni mise en page ni dessin |
| Lire la boîte englobante d'un élément, tester des coordonnées, envoyer une entrée par coordonnées | Exécute un calcul de mise en page et ne conserve que le dernier instantané de géométrie |
| Prendre une capture d'écran ou actualiser un screencast | Reconstruit à partir du DOM et des styles actuels, rend une nouvelle image, puis la supprime après usage |
Moli continue d'intégrer toutes les capacités nécessaires : V8, CSS, mise en page, composition du texte, tests de pointage, dessin logiciel, et bien plus encore. La seule différence porte sur le moment où le travail visuel s'exécute et la durée pendant laquelle ses résultats sont conservés. Ce modèle de coût convient particulièrement à l'exploration du Web, aux agents utilisant un navigateur, aux pipelines de recherche d'information, aux environnements d'évaluation et aux charges de travail d'apprentissage par renforcement.
Fonctionnalités actuellement prises en charge
- Environnement Web complet — analyse HTML en flux continu, DOM natif, JavaScript V8, modules/minuteurs/microtâches/événements, iframes et workers, cascade CSS, Fetch/XHR/WebSocket, cookies, WebCrypto et stockage propre à chaque profil (localStorage, IndexedDB, OPFS).
- Sorties optimisées pour l'extraction — la CLI produit directement du HTML, du Markdown, du JSON, des arbres de texte sémantiques et des résultats sérialisés contenant les informations de frame, avec des attentes de sélecteur/script/réponse et le traçage réseau.
- Programme d'automatisation unifié — CDP, WebDriver Classic et WebDriver BiDi partagent le même noyau et le même ordonnanceur. Aucune installation distincte de ChromeDriver, geckodriver ou du navigateur lui-même n'est nécessaire.
- Fonctions visuelles réelles à la demande — l'option
--layoutactive la construction complète des boîtes, la mise en page Taffy, la composition du texte Parley, les tests de pointage/entrées fondés sur la mise en page, les captures de la fenêtre d'affichage et les screencasts DevTools rendus à basse fréquence par le processeur. - Options d'exploitation contrôlables — profils, cookies, cache HTTP, proxys, familles de ressources, limites de connexions, délais d'expiration, politique de réseau privé, remplacement du User-Agent, journalisation structurée et diagnostics réseau sont tous disponibles.
La relation entre Moli et Lexmount
Moli est le navigateur headless open source de Lexmount ; Lexmount Browser est l'environnement d'exécution cloud géré et le plan de contrôle construits autour de celui-ci.
Le navigateur headless open source est entièrement utilisable seul, sans dépendre de Lexmount Browser.
Maîtrise des coûts
Dans Moli, les opérations coûteuses du navigateur doivent être activées explicitement et ne le sont jamais par défaut :
| Mode ou option | Comportement |
|---|---|
| Par défaut | LayoutPolicy::Mock — géométrie déterministe dans un format compatible, sans véritable mise en page ni dessin |
--layout |
LayoutPolicy::OnDemand — véritables mise en page, géométrie, tests de pointage, entrées par coordonnées, captures d'écran et screencast |
--resource |
Récupère toutes les familles facultatives de ressources visuelles ou multimédias |
--image, --font, --audio, --video, --media, --text-track |
Active une famille précise de ressources facultatives |
--profile-dir, --http-cache-dir, --cookie-file |
Active sélectivement la persistance nécessaire à la charge de travail |
Le résultat de la mise en page est un instantané produit à la demande, et non un état maintenu en continu : la première demande de géométrie (à froid) construit une mise en page complète à partir du DOM et des styles actuels, puis ne conserve que le dernier LayoutPassOutput. Par la suite, les lectures de géométrie ordinaires peuvent réutiliser cet instantané même si la page a changé. Les captures d'écran et les screencasts, eux, sont reconstruits à chaque fois et ne réutilisent jamais d'anciens résultats.
Architecture
Moli est un noyau de navigateur autonome, et non une surcouche de Chromium. Développé en Rust, il possède ses propres règles de propriété et de cycle de vie. Ses principales dépendances sont :
libcurl— transport réseau et environnement d'exécution multirequêtehtml5ever— analyse HTMLrusty_v8/ V8 — exécution de JavaScript- Servo/Stylo — sélecteurs, cascade et styles calculés
- Taffy + Parley — mise en page des boîtes et du texte
- AnyRender/Vello CPU,
usvget l'écosystème d'images Rust — rendu logiciel
Le document et les styles n'ont qu'une seule source de vérité : le DOM natif et son intégration à Stylo. Chaque véritable actualisation reconstruit la mise en page à partir de cette source, convertit le résultat en données immuables indépendantes du DOM, puis élimine l'état temporaire produit pendant cette passe de mise en page et de dessin. L'ensemble du système ne comporte ni arbre de mise en page incrémental, ni graphe de dommages, ni liste d'affichage persistante, ni compositeur GPU, ni fenêtre persistante.
Données de test
Les deux ensembles de mesures ci-dessous montrent le périmètre actuel des capacités de Moli. Les tests couvrent des sites réels, de véritables clients d'automatisation, des vérifications ciblées du comportement Chromium/WPT et une vaste suite de régression nextest.
Test d'exploration mixte du Web public
Le test porte sur 192 URL publiques de grands sites chinois et internationaux. Pour être considérée comme réussie, une page doit produire un contenu réellement utile après l'exécution de JavaScript : un code HTTP 200, une page de vérification, un mur de connexion, une réponse vide ou une interface d'application réduite à sa coquille ne suffisent pas.
| Navigateur | Pages utiles | Taux de réussite | Temps médian | RSS médiane |
|---|---|---|---|---|
| Moli | 103 | 53.6% | 1.43 s | 73 MiB |
| Chrome Headless | 101 | 52.6% | 1.43 s | 773 MiB |
| Lightpanda | 85 | 44.3% | 0.97 s | 40 MiB |
| Obscura | 57 | 29.7% | 1.30 s | 39 MiB |
Exemple de charge de travail d'un agent
| Mesure | Moli | Chromium |
|---|---|---|
| CDP prêt | 34.85 ms | 169.37 ms |
| Durée active d'un épisode p50 | 33.40 ms | 57.13 ms |
| PSS maximal | 102.46 MiB | 348.82 MiB |
| Nombre maximal de processus / threads | 1 / 24 | 11 / 123 |
Dans la sélection WPT actuelle utilisée pour valider le périmètre fonctionnel du navigateur pour agents de Moli, une exécution complète a enregistré 1 612 000 tests réussis.
Périmètre du projet
Dans les scénarios de navigateur pour agents définis par la documentation, Moli est déjà prêt pour la production et continue de faire l'objet d'un développement actif.
Les limites actuellement conservées de manière intentionnelle comprennent :
- Aucun navigateur avec interface graphique, aucune fenêtre persistante, aucun compositeur GPU et aucune architecture persistante de dessin multiframe.
- Moli ne cherche pas à reproduire Chrome pixel par pixel et ne propose pas de lecture haute fidélité de Canvas, WebGL ou des médias.
- Seule une partie des fonctionnalités de CDP, WebDriver Classic et WebDriver BiDi est couverte, et non une implémentation entièrement compatible de ces protocoles.
- Le mode
--layoutprend en charge les captures d'écran logicielles et la génération de PDF CDP rastérisés, mais pas tous les modes de capture ou d'impression de Chrome. - Le chargement des ressources, l'actualisation de la géométrie et le coût du rendu visuel restent des choix de politique à définir explicitement, et ne sont pas activés en permanence par défaut.
Les chemins de protocole non pris en charge renvoient une erreur explicite : Moli ne prétend jamais qu'une action du navigateur, un événement, une observation réseau ou un résultat visuel a eu lieu.
Les mainteneurs peuvent publier une version binaire balisée depuis GitHub Actions en suivant le guide de publication.
Licence
Sauf indication contraire dans un fichier ou un répertoire, Moli peut être utilisé, au choix, sous licence Apache 2.0 ou sous licence MIT. Les composants et les fixtures tiers sous licence distincte restent soumis à leurs propres licences et mentions.
