Fix(chat): Prevent empty model response after function call

- Addresses a Gemini model bug where it may return an empty content object after a function response.
- Previously, the SDK attempted to inject an empty model message, which could disrupt curated history.
- This change modifies our custom  class to detect this scenario using an  utility and avoid pushing an unnecessary empty model message, thus preserving history integrity.

Workaround for https://b.corp.google.com/issues/420354090
Part of https://github.com/google-gemini/gemini-cli/issues/551
This commit is contained in:
Taylor Mullen 2025-05-26 14:25:31 -07:00 committed by N. Taylor Mullen
parent 480549e02e
commit 597dc86a9c
2 changed files with 24 additions and 5 deletions

View File

@ -16,6 +16,7 @@ import {
GoogleGenAI, GoogleGenAI,
createUserContent, createUserContent,
} from '@google/genai'; } from '@google/genai';
import { isFunctionResponse } from '../utils/messageInspectors.js';
/** /**
* Returns true if the response is valid, false otherwise. * Returns true if the response is valid, false otherwise.
@ -292,13 +293,16 @@ export class GeminiChat {
) { ) {
outputContents = modelOutput; outputContents = modelOutput;
} else { } else {
// Appends an empty content when model returns empty response, so that the // When not a function response appends an empty content when model returns empty response, so that the
// history is always alternating between user and model. // history is always alternating between user and model.
// Workaround for: https://b.corp.google.com/issues/420354090
if (!isFunctionResponse(userInput)) {
outputContents.push({ outputContents.push({
role: 'model', role: 'model',
parts: [], parts: [],
} as Content); } as Content);
} }
}
if ( if (
automaticFunctionCallingHistory && automaticFunctionCallingHistory &&
automaticFunctionCallingHistory.length > 0 automaticFunctionCallingHistory.length > 0

View File

@ -0,0 +1,15 @@
/**
* @license
* Copyright 2025 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import { Content } from '@google/genai';
export function isFunctionResponse(content: Content): boolean {
return (
content.role === 'user' &&
!!content.parts &&
content.parts.every((part) => !!part.functionResponse)
);
}