diff options
| -rw-r--r-- | packages/server/src/core/client.ts | 8 | ||||
| -rw-r--r-- | packages/server/src/core/turn.ts | 10 | ||||
| -rw-r--r-- | packages/server/src/utils/generateContentResponseUtilities.ts | 17 |
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 + ); +} |
