From e49e37909623b4ff9ea2a8308c27cd236f1446a9 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 5 May 2026 15:16:01 +0000 Subject: [PATCH] fix: restore SSE streaming via StreamConsumer for text messages --- src/bot/index.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/bot/index.js b/src/bot/index.js index 1547fb03..51b353ce 100644 --- a/src/bot/index.js +++ b/src/bot/index.js @@ -675,24 +675,31 @@ export async function initBot(config, api, tools, skills, agents) { await queueRequest(key, text, async () => { await ctx.api.sendChatAction(ctx.chat.id, 'typing'); - - // Use self-correction + direct send (streaming disabled for reliability) + + // Create stream consumer for real-time edit-in-place + const consumer = new StreamConsumer(ctx, { editInterval: 1000 }); + const runPromise = consumer.run(); + + // Wrap chatWithAI with self-correction + streaming const chatWithCorrection = withSelfCorrection(async (msgs) => { - return await chatWithAI(msgs); + return await chatWithAI(msgs, { onDelta: (token) => consumer.onDelta(token) }); }); - + const result = await chatWithCorrection([ { role: 'system', content: buildSystemPrompt(svc) }, { role: 'user', content: text }, ]); - - // Send formatted response - if (result) { - logger.info(`📤 Sending response (${result.length} chars)`); + + // Signal completion and wait for final edit + consumer.finish(); + await runPromise; + + // If streaming failed to deliver (no message sent), fallback to plain send + if (!consumer.alreadySent && result) { + logger.info(`📤 Streaming failed, fallback send (${result.length} chars)`); await sendFormatted(ctx, result); - logger.info('✅ Response delivered'); } else { - logger.warn('Empty response from AI — nothing to send'); + logger.info('✅ Stream delivered'); } // ── Self-learning: extract patterns from this interaction ──