Skip to main content
All posts
Automazione Browser

Zero rifiuti in Browser-Use e OpenClaw: Agenti DOM + Visione ad alta velocità su bf16.ai

Perché gli LLM standard bloccano campi password e checkbox ToS negli ambienti QA — e come abbinare Browser-Use o OpenClaw ai modelli abliterated testo + visione di bf16.ai.

TL;DR · Sintesi Ingegneristica Browser

  • Perché i browser agent si bloccano: I modelli chat scambiano <input type="password"> e checkbox ToS di staging per tentativi di phishing.
  • Doppio motore su bf16.ai: deepseek/deepseek-v4.1-flash-abliterated ($0.30 / $0.05 / $1.20) per loop DOM rapidi e zai-org/glm-5.3-flash-abliterated (Visione + Testo, $0.24 / $0.06 / $1.00) per modali grafiche.
  • Pensato per suite di staging da 25 step: Raggruppare fino a quattro azioni per step (max_actions_per_step=4) riduce i round-trip verso il modello, e i planner abliterated di bf16.ai non interrompono l’esecuzione per fare prediche al runner CI.

1. Perché campi password e checkbox ToS rompono le pipeline CI

Browser-Use e OpenClaw leggono l’albero di accessibilità DOM eliminando fragili selettori XPath. Tuttavia, durante la registrazione di account di test e la spunta dei Termini di Servizio in staging, i filtri standard interrompono lo schema JSON AgentOutput restituendo un rifiuto testuale:

[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. Architettura ibrida DOM + Visione su bf16.ai

Su bf16.ai due modelli abliterated con 1M di contesto lavorano in sinergia:

  1. deepseek/deepseek-v4.1-flash-abliterated: Massima reattività sugli alberi DOM testuali.
  2. zai-org/glm-5.3-flash-abliterated (Visione + Testo): Analizza screenshot e indici DOM insieme a $0.24/1M input (sotto il listino ufficiale FlashX di $0.37/1M).

3. Integrazione Browser-Use e isolamento di rete in Playwright

Imposta use_vision=True e max_actions_per_step=4 per raggruppare compilazione, spunta ToS e invio in un solo turno:

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())

Limita i domini consentiti direttamente con context.route() in Playwright e prova i preset JSON dal vivo su 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 interattiva (bf16.ai/playground): Test live del preset JSON Browser-Use con Zero-Prompt Retention (ZDR).

▲ Workbench interattiva (bf16.ai/playground): Test live del preset JSON Browser-Use con Zero-Prompt Retention (ZDR).

4. Analisi di latenza e costi su suite E2E da 25 step

Nell’automazione browser, ogni 500 ms di latenza del modello si moltiplica per 25 step sequenziali. Combinando max_actions_per_step=4 con le risposte in streaming di bf16.ai si riduce il numero di chiamate sequenziali al modello in una run E2E da 25 step (registrazione + configurazione del workspace); misura tempo di esecuzione e costo per run sulla tua suite. Ecco dove ciascuna strategia tende a fallire:

Strategia BrowserCausa principale di errore
API Chat Standard (solo DOM)Rifiuta password e #accept-tos
Modello locale Q4 non verificatoJSON AgentOutput malformato
deepseek-v4.1-flash-abliteratedPerde solo overlay Canvas privi di ARIA
glm-5.3-flash-abliterated (Visione)Gestisce DOM auth e modali visive

5. 4 regole ingegneristiche per browser agent in produzione

  1. Usa solo credenziali di staging e blocca gli host esterni con context.route().
  2. Raggruppa le azioni (max_actions_per_step = 4) riducendo latenza e consumo di token.
  3. Intercetta ogni checkout di pagamento reale tramite approvazione umana.
  4. Abbina max_failures=3 ai tetti giornalieri USD su bf16.ai/dashboard/keys.