plainllm 1.2.0

A plain & simple LLM client
Documentation
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()
}