Skip to main content
你想让 CI 每题跑 5 次、本地只跑 1 次,又不想把 API key 签进仓库。NiceEval 把值分成两类,各放一处:
  • 配置写进代码:CLI flag、experiments/ 下的 Experiment 文件、根目录的 niceeval.config.ts。跑几次、超时多久、并发多少和 Judge 用哪个模型都在这里,没有对应的环境变量。
  • 密钥放环境变量:API key、Provider token,再加上 NO_COLOR 这类描述当前终端的设置。
所以同一个值只有一个来源。niceeval exp --dry 打印出来的就是真正生效的值,不会有环境变量在背后改掉它。CLI 与运行时文案是英语;浏览器里的 niceeval view 可以切换中英文。

配置:想让这个值活多久,就写在哪一层

先想清楚这个值要在多大范围内生效,再决定写在哪一层。同一个值出现在多层时,按 CLI flag → Experiment → 评估用例 → config → 内置默认 取,前面有值就不看后面。config 只提供默认值,不会覆盖别的层:评估用例自己声明的 timeoutMs 不会被项目默认值替换。 只想这一次不一样:写在命令上。
这个实验一直这样:写进 Experiment 文件。
agent、model、flags 只能写在这里,没有对应的 CLI flag。要换 Agent 或换模型,就复制一个 Experiment 文件。这样每次运行用的是哪个 Agent 和模型都记在结果里,事后能复现。 整个项目共享:写进 niceeval.config.ts。

niceeval.config.ts 能放什么

每个字段的类型和完整说明在 defineConfig 参考。flag 全表在 CLI 参考。

环境变量:只有密钥和终端两类

把密钥放进下面这些环境变量。这就是 NiceEval 会读的全部环境变量;每个 Agent、Sandbox 和 Judge 只认自己那几个名字,不会去读别的 key。 想让 Judge 从别的变量名读 key,在配置里写明变量名:
网关地址也不方便签入仓库时,在配置里自己读环境变量即可。配置本身就是代码,读取时 .env 已经加载完:
区别只在于:变量名是你的项目定的,不是 NiceEval 内置一个名字然后到环境里猜。 本地开发时,把密钥放进当前目录的 .env。CLI 启动时会自动加载它,不会覆盖已经存在的环境变量,你不用每次 export:
.env 只用来放密钥,不是第二个配置文件。往里写 NICEEVAL_TIMEOUT 这类变量不会有任何效果。CI 里同样只传密钥:

想调这些值时写到哪一层

配置项没有环境变量层,所以下面每一项都只有这几个位置可写: 每个 Judge Provider 只读自己的默认 key 变量,或工厂 apiKeyEnv 显式指定的变量。 它不会借用其它 Provider 或被测应用的 key。

接着看

defineConfig 参考

每个配置字段的类型与完整说明。

CLI 参考

命令、flag 全表与退出码。

写 experiment

哪些值属于一次具体运行。

CI 集成

在 CI 里传 secrets。