From 1b040a42782d5f7d4d2ca8b7e4cc558ac70006da Mon Sep 17 00:00:00 2001 From: "Rodrigo Rodriguez (Pragmatismo)" Date: Mon, 13 Apr 2026 19:59:00 -0300 Subject: [PATCH] fix: kimi stream - handle channel close, add parse error trace, fix buffer handling --- src/llm/kimi.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/llm/kimi.rs b/src/llm/kimi.rs index df574c12..df2f1f0f 100644 --- a/src/llm/kimi.rs +++ b/src/llm/kimi.rs @@ -323,7 +323,10 @@ impl LLMProvider for KimiClient { if let Some(text) = delta.get("content").and_then(|c| c.as_str()) { if !text.is_empty() { total_content_chars += text.len(); - let _ = tx.send(text.to_string()).await; + if tx.send(text.to_string()).await.is_err() { + info!("[Kimi] Channel closed, stopping stream after {} content chars", total_content_chars); + return Ok(()); + } } } } @@ -337,16 +340,20 @@ impl LLMProvider for KimiClient { } } } + } else { + log::trace!("[Kimi] Failed to parse JSON: {} chars", json_str.len()); } } } + // Keep only unprocessed data in buffer if let Some(last_newline) = data.rfind('\n') { buffer = buffer[last_newline + 1..].to_vec(); } } - std::mem::drop(tx.send(String::new())); + info!("[Kimi] Stream ended (no [DONE]), {} chunks, {} content chars", chunk_count, total_content_chars); + let _ = tx.send(String::new()).await; Ok(()) }