Skip to main content
一个评估用例是一个可运行的测试用例。它通常由一个 *.eval.ts 文件导出,通过 defineEval 声明。

评估用例的组成

核心字段: 评估用例本身不声明用哪个 Agent——它默认保持 agent-neutral,同一个评估用例可以在不同 experiment 下跑不同 Agent。选哪个 Agent 是 experiment 的字段,不由 CLI 临时覆盖。
不要手写 idnameNiceEval 从文件路径推导 ID。

路径即身份

evals/weather/brooklyn.eval.ts 的 ID 是 weather/brooklyn。experiment 名之后的位置参数按 ID 前缀过滤:
这种方式让 ID 稳定、可读,并自然跟目录结构保持一致。位置参数采用字符串前缀:terminal-swe-bench 也会命中 terminal-swe-bench-astropy-1,不要求后一个字符必须是 /

生命周期

1

Discovery

runner 加载 evals/ 下的 *.eval.ts 文件和 fixture 目录。
2

Scheduling

结合并发、缓存、attempts 和 early-exit 生成执行计划。
3

agent.send

t.send() 调用被选中的 Adapter,并得到标准 Turn
4

Assertions 与判定

NiceEval 收集值断言、作用域断言与 Judge measurement,并登记 score contribution。
5

终态

通过制评估把断言结果折叠成最终 Verdict;计分制评估累计正式 score。
6

Report

控制台和 reporters 输出结果;Run 与已发布 Attempt 的事实写入唯一的 .niceeval/record.sqlite

Verdict 类型

通过制评估的 Attempt 终态只有四种:

passed

所有 Boolean Assertion 都 matched,所有已 threshold 且 .gate() 的 measurement 都达到阈值,并且没有执行错误。

failed

至少一个 Boolean condition mismatched,或已 threshold 且 .gate() 的 measurement 低于阈值。

errored

执行异常、超时或作者错误,本次执行无法形成可信结论。

skipped

评估用例主动跳过,通常通过 t.skip(reason)
计分制评估的主读数是累计 earned score,分数越高越好。正常没有计分项时 score 为 0。默认报告显示 earned score,不把正常封口状态算进通过率。 .score(points) 中的 points 是单项贡献权重,不是固定总分。默认报告不会把 earned score 自动换算成百分比。一个 Experiment 同时包含通过制评估与计分制评估时,报告分别显示两种主读数。

判定与测量值

Boolean matched 默认进入 Verdict。连续测量值与 Judge 输出是 [0, 1] 的 measurement;通过制评估先在 Match 上用 .atLeast(n) 形成 threshold,再对 handle 调用无参 .gate() 才把它纳入 failed。完整规则见 Assert

*.eval.ts 约定

只有以 .eval.ts 结尾的文件会被发现。目录只形成 ID 前缀:

数组导出与数据驱动测试(dataset fan-out)

一个文件也可以默认导出 defineEval(...) 数组,用同一套逻辑生成多个 case:
生成 ID 类似 sql/0000sql/0001。详见 数据驱动测试

相关阅读

  • 实验 — 另一半:评谁、怎么跑。为什么和评估用例分开(晚绑定)。
  • Assert — Assertion 与判定规则。