はじめに
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: true
とtype: 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を出力させるときには、このようにして、nullable
とType.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のモデルの変更でこんな部分が変わるんですかね........