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 yzai-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:
deepseek/deepseek-v4.1-flash-abliterated: Máxima velocidad en árboles DOM textuales.zai-org/glm-5.3-flash-abliterated(Visión + Texto): Analiza capturas de pantalla y nodos DOM simultáneamente a$0.24/1Mentrada (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).
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 Navegador | Causa principal de fallo |
|---|---|
| API Chat Estándar (solo DOM) | Rechaza campos password y #accept-tos |
| Modelo Local Q4 sin verificar | JSON AgentOutput inválido |
deepseek-v4.1-flash-abliterated | Solo 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
- Usa exclusivamente cuentas de staging y bloquea dominios externos con
context.route(). - Agrupa acciones (
max_actions_per_step = 4) para reducir tanto la latencia como el gasto en tokens. - Intercepta pasarelas de pago reales en código con aprobación humana.
- Configura
max_failures=3junto a topes diarios USD enbf16.ai/dashboard/keys.