**未公開。**Glac のブラウザはまだ利用できません。これらのページは、構築中の仕組みを公開前に説明したもので、公開までに変わることがあります。
Glac のブラウザは、タスクごとに専用のマシンで専用の Chromium を動かし、それをコードが Chrome DevTools Protocol(CDP)で外から操作します。Playwright、Puppeteer など、どの CDP クライアントでも使えます。ブラウザ 1 つが 1 つのセッションです。API 呼び出しで作成するとアドレスが返り、クライアントはそこに接続します。このアドレスが認証情報になります。
セッションは、クライアントが接続している間は、ページが何をしていても稼働中です。最後のクライアントが離れると数秒後に、タブ、ページ、その Cookie を保持したままスリープします。次の接続で、元の状態のまま復帰します。
ブラウザを使う場面
- Web を閲覧するエージェント:自前の CDP クライアントや、アドレスで指定したブラウザを操作する MCP サーバーを介して、Web ページを読んで操作するモデル。
- 本物のブラウザが必要なページ:スクレイピング、テスト、フォーム入力。ジョブごと、ユーザーごとに、名前で作成して名前で見つけ直せるセッション。
- 状態を保つブラウザ:ターンの合間にスリープするセッションはページとログイン状態を保持し、元の状態で復帰します。プロファイルを使えば、ログイン状態を新しいセッションに引き継げます。
- 作業中のエージェントを見る:セッションのページを任意のブラウザでライブ表示。見るだけの人向けのアドレスも用意。
仕組み
- 作成。
POST /v1/browsersで稼働中のセッションを作成すると、その CDP アドレスcdp_urlが返ります。セッションには名前を付けられます。プロジェクトにすでにあるセッションの名前で作成すると、そのセッションがスリープしたところから復帰して返されます。 - **接続。**クライアントは
cdp_urlに接続します。Playwright ならconnectOverCDP、Puppeteer ならbrowserURLを指定したconnectを使います。 - **スリープ。**最後の接続が閉じてから
sleep_after_seconds秒後(指定しなければ 10 秒)に、セッションはメモリとディスクを保持したままスリープします。接続があれば復帰します。 - 終了。
DELETE /v1/browsers/{id}で、ページごとセッションを終了します。
セッションの種類は次の 3 つです。
chromium-headless(デフォルト):Chromium のヘッドレスシェル。画面のないブラウザ。chromium:フル機能の Chromium。人が見られる 1280×800 の画面付き。lightpanda:Lightpanda。プログラムのために作られたブラウザで、ページのスクリプトを実行して DOM を保持しますが、レイアウトエンジンを持ちません。そのためスクリーンショットと PDF にはページのテキストしか含まれません。
セッションはどれも 1 vCPU、2 GiB のマシンです。その ID はサンドボックスの ID で、セッションとは、プラットフォームがそのために作ったサンドボックスです。そのため /v1/sandboxes/{id}/… の呼び出しはすべてセッションにも使え、中でコマンドを実行したり、ファイルを読んだりできます。通常のサンドボックスは、何を実行してもセッションにはなりません。
クライアントの接続
CDP クライアントに必要なのは cdp_url だけで、これは認証情報です。持っている人なら誰でもブラウザを操作できます。Playwright は chromium.connectOverCDP(cdp_url)(Python では connect_over_cdp)、Puppeteer は puppeteer.connect({ browserURL: cdp_url }) で接続します。このとき Playwright 側にブラウザは必要ありません。
CDP=$(glac browsers create --name agent-42) # prints the session's CDP address, and nothing else
npx @playwright/mcp --cdp-endpoint "$CDP" # an agent's browser tools, driving the sessionfrom glac import Glac
glac = Glac()
with glac.browsers.create(name="agent-42") as session: # deleted when the block ends
browser = session.connect() # Playwright, connected over CDP
page = browser.contexts[0].pages[0]
page.goto("https://example.com")POST /v1/browsers/{id}/rotate-url は、セッションに新しいアドレスを発行します。古いアドレスはそれ以降拒否され、そのアドレスで入った接続はすぐに切断されます(新しいアドレス)。
コマンドラインには glac browsers があり、Python と TypeScript の SDK には、すべての呼び出しを備えた glac.browsers があります。Go、Rust、Java の SDK ではセッションの作成、取得、終了ができ、MCP サーバーではセッションを開く、一覧表示する、閉じることができます(browser_open、browser_list、browser_close)。コマンドライン、Python SDK、MCP サーバーを参照してください。
料金
セッションは、ほかのすべてのインスタンスと同じく、使用したキューブのリソースで定価どおりに課金されます。対象は、処理している間の CPU 時間、稼働中のメモリ(128 MiB 刻み、ミリ秒単位)、送信トラフィックです。セッション独自の料金はありません。セッションは 1 vCPU、2 GiB で、サイトのブラウザのページにある料金計算ツールは、指定しない限り、稼働中の半分の時間 vCPU が使われているものとして計算します。
| 計測項目 | 料金 | 無料プラン(1 日あたり) | 有料プランの月間利用枠 |
|---|---|---|---|
| CPU(処理している間) | 100万 CPU ミリ秒あたり $0.01 | 100万 CPU ミリ秒 | 6000万 CPU ミリ秒 |
| メモリ(稼働中と、メモリ上で一時停止している間) | 1 GiB-時間あたり $0.008 | 6 GiB-時間 | 250 GiB-時間 |
| スリープ中のインスタンスが保持するデータ(メモリと固有のディスク) | 1 GB-月あたり $0.02 | 合計 15 GB(スナップショットとドライブを含む) | 20 GB-月(スナップショットとドライブを含む) |
| インターネットへの送信トラフィック(北米から) | 1 GB あたり $0.004 | 3 GB(リージョンを問わず) | 1 TB(リージョンを問わず) |
| インターネットへの送信トラフィック(ヨーロッパから) | 1 GB あたり $0.004 | ||
| インターネットへの送信トラフィック(アジア太平洋から) | 1 GB あたり $0.01 |
- スリープ中のセッションは、スリープ中のサンドボックスと同じように課金されます。マシンのメモリ上で一時停止している間は、そのメモリに稼働中と同じ料金がかかります。メモリが保存された後は、保持するもの(メモリと、ディスクのうちセッション固有の部分)に 1 GB-月あたり $0.02 がかかるだけです。
- 無料プランでは、CPU とメモリは、アカウントで動くほかのすべてのものと合わせて、無料プランのその日のクォータから差し引かれます。有料プランでは、その月の利用枠から、それを超えると残高から差し引かれます。料金とプランを参照してください。
Lightpanda
種類が lightpanda のセッションは、プログラムのために作られたブラウザ Lightpanda 1.0.2 を実行します。ページを取得し、スクリプトを実行して DOM を保持しますが、レイアウトエンジンはありません。何も見せる必要がない場面でページを読んで操作するのに使い、見せる必要があるなら chromium-headless を使ってください。作成、料金、制限はほかの種類と同じで、cdp_url と ws_url も同じように使えます。Lightpanda はオープンソース(AGPL-3.0)で、開発元がリリースしたままの形でセッション内で動きます。
接続したら、Lightpanda の開発元が示しているとおり、自分でコンテキストとページを作って使ってください。接続時にすでに開いているページは Lightpanda の起点で、そこからはナビゲーションできません。
const browser = await chromium.connectOverCDP(session.cdp_url); // Playwright
const context = await browser.newContext();
const page = await context.newPage();
await page.goto("https://example.com");
console.log(await page.textContent("h1"));Puppeteer では、puppeteer.connect({ browserURL: session.cdp_url })(または browserWSEndpoint: session.ws_url)で接続し、続けて (await browser.pages())[0] か browser.newPage() を使います。
プラットフォームのエッジ経由で、Playwright 1.64 と Puppeteer 24.43 を使って試した結果は次のとおりです。
| 動作するもの | 動作しないもの |
|---|---|
ページの読み込み、リンク、戻る・進む(goto、ページ遷移するクリック、waitForURL と waitForNavigation、goBack、reload)。ページの読み取り(content、textContent、innerText、evaluate、$$eval、ロケーター、waitForSelector) |
1 つの接続での 2 つ目のページ(1 つ開いた後の newPage:TargetAlreadyLoaded)と、2 つ目のコンテキスト(Cannot have more than one browser context at a time)。接続ごとに別のブラウザなので、別のページには別の接続を開く(同時に最大 16) |
入力とクリック(fill、type、keyboard.type、click) |
スクリーンキャスト(Page.startScreencast):配信するものがなく、chromium-headless を示すエラーですぐに拒否される |
Cookie(context.cookies、addCookies/page.cookies、setCookie)、追加のヘッダー(setExtraHTTPHeaders)、クライアントが応答するリクエスト(Playwright の page.route、Puppeteer のリクエストインターセプト) |
ライブビューとプロファイル(400 kind_unsupported) |
setViewportSize と setViewport、ページ自身のスクリプトより前に実行するスクリプト(addInitScript、evaluateOnNewDocument)、exposeFunction、コンソールメッセージ、Puppeteer の accessibility.snapshot() |
16 MiB を超えるブラウザへのメッセージ |
スクリーンショットと PDF(page.screenshot()、page.pdf()):ページのテキストのみ(下記参照) |
**スクリーンショットや PDF に含まれるのはページのテキストだけです。**Lightpanda にはレイアウトエンジンがないため、page.screenshot() はページのテキストをブロックごとに縦に並べた PNG を、page.pdf() はそのテキストの PDF を返します。どちらも人が見るページの姿ではなく、レイアウトも画像もページ独自の色もありません。描画されたページが必要なら chromium-headless を使います。
制限
- 同時稼働数:セッションは 1 vCPU、2 GiB のサンドボックス 1 つとして、アカウントのサンドボックスやキューブのインスタンスと合わせ、プランで同時に稼働できる上限に数えられます(無料プランでは 5。制限を参照)。
- 常に閉じているポート:ネットワークルールの設定にかかわらず、セッションのトラフィックがポート 25、465、587(メール)や、マイニングプールが待ち受けるポート(3333、4444、5555、7777、14444、45700)に届くことはありません。
- プロキシ:有料プランでは、セッションの Web トラフィックを自前の HTTP プロキシ経由で送信できます(自前のプロキシ)。無料プランでは使えません(403
proxy_not_on_plan)。
次のステップ
- セッション:呼び出し、セッションが持つもの、名前、スリープと復帰、新しいアドレス、自前のプロキシ。
- ライブビューとプロファイル:セッションのページをライブで見る方法と、プロファイルに保持されるログイン状態。