feat(tui): implement streaming support for LLM responses and update transcript handling

This commit is contained in:
asepharyana
2026-07-20 14:51:16 +07:00
parent 5a373d1031
commit cac6626586
3 changed files with 45 additions and 8 deletions
+20 -8
View File
@@ -128,13 +128,27 @@ fn run_turn(
debug!("agent turn iteration {iteration}");
// Blocking LLM call (reqwest::blocking::Client is sync)
let result = client.chat_with_tools_non_streaming(
// Stream the LLM response
push_event(turn_events, TurnEvent::StreamStart);
let result = client.chat_with_tools_streaming(
messages,
Some(defs.clone()),
Some(4096),
Some(0.7),
None, // no atomic abort flag for the sync API
Some(4096),
|event| {
if abort.load(Ordering::SeqCst) {
return false;
}
match event {
zesdex_domain::core::StreamEvent::Token(s) | zesdex_domain::core::StreamEvent::Reasoning(s) => {
push_event(turn_events, TurnEvent::StreamToken(s.clone()));
}
_ => {}
}
true
},
Some(&abort),
);
match result {
@@ -142,6 +156,8 @@ fn run_turn(
let content = assistant_msg.content.clone().unwrap_or_default();
let tool_calls = assistant_msg.tool_calls.clone().unwrap_or_default();
push_event(turn_events, TurnEvent::StreamDone(assistant_msg.clone()));
if let Some((tokens_in, tokens_out)) = usage {
push_event(turn_events, TurnEvent::Usage {
tokens_in,
@@ -149,10 +165,6 @@ fn run_turn(
});
}
if !content.is_empty() {
push_event(turn_events, TurnEvent::AssistantMessage(assistant_msg.clone()));
}
if tool_calls.is_empty() {
messages.push(ChatMessage::assistant(Some(content)));
break;