GEMINI LABEN
SHUTDOWN — gemini-robotics-er-1.6-preview は本日8月31日で停止します。preview 接尾辞のモデルに依存したコードは、今日を境に動かなくなりますDEPRECATION — 次の期限は9月30日です。gemini-omni-flash-preview エンドポイントが廃止され、8月27日に GA となった gemini-omni-1.1-flash への差し替えが必要になりますVIDEO — Omni 1.1 Flash の GA には extend タスクによる動画の延長と、image_to_video に画像を2枚渡して間を補間する生成が入りました。始点と終点を先に決められますVIDEO — video_config の resolution が 360p・720p(既定)・1080p・4k に対応しました。1080p と 4K はアップスケールによる出力だと明記されていますSPEECH — gemini-3.5-transcribe が8月26日に GA。85言語以上の発話単位の言語検出、話者ダイアライゼーション、単語レベルのタイムスタンプ、最大1,000語のカスタム語彙に対応しますSPEECH — gemini-3.5-transcribe-live は Live API 上の WebSocket 双方向ストリーミングです。暫定と確定の文字起こしイベント、Smart transcription、複数の VAD 設定を持ちますSHUTDOWN — gemini-robotics-er-1.6-preview は本日8月31日で停止します。preview 接尾辞のモデルに依存したコードは、今日を境に動かなくなりますDEPRECATION — 次の期限は9月30日です。gemini-omni-flash-preview エンドポイントが廃止され、8月27日に GA となった gemini-omni-1.1-flash への差し替えが必要になりますVIDEO — Omni 1.1 Flash の GA には extend タスクによる動画の延長と、image_to_video に画像を2枚渡して間を補間する生成が入りました。始点と終点を先に決められますVIDEO — video_config の resolution が 360p・720p(既定)・1080p・4k に対応しました。1080p と 4K はアップスケールによる出力だと明記されていますSPEECH — gemini-3.5-transcribe が8月26日に GA。85言語以上の発話単位の言語検出、話者ダイアライゼーション、単語レベルのタイムスタンプ、最大1,000語のカスタム語彙に対応しますSPEECH — gemini-3.5-transcribe-live は Live API 上の WebSocket 双方向ストリーミングです。暫定と確定の文字起こしイベント、Smart transcription、複数の VAD 設定を持ちます
記事一覧/開発ツール
開発ツール/2026-08-30上級

モデル廃止日をまたぐ古い端末に、読み替えではなく拒否を返す設計

モデルが止まっても、配布済みのアプリは止まりません。後継へ黙って差し替えるか、明示的に断るか。出力契約を軸に廃止台帳を作り、残存曲線から自分の締切日を逆算するまでの実装と計測をまとめました。

Gemini API226モデル廃止2個人開発111リリース運用2HTTP

プレミアム記事

Crashlytics で上がってきたクラッシュの、スタックトレースの一番上が表示直前の変換関数でした。ネットワーク層でも、レスポンスの復号でもありません。カテゴリ名を画面のラベルへ移す、十数行の関数です。

原因は、その関数から遠く離れた場所にありました。サーバー側で古いモデル ID を後継へ読み替えていて、後継が返すカテゴリ体系が増えていたのです。

読み替えは親切のつもりでした。廃止されたモデルを指したリクエストが 410 で落ちるより、後継につないだほうが動き続けます。実際、ほとんどのリクエストは動き続けていました。だから見つからなかったのだと、後になって理解しました。

「ほとんど動く」がいちばん見つけにくい状態です

古いクライアントが期待していたカテゴリは6種類で、後継モデルは8種類を返すようになっていました。増えた2つは全体の一部にしか現れません。手元で分布を再現して数えてみます。

import json, random
 
V12 = {"nature","abstract","city","animal","art","minimal"}          # 旧クライアントの体系
V20 = list(V12) + ["japanese","texture"]                              # 後継モデルの体系
 
def client_v12_parse(body):
    obj  = json.loads(body)                                           # 層1: 転送と JSON
    text = obj["candidates"][0]["content"]["parts"][0]["text"]
    rec  = json.loads(text)                                           # 層2: 構造化出力
    if rec["category"] not in V12:                                    # 層3: 表示直前の変換
        raise ValueError("unknown category: %s" % rec["category"])
    return rec["category"]
 
def make_response(category):
    inner = json.dumps({"category": category, "confidence": 0.9})
    return json.dumps({"candidates":[{"content":{"parts":[{"text": inner}]}}]})
 
random.seed(20260830)
sample = [random.choices(V20, weights=[22,18,14,12,10,10,9,5])[0] for _ in range(1000)]
 
ok = enum_err = 0
for c in sample:
    try:
        client_v12_parse(make_response(c)); ok += 1
    except ValueError:
        enum_err += 1
print(ok, enum_err)      # -> 849 151

1,000件のうち849件は通ります。壊れるのは151件、約15%です。

全部壊れるほうが、まだ扱いやすかったと思います。15%であれば、ユーザーからは「たまに分類されない」としか見えません。私の側では、リリース直後の変更が疑われます。実際に変わったのはサーバー側の読み替え設定で、アプリのコードは一行も動いていませんでした。

例外が出る場所に、モデル ID は現れません

もう一つ厄介なのは、例外が上がる場所です。同じコードを実際に落として、フレームを並べてみます。

import traceback, sys
try:
    client_v12_parse(make_response("japanese"))
except Exception:
    for i, f in enumerate(traceback.extract_tb(sys.exc_info()[2])):
        print("frame%d: %s() line %d" % (i, f.name, f.lineno))
# frame0: <module>()          line 24
# frame1: client_v12_parse()  line 12

実際のアプリではこの間にビューモデルの生成が挟まりますから、報告される関数はさらに表示側へ寄ります。どの経路をたどっても、送信したモデル ID はスタックのどこにも現れません。

クラッシュの分類を自動化していても同じです。文字列としてのスタックトレースには、廃止されたモデルを指し続けていた事実が残っていないのですから。原因が API 側にあるとき、報告される場所は必ず遠くなります。

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

この記事の続きを読む

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

この記事で得られること
後継モデルへ黙って差し替えてよい条件を、モデルの系譜ではなく出力契約の側から決められるようになり、廃止日のあとで原因の見えない不具合を抱え込まずに済みます
配布済みアプリの残存を見込んで、公表された廃止日から自分側の締切日を逆算し、リリース計画に置けるようになります
静かな読み替えでは1,000件のうち849件がそのまま通ってしまう計測結果から、なぜ発見が遅れるのかをチームや自分自身に説明できるようになります
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-08-22
段階公開を止める判断だけは、Gemini に渡さないことにしました
段階公開の初日に見えるクラッシュ率には、良し悪しを判定できるだけの母数がありません。止める・進める・まだ言えないの3状態に分け、Gemini にはレビュー本文の帰属判定だけを任せた配線を残します。
開発ツール2026-08-24
Gemini の訳文で %1$s が消えても、レビューでは気づけません。文字列リソースへ戻す前の検査
Gemini に訳させたアプリの文字列から書式指定子が抜けたり全角になったりする事象を、実運用の中で拾い続けています。壊れ方を4種類に整理し、生成時に守らせる書き方と、受け取った直後に弾く短い検査を紹介します。
開発ツール2026-08-20
Gemini に書かせたレビュー返信を、送信前に止めるための最小の検査
ストアのレビュー返信は下書きより送信後が怖い作業です。守れない約束・連絡先の混入・文体崩れを送信前に機械で止める Python の検査を、実際に走らせた結果と誤検出の修正まで含めて置いておきます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →