◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/開発ツール
⟐ 開発ツール/2026-03-21上級

Gemini Nano が手元で動かないとき — Chrome と Android で入口が違います

Gemini Nano のサンプルを貼っても動かないことがあります。Chrome は ai.* 名前空間から LanguageModel へ移り、Android の入口は ML Kit GenAI です。現行の書き方と端末側の要件を整理しました。

Gemini NanoオンデバイスAIChrome Built-in AIML KitAndroid12

✦ プレミアム記事

オフラインでも要約が動けば、電波の届かない場所でも使ってもらえます。そう考えて Chrome のコンソールに手元のサンプルを貼り付けた日、返ってきたのは一行だけでした。

Uncaught ReferenceError: ai is not defined

綴りを疑い、フラグを確認し、Chrome を再起動しました。原因はそのどれでもありませんでした。ai という名前空間そのものが、もう存在しなかったのです。

Gemini Nano は「軽量な Gemini」と説明されることが多いのですが、実際につまずくのはモデルの性能ではありません。入口の選択と、モデルがまだ端末に無いかもしれない、という前提の扱い方です。この2点を外すと、どれだけ正しいプロンプトを書いても一行も実行されません。

Chrome と Android、それぞれの現在地を整理します。

ai.languageModel はもう存在しません

初期の Chrome Built-in AI は ai や window.ai というグローバルの下に各機能がぶら下がる設計でした。ネット上に残るサンプルの多くは、この時期のものです。

現在は、機能ごとに独立したグローバルクラスへ移りました。

// 旧: ai is not defined で落ちます
const session = await ai.languageModel.create({
  systemPrompt: "あなたは親切なアシスタントです。"
});
 
// 現行: グローバルの LanguageModel を直接呼びます
const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'あなたは親切なアシスタントです。簡潔に回答してください。' }
  ]
});

システムプロンプトの渡し方も変わりました。systemPrompt という専用フィールドではなく、initialPrompts の先頭に role: 'system' のメッセージを置きます。会話の履歴を復元したいときも同じ配列に user と assistant を並べるだけで済むので、こちらのほうが素直だと感じます。

要約も同様です。

// 旧
const summarizer = await ai.summarizer.create({ type: "tl;dr" });
 
// 現行
const summarizer = await Summarizer.create({
  type: 'tldr',          // tldr / key-points / teaser / headline
  length: 'short',
  format: 'plain-text',
});

type の値が "tl;dr" から 'tldr' へ変わっている点は見落としやすいところです。ここを直さずに名前空間だけ直すと、今度は無効なオプションで弾かれます。

各 API の提供状況も、ひとまとめに「Chrome に入った」と言える段階ではありません。2026年7月時点では次のように分かれています。

APIWeb ページからChrome 拡張から
Translator / Language DetectorChrome 138 で安定版Chrome 138 で安定版
SummarizerChrome 138 で安定版Chrome 138 で安定版
PromptChrome 148 で安定版Chrome 138 で安定版
Writer / Rewriterデベロッパートライアルデベロッパートライアル
Proofreaderデベロッパートライアルデベロッパートライアル

注目したいのは Prompt API の行です。Chrome 拡張からは 138 で安定版になった一方、通常の Web ページから使えるようになったのは 148。同じ API でも、拡張とページで解禁時期が10バージョン離れていました。「拡張で動いたコードをそのままページに移したら動かない」という現象は、この差から生まれます。

Writer と Rewriter を製品の中核機能に据えるのは、まだ早いと私は考えています。デベロッパートライアル段階の API は、仕様変更の可能性を織り込んだ上で使うものです。詳細は Chrome の Built-in AI API ステータス一覧 が正本になります。

availability() を挟まないと create() は落ちます

名前空間を直しても、まだ動かないことがあります。次に見るのはここです。

Gemini Nano は Chrome に同梱されていません。API はブラウザに組み込まれていますが、モデルは初回利用時にオリジンごとに別途ダウンロードされます。つまり、あなたのコードが走る瞬間、端末にモデルが無い可能性が常にあります。

そのため、現行の API は「使う前に状態を尋ねる」ことを前提にした形になっています。

// 1. 状態を確認する
//    prompt() に渡すのと同じオプションを availability() にも渡すのが重要です
const availability = await LanguageModel.availability({
  expectedInputs: [{ type: 'text', languages: ['ja'] }],
  expectedOutputs: [{ type: 'text', languages: ['ja'] }],
});
 
if (availability === 'unavailable') {
  // 端末要件を満たしていません。クラウドへ回すか、機能を隠します
  return fallbackToCloud();
}
 
// 2. ユーザー操作を起点にダウンロードを開始する
//    availability が 'downloadable' のとき、create() はユーザー操作が必要です
downloadButton.addEventListener('click', async () => {
  const session = await LanguageModel.create({
    monitor(m) {
      m.addEventListener('downloadprogress', (e) => {
        progressBar.value = e.loaded * 100;
      });
    },
  });
 
  // 3. ここでようやく実行できます
  const result = await session.prompt('この記事を3行で要約してください。');
  console.log(result);
});

ここで見落とされがちなのが2つあります。

ひとつは availability() と prompt() に同じオプションを渡すこと。言語やモダリティの組み合わせによっては非対応のことがあり、オプションを揃えないと「利用可能」と答えが返ったのに実行時に NotSupportedError が飛ぶ、という食い違いが起きます。

もうひとつは ユーザー操作(user activation)の要件です。ページ読み込み直後に create() を呼ぶコードは、モデル未ダウンロードの端末で必ず失敗します。数 GB のダウンロードが、ユーザーの同意なく始まらないようにするための仕様です。開発機ではすでにモデルが入っているため通ってしまい、この失敗は本番で初めて表面化します。

個人開発でひとりで検証していると、この2つを飛ばしたコードを「動いた」と判断しかけます。私自身、そうなりかけました。手元の Chrome にモデルが、すでに入っていただけだったのです。オンデバイス AI の検証では、モデルが無い端末での初回体験こそが本番だと考えるようになりました。

なお availability() が返すのは 'unavailable'・'downloadable'・'downloading'・'available' の4状態です。真偽値ではないので、if (availability) のような書き方をすると 'unavailable' を通してしまいます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦確認 → ダウンロード → 実行の3段を守る、現行 Chrome / Android の実装パターン
✦手元の1台で測った初回ダウンロードと推論のレイテンシ、クラウド往復との比較
✦QuotaExceededError やモデル削除に負けず、必ずクラウドへ戻れる例外分岐の書き方
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ 開発ツール2026-08-21
アシスタント前提の記述が、自分のアプリに何箇所残っているか
9月4日から Android の Google アシスタントが Gemini へ置き換わります。自分のアプリのどこがアシスタント経由で開かれる入口なのかを grep で洗い出し、実機で確かめる発話まで用意する手順をまとめました。
⟐ 開発ツール2026-10-14
クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep して、GEMINI.md には索引だけ置く
アプリのクラッシュ報告を調べるとき、過去の不具合の全文を毎回読ませずに済ませる運用です。ID から 1 行を引く早見表と、GEMINI.md に置く範囲の決め方、そのまま使える grep 関数をまとめました。
⟐ 開発ツール2026-10-06
Veo 3.1 の preview 3種が 10/22 に止まります。差し替えの前に、呼び出し箇所の棚卸しから始めました
Veo 3.1 の preview 3種は 10/22 に提供終了、移行先は gemini-omni-1.1-flash です。モデル名を置換する前に、リポジトリ内の呼び出し箇所を洗い出す検索スクリプトと、期日を過ぎたら黙って別モデルへ流れずに止まる設定の書き方をまとめます。