0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Geminiの構造化出力でNullを出力させようとしてエラーになる問題の解決

Last updated at Posted at 2025-06-18

はじめに

Geminiでは現在構造化出力というものがサポートされていて、特定の形式にあったJSONを出力させることができます。
この機能を使うと楽にGeminiからの応答を制御することができるので便利です。
この内容については自分で検証した結果ですが、何かおかしな点があればお教えください。

やりたかったこと

gemini-2.0-flashで作っていたプロジェクトをgemini-2.5-flashに切り替えたかった。
構造化出力とファイルのアップロードを使用してGeminiからのレスポンスを取得したかった

  • 構造化出力ではNull、String、NUMBERなどを使用(一部配列)

エラーの内容

いつ発生したか
gemini-2.0-flashから、gemini-2.5-flashへの移行で発生しました。
GeminiAPIを使用し、JavascriptのNode.js環境でコードを構築していました。
また、構造化出力を使用している際にエラーが発生しました

エラーが発生したコード
async function main() {
    ~~~~
  const content = ["この画像を見て、日本語で内容を説明してください。"];
  content.push(...uploadedFiles); // 配列を展開して追加

  const response = await ai.models.generateContent({
    model: "gemini-2.5-flash",
    contents: content,
    config: {
      responseMimeType: "application/json",
      responseSchema: {
        type: Type.OBJECT,
        required: ["createdUserId", "createdAt", "title", "outline", "questions"],
        propertyOrdering: ["createdUserId", "createdAt", "title", "outline", "questions"],
        properties: {
          createdUserId: {
            // 問題セットを作成したユーザーのID
            nullable: true,
            type: Type.NULL, // ユーザーIDはnullで、後で付与する
          },
          createdAt: {
            // 問題セットの作成日時
            nullable: true,
            type: Type.NULL, // 日時はnullで、後で付与する
          },
          ~~~~
        },
      },
    },
  });
  console.log(response.text);
}
具体的なエラーログ
ServerError: got status: 500 Internal Server Error. {"error":{"code":500,"message":"An internal error has occurred. Please retry or report in https://developers.generativeai.google/guide/troubleshooting","status":"INTERNAL"}}
    at throwErrorIfNotOK (file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:11210:33)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:10980:13
    at async Models.generateContent (file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:12157:24)
    at async generateQuestionSetWithGemini (file:///C:/Users/user/Documents/GitHub/myRepository/server/server.js:261:26)
    at async handleGenerateQuestionSetRequest (file:///C:/Users/user/Documents/GitHub/myRepository/server/server.js:84:32)
    at async file:///C:/Users/user/Documents/GitHub/myRepository/server/server.js:41:24 {
  [cause]: 'Error\n' +
    '    at new ServerError (file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:10733:37)\n' +
    '    at throwErrorIfNotOK (file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:11210:33)\n' +
    '    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n' +
    '    at async file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:10980:13\n' +
    '    at async Models.generateContent (file:///C:/Users/user/Documents/GitHub/myRepository/server/node_modules/@google/genai/dist/node/index.mjs:12157:24)\n' +
    '    at async generateQuestionSetWithGemini (file:///C:/Users/user/Documents/GitHub/myRepository/server/server.js:261:26)\n' +
    '    at async handleGenerateQuestionSetRequest (file:///C:/Users/user/Documents/GitHub/myRepository/server/server.js:84:32)\n' +
    '    at async file:///C:/Users/user/Documents/GitHub/myRepository/server/server.js:41:24'
}

原因

構造化出力でnullable: trueを指定しているのにも関わらず、type: Type.NULLを指定していたから、というのが最終的な理由でした。

今回は一部フィールドをNullとして出力させられるようにしようと考えていました。
SDKとして提供されている、nullableを使用するとそのフィールドではNullを出力することができると、Gemini側に伝えることができるようになっています。
そして、それと似たものとして、Type: Type.NULLがSDKで提供されています。
今回、このそれぞれの使用方法のミスでエラーが発生していました。

gemini-2.0-flashでは、以下のようにnullable: truetype: Type.NULLを同時に使用することができていました。

hogehoge: {
  nullable: true,
  type: Type.NULL,
},

しかし、gemini-2.5-flashでは2つを同時に使用することができず、Typeの中の値をNULL以外の値にする必要があったようです。

hogehoge: {
nullable: true,
type: Type.STRING,//←STRINGにするとエラーが出ない
},

正しいNullの出力のさせ方

  • gemini-2.0-flashの場合
    gemini-2.0-flashでNullを出力させるときには、このようにして、nullableType.NULLを同時に指定する必要がある...ようです。
    こうすることでNullが出力されるようになりました
hogehoge: {
  nullable: true,
  type: Type.NULL,
},

  • gemini-2.5-flashの場合
    gemini-2.5-flashでNullを出力させるときには、2.0-flashとは異なり、nullableのみを指定するだけでよいようです。
    しかし、nullableだけではnullを出力しない場合もある(気がする)のでプロンプトの方でも指定しておくことをおすすめします
    (typeはNULL以外なら指定しても動く)
    こうすることでNullが出力されるようになりました。
hogehoge: {
  nullable: true,
},

どうしてgeminiのモデルの変更でこんな部分が変わるんですかね........

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?