@google/gemini-cli-core 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/google-gemini-cli-core-0.3.3.tgz +0 -0
- package/dist/src/core/geminiChat.d.ts +14 -1
- package/dist/src/core/geminiChat.js +37 -5
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +314 -11
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/subagent.js +5 -6
- package/dist/src/core/subagent.js.map +1 -1
- package/dist/src/core/subagent.test.js +20 -9
- package/dist/src/core/subagent.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +7 -2
- package/dist/src/core/turn.js +15 -2
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +145 -83
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
Binary file
|
|
@@ -7,6 +7,19 @@ import type { GenerateContentResponse, Content, GenerateContentConfig, SendMessa
|
|
|
7
7
|
import type { ContentGenerator } from './contentGenerator.js';
|
|
8
8
|
import type { Config } from '../config/config.js';
|
|
9
9
|
import type { StructuredError } from './turn.js';
|
|
10
|
+
export declare enum StreamEventType {
|
|
11
|
+
/** A regular content chunk from the API. */
|
|
12
|
+
CHUNK = "chunk",
|
|
13
|
+
/** A signal that a retry is about to happen. The UI should discard any partial
|
|
14
|
+
* content from the attempt that just failed. */
|
|
15
|
+
RETRY = "retry"
|
|
16
|
+
}
|
|
17
|
+
export type StreamEvent = {
|
|
18
|
+
type: StreamEventType.CHUNK;
|
|
19
|
+
value: GenerateContentResponse;
|
|
20
|
+
} | {
|
|
21
|
+
type: StreamEventType.RETRY;
|
|
22
|
+
};
|
|
10
23
|
/**
|
|
11
24
|
* Custom error to signal that a stream completed without valid content,
|
|
12
25
|
* which should trigger a retry.
|
|
@@ -77,7 +90,7 @@ export declare class GeminiChat {
|
|
|
77
90
|
* }
|
|
78
91
|
* ```
|
|
79
92
|
*/
|
|
80
|
-
sendMessageStream(params: SendMessageParameters, prompt_id: string): Promise<AsyncGenerator<
|
|
93
|
+
sendMessageStream(params: SendMessageParameters, prompt_id: string): Promise<AsyncGenerator<StreamEvent>>;
|
|
81
94
|
private makeApiCallAndProcessStream;
|
|
82
95
|
/**
|
|
83
96
|
* Returns the chat history.
|
|
@@ -10,6 +10,14 @@ import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
|
10
10
|
import { hasCycleInSchema } from '../tools/tools.js';
|
|
11
11
|
import { logContentRetry, logContentRetryFailure, logInvalidChunk, } from '../telemetry/loggers.js';
|
|
12
12
|
import { ContentRetryEvent, ContentRetryFailureEvent, InvalidChunkEvent, } from '../telemetry/types.js';
|
|
13
|
+
export var StreamEventType;
|
|
14
|
+
(function (StreamEventType) {
|
|
15
|
+
/** A regular content chunk from the API. */
|
|
16
|
+
StreamEventType["CHUNK"] = "chunk";
|
|
17
|
+
/** A signal that a retry is about to happen. The UI should discard any partial
|
|
18
|
+
* content from the attempt that just failed. */
|
|
19
|
+
StreamEventType["RETRY"] = "retry";
|
|
20
|
+
})(StreamEventType || (StreamEventType = {}));
|
|
13
21
|
const INVALID_CONTENT_RETRY_OPTIONS = {
|
|
14
22
|
maxAttempts: 3, // 1 initial call + 2 retries
|
|
15
23
|
initialDelayMs: 500,
|
|
@@ -285,9 +293,12 @@ export class GeminiChat {
|
|
|
285
293
|
let lastError = new Error('Request failed after all retries.');
|
|
286
294
|
for (let attempt = 0; attempt < INVALID_CONTENT_RETRY_OPTIONS.maxAttempts; attempt++) {
|
|
287
295
|
try {
|
|
296
|
+
if (attempt > 0) {
|
|
297
|
+
yield { type: StreamEventType.RETRY };
|
|
298
|
+
}
|
|
288
299
|
const stream = await self.makeApiCallAndProcessStream(requestContents, params, prompt_id, userContent);
|
|
289
300
|
for await (const chunk of stream) {
|
|
290
|
-
yield chunk;
|
|
301
|
+
yield { type: StreamEventType.CHUNK, value: chunk };
|
|
291
302
|
}
|
|
292
303
|
lastError = null;
|
|
293
304
|
break;
|
|
@@ -426,24 +437,45 @@ export class GeminiChat {
|
|
|
426
437
|
}
|
|
427
438
|
async *processStreamResponse(streamResponse, userInput) {
|
|
428
439
|
const modelResponseParts = [];
|
|
429
|
-
let isStreamInvalid = false;
|
|
430
440
|
let hasReceivedAnyChunk = false;
|
|
441
|
+
let hasReceivedValidChunk = false;
|
|
442
|
+
let hasToolCall = false;
|
|
443
|
+
let lastChunk = null;
|
|
444
|
+
let lastChunkIsInvalid = false;
|
|
431
445
|
for await (const chunk of streamResponse) {
|
|
432
446
|
hasReceivedAnyChunk = true;
|
|
447
|
+
lastChunk = chunk;
|
|
433
448
|
if (isValidResponse(chunk)) {
|
|
449
|
+
hasReceivedValidChunk = true;
|
|
450
|
+
lastChunkIsInvalid = false;
|
|
434
451
|
const content = chunk.candidates?.[0]?.content;
|
|
435
452
|
if (content?.parts) {
|
|
436
453
|
modelResponseParts.push(...content.parts);
|
|
454
|
+
if (content.parts.some((part) => part.functionCall)) {
|
|
455
|
+
hasToolCall = true;
|
|
456
|
+
}
|
|
437
457
|
}
|
|
438
458
|
}
|
|
439
459
|
else {
|
|
440
460
|
logInvalidChunk(this.config, new InvalidChunkEvent('Invalid chunk received from stream.'));
|
|
441
|
-
|
|
461
|
+
lastChunkIsInvalid = true;
|
|
442
462
|
}
|
|
443
463
|
yield chunk;
|
|
444
464
|
}
|
|
445
|
-
if (
|
|
446
|
-
throw new EmptyStreamError('Model stream
|
|
465
|
+
if (!hasReceivedAnyChunk) {
|
|
466
|
+
throw new EmptyStreamError('Model stream completed without any chunks.');
|
|
467
|
+
}
|
|
468
|
+
const hasFinishReason = lastChunk?.candidates?.some((candidate) => candidate.finishReason);
|
|
469
|
+
// Stream validation logic: A stream is considered successful if:
|
|
470
|
+
// 1. There's a tool call (tool calls can end without explicit finish reasons), OR
|
|
471
|
+
// 2. There's a finish reason AND the last chunk is valid (or we haven't received any valid chunks)
|
|
472
|
+
//
|
|
473
|
+
// We throw an error only when there's no tool call AND:
|
|
474
|
+
// - No finish reason, OR
|
|
475
|
+
// - Last chunk is invalid after receiving valid content
|
|
476
|
+
if (!hasToolCall &&
|
|
477
|
+
(!hasFinishReason || (lastChunkIsInvalid && !hasReceivedValidChunk))) {
|
|
478
|
+
throw new EmptyStreamError('Model stream ended with an invalid chunk or missing finish reason.');
|
|
447
479
|
}
|
|
448
480
|
// Bundle all streamed parts into a single Content object
|
|
449
481
|
const modelOutput = modelResponseParts.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geminiChat.js","sourceRoot":"","sources":["../../../src/core/geminiChat.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geminiChat.js","sourceRoot":"","sources":["../../../src/core/geminiChat.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import { GeminiChat, EmptyStreamError } from './geminiChat.js';
|
|
7
|
+
import { GeminiChat, EmptyStreamError, StreamEventType, } from './geminiChat.js';
|
|
8
8
|
import { setSimulate429 } from '../utils/testUtils.js';
|
|
9
9
|
// Mocks
|
|
10
10
|
const mockModelsModule = {
|
|
@@ -55,6 +55,77 @@ describe('GeminiChat', () => {
|
|
|
55
55
|
vi.resetAllMocks();
|
|
56
56
|
});
|
|
57
57
|
describe('sendMessage', () => {
|
|
58
|
+
it('should retain the initial user message when an automatic function call occurs', async () => {
|
|
59
|
+
// 1. Define the user's initial text message. This is the turn that gets dropped by the buggy logic.
|
|
60
|
+
const userInitialMessage = {
|
|
61
|
+
role: 'user',
|
|
62
|
+
parts: [{ text: 'How is the weather in Boston?' }],
|
|
63
|
+
};
|
|
64
|
+
// 2. Mock the full API response, including the automaticFunctionCallingHistory.
|
|
65
|
+
// This history represents the full turn: user asks, model calls tool, tool responds, model answers.
|
|
66
|
+
const mockAfcResponse = {
|
|
67
|
+
candidates: [
|
|
68
|
+
{
|
|
69
|
+
content: {
|
|
70
|
+
role: 'model',
|
|
71
|
+
parts: [
|
|
72
|
+
{ text: 'The weather in Boston is 72 degrees and sunny.' },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
automaticFunctionCallingHistory: [
|
|
78
|
+
userInitialMessage, // The user's turn
|
|
79
|
+
{
|
|
80
|
+
// The model's first response: a tool call
|
|
81
|
+
role: 'model',
|
|
82
|
+
parts: [
|
|
83
|
+
{
|
|
84
|
+
functionCall: {
|
|
85
|
+
name: 'get_weather',
|
|
86
|
+
args: { location: 'Boston' },
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
// The tool's response, which has a 'user' role
|
|
93
|
+
role: 'user',
|
|
94
|
+
parts: [
|
|
95
|
+
{
|
|
96
|
+
functionResponse: {
|
|
97
|
+
name: 'get_weather',
|
|
98
|
+
response: { temperature: 72, condition: 'sunny' },
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
vi.mocked(mockModelsModule.generateContent).mockResolvedValue(mockAfcResponse);
|
|
106
|
+
// 3. Action: Send the initial message.
|
|
107
|
+
await chat.sendMessage({ message: 'How is the weather in Boston?' }, 'prompt-id-afc-bug');
|
|
108
|
+
// 4. Assert: Check the final state of the history.
|
|
109
|
+
const history = chat.getHistory();
|
|
110
|
+
// With the bug, history.length will be 3, because the first user message is dropped.
|
|
111
|
+
// The correct behavior is for the history to contain all 4 turns.
|
|
112
|
+
expect(history.length).toBe(4);
|
|
113
|
+
// Crucially, assert that the very first turn in the history matches the user's initial message.
|
|
114
|
+
// This is the assertion that will fail.
|
|
115
|
+
const firstTurn = history[0];
|
|
116
|
+
expect(firstTurn.role).toBe('user');
|
|
117
|
+
expect(firstTurn?.parts[0].text).toBe('How is the weather in Boston?');
|
|
118
|
+
// Verify the rest of the history is also correct.
|
|
119
|
+
const secondTurn = history[1];
|
|
120
|
+
expect(secondTurn.role).toBe('model');
|
|
121
|
+
expect(secondTurn?.parts[0].functionCall).toBeDefined();
|
|
122
|
+
const thirdTurn = history[2];
|
|
123
|
+
expect(thirdTurn.role).toBe('user');
|
|
124
|
+
expect(thirdTurn?.parts[0].functionResponse).toBeDefined();
|
|
125
|
+
const fourthTurn = history[3];
|
|
126
|
+
expect(fourthTurn.role).toBe('model');
|
|
127
|
+
expect(fourthTurn?.parts[0].text).toContain('72 degrees and sunny');
|
|
128
|
+
});
|
|
58
129
|
it('should throw an error when attempting to add a user turn after another user turn', async () => {
|
|
59
130
|
// 1. Setup: Create a history that already ends with a user turn (a functionResponse).
|
|
60
131
|
const initialHistory = [
|
|
@@ -184,6 +255,122 @@ describe('GeminiChat', () => {
|
|
|
184
255
|
});
|
|
185
256
|
});
|
|
186
257
|
describe('sendMessageStream', () => {
|
|
258
|
+
it('should succeed if a tool call is followed by an empty part', async () => {
|
|
259
|
+
// 1. Mock a stream that contains a tool call, then an invalid (empty) part.
|
|
260
|
+
const streamWithToolCall = (async function* () {
|
|
261
|
+
yield {
|
|
262
|
+
candidates: [
|
|
263
|
+
{
|
|
264
|
+
content: {
|
|
265
|
+
role: 'model',
|
|
266
|
+
parts: [{ functionCall: { name: 'test_tool', args: {} } }],
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
],
|
|
270
|
+
};
|
|
271
|
+
// This second chunk is invalid according to isValidResponse
|
|
272
|
+
yield {
|
|
273
|
+
candidates: [
|
|
274
|
+
{
|
|
275
|
+
content: {
|
|
276
|
+
role: 'model',
|
|
277
|
+
parts: [{ text: '' }],
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
],
|
|
281
|
+
};
|
|
282
|
+
})();
|
|
283
|
+
vi.mocked(mockModelsModule.generateContentStream).mockResolvedValue(streamWithToolCall);
|
|
284
|
+
// 2. Action & Assert: The stream processing should complete without throwing an error
|
|
285
|
+
// because the presence of a tool call makes the empty final chunk acceptable.
|
|
286
|
+
const stream = await chat.sendMessageStream({ message: 'test message' }, 'prompt-id-tool-call-empty-end');
|
|
287
|
+
await expect((async () => {
|
|
288
|
+
for await (const _ of stream) {
|
|
289
|
+
/* consume stream */
|
|
290
|
+
}
|
|
291
|
+
})()).resolves.not.toThrow();
|
|
292
|
+
// 3. Verify history was recorded correctly
|
|
293
|
+
const history = chat.getHistory();
|
|
294
|
+
expect(history.length).toBe(2); // user turn + model turn
|
|
295
|
+
const modelTurn = history[1];
|
|
296
|
+
expect(modelTurn?.parts?.length).toBe(1); // The empty part is discarded
|
|
297
|
+
expect(modelTurn?.parts[0].functionCall).toBeDefined();
|
|
298
|
+
});
|
|
299
|
+
it('should fail if the stream ends with an empty part and has no finishReason', async () => {
|
|
300
|
+
// 1. Mock a stream that ends with an invalid part and has no finish reason.
|
|
301
|
+
const streamWithNoFinish = (async function* () {
|
|
302
|
+
yield {
|
|
303
|
+
candidates: [
|
|
304
|
+
{
|
|
305
|
+
content: {
|
|
306
|
+
role: 'model',
|
|
307
|
+
parts: [{ text: 'Initial content...' }],
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
};
|
|
312
|
+
// This second chunk is invalid and has no finishReason, so it should fail.
|
|
313
|
+
yield {
|
|
314
|
+
candidates: [
|
|
315
|
+
{
|
|
316
|
+
content: {
|
|
317
|
+
role: 'model',
|
|
318
|
+
parts: [{ text: '' }],
|
|
319
|
+
},
|
|
320
|
+
},
|
|
321
|
+
],
|
|
322
|
+
};
|
|
323
|
+
})();
|
|
324
|
+
vi.mocked(mockModelsModule.generateContentStream).mockResolvedValue(streamWithNoFinish);
|
|
325
|
+
// 2. Action & Assert: The stream should fail because there's no finish reason.
|
|
326
|
+
const stream = await chat.sendMessageStream({ message: 'test message' }, 'prompt-id-no-finish-empty-end');
|
|
327
|
+
await expect((async () => {
|
|
328
|
+
for await (const _ of stream) {
|
|
329
|
+
/* consume stream */
|
|
330
|
+
}
|
|
331
|
+
})()).rejects.toThrow(EmptyStreamError);
|
|
332
|
+
});
|
|
333
|
+
it('should succeed if the stream ends with an invalid part but has a finishReason and contained a valid part', async () => {
|
|
334
|
+
// 1. Mock a stream that sends a valid chunk, then an invalid one, but has a finish reason.
|
|
335
|
+
const streamWithInvalidEnd = (async function* () {
|
|
336
|
+
yield {
|
|
337
|
+
candidates: [
|
|
338
|
+
{
|
|
339
|
+
content: {
|
|
340
|
+
role: 'model',
|
|
341
|
+
parts: [{ text: 'Initial valid content...' }],
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
],
|
|
345
|
+
};
|
|
346
|
+
// This second chunk is invalid, but the response has a finishReason.
|
|
347
|
+
yield {
|
|
348
|
+
candidates: [
|
|
349
|
+
{
|
|
350
|
+
content: {
|
|
351
|
+
role: 'model',
|
|
352
|
+
parts: [{ text: '' }], // Invalid part
|
|
353
|
+
},
|
|
354
|
+
finishReason: 'STOP',
|
|
355
|
+
},
|
|
356
|
+
],
|
|
357
|
+
};
|
|
358
|
+
})();
|
|
359
|
+
vi.mocked(mockModelsModule.generateContentStream).mockResolvedValue(streamWithInvalidEnd);
|
|
360
|
+
// 2. Action & Assert: The stream should complete without throwing an error.
|
|
361
|
+
const stream = await chat.sendMessageStream({ message: 'test message' }, 'prompt-id-valid-then-invalid-end');
|
|
362
|
+
await expect((async () => {
|
|
363
|
+
for await (const _ of stream) {
|
|
364
|
+
/* consume stream */
|
|
365
|
+
}
|
|
366
|
+
})()).resolves.not.toThrow();
|
|
367
|
+
// 3. Verify history was recorded correctly with only the valid part.
|
|
368
|
+
const history = chat.getHistory();
|
|
369
|
+
expect(history.length).toBe(2); // user turn + model turn
|
|
370
|
+
const modelTurn = history[1];
|
|
371
|
+
expect(modelTurn?.parts?.length).toBe(1);
|
|
372
|
+
expect(modelTurn?.parts[0].text).toBe('Initial valid content...');
|
|
373
|
+
});
|
|
187
374
|
it('should not consolidate text into a part that also contains a functionCall', async () => {
|
|
188
375
|
// 1. Mock the API to stream a malformed part followed by a valid text part.
|
|
189
376
|
const multiChunkStream = (async function* () {
|
|
@@ -246,7 +433,10 @@ describe('GeminiChat', () => {
|
|
|
246
433
|
// as the important part is consolidating what comes after.
|
|
247
434
|
yield {
|
|
248
435
|
candidates: [
|
|
249
|
-
{
|
|
436
|
+
{
|
|
437
|
+
content: { role: 'model', parts: [{ text: ' World!' }] },
|
|
438
|
+
finishReason: 'STOP',
|
|
439
|
+
},
|
|
250
440
|
],
|
|
251
441
|
};
|
|
252
442
|
})();
|
|
@@ -329,6 +519,7 @@ describe('GeminiChat', () => {
|
|
|
329
519
|
{ text: 'This is the visible text that should not be lost.' },
|
|
330
520
|
],
|
|
331
521
|
},
|
|
522
|
+
finishReason: 'STOP',
|
|
332
523
|
},
|
|
333
524
|
],
|
|
334
525
|
};
|
|
@@ -375,7 +566,10 @@ describe('GeminiChat', () => {
|
|
|
375
566
|
const emptyStreamResponse = (async function* () {
|
|
376
567
|
yield {
|
|
377
568
|
candidates: [
|
|
378
|
-
{
|
|
569
|
+
{
|
|
570
|
+
content: { role: 'model', parts: [{ thought: true }] },
|
|
571
|
+
finishReason: 'STOP',
|
|
572
|
+
},
|
|
379
573
|
],
|
|
380
574
|
};
|
|
381
575
|
})();
|
|
@@ -591,6 +785,39 @@ describe('GeminiChat', () => {
|
|
|
591
785
|
});
|
|
592
786
|
});
|
|
593
787
|
describe('sendMessageStream with retries', () => {
|
|
788
|
+
it('should yield a RETRY event when an invalid stream is encountered', async () => {
|
|
789
|
+
// ARRANGE: Mock the stream to fail once, then succeed.
|
|
790
|
+
vi.mocked(mockModelsModule.generateContentStream)
|
|
791
|
+
.mockImplementationOnce(async () =>
|
|
792
|
+
// First attempt: An invalid stream with an empty text part.
|
|
793
|
+
(async function* () {
|
|
794
|
+
yield {
|
|
795
|
+
candidates: [{ content: { parts: [{ text: '' }] } }],
|
|
796
|
+
};
|
|
797
|
+
})())
|
|
798
|
+
.mockImplementationOnce(async () =>
|
|
799
|
+
// Second attempt (the retry): A minimal valid stream.
|
|
800
|
+
(async function* () {
|
|
801
|
+
yield {
|
|
802
|
+
candidates: [
|
|
803
|
+
{
|
|
804
|
+
content: { parts: [{ text: 'Success' }] },
|
|
805
|
+
finishReason: 'STOP',
|
|
806
|
+
},
|
|
807
|
+
],
|
|
808
|
+
};
|
|
809
|
+
})());
|
|
810
|
+
// ACT: Send a message and collect all events from the stream.
|
|
811
|
+
const stream = await chat.sendMessageStream({ message: 'test' }, 'prompt-id-yield-retry');
|
|
812
|
+
const events = [];
|
|
813
|
+
for await (const event of stream) {
|
|
814
|
+
events.push(event);
|
|
815
|
+
}
|
|
816
|
+
// ASSERT: Check that a RETRY event was present in the stream's output.
|
|
817
|
+
const retryEvent = events.find((e) => e.type === StreamEventType.RETRY);
|
|
818
|
+
expect(retryEvent).toBeDefined();
|
|
819
|
+
expect(retryEvent?.type).toBe(StreamEventType.RETRY);
|
|
820
|
+
});
|
|
594
821
|
it('should retry on invalid content, succeed, and report metrics', async () => {
|
|
595
822
|
// Use mockImplementationOnce to provide a fresh, promise-wrapped generator for each attempt.
|
|
596
823
|
vi.mocked(mockModelsModule.generateContentStream)
|
|
@@ -606,7 +833,10 @@ describe('GeminiChat', () => {
|
|
|
606
833
|
(async function* () {
|
|
607
834
|
yield {
|
|
608
835
|
candidates: [
|
|
609
|
-
{
|
|
836
|
+
{
|
|
837
|
+
content: { parts: [{ text: 'Successful response' }] },
|
|
838
|
+
finishReason: 'STOP',
|
|
839
|
+
},
|
|
610
840
|
],
|
|
611
841
|
};
|
|
612
842
|
})());
|
|
@@ -620,8 +850,12 @@ describe('GeminiChat', () => {
|
|
|
620
850
|
expect(mockLogContentRetry).toHaveBeenCalledTimes(1);
|
|
621
851
|
expect(mockLogContentRetryFailure).not.toHaveBeenCalled();
|
|
622
852
|
expect(mockModelsModule.generateContentStream).toHaveBeenCalledTimes(2);
|
|
623
|
-
|
|
624
|
-
|
|
853
|
+
// Check for a retry event
|
|
854
|
+
expect(chunks.some((c) => c.type === StreamEventType.RETRY)).toBe(true);
|
|
855
|
+
// Check for the successful content chunk
|
|
856
|
+
expect(chunks.some((c) => c.type === StreamEventType.CHUNK &&
|
|
857
|
+
c.value.candidates?.[0]?.content?.parts?.[0]?.text ===
|
|
858
|
+
'Successful response')).toBe(true);
|
|
625
859
|
// Check that history was recorded correctly once, with no duplicates.
|
|
626
860
|
const history = chat.getHistory();
|
|
627
861
|
expect(history.length).toBe(2);
|
|
@@ -683,7 +917,12 @@ describe('GeminiChat', () => {
|
|
|
683
917
|
// Second attempt succeeds
|
|
684
918
|
(async function* () {
|
|
685
919
|
yield {
|
|
686
|
-
candidates: [
|
|
920
|
+
candidates: [
|
|
921
|
+
{
|
|
922
|
+
content: { parts: [{ text: 'Second answer' }] },
|
|
923
|
+
finishReason: 'STOP',
|
|
924
|
+
},
|
|
925
|
+
],
|
|
687
926
|
};
|
|
688
927
|
})());
|
|
689
928
|
// 3. Send a new message
|
|
@@ -787,6 +1026,7 @@ describe('GeminiChat', () => {
|
|
|
787
1026
|
content: {
|
|
788
1027
|
parts: [{ text: 'Successful response after empty' }],
|
|
789
1028
|
},
|
|
1029
|
+
finishReason: 'STOP',
|
|
790
1030
|
},
|
|
791
1031
|
],
|
|
792
1032
|
};
|
|
@@ -799,8 +1039,9 @@ describe('GeminiChat', () => {
|
|
|
799
1039
|
}
|
|
800
1040
|
// 3. Assert the results.
|
|
801
1041
|
expect(mockModelsModule.generateContentStream).toHaveBeenCalledTimes(2);
|
|
802
|
-
expect(chunks.some((c) => c.
|
|
803
|
-
|
|
1042
|
+
expect(chunks.some((c) => c.type === StreamEventType.CHUNK &&
|
|
1043
|
+
c.value.candidates?.[0]?.content?.parts?.[0]?.text ===
|
|
1044
|
+
'Successful response after empty')).toBe(true);
|
|
804
1045
|
const history = chat.getHistory();
|
|
805
1046
|
expect(history.length).toBe(2);
|
|
806
1047
|
// Explicitly verify the structure of each part to satisfy TypeScript
|
|
@@ -830,12 +1071,22 @@ describe('GeminiChat', () => {
|
|
|
830
1071
|
};
|
|
831
1072
|
await firstStreamContinuePromise; // Pause the stream
|
|
832
1073
|
yield {
|
|
833
|
-
candidates: [
|
|
1074
|
+
candidates: [
|
|
1075
|
+
{
|
|
1076
|
+
content: { parts: [{ text: ' part 2' }] },
|
|
1077
|
+
finishReason: 'STOP',
|
|
1078
|
+
},
|
|
1079
|
+
],
|
|
834
1080
|
};
|
|
835
1081
|
})();
|
|
836
1082
|
const secondStreamGenerator = (async function* () {
|
|
837
1083
|
yield {
|
|
838
|
-
candidates: [
|
|
1084
|
+
candidates: [
|
|
1085
|
+
{
|
|
1086
|
+
content: { parts: [{ text: 'second response' }] },
|
|
1087
|
+
finishReason: 'STOP',
|
|
1088
|
+
},
|
|
1089
|
+
],
|
|
839
1090
|
};
|
|
840
1091
|
})();
|
|
841
1092
|
vi.mocked(mockModelsModule.generateContentStream)
|
|
@@ -871,5 +1122,57 @@ describe('GeminiChat', () => {
|
|
|
871
1122
|
}
|
|
872
1123
|
expect(turn4.parts[0].text).toBe('second response');
|
|
873
1124
|
});
|
|
1125
|
+
it('should discard valid partial content from a failed attempt upon retry', async () => {
|
|
1126
|
+
// ARRANGE: Mock the stream to fail on the first attempt after yielding some valid content.
|
|
1127
|
+
vi.mocked(mockModelsModule.generateContentStream)
|
|
1128
|
+
.mockImplementationOnce(async () =>
|
|
1129
|
+
// First attempt: yields one valid chunk, then one invalid chunk
|
|
1130
|
+
(async function* () {
|
|
1131
|
+
yield {
|
|
1132
|
+
candidates: [
|
|
1133
|
+
{
|
|
1134
|
+
content: {
|
|
1135
|
+
parts: [{ text: 'This valid part should be discarded' }],
|
|
1136
|
+
},
|
|
1137
|
+
},
|
|
1138
|
+
],
|
|
1139
|
+
};
|
|
1140
|
+
yield {
|
|
1141
|
+
candidates: [{ content: { parts: [{ text: '' }] } }], // Invalid chunk triggers retry
|
|
1142
|
+
};
|
|
1143
|
+
})())
|
|
1144
|
+
.mockImplementationOnce(async () =>
|
|
1145
|
+
// Second attempt (the retry): succeeds
|
|
1146
|
+
(async function* () {
|
|
1147
|
+
yield {
|
|
1148
|
+
candidates: [
|
|
1149
|
+
{
|
|
1150
|
+
content: {
|
|
1151
|
+
parts: [{ text: 'Successful final response' }],
|
|
1152
|
+
},
|
|
1153
|
+
finishReason: 'STOP',
|
|
1154
|
+
},
|
|
1155
|
+
],
|
|
1156
|
+
};
|
|
1157
|
+
})());
|
|
1158
|
+
// ACT: Send a message and consume the stream
|
|
1159
|
+
const stream = await chat.sendMessageStream({ message: 'test' }, 'prompt-id-discard-test');
|
|
1160
|
+
const events = [];
|
|
1161
|
+
for await (const event of stream) {
|
|
1162
|
+
events.push(event);
|
|
1163
|
+
}
|
|
1164
|
+
// ASSERT
|
|
1165
|
+
// Check that a retry happened
|
|
1166
|
+
expect(mockModelsModule.generateContentStream).toHaveBeenCalledTimes(2);
|
|
1167
|
+
expect(events.some((e) => e.type === StreamEventType.RETRY)).toBe(true);
|
|
1168
|
+
// Check the final recorded history
|
|
1169
|
+
const history = chat.getHistory();
|
|
1170
|
+
expect(history.length).toBe(2); // user turn + final model turn
|
|
1171
|
+
const modelTurn = history[1];
|
|
1172
|
+
// The model turn should only contain the text from the successful attempt
|
|
1173
|
+
expect(modelTurn.parts[0].text).toBe('Successful final response');
|
|
1174
|
+
// It should NOT contain any text from the failed attempt
|
|
1175
|
+
expect(modelTurn.parts[0].text).not.toContain('This valid part should be discarded');
|
|
1176
|
+
});
|
|
874
1177
|
});
|
|
875
1178
|
//# sourceMappingURL=geminiChat.test.js.map
|