Chromeは、AIモデルをブラウザ内に直接搭載しました。Prompt APIは、それを利用するために呼び出すJavaScriptのインターフェースです。APIキーも、ネットワークの往復も、トークンごとの料金もかかりません。このモデルはGemini Nanoであり、ユーザーのデバイス上で動作し、Chrome 138以降では拡張機能向けに一般提供されており、ウェブページ向けにはフラグの裏で提供されています。API開発者にとって、これはクライアント側で何ができるかの合理性を変えるものです。
このガイドでは、Chrome Prompt APIとは何か、クラウドGemini APIとどう異なるのか、実際にAPIワークフローに適合するのはどのような場合か、拡張機能とウェブページの両方での実践的なコード、そしてドキュメントが認めるよりも早く直面するであろう制限について解説します。モデルが利用できない場合に備えてフォールバックパスを持てるよう、最後にはApidogと組み合わせて説明します。
ボタン
要約
- Chrome Prompt APIは、Gemini Nanoを
LanguageModelを通じて公開します。ウェブページではwindow.LanguageModel、拡張機能ではchrome.languageModelで利用可能です。 - モデルは完全にデバイス上で実行されます。ネットワーク呼び出し、キー、トークンコストは不要です。
- Chrome拡張機能ではChrome 138以降で安定版です。ウェブページでは、
chrome://flags/#prompt-api-for-gemini-nanoフラグの裏と登録されたOrigin Trialで提供されています。 - API開発者にとっての最適な用途:クライアント側での入力解析、JSON形式の修正、UI向けAPIレスポンスの要約、開発中のスタブ生成。
- 常にクラウドフォールバックを組み込んでください。オンデバイスモデルは開放的に失敗しますが、あなたのコードはそうであるべきではありません。
Prompt APIが実際に公開しているもの
Prompt APIは、Chromeが昨年から提供を開始した「Built-in AI」APIの小さなグループの1つです。他のAPIはより限定的で、Summarizer、Writer、Rewriter、Translator、Language Detectorがあります。Prompt APIは汎用的なインターフェースであり、他のAPIはこれにタスク固有のデフォルト設定を加えています。

重要な3つのプリミティブがあります。
LanguageModel.availability()。available、downloadable、downloading、またはunavailableを返します。モデルは約2GBで、サイトが最初にリクエストしたときにバックグラウンドでダウンロードされます。LanguageModel.create(options)。セッションを起動します。セッションはターン状態、システムプロンプト、いくつかのサンプリングノブを保持します。session.prompt(text)およびsession.promptStreaming(text)。実際にモデルを呼び出す2つの方法です。
この形状は意図的にGeminiクラウドSDKに近づけていますが、簡略化されています。ツール呼び出しはまだなく、安定版チャンネルでは画像入力もありません(Origin Trialでは利用可能です)。コンテキストウィンドウは小さく(入力4Kトークン、出力1Kトークン、合計8Kにソフト拡張)、限られています。
ウェブページからの最初の呼び出しは次のようになります。
if (!('LanguageModel' in window)) {
console.warn('Prompt API not available. Falling back to cloud.');
} else {
const status = await LanguageModel.availability();
if (status === 'unavailable') {
console.warn('Device does not support Gemini Nano.');
} else {
if (status !== 'available') {
// Triggers a background download. Show a UI.
await LanguageModel.create({ monitor(m) {
m.addEventListener('downloadprogress', e => {
console.log(`downloaded ${(e.loaded * 100).toFixed(0)}%`);
});
}});
}
const session = await LanguageModel.create({
systemPrompt: 'You answer in three concise bullets. JSON only.',
});
const reply = await session.prompt(
'Summarize this changelog in three bullets.\n\n' + changelog
);
console.log(reply);
}
}
このスニペットには、機能検出、可用性チェック、オプションのダウンロード、セッション作成、システムプロンプト、プロンプト呼び出しといった、意味のあるすべての要素が含まれています。
クラウドGemini APIとの違い
同じファミリーですが、デプロイメントが異なります。これらの違いが、その上に構築できるものとできないものを形作ります。
| プロパティ | Chrome Prompt API | Gemini API (クラウド) |
|---|---|---|
| モデル | Gemini Nano (オンデバイス) | gemini-3-flash, gemini-3-flash-preview, gemini-3-pro |
| 呼び出しごとの費用 | ゼロ | トークンごとの課金 |
| レイテンシ | 最初のトークンは通常50〜300ミリ秒 | 最初のトークンは200〜800ミリ秒 |
| ネットワーク | モデルダウンロード後は不要 | 呼び出しごとに必要 |
| プライバシー | 入力はデバイスを離れない | Googleサーバーに送信される |
| コンテキストウィンドウ | 入力4K / 出力1K (合計8K) | 最大1Mトークン |
| ツール呼び出し | なし (計画中) | あり |
| マルチモーダル | Origin Trialで画像入力 | あり |
| JSONモード | システムプロンプトによるベストエフォート | スキーマによるファーストクラスサポート |
| 利用可能性 | Chromeのみ、対応ハードウェアのみ | ネットワーク接続のあるすべてのクライアント |
オンデバイスモデルは、gemini-3-flashよりも約2桁小さいです。正規表現や手作業で調整したプロンプト分類器を使用するような短いタスクに利用してください。クラウドGeminiの代わりとしてそのまま使用すべきではありません。
API開発者のワークフローに実際に適合する場所
統合コストに見合う4つのユースケースがあります。これら以外では、クラウドAPIが依然として適切な選択です。
1. クライアント側でのユーザー入力の解析と整形。自由形式のクエリを受け取り、それをAPIの構造化されたフィルターに変換します。ユーザーが「先週のStripeの100ドル以上の請求」と入力すると、Prompt APIがそれを{ "amount_gt": 100, "since": "2026-04-22", "provider": "stripe" }に変換し、検索エンドポイントを呼び出す前に処理します。これにより、ラウンドトリップを削減し、ユーザーのプライバシーを保護します。
2. UI向けAPIレスポンスの要約。自身のAPIを叩いて40件のレコードが返され、カードに表示するための一行の要約が必要な場合。レコードをクラウドモデルに送信すると、レイテンシとコストが増加します。Prompt APIはローカルで実行され、200ミリ秒以内に結果を返します。
3. JSON形式の修正。LLMからの応答は、無視できないほど頻繁に不正な形式で届きます。Gemini Nanoを使ってワンショットの修正パスを実行します。「これは無効なJSONです。同じフィールドで有効なJSONのみを返してください。」安価で高速、コストもかかりません。
4. 開発中のローカルスタブ。新しいエンドポイントを接続している最中で、バックエンドが半完成の状態でも、それらしい応答ボディをその場で生成できます。形式は本番環境に正確ではないかもしれませんが、フロントエンドの作業のブロックを解除します。Apidogのモックサーバーと組み合わせることで、重要なエンドポイントは保存された例から、探索的なエンドポイントはPrompt APIから提供されるハイブリッドな設定を実現できます。
拡張機能への組み込み
拡張機能は、Chrome 138以降の安定版チャンネルでPrompt APIを利用できます。権限を宣言し、chrome.languageModelを呼び出します。
manifest.json:
{
"manifest_version": 3,
"name": "Endpoint Summarizer",
"version": "1.0.0",
"permissions": ["languageModel"],
"action": { "default_popup": "popup.html" }
}
popup.js:
const status = await chrome.languageModel.availability();
if (status === 'unavailable') {
document.getElementById('out').textContent =
'Device does not support on-device AI.';
return;
}
const session = await chrome.languageModel.create({
systemPrompt: [
'You summarize HTTP responses in three short bullets.',
'Mention status, the most-changed field, and any error keys.',
].join(' '),
temperature: 0.3,
topK: 3,
});
document.getElementById('go').addEventListener('click', async () => {
const tab = await chrome.tabs.query({ active: true, currentWindow: true });
const [{ result }] = await chrome.scripting.executeScript({
target: { tabId: tab[0].id },
func: () => document.body.innerText.slice(0, 4000),
});
const stream = session.promptStreaming(result);
const out = document.getElementById('out');
out.textContent = '';
for await (const chunk of stream) {
out.textContent += chunk;
}
});
特筆すべき点が2つあります。temperatureとtopKはAPIが公開する唯一のサンプリング調整ノブであり、topPは安定版チャンネルではサポートされていません。ストリーミングは非同期イテレータであり、サーバー送信イベントではないため、消費パターンはクラウドGeminiで記述するSSEリーダーではなくfor awaitです。
ウェブページへの組み込み
ウェブページでは、ユーザーがフラグを有効にするか、あなたのオリジンがOrigin Trialに登録されている必要があります。トライアルトークンはメタタグに記述します。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="origin-trial" content="YOUR_TRIAL_TOKEN_HERE" />
</head>
<body>
<textarea id="in" placeholder="Paste an API response..."></textarea>
<button id="go">Summarize</button>
<pre id="out"></pre>
<script type="module">
if (!('LanguageModel' in window)) {
document.getElementById('out').textContent =
'Prompt API not available in this browser.';
} else {
const session = await LanguageModel.create({
systemPrompt: 'Reply in JSON: { "summary": "...", "tags": [...] }',
temperature: 0.2,
});
document.getElementById('go').onclick = async () => {
const text = document.getElementById('in').value;
const reply = await session.prompt(text);
try {
document.getElementById('out').textContent =
JSON.stringify(JSON.parse(reply), null, 2);
} catch {
document.getElementById('out').textContent = reply;
}
};
}
</script>
</body>
</html>
Origin Trialトークンなしでページをテストしたい場合は、chrome://flags/#prompt-api-for-gemini-nanoを開き、有効に設定してChromeを再起動してください。このフラグは過去6バージョンにわたって安定していますが、永久に存続することは約束されていません。予測可能な動作を望む場合は、Origin Trialのパスを実装してください。
ドキュメントで十分に強調されていない制限と注意点
あなたを悩ませるであろう6つのこと。
- コンテキストが小さい。入力4K、出力1K。積極的に切り詰めてください。50KトークンのJSONドキュメントを貼り付けても、有用な回答は期待できません。
- ハードウェアサポートが不均一。モデルはVRAMまたは統合メモリを約4GB必要とし、Windows、macOS、Linux、および最近のChromeOS上のChrome 138以降でのみ動作します。本稿執筆時点では、モバイル版Chromeはサポートされていません。
- 初回読み込みが遅い。2GBのダウンロードはバックグラウンドで行われますが、最初のセッションをブロックします。常にダウンロードの進行状況UIを表示してください。
- ツール呼び出しなし。タスクでモデルがAPIを呼び出す必要がある場合、その処理はクライアント側であなた自身が行ってください。モデルは何を呼び出すかを決定するだけです。
- システムプロンプトのずれ。オンデバイスモデルは、クラウドモデルよりもシステムプロンプトに厳密に従わない傾向があります。システムプロンプト内でワンショットの例を使用して形式を固定してください。
- 権限が重要。拡張機能には
permissionsに"languageModel"が必要です。これを忘れると、APIは静かにunavailableを返します。
リリース前にクラウドフォールバックを組み込む
あなたのアプリは、モデルを持っていないユーザーにも提供されます。常にフォールバックを組み込んでください。そのパターンは短いです。
async function summarize(text) {
if ('LanguageModel' in window) {
const status = await LanguageModel.availability();
if (status === 'available') {
const session = await LanguageModel.create({
systemPrompt: 'Reply with one bullet summary, max 12 words.',
});
return session.prompt(text);
}
}
// Fallback: call your server, which calls cloud Gemini or your own model.
const r = await fetch('/api/summarize', {
method: 'POST', body: JSON.stringify({ text }),
});
return (await r.json()).summary;
}
プライバシーとユーザーへの説明
Prompt APIのセールスポイントは、入力がデバイスを離れないことです。これは現在も事実であり、「Built-in AI」イニシアチブの明確な設計意図です。知っておくべき2つの補足事項があります。
- モデル自体はGoogleがGoogleのデータでトレーニングしたものです。ローカルで実行してもその事実は変わりません。Chromeはブラウザのアップデートとともにウェイトを出荷します。
- 利用状況に関するテレメトリーは、ユーザーの通常のChromeテレメトリー設定に基づき、Chromeによって報告される場合があります。プロンプトの内容はそのテレメトリーの一部ではありません。
ほとんどのコンシューマーアプリにとって、これは法的なレビューなしにUIに組み込める強力なプライバシーに関する話です。規制対象のワークロード(HIPAA、PCI)の場合は、これに依存する前に弁護士に確認してください。
Prompt APIをスキップすべき場合
以下の場合には、代わりにクラウドGemini APIを選択してください。
- タスクに4Kトークン以上の入力が必要な場合。
- ツール呼び出し、スキーマ強制を伴う構造化出力、またはOrigin Trialを超えるマルチモーダル入力が必要な場合。
- Safari、Firefox、またはモバイル版Chromeのユーザーにサービスを提供する場合。ブラウザサポートは現在Chromeのみであり、Appleは出荷日をまだ示していません。
- 出力品質がレイテンシよりも重要な場合。Nanoは小さいですが、Proは違います。
オープンウェイトの観点からは、「DeepSeek V4をローカルで実行する方法」の記事で、ローカルネットワークを離れることなく開発マシン上でより大規模なモデルを実行する方法が解説されています。
よくある質問
Prompt APIは公式のウェブ標準プロセスに含まれていますか?W3C WebMLコミュニティグループで提案として検討されています。他のエンジンが出荷するまでは、Chrome固有のものとして扱ってください。
サービスワーカーから利用できますか?Chrome 138以降では、拡張機能向けに可能です。ウェブページでは現在、ドキュメントコンテキストに制限されています。サービスワーカーに導入する前にドキュメントを確認してください。
実際にどのモデルサイズが利用できますか?Gemini Nanoは2〜4Bのパラメーター範囲で、フィットするように量子化されています。Googleは特定のサイズを約束していません。今後成長すると予想されます。
関数呼び出しをサポートしていますか?安定版チャンネルではサポートしていません。Origin Trialブランチには実験的なツールサポートがありますが、本番環境でこれに依存しないでください。
自動化されたCIでテストするにはどうすればよいですか?ヘッドレスChromiumでは、オンデバイスモデルをまだ実行できません。テストではLanguageModelグローバルをモックし、CIではクラウドフォールバックパスを実行してください。
商用利用は無料ですか?はい。呼び出しごとの課金はありません。ユーザーのデバイス上でのストレージコスト(約2GB)はあなたが負担し、Chromeがアップデートを処理します。
既にクラウド側LLMワークフローを実行しているチーム向けには、「GPT-5.5とは」の記事でクラウド側のトレードオフがより深く解説されており、Apidogは別のテストツールなしでモックとフォールバックの配線を処理します。
ボタン
