parseEvalRunArgs function

EvalRunConfig parseEvalRunArgs(
  1. List<String> args, {
  2. Map<String, String>? env,
  3. String? defaultRunName,
})

Tiny CLI parser. Avoids pulling in package:args to keep deps lean.

Supported flags:

--run-name NAME
--concurrency N
--trials-override N
--mode (record|replay|live)
--filter-agent A,B,C
--filter-bucket A,B,C
--filter-task-id A,B,C
--rpm N
--tpm N
--recording-dir PATH
--no-langfuse
--langfuse-host URL

Implementation

EvalRunConfig parseEvalRunArgs(
  List<String> args, {
  Map<String, String>? env,
  String? defaultRunName,
}) {
  String? runName = defaultRunName;
  var concurrency = 8;
  int? trials;
  var mode = EvalRunMode.replay;
  Set<String>? agents;
  Set<String>? buckets;
  Set<String>? taskIds;
  int? rpm;
  int? tpm;
  String? recordingDir;
  var langfuseEnabled = true;
  String? langfuseHost = env?['LANGFUSE_HOST'];

  for (var i = 0; i < args.length; i++) {
    final a = args[i];
    String next() {
      if (i + 1 >= args.length) {
        throw ArgumentError('flag $a requires a value');
      }
      return args[++i];
    }

    switch (a) {
      case '--run-name':
        runName = next();
        break;
      case '--concurrency':
        concurrency = int.parse(next());
        break;
      case '--trials-override':
        trials = int.parse(next());
        break;
      case '--mode':
        final v = next();
        mode = EvalRunMode.values.firstWhere((m) => m.name == v);
        break;
      case '--filter-agent':
        agents = next().split(',').map((s) => s.trim()).toSet();
        break;
      case '--filter-bucket':
        buckets = next().split(',').map((s) => s.trim()).toSet();
        break;
      case '--filter-task-id':
        taskIds = next().split(',').map((s) => s.trim()).toSet();
        break;
      case '--rpm':
        rpm = int.parse(next());
        break;
      case '--tpm':
        tpm = int.parse(next());
        break;
      case '--recording-dir':
        recordingDir = next();
        break;
      case '--no-langfuse':
        langfuseEnabled = false;
        break;
      case '--langfuse-host':
        langfuseHost = next();
        break;
      default:
        // Unknown flags are tolerated to allow downstream apps to extend.
        break;
    }
  }

  return EvalRunConfig(
    runName: runName ?? 'run_${DateTime.now().millisecondsSinceEpoch}',
    concurrency: concurrency,
    trialsOverride: trials,
    mode: mode,
    filter: TaskFilter(agents: agents, buckets: buckets, taskIds: taskIds),
    rpm: rpm,
    tpm: tpm,
    recordingDir: recordingDir,
    langfuseEnabled: langfuseEnabled,
    langfuseHost: langfuseHost,
  );
}