Prompt API

公開日: 2025 年 5 月 20 日、最終更新日: 2026 年 10 月 21 日

商品の解説 ウェブ 拡張機能 Chrome ステータス インテント
GitHub Chrome 148 Chrome 138 表示 出荷の意向
GitHub オリジン トライアル サンプリング パラメータのオリジン トライアル Chrome 148 表示 テストの目的

Prompt API を使用すると、Chrome の基盤モデルに自然言語リクエストを送信できます。

Prompt API の使い方はさまざまです。たとえば、次のようなものを構築できます。

  • AI 搭載検索: ウェブページのコンテンツに基づいて質問に回答します。
  • パーソナライズされたニュース フィード: 記事をカテゴリ別に動的に分類するフィードを構築し、ユーザーがそのコンテンツをフィルタできるようにします。
  • カスタム コンテンツ フィルタ。ニュース記事を分析し、ユーザー定義のトピックに基づいてコンテンツを自動的にぼかしたり隠しコンテンツにしたりする。
  • カレンダーの予定の作成。ウェブページから予定の詳細を自動的に抽出する Chrome 拡張機能を開発し、ユーザーが数ステップでカレンダーのエントリを作成できるようにします。
  • シームレスな連絡先の抽出。ウェブサイトから連絡先情報を抽出する拡張機能を構築して、ユーザーがビジネスに連絡したり、連絡先リストに詳細を追加したりしやすくします。

これらはほんの一例です。皆様がどのような作品を作られるのかを楽しみにしています。

ハードウェア要件を確認する

Chrome でこれらの API を使用して機能を操作するデベロッパーとユーザーには、次の要件があります。他のブラウザでは、動作要件が異なる場合があります。

Language Detector と Translator API は、パソコン版 Chrome で動作します。これらの API はモバイル デバイスでは機能しません。

Prompt API、Summarizer API、Writer API、Rewriter API、Proofreader API は、次の条件を満たす場合に Chrome で動作します。

  • オペレーティング システム: Windows 10 または 11、macOS 13 以降(Ventura 以降)、Linux、または Chromebook Plus デバイス上の ChromeOS(プラットフォーム 16389.0.0 以降)。 Android 版 Chrome、iOS 版 Chrome、Chromebook Plus 以外のデバイスの ChromeOS は、基盤モデルを使用する API でまだサポートされていません。
  • ストレージ: Chrome プロファイルを含むボリュームに 22 GB 以上の空き容量があること。
  • GPU または CPU: 組み込みモデルは GPU または CPU で実行できます。
    • GPU: 4 GB を超える VRAM。
    • CPU: 16 GB 以上の RAM と 4 個以上の CPU コア。
    • 注: 音声入力を使用する Prompt API には GPU が必要です。
  • ネットワーク: 無制限のデータまたは定額制の接続。

Gemini Nano の正確なサイズは、ブラウザがモデルを更新するにつれて変化する可能性があります。現在のサイズを確認するには、chrome://on-device-internals にアクセスしてください。

Prompt API を使用する

Prompt API は、Chrome で Gemini Nano モデルを使用します。API は Chrome に組み込まれていますが、オリジンが初めて API を使用するときにモデルが個別にダウンロードされます。

モデルが使用可能かどうかを判断するには、LanguageModel.availability() を呼び出します。

const availability = await LanguageModel.availability({
  // The same options in `prompt()` or `promptStreaming()`
});

ダウンロードをトリガーして言語モデルをインスタンス化するには、ユーザー アクティベーションを確認します。次に、create() 関数を呼び出します。

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener('downloadprogress', (e) => {
      console.log(`Downloaded ${e.loaded * 100}%`);
    });
  },
});

availability() へのレスポンスが downloading の場合は、ダウンロードの進行状況をリッスンし、ユーザーに通知します。ダウンロードには時間がかかることがあります。

セッションを作成する

Prompt API を実行できるようになったら、create() 関数を使用してセッションを作成します。

const session = await LanguageModel.create();

create() 関数のオプションの options オブジェクトは signal フィールドを受け取ります。これにより、AbortSignal を渡してセッションを破棄できます。

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const session = await LanguageModel.create({
  signal: controller.signal,
});

サンプリング パラメータ

サンプリングを制御することで、モデルのレスポンスの予測可能性(決定的)や創造性(多様性)を調整できます。サンプリング パラメータの可用性は、ウェブ プラットフォームと Chrome 拡張機能で異なります。

  • ウェブ: samplingMode オプションを使用します。このオプションでは、未加工の数値ではなく、わかりやすい列挙値を使用して出力の予測可能性を調整します。
  • Chrome 拡張機能: 以前の数値パラメータ(topK、temperature)と LanguageModel.params() メソッドがサポートされています。

ウェブ サンプリング モード

samplingMode オプションを LanguageModel.create()(または LanguageModel.availability())に渡します。

サポートされている samplingMode 列挙値は次のとおりです。

  • "most-predictable": 決定性と予測可能性が最も高い。
  • "predictable": : 出力の予測可能性が高く、ばらつきが最小限に抑えられます。
  • "slightly-predictable": やや予測可能な出力。
  • "balanced": 予測可能性と創造性のバランス(一般的なデフォルトの動作)。
  • "slightly-creative": わずかに変化のあるクリエイティブな出力。
  • "creative": クリエイティブで多様な出力。
  • "most-creative": 最大限の変動性と創造性。
// Available on the web with the Sampling Parameters Origin Trial enabled
const session = await LanguageModel.create({
  samplingMode: 'creative',
});

// The configured sampling mode is exposed on the session instance
console.log(session.samplingMode);
// "creative"

Chrome 拡張機能のサンプリング パラメータ

Chrome 拡張機能で Prompt API を使用する場合、オプション オブジェクトを使用して topK と temperature で各セッションをカスタマイズできます。

静的 LanguageModel.params() 関数は、言語モデルのデフォルトと最大パラメータの上限を通知します。

  • defaultTopK: デフォルトの top-K 値。
  • maxTopK: 最大 Top-K 値。
  • defaultTemperature: デフォルトの温度。
  • maxTemperature: 最高気温。
// Only available in Chrome Extensions
const params = await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}

// Initializing a new session in extensions must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.min(params.defaultTemperature * 1.2, params.maxTemperature),
  topK: params.defaultTopK,
});

console.log(slightlyHighTemperatureSession.temperature);
console.log(slightlyHighTemperatureSession.topK);

最初のプロンプトでコンテキストを追加する

初期プロンプトを使用すると、以前のインタラクションに関するコンテキストを言語モデルに提供できます。たとえば、ブラウザの再起動後にユーザーが保存されたセッションを再開できるようにします。

const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'You are a helpful and friendly assistant.' },
    { role: 'user', content: 'What is the capital of Italy?' },
    { role: 'assistant', content: 'The capital of Italy is Rome.' },
    { role: 'user', content: 'What language is spoken there?' },
    {
      role: 'assistant',
      content: 'The official language of Italy is Italian. [...]',
    },
  ],
});

接頭辞を使用してレスポンスを制限する

以前のロールに加えて "assistant" ロールを追加すると、モデルの以前の回答を詳しく説明できます。次に例を示します。

const followup = await session.prompt([
  {
    role: "user",
    content: "I'm nervous about my presentation tomorrow"
  },
  {
    role: "assistant",
    content: "Presentations are tough!"
  }
]);

場合によっては、新しいレスポンスをリクエストする代わりに、"assistant" ロールのレスポンス メッセージの一部を事前に入力することがあります。これは、特定のレスポンス形式を使用するように言語モデルをガイドするのに役立ちます。これを行うには、末尾の "assistant" ロール メッセージに prefix: true を追加します。次に例を示します。

const characterSheet = await session.prompt([
  {
    role: 'user',
    content: 'Create a TOML character sheet for a gnome barbarian',
  },
  {
    role: 'assistant',
    content: '```toml\n',
    prefix: true,
  },
]);

想定される入力と出力を追加する

Prompt API にはマルチモーダル機能があり、複数の言語をサポートしています。セッションの作成時に、expectedInputs と expectedOutputs のモダリティと言語を設定します。

  • type: モダリティが必要です。
    • expectedInputs の場合、text、image、audio のいずれかになります。
    • expectedOutputs の場合、Prompt API では text のみが許可されます。
  • languages: 予想される言語を設定する配列。Prompt API は、"en"、"ja"、"es"、"de"、"fr" を受け入れます。他の言語のサポートは開発中です。
    • expectedInputs には、システム プロンプトの言語と、想定されるユーザー プロンプトの言語を 1 つ以上設定します。
    • 1 つ以上の expectedOutputs 言語を設定します。
const session = await LanguageModel.create({
  expectedInputs: [
    { type: "text", languages: ["en" /* system prompt */, "ja" /* user prompt */] }
  ],
  expectedOutputs: [
    { type: "text", languages: ["ja"] }
  ]
});

モデルがサポートされていない入力または出力に遭遇すると、"NotSupportedError" DOMException が発生することがあります。

マルチモーダル機能

これらの機能により、次のことが可能になります。

  • ユーザーがチャット アプリケーションで送信された音声メッセージを文字に変換できるようにします。
  • ウェブサイトにアップロードされた画像を説明し、キャプションや代替テキストとして使用します。

音声入力で Prompt API を使用する Mediarecorder Audio Prompt デモと、画像入力で Prompt API を使用する Canvas Image Prompt デモをご覧ください。

Prompt API は、次の入力タイプをサポートしています。

このスニペットは、まず 2 つのビジュアル(1 つの画像 Blob と 1 つの HTMLCanvasElement)を処理して AI に比較させ、次にユーザーが音声録音(AudioBuffer として)で応答できるようにするマルチモーダル セッションを示しています。

const session = await LanguageModel.create({
  expectedInputs: [
    { type: "text", languages: ["en"] },
    { type: "audio" },
    { type: "image" },
  ],
  expectedOutputs: [{ type: "text", languages: ["en"] }],
});

const referenceImage = await (await fetch("reference-image.jpeg")).blob();
const userDrawnImage = document.querySelector("canvas");

const response1 = await session.prompt([
  {
    role: "user",
    content: [
      {
        type: "text",
        value:
          "Give a helpful artistic critique of how well the second image matches the first:",
      },
      { type: "image", value: referenceImage },
      { type: "image", value: userDrawnImage },
    ],
  },
]);
console.log(response1);

const audioBuffer = await captureMicrophoneInput({ seconds: 10 });

const response2 = await session.prompt([
  {
    role: "user",
    content: [
      { type: "text", value: "My response to your critique:" },
      { type: "audio", value: audioBuffer },
    ],
  },
]);
console.log(response2);

メッセージを追加する

推論には時間がかかることがあります。特に、マルチモーダル入力でプロンプトを送信する場合は時間がかかります。事前に定義されたプロンプトを送信してセッションにデータを入力すると、モデルが処理を迅速に開始できるため、有用な場合があります。

initialPrompts はセッションの作成時に役立ちますが、append() メソッドを prompt() メソッドまたは promptStreaming() メソッドと組み合わせて使用すると、セッションの作成後に追加のコンテキスト プロンプトを提供できます。

次に例を示します。

const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: 'system',
      content:
        'You are a skilled analyst who correlates patterns across multiple images.',
    },
  ],
  expectedInputs: [{ type: 'image' }],
});

fileUpload.onchange = async () => {
  await session.append([
    {
      role: 'user',
      content: [
        {
          type: 'text',
          value: `Here's one image. Notes: ${fileNotesInput.value}`,
        },
        { type: 'image', value: fileUpload.files[0] },
      ],
    },
  ]);
};

analyzeButton.onclick = async (e) => {
  analysisResult.textContent = await session.prompt(userQuestionInput.value);
};

append() によって返される Promise は、プロンプトが検証、処理され、セッションに追加されると、履行されます。プロンプトを追加できない場合、Promise は拒否されます。

JSON スキーマを渡す

responseConstraint フィールドを prompt() メソッドまたは promptStreaming() メソッドに追加して、JSON スキーマを値として渡します。その後、Prompt API で構造化出力を使用できます。

次の例では、JSON スキーマにより、モデルが true または false で応答し、指定されたメッセージが陶芸に関するものかどうかを分類します。

const session = await LanguageModel.create();

const schema = {
  "type": "boolean"
};

const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";

const result = await session.prompt(
  `Is this post about pottery?\n\n${post}`,
  {
    responseConstraint: schema,
  }
);
console.log(JSON.parse(result));
// true

実装では、モデルに送信されるメッセージの一部として JSON スキーマまたは正規表現を含めることができます。これにより、コンテキスト ウィンドウの一部が使用されます。responseConstraint オプションを session.measureContextUsage() に渡すことで、使用されるコンテキスト ウィンドウの量を測定できます。

この動作は、omitResponseConstraintInput オプションで回避できます。その場合は、プロンプトにガイダンスを含めることをおすすめします。

const result = await session.prompt(`
  Summarize this feedback into a rating between 0-5. Only output a JSON
  object { rating }, with a single property whose value is a number:
  The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });

モデルにプロンプトを入力する

prompt() 関数または promptStreaming() 関数を使用してモデルにプロンプトを送信できます。

リクエスト ベースの出力

短い結果が予想される場合は、レスポンスが利用可能になるとレスポンスを返す prompt() 関数を使用できます。

// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const available = await LanguageModel.availability({
  expectedInputs: [{type: 'text', languages: ['en']}],
  expectedOutputs: [{type: 'text', languages: ['en']}],
});

if (available !== 'unavailable') {
  const session = await LanguageModel.create();

  // Prompt the model and wait for the whole result to come back.
  const result = await session.prompt('Write me a poem!');
  console.log(result);
}

ストリーミングされた出力

長いレスポンスが予想される場合は、promptStreaming() 関数を使用する必要があります。この関数を使用すると、モデルから返された部分的な結果を表示できます。promptStreaming() 関数は ReadableStream を返します。

const available = await LanguageModel.availability({
  expectedInputs: [{type: 'text', languages: ['en']}],
  expectedOutputs: [{type: 'text', languages: ['en']}],
});
if (available !== 'unavailable') {
  const session = await LanguageModel.create();

  // Prompt the model and stream the result:
  const stream = session.promptStreaming('Write me an extra-long poem!');
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

プロンプトを停止する

prompt() と promptStreaming() の両方で、signal フィールドを含むオプションの 2 番目のパラメータを受け取ります。これにより、プロンプトの実行を停止できます。

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const result = await session.prompt('Write me a poem!', {
  signal: controller.signal,
});

セッション管理

各セッションは会話のコンテキストを追跡します。セッションのコンテキスト ウィンドウがいっぱいになるまで、以前のやり取りが今後のやり取りに考慮されます。

各セッションには、処理できるトークンの最大数があります。この上限に対する進捗状況を確認するには、次の操作を行います。

console.log(`${session.contextUsage}/${session.contextWindow}`);

コンテキスト ウィンドウがオーバーフローするプロンプトを送信できます。このような場合、新しいプロンプトを処理するのに十分なトークンが利用可能になるまで、言語モデルとの会話の最初の部分が 1 つのプロンプトとレスポンスのペアごとに削除されます。例外はシステム プロンプトで、削除されることはありません。

このようなオーバーフローは、セッションで contextoverflow イベントをリッスンすることで検出できます。

session.addEventListener("contextoverflow", () => {
  console.log("We've gone past the context window, and some inputs will be dropped!");
});

新しいプロンプトを処理するために会話履歴から十分なトークンを削除できない場合、prompt() または promptStreaming() の呼び出しは QuotaExceededError 例外で失敗し、何も削除されません。QuotaExceededError には次のプロパティがあります。

  • requested: 入力を構成するトークンの数
  • contextWindow: 使用可能なトークンの数

セッション管理の詳細を確認する。

セッションのクローンを作成する

リソースを保持するには、clone() 関数を使用して既存のセッションをコピーします。これにより、会話のフォークが作成され、コンテキストと最初のプロンプトが保持されます。

clone() 関数は、signal フィールドを含むオプションの options オブジェクトを受け取ります。これにより、AbortSignal を渡してクローンされたセッションを破棄できます。

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

const clonedSession = await session.clone({
  signal: controller.signal,
});

セッションを終了する

セッションが不要になった場合は、destroy() を呼び出してリソースを解放します。セッションが破棄されると、そのセッションは使用できなくなり、進行中の実行は中止されます。セッションの作成には時間がかかることがあるため、モデルに頻繁にプロンプトを送信する場合は、セッションを保持することをおすすめします。

await session.prompt(
  "You are a friendly, helpful assistant specialized in clothing choices."
);

session.destroy();

// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
  "What should I wear today? It is sunny, and I am choosing between a t-shirt
  and a polo."
);

デモ

Prompt API のさまざまなユースケースを試すために、複数のデモを構築しました。次のデモはウェブ アプリケーションです。

Chrome 拡張機能で Prompt API をテストするには、デモ拡張機能をインストールします。拡張機能のソースコードは GitHub で入手できます。

パフォーマンス戦略

ウェブ用の Prompt API はまだ開発中です。この API の構築中は、最適なパフォーマンスを得るためにセッション管理のベスト プラクティスをご覧ください。

権限ポリシー、iframe、ウェブワーカー

デフォルトでは、Prompt API はトップレベル ウィンドウと、その同一オリジンの iframe でのみ使用できます。Permission Policy の allow="" 属性を使用して、API へのアクセスをクロスオリジンの iframe に委任できます。

<!--
  The hosting site at https://main.example.com can grant a cross-origin iframe
  at https://cross-origin.example.com/ access to the Prompt API by
  setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>

権限ポリシーのステータスを確認するために各ワーカーに責任あるドキュメントを確立する複雑さのため、現時点ではウェブワーカーで Prompt API を使用できません。

参加してフィードバックを共有する

お送りいただいた回答は、この API とすべての組み込み AI API の今後のバージョンの構築と実装に直接反映させていただきます。