From f5205247f7e9b33733e9e467371bb1265dd1890f Mon Sep 17 00:00:00 2001 From: alvinouille Date: Tue, 15 Jul 2025 23:20:21 +0200 Subject: [PATCH 1/2] fix: gemini model to gemini-2.5-flash and header when streaming:true --- .../backend/src/config/provider/gemini.ts | 2 +- .../src/routes/chatCompletionHandler.ts | 51 +++++++++++++++---- 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/packages/backend/src/config/provider/gemini.ts b/packages/backend/src/config/provider/gemini.ts index c6886caa..61c3a98b 100644 --- a/packages/backend/src/config/provider/gemini.ts +++ b/packages/backend/src/config/provider/gemini.ts @@ -17,7 +17,7 @@ export const loadGeminiChatModels = async () => { 'Gemini Flash 2.5': new ChatGoogleGenerativeAI({ temperature: 0.7, apiKey: geminiApiKey, - modelName: 'gemini-2.5-flash-preview-04-17', + modelName: 'gemini-2.5-flash', }), }; diff --git a/packages/backend/src/routes/chatCompletionHandler.ts b/packages/backend/src/routes/chatCompletionHandler.ts index 4bbf87d7..57f567f4 100644 --- a/packages/backend/src/routes/chatCompletionHandler.ts +++ b/packages/backend/src/routes/chatCompletionHandler.ts @@ -132,6 +132,11 @@ export async function handleChatCompletion( let responseContent = ''; agent.on('data', (data: any) => { + // Check if response is already finished + if (res.destroyed || res.writableEnded) { + return; + } + const parsed = JSON.parse(data); if (parsed.type === 'response') { @@ -162,14 +167,24 @@ export async function handleChatCompletion( agent.on('error', (error: any) => { console.error('Agent error:', error); - res.write(`data: ${JSON.stringify({ error: error.message })}\n\n`); - res.end(); + if (!res.destroyed && !res.writableEnded) { + res.write(`data: ${JSON.stringify({ error: error.message })}\n\n`); + res.end(); + } }); agent.on('end', () => { + // Check if response is already finished + if (res.destroyed || res.writableEnded) { + return; + } + const tokenUsage = TokenTracker.getSessionTokenUsage(); - res.setHeader('x-total-tokens', tokenUsage.totalTokens.toString()); + // Check if headers haven't been sent yet + if (!res.headersSent) { + res.setHeader('x-total-tokens', tokenUsage.totalTokens.toString()); + } const finalChunk = { id: uuidv4(), @@ -210,16 +225,25 @@ export async function handleChatCompletion( agent.on('error', (error: any) => { console.error('Agent error:', error); - res.status(500).json({ - error: { - message: error.message, - type: 'server_error', - code: 'internal_error', - }, - }); + + // Check if headers haven't been sent yet + if (!res.headersSent) { + res.status(500).json({ + error: { + message: error.message, + type: 'server_error', + code: 'internal_error', + }, + }); + } }); agent.on('end', () => { + // Check if headers haven't been sent yet + if (res.headersSent) { + return; + } + const tokenUsage = TokenTracker.getSessionTokenUsage(); res.setHeader('x-total-tokens', tokenUsage.totalTokens.toString()); @@ -258,6 +282,11 @@ export async function handleChatCompletion( } catch (error) { console.error('Error in chat completion:', error); + // Check if headers haven't been sent yet + if (res.headersSent) { + return; + } + // Map common errors to OpenAI error format if (error instanceof Error) { const errorResponse: any = { @@ -292,4 +321,4 @@ export async function handleChatCompletion( }, }); } -} +} \ No newline at end of file From e4a9d96fff2421874ec4969df617ce1d4c60659f Mon Sep 17 00:00:00 2001 From: alvinouille Date: Tue, 15 Jul 2025 23:26:40 +0200 Subject: [PATCH 2/2] fix: format --- packages/backend/src/routes/chatCompletionHandler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/routes/chatCompletionHandler.ts b/packages/backend/src/routes/chatCompletionHandler.ts index 57f567f4..dc00c3be 100644 --- a/packages/backend/src/routes/chatCompletionHandler.ts +++ b/packages/backend/src/routes/chatCompletionHandler.ts @@ -225,7 +225,7 @@ export async function handleChatCompletion( agent.on('error', (error: any) => { console.error('Agent error:', error); - + // Check if headers haven't been sent yet if (!res.headersSent) { res.status(500).json({ @@ -321,4 +321,4 @@ export async function handleChatCompletion( }, }); } -} \ No newline at end of file +}