use harness::{
ApiKey, Error, Harness, OpenHarness, OpenHarnessConfig, RunEvent, RunRequest, RunTuning,
};
fn main() -> Result<(), Error> {
let base_url = std::env::var("LLAMA_SERVER_URL")
.unwrap_or_else(|_| "http://localhost:8080".into());
let disabled_tools: Vec<String> = std::env::var("LLAMA_DISABLE_TOOLS")
.unwrap_or_default()
.split(',')
.map(str::trim)
.filter(|name| !name.is_empty())
.map(str::to_owned)
.collect();
let llama = OpenHarness::custom(OpenHarnessConfig {
id: "llama-cpp".into(),
display_name: "llama.cpp".into(),
base_url: base_url.clone(),
api_key: ApiKey::NotNeeded, disabled_tools,
..Default::default()
})
.with_openai_models();
eprintln!("[endpoint] {base_url}");
let (_handle, events) = llama.run(RunRequest {
run_id: "demo".into(),
prompt: "In one sentence, what is llama.cpp?".into(),
tuning: RunTuning {
model: Some(std::env::var("LLAMA_MODEL").unwrap_or_else(|_| "local".into())),
..Default::default()
},
..Default::default()
})?;
for event in events {
match event {
RunEvent::Text { delta, .. } => print!("{delta}"),
RunEvent::Thinking { delta, .. } => eprint!("{delta}"),
RunEvent::ToolStart { title, .. } => eprintln!("\n[tool] {title}"),
RunEvent::Error { message, .. } => {
eprintln!("\n[error] {message}");
if message.contains("context size") {
eprintln!("Give llama-server a bigger context: -c 16384.");
eprintln!("Or send fewer tools: OpenHarnessConfig::disabled_tools.");
} else if message.contains("status ") {
eprintln!("The server rejected the request; the body above says why.");
} else {
eprintln!("Is llama-server running at {base_url}?");
eprintln!("Start one with: llama-server -m model.gguf --port 8080 --jinja");
}
}
RunEvent::Exited { .. } => break,
_ => {}
}
}
println!();
Ok(())
}