From ea5c725aa8eef190a990f6a8e80ec8c89fe8bd71 Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Tue, 3 Mar 2026 11:56:16 -0500 Subject: [PATCH 1/2] fix(streaming): use iter instead of once for [DONE] marker --- src/server/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 0956f1c3..8ef3669e 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -283,10 +283,10 @@ async fn chat_completions( // Many OpenAI-compatible clients expect a terminal [DONE] marker. // Emit it when the upstream stream ends to avoid clients treating // the response as incomplete. - let done = futures::stream::once(async { - Ok::(Event::default().data("[DONE]")) - }); - let out = sse_stream.chain(done); + // Convert to a Vec first, then append [DONE], then stream it + let done_event = Ok::(Event::default().data("[DONE]")); + let done_stream = futures::stream::iter(vec![done_event]); + let out = sse_stream.chain(done_stream); Ok( Sse::new(out) From 743dceafb44d55fd849dd444a94b48b590f2bd2f Mon Sep 17 00:00:00 2001 From: hobokenchicken Date: Tue, 3 Mar 2026 12:24:29 -0500 Subject: [PATCH 2/2] fix(streaming): remove keep-alive to debug [DONE] marker issue --- src/server/mod.rs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/server/mod.rs b/src/server/mod.rs index 8ef3669e..a172e8d2 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -283,20 +283,11 @@ async fn chat_completions( // Many OpenAI-compatible clients expect a terminal [DONE] marker. // Emit it when the upstream stream ends to avoid clients treating // the response as incomplete. - // Convert to a Vec first, then append [DONE], then stream it let done_event = Ok::(Event::default().data("[DONE]")); let done_stream = futures::stream::iter(vec![done_event]); let out = sse_stream.chain(done_stream); - Ok( - Sse::new(out) - .keep_alive( - axum::response::sse::KeepAlive::new() - .interval(Duration::from_secs(15)) - .text(": keep-alive"), - ) - .into_response(), - ) + Ok(Sse::new(out).into_response()) } Err(e) => { // Record provider failure