Gemini APIでStructured Outputのjson出力を取得した時のエラー
前提
- 使用言語:python
- 使用モデル:gemini-2.5-flash無料版
- 期待する出力:json
- 10秒毎に商品の分類をリクエスト
これで実行すると、成功して正しいjson形式が返ってくるときもあったのですが、
the JSON object must be str, bytes or bytearray, not NoneType
というエラーが返ってくることが多々ありました。
レートリミットはきちんと守っているはずなので、Geminiのレスポンスがjson形式のテキストになっておらず、ライブラリ内でうまくjsonにパースできていない事が根本的な原因と予測しました。

1. gemini-2.5-flashがそもそもstructured outputに対応しているか確認
対応してそうです。
https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/control-generated-output
2. 「SDK を使用している場合、JSON スキーマを直接渡すことはまだサポートされていません。」
公式ドキュメントを呼んでいると「SDK を使用している場合、JSON スキーマを直接渡すことはまだサポートされていません。」との記述を見つけました。
https://ai.google.dev/gemini-api/docs/structured-output?hl=ja#json-schema
これが原因かもしれないと思い確認しましたが、私のコードではgoogle.genai.types
のSchema
型を使って疑似jsonのように定義しているため正しい使い方でした。
生のjsonが使えないという記述のようです。

3. max_output_tokensのコメントアウト
レスポンスが短いjsonだと思っていたのでmax_output_tokens=500
に設定していましたが、ログを確認すると意外と長いことが判明しました。

もしやと思いmax_output_tokens=500
をコメントアウトしてみると、すべて成功するようになりました。
原因
根本的な原因は、出力トークン数の上限が制限されていることにより出力が不安定になり、不完全なテキスト出力をライブラリ内でうまくjsonにパース出来なかったことの可能性が高いです。
複数のenumで出来ているjson形式でしか出力しないので、わざわざ上限を設定しなくても安定して動くだろうということで、コメントアウトして問題なく動作するようになりました。