use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
pub struct WorkerConfig {
pub max_rounds: u32,
pub max_llm_calls: u32,
}
impl Default for WorkerConfig {
fn default() -> Self {
Self {
max_rounds: 8,
max_llm_calls: 15,
}
}
}
impl WorkerConfig {
pub fn new() -> Self {
Self::default()
}
}
#[derive(Debug, Clone)]
pub struct AnswerConfig {
pub evidence_cap: usize,
}
impl Default for AnswerConfig {
fn default() -> Self {
Self { evidence_cap: 20 }
}
}
#[derive(Debug, Clone, Default)]
pub struct AgentConfig {
pub worker: WorkerConfig,
pub answer: AnswerConfig,
}
impl AgentConfig {
pub fn new() -> Self {
Self::default()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Output {
pub answer: String,
pub evidence: Vec<Evidence>,
pub metrics: Metrics,
pub confidence: f32,
}
impl Output {
pub fn empty() -> Self {
Self {
answer: String::new(),
evidence: Vec::new(),
metrics: Metrics::default(),
confidence: 0.0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Evidence {
pub source_path: String,
pub node_title: String,
pub content: String,
pub doc_name: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Metrics {
pub rounds_used: u32,
pub llm_calls: u32,
pub nodes_visited: usize,
pub budget_exhausted: bool,
pub plan_generated: bool,
pub check_count: u32,
pub evidence_chars: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Step {
Continue,
Done,
ForceDone(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkerOutput {
pub evidence: Vec<Evidence>,
pub metrics: WorkerMetrics,
pub doc_name: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct WorkerMetrics {
pub rounds_used: u32,
pub llm_calls: u32,
pub nodes_visited: usize,
pub budget_exhausted: bool,
pub plan_generated: bool,
pub check_count: u32,
pub evidence_chars: usize,
}
impl From<WorkerOutput> for Output {
fn from(wo: WorkerOutput) -> Self {
Output {
answer: String::new(),
evidence: wo.evidence,
metrics: Metrics {
rounds_used: wo.metrics.rounds_used,
llm_calls: wo.metrics.llm_calls,
nodes_visited: wo.metrics.nodes_visited,
budget_exhausted: wo.metrics.budget_exhausted,
plan_generated: wo.metrics.plan_generated,
check_count: wo.metrics.check_count,
evidence_chars: wo.metrics.evidence_chars,
},
confidence: 0.0,
}
}
}
pub enum Scope<'a> {
Specified(Vec<DocContext<'a>>),
Workspace(WorkspaceContext<'a>),
}
pub struct DocContext<'a> {
pub tree: &'a crate::document::DocumentTree,
pub nav_index: &'a crate::document::NavigationIndex,
pub reasoning_index: &'a crate::document::ReasoningIndex,
pub doc_name: &'a str,
}
pub struct WorkspaceContext<'a> {
pub docs: Vec<DocContext<'a>>,
}
impl<'a> WorkspaceContext<'a> {
pub fn new(docs: Vec<DocContext<'a>>) -> Self {
Self { docs }
}
pub fn doc_count(&self) -> usize {
self.docs.len()
}
pub fn is_single(&self) -> bool {
self.docs.len() == 1
}
}