use harness::{Harness, Error, OpenHarness, RunEvent, RunMode, RunRequest, RunTuning};
#[path = "common/mod.rs"]
mod common;
fn main() -> Result<(), Error> {
let agent = OpenHarness::ollama();
let readiness = agent.readiness();
if !readiness.ready {
eprintln!("Ollama is not reachable: {}", readiness.error.unwrap_or_default());
return Ok(());
}
let model = match std::env::var("OLLAMA_MODEL") {
Ok(m) if !m.trim().is_empty() => m,
_ => match common::largest_installed(&agent)? {
Some(name) => name,
None => {
eprintln!("No models installed. Try `ollama pull qwen3:4b`.");
return Ok(());
}
},
};
eprintln!("[model] {model}\n");
let (_handle, events) = agent.run(RunRequest {
run_id: "tools".into(),
prompt: "List the files in the current directory, then say how many there are.".into(),
cwd: Some(std::env::current_dir().unwrap_or_default()),
mode: RunMode::Ask,
tuning: RunTuning { model: Some(model), ..Default::default() },
..Default::default()
})?;
let mut calls = 0usize;
for event in events {
match event {
RunEvent::ToolStart { title, tool_kind, locations, .. } => {
calls += 1;
let where_ = locations
.iter()
.map(|l| l.path.clone())
.collect::<Vec<_>>()
.join(", ");
eprintln!("[tool {calls}] {title} ({tool_kind:?}) {where_}");
}
RunEvent::ToolEnd { ok, content, .. } => {
let preview = content.unwrap_or_default();
let first =
preview.lines().next().unwrap_or("").chars().take(72).collect::<String>();
eprintln!("[done] ok={ok} -> {first}…");
}
RunEvent::Text { delta, .. } => print!("{delta}"),
RunEvent::Thinking { delta, .. } => eprint!("{delta}"),
RunEvent::Error { message, .. } => eprintln!("\n[error] {message}"),
RunEvent::Exited { .. } => break,
_ => {}
}
}
eprintln!("\n\n{calls} tool call(s).");
if calls == 0 {
eprintln!("The model answered without using a tool. Try a larger one.");
}
Ok(())
}