summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/server/src/core/client.ts8
-rw-r--r--packages/server/src/core/turn.ts10
-rw-r--r--packages/server/src/utils/generateContentResponseUtilities.ts17
3 files changed, 28 insertions, 7 deletions
diff --git a/packages/server/src/core/client.ts b/packages/server/src/core/client.ts
index 01f48e72..a1cec704 100644
--- a/packages/server/src/core/client.ts
+++ b/packages/server/src/core/client.ts
@@ -20,6 +20,7 @@ import { Turn, ServerGeminiStreamEvent } from './turn.js';
import { Config } from '../config/config.js';
import { getCoreSystemPrompt } from './prompts.js';
import { ReadManyFilesTool } from '../tools/read-many-files.js'; // Import ReadManyFilesTool
+import { getResponseText } from '../utils/generateContentResponseUtilities.js';
export class GeminiClient {
private config: Config;
@@ -185,13 +186,14 @@ export class GeminiClient {
},
contents,
});
- if (!result || !result.text) {
+ const text = getResponseText(result);
+ if (!text) {
throw new Error('API returned an empty response.');
}
try {
- return JSON.parse(result.text);
+ return JSON.parse(text);
} catch (parseError) {
- console.error('Failed to parse JSON response:', result.text);
+ console.error('Failed to parse JSON response:', text);
throw new Error(
`Failed to parse API response as JSON: ${parseError instanceof Error ? parseError.message : String(parseError)}`,
);
diff --git a/packages/server/src/core/turn.ts b/packages/server/src/core/turn.ts
index b7b54a5d..25601164 100644
--- a/packages/server/src/core/turn.ts
+++ b/packages/server/src/core/turn.ts
@@ -18,6 +18,7 @@ import {
ToolResult,
ToolResultDisplay,
} from '../tools/tools.js'; // Keep ToolResult for now
+import { getResponseText } from '../utils/generateContentResponseUtilities.js';
// Removed gemini-stream import (types defined locally)
// --- Types for Server Logic ---
@@ -102,7 +103,6 @@ export class Turn {
this.confirmationDetails = [];
this.debugResponses = [];
}
-
// The run method yields simpler events suitable for server logic
async *run(
req: PartListUnion,
@@ -115,10 +115,12 @@ export class Turn {
if (signal?.aborted) {
throw this.abortError();
}
- if (resp.text) {
- yield { type: GeminiEventType.Content, value: resp.text };
- continue;
+
+ const text = getResponseText(resp);
+ if (text) {
+ yield { type: GeminiEventType.Content, value: text };
}
+
if (!resp.functionCalls) {
continue;
}
diff --git a/packages/server/src/utils/generateContentResponseUtilities.ts b/packages/server/src/utils/generateContentResponseUtilities.ts
new file mode 100644
index 00000000..a1d62124
--- /dev/null
+++ b/packages/server/src/utils/generateContentResponseUtilities.ts
@@ -0,0 +1,17 @@
+/**
+ * @license
+ * Copyright 2025 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { GenerateContentResponse } from '@google/genai';
+
+export function getResponseText(
+ response: GenerateContentResponse,
+): string | undefined {
+ return (
+ response.candidates?.[0]?.content?.parts
+ ?.map((part) => part.text)
+ .join('') || undefined
+ );
+}