use std::time::Instant;
use tracing::{error};
use sollama::{
config::ScraperConfig,
prompt::PromptBuilder,
search::SearchEngine,
llm::LLMProcessor,
Result,
};
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::init();
let config = ScraperConfig::default();
let search_query = std::env::args()
.nth(1)
.unwrap_or_else(|| "rust programming".to_string());
let query = std::env::args()
.nth(2)
.unwrap_or_else(|| format!("based on the content provided what is : {}", search_query));
let results_count = std::env::args()
.nth(3)
.unwrap_or_else(|| "5".to_string());
let model = std::env::args()
.nth(4)
.unwrap_or_else(|| "llama3.2:latest".to_string());
let start_time = Instant::now();
let search_engine = SearchEngine::new(config.clone())?;
let urls = search_engine.search(&search_query, &results_count).await?;
if urls.len() == 0 {
error!("No URLs found for the query: {}", query);
return Ok(());
}
let contents = search_engine.fetch_all(urls.clone()).await?;
let llm_processor = LLMProcessor::new(config.llm_config);
let prompt = PromptBuilder::new(query.clone())
.with_contents(contents.clone())
.build();
match llm_processor.process(&prompt, &model).await {
Ok(summary) => {
let elapsed = start_time.elapsed();
println!("{}", format!("\n=== Search Results Summary ===\n {}\n", &urls.join("\n")));
println!("\n=== Search Results Summary ===");
println!("Search Query: {}", search_query);
println!("Query: {}", query);
println!("Processing time: {:.2?}", elapsed);
println!("Pages analyzed: {}", contents.len());
println!("\nSummary:\n{}", summary);
}
Err(e) => {
error!("Failed to process with LLM: {}", e);
}
}
Ok(())
}