跳转到主要内容
defineEval 是编写 eval 的主要入口。每个 eval 文件调用一次,传入描述和 test(t),并默认导出结果。
import { defineEval } from "niceeval";

export default defineEval({
  description: "Brooklyn weather query",
  async test(t) {
    await t.send("What's the weather like in Brooklyn today?");
    t.succeeded();
  },
});
不要提供 idname。niceeval 从文件路径推导 eval ID。

defineEval 选项

description
string
给人看的描述,出现在控制台和报告中。
agent
string
当前 eval 使用的 agent 名。省略时使用配置或 CLI 的默认值。
tags
string[]
标签,用于 --tag 过滤或组织 eval。
judge
JudgeConfig
覆盖当前 eval 的 judge 模型配置。
reporters
Reporter[]
当前 eval 专用 reporters。
timeoutMs
number
覆盖全局超时。
metadata
Record<string, unknown>
附加元数据,供报告或外部工具使用。
test
(t: TestContext) => Promise<void>
必填
eval 主体。你在这里驱动 agent 并声明断言。

Test context: t

总是可用

t.send(text)
(text: string) => Promise<Turn>
给 agent 发送消息,并返回当前 turn。
t.check(value, assertion)
(value: unknown, assertion: Assertion) => void
记录值断言,失败不会立即中断 test。
t.require(value, assertion)
(value: unknown, assertion: Assertion) => void
记录前置条件断言,失败会立即中断 test。
t.skip(reason)
(reason: string) => void
跳过当前 eval。

对话能力

t.reply
string
当前 session 中最后一条 assistant 文本回复。
t.newSession()
() => void
开启新的独立会话。

工具可观测性

t.calledTool(name, opts?)
function
断言某个工具被调用。
t.notCalledTool(name, opts?)
function
断言某个工具未被调用。
t.event(type, opts?)
function
底层事件流断言。

Workspace / sandbox 能力

t.fileChanged(path)
function
断言文件被修改。
t.check(commandResult, commandSucceeded())
function
断言 sandbox 验证测试通过。

Judge 断言

t.judge.autoevals.factuality(expected, { on: t.reply }).atLeast(0.8);
t.judge.autoevals.closedQA(question, { on: t.reply }).atLeast(0.7);
t.judge.autoevals.closedQA(rubric, { on: t.reply }).atLeast(0.75);

Turn 返回类型

events
StreamEvent[]
标准事件流。
data
unknown | undefined
结构化输出。
status
"completed" | "failed" | "waiting"
当前 turn 状态。
message
string
assistant 文本回复。
toolCalls
ToolCall[]
当前 turn 的工具调用。

数据集导出

export default rows.map((row) =>
  defineEval({
    description: row.task,
    async test(t) {
      await t.send(row.prompt);
    },
  }),
);
数组导出会生成稳定 ID:file/0000file/0001 等。