跳转到主要内容
有人改了 prompt,本地试了两次觉得没问题就合并了,第二天才发现另一类问题全答错了。把评估放进 CI,每个 PR 都自动跑一遍,回归在合并前就能被发现。 CI 里跑的就是你本地用的那条 niceeval exp,不需要额外配置:
  • 评估不通过、运行出错或被中断时,进程以非零状态退出,CI 自然变红。
  • 加 --json 时,最后一行是这次运行的 receipt,里面有新建的 Run ID,后续步骤可以用它读取结果。
  • 加 --junit <path> 时,会写出 JUnit 文件,让 CI 平台按测试用例展示结果。

决定什么情况让 CI 变红

CI 是否变红只看进程的退出状态。下面任一情况都会以非零状态退出:
  • 通过制评估有未通过的 Attempt。
  • 计分制评估有显式 .gate() 没有满足,例如测量值低于 .gate(minimum) 的最低值。
  • 有 Attempt 运行出错(errored),或计划要跑的 Attempt 没有全部得到结果。
  • 运行被中断,或结果没能保存。
计分制评估只要没有 gate 失败,即使得分很低也算成功。想让低分挡住合并,就在评估用例里给对应断言加 .gate()。没有全局的 strict 开关,CI 和本地读的是同一份评估源码,判定结果一致。

运行评估

这条命令给 CI 三样东西:
  • 退出状态:CI 用它决定这一步成功还是失败。
  • --json 的 NDJSON 输出:前面的行描述运行进度和诊断,最后一行是 receipt。
  • JUnit 文件:给 CI 平台读取并展示。
JUnit 只是交给 CI 平台的展示格式。判定、用量、断言和诊断仍保存在项目的 .niceeval/record.sqlite 里,事后查看都从那里读。

在 GitHub Actions 里配置

下面的步骤保存 JSON 输出,同时把 niceeval exp 的退出状态正确传回 CI:
没有 set -o pipefail 和 exit "${PIPESTATUS[0]}" 时,退出状态来自 tee,评估失败也不会让 CI 变红。 模型凭据作为 CI secret 注入命令需要的环境变量,例如上面的 ANTHROPIC_API_KEY。不要把凭据写进 Experiment、receipt、JUnit 或日志。每个 Agent 读哪个变量见配置与环境变量。

在后续步骤读取这次的结果

运行开始后,NDJSON 的最后一行是 receipt。它的 receipt.createdRunIds 列出这次新建的 Run,后续步骤用它打开结果:
要让脚本处理结果,先找到可用的查询,再发送完整 request:
如果命令在运行开始前就因为参数、配置或选择条件出错退出,不会有 receipt,终端会输出 error:。这时直接修复命令、Experiment 或选择条件,不要猜测 Run ID。

让 CI 日志保持可读

CI 日志适合看运行进度和诊断。要细查结果,人在本地用 receipt 里的 Run ID 运行 niceeval show --run <run-id> 或 niceeval view --run <run-id>;脚本和 AI 先运行 query discover。不要把进度和诊断行当作长期保存的结果格式。