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

structured output の任意フィールドが null・空文字・キー欠落で三様にぶれる — 正規化ゲートで一つの表現に畳む

Gemini の structured output で任意フィールドが null・空文字・キー欠落の三態にぶれ、下流が壊れる問題を、responseSchema の nullable 宣言と出力後の正規化ゲートで一つの表現に畳む実装として整理します。個人開発の夜間バッチでの実測つきです。

Gemini API248structured output3responseSchema6データ正規化バッチ処理9

✦ プレミアム記事

先週、個人開発で回している夜間バッチが、明け方に静かに止まっていました。App Store のレビューを Gemini の structured output で分類し、要約と改善タグを Firestore に書き込むだけの小さなパイプラインです。ログを追うと、suggested_tag を大文字化する一行で Cannot read properties of null が出ていました。

前日まで動いていた処理が、モデルの出力が少しゆらいだだけで止まる。原因は、任意フィールドが「null」「空文字」「キーそのものが無い」という三つの姿でばらついていたことでした。responseSchema を渡しているのに、なぜこうなるのか。入口と出口の両方に手を入れて、ようやく落ち着いた過程を残します。

三様にぶれる、とはどういうことか

同じスキーマ、同じプロンプトでも、任意フィールドの表現は一つに定まりません。手元のログから、suggested_tag(改善タグ・任意)が返ってきた三つの形を並べます。

ケース実際の出力JavaScript での型素朴なコードの挙動
値あり"suggested_tag": "dark-mode"string正常
null"suggested_tag": nullnull(object 扱い).toUpperCase() で例外
空文字"suggested_tag": ""string(長さ0)空のタグが混入
キー欠落キー自体が無いundefined後段の分岐を素通り

厄介なのは、三つとも「タグが無い」という同じ意味を表しているのに、下流での壊れ方が違うところです。null は例外を投げ、空文字は無害な顔をして無意味なデータを増やし、キー欠落は条件分岐をすり抜けて別の不具合として遅れて表面化します。原因の切り分けが難しいのは、この壊れ方の非対称性が理由でした。

なぜ任意フィールドは三態になるのか

responseSchema はフィールドの型と構造を制約しますが、「値が無いときにどう表現するか」までは一意に決めてくれません。ここが誤解しやすい点でした。

第一に、required に含めていないフィールドは、モデルの判断で丸ごと省略され得ます。第二に、required に入れていても、nullable を明示していないと、モデルは「値が無い」ことを空文字で埋めたり null で返したりと、そのときの生成に引きずられます。第三に、フィールド順を propertyOrdering で固定しても、それは順序の安定であって値の表現の安定ではありません。順序の話と値の表現の話は別軸です。この点はpropertyOrdering でフィールド順を安定させる話で扱いましたが、今回のぶれはその先の問題でした。

つまり、スキーマだけでは三態を一態には縮められません。入口(スキーマ設計)でぶれの幅を狭め、出口(出力後の正規化)で残りを畳む。この二段構えが要ります。

✦

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

この記事の続きを読む

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

この記事で得られること
✦任意フィールドが null・空文字・キー欠落の三態でぶれる原因を responseSchema の挙動から切り分けます
✦nullable 宣言と required の設計で、モデル出力のばらつきを入口で減らす方法
✦三態を一つの表現へ畳む正規化ゲートの実装(3,200件のレビュー処理での欠落率つき)
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◈ API / SDK2026-05-21
responseSchema の enum 指定なのに違う文字列が返る — Gemini API で起きる原因と回避策
Gemini API の responseSchema で enum を指定したのに許可値以外の文字列が返る現象を、最小再現コードから原因まで掘り下げます。プロンプトへの許可値明示、受け取り側のバリデーションとリトライ、SDK バージョン差の確認という3つの対処を示します。
◈ API / SDK2026-10-14
config に「Extra inputs are not permitted」が出たら、キーの綴りを一つずつ疑います
google-genai SDK で config を渡した途端に pydantic の ValidationError(extra_forbidden)が出る原因は、ほぼ綴りの一字違いです。手元で再現した出力と、呼び出し前に怪しいキーを洗う関数、text が None になる場合の見分け方を書き残します。
◈ API / SDK2026-10-08
停止日のない非推奨をどう扱うか — 画像モデルの移行先を、3つの条件で選び直す
10月6日に gemini-nano-banana-2.1 が GA になり、gemini-3.1-flash-image は停止日の書かれないまま非推奨になりました。解像度・参照画像・検索の3条件で移行先を選ぶ表と、確認用の短いスクリプトをまとめます。