Skip to main content
NiceEval CLI 是发现、运行和查看评估用例的入口。实际执行评估用例时采用 experiment-first 模型:exp 选择可签入的运行配置,experiment 后的位置参数才按评估用例 ID 前缀过滤。agent、model 和 flags 写在 experiments/,不靠临时 CLI 参数。

命令

npx niceeval exp [path] [id-prefix]

按 experiment id 路径运行。每个配置的 evals 决定覆盖哪些评估用例。

npx niceeval debug <experiment> <eval>

显示一个配对的 Sandbox 与 Plugin 生命周期命令计划,不运行评估。

npx niceeval init

创建空的 evals/ 目录和最小的 niceeval.config.ts。不生成示例评估用例文件。同时写入/刷新 niceeval 指引区块——项目已有 AGENTS.md 就写那份,只有 CLAUDE.md 就写进 CLAUDE.md,都没有则新建 AGENTS.md(见Agent 反馈闭环)。

npx niceeval list

发现并打印所有评估用例,不运行。

npx niceeval clean

删除明确 writer 留下的 Record 临时目录,不删除正式 Run 或 Attempt。

npx niceeval show [--run]

在终端执行报告。不带 locator 或 --run 的命令读取当前项目结果;精确 Attempt 定位符或 Run ID 用于审计历史。

npx niceeval view

构建完整报告站并在浏览器中托管。它与 show 共享选择规则,但会枚举全部页面。

输出语言

CLI 与运行时文案是英语。这只影响终端/runtime 文案,不改变结果 JSON 里的机器字段,也不翻译 LLM Judge prompt。浏览器 niceeval view 自己提供中英切换。

npx niceeval exp [path|config] [id-prefix...]

评估用例过滤参数只出现在 experiment 选择之后。只写 npx niceeval weather 不会运行。请使用 npx niceeval exp local weathernpx niceeval exp compare weather
第一个位置参数只解释为 experiment id、目录路径或文件名前缀。尾随位置参数按评估用例 id 前缀继续收窄。

npx niceeval exp list [experiment-prefix]

只发现并列出可运行的 Experiment 配置,不创建 Session、不取锁、不启动 Agent 或 Sandbox:
默认输出每个配置的 experimentId、描述、agent、model、attempts、选中的 eval 数和 labels。--json 输出单个 niceeval.experiments 文档,并在每项附上完整的 selectedEvalIds

查看一个配对的完整 Shell 与 lifecycle

两个 selector 都必须唯一。精确 ID 优先,否则可以使用唯一前缀。Eval 只能从 Experiment 自己选中的范围里匹配;零命中或多命中会列出精确候选。 计划包含 Plugin lifecycle、author prepare、Agent ensure/setup/teardown、test、cleanup 与 Provider finalizer。能静态声明的 shell() / command() 展开为实际命令,普通 callback 标为 opaque 评估在 Group 内时,只选择这个成员不会把同组其它成员加回计划,但输出仍保留一次 Group lifecycle 包裹。人读输出只显示 COMMAND PLAN--json 输出单个 niceeval.debug-plan/v1 文档。 TTY 中,总览、Experiment、lane、slot 和每个 lifecycle step 都分别使用与 show 相同的圆角区域框,不会把整棵树放入一个总框。每条 Shell、每个 Plugin occurrence 和每个没有命令或只能运行期确定的阶段都有自己的框:
多行 Shell 会在自己的框内显示成带 gutter 的代码区,而不是压成带 \n 的单行字符串。缩进、空行、末尾换行和长行续行都会保留;终端控制字符显示为转义文本:
管道、NO_COLOR 或过窄终端逐框降级成无框标题与正文,内容和顺序不变。--json 不包含框线。 Human 输出在每条 lane 内固定依次显示 Group before-slot、physical enter、slots、physical exit 与 Group after-slot。Physical teardown 和 Provider finalizer 因而位于使用该实例的全部 slot 之后。 Sandbox materialize 节点会显示 template owner、provider、kind 和安全的 configured locator。Exact 只代表原样显示作者配置,不代表 image tag、远端内容或最终实例已经冻结。远端 URL 的凭据、query 与 fragment 会脱敏。Docker image 只有保守的 credential-safe reference(可带标准 sha256 digest)才显示 Exact;URL、非 digest userinfo 或其它不安全语法整项显示 Opaque,且不输出原字符串。 作者提供的本地 path、file: URL、Dockerfile file 或 local dir 整项显示 Opaque,原路径不会进入输出。只有未配置 localSandbox.dir 时的固定 author-base-dir 标签可以显示 Exact。env value、credential、stdin、build arg value 和 custom identity 不输出。 E2B template name 与 Vercel snapshot ID 是 Provider 管理的任意字符串,因此完整 locator 同样显示 Opaque。Human 命令计划在统一终端出口把 C0、C1、ESC、tab 与 carriage return 显示成转义文本,覆盖 template metadata 与 Shell 行。JSON 保留结构化值,并依靠 JSON string escaping。 debug 不执行运行期 setup、test、teardown、ensure、materialize 或 finalizer,也不创建 Invocation、Run、Record、锁、Sandbox 或 build。它会加载 .env 和受信任定义,并执行 Experiment 的选择 predicate。Provider planner 也可能读取文件、调用只读 CLI,或查询 Docker control plane 和远端 API。 计划把 Experiment 配置的全部 Attempt 列作候选 dispatch。正常运行仍可能因 carry、首过即停或预算而不执行某个 slot。debug 只接受可选的 --json;其它运行 flag 会按用法错误退出。

常用 flags

下表由 CLI 的 flag 解析表生成,表外的 flag 一律按未知 flag 报错并以非零状态退出。没有用于选择 Sandbox provider 的 CLI flag,也没有项目级默认 provider。请在 Eval 或 Experiment 上声明 template-bearing SandboxLayer,并从 niceeval/sandbox 导入下列工厂之一:
  • dockerSandbox({ source: { type: "image", image } })
  • dockerComposeSandbox({ file, workspaceService })
  • dockerSandbox({ source: { type: "dockerfile", context } })
  • vercelSandbox({ snapshotId })
  • e2bSandbox({ template })
  • localSandbox()

list

用于检查评估用例发现、ID 和配置加载是否正常。

exp

运行命名 experiment,用矩阵比较 agents、models 或 flags。第二个参数开始是评估用例 ID 前缀过滤。 showview 是顶层命令,应写成 npx niceeval shownpx niceeval view。误写成 npx niceeval exp show / exp view 且没有同名 experiment 时,CLI 会在“不存在的实验”错误后提示正确命令。仓库确实存在同名 experiment 时仍按合法 id 执行。

两种输出:人读文本与 --json

exp 的输出只有两种形态,只改变展示,不改变选择、调度、判定、Record 提交或退出码:
两种形态怎么选见运行器 · Reporter。AI 反馈闭环的完整用法见 AI 反馈闭环。CI 集成(GitHub Actions、退出码、JUnit)见 CI 集成。进程结束后没有 watch 或 session 查询;长期数据从停稳 Record 生成报告。

view

打开本地结果查看器。它和 show 共用默认 Report 与选择规则。不带 locator 或 --run 的命令读取所有身份仍匹配当前项目的结果;精确 @<AttemptLocator> 显示该 Attempt 的默认概览;--run 读取指定历史 Run。NiceEval 随后形成固定 Sample、枚举全部 Page 与参数实例,并构建完整站点。 没有显式 --report 时,--run 使用内建 run-membership-overview,精确 locator 使用 attempt-overviewproject-current 才使用配置里的 Report,并在没有配置时回退到通用 default-overview。显式 --report 始终优先。Config 仍会为 Theme 和 view rebuild 加载;这里只说明配置里的 Report 不参与显式 Run 的默认选择。 省略 --host 时,view 只监听 127.0.0.1。传入具体 hostname / IP 会显式监听该地址;只写 --host 时则监听全部 IPv4 接口。wildcard listener 先打印 loopback URL,再打印可用接口 URL;--page 应用到每条 URL,自动打开浏览器只使用第一条。 非 loopback 模式是无认证、无加密的开发服务器。所有网络可达客户端都能读取报告页面、下载和公开 JSON 文档,所以只能在可信网络使用;启动时也会打印同样的警告。server 只接受已公布的 Host authority 与只读 GET / HEAD 请求;未来写端点必须另行设计认证与 CSRF 边界。 此前的局部执行可能让部分 slot 以 reference 采用已有 Attempt。这些是当时的采用事实,不是补跑状态。同一份 Sample 不会在页面请求时重新选择。--experiment 可按完整 ID 收窄当前项目目标;--record 只在主动读取其它 Record root 时使用。

show

show 是终端报告入口,适合人直接阅读,也适合 coding agent 在上下文窗口里逐级下钻。它不接受模糊的位置选择。省略 --page 时选择默认 Page;提供 --page <route> 时只执行这个精确 route。 参数 Page 的 show 路径只对请求 key 调用 decode()、canonical encode()load()render()。它不调用 enumerate(),也不为了查找成员资格而执行其它 Page。通过 Page 的关闭 Evidence 边界验证的 locator、identity 或 key 不属于当前 Sample 时,命令返回类型化错误。 不带 locator 或 --runshow 规划当前项目身份,并扫描默认 Record 中全部 published Run。只有 Experiment、Eval、Attempt 序号、evaluation kind、input identity 与 config identity 仍匹配的 slot 才进入 Sample;命令不会按时间只留一个 Run。没有匹配结果时显示空 Sample,过期结果仍可用完整 --run 读取。 --run 可重复,只读取这些显式历史 Run。--experiment <id> 可重复,按完整 ExperimentId 收窄当前项目目标,不能与 --run 合用。exp、不带 --recordshowview 默认使用同一份结果集。 单个 --run 用于核对这一轮的 expected-slot 分母与 membership;多个 --run 用同一表形状比较多个固定历史边界。即使两个 Run 指向同一个 Attempt,它们也可能分别由实际执行、自动沿用或人工采用形成。exp --json 最后一条 receipt 的 runIds 是机器稳定出口;TTY 完成反馈也显示 Run ID。accept 的成功反馈会显示新 Run ID,但这行人读文本不是 JSON receipt 或自动化输入契约。 内建 run-membership-overview 固定使用 reportId: "run-membership-overview"pageId: "run-membership" 和 route / Run membership 表的稳定 column keys 分成三组:
  • row identity:runIdslotId
  • Core 与 provenance:slotStatememberRelationsourceAttemptLocatormembershipStatemembershipOutcome
  • Attempt 事实:verdictStateverdict
单 Run 和多 Run 都按 runIdslotId 排序;表在排序后最多显示 200 rows,并显示省略数量。 membershipOutcome 是内建报告给出的来源结果,值为 carriedacceptedexecutednot-dispatchedinterrupted。它用于说明本次位置如何得到结果。内建表是 bounded summary;已知 Attempt 的身份与证据用 show @<AttemptLocator> 下钻,需要其它 Run 字段时显式选择自定义 Report。 选择完成后,show 只执行目标 Page 需要的 Measure 与领域视图。partialunsupportedfailed 等 Analysis 状态会随结果显示;未使用的数据问题不影响当前页面。show --json 是同一个单目标读取:内建 Report 返回 Host-owned 领域文档,自定义 Report 返回一个 Page 的 rendered text manifest。完整契约见查看结果 view --out <目录>(或显式 --run)构建完整自包含静态站。目标目录必须不存在;全部页面、下载项与静态资产路径先通过校验。导出完成后,站点即可独立查看。导出过程不会把底层结果存储交给用户 Report。 view 与静态导出都从同一完整站点版本读取 bytes。运行中的 view 对变化构造候选站点;成功后原子替换当前 revision,失败保留 last-good。静态 export 只写出已完成的完整站点。

--early-exit

--early-exit 默认关闭:--attempts > 1 时默认把每次 attempt 都跑完,给出真实通过率——这是 NiceEval 衡量 agent 稳不稳的核心指标,默认不该被无声截断。只想知道”这题能不能过”、不在乎完整分布时,显式加 --early-exit:某个评估用例的一次 attempt 通过后,自动停止该评估用例剩余的 attempts(省钱)。实验文件里写了 earlyExit: true 时,用 --no-early-exit 强制关掉它。

环境变量只放凭据

跑几次、超时、并发、预算、judge 模型和端点——这些都是配置,只从 CLI flag、experiments/ 下的 experiment 文件和 niceeval.config.ts 读。优先级从高到低:CLI flag > experiment > niceeval.config.ts > 内置默认值。没有对应的环境变量,同一个值不会有第三条来路。 环境变量留给凭据(API key、provider token)和终端环境(NO_COLOR)。每个 agent / sandbox / judge 只认自己那一个变量名,不会在环境里翻找其它 key。启动时自动加载 cwd 下的 .env(不覆盖已经存在的环境变量)。完整清单见配置与环境变量

退出码

CI 的退出码直接来自 Pass Eval 的 Boolean conditions 与最终 Verdict;JUnit 使用同一份已封口的断言结果。