parseEvalRunArgs function
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,
);
}