From ea0e3de4302a9602e710e0ca14396e9e5a4eb3e4 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 19 Jan 2026 20:29:45 -0800 Subject: [PATCH] fix(core): deduplicate ModelInfo emission in GeminiClient (#17075) --- packages/core/src/core/client.test.ts | 11 +++++------ packages/core/src/core/client.ts | 5 +++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/core/src/core/client.test.ts b/packages/core/src/core/client.test.ts index 50ee7f765a..1c86d5175d 100644 --- a/packages/core/src/core/client.test.ts +++ b/packages/core/src/core/client.test.ts @@ -1649,7 +1649,6 @@ ${JSON.stringify( expect(events).toEqual([ { type: GeminiEventType.ModelInfo, value: 'default-routed-model' }, { type: GeminiEventType.InvalidStream }, - { type: GeminiEventType.ModelInfo, value: 'default-routed-model' }, { type: GeminiEventType.Content, value: 'Continued content' }, ]); @@ -1737,13 +1736,13 @@ ${JSON.stringify( const events = await fromAsync(stream); // Assert - // We expect 4 events (model_info + original + model_info + 1 retry) - expect(events.length).toBe(4); + // We expect 3 events (model_info + original + 1 retry) + expect(events.length).toBe(3); expect( events - .filter((e) => e.type !== GeminiEventType.ModelInfo) - .every((e) => e.type === GeminiEventType.InvalidStream), - ).toBe(true); + .filter((e) => e.type === GeminiEventType.ModelInfo) + .map((e) => e.value), + ).toEqual(['default-routed-model']); // Verify that turn.run was called twice expect(mockTurnRunFn).toHaveBeenCalledTimes(2); diff --git a/packages/core/src/core/client.ts b/packages/core/src/core/client.ts index dbf81aee2f..165aa7c00f 100644 --- a/packages/core/src/core/client.ts +++ b/packages/core/src/core/client.ts @@ -626,9 +626,10 @@ export class GeminiClient { ); modelToUse = finalModel; + if (!signal.aborted && !this.currentSequenceModel) { + yield { type: GeminiEventType.ModelInfo, value: modelToUse }; + } this.currentSequenceModel = modelToUse; - yield { type: GeminiEventType.ModelInfo, value: modelToUse }; - const resultStream = turn.run(modelConfigKey, request, linkedSignal); let isError = false; let isInvalidStream = false;