GEMINI LABEN
PRICE — Gemini 3.6 Flash は出力トークンが $9.00/1M から $7.50/1M へ下がりました。入力は $1.50/1M で据え置きのため、長い出力を伴う処理ほど差が出ますDEFAULT — Managed Agents の Antigravity エージェントを動かす既定モデルが 3.6 Flash になりました。モデルを明示していない構成は挙動が変わり得ますVERBOSE — 3.6 Flash は「出力が冗長すぎる」という 3.5 Flash への指摘に応える形で、トークン効率とエージェント的な計画立案を改善していますGROK — Gemini Enterprise Agent Platform 上の Grok 4.1 モデルファミリーが非推奨となり、8月20日に停止しますCLASSROOM — 8月10日から、管理者が許可済みであれば K-12 と高等教育の全学齢の学生が Gemini in Classroom を使えます。教材をフラッシュカードや練習クイズへ変換できますPIXEL — 8月12日のイベントで Pixel 11 のハードウェア詳細と、エコシステム全体の AI 機能に関する発表が見込まれていますPRICE — Gemini 3.6 Flash は出力トークンが $9.00/1M から $7.50/1M へ下がりました。入力は $1.50/1M で据え置きのため、長い出力を伴う処理ほど差が出ますDEFAULT — Managed Agents の Antigravity エージェントを動かす既定モデルが 3.6 Flash になりました。モデルを明示していない構成は挙動が変わり得ますVERBOSE — 3.6 Flash は「出力が冗長すぎる」という 3.5 Flash への指摘に応える形で、トークン効率とエージェント的な計画立案を改善していますGROK — Gemini Enterprise Agent Platform 上の Grok 4.1 モデルファミリーが非推奨となり、8月20日に停止しますCLASSROOM — 8月10日から、管理者が許可済みであれば K-12 と高等教育の全学齢の学生が Gemini in Classroom を使えます。教材をフラッシュカードや練習クイズへ変換できますPIXEL — 8月12日のイベントで Pixel 11 のハードウェア詳細と、エコシステム全体の AI 機能に関する発表が見込まれています
記事一覧/開発ツール
開発ツール/2026-08-05中級

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

録画済みAPIレスポンスで回るテストスイートは、モデル停止をすり抜けます。6件全部緑のまま404になる構造を最小構成で再現し、cassette走査のfreshness gateを実装・実測しました。

Gemini API203pytest3テスト設計モデル停止CI6

プレミアム記事

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

関連記事

API / SDK2026-06-29
Gemini APIのレスポンスをCIで守る — スナップショットと意味的回帰の検知設計
生成AIの非決定的なレスポンスを、pytestのスナップショットテストとembeddingベースの意味的回帰検知で守る実装手順。CI組み込み・flakyと本物の回帰の切り分け・スナップショット更新のガバナンスまでを実コードで解説します。
開発ツール2026-07-25
gemini-flash-latest への追従をやめた日 — モデルの静かな置き換えに耐えるバッチ設計
発表を伴わないモデル更新で、安定していたバッチの拒否率が一晩で4倍を超えました。gemini-flash-latest への追従をやめ、ピン留めとカナリア昇格の二段構えに移行するまでの実測と設計判断をまとめております。
開発ツール2026-07-18
難読化されたスタックトレースを Gemini に渡していました — retrace を前段に置くまで、診断はもっともらしく外れ続けます
release ビルドのスタックトレースは R8 で名前が潰れています。それをそのまま Gemini に渡すと、診断は落ち着いた文体のまま外れます。retrace を前段に置き、mapping を versionCode で突合し、復元できないときは断定させない。42件で数え直した記録です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →