Prompt API の試験運用版のポリフィル

公開日: 2026 年 5 月 14 日

Chrome の Prompt API を使用すると、window.LanguageModel高レベルのブラウザ API を使用して LLM とやり取りできます。ただし、この機能のサポートはまだ限定的であり、実装は複雑なプロセスです。

ブラウザ サポート対象の OS サポートされていない OS 位置
Chrome Windows、macOS、Linux、ChromeOS(Chromebook Plus) Android、iOS ✅ 対応
Edge Windows、macOS Android、iOS ✅ 対応
Safari 📋 役職が決定しました
Firefox 📋 役職が決定しました

同時に、早期プレビュー プログラムに参加しているデベロッパーからは、Prompt API への期待の声が寄せられています。この API の利用可能性は、当面の間、互換性の課題となります。

解決策

そのため、構成可能な クラウド バックエンド プロバイダと、Transformers.js の形式のローカル バックエンド プロバイダの上に Prompt API を正確に実装する、仕様に準拠した Prompt API ポリフィル(GitHub のソースコードを参照)を試験運用版としてリリースします。

ポリフィルを使用する

ポリフィルを使用する手順は次のとおりです。

  1. npm からポリフィルをダウンロードします。

    npm install prompt-api-polyfill
    
  2. クラウド バックエンド プロバイダとローカル バックエンド プロバイダのどちらを使用するかを選択します。

    • クラウド バックエンド プロバイダ: ユーザーデータはリモート処理のためにクラウドに送信されますが、ローカルモデルが利用可能になるまで待つ必要はありません。発生した費用については、クラウド プロバイダの料金情報に基づいてお客様の負担となります。
    • ローカル バックエンド プロバイダ: ユーザーデータはブラウザに残り、ローカルで処理されますが、モデルをダウンロードする必要があります。実際の Prompt API とは異なり、異なるオリジン間で共有することはできません。ローカル処理に伴う費用は発生しません。

クラウド バックエンド

クラウド バックエンドを選択し、バックエンド プロバイダの API キー(および追加の認証情報)を取得します。

API キーを取得したら、構成ファイル .env.json に詳細を入力します。modelName を指定しない場合、ポリフィルは各バックエンドのデフォルト モデルを使用しますが、指定した場合は、各バックエンドのサポートされているモデルのいずれかを選択できます。

{
  "apiKey": "y0ur-Api-k3Y",
  "modelName": "model-name"
}

ローカル バックエンド

Transformers.js に基づくローカル バックエンド プロバイダを使用する場合は、ダミーの API キーのみが必要です。ただし、Transformers.js が使用するデバイスを構成することはできます。パフォーマンスを最大化するには "webgpu" を、互換性を最大化するには "wasm" を選択します。必要に応じて、デフォルトの設定を変更できます。互換性のあるモデルの Hugging Face カタログから別のモデルを選択します。モデルによっては、dtype パラメータを使用してさまざまな量子化から選択できます。

{
  "apiKey": "dummy",
  "device": "webgpu",
  "dtype": "q4f16",
  "modelName": "onnx-community/gemma-3-1b-it-ONNX-GQA"
};

ポリフィルを構成する

構成ファイルが作成されたので、アプリでポリフィルを使用できるようになりました。

  1. 構成ファイルをインポートし、適切な名前のグローバル変数に割り当てます。ここで、$BACKEND は選択したバックエンド window.$BACKEND_CONFIG です。
  2. 動的インポートを使用して、基盤となるブラウザがポリフィルをサポートしていない場合にのみポリフィルを読み込みます。
  3. Prompt API 関数を呼び出す
import config from './.env.json' with { type: 'json' };

// Set $BACKEND_CONFIG to select a backend
window.$BACKEND_CONFIG = config;

if (!('LanguageModel' in window)) {
  await import('prompt-api-polyfill');
}

const session = await LanguageModel.create({
  expectedInputs: [{type: 'text', languages: ['en']}],
  expectedOutputs: [{type: 'text', languages: ['en']}],
});
await session.prompt('Tell me a joke!');

このポリフィルは、構造化された出力(Transformers.js バックエンドを除く)をサポートし、マルチモーダル入力(音声と画像を同時にサポートせず、別々にのみサポートする OpenAI バックエンドを除く)を処理し、LanguageModel完全なウェブ プラットフォーム テスト スイートに対してテストされています。

背景、詳細な使用方法、ソースコードについては、GitHub リポジトリの README ファイルをご覧ください。

ブラウザの Prompt API との違い

polyfill がクラウドモデルに支えられている場合、クライアントサイドで実行するメリットの一部は適用されなくなります。つまり、バックエンド プロバイダのプライバシー ポリシーは引き続き適用されますが、センシティブ データのローカル処理を保証することはできなくなります。また、ユーザーがオフラインの場合、アプリで AI を使用することもできなくなります。オンラインかオフラインかを確認するには、対応するイベントをリッスンします。

window.addEventListener("offline", (e) => {
  console.log("offline");
});

window.addEventListener("online", (e) => {
  console.log("online");
});

AI 推論がクラウド内のモデルに対して実行される場合、ダウンロードするローカルモデルはありません。ポリフィルは downloadprogress イベントを偽装するため、アプリには組み込みモデルがすでにダウンロードされているように見えます。つまり、loaded 値が 0 のイベントと 1 のイベントの 2 つが存在することになります。これは仕様で求められていることです。

クラウドベースの推論では、デバイス上の推論とは異なり、選択したバックエンド プロバイダから API を呼び出すときに費用が発生する可能性があります。Gemini API などの料金情報を確認します。トークンあたりの費用がわかっている場合は、Prompt API の contextUsage 情報を使用して費用を計算できます。

const COST_PER_TOKEN = 123;
const COST_LIMIT = 456;

let costSoFar = 0;

const session = await LanguageModel.create(options);

/…/

if (costSoFar < COST_LIMIT) {
  await session.prompt('Tell me a joke.');
  costSoFar = session.contextUsage * COST_PER_TOKEN;
} else {
  // Show premium AI plan promo.
}

モバイルアプリやウェブアプリからクラウド API を直接呼び出す場合(生成 AI モデルへのアクセスを許可する API など)、API キーが不正なクライアントによる不正使用に対して脆弱になります。これらの API を保護するため、Firebase AI Logic Hybrid SDK を使用する場合は、Firebase App Check を使用して、すべての受信 API 呼び出しが実際のアプリからのものであることを確認する必要があります。Google などの一部のクラウド プロバイダでは、厳格なオリジン チェックを適用して、許可されたウェブサイトのみが API を使用できるようにすることもできます。

たとえば、セッションの contextWindow に関する Prompt API の上限ではなく、バックエンド プロバイダの上限が適用されます。contextWindow の場合、これらの上限は通常オンデバイスよりもはるかに高く、クラウドでより大量のデータを処理できるため、この違いを認識しておく必要がありますが、実際には問題が発生する可能性は低いでしょう。

独自のバックエンドを作成する

独自のバックエンド プロバイダを追加する手順は次のとおりです。

ベースのバックエンド クラスを拡張する

backends/ ディレクトリに新しいファイルを作成します(例: backends/custom-backend.js)。PolyfillBackend クラスを拡張し、想定されるインターフェースを満たすコアメソッドを実装する必要があります。

import PolyfillBackend from './base.js';
import { DEFAULT_MODELS } from './defaults.js';

export default class CustomBackend extends PolyfillBackend {
  constructor(config) {
    // config typically comes from a window global (e.g., window.CUSTOM_CONFIG)
    super(config.modelName || DEFAULT_MODELS.custom.modelName);
  }

  // Check if the backend is configured (e.g., API key is present), if given
  // combinations of modelName and options are supported, or, for local model,
  // if the model is available.
  static availability(options) {
    return window.CUSTOM_CONFIG?.apiKey ? 'available' : 'unavailable';
  }

  // Initialize the underlying SDK or API client. With local models, use
  // monitorTarget to report model download progress to the polyfill.
  createSession(options, sessionParams, monitorTarget) {
    // Return the initialized session or client instance
  }

  // Non-streaming prompt execution
  async generateContent(contents) {
    // contents: Array of { role: 'user'|'model', parts: [{ text: string }] }
    // Return: { text: string, usage: number }
  }

  // Streaming prompt execution
  async generateContentStream(contents) {
    // Return: AsyncIterable yielding chunks
  }

  // Token counting for quota/usage tracking
  async countTokens(contents) {
    // Return: total token count (number)
  }
}

バックエンドを登録する

ポリフィルは、グローバル構成に基づく「First-Match Priority」戦略を使用します。静的 #backends 配列に追加して、prompt-api-polyfill.js ファイルにバックエンドを登録する必要があります。

// prompt-api-polyfill.js
static #backends = [
  // ... existing backends
  {
    config: 'CUSTOM_CONFIG', // The global object to look for on `window`
    path: './backends/custom-backend.js',
  },
];

デフォルトのモデルを設定する

backends/defaults.js でフォールバック モデルの ID を定義します。これは、ユーザーが特定の modelName を指定せずにセッションを初期化した場合に使用されます。

// backends/defaults.js
export const DEFAULT_MODELS = {
  // ...
  custom: 'custom-model-pro-v1',
};

ローカルでの開発とテストを有効にする

このプロジェクトでは、検出スクリプト(scripts/list-backends.js)を使用してテスト マトリックスを生成します。新しいバックエンドをテストランナーに含めるには、ルート ディレクトリに .env-[name].json ファイル(.env-custom.json など)を作成します。

{
  "apiKey": "your-api-key-here",
  "modelName": "custom-model-pro-v1"
}

Web Platform Tests(WPT)で検証する

最後のステップは、コンプライアンスの確保です。ポリフィルは仕様に基づいているため、新しいバックエンドは公式(または暫定)の Web プラットフォーム テストに合格する必要があります。

npm run test:wpt

この検証ステップでは、バックエンドが AbortSignal、システム プロンプト、履歴の形式設定などを Prompt API 仕様で想定されているとおりに処理することを確認します。

まとめ

ポリフィルを使用すると、すべてのプラットフォームとデバイスで Prompt API を使用できます。Prompt API の明確に定義された API に対してコーディングすることで、クラウド プロバイダからの独立性を高め、プラットフォームにできるだけ近い状態を維持できます。

Prompt API をサポートする対応デバイスでは、ポリフィルは読み込まれないため、ユーザーは実行されないコードをダウンロードする必要がありません。フィードバックがある場合やバグが発生した場合は、GitHub で問題を報告してください。このガイドが、スキルを向上させる一助となれば幸いです。