mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-13 05:12:55 -07:00
fix: resolve "function response turn must come immediately after function call" error (#26691)
Co-authored-by: Tommaso Sciortino <sciortino@gmail.com>
This commit is contained in:
@@ -2796,4 +2796,71 @@ describe('GeminiChat', () => {
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getHistory with curated: true', () => {
|
||||
it('should not drop model turns with function calls and empty text', () => {
|
||||
const history: Content[] = [
|
||||
{ role: 'user', parts: [{ text: 'Hello' }] },
|
||||
{
|
||||
role: 'model',
|
||||
parts: [{ functionCall: { name: 'test_tool', args: {} }, text: '' }],
|
||||
},
|
||||
{
|
||||
role: 'user',
|
||||
parts: [{ functionResponse: { name: 'test_tool', response: {} } }],
|
||||
},
|
||||
];
|
||||
const chatWithHistory = new GeminiChat(mockConfig, '', [], history);
|
||||
|
||||
const curatedHistory = chatWithHistory.getHistory(true);
|
||||
|
||||
expect(curatedHistory.length).toBe(3);
|
||||
expect(curatedHistory[1].role).toBe('model');
|
||||
expect(curatedHistory[1].parts![0].functionCall).toBeDefined();
|
||||
});
|
||||
|
||||
it('should not drop model turns with inlineData and empty text', () => {
|
||||
const history: Content[] = [
|
||||
{ role: 'user', parts: [{ text: 'Hello' }] },
|
||||
{
|
||||
role: 'model',
|
||||
parts: [
|
||||
{
|
||||
inlineData: { mimeType: 'image/jpeg', data: 'base64...' },
|
||||
text: '',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
const chatWithHistory = new GeminiChat(mockConfig, '', [], history);
|
||||
|
||||
const curatedHistory = chatWithHistory.getHistory(true);
|
||||
|
||||
expect(curatedHistory.length).toBe(2);
|
||||
expect(curatedHistory[1].role).toBe('model');
|
||||
expect(curatedHistory[1].parts![0].inlineData).toBeDefined();
|
||||
});
|
||||
|
||||
it('should not drop model turns with fileData and empty text', () => {
|
||||
const history: Content[] = [
|
||||
{ role: 'user', parts: [{ text: 'Hello' }] },
|
||||
{
|
||||
role: 'model',
|
||||
parts: [
|
||||
{
|
||||
fileData: { mimeType: 'image/jpeg', fileUri: 'https://...' },
|
||||
text: '',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
const chatWithHistory = new GeminiChat(mockConfig, '', [], history);
|
||||
|
||||
const curatedHistory = chatWithHistory.getHistory(true);
|
||||
|
||||
expect(curatedHistory.length).toBe(2);
|
||||
expect(curatedHistory[1].role).toBe('model');
|
||||
expect(curatedHistory[1].parts![0].fileData).toBeDefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -146,7 +146,15 @@ function isValidContent(content: Content): boolean {
|
||||
if (part === undefined || Object.keys(part).length === 0) {
|
||||
return false;
|
||||
}
|
||||
if (!part.thought && part.text !== undefined && part.text === '') {
|
||||
if (
|
||||
!part.thought &&
|
||||
!part.functionCall &&
|
||||
!part.functionResponse &&
|
||||
!part.inlineData &&
|
||||
!part.fileData &&
|
||||
part.text !== undefined &&
|
||||
part.text === ''
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user