GEMINI LABEN
API — Interactions APIが一般提供となり、GeminiモデルとエージェントのためのAI Studio・APIの既定APIになりましたAGENT — Managed Agentsがパブリックプレビューとなり、Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますSECURITY — 6月19日以降、制限なしのAPIキーからのリクエストが拒否され、キーへの制限付与が前提になりましたCLI — Gemini CLIが6月18日にEOLとなり、Agentic 2.0(Antigravity CLI)へ置き換わりましたMODEL — Gemini 3.5 FlashがGAとなり、エージェント処理やコーディングで持続的な高性能を発揮しますUPDATE — 旧画像プレビューモデル(gemini-3.1-flash-image-preview等)が6月25日に廃止されましたAPI — Interactions APIが一般提供となり、GeminiモデルとエージェントのためのAI Studio・APIの既定APIになりましたAGENT — Managed Agentsがパブリックプレビューとなり、Googleホストの隔離Linuxサンドボックスで自律エージェントを動かせますSECURITY — 6月19日以降、制限なしのAPIキーからのリクエストが拒否され、キーへの制限付与が前提になりましたCLI — Gemini CLIが6月18日にEOLとなり、Agentic 2.0(Antigravity CLI)へ置き換わりましたMODEL — Gemini 3.5 FlashがGAとなり、エージェント処理やコーディングで持続的な高性能を発揮しますUPDATE — 旧画像プレビューモデル(gemini-3.1-flash-image-preview等)が6月25日に廃止されました
記事一覧/API / SDK
API / SDK/2026-07-01上級

AI Studio で通ったプロンプトが API では静かに崩れるとき — 差分を計測して切り分ける運用メモ

AI Studio では完璧に動いたプロンプトが、自分のコードから Gemini API を呼ぶと空応答や 404 になる。目視ではなく、設定差と finish_reason・使用トークン・解決モデル名を機械的に記録する小さなハーネスで、原因別に切り分ける運用手順をまとめました。

gemini-api260google-ai-studio3troubleshooting57instrumentationsafety-filter2model-name2

プレミアム記事

Studio 上で何度叩いても綺麗に返ってきたプロンプトが、Get code でコピーして自分のコードに落とした途端に空文字を返す。私も個人開発でいくつも API を触ってきましたが、この「昨日は動いていた」の一言で片づけたくなる状況が、いちばん時間を溶かします。厄介なのは、多くの場合エラーすら出ないことです。例外が飛べばスタックトレースを追えますが、response.text が静かに空文字で返るときは、どこから疑えばいいのか手がかりが乏しいのです。

そこで私がたどり着いたのは、原因を目視で探すのをやめて、Studio と API の「差」そのものを毎回記録する小さなハーネスを挟むという進め方でした。差分を数字で残せるようになると、次に同じ症状が出たときの調査時間が体感で数分に縮みます。2026 年前半に Gemini API 側で起きた変更(Interactions API の GA 化、未制限 API キーの遮断、preview モデルの相次ぐ廃止)も、この「静かに壊れる」系統の事故を増やしているので、そこも織り込んで書きます。

なぜ目視の突き合わせは破綻するのか

「Studio の設定とコードを見比べればいい」という助言はよく見かけますし、正しくもあります。ただ実務では破綻しがちです。理由は三つあります。

一つ目は、Studio が裏で補っている初期値が UI に全部は出ていないこと。二つ目は、モデル名がエイリアス(gemini-flash-latest のような *-latest)だと、同じ文字列でも解決先が日によって変わり得ること。三つ目は、空応答の原因が複数レイヤー(安全フィルタ・権限・モデル解決・API バージョン)にまたがるのに、response.text はどのレイヤーで落ちても同じ「空文字」に見えることです。

目で追える差は「見えている設定」だけです。事故の多くは見えていない差で起きます。だから、突き合わせの対象を人間の注意力から、機械が吐くログへ移します。

最小の観測点 — 空応答のときに必ず残す4つの値

まず、既存の呼び出しに観測を足すところから始めます。response.text だけを見ている実装に、次の4つを必ずログへ落とします。これは新しい SDK(google-genai)の usage_metadatacandidates から取れます。

from google import genai
from google.genai import types
 
client = genai.Client(api_key="YOUR_API_KEY")
 
def call_with_probe(model: str, contents: str, config: types.GenerateContentConfig):
    res = client.models.generate_content(model=model, contents=contents, config=config)
    cand = res.candidates[0] if res.candidates else None
    probe = {
        # 1. なぜ止まったのか(STOP / SAFETY / MAX_TOKENS / RECITATION など)
        "finish_reason": str(cand.finish_reason) if cand else "NO_CANDIDATE",
        # 2. 入力側でブロックされたか(プロンプト自体が弾かれるケース)
        "prompt_feedback": str(res.prompt_feedback),
        # 3. 実際に消費したトークン(0 に近ければ生成前に落ちている)
        "usage": {
            "prompt": res.usage_metadata.prompt_token_count,
            "output": res.usage_metadata.candidates_token_count,
        } if res.usage_metadata else None,
        # 4. サーバが返したモデル名(エイリアスが何に解決されたか)
        "resolved_model": getattr(res, "model_version", None),
    }
    return res, probe
 
cfg = types.GenerateContentConfig(temperature=0.7)
res, probe = call_with_probe("gemini-flash-latest", "今日のニュースを3行で", cfg)
print(probe)
print("text:", res.text or "(empty)")

ここで効いてくるのが4番目の model_version です。*-latest を渡していると、サーバが実際に何へ解決したかは投げてみないと分かりません。Studio で試したその日と、本番で叩く日で解決先がずれていれば、「同じモデル名なのに挙動が違う」の正体はここです。finish_reasonSAFETY なら安全フィルタ、output トークンが 0 に近いのに finish_reasonSTOP なら生成前の段階(権限・モデル解決)を疑う、という初動の分岐がこの4値だけで立ちます。

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

この記事の続きを読む

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

この記事で得られること
Studio の Get code と本番呼び出しの設定差を機械的に diff し、finish_reason・usage・実際に解決されたモデル名まで一度に記録する小さなハーネスの作り方
*-latest エイリアスのドリフトや preview モデル廃止で「昨日まで動いていた」が静かに壊れる箇所を、事前に計測して掴む観測ポイント
空応答・400・404 を症状ではなく原因(安全フィルタ / 権限・地域 / モデル解決 / API バージョン)で切り分ける、二分探索の再現手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-04-12
Gemini API「モデルが見つからない」エラーの原因と解決方法【2026年版】
Gemini APIで「model not found」や「INVALID_ARGUMENT」エラーが出るときの原因と解決策を完全解説。2026年の最新モデル名一覧と正しい指定方法をわかりやすく紹介します。
API / SDK2026-06-26
Gemini API のセーフティフィルタが正当な応答を黙って落とすとき — 全切りせず誤検知だけを救う運用メモ
本番のGemini APIで正当なプロンプトがSAFETYでブロックされる誤検知を、全カテゴリ無効化に逃げずに扱う運用メモ。入力ブロックと出力ブロックの切り分け、誤検知率の計装、カテゴリ別の段階的リカバリまでを実装で整理します。
API / SDK2026-06-14
Gemini API の本文が途中で切れる — finish_reason: MAX_TOKENS を検知して続きを継ぎ直す実装メモ
長文生成で末尾が文の途中でぷつりと切れる。原因の多くは finish_reason: MAX_TOKENS です。例外も 200 のまま静かに混入するこの事故を検知し、続きを継ぎ足して全文を取り戻す実装を、思考トークンの落とし穴とあわせてまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →