summaryrefslogtreecommitdiff
path: root/packages/server/src
diff options
context:
space:
mode:
authorTaylor Mullen <[email protected]>2025-05-26 14:25:31 -0700
committerN. Taylor Mullen <[email protected]>2025-05-26 14:29:24 -0700
commit597dc86a9c7011b7f3288445b14abb11817424da (patch)
tree3c966be056310a53ef0a9e96b835755c8790378e /packages/server/src
parent480549e02ed4ae01c7df2abbd98bb0eb5b23bdd5 (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.ts14
-rw-r--r--packages/server/src/utils/messageInspectors.ts15
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)
+ );
+}