#![allow(dead_code)]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResearchConfig {
pub query: String,
#[serde(default = "default_max_steps")]
pub max_steps: usize,
#[serde(default = "default_max_pages_per_step")]
pub max_pages_per_step: usize,
#[serde(default = "default_max_depth")]
pub max_depth: usize,
#[serde(default)]
pub seed_urls: Vec<String>,
}
fn default_max_steps() -> usize {
10
}
fn default_max_pages_per_step() -> usize {
5
}
fn default_max_depth() -> usize {
3
}
impl Default for ResearchConfig {
fn default() -> Self {
Self {
query: String::new(),
max_steps: default_max_steps(),
max_pages_per_step: default_max_pages_per_step(),
max_depth: default_max_depth(),
seed_urls: Vec::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResearchResult {
pub query: String,
pub synthesis: String,
pub findings: Vec<Finding>,
pub sources: Vec<SourceInfo>,
pub steps: Vec<ResearchStep>,
pub pages_crawled: usize,
pub cost: Option<crate::types::ExtractionMeta>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Finding {
pub content: String,
pub source_url: String,
pub relevance_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SourceInfo {
pub url: String,
pub title: Option<String>,
pub snippet: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResearchStep {
pub step_number: usize,
pub action: StepAction,
pub urls_visited: Vec<String>,
pub findings_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum StepAction {
Crawl {
url: String,
depth: usize,
},
Synthesize,
}