use oai_sdk::{ChatRequest, Message, ModelClient};
use std::io::{self, Write};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = ModelClient::builder()
.base_url("http://localhost:11434")
.build()?;
println!("Ollama Client Chat Example");
println!("Enter 'quit' to exit\n");
match client.get_version().await {
Ok(version) => println!("Connected to Ollama version: {}\n", version.version),
Err(e) => {
println!("Warning: Could not connect to Ollama: {}", e);
println!("Make sure Ollama is running at http://localhost:11434\n");
}
}
match client.list_models().await {
Ok(models) => {
println!("Available models:");
for model in models.iter().take(3) {
println!(" - {} ({})", model.name, model.details.parameter_size);
}
if models.len() > 3 {
println!(" ... and {} more", models.len() - 3);
}
println!();
}
Err(e) => {
println!("Warning: Could not list models: {}\n", e);
}
}
let mut messages = Vec::new();
loop {
print!("You: ");
io::stdout().flush()?;
let mut input = String::new();
io::stdin().read_line(&mut input)?;
let input = input.trim();
if input.to_lowercase() == "quit" {
println!("Goodbye!");
break;
}
if input.is_empty() {
continue;
}
messages.push(Message::user(input));
let request = ChatRequest {
model: "llama3.1:8b".to_string(), messages: messages.clone(),
stream: false,
format: None,
options: None,
keep_alive: None,
tools: None,
think: None,
};
match client.chat(request).await {
Ok(response) => {
println!("Assistant: {}", response.message.content);
println!();
messages.push(Message::assistant(response.message.content));
}
Err(e) => {
println!("Error: {}", e);
}
}
}
Ok(())
}