跳转到主要内容
一批评估跑完,终端显示 FAILED,12 条里有 3 条没通过。你想知道是哪几条、Agent 在那几次运行里实际说了什么、调用了什么工具、为什么没满足断言。 NiceEval 给不同读者准备了三个入口,读的是同一份结果: 每次 Attempt 一结束,结果就能读到,不必等整批跑完。

从总览开始

默认总览回答“当前项目还缺哪些结果”:分母是你现在的 Experiment 和评估用例,不是历史上跑过的全部。没问题的 Attempt 默认折叠,让失败和下一条查看命令留在一屏之内。输出类似这样:
几个值得先看的数:
  • Covered 是当前有可用结果的位置数和计划数。Gaps 不为 0 时,说明有些位置还没有结果,或者旧结果已经不适用,例如你改了这条评估用例。缺口下面会写原因和上次的结果入口,旧分数不会被算进当前通过率;这时通过率后面会带 (partial),提醒你它只基于已有结果。
  • errored 不为 0 时,先处理它们。errored 说明运行本身没跑成,例如应用没启动或接口报错,这些 Attempt 没有得出结论。
  • 计分制评估显示 Score 而不是通过率,读法见通过制与计分制。
要补齐缺口,运行最后一行建议的 niceeval exp <id> --dry 看看会跑哪些,再去掉 --dry 正式运行。 看到 Attempts hidden 时,用它建议的命令缩小范围;要显示全部 Attempt,加 --all。

缩小到一个 Experiment 或一次运行

--experiment 显示一个 Experiment 下每条评估用例的结果。--run 显示某一次运行,Run ID 在 exp 结束时的 NEXT 面板里。两者都可以重复传入多个。 运行还没结束时也可以看:已经完成的 Attempt 会出现,还没完成的显示为 pending。

查看一次失败的运行

总览和 Experiment 视图里,每个 Attempt 前面都有一个以 @ 开头的 Attempt 定位符(locator),它在项目里唯一指向这一次运行。复制它:
输出的主要部分类似这样:
Next 列出了能继续看的方面,按你要回答的问题选: --execution 给出对话和工具调用的提纲。要展开其中一项,复制提纲里显示的 ID:
某一项显示 not-recorded、partial 或 unavailable,表示这部分信息没有采集到或不完整,不代表它是零或者失败。例如直连应用不会有文件改动,diff 就是 not-recorded。

判断该改应用还是改断言

failed 只说明至少一条断言没满足,不一定说明 Agent 做错了。看完 --execution 后分三种情况:
  • Agent 的输出确实不符合任务要求:改应用或 prompt。
  • Agent 的输出符合任务要求,断言却拒绝了它,例如正则写得太死:改评估用例。
  • 任务本身写得模糊,说不清 Agent 算不算做对:先把任务和判据写清楚。
不要为了让结果变绿而随意放宽断言。

在浏览器里看

不带参数时打开总览,--run 打开指定的一次或几次运行。浏览器里能看到完整对话、工具调用的输入输出和耗时瀑布图。 有新结果发布时,页面会提示刷新,你确认后才会切换,正在看的内容不会突然变掉。--no-open 不自动打开浏览器,--port 指定端口。

看一条断言具体为什么得这个分

show 告诉你哪条断言没过。要看 Judge 给出的理由、计分项具体得了几分,用 query 读这条断言的详情。先取得这次运行的断言清单:
从返回的 assertions.entries 里选一个 entryId,再读它的详情:
详情里的 contribution 是这一项得了多少分,evaluation 是实际测出的结果,Judge 的理由在 explanation 里。某个字段缺失或标为 unavailable 时,按返回的 reason 理解,不要从别的字段推测。

让脚本和 CI 读结果

query 只输出 JSON,不做终端排版。不要解析 show 的文字输出,也不要直接读 .niceeval/ 下的文件,格式可能随版本变化。
discover 列出当前版本支持的全部请求类型,例如列出 Run、读取 Run 摘要、读取 Attempt 详情、trace、diff,以及比较两个 Run。按CLI 参考写好请求后,先用 query explain --request <file> 检查,再用 query run --request <file> 执行。 在 pnpm 项目里加 --silent,否则 pnpm 自己的输出会混进 JSON。 比较两次运行见比较两次运行。