Gemini API の”the JSON object must be str, bytes or bytearray, not NoneType”エラー解消備忘録

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にパースできていない事が根本的な原因と予測しました。

Screenshot 2025-07-23 at 15.40.03


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.typesSchema型を使って疑似jsonのように定義しているため正しい使い方でした。

生のjsonが使えないという記述のようです。

Screenshot 2025-07-23 at 15.44.36


3. max_output_tokensのコメントアウト

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

Screenshot 2025-07-23 at 15.49.46


もしやと思いmax_output_tokens=500をコメントアウトしてみると、すべて成功するようになりました。

原因

根本的な原因は、出力トークン数の上限が制限されていることにより出力が不安定になり、不完全なテキスト出力をライブラリ内でうまくjsonにパース出来なかったことの可能性が高いです。

複数のenumで出来ているjson形式でしか出力しないので、わざわざ上限を設定しなくても安定して動くだろうということで、コメントアウトして問題なく動作するようになりました。