diff --git a/src/backend/src/modules/puterai/ClaudeService.js b/src/backend/src/modules/puterai/ClaudeService.js index f171c466d..3d8a82af6 100644 --- a/src/backend/src/modules/puterai/ClaudeService.js +++ b/src/backend/src/modules/puterai/ClaudeService.js @@ -90,6 +90,7 @@ class ClaudeService extends BaseService { }); stream.write(str + '\n'); } + stream.end(); })(); return retval; diff --git a/src/backend/src/modules/puterai/GroqAIService.js b/src/backend/src/modules/puterai/GroqAIService.js index 3426d7796..f0beab726 100644 --- a/src/backend/src/modules/puterai/GroqAIService.js +++ b/src/backend/src/modules/puterai/GroqAIService.js @@ -54,6 +54,7 @@ class GroqAIService extends BaseService { }); stream.write(str + '\n'); } + stream.end(); })(); return retval; } diff --git a/src/backend/src/modules/puterai/MistralAIService.js b/src/backend/src/modules/puterai/MistralAIService.js index 730dca0dc..b57219bbe 100644 --- a/src/backend/src/modules/puterai/MistralAIService.js +++ b/src/backend/src/modules/puterai/MistralAIService.js @@ -55,6 +55,7 @@ class MistralAIService extends BaseService { }); stream.write(str + '\n'); } + stream.end(); })(); return retval; } diff --git a/src/backend/src/modules/puterai/OpenAICompletionService.js b/src/backend/src/modules/puterai/OpenAICompletionService.js index e9cca41f5..304cc0c2e 100644 --- a/src/backend/src/modules/puterai/OpenAICompletionService.js +++ b/src/backend/src/modules/puterai/OpenAICompletionService.js @@ -232,6 +232,7 @@ class OpenAICompletionService extends BaseService { }); stream.write(str + '\n'); } + stream.end(); })(); return retval; } diff --git a/src/backend/src/modules/puterai/TogetherAIService.js b/src/backend/src/modules/puterai/TogetherAIService.js index ab0abf956..9001fb941 100644 --- a/src/backend/src/modules/puterai/TogetherAIService.js +++ b/src/backend/src/modules/puterai/TogetherAIService.js @@ -59,6 +59,7 @@ class TogetherAIService extends BaseService { }); stream.write(str + '\n'); } + stream.end(); })(); return retval; } diff --git a/src/puter-js/src/lib/utils.js b/src/puter-js/src/lib/utils.js index 1d8af33fd..212ee6bea 100644 --- a/src/puter-js/src/lib/utils.js +++ b/src/puter-js/src/lib/utils.js @@ -279,15 +279,12 @@ async function driverCall_( // =============================================== let is_stream = false; - let got_headers = false; let signal_stream_update = null; let lastLength = 0; let response_complete = false; const parts_received = []; xhr.onreadystatechange = () => { - if ( got_headers ) return; - got_headers = true; - if ( xhr.readyState >= 2 ) { + if ( xhr.readyState === 2 ) { if ( xhr.getResponseHeader("Content-Type") !== 'application/x-ndjson' ) return; @@ -311,6 +308,12 @@ async function driverCall_( return resolve_func(Stream()); } + if ( xhr.readyState === 4 ) { + response_complete = true; + if ( is_stream ) { + signal_stream_update?.(); + } + } }; xhr.onprogress = function() { @@ -323,19 +326,13 @@ async function driverCall_( signal_stream_update(); }; - xhr.addEventListener('load', () => { - response_complete = true; - }); - // ======================== // === END OF STREAMING === // ======================== // load: success or error xhr.addEventListener('load', async function(response){ - response_complete = true; if ( is_stream ) { - signal_stream_update?.(); return; } const resp = await parseResponse(response.target);