Skip to main content
All posts
Automação de Browser

Fim das recusas no Browser-Use e OpenClaw: Agentes DOM + Visão de alta velocidade na bf16.ai

Por que LLMs comuns bloqueiam campos de senha e checkboxes ToS em ambientes de QA — e como combinar Browser-Use ou OpenClaw com os modelos abliterated de texto e visão da bf16.ai.

TL;DR · Resumo de Engenharia de Browser

  • Causa raiz das falhas: Modelos de chat recusam <input type="password"> e <input type="checkbox" name="tos"> em suítes legítimas de staging.
  • Motor duplo na bf16.ai: deepseek/deepseek-v4.1-flash-abliterated ($0.30 / $0.05 / $1.20) para DOM puro e zai-org/glm-5.3-flash-abliterated (Visão + Texto, $0.24 / $0.06 / $1.00) para modais visuais.
  • Feito para suítes de staging de 25 etapas: Agrupar até quatro ações por passo (max_actions_per_step=4) reduz as idas e voltas ao modelo, e os planejadores abliterated da bf16.ai não interrompem a execução para passar sermão no seu runner de CI.

1. Por que campos de senha e checkboxes ToS derrubam testes autônomos

Browser-Use e OpenClaw leem a árvore de acessibilidade em tempo real, eliminando seletores XPath frágeis. Porém, ao preencher credenciais de homologação e marcar caixas de aceite de termos, modelos tradicionais trocam o JSON AgentOutput por um sermão moral e quebram a pipeline de CI:

[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. Arquitetura híbrida DOM + Visão na bf16.ai

Dois modelos abliterated de 1M de contexto cobrem todo o espectro na bf16.ai:

  1. deepseek/deepseek-v4.1-flash-abliterated: Latência mínima em árvores DOM textuais.
  2. zai-org/glm-5.3-flash-abliterated (Visão + Texto): Inspeciona screenshots e índices DOM simultaneamente por $0.24/1M de entrada (abaixo do oficial FlashX de $0.37/1M).

3. Integração no Browser-Use e trava de rede no Playwright

Ative use_vision=True e max_actions_per_step=4 para agrupar preenchimento, aceite de termos e envio em uma única chamada:

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

Garanta o escopo de rede com context.route() no Playwright e teste seus prompts antes no 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 ao vivo (bf16.ai/playground): Testando presets JSON do Browser-Use com retenção zero de prompts (ZDR).

▲ Workbench ao vivo (bf16.ai/playground): Testando presets JSON do Browser-Use com retenção zero de prompts (ZDR).

4. Análise de latência e custo de tokens em suítes E2E de 25 passos

Com ações em lote (max_actions_per_step=4) e respostas em streaming na bf16.ai, uma suíte de 25 etapas faz menos chamadas sequenciais ao modelo; meça o tempo total e o custo por execução na sua própria suíte. Veja onde cada estratégia costuma falhar:

Estratégia de BrowserFalha Principal
API Chat Padrão (só DOM)Recusa password e #accept-tos
Modelo Local Q4 não verificadoQuebra no schema JSON AgentOutput
deepseek-v4.1-flash-abliteratedPerde apenas elementos Canvas sem ARIA
glm-5.3-flash-abliterated (Visão)Domina DOM de autenticação e modais visuais

5. 4 regras práticas para agentes de navegador em produção

  1. Use apenas credenciais de staging e restrinja hosts via context.route().
  2. Empacote ações (max_actions_per_step = 4) reduzindo latência e consumo de tokens.
  3. Bloqueie URLs de pagamento real exigindo confirmação humana.
  4. Combine max_failures=3 com tetos diários em USD em bf16.ai/dashboard/keys.