Skip to main content
All posts
Automatización Web

Fin a los rechazos en Browser-Use y OpenClaw: Agentes DOM + Visión sin interrupciones en bf16.ai

Por qué los LLM estándar confunden campos password y casillas ToS de staging con phishing, y cómo combinar Browser-Use u OpenClaw con los modelos abliterated de texto + visión de bf16.ai.

TL;DR · Resumen de Ingeniería Browser

  • Por qué fallan los agentes web: Los modelos de chat bloquean <input type="password"> y casillas <input type="checkbox" name="tos"> en suites QA legítimas.
  • Doble motor en bf16.ai: deepseek/deepseek-v4.1-flash-abliterated ($0.30 / $0.05 / $1.20) para bucles DOM ultrarrápidos y zai-org/glm-5.3-flash-abliterated (Visión + Texto, $0.24 / $0.06 / $1.00) para modales visuales.
  • Pensado para suites de staging de 25 pasos: Agrupar hasta cuatro acciones por paso (max_actions_per_step=4) reduce los viajes de ida y vuelta al modelo, y los planificadores abliterated de bf16.ai no se detienen a mitad de la ejecución para sermonear a tu runner de CI.

1. Por qué los campos password y casillas ToS rompen tus pruebas E2E

Browser-Use y OpenClaw eliminan selectores XPath frágiles leyendo el árbol de accesibilidad en vivo. Sin embargo, al automatizar registros en entornos staging y marcar casillas de términos de servicio, los clasificadores de consumo abandonan el esquema JSON AgentOutput para emitir un sermón, rompiendo el job 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. Arquitectura híbrida DOM + Visión en bf16.ai

En bf16.ai dispones de dos modelos abliterated con 1M de contexto:

  1. deepseek/deepseek-v4.1-flash-abliterated: Máxima velocidad en árboles DOM textuales.
  2. zai-org/glm-5.3-flash-abliterated (Visión + Texto): Analiza capturas de pantalla y nodos DOM simultáneamente a $0.24/1M entrada (por debajo del precio oficial FlashX de $0.37/1M).

3. Integración en Browser-Use y aislamiento de red en Playwright

Con use_vision=True y max_actions_per_step=4, el agente agrupa relleno de credenciales de prueba, casilla ToS y envío en 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())

Restringe los dominios permitidos directamente en context.route() de Playwright, y valida tus prompts al instante en 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 interactivo (bf16.ai/playground): Prueba en vivo del preset JSON de Browser-Use con retención cero (ZDR).

▲ Workbench interactivo (bf16.ai/playground): Prueba en vivo del preset JSON de Browser-Use con retención cero (ZDR).

4. Desglose de latencia y coste en suites E2E de 25 pasos

En automatización de navegadores, cada 500 ms de latencia del modelo se multiplica por 25 pasos secuenciales. Combinar max_actions_per_step=4 con respuestas en streaming en bf16.ai reduce el número de llamadas secuenciales al modelo en una suite E2E de 25 pasos (registro + configuración del workspace); mide en tu propia suite el tiempo total y el coste de cada ejecución. Estos son los puntos de fallo típicos de cada estrategia:

Estrategia de NavegadorCausa principal de fallo
API Chat Estándar (solo DOM)Rechaza campos password y #accept-tos
Modelo Local Q4 sin verificarJSON AgentOutput inválido
deepseek-v4.1-flash-abliteratedSolo omite modales Canvas sin ARIA
glm-5.3-flash-abliterated (Visión)Resuelve tanto DOM auth como overlays visuales

5. 4 reglas de oro para agentes de navegador en producción

  1. Usa exclusivamente cuentas de staging y bloquea dominios externos con context.route().
  2. Agrupa acciones (max_actions_per_step = 4) para reducir tanto la latencia como el gasto en tokens.
  3. Intercepta pasarelas de pago reales en código con aprobación humana.
  4. Configura max_failures=3 junto a topes diarios USD en bf16.ai/dashboard/keys.