use skadoosh::{Agent, AgentEvent, Config, OutputMode, Result};
fn chat(llm_url: &str) -> Result<Vec<String>> {
let mut config = Config::default();
config.llm_url = llm_url.to_string();
config.llm_model = std::env::var("SKADOOSH_LLM_MODEL").unwrap_or(config.llm_model);
config.api_key = std::env::var("SKADOOSH_API_KEY").ok().or(config.api_key);
config.output = OutputMode::Text; let mut agent = Agent::builder().config(config).build()?;
let mut events = agent.events();
let seen = std::thread::spawn(move || {
let mut clauses = Vec::new();
while let Ok(event) = events.blocking_recv() {
match event {
AgentEvent::Clause(c) => clauses.push(c),
AgentEvent::Error(e) => eprintln!("agent error: {e}"),
_ => {}
}
}
clauses
});
let mut replies = Vec::new();
for prompt in ["Hello!", "What can you do?", "Thanks, bye."] {
let reply = agent.text_turn(prompt)?;
println!("you> {prompt}");
println!("bot> {}", reply.trim());
replies.push(reply);
}
agent.shutdown();
drop(agent); let clauses = seen.join().expect("observer thread");
assert_eq!(
clauses.concat(),
replies.concat(),
"every reply text arrived as Clause events"
);
Ok(replies)
}
fn main() -> Result<()> {
chat(&std::env::var("SKADOOSH_LLM_URL").unwrap_or_else(|_| Config::default().llm_url))?;
Ok(())
}