Skip to main content
All posts
ブラウザ自動化

Browser-Use と OpenClaw の途中停止をなくす:bf16.ai の高速 DOM + Vision 低拒否エージェント設計

一般的な LLM がステージング環境のパスワード欄や利用規約チェックボックスをフィッシングと誤認する理由と、Browser-Use や OpenClaw を bf16.ai のテキスト + Vision 対応 Abliterated モデルと組み合わせる方法を解説します。

TL;DR · ブラウザ自動化エンジニアリング要点

  • 途中停止の真因:一般チャット向け LLM は QA 環境の <input type="password"> や利用規約(ToS)チェックボックスをフィッシングや代理契約と誤認し、JSON ではなく拒否文を返してしまいます。
  • DOM + Vision デュアル構成:高速 DOM ループには deepseek/deepseek-v4.1-flash-abliterated($0.30 / $0.05 / $1.20)、視覚モーダル判定には zai-org/glm-5.3-flash-abliterated(Vision + Text、$0.24 / $0.06 / $1.00)を採用します。
  • 25 ステップのステージングスイート向け:1 ステップで最大 4 アクションをまとめれば(max_actions_per_step=4)モデルとの往復回数を減らせます。bf16.ai の Abliterated プランナーなら、実行途中で拒否文を返して CI ランナーを止めることもありません。

1. なぜ <input type="password"> と利用規約チェックボックスで CI が落ちるのか

Browser-Use や OpenClaw は DOM ツリーを動的に解釈して UI 変更に強い E2E 自動化を実現します。しかしステージング環境でのサインアップ試験や同意チェックボックス操作では、汎用安全フィルタが誤作動して構造化 AgentOutput JSON の出力を中断し、テストランナーをクラッシュさせます:

[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. bf16.ai における高速テキスト DOM + マルチモーダル Vision のハイブリッド構成

bf16.ai の 1M コンテキスト Abliterated モデル 2 種を組み合わせることで、速度と視覚認識を両立できます:

  1. deepseek/deepseek-v4.1-flash-abliterated:1 ステップ 1 秒未満の応答が重要なテキスト / DOM アクセシビリティツリーのループに最適。
  2. zai-org/glm-5.3-flash-abliterated(Vision + Text):スクリーンショットと DOM インデックスを同時解析し、Z.ai 公式 FlashX($0.37/$1.25)を下回る $0.24/$1.00 で稼働します。

3. Browser-Use 実装コードと Playwright ネットワーク分離

use_vision=True と max_actions_per_step=4 を有効化し、入力・同意チェック・送信を 1 ターンでバッチ実行します:

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

外部ドメインへの誤遷移はプロンプトではなく Playwright の context.route() で決定論的に遮断します。CI 組み込み前には bf16.ai/playground で JSON 出力を即座に検証できます:

// 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();
});

bf16.ai プレイグラウンド(/playground):Browser-Use 用 JSON プリセットをゼロ保持(ZDR)でライブ検証。

▲ bf16.ai プレイグラウンド(/playground):Browser-Use 用 JSON プリセットをゼロ保持(ZDR)でライブ検証。

4. 25 ステップ E2E のレイテンシとトークンコスト内訳

ブラウザ自動化では、モデル呼び出し 1 回あたり 500 ms の遅延でも、25 の逐次ステップ分だけ積み重なります。max_actions_per_step=4 と bf16.ai のストリーミング応答を組み合わせれば、25 ステップのサインアップ + ワークスペース設定 E2E で必要な逐次モデル呼び出しの回数を減らせます。1 実行あたりの所要時間とコストは、お手元のスイートで計測してください。各構成が典型的にどこでつまずくかは次のとおりです:

ブラウザ構成主な失敗要因
汎用チャット API (DOM のみ)パスワード・ToS チェックの拒否
未検証ローカル Q4 モデルAgentOutput JSON スキーマ破損
deepseek-v4.1-flash-abliteratedARIA 非対応の Canvas モーダルのみ
glm-5.3-flash-abliterated (Vision)DOM と視覚オーバーレイ双方を完走

5. 本番 CI で守るべき 4 つの設計ルール

  1. 本番管理者認証情報を渡さず、Playwright context.route() で対象ホストをホワイトリスト化する。
  2. max_actions_per_step = 4 で複数フォーム入力を 1 ターンにまとめる。
  3. 実決済エンドポイントは必ず人間承認ゲートでインターセプトする。
  4. max_failures=3 とキー単位の日次 USD 上限を設定し、502 障害時の無駄なリトライを防ぐ。