diff options
| author | Taylor Mullen <[email protected]> | 2025-05-26 14:25:31 -0700 |
|---|---|---|
| committer | N. Taylor Mullen <[email protected]> | 2025-05-26 14:29:24 -0700 |
| commit | 597dc86a9c7011b7f3288445b14abb11817424da (patch) | |
| tree | 3c966be056310a53ef0a9e96b835755c8790378e /packages/server/src | |
| parent | 480549e02ed4ae01c7df2abbd98bb0eb5b23bdd5 (diff) | |
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
Diffstat (limited to 'packages/server/src')
| -rw-r--r-- | packages/server/src/core/geminiChat.ts | 14 | ||||
| -rw-r--r-- | packages/server/src/utils/messageInspectors.ts | 15 |
2 files changed, 24 insertions, 5 deletions
diff --git a/packages/server/src/core/geminiChat.ts b/packages/server/src/core/geminiChat.ts index dd5f3b7a..c971e2cc 100644 --- a/packages/server/src/core/geminiChat.ts +++ b/packages/server/src/core/geminiChat.ts @@ -16,6 +16,7 @@ import { GoogleGenAI, createUserContent, } from '@google/genai'; +import { isFunctionResponse } from '../utils/messageInspectors.js'; /** * Returns true if the response is valid, false otherwise. @@ -292,12 +293,15 @@ export class GeminiChat { ) { outputContents = modelOutput; } 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. - outputContents.push({ - role: 'model', - parts: [], - } as Content); + // Workaround for: https://b.corp.google.com/issues/420354090 + if (!isFunctionResponse(userInput)) { + outputContents.push({ + role: 'model', + parts: [], + } as Content); + } } if ( automaticFunctionCallingHistory && diff --git a/packages/server/src/utils/messageInspectors.ts b/packages/server/src/utils/messageInspectors.ts new file mode 100644 index 00000000..b2c3cdce --- /dev/null +++ b/packages/server/src/utils/messageInspectors.ts @@ -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) + ); +} |
