5 ポイント 投稿者 GN⁺ 1 일 전 | 1件のコメント | WhatsAppで共有
  • Chrome に組み込まれた Gemini Nano に自然言語のリクエストを送る Web API で、質疑応答・分類・コンテンツフィルタリング・予定抽出・連絡先抽出のような作業に活用できる
  • 利用前には 別途モデルのダウンロード が必要で、対応 OS・ストレージ容量・GPU または CPU メモリなどの 実行条件 を満たしている場合にのみ動作する
  • セッションは LanguageModel.availability() で利用可能かを確認したあと create() で準備し、initialPromptsappend()clone() でコンテキストを引き継いだり分岐させたりできる
  • 入力は text, image, audio を受け取れ、出力は現在 text のみをサポートし、prompt() は完成した応答を、promptStreaming() はストリーミング応答を返す
  • responseConstraint ベースの 構造化出力、コンテキストウィンドウ管理、権限ポリシー、マルチモーダル処理まで含め、ブラウザ内でオンデバイス AI を扱う実行モデルを提供する

概要

  • Chrome 内蔵の Gemini Nano に自然言語のリクエストを送る API として動作し、Web ページベースの質疑応答・記事分類・コンテンツフィルタリング・予定抽出・連絡先抽出といった活用が可能
  • モデルは Chrome に API が組み込まれていても 別途ダウンロード が必要で、初回利用前には Google の Generative AI Prohibited Uses Policy を確認する必要がある
  • 生成 AI の利用前には People + AI Guidebook の参照が推奨される
  • TypeScript の型定義は @types/dom-chromium-ai パッケージで取得できる
  • Chrome Extensions 開発者は、期限切れの origin trial 権限 aiLanguageModelOriginTrial を削除する必要がある

ハードウェアと実行条件

  • Prompt API・Summarizer API・Writer API・Rewriter API・Proofreader API は、Chrome で特定条件を満たした場合に動作する
  • 対応 OS は Windows 10/11、macOS 13+、Linux、ChromeOS で、ChromeOS は Chromebook Plus デバイスで Platform 16389.0.0 以上の場合に対応する
  • Chrome for Android、iOS、Chromebook Plus ではないデバイスの ChromeOS は、Gemini Nano ベースの API をまだサポートしていない
  • ストレージは Chrome プロファイルがあるボリュームに 最低 22GB の空き容量 が必要
  • モデル実行は GPU または CPU で可能
    • GPU には 4GB 超の VRAM が必要
    • CPU には 16GB 以上の RAM4 コア以上の CPU が必要
    • オーディオ入力を使う Prompt API には GPU が必要
  • ネットワークは初回モデルダウンロード時のみ 無制限または従量課金ではない 接続が必要
    • その後のモデル利用にはネットワーク接続は不要
    • モデル利用時、データは Google や第三者へ送信されない
  • モデルサイズはブラウザ更新に応じて変わる場合があり、現在のサイズは chrome://on-device-internals で確認できる
  • ダウンロード後に空き容量が 10GB 未満 になるとモデルはデバイスから削除され、再び条件を満たせば再ダウンロードされる

利用開始とモデル準備

  • 利用可否は LanguageModel.availability() で確認できる
  • availability() には、その後 prompt() または promptStreaming() に渡すものと 同じオプション を渡す必要がある
    • 一部モデルは特定のモダリティや言語をサポートしない場合があるため、オプション一致が重要
  • モデルのダウンロードとセッション作成は user activation を確認したうえで create() から開始する
  • ダウンロード中であれば進捗イベントを受け取り、ユーザーにダウンロード状況を知らせるべき
  • localhost では Chrome フラグを有効にすると組み込み AI API を利用できる
    • chrome://flags/#optimization-guide-on-device-model
    • chrome://flags/#prompt-api-for-gemini-nano-multimodal-input
    • その後、Relaunch または Chrome の再起動が必要
    • エラーが出る場合は localhost トラブルシューティング を参照できる

セッション作成と基本設定

  • セッションは LanguageModel.create() で作成される
  • Chrome Extensions 向け Prompt API では、セッションごとに topKtemperature をオプションで調整できる
    • デフォルト値と最大値は LanguageModel.params() で確認できる
    • この機能は Chrome Extensions または sampling parameters origin trial 利用時にのみ適用される
  • params()defaultTopK, maxTopK, defaultTemperature, maxTemperature を返す
  • 新しいセッション初期化時に topKtemperature両方指定するか、両方省略するか にしなければならない
  • create()signal フィールドで AbortSignal を受け取り、セッションを中断できる

コンテキストとプロンプト構成

  • initialPrompts で以前の会話コンテキストを入れることで、ブラウザ再起動後に保存されたセッションを引き継げる
  • プロンプト配列には system, user, assistant の役割を一緒に入れられる
  • 最後の assistant メッセージに prefix: true を付けると、応答の一部を 事前に埋めて 特定の出力形式を誘導できる
    • 例として TOML コードブロック開始文字列をあらかじめ入れ、出力形式を固定する
  • セッション作成後は append() で追加コンテキストを事前投入できる
    • initialPrompts と異なり、セッション作成後もコンテキストを蓄積できる
    • append() はプロンプトが検証・処理・追加されたあとに履行される
    • 追加できないプロンプトであれば promise は reject される

入出力モダリティと言語対応

  • セッション作成時に expectedInputsexpectedOutputs想定される入出力形式と言語 を設定できる
  • expectedInputstypetext, image, audio をサポートする
  • expectedOutputstype は現在 text のみ許可 されている
  • 言語は languages 配列で設定し、Prompt API は "en", "ja", "es" を受け付ける
    • 追加言語のサポートは開発中
    • 入力側には system prompt の言語と 1 つ以上の user prompt 言語を入れられる
    • 出力側には 1 つ以上の出力言語を入れられる
  • サポートされない入力または出力に遭遇すると "NotSupportedError" DOMException が発生する場合がある

マルチモーダル入力

構造化出力と制約

  • prompt() または promptStreaming()responseConstraintJSON Schema を入れることで構造化出力を利用できる
  • 関連機能は structured output で確認できる
  • 例では boolean スキーマを入れ、投稿が陶芸関連かどうかに true または false のみで答えさせている
  • 実装時には JSON Schema や正規表現をメッセージの一部として一緒に入れることもでき、その場合は context window の一部を使用する
  • session.measureContextUsage()responseConstraint オプションを渡すと、制約条件がコンテキストをどの程度使うか測定できる
  • omitResponseConstraintInput オプションを使うとこの動作を避けられる
    • この場合は、プロンプト内に望ましい出力形式の案内を一緒に入れることが推奨される

プロンプト実行方式

  • 短い応答が想定される場合は prompt() を使って 完成した結果 を一度に受け取れる
  • 長い応答が想定される場合は promptStreaming() を使って 部分結果をストリーミング で受け取れる
  • promptStreaming()ReadableStream を返す
  • prompt()promptStreaming() はどちらも第 2 引数で signal を受け取り、実行中のプロンプトを中断できる

セッション管理

  • 各セッションは会話の コンテキスト を保持し、以前のやり取りが後続の応答に反映される
  • 各セッションには処理可能な最大トークン数があり、session.contextUsagesession.contextWindow で現在の使用量と上限を確認できる
  • 新しいプロンプトでコンテキストウィンドウを超える場合、システムプロンプトを除いた会話の先頭部分が 質問・応答ペア単位 で削除され、空き領域を確保する
  • こうした状況はセッションの contextoverflow イベントで検知できる
  • 会話履歴を削除しても十分なトークンを確保できない場合、prompt() または promptStreaming()QuotaExceededError で失敗し、何も削除されない
    • requested: 入力が占めたトークン数
    • contextWindow: 利用可能だったトークン数
  • 詳細は session management を参照できる

セッション複製と終了

  • clone() で既存セッションをコピーし、会話の分岐 を作れる
  • 複製されたセッションは既存コンテキストと初期プロンプトを保持する
  • clone()signal フィールドで AbortSignal を受け取れる
  • セッションが不要になったら destroy() でリソースを解放できる
  • セッションが破棄されると以後は利用できず、進行中の実行も中断される
  • セッション作成には時間がかかることがあるため、頻繁にプロンプトを送る予定ならセッションを維持したほうがよい場合がある

権限ポリシーと実行環境の制約

  • デフォルトでは Prompt API は 最上位 window と同一 origin の iframe でのみ利用できる
  • cross-origin iframe には Permission Policy の allow="language-model" 属性でアクセス権を委譲できる
  • 現在 Prompt API は Web Workers では利用できない
    • 各 worker ごとに permissions policy の状態を確認する責任ドキュメントを定めるのが複雑なため

デモと参考資料

パフォーマンスとフィードバック

1件のコメント

 
GN⁺ 1 일 전
Hacker Newsの意見
  • このAPIは、私が長いこと考えていた de-snarkifier のアイデアにぴったり合いそう
    ソーシャルメディアは知的に刺激的で学べることもあるが、望まなくても イデオロギー的な言い争い やフレームウォーに吸い込まれやすい。ネットで知らない人と感情を消耗しながら争うのは、人間資本の浪費に近い
    こういうAPIがあれば、ブラウザ拡張で投稿を表示する前に攻撃的だったり皮肉っぽかったりする表現だけを和らげて、事実情報はそのまま保てるようにできそう。さらに進めて、攻撃的なトーンであるほど滑稽だったり無能っぽく聞こえるように変えてしまうこともできるかもしれない
    そうなれば読む側は見知らぬ他人の人格攻撃から守られ、書く側も無礼に振る舞う動機がなくなる。みんながこうしたフィルターを使えば、誰がより意地悪に振る舞うかを競う理由もなくなる

    • これは文章コミュニケーション版の Soylent みたい
      栄養は全部あるけれど、味は特に面白くないという感じ
    • こういうツールには本当に期待している。インターネットの 空っぽなカロリー を取り除いて、今の人気プラットフォームの利用が大きく減る可能性がある
      私が欲しいのは、クリックベイト見出し と広告を全部消して、乾いた事実ベースの見出しだけを見せること
      どんな話題でも、核となる記事が1本と実質的なコメントがいくつかあれば十分で、残りは大半が見たくない雑音だ
      今のソーシャルメディアの状態はひどすぎてほとんど使っておらず、HNだけが例外だったが、ここもAI飽和で似た方向に進んでいるように見える。それでも隔週くらいで数時間無駄にしてしまうので、それすら完全に断ちたい
      理想を言えば、コンテンツの98%をフィルタリングするか要約して消し去り、時間が経つほどインターネットは意図的に検索するときだけ使うものになってほしい。要するにインターネットの 娯楽性 を大半取り除いて、時間とエネルギーを現実や本のような高品質なソースに振り向けたい
    • YouTubeにはすでに似たものがあり、私は DeArrow を使っている
      この拡張はクラウドソーシングで扇情性を減らそうとするツールだが、上位貢献者の一部はLLMボットかもしれないという気がしている
    • 興味深いアイデアで、探ってみる価値がありそう
      ただ、こういうものは現実にぶつかると予測不能で、うまくいったとしても最初に想像したのとはかなり違う形で動く可能性が高い
    • 私はChromeの built-in AI APIs のPMだが、この de-snarkifier のアイデアは本当に気に入ったし、関心も広そうだ
      我慢できずに Snarknada のプロトタイプを急いで作り、低レイテンシなパターンと精度の可能性を合わせて見てみた
      こういう種類のユースケースでは オンデバイス が適していると考える理由はまさにここにある。無限スクロールのフィード全体をクラウドAPIで丸めようとすると、トークンコストが開発者にとって耐えがたいほど大きくなる。しかも個人フィードやDMのトーンを整えるために第三者サーバーへ送りたくないのも当然だ
      これをデバイス内に移せば、高頻度の Semantic Mutation がコスト面でも技術面でも初めて現実的になりうる。私の遊びのようなPMプロトタイプよりもっと本格的に作って、具体的な摩擦点が出てきたらぜひ聞かせてほしい。ロードマップの優先順位付けに役立つ
      [1]: コーディングエージェント(Cursor、Claude Codeなど)を使うなら、https://www.npmjs.com/package/built-in-ai-skills-md-agent-md を参照させることを勧める。多くのモデルは今では古くなった window.ai 名前空間で学習されているので、このスキルファイルが現行APIを正しく使う助けになる
  • このAPI設計を主導し、引退前に関連する 設計上の考慮事項 を整理した記事も書いておいた
    https://domenic.me/builtin-ai-api-design/

    • 短期と長期で、このAPIの ターゲットとなるユースケース をどう見ているのか気になる
      また、こうしたものを作る際に、ブラウザ同士でW3Cレベルではなく実務的に調整して共通点を合わせようとしているのかも気になる。結局この業界はかなり狭いので
    • ご引退おめでとうございます
  • これは実際に動いていて、私はすでに local inference 用途でリリースしたことがある
    検索のような低負荷なLLM作業では、いわば貧者のollamaのように使えた。最大の利点は 無料 でプライバシーを守れ、しかもユーザーがほとんど何もしなくてよいので、非技術ユーザーにローカル推論を提供するのに向いていることだ
    ただし実際のユーザー体験は良くない。モデルのダウンロードサイズはブラウザ本体より何桁も大きく、最初のトークンを受け取る前にその過程を終えなければならない
    これはOSが事前に焼き込まれたモデルを安定して提供し、このAPIがそこにぶら下がれるようになるまでは解決が難しそうだ

    • これは Prompt API を使うすべてのサイトで共有される1回限りのダウンロードだ
      より大きな問題は、たいていの一般的なPCではモデルが小さすぎて遅すぎること。infocomテキストアドベンチャー の文章をリアルタイムで変えようとしてみたが、今は多くのPCで遅すぎて実用的ではない
    • 次の大きな流れは、いっそ 5090を複数枚 積んで売るソフトウェア購読プレミアムなのかもしれない
    • MoEモデル なら、必要なときだけ専門家レイヤーをネットワークからHTTP range queryで取得できる
      bittorrentが複数ホストからファイル断片を受け取る方式に似ている。共通レイヤーは依然として受け取る必要があるが、最初のトークンまでの時間は全体サイズではなくアクティブサイズに比例させられる
      もちろんそうなると完全なオフライン推論ではないが、ブラウザのWeb機能であればそれは中核的な考慮事項ではないかもしれない
    • OSが 事前搭載モデル を安定して入れてくれる世界が来ないことを願う
    • 本当に良い
      ただ、モデルがブラウザよりはるかに大きく、最初のトークンの前にダウンロードが必要なら、これが 遅延ダウンロード を意味するのか気になる。最初に呼び出すユーザーはその場でダウンロードが終わるまで待たされるという話なら、ユーザー体験はかなりひどそうだ
      Chromeがダウンロード状態ダイアログのようなものを表示して混乱を減らすのか、またディスク使用量がどの程度なのかも知りたい
  • 見たところ、これは Gemini Nano を使っているようだが、最新の Gemma 4 E2B/E4B のほうがずっと良さそうなので、当面は拡張として量子化版を配布するほうがよいかもしれない

    • Gemini Nano-1: 46% MMLU, 1.8B
    • Gemini Nano-2: 56% MMLU, 3.25B
    • Gemma4 E2B: 60.0% MMLU, 2.3B
    • Gemma4 E4B: 69.4% MMLU, 4.5B
      出典:
    • https://huggingface.co/google/gemma-4-E2B-it
    • https://android-developers.googleblog.com/2024/10/gemini-nano-experimental-access-available-on-android.html
    • 今は内部事情を知らないが、私がこのチームにいた頃は最新の 小型Googleモデル をChromeに非常に速く入れていた
      Gemma 4やそれに対応するGemini NanoがまだChromeにないなら、すぐ入ると予想する
      そしてこの記事は2025-09-21に最後に更新されており、その時点ではすでに Gemini Nano 3 だった
    • その通り
      Prompt APIは、ブラウザ内の Gemini Nano に自然言語のリクエストを送る仕組みだと書かれている
    • Prompt APIはブラウザで利用可能なモデルを使う
      Edgeではおそらく Phi4 だろう
  • これは悪意ある JSスクリプト が何も知らない訪問者にトークン生成を押し付けるための良い手段にも見える
    より大きなプロンプトを細かく分割して複数のブラウザに送り、それぞれが小さな断片だけを処理する subagentパターン やRLMに似た構造で有用な結果を生むような分散化が可能かどうかも興味深い

    • 見返りに対して仕事が大きすぎるように見える
      技術的・事業的インフラも非常に複雑になるだろうし、わざわざユーザーのブラウザにプロンプトを押し付けたいなら、単に Chrome API をきちんと使うほうがよいのではないかと思う。こうした低性能モデルにサーバー側のプロンプトをオフロードして実際に有意義になるケースがどれほどあるのかも疑わしい
      しかも本当にそうしたいなら WebGPU もずっと前からあった
    • 小さなモデル のトークン生成程度にはほとんど価値がない
  • これはまともな Model API への一歩のように見えるが、まだ小さな一歩にすぎない
    Appleの Foundation Models も思い出される
    多くのAI統合はテキストコミュニケーションやチャットスタイルに集中しているが、実際には非テキストなインターフェースで恩恵を受けるソフトウェアも多い
    結局のところ、OSとブラウザがモデルを管理するAPIを提供し、アプリが単純なインターフェースでオンデバイスモデルとリモートモデルにアクセスできるようになるべきだと思う
    これがクロスプラットフォームで標準化されれば本当に良いし、モバイルまで含める必要があるので、現実的に強く押し進められるのは主にAppleとGoogleだろう。Metaが後に続くか、逆に先に動くかもしれないが
    要は 特定の宣伝用モデル専用 であってはならないということだ
    アプリは問い合わせて適切なモデルを選んで使えるべきだ
    (1) https://developer.apple.com/documentation/foundationmodels

    • Appleの Foundation Models は文書上は良く見えるが、実際には 4kコンテキストウィンドウ が引っかかる
      もちろんまだ初期段階ではあるが
  • https://github.com/mozilla/standards-positions/issues/1067

  • 私たちはこれを ハックデイの振り返り要約 に使っている
    https://remotehack.space/previous-hacks/
    RSSフィードを読み、本分向けの要約を生成する小さなスクリプトだが、静的サイトとかなり相性が良い。いつかは同じコンテンツに対して別の質問も投げられるように拡張したい

  • ブラウザからアクセス可能な ローカルLLM はプライバシー面では良いが、ブラウザごとにこのAPIの裏で動くモデルが違うなら、テストの悪夢は今よりひどくなりそうだ
    結局ほとんどの実装が Gemini Nano 基準に合わせられる可能性があり、それがユーザーをさらにChrome側へ引き寄せるのかも気になる

    • テスト 断片化 が本当に中核的な問題だ
      実際、プロンプトはモデル非依存ではないので、Gemini Nano 3 v2025向けに精密に調整したプロンプトがGecko側のモデルでは静かに性能低下する可能性がある。しかもAPIは分岐のための 能力検出 すら提供しない
      これは少なくとも拡張サポートの有無を問い合わせられたWebGLより悪い。名前もバージョンもブラウザの背後に隠れたモデルのプロンプト品質に依存して機能をリリースするのは、ユーザーがインストールした辞書しだいで機能が左右されるソフトウェアを出すようなものだ
  • Gemini Nano はGemmaと違ってオープンウェイトではないのではないかと思う
    誰かがすでにやっていれば別だが、モデルの重みをダンプしてみたい