From 44dc7a3bed994bf0aa5d167747effc5ecdd29324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Mon, 17 Nov 2025 18:31:24 +0100 Subject: [PATCH] fix: Emit pending items before Completed when stream closes gracefully MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - When SSE stream closes with Ok(None), now emits pending assistant_item and reasoning_item BEFORE sending Completed event - Previously would send Completed immediately without emitting accumulated messages, causing UI to hang with "working" state - This fixes the hang when API returns 200 OK but SSE stream has no events - Added debug logging for graceful stream closure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- llmx-rs/core/src/chat_completions.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/llmx-rs/core/src/chat_completions.rs b/llmx-rs/core/src/chat_completions.rs index 14d81294..bc9b6cbf 100644 --- a/llmx-rs/core/src/chat_completions.rs +++ b/llmx-rs/core/src/chat_completions.rs @@ -645,7 +645,14 @@ async fn process_chat_sse( return; } Ok(None) => { - // Stream closed gracefully – emit Completed with dummy id. + // Stream closed gracefully – emit any pending items first, then Completed + debug!("Stream closed gracefully (Ok(None)), emitting pending items"); + if let Some(item) = assistant_item.take() { + let _ = tx_event.send(Ok(ResponseEvent::OutputItemDone(item))).await; + } + if let Some(item) = reasoning_item.take() { + let _ = tx_event.send(Ok(ResponseEvent::OutputItemDone(item))).await; + } let _ = tx_event .send(Ok(ResponseEvent::Completed { response_id: String::new(),