use std::path::PathBuf;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BenchConfig {
pub model: String,
pub runs: usize,
pub concurrency: usize,
pub workload: Option<String>,
pub output_format: OutputFormat,
pub output_path: Option<PathBuf>,
pub warmup: usize,
pub save_baseline: bool,
pub check_regression: bool,
pub tolerance: f64,
pub external_frameworks: Vec<ExternalFrameworkConfig>,
pub external_timeout_secs: u64,
pub concurrency_sweep: Option<Vec<usize>>,
pub memory_sample_interval_ms: u64,
pub suite: Option<TaskSuite>,
pub baseline_path: PathBuf,
pub dry_run: bool,
pub max_cost_usd: Option<f64>,
pub confirm_cost: bool,
pub experimental: bool,
}
impl Default for BenchConfig {
fn default() -> Self {
Self {
model: "gemini-2.5-flash".to_string(),
runs: 5,
concurrency: 1,
workload: None,
output_format: OutputFormat::Table,
output_path: None,
warmup: 3,
save_baseline: false,
check_regression: false,
tolerance: 0.10,
external_frameworks: Vec::new(),
external_timeout_secs: 300,
concurrency_sweep: None,
memory_sample_interval_ms: 100,
suite: None,
baseline_path: PathBuf::from(".bench-baseline.json"),
dry_run: false,
max_cost_usd: None,
confirm_cost: false,
experimental: false,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum OutputFormat {
Json,
Table,
Markdown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TaskSuite {
Tau2,
Bfcl,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ExternalFrameworkConfig {
pub name: String,
pub command: String,
pub args: Vec<String>,
pub working_dir: Option<PathBuf>,
pub env: Vec<(String, String)>,
}