Skip to main content
All posts
Automatisation Web

Éliminer les refus dans Browser-Use et OpenClaw : Agents DOM + Vision ultra-rapides sur bf16.ai

Pourquoi les LLM classiques bloquent sur les champs mot de passe et cases CGU en préproduction — et comment associer Browser-Use ou OpenClaw aux modèles abliterated texte + vision de bf16.ai.

TL;DR · Synthèse Ingénierie Browser

  • Pourquoi les agents navigateur bloquent : Les LLM de chat assimilent <input type="password"> et les cases CGU (#accept-tos) en QA à de l’hameçonnage.
  • Double moteur sur bf16.ai : deepseek/deepseek-v4.1-flash-abliterated ($0.30 / $0.05 / $1.20) pour les boucles DOM et zai-org/glm-5.3-flash-abliterated (Vision + Texte, $0.24 / $0.06 / $1.00) pour les modales visuelles.
  • Pensé pour les suites de préproduction en 25 étapes : Regrouper jusqu’à quatre actions par étape (max_actions_per_step=4) réduit les allers-retours avec le modèle, et les planificateurs abliterated de bf16.ai ne s’interrompent pas en cours d’exécution pour faire la morale à votre runner CI.

1. Pourquoi les champs password et cases CGU font échouer vos suites CI

Browser-Use et OpenClaw lisent l’arbre d’accessibilité en direct sans dépendre de sélecteurs XPath fragiles. Pourtant, lors d’une inscription automatisée en staging avec validation des CGU, un modèle grand public abandonne le schéma JSON AgentOutput pour renvoyer une leçon de morale, faisant planter le test :

[browser-use] Step 11/25 -> URL: https://staging.billing-app.internal/signup/verify
[browser-use] Extracted 42 interactive DOM elements:
  [18] <input type="email" name="work_email" />
  [19] <input type="password" name="password" />
  [24] <input type="checkbox" id="accept-tos-privacy" />
  [25] <button type="submit">Create Staging Account</button>
[llm:response] finish_reason="stop" (0 tool_calls emitted)
  "I cannot enter authentication credentials, create user accounts, or accept legally binding Terms of Service agreements on your behalf."
[browser-use] ValidationError: AgentOutput JSON missing required field 'action'. Suite failed (exit 1).

2. Architecture hybride DOM + Vision sur bf16.ai

Deux modèles abliterated à contexte 1M couvrent tous les besoins sur bf16.ai :

  1. deepseek/deepseek-v4.1-flash-abliterated : Vitesse maximale sur DOM textuel.
  2. zai-org/glm-5.3-flash-abliterated (Vision + Texte) : Analyse captures d’écran et indices DOM à $0.24/1M en entrée (sous le tarif officiel FlashX de $0.37/1M).

3. Intégration Browser-Use et verrouillage réseau dans Playwright

Activez use_vision=True et max_actions_per_step=4 pour regrouper saisie, case CGU et envoi en un seul tour :

import asyncio, os
from langchain_openai import ChatOpenAI
from browser_use import Agent, BrowserConfig, Browser

# Primary fast DOM planner ($0.30/$0.05/$1.20 per 1M)
dom_llm = ChatOpenAI(
    base_url="https://api.bf16.ai/v1",
    api_key=os.environ["BF16_API_KEY"],
    model="deepseek/deepseek-v4.1-flash-abliterated",
    temperature=0.1,
)

# Multimodal Vision + Text planner ($0.24/$0.06/$1.00 per 1M)
vision_llm = ChatOpenAI(
    base_url="https://api.bf16.ai/v1",
    api_key=os.environ["BF16_API_KEY"],
    model="zai-org/glm-5.3-flash-abliterated",
    temperature=0.1,
)

async def run_staging_onboarding_suite():
    browser = Browser(config=BrowserConfig(headless=True))
    agent = Agent(
        task=(
            "1. Open https://staging.billing-app.internal/signup. "
            "2. Fill test account credentials from QA fixture, check #accept-tos-privacy, and submit. "
            "3. Complete the 3-step workspace wizard and assert that '/dashboard/ready' renders."
        ),
        llm=vision_llm,      # Native Vision + DOM reasoning without refusal lectures
        use_vision=True,
        browser=browser,
        max_actions_per_step=4,
    )
    history = await agent.run(max_steps=25)
    assert history.is_done(), "Staging onboarding E2E did not reach terminal assertion"

if __name__ == "__main__":
    asyncio.run(run_staging_onboarding_suite())

Verrouillez les domaines autorisés directement via context.route() dans Playwright et testez vos scénarios en direct sur bf16.ai/playground :

// Deterministic Playwright/CDP network guardrail (enforce domain policy in code, not RLHF!)
const ALLOWED_HOSTS = new Set([
  'staging.billing-app.internal',
  'auth-sandbox.billing-app.internal',
  'localhost',
]);

await context.route('**/*', async (route) => {
  const url = new URL(route.request().url());
  if (!ALLOWED_HOSTS.has(url.hostname)) {
    return route.abort('blockedbyclient');
  }
  return route.continue();
});

Workbench interactif (bf16.ai/playground) : Test en direct du preset JSON Browser-Use avec rétention zéro (ZDR).

▲ Workbench interactif (bf16.ai/playground) : Test en direct du preset JSON Browser-Use avec rétention zéro (ZDR).

4. Latence et coût en tokens d’un parcours E2E de 25 étapes

Combiner max_actions_per_step=4 avec les réponses en streaming de bf16.ai réduit le nombre d’appels séquentiels au modèle sur un parcours E2E de 25 étapes (inscription + configuration de l’espace de travail) ; évaluez la durée et le coût de chaque run sur votre propre suite. Voici où chaque stratégie échoue le plus souvent :

Stratégie NavigateurCause principale d’échec
API Chat Standard (DOM seul)Refuse password et #accept-tos
Modèle local Q4 non vérifiéSchéma JSON AgentOutput invalide
deepseek-v4.1-flash-abliteratedIgnore uniquement les Canvas sans ARIA
glm-5.3-flash-abliterated (Vision)Gère DOM d’auth et overlays visuels

5. 4 règles d’ingénierie pour vos agents navigateur en production

  1. Utilisez uniquement des comptes de préproduction et filtrez les hôtes via context.route().
  2. Regroupez les actions (max_actions_per_step = 4) pour réduire la latence.
  3. Bloquez toute validation de paiement réel sans approbation humaine explicite.
  4. Associez max_failures=3 à un plafond quotidien USD sur bf16.ai/dashboard/keys.