117 lines · 4.1 KB · Rust
RawDownload
use agentos_execution::benchmark::{    run_javascript_benchmarks_with_recovery, JavascriptBenchmarkConfig,};use agentos_runtime::{RuntimeConfig, SidecarRuntime};use std::path::PathBuf; struct CliConfig {    benchmark: JavascriptBenchmarkConfig,    baseline_path: Option<PathBuf>,} fn main() {    let runtime = match SidecarRuntime::process(&RuntimeConfig::default()) {        Ok(runtime) => runtime.context(),        Err(error) => {            eprintln!("{error}");            std::process::exit(1);        }    };    match parse_config(std::env::args().skip(1)) {        Ok(cli_config) => match run_javascript_benchmarks_with_recovery(            &runtime,            &cli_config.benchmark,            cli_config.baseline_path.as_deref(),        ) {            Ok(output) => {                if output.resumed_stage_count > 0 {                    eprintln!(                        "Resumed {} completed benchmark stages from {}",                        output.resumed_stage_count,                        output                            .artifact_paths                            .json_path                            .parent()                            .expect("benchmark artifact parent directory")                            .join("run-state.json")                            .display()                    );                }                if let Some(path) = &cli_config.baseline_path {                    eprintln!("Compared against baseline {}", path.display());                }                eprintln!(                    "Wrote Markdown report to {}",                    output.artifact_paths.markdown_path.display()                );                eprintln!(                    "Wrote JSON report to {}",                    output.artifact_paths.json_path.display()                );                match std::fs::read_to_string(&output.artifact_paths.markdown_path) {                    Ok(markdown) => print!("{markdown}"),                    Err(err) => {                        eprintln!("failed to read generated markdown report: {err}");                        std::process::exit(1);                    }                }            }            Err(err) => {                eprintln!("{err}");                std::process::exit(1);            }        },        Err(err) => {            eprintln!("{err}");            eprintln!();            eprintln!("Usage: cargo run -p agentos-execution --bin node-import-bench -- [--iterations N] [--warmup-iterations N] [--baseline PATH]");            std::process::exit(2);        }    }} fn parse_config(args: impl IntoIterator<Item = String>) -> Result<CliConfig, String> {    let mut benchmark = JavascriptBenchmarkConfig::default();    let mut baseline_path = None;    let mut args = args.into_iter();     while let Some(arg) = args.next() {        match arg.as_str() {            "--iterations" => {                let value = args                    .next()                    .ok_or_else(|| String::from("missing value for --iterations"))?;                benchmark.iterations = parse_usize_flag("--iterations", &value)?;            }            "--warmup-iterations" => {                let value = args                    .next()                    .ok_or_else(|| String::from("missing value for --warmup-iterations"))?;                benchmark.warmup_iterations = parse_usize_flag("--warmup-iterations", &value)?;            }            "--baseline" => {                let value = args                    .next()                    .ok_or_else(|| String::from("missing value for --baseline"))?;                baseline_path = Some(PathBuf::from(value));            }            "--help" | "-h" => {                return Err(String::from("help requested"));            }            unknown => {                return Err(format!("unknown argument: {unknown}"));            }        }    }     Ok(CliConfig {        benchmark,        baseline_path,    })} fn parse_usize_flag(flag: &str, value: &str) -> Result<usize, String> {    value        .parse::<usize>()        .map_err(|_| format!("invalid value for {flag}: {value}"))}