Experiment 字段
models
description
agent
agent 与 adapter 必须且只能提供一个。
adapter
model
reasoningEffort
judgeRuntime
flags
labels
{ line: "codex", memory: "mempal" })。
值域 string | number(解析时校验)。与 flags 的分界是「会不会改变 attempt 里发生的事」:
labels 不透传 ctx / t(agent 和 eval 看不见)、不参与可比性配置(改它不作废已有结果),
只原样投影进快照的 ExperimentRunInfo.labels 供报告维度(label() / numericLabel())
分组。line 键被默认报告识别:组内任一实验声明了它,散点按线归类并连线。
见 docs/feature/experiments/library.md「labels」。
attempts
--attempts 覆盖时默认 1。
earlyExit
attempts 跑满、测完整通过率),
显式打开用于「只想知道能不能过」的省钱场景。
evals
"*" 全部、字符串数组按 id 前缀、或自定义谓词(逐条收到发现并扇出后的
只读 EvalDescriptor,不暴露路径 / 执行字段);省略等价于 "*"。谓词对本次 invocation 的
候选 eval 各求值一次,解析结果作为内存中的 selectedEvalIds 计划——不是运行时反复调用的过滤器
(见 docs/feature/eval/library.md「EvalDescriptor」、docs/feature/experiments/library.md
「evals:遍历发现结果,自定义选择」)。
timeoutMs
sandbox
sandboxCache
plugins
defineExperiment() 规范化。
sandboxReuse
sharedState
budget
estimatedCostUSD;该值由
model、token usage 与 runtime/config pricing table 计算,与 Provider / Adapter 回报的
observed usage.costUSD 独立,后者不驱动 budget。估算到顶后跳过这个实验剩下未起飞的
attempt 并上报一次 run:budgetExceeded(已在飞的 attempt 仍会跑完)。
maxConcurrency
maxConcurrency: 1 保证 attempt 按 eval 顺序一个个跑),
或给撞 provider 限额的实验单独降速。名额与 attempt 同生命周期:从沙箱创建前一直握到
teardown 与沙箱销毁完成才归还,中途任何等待(含 turn 重试退避)都不松手——
maxConcurrency: 1 因此是严格的临界区,不会被同实验的下一个 attempt 提前闯入。
它不跨 Invocation;跨 Invocation 的共享外部状态请声明 sharedState。
classifyFailure
undefined 表示「不认识,交给后续链路」。本实验任意 per-attempt 阶段的失败
都会问到它;send 失败链上它排在 adapter 的 classifySendFailure 之前——按自家坐标过滤的
特异性高于协议通用形状,两者同时认领时空间轴才赢得下来。分类器要快、纯、不抛错(抛错按
undefined 回落并被吞掉);只声明决策轴与 reason 词,重试与落闸策略归执行体。
见 docs/feature/error-classification/library.md「实验 / eval 作者:声明死因的波及范围」。
setup
teardown 与同文件 agent / sandbox 钩子从闭包读,
runner 不做值的中介。setup 抛错 → 本实验所有 Attempt 形成 errored Verdict
(code "experiment-setup-failed"、phase "experiment.setup"),同批其它实验不受影响。
函数体不进 fingerprint,改了钩子逻辑用 --rerun all 明确全部重跑。
见 docs/feature/experiments/architecture.md「实验级生命周期」。
teardown
experiment-teardown-failed),不改判定。