アリババがPage Agentをオープンソース化——スクリーンショットではなくテキストでUIを直接読み書きするエージェントをウェブページに直接埋め込む
MITライセンスで公開、モデル非依存、OpenAI互換のテキストモデルなら何でも接続可能。ただし現状は単一ページビューの操作にとどまる
- アリババのチームがPage Agentをオープンソース化した。純粋なJavaScriptとしてウェブページ内部で動くエージェントライブラリで、ページのテキスト構造(DOM)を直接読み取ってUIを理解・操作する。スクリーンショットには頼らない
- 核心技術はDOM dehydration(DOM脱水)——ページ全体の数千のノードを、操作可能な要素だけを残した簡潔なテキストマップ「FlatDomTree」に圧縮する。これにより通常のテキストモデルでも要素を正確に特定できる
- MITライセンスでオープンソース化、モデル非依存。任意のOpenAI互換エンドポイント経由で接続でき、テキストのみをやり取りするためマルチモーダルモデルは不要。コードはDOM処理とprompt周りのロジックをbrowser-useから継承している
- ウェブページの内部で動くため、ユーザーが今ログインしている状態やcookie、権限を自動的に引き継ぐ。専用バックエンドを書く必要も、ヘッドレスブラウザも不要
- 限界もはっきりしている——安全ルールは強制制約ではなくprompt内に書かれているだけで、コアライブラリが操作できるのは単一ページのみ。タブをまたぐにはChrome拡張機能を別途入れる必要がある
アリババが定石破りのブラウザエージェントをオープンソース化した
アリババのチームが最近、Page Agentをオープンソース化した。純粋なJavaScriptとしてウェブページ内部で動作し、テキスト化されたDOMを読み取ってUIを理解・操作するエージェントライブラリだ。
まるで本物のユーザーのようにウェブページの中に住み込み、ページのテキスト構造を読んでボタンを押したりフォームに入力したりする。全過程でヘッドレスブラウザの起動もスクリーンショットも不要、画像を理解できるマルチモーダルモデルすら要らない。
従来のやり方はどこにコストがかかるのか
Page Agentが何を省いたのかを理解するには、まず外部ツールがウェブページを操作するために背負っているものを見る必要がある。それらはページの内部に入らず、ガラス越しに外から指示を出すことしかできない。
この外部駆動の発想は、クロスサイトでのデータ取得やエンドツーエンドテストの実行では依然として有効だ。Page Agentが解決しようとしているのは別の面倒だ——そのウェブページがそもそも自分のプロダクトで、コードを自由に書き換えられるなら、なぜそんなに遠回りをする必要があるのか、という点だ。
ウェブページ全体をテキストの一覧に圧縮する
現代的なウェブページは1000を超えるノードを持つこともあり、HTMLをそのままモデルに渡すのは遅くコストもかかる。Page Agentのやり方は、まずページを一度「脱水」し、本当に操作可能なものだけを残すことだ。
指示を受けると、エージェントはDOM(Document Object Model、ブラウザがウェブページを解析して作るあの要素ツリー)全体をスキャンし、操作可能な要素——ボタン、リンク、入力欄——を一つずつ見つけ出し、それぞれに番号(index)、role、テキストラベル(label)を付ける。装飾用の冗長なマークアップはすべて剥ぎ取られ、ページ全体は「FlatDomTree」と呼ばれる簡潔なテキストマップに圧縮される。モデルが読むのはこの一覧であって、ピクセルではない。
分厚い本の本文を全部取り除いて、目次の章タイトルとページ番号だけを残すようなものだ。モデルは本を丸ごと読み込む必要はなく、この目次に一目通すだけで、どのページを開くべきか、どのボタンを押すべきかがわかる。
脱水の前後で、モデルが見るものはどれだけ違うか
原文のデモページはこのループをそのまま見せてくれる。「Dehydrated DOM」パネルにモデルが読み取った一覧が表示され、隣の「Action trace」パネルには指示の実行につれて一手ずつ更新が入る。1ステップずつクリックしていく様子をその場で見られる。
指示が入ってから、内部でどう動くのか
自然言語の一文から、実際にページ上で何かがクリックされるまで、その間は決まった一つの閉ループになっている。実際の処理はPageControllerという部品が引き受ける。
PageControllerが公開しているのはまさにこれらの具体的なアクションで、番号を指定して要素を操作する。
await this.pageController.updateTree()
await this.pageController.clickElement(index)
await this.pageController.inputText(index, text)
await this.pageController.scroll({ down: true, numPages: 1 })
monorepo全体は責務を3つの小さなパッケージに分けている。
@page-agent/coreUIを持たないエージェントのコアロジックpage-agentUIパネル付きの完全なエントリークラス@page-agent/page-controllerDOM抽出と要素の番号付けを担当。任意でSimulatorMaskによる視覚的フィードバックも可能開発者が手にする3つのガードレール
他のツールと比べて、誰がこれを使うべきか
この比較表が言いたいのはシナリオの話であって、速さの話ではない。4つの方式はそれぞれ違う場所で動き、違う方法でページを読み取る。それぞれ得意な陣地がある。
| 方式 | どこで動くか | ページの読み取り方 | 導入コスト | 最適な用途 |
|---|---|---|---|---|
| Page Agent | ウェブページ内部(クライアントJS) | 脱水後のテキストDOM | scriptタグ一本またはnpm | 自社プロダクト内の操作型copilot |
| Selenium / Playwright / Puppeteer | 外部プロセス | ドライバ経由でDOMを読む(WebDriver/CDP) | ドライバ+ランタイムまたはサービス | スクリプト化されたエンドツーエンドテスト |
| browser-use | 外部プロセス | DOM+任意で視覚情報 | Python+ブラウザ | 自律的なマルチサイトエージェント |
| WebMCP | サーバーサイドツール | 構造化された関数呼び出し | 標準が広く採用される必要あり | エージェントネイティブなツール呼び出し |
これは別の道を行く方式だ。ウェブページ自身の機能を構造化された「ツール」関数としてラップし、標準化されたインターフェースでエージェントに直接呼び出させる。Page AgentはDOMのテキストを読むのに対し、WebMCPは標準プロトコルに頼る。片方はページを改修しなくても導入でき、もう片方はインターフェース標準が広く受け入れられるのを待つ必要がある。
結論は適用範囲にある。Page Agentはコードを自由に書き換えられる、自分がコントロールできるプロダクト内部に向いている。他人のサイトをクロールしたり、ロックダウンされた環境で作業したりする場合は、依然として外部駆動方式に軍配が上がる。
何ができるのか
アプリケーションの内部に住み込んでいるからこそ、ユーザーの代わりに実際に操作を完了できる——横でどう操作すればいいか説明するだけではない。原文では4つの具体例が挙げられている。
最小コストはscriptタグ1行
まず試してみたいなら、scriptタグ1本で無料テストモデル付きのPage Agentを読み込め、ページ上ですぐ体験できる。
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/iife/page-agent.demo.js" crossorigin="true"></script>
本番利用ではパッケージを導入し、エンドポイントを自分のものに差し替える。
import { PageAgent } from 'page-agent'
const agent = new PageAgent({
model: 'qwen3.5-plus',
baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
apiKey: 'YOUR_API_KEY',
language: 'en-US',
})
await agent.execute('Click the login button')
modelとbaseURLは任意のOpenAI互換プロバイダーを受け付ける。モデルを切り替えるのは基本的にbase-URLとkeyを差し替えるだけだ。
new PageAgentに直接書き込んだapiKeyはフロントエンドコードにそのままバンドルされてしまう。本番環境では自分のバックエンドを経由したプロキシでリクエストを転送する必要があり、鍵をクライアント側に剥き出しにしてはいけない。エージェントは重要なアクションを実行する前に確認ダイアログを出す機能にも対応している。できないこと
この「ウェブページの中に住み込む」というやり方には、それなりの代償がある。公式もその限界をはっきり示している。使う前に、これらの点をテーブルの上に並べておく必要がある。
promptに書かれた安全ルールは、あくまで提案にすぎない
「決済フォームを自動送信しない」といったルールは、システムprompt内に置かれているだけだ。これらは説得力のあるガイドではあっても、確実な保証ではない。機微な操作や破壊的な操作については、サーバーサイドの検証は必ず残さなければならず、prompt内の指示だけを唯一の防御線にしてはいけない。
コアライブラリが管理するのは単一ページのみ
コアライブラリが狙っているのは単一ビュー内でのインタラクションであり、それ自体はタブやウィンドウをまたいで移動できない。ページをまたいだ自動化を行うには、任意のChrome拡張機能を別途入れる必要があり、この拡張機能にはインストールと権限付与が別途必要になる。さらにベータ段階のMCPサーバーもあり、Claude DesktopやCopilotといった外部エージェントが逆にPage Agentを駆動できるようになっている。
展開:3つの動作場所がそれぞれ何を解決するか
コアライブラリはページ内で動き、単一ページの操作を担う。Chrome拡張機能はタブをまたぐ能力を補うが、インストールと権限が必要になるという代償がある。ベータのMCPサーバーは、Page AgentをClaude DesktopやCopitolといった外部エージェントから呼び出せるツールに変え、外部エージェントに接続し直す。3つの層はそれぞれ異なる範囲を担い、外側に行くほど設定と権限付与のコストが高くなる。
冒頭の話に戻ると、Page Agentと主流ツールは2つの異なる道を歩んでいる。一方はウェブページの内部に入り込んでテキストを読む道、もう一方は外に立ってスクリーンショットとプロトコルで遠隔操作する道だ。これはブラウザ自動化が実際に着地できる場所を、「外部スクリプトで他人のウェブページを操作する」から「プロダクト自身が備える自然言語操作の入り口」へと広げたと言える。
The agent lives inside the webpage as plain JavaScript. It reads the live DOM as text and acts as the real user. No headless browser, no screenshots, no multi-modal model. 、MarkTechPost、2026-07-02