diff --git a/packages/core/src/core/openaiContentGenerator/converter.test.ts b/packages/core/src/core/openaiContentGenerator/converter.test.ts index 8d3090bee..c896cb9b7 100644 --- a/packages/core/src/core/openaiContentGenerator/converter.test.ts +++ b/packages/core/src/core/openaiContentGenerator/converter.test.ts @@ -207,6 +207,27 @@ describe('OpenAIContentConverter', () => { expect.objectContaining({ text: 'visible text' }), ); }); + + it('should not throw when streaming chunk has no delta', () => { + const chunk = converter.convertOpenAIChunkToGemini({ + object: 'chat.completion.chunk', + id: 'chunk-2', + created: 456, + choices: [ + { + index: 0, + // Some OpenAI-compatible providers may omit delta entirely. + delta: undefined, + finish_reason: null, + logprobs: null, + }, + ], + model: 'gpt-test', + } as unknown as OpenAI.Chat.ChatCompletionChunk); + + const parts = chunk.candidates?.[0]?.content?.parts; + expect(parts).toEqual([]); + }); }); describe('convertGeminiToolsToOpenAI', () => { diff --git a/packages/core/src/core/openaiContentGenerator/converter.ts b/packages/core/src/core/openaiContentGenerator/converter.ts index ed2495da1..690751a2a 100644 --- a/packages/core/src/core/openaiContentGenerator/converter.ts +++ b/packages/core/src/core/openaiContentGenerator/converter.ts @@ -799,7 +799,7 @@ export class OpenAIContentConverter { const parts: Part[] = []; const reasoningText = (choice.delta as ExtendedCompletionChunkDelta) - .reasoning_content; + ?.reasoning_content; if (reasoningText) { parts.push({ text: reasoningText, thought: true }); }