Prompt API

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

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

Prompt API を使用すると、ブラウザで Gemini Nano に自然言語リクエストを送信できます。

Prompt API の使用方法は多岐にわたります。たとえば、次のようなものを構築できます。

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

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

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

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

言語検出 API翻訳 API は、パソコン版 Chrome で動作します。これらの API はモバイル デバイスでは動作しません。

Prompt APISummarizer APIWriter APIRewriter APIProofreader API は、次の条件を満たす場合に Chrome で動作します。

  • オペレーティング システム: Chromebook Plus デバイスで Windows 10 または 11、macOS 13 以降(Ventura 以降)、Linux、ChromeOS(プラットフォーム 16389.0.0 以降)。Chromebook Plus 以外のデバイスの Android 版 Chrome、iOS 版 Chrome、ChromeOS 版 Chrome は、Gemini Nano を使用する 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 を初めて使用するときに個別にダウンロードされます。この API を使用する前に、Google の生成 AI の使用禁止に関するポリシーを確認してください。

モデルが使用可能かどうかを確認するには、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 の場合は、ダウンロードに時間がかかる可能性があるため、ダウンロードの進行状況をリッスンしてユーザーに通知します。

localhost で使用する

組み込みの AI API はすべて、Chrome の localhost で利用できます。次のフラグを [有効] に設定します。

  • chrome://flags/#optimization-guide-on-device-model
  • chrome://flags/#prompt-api-for-gemini-nano-multimodal-input

[再起動] をクリックするか、Chrome を再起動します。エラーが発生した場合は、localhost のトラブルシューティングを行ってください。

モデル パラメータ

params() 関数は、言語モデルのパラメータを通知します。オブジェクトには次のフィールドがあります。

  • defaultTopK: デフォルトの top-K 値。
  • maxTopK: 最大上位 K 値。
  • defaultTemperature: デフォルトの温度
  • maxTemperature: 最高気温。
// Only available when using the Prompt API for Chrome Extensions.
await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}

セッションを作成する

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

const session = await LanguageModel.create();

Chrome 拡張機能用の Prompt API を使用してセッションを作成する

Chrome 拡張機能の Prompt API を使用する場合、各セッションはオプションのオプション オブジェクトを使用して topKtemperature でカスタマイズできます。これらのパラメータのデフォルト値は LanguageModel.params() から返されます。

// Only available when using the Prompt API for Chrome Extensions.
const params = await LanguageModel.params();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
// Only available when using the Prompt API for Chrome Extensions.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(params.defaultTemperature * 1.2, 2.0),
  topK: params.defaultTopK,
});

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

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

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

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

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

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"-role メッセージに 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 にはマルチモーダル機能があり、複数の言語をサポートしています。セッションの作成時に、expectedInputsexpectedOutputs のモダリティと言語を設定します。

  • type: 期待されるモダリティ。
    • expectedInputs の場合、textimageaudio のいずれかになります。
    • expectedOutputs の場合、Prompt API は text のみを許可します。
  • languages: 期待される言語を設定する配列。Prompt API は "en""ja""es" を受け入れます。他の言語のサポートは開発中です。
    • 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 スキーマまたは正規表現を含めることができます。これは、コンテキスト ウィンドウの一部を使用します。session.measureContextUsage()responseConstraint オプションを渡すことで、コンテキスト ウィンドウの使用量を測定できます。

この動作は、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 フィールドを含むオプションのオブジェクトをオプションで受け取ります。これにより、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 を構築する間は、最適なパフォーマンスを実現するために、セッション管理に関するベスト プラクティスを参照してください。

Permission Policy、iframe、Web Worker

デフォルトでは、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 は Web Workers で利用できません。

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

皆様からのご意見は、この API とすべての組み込み AI API の将来のバージョンを構築して実装する方法に直接影響します。