use agentai::Agent;
use agentai::tool::{Tool, ToolBox, ToolError, ToolResult, toolbox};
use anyhow::Error;
use log::{LevelFilter, info};
use simplelog::{ColorChoice, Config, TermLogger, TerminalMode};
const SYSTEM: &str = "You are helpful assistant. You goal is to provide summary for provided site. Limit you answer to 3 sentences.";
#[tokio::main]
async fn main() -> Result<(), Error> {
TermLogger::init(
LevelFilter::Trace,
Config::default(),
TerminalMode::Mixed,
ColorChoice::Auto,
)?;
info!("Starting AgentAI");
let question = "For what I can use this library? https://raw.githubusercontent.com/AdamStrojek/rust-agentai/refs/heads/master/README.md";
info!("Question: {}", question);
let toolbox = UrlFetcherToolBox {};
dbg!(toolbox.tools_definitions()?);
let base_url = std::env::var("AGENTAI_BASE_URL")?;
let api_key = std::env::var("AGENTAI_API_KEY")?;
let model =
std::env::var("AGENTAI_MODEL").unwrap_or("nvidia/nemotron-3.5-super-vl:free".to_string());
let mut agent = Agent::new_with_url(&base_url, &api_key, SYSTEM)?;
let answer: String = agent.run(&model, question, Some(&toolbox)).await?;
info!("Answer: {}", answer);
Ok(())
}
struct UrlFetcherToolBox {}
#[toolbox]
impl UrlFetcherToolBox {
#[tool]
async fn web_fetch(
&self,
url: String,
) -> ToolResult {
reqwest::get(&url)
.await
.map_err(|e| ToolError::Failed(format!("Request to {url} failed: {e}")))?
.text()
.await
.map_err(|e| ToolError::Failed(format!("Reading {url} failed: {e}")))
}
}