GEMINI LABEN
0.60.0 — Gemini CLI の今回の更新は、ほぼ全件が拡張と MCP の境界の締め直しです。環境変数を変える拡張には同意を求めるようになりました09/30 — gemini-omni-flash-preview の停止まで残り12日です。後継は gemini-omni-1.1-flash で、呼び出し箇所の棚卸しから始めますLICENSE — 手順どおりに設定していたのに、ある日から「有効なライセンスがありません」で起動できない、という報告が二つのスレッドで続いていますNEW — Gem が相手の一覧に出ないとき、止まっている場所は三つあります。見る順番を決めておきますPDF — 大きすぎると言われた資料は、分ける前に何を削るかを決めるほうが早く済みますADC — Antigravity の Enterprise では ADC 経由で Gemini 3.8 Flash を選べます。同じモデルでも入口によって扱いが変わります0.60.0 — Gemini CLI の今回の更新は、ほぼ全件が拡張と MCP の境界の締め直しです。環境変数を変える拡張には同意を求めるようになりました09/30 — gemini-omni-flash-preview の停止まで残り12日です。後継は gemini-omni-1.1-flash で、呼び出し箇所の棚卸しから始めますLICENSE — 手順どおりに設定していたのに、ある日から「有効なライセンスがありません」で起動できない、という報告が二つのスレッドで続いていますNEW — Gem が相手の一覧に出ないとき、止まっている場所は三つあります。見る順番を決めておきますPDF — 大きすぎると言われた資料は、分ける前に何を削るかを決めるほうが早く済みますADC — Antigravity の Enterprise では ADC 経由で Gemini 3.8 Flash を選べます。同じモデルでも入口によって扱いが変わります
記事一覧/開発ツール
開発ツール/2026-08-05中級

テストは緑のまま、本番だけが止まる — 録画フィクスチャがモデル停止を隠す構造と freshness gate

録画済み API レスポンスで回るテストは、モデル停止をすり抜けます。テストが全部緑のまま本番だけ404になる構造を最小構成で再現し、pytest 起動前に cassette を検疫する freshness gate の実装、走査コストの実測、しきい値の決め方をまとめました。

Gemini API239pytest3テスト設計モデル停止CI7

プレミアム記事

8月の停止予定を並べた changelog を眺めたあと、手元のテストスイートを走らせてみました。6件すべて緑、0.11秒。その緑の下に、8月17日に停止するモデルの録画レスポンスが3本眠っていました。

個人開発のアプリで画像生成パイプラインを検討している私の環境では、Gemini API のテストをすべて録画済みレスポンス(cassette)の再生で回しております。課金を伴うAPIをCIのたびに叩きたくないので、これは真っ当な設計のはずでした。ただ、モデルの停止という失敗クラスに限っては、この設計そのものが検知を妨げる側に回ります。

テストが通ることと、来週も本番が動くことは、別の命題です。この2つを繋ぎ直す小さな仕組みを作り、手元で数字を取りました。

8月に止まるものと、モックが原理的に検知しないもの

まず前提の整理です。2026年8月は停止・撤去が集中しています。

対象期日影響
Imagen 4 系(imagen-4.0-generate-001 / ultra / fast)・Gemini 3 Image 系2026-08-17 停止画像生成パイプラインは移行必須
Gemini Enterprise Agent Platform 上の Grok 4.1 ファミリー2026-08-20 停止該当エージェント構成の差し替え
gemini-robotics-er-1.6-preview2026-08-31 停止プレビュー依存の経路は代替が必要
Gemini Enterprise(global リージョン)の 3.5 Flash2026-08-04 撤去済みモデル一覧から選択肢が消える

期日と対象は変わり得るため、実作業の前にモデルの非推奨スケジュールで一次情報を確認してください。

ここで問題になるのが、テストの作りです。録画レスポンスの再生・SDKのモック・スタブサーバー — 呼び名は何であれ、これらは「ネットワークの向こう側を固定する」ための仕組みです。レイテンシの揺れも、レートリミットも、そしてモデルの停止も、固定した瞬間にテストの観測範囲から消えます。

つまりモデル停止は、モックが隠すために設計された失敗クラスに、ちょうど嵌まる形をしています。カバレッジを上げるほど検知が遅れるという、嫌な逆相関です。

緑のまま止まる構造を、最小構成で再現する

言葉で説明するより、動くもので示した方が早いはずです。壁紙アプリの画像生成を想定した最小クライアントを書きました。

# client.py
import os
import requests
 
BASE_URL = "https://generativelanguage.googleapis.com/v1beta"
 
class GeminiImageClient:
    def __init__(self, model: str, api_key: str | None = None, base_url: str = BASE_URL):
        self.model = model
        self.api_key = api_key or os.environ.get("GEMINI_API_KEY", "")
        self.base_url = base_url  # テスト時にスタブへ向け替えるための注入口
 
    def generate(self, prompt: str, aspect_ratio: str = "9:16") -> dict:
        url = f"{self.base_url}/models/{self.model}:predict"
        resp = requests.post(
            url,
            params={"key": self.api_key},
            json={"instances": [{"prompt": prompt}],
                  "parameters": {"sampleCount": 1, "aspectRatio": aspect_ratio}},
            timeout=30,
        )
        resp.raise_for_status()
        return resp.json()

テスト側は、録画したレスポンスをJSONで持ち、requests.post を差し替えて再生します。

# tests/conftest.py(再生部分)
import json
import pathlib
import pytest
 
CASSETTE_DIR = pathlib.Path(__file__).parent / "cassettes"
 
class _FakeResponse:
    def __init__(self, payload, status=200):
        self._payload = payload
        self.status_code = status
    def raise_for_status(self):
        if self.status_code >= 400:
            import requests
            raise requests.HTTPError(f"{self.status_code}")
    def json(self):
        return self._payload
 
@pytest.fixture
def replay(monkeypatch):
    def _use(cassette_name):
        data = json.loads((CASSETTE_DIR / cassette_name).read_text())
        def fake_post(url, **kwargs):
            return _FakeResponse(data["response"], data.get("status", 200))
        monkeypatch.setattr("requests.post", fake_post)
        return data
    return _use

cassette には録画日時とリクエスト情報を残しておきます。この設計判断があとで効いてきます。

{
  "recorded_at": "2026-06-20T09:12:44+09:00",
  "request": {
    "model": "imagen-4.0-fast-generate-001",
    "endpoint": ":predict",
    "parameters": {"sampleCount": 1, "aspectRatio": "9:16"}
  },
  "response": {
    "predictions": [{"bytesBase64Encoded": "iVBORw...", "mimeType": "image/png"}],
    "modelVersion": "imagen-4.0-fast-generate-001"
  }
}

この構成で、生成結果の検証・アスペクト比・バッチ生成・セーフティフィルタ時の空応答など6件のテストを書きました。VM(Python 3.10.12)での結果は次の通りです。

$ python3 -m pytest tests/ -q
......                                                                   [100%]
6 passed in 0.11s

全部緑です。一方で、録画元の imagen-4.0-fast-generate-001 は8月17日に停止します。停止後の実APIの挙動は手元ではまだ確認できないため、既に停止済みの旧モデル群が返す NOT_FOUND の形状を再現したローカルスタブを立てて対比しました。

imagen-4.0-fast-generate-001: HTTPError 404 Client Error: Not Found (4.1ms)
gemini-3.1-flash-lite-image:  OK modelVersion=gemini-3.1-flash-lite-image (2.2ms)

テストは0.11秒で全部通り、同じコードの実呼び出しは404で落ちる。この乖離が「緑のまま止まる」の正体です。停止済みモデルへ実際にリクエストを投げ続けるとどうなるかは、以前停止済みモデルの再試行は、成功レイテンシには出ませんでしたで実測しております。恒久エラーは平常時のメトリクスに映りにくく、そちらでも観測の穴になりがちでした。

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

この記事の続きを読む

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

この記事で得られること
6件すべて緑のテストスイートの下で、8月17日停止予定モデルへの依存が検知されない構造を最小構成で再現(クライアント・再生conftest・cassetteのコード全文つき)
pytest起動前に挟むcassette freshness gateの完全実装 — 200件の走査が中央値7.1msで済むことをVMで実測(n=50)
停止3週間前からfailさせるWARN_DAYSと再録画期限MAX_AGE_DAYSの決め方、既存スイートを壊さない段階導入の手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-06-29
Gemini APIのレスポンスをCIで守る — スナップショットと意味的回帰の検知設計
生成AIの非決定的なレスポンスを、pytestのスナップショットとembeddingによる意味的回帰検知で守る実装手順。録画再生のCI組み込み、カセット鮮度を守る週次ライブスモーク、フィールド単位の劣化内訳、しきい値設計と更新ガバナンスまでを実コードで示します。
開発ツール2026-09-10
浮世絵カタログの表記ゆれ照合を、正規化と候補列挙の二層で組む手順
同じ絵師名が三通りに散らばったカタログを揃えるとき、Gemini に同一判定をさせると世代違いが混ざります。正規化を先に置き、モデルには候補の列挙だけを頼む二層構成を、動くコードと費用の見積もりつきでお伝えします。
開発ツール2026-09-06
アイコンだけのボタンは、翻訳が揃っていても読み上げでは無言になります
翻訳ファイルが揃っていても、読み上げラベルの穴は残ります。iOS と Android からアイコン要素とラベルを集め、機械で決まる不備をローカルで確定させてから Gemini に文言だけを渡す二段構えを、実際の出力とともに書き残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます