use plainllm::client::{self, extract_answer};
use std::io::{self, Write};
mod utils;
#[tokio::main]
async fn main() {
utils::init_logger();
let args = utils::get_client_args();
let mut messages = vec![client::Message::new(
"system",
r#"You are a helpful assistant. Help the user with whatever they need help with."#,
)];
loop {
let user_message = ask_for_input("You:");
println!("");
messages.push(client::Message::new("user", &user_message));
println!("Assistant:");
let opts = client::LLMOptions::new()
.streaming(true)
.on_token(|tok| {
if tok != "\n" {
print!("{}", tok);
let _ = io::stdout().flush();
}
})
.on_start_thinking(|| print!("\x1b[93m"))
.on_stop_thinking(|| print!("\x1b[0m\n"))
.on_thinking(|tok| {
print!("{}", tok);
let _ = io::stdout().flush();
});
let (resp, _msgs) = args
.client
.call_llm(&args.model, messages.clone(), &opts)
.await
.expect("Couldn't get response from llm");
let answer = extract_answer(resp);
messages.push(client::Message::new("assistant", &answer));
println!("\n");
}
}
fn ask_for_input(message: &str) -> String {
println!("{}", message);
let _ = io::stdout().flush();
let mut input = String::new();
io::stdin()
.read_line(&mut input)
.expect("Failed to read line");
input.trim().to_string()
}