From d18586fec2ea172ee21ed82451fe21da2d44375a Mon Sep 17 00:00:00 2001 From: Sehoon Shon Date: Wed, 1 Apr 2026 00:26:27 -0400 Subject: [PATCH] fix(core): map PREVIEW_GEMINI_FLASH_MODEL to stable 3.1 lite and fix history coalescing --- packages/core/src/config/models.ts | 2 +- packages/core/src/core/geminiChat.ts | 57 ++++++++++++++++------------ packages/test-utils/src/test-rig.ts | 4 +- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/packages/core/src/config/models.ts b/packages/core/src/config/models.ts index b8420dd259..91b4b90b3b 100644 --- a/packages/core/src/config/models.ts +++ b/packages/core/src/config/models.ts @@ -54,9 +54,9 @@ export const PREVIEW_GEMINI_MODEL = 'gemini-3-pro-preview'; export const PREVIEW_GEMINI_3_1_MODEL = 'gemini-3.1-pro-preview'; export const PREVIEW_GEMINI_3_1_CUSTOM_TOOLS_MODEL = 'gemini-3.1-pro-preview-customtools'; -export const PREVIEW_GEMINI_FLASH_MODEL = 'gemini-3-flash-preview'; export const PREVIEW_GEMINI_3_1_FLASH_LITE_MODEL = 'gemini-3.1-flash-lite-preview'; +export const PREVIEW_GEMINI_FLASH_MODEL = PREVIEW_GEMINI_3_1_FLASH_LITE_MODEL; export const DEFAULT_GEMINI_MODEL = 'gemini-2.5-pro'; export const DEFAULT_GEMINI_FLASH_MODEL = 'gemini-2.5-flash'; export const DEFAULT_GEMINI_FLASH_LITE_MODEL = 'gemini-2.5-flash-lite'; diff --git a/packages/core/src/core/geminiChat.ts b/packages/core/src/core/geminiChat.ts index 86f7e21685..d931baaaea 100644 --- a/packages/core/src/core/geminiChat.ts +++ b/packages/core/src/core/geminiChat.ts @@ -173,7 +173,11 @@ function extractCuratedHistory(comprehensiveHistory: Content[]): Content[] { if (part === undefined || Object.keys(part).length === 0) { return false; } - if (!part.thought && part.text !== undefined && part.text.trim() === '') { + // Thought parts should always be kept if present + if (part.thought) { + return true; + } + if (part.text !== undefined && part.text.trim() === '') { return false; } return true; @@ -183,39 +187,42 @@ function extractCuratedHistory(comprehensiveHistory: Content[]): Content[] { continue; } - const lastEntry = curatedHistory[curatedHistory.length - 1]; + let lastEntry = curatedHistory[curatedHistory.length - 1]; if (lastEntry && lastEntry.role === role) { - const lastEntryParts = lastEntry.parts || []; // Merge into last entry - for (const part of validParts) { - if ( - lastEntryParts.length > 0 && - lastEntryParts[lastEntryParts.length - 1].text !== undefined && - part.text !== undefined - ) { - // Coalesce text parts - const lastText = lastEntryParts[lastEntryParts.length - 1].text!; - const separator = lastText.endsWith('\n') ? '' : '\n'; - lastEntryParts[lastEntryParts.length - 1] = { - ...lastEntryParts[lastEntryParts.length - 1], - text: lastText + separator + part.text, - }; - } else { - lastEntryParts.push({ ...part }); - } - } - lastEntry.parts = lastEntryParts; } else { - // Create new entry with deep-copied parts - curatedHistory.push({ + // Create new entry + lastEntry = { role, - parts: validParts.map((p) => ({ ...p })), - }); + parts: [], + }; + curatedHistory.push(lastEntry); } + + const lastEntryParts = lastEntry.parts || []; + for (const part of validParts) { + if ( + lastEntryParts.length > 0 && + lastEntryParts[lastEntryParts.length - 1].text !== undefined && + part.text !== undefined + ) { + // Coalesce text parts + const lastText = lastEntryParts[lastEntryParts.length - 1].text!; + const separator = lastText.endsWith('\n') ? '' : '\n'; + lastEntryParts[lastEntryParts.length - 1] = { + ...lastEntryParts[lastEntryParts.length - 1], + text: lastText + separator + part.text, + }; + } else { + lastEntryParts.push({ ...part }); + } + } + lastEntry.parts = lastEntryParts; } return curatedHistory; } + export class InvalidStreamError extends Error { readonly type: | 'NO_FINISH_REASON' diff --git a/packages/test-utils/src/test-rig.ts b/packages/test-utils/src/test-rig.ts index d91770232f..0dc4646dd8 100644 --- a/packages/test-utils/src/test-rig.ts +++ b/packages/test-utils/src/test-rig.ts @@ -12,7 +12,7 @@ import { fileURLToPath } from 'node:url'; import { env } from 'node:process'; import { setTimeout as sleep } from 'node:timers/promises'; import { - PREVIEW_GEMINI_3_1_FLASH_LITE_MODEL, + PREVIEW_GEMINI_FLASH_MODEL, GEMINI_DIR, } from '@google/gemini-cli-core'; export { GEMINI_DIR }; @@ -460,7 +460,7 @@ export class TestRig { ...(env['GEMINI_TEST_TYPE'] === 'integration' ? { model: { - name: PREVIEW_GEMINI_3_1_FLASH_LITE_MODEL, + name: PREVIEW_GEMINI_FLASH_MODEL, }, } : {}),