use langchainrust::tools::DuckDuckGoSearchTool;
use langchainrust::{DeepResearchAgent, OpenAIChat, OpenAIConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_key = std::env::var("OPENAI_API_KEY").expect("请设置 OPENAI_API_KEY 环境变量");
let base_url = std::env::var("OPENAI_BASE_URL")
.unwrap_or_else(|_| "https://api.openai.com/v1".to_string());
let llm = OpenAIChat::new(OpenAIConfig {
api_key,
base_url,
model: "gpt-4o-mini".to_string(),
..Default::default()
});
let agent = DeepResearchAgent::new(llm)
.with_searcher(Box::new(DuckDuckGoSearchTool::new()))
.with_max_rounds(3) .with_max_subtopics(5);
let report = agent
.research("Rust 异步运行时对比: tokio vs async-std vs smol")
.await?;
println!("=== 深度研究报告 ===\n");
println!("{}", report.markdown);
println!("\n--- 引用 ---");
for citation in &report.citations {
println!(
"[{}] {} {}",
citation.index,
citation.source,
citation
.url
.as_ref()
.map(|u| format!("({})", u))
.unwrap_or_default()
);
println!(" {}", citation.snippet);
}
println!("\n--- 统计 ---");
println!("子课题: {:?}", report.subtopics);
println!("研究轮数: {}", report.rounds_completed);
Ok(())
}