プロダクトリリース · 小互解読

アリババがPage Agentをオープンソース化——Webページに直接埋め込むエージェントが、スクリーンショットではなくテキストを読んで画面を操作する

MITライセンスでオープンソース化、モデル非依存。任意のOpenAI互換テキストモデルを接続すれば使える。現時点では単一ページビューの操作のみ対応

1分でわかる要約
  • アリババのチームがPage Agentをオープンソース化した。純粋なJavaScriptとしてWebページの内部で動作するエージェントライブラリで、ページのテキスト化された構造(DOM)を直接読み取って画面を理解・操作し、スクリーンショットには依存しない
  • 核となる技術はDOM dehydration(DOM脱水)——ページ全体の数千のノードを、操作可能な要素だけを残した簡潔なテキストマップ FlatDomTree に圧縮する。これにより普通のテキストモデルでも要素を正確に特定できる
  • MITライセンスでオープンソース化されモデル非依存。任意のOpenAI互換エンドポイント経由で接続でき、テキストのみをやり取りしマルチモーダルモデルを必要としない。コードは browser-use のDOM処理とプロンプトロジックを継承している
  • Webページの内部で動くため、ユーザーの現在のログイン状態・Cookie・権限を自動的に引き継ぐ。専用のバックエンドを書く必要もヘッドレスブラウザも不要
  • 限界もはっきりしている——安全ルールはハードな制約ではなくプロンプトに書かれているだけ。コアライブラリは単一ページの操作しかできず、タブをまたぐには別途Chrome拡張機能をインストールする必要がある
1誰が、何をしたか

アリババが常識外れのブラウザエージェントをオープンソース化した

アリババのチームは最近、Page Agentをオープンソース化した。純粋なJavaScriptとしてWebページの内部で動作し、テキスト化されたDOMを読み取ることで画面を理解・操作するエージェントライブラリだ。

それは本物のユーザーのようにWebページの中に住み込み、ページのテキスト構造を読んでボタンを押しフォームを埋める。その間ヘッドレスブラウザは一切起動せず、スクリーンショットも撮らず、画像を見られるマルチモーダルモデルも必要としない。

現在主流のブラウザ自動化ツール——Playwright、Selenium、Puppeteer、browser-use——はすべてブラウザの外側に別プロセスを立ち上げ、スクリーンショットデバッグプロトコルを介してリモートでページを操作している。Page Agentが選んだのはその逆の道だ。エージェントのロジック自体がWebページに埋め込まれた一段のJavaScriptなので、ユーザーの現在のログイン状態・Cookie・権限を自然に引き継ぐ。導入もscript タグ1つか npm インストール1回だけで済む。
送信 ▍送信をクリック… 内部:一段のJSが直接ページ要素をクリック 外部:別プロセスを起動 スクリーンショット/プロトコルで遠隔操作
同じWebページでも、操作経路は2通り——エージェントが中に住み込むか、機械の腕が外から伸びてくるか
2対比の前振り

従来のやり方は何にコストを払っていたか

Page Agentが何を省いたのかを理解するには、まず外部型ツールが1枚のWebページを操作するためにどれだけのものを背負っていたかを見る必要がある。それらはページの中に入らず、ガラス越しに外から指示するしかない。

01
独立したプロセス
Playwright や Selenium はいずれもブラウザの外側に別途ランタイムやサービスを走らせる必要があり、あなたのアプリケーションとは別物のプログラムになる
02
ドライバーまたはデバッグプロトコルの層
WebDriver や CDP(Chrome DevTools Protocol、ブラウザ公式のリモートデバッグプロトコル)に頼って、ページの中に入らずに離れた場所から読み取り・操作する
03
しばしばマルチモーダルモデルまで必要
多くの方式はページをスクリーンショットし、画像を見られるモデルに要素の位置を推測させる。推論コストがさらに高くなる

この外部駆動型の発想は、クロスサイトでのデータ収集やエンドツーエンドテストの実行では今も有効だ。Page Agentが解決しようとしているのは別の悩みだ——そのWebページがもともと自分のプロダクトで、コードを自由に変更できるなら、なぜここまで大回りする必要があるのか、という点である。

3コア技術

1枚のWebページ全体をテキストのリストに圧縮する

現代のWebページは数千のノードを持ちうる。HTMLをそのままモデルに渡すのは遅くて高くつく。Page Agentのやり方は、まずページを一度「脱水」して、本当に操作できるものだけを残すことだ。

DOM dehydration · DOM脱水

指示を受け取ると、エージェントはDOM全体(DOM = Document Object Model、ブラウザがWebページを解析して作る要素ツリー)をスキャンし、操作可能な要素——ボタン、リンク、入力欄——を一つ残らず見つけ出し、それぞれに連番(index)とロール(role)、テキストラベル(label)を付与する。冗長な装飾用マークアップはすべて取り除かれ、ページ全体は FlatDomTree と呼ばれる簡潔なテキストマップに圧縮される。モデルが読むのはこのリストであって、ピクセルではない。

たとえるなら

分厚い本の本文を全部取り除いて、目次の章タイトルとページ番号だけを残すようなものだ。モデルは本を丸ごと読む必要はなく、この目次にざっと目を通すだけで、どのページを開き、どのボタンを押せばいいかがわかる。

脱水前後で、モデルが見るものはどれだけ違うか

脱水前 · 生のDOM
<div class="hdr"> <nav><ul><li><a href…> <span><svg>…</svg></span> <div class="wrap"><div>… <button class="btn primary"…> <input type="text" name…> …数千の雑多なノード
脱水後 · FlatDomTree
[0] link   「ホーム」 [1] input  メールアドレス [2] input  パスワード [3] button 「ログイン」 [4] button 「経費申請を送信」

原文のデモページはこの一連の流れをそのまま見せている——「Dehydrated DOM」パネルにモデルが読み取ったリストが表示され、隣の「Action trace」パネルは指示の実行に合わせて1行ずつ更新される。実際にステップごとにクリックしていく様子が見える。

Dehydrated DOM
[0] link 「ホーム」
[1] input メールアドレス
[2] input パスワード
[3] button 「ログイン」
[4] button 「経費申請を送信」
Action trace
updateTree · リストを生成
inputText [1] · メールアドレスを入力
inputText [2] · パスワードを入力
clickElement [3] · ログインをクリック
4内部構造

指示が届いてから、内部ではどう動くのか

自然言語の指示から、ページ上で本当にクリックされるまで、間には決まった1本のループがある。汚れ仕事は PageController という部品が引き受ける。

自然言語の指示execute()
DOMをスキャンupdateTree
FlatDomTreeを生成テキストリスト
モデルが判断どのindexを選ぶか
アクションを実行click / input / scroll

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つのガードレール

操作ホワイトリスト
エージェントが実行できるアクションを限定し、それ以外には一切触れさせない
データマスキング
パスワードのような機密フィールドを隠し、モデルには送らない
カスタム知識
自分のビジネスルールを注入し、自分のドメインの約束事に沿って動かす
5横並び比較

他のツールと比べて、誰が使うべきか

この比較表が言いたいのは場面の違いであって、速さの違いではない。4つの方式はそれぞれ異なる場所で動き、異なる方法でページを読み、それぞれの得意分野がある。

方式どこで動くかページの読み方導入コスト最も向いている用途
Page AgentWebページ内部(クライアント側JS)脱水後のテキストDOMscript タグ1つ、または npm自社プロダクト内の操作型コパイロット
Selenium / Playwright / Puppeteer外部プロセスドライバー経由でDOMを読む(WebDriver/CDP)ドライバー+ランタイムまたはサービススクリプト化されたエンドツーエンドテスト
browser-use外部プロセスDOM+任意の視覚情報Python+ブラウザ自律的なマルチサイトエージェント
WebMCPサーバー側ツール構造化された関数呼び出し標準が広く採用される必要ありエージェントネイティブなツール呼び出し
WebMCPとは何か

これは別の道を選んでいる——Webページが自身の機能を構造化された「ツール」関数としてラップし、エージェントに直接呼び出させる。頼るのは標準化されたインターフェースだ。Page AgentはDOMのテキストを読むことに頼り、WebMCPは標準プロトコルに頼る。一方はページを改修しなくても導入でき、もう一方はインターフェース標準が広く受け入れられるのを待つ必要がある。

結論は適用範囲に落ち着く。Page Agentはコードを変更でき自分で決められるプロダクト内部に向いている。他人のサイトをクロールしたり、ロックされた環境で作業したりする場合は、依然として外部駆動型が優位だ。

6実際の応用場面

何に使えるか

アプリケーションの中に住み込んでいるからこそ、ユーザーの代わりに本当に操作を完了させられる——ただ横でどう押せばいいか説明するだけではない。原文では具体例が4つ挙げられている。

🤖
プロダクト組み込みの操作型コパイロット
SaaSプロダクトにユーザーの代わりに操作できるアシスタントを搭載する。カスタマーサポートボットが手順の説明ではなく、実際に手順を代行してくれる。
📝
ひと言で多段階フォームを埋める
ERP や CRM の長い多段階フォームをひと言に圧縮する。ユーザーが昨日のランチ代50ドルの出張経費を申請してと入力するだけで、ページ遷移と入力は自分でやってくれる。
🎙️
音声とアクセシビリティ
Web Speech API と組み合わせて音声操作にすれば、どんなWebページも自然言語でたどり着ける。スクリーンリーダーに親切な案内を読み上げさせることもできる。
🧰
レガシーシステムに自然言語の入口を追加
APIを持たない古い社内ツールにコマンドバーを1本かぶせるだけで、元のコードには手を加えない。
7始め方

最小コストはscriptタグ1行

まず感触をつかみたいなら、script タグ1つで無料のテスト用モデル付き Page Agent を読み込み、ページ上で直接体験できる。

評価用 · 1行で導入(無料テストAI付き)
<script src="https://cdn.jsdelivr.net/npm/page-agent@1.10.0/dist/iife/page-agent.demo.js" crossorigin="true"></script>
MIT
オープンソースライセンス、コードベースはTypeScript優先
1.10.0
jsDelivr CDN上で直接体験できるデモ版のバージョン番号

本番利用ではパッケージをインストールし、エンドポイントを自分のものに差し替える。

本番用 · npmでインストールし自分のエンドポイントを設定
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とキーを変えるだけだ。

⚠️
そのdemoエンドポイントは技術評価専用だ。しかも new PageAgent に直接書き込んだapiKeyはフロントエンドのコードにそのままパッケージされてしまう。本番環境では自分のバックエンドで代理してリクエストを転送する必要があり、キーをクライアント側に露出させてはいけない。エージェントは重要なアクションを実行する前に確認を求めるポップアップにも対応している。
8実際の限界

できないことがはっきりしている

この「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
本記事は MarkTechPost の報道をもとに整理・解説したものです。事実およびコード例は原文に基づきます。プロジェクトのオープンソース公開先: github.com/alibaba/page-agent(MITライセンス、TypeScript)。小互 · AI解読站 編集。