◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り7日。移行先は 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 に停止、残り7日。移行先は 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-08-30上級

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

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

Gemini API248モデル廃止3個人開発121リリース運用HTTP

✦ プレミアム記事

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/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ 開発ツール2026-08-22
段階公開を止める判断だけは、Gemini に渡さないことにしました
段階公開の初日に見えるクラッシュ率には、良し悪しを判定できるだけの母数がありません。止める・進める・まだ言えないの3状態に分け、Gemini にはレビュー本文の帰属判定だけを任せた配線を残します。
⟐ 開発ツール2026-09-10
浮世絵カタログの表記ゆれ照合を、正規化と候補列挙の二層で組む手順
同じ絵師名が三通りに散らばったカタログを揃えるとき、Gemini に同一判定をさせると世代違いが混ざります。正規化を先に置き、モデルには候補の列挙だけを頼む二層構成を、動くコードと費用の見積もりつきでお伝えします。
⟐ 開発ツール2026-08-24
Gemini の訳文で %1$s が消えても、レビューでは気づけません。文字列リソースへ戻す前の検査
Gemini に訳させたアプリの文字列から書式指定子が抜けたり全角になったりする事象を、実運用の中で拾い続けています。壊れ方を4種類に整理し、生成時に守らせる書き方と、受け取った直後に弾く短い検査を紹介します。