GEMINI LABEN
ROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応していますROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応しています
記事一覧/API / SDK
API / SDK/2026-06-29上級

Gemini APIのレスポンスをCIで守る — スナップショットと意味的回帰の検知設計

生成AIの非決定的なレスポンスを、pytestのスナップショットとembeddingによる意味的回帰検知で守る実装手順。録画再生のCI組み込み、カセット鮮度を守る週次ライブスモーク、フィールド単位の劣化内訳、しきい値設計と更新ガバナンスまでを実コードで示します。

Gemini API228pytest3スナップショットテスト2CI7回帰検知Python44syrupyvcrpy

プレミアム記事

Gemini API を呼ぶコードをテストしようとすると、最初の数分でつまずきます。生成 AI のレスポンスは毎回変わるので、素直なアサーションが成立しないのです。

# これは毎回失敗しうる
assert response.text == "Pythonは汎用プログラミング言語です。"

最初に思いつくのは「API をモックにする」ですが、これは落とし穴です。モックのテストはモックの挙動を確かめているだけで、本番の API のレスポンス構造が実際に変わったときには沈黙します。私自身、個人開発で複数の自動化パイプラインを回していますが、モデル側の更新でレスポンスの一フィールドが静かに消え、夜間バッチが何日も無言で空振りしていたことがあります。あのときの「気づけなかった」という感覚が、この設計の出発点です。

ここで作るのは、構造を守るスナップショットテストを土台にしつつ、「構造は同じなのに中身が劣化する」回帰までを数値で捉える二層構成です。さらに、それを毎回 API を叩かずに CI で回す方法、flaky(偶発的なゆらぎ)と本物の回帰を切り分けるしきい値、そしてスナップショットを事故なく更新する運用までを通しで設計します。

なぜスナップショットなのか — モックとの決定的な違い

スナップショットテストは「初回実行時に期待値を記録し、以後はそれと比較する」手法です。完全一致ではなく、構造と重要フィールドの一致を見るのが要点です。

初回実行 → レスポンスを記録(スナップショット作成)
2回目以降 → 前回のスナップショットと比較し、差分があれば失敗

モックとの違いははっきりしています。モックは「自分が想定した形」を固定するので、現実の API がその想定から外れても気づけません。スナップショットは「実際に返ってきた形」を固定するので、現実が動いたときに差分として浮かび上がります。守りたいのは自分の想像ではなく、外部 API という動く現実のほうです。私はこの理由から、外部 API を伴うコードではモック一辺倒を避け、スナップショットを併用することを推奨しています。

Python では syrupy が定番です。

pip install syrupy pytest pytest-recording

SDK は新しい google-genai を前提にする

まず土台を新しい SDK に揃えます。古い google.generativeai ではなく、現行の google-genaifrom google import genai)を使います。クライアントを一度作り、モデル名は gemini-2.5-flash のように明示します。

# gemini_client.py
from google import genai
from google.genai import types
 
client = genai.Client(api_key="YOUR_GEMINI_API_KEY")
 
def classify_sentiment(text: str) -> str:
    """感情分類のJSONを返す薄いラッパー"""
    resp = client.models.generate_content(
        model="gemini-2.5-flash",
        contents=(
            "次のテキストの感情を分析し、JSONで返してください。\n"
            'フィールド: sentiment (positive/negative/neutral), '
            "confidence (0.0-1.0), explanation\n"
            f"テキスト: {text}"
        ),
        config=types.GenerateContentConfig(
            temperature=0,
            response_mime_type="application/json",
        ),
    )
    return resp.text

gemini-flash-latest のような浮動エイリアスはテスト対象には向きません。エイリアスは裏で別モデルに差し替わることがあり、テストが「いつの間にか別物を検証していた」状態になります。テストでは日付付き・世代付きのモデル名を固定し、エイリアスの昇格は別途ゴールデンセットで判定する、という分離をお勧めします。

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

この記事の続きを読む

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

この記事で得られること
構造スナップショットに加え、embeddingで「意味の劣化」を数値で検知する二層テストの実装
APIを毎回叩かずにCIを回す録画再生の設計と、flakyと本物の回帰を切り分けるしきい値設計
スナップショット更新を事故なく承認するための差分レビューとゴールデンセットの運用手順
カセットの鮮度切れで「過去のAPI」を検証し続ける事故を防ぐ、週次ライブスモークの分離設計
意味テストが赤くなった直後にフィールド単位の劣化内訳を出し、一次切り分けを十数秒に縮める実装
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-08-27
Gemini に渡す前に表が壊れる場所は結合セルと2行ヘッダ
スプレッドシートの表をそのまま Gemini に渡すと、結合セルと2行ヘッダで行の所属が失われます。抽出時点で何が消えるかを実測し、平坦化と集計行の検出までを Python で組みます。
API / SDK2026-08-27
temperature が効いているかを測るより渡した値を記録する方が先です
非推奨になったサンプリングパラメータは 200 が返るまま無視されます。grep と AST が取りこぼした箇所を実行時に拾い、設定の組み立て元まで記録して CI の合否に変えるまでを、実際に動かした結果とともにまとめます。
API / SDK2026-08-23
Gemini TTS を streamGenerateContent で受け取り、先頭のチャンクから鳴らす
Gemini の TTS をストリーミングで受け取ると、音声は「ファイル」ではなく PCM の断片で届きます。チャンクごとに WAV ヘッダを付けた場合に何が起きるかを手元で測り、連結とヘッダの正しい順序を実装まで示します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →