アリババがPage Agentをオープンソース化——Webページに直接埋め込むエージェントが、スクリーンショットではなくテキストを読んで画面を操作する
MITライセンスでオープンソース化、モデル非依存。任意のOpenAI互換テキストモデルを接続すれば使える。現時点では単一ページビューの操作のみ対応
- アリババのチームがPage Agentをオープンソース化した。純粋なJavaScriptとしてWebページの内部で動作するエージェントライブラリで、ページのテキスト化された構造(DOM)を直接読み取って画面を理解・操作し、スクリーンショットには依存しない
- 核となる技術はDOM dehydration(DOM脱水)——ページ全体の数千のノードを、操作可能な要素だけを残した簡潔なテキストマップ FlatDomTree に圧縮する。これにより普通のテキストモデルでも要素を正確に特定できる
- MITライセンスでオープンソース化されモデル非依存。任意のOpenAI互換エンドポイント経由で接続でき、テキストのみをやり取りしマルチモーダルモデルを必要としない。コードは browser-use のDOM処理とプロンプトロジックを継承している
- Webページの内部で動くため、ユーザーの現在のログイン状態・Cookie・権限を自動的に引き継ぐ。専用のバックエンドを書く必要もヘッドレスブラウザも不要
- 限界もはっきりしている——安全ルールはハードな制約ではなくプロンプトに書かれているだけ。コアライブラリは単一ページの操作しかできず、タブをまたぐには別途Chrome拡張機能をインストールする必要がある
アリババが常識外れのブラウザエージェントをオープンソース化した
アリババのチームは最近、Page Agentをオープンソース化した。純粋なJavaScriptとしてWebページの内部で動作し、テキスト化されたDOMを読み取ることで画面を理解・操作するエージェントライブラリだ。
それは本物のユーザーのようにWebページの中に住み込み、ページのテキスト構造を読んでボタンを押しフォームを埋める。その間ヘッドレスブラウザは一切起動せず、スクリーンショットも撮らず、画像を見られるマルチモーダルモデルも必要としない。
従来のやり方は何にコストを払っていたか
Page Agentが何を省いたのかを理解するには、まず外部型ツールが1枚のWebページを操作するためにどれだけのものを背負っていたかを見る必要がある。それらはページの中に入らず、ガラス越しに外から指示するしかない。
この外部駆動型の発想は、クロスサイトでのデータ収集やエンドツーエンドテストの実行では今も有効だ。Page Agentが解決しようとしているのは別の悩みだ——そのWebページがもともと自分のプロダクトで、コードを自由に変更できるなら、なぜここまで大回りする必要があるのか、という点である。
1枚のWebページ全体をテキストのリストに圧縮する
現代のWebページは数千のノードを持ちうる。HTMLをそのままモデルに渡すのは遅くて高くつく。Page Agentのやり方は、まずページを一度「脱水」して、本当に操作できるものだけを残すことだ。
指示を受け取ると、エージェントはDOM全体(DOM = Document Object Model、ブラウザがWebページを解析して作る要素ツリー)をスキャンし、操作可能な要素——ボタン、リンク、入力欄——を一つ残らず見つけ出し、それぞれに連番(index)とロール(role)、テキストラベル(label)を付与する。冗長な装飾用マークアップはすべて取り除かれ、ページ全体は FlatDomTree と呼ばれる簡潔なテキストマップに圧縮される。モデルが読むのはこのリストであって、ピクセルではない。
分厚い本の本文を全部取り除いて、目次の章タイトルとページ番号だけを残すようなものだ。モデルは本を丸ごと読む必要はなく、この目次にざっと目を通すだけで、どのページを開き、どのボタンを押せばいいかがわかる。
脱水前後で、モデルが見るものはどれだけ違うか
原文のデモページはこの一連の流れをそのまま見せている——「Dehydrated DOM」パネルにモデルが読み取ったリストが表示され、隣の「Action trace」パネルは指示の実行に合わせて1行ずつ更新される。実際にステップごとにクリックしていく様子が見える。
指示が届いてから、内部ではどう動くのか
自然言語の指示から、ページ上で本当にクリックされるまで、間には決まった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 | Webページ内部(クライアント側JS) | 脱水後のテキストDOM | script タグ1つ、または npm | 自社プロダクト内の操作型コパイロット |
| Selenium / Playwright / Puppeteer | 外部プロセス | ドライバー経由でDOMを読む(WebDriver/CDP) | ドライバー+ランタイムまたはサービス | スクリプト化されたエンドツーエンドテスト |
| browser-use | 外部プロセス | DOM+任意の視覚情報 | Python+ブラウザ | 自律的なマルチサイトエージェント |
| WebMCP | サーバー側ツール | 構造化された関数呼び出し | 標準が広く採用される必要あり | エージェントネイティブなツール呼び出し |
これは別の道を選んでいる——Webページが自身の機能を構造化された「ツール」関数としてラップし、エージェントに直接呼び出させる。頼るのは標準化されたインターフェースだ。Page AgentはDOMのテキストを読むことに頼り、WebMCPは標準プロトコルに頼る。一方はページを改修しなくても導入でき、もう一方はインターフェース標準が広く受け入れられるのを待つ必要がある。
結論は適用範囲に落ち着く。Page Agentはコードを変更でき自分で決められるプロダクト内部に向いている。他人のサイトをクロールしたり、ロックされた環境で作業したりする場合は、依然として外部駆動型が優位だ。
何に使えるか
アプリケーションの中に住み込んでいるからこそ、ユーザーの代わりに本当に操作を完了させられる——ただ横でどう押せばいいか説明するだけではない。原文では具体例が4つ挙げられている。
最小コストはscriptタグ1行
まず感触をつかみたいなら、script タグ1つで無料のテスト用モデル付き Page Agent を読み込み、ページ上で直接体験できる。
<script src="https://cdn.jsdelivr.net/npm/page-agent@1.10.0/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とキーを変えるだけだ。
new PageAgent に直接書き込んだapiKeyはフロントエンドのコードにそのままパッケージされてしまう。本番環境では自分のバックエンドで代理してリクエストを転送する必要があり、キーをクライアント側に露出させてはいけない。エージェントは重要なアクションを実行する前に確認を求めるポップアップにも対応している。できないことがはっきりしている
この「Webページの中に住み込む」というやり方には当然払うべき代償があり、公式もその限界をはっきり述べている。使う前に、この数点はテーブルの上に出しておくべきだ。
プロンプトに書かれた安全ルールは、あくまで提案にすぎない
「支払いフォームを自動送信しない」といったルールは、システムプロンプトの中に置かれている。それらは説得力のある誘導であって、ハードな保証ではない。機密操作や破壊的な操作に対しては、サーバー側の検証を必ず残しておく必要があり、プロンプト内の指示だけを唯一の防衛線にしてはならない。
コアライブラリが管理できるのは単一ページだけ
コアライブラリが狙っているのは単一ビュー内でのインタラクションであり、それ自体はタブやウィンドウをまたいで動くことはできない。ページをまたいだ自動化をしたければ、任意の Chrome 拡張機能をインストールする必要があり、その拡張機能は個別にインストールと権限の許可が必要になる。ほかにも Beta 段階の MCP server があり、Claude Desktop や Copilot のような外部エージェントが逆に Page Agent を操作できるようにしている。
展開:3つの動作場所がそれぞれ何を解決するか
コアライブラリはページの中で動き、単一ページの操作を管理する。Chrome 拡張機能はタブをまたぐ能力を補うが、その代償としてインストールと権限が必要になる。Beta の MCP server は Page Agent を、外部エージェントから呼び出せるツールへと変え、Claude Desktop や Copilot のような外部エージェントと接続する。3つの層はそれぞれ管理する範囲が異なり、外側に行くほど、導入と権限付与のコストは高くなる。
冒頭の一文に戻ると、Page Agent と主流ツールが歩んでいるのは2つの道だ——一方はWebページの内部に埋め込まれてテキストを読み、もう一方は外側に立ってスクリーンショットとプロトコルでリモート操作する。ブラウザ自動化が地に足をつけられる場所を、「外部スクリプトで他人のWebページを操作する」から、「プロダクトが自ら備える自然言語の操作入口」まで押し広げた形だ。
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
AIにWebページを操作させる:「外から画面を見てリモート操作」から「ページの中に住み込みテキストを読んで自分でクリック」へ
アリババがPage Agentをオープンソース化し、画面を操作するエージェントをWebページに埋め込む1本のコードとして作った。この1枚で、それがどう動くか、何を省いているか、どこがまだ鵜呑みにできないかを図付きで説明する。
↓ 1枚で読み切る · 動くアニメーション付き対比図あり
まずこれが何をするものかを説明する。ブラウザ自動化とは、プログラムに人の代わりにWebページを操作させること——ボタンを自動でクリックし、フォームを埋め、テストを走らせる。この種のツールは以前からあったが、問題は動き方の「姿勢」にあった。
✘ しかしそれらは自社プロダクトに軽々と組み込んで、内蔵の操作アシスタントにすることはできない
なぜならそれらは全てブラウザの外側に住んでおり、別途1本のプログラムを立ち上げ、スクリーンショットやデバッグプロトコルを介して離れた場所からページを遠隔操作するからだ。ドライバーのインストールも必要で、しばしば要素の位置を推測させるための「画像を見られる」マルチモーダルモデルまで必要になり、重くて高くつく。
今回アリババは、エージェントをWebページに直接埋め込む一段のJavaScriptコードとして作った。それは本物のユーザーのようにWebページの中に住み込み、ページのテキスト構造を読んでクリックし、入力する。自社プロダクトに組み込んで操作アシスタントにしやすくするためだ。最も直接的に変わったのは、モデルが一回クリックするたびに見るものだ。
テキストを読む方が画像を見るより正確で、しかも省コストだ。画像を見られる高価なモデルを別途用意する必要もない。では、この連番付きのテキストリストは、雑然とした1枚のWebページ全体からどうやって絞り出されるのか。
お家芸は DOM脱水 と呼ばれる(DOMとはブラウザがWebページを分解して作る要素ツリーのこと。脱水とは、ページ全体の数千の部品の中から本当にクリックできるものだけを選び出し、それぞれに連番を振って、簡潔なテキストリストに圧縮することだ)。同じ場面を従来のやり方と並べて見るのが一番わかりやすい。
普通の人が「どれだけ省けたか」を一番実感しやすいのは、手を動かして準備するものの量だ。「プロダクトにユーザーの代わりに画面を操作できるAIアシスタントを加える」という作業で比べてみる。
これらはプロジェクトが公開している事実——ライセンス、バージョン、導入方法であり、性能テストではない。「テキストのみをやり取りするので推論コストがより低い」というのは設計上の推論であり、公式は第三者によるベンチマークを示していない。本番運用ではモデルを自前のものに置き換え、キーはバックエンド側に置く必要があり、demo用のキーをフロントエンドに埋め込んではいけない。
ボタンを押しフォームを埋められるようにしたい
軽く組み込めるものが一つもない…
Selenium?
接続するだけで、
- × 独立したプロセスを別途起動
- × ドライバー/プロトコル層を導入
- × しばしば画像を見られる高価なモデル
- × さらにバックエンドの代理を書く
必要
Webページに埋め込む一段のコードにした
高価なモデルも要らない?
自分でクリックし、入力する
モデルは読み切れるの?
それぞれに連番を振る
<button class>…
数千の雑多なノード
[3] button「ログイン」
[4] button「経費申請を送信」
自分のプロダクトに組み込めた
コアライブラリが管理できるのは単一ページだけで、タブをまたぐには別途拡張機能が要る。
お金や機密操作が絡む場面では、バックエンドの検証は一歩も省けない。
