defineEval 是编写评估用例的主要入口。每个评估用例文件调用一次,传入描述和 test(t),并默认导出结果。
组织业务判据、证据与分值时,参照 NiceEval Taste。
不要提供
id 或 name。NiceEval 从文件路径推导评估用例 ID。defineEval 选项
description
niceeval list 和 view 里;纯说明,不影响调度或打分。
tags
--tag 过滤和 view 分类;与 id 前缀过滤是两套独立的筛选维度。
sandbox
plugins
judge
reporters
timeoutMs
metadata
diff
ignore 在默认清单上追加排除;include 优先级最高,把匹配路径显式加回。
合成规则固定为「默认 ∪ ignore,再被 include 打洞」,清单在分类账锚点时冻结。
test
Test context: t
t(TestContext)是评估用例作者拿到的高层上下文。每一次作者入口调用都直接登记一条 Assertion。t.check(subject, match) 比较显式事实,t.check(contextualMatch) 注入当前只读 ctx。t.judge(material, match) 把受管 ScoreMatch 交给同一个 check 接收者。
root、Session 与 Turn 的 judge 都要求显式材料。官方四个显式材料预设构造 Match 后转交该接收者。closeQA(selector, question) 选择整组材料回答验收问题。Agent 另提供 closeQA(question) 默认完整 scope 历史,以及 EventMatch、ToolMatch 简写。
通过制评估的 Boolean 默认进入 Attempt Verdict;计分制的 Boolean 默认 record-only。两种评估的 measurement 都用 .gate(minimum) 进入 failed;计分制可在同一 entry 上组合 gate 与 score。Boolean .orStop() 使用自身 condition,measurement 用 .orStop(minimum) 或在 gate 后无参复用。
普通公式直接用 TypeScript 计算,再用 t.score(ratio, { weight: 50 }).label("完成耗时") 登记。ratio 为 0–1 数值,权重为非负有限数;审计保留 ratio、固定 points 与实际贡献。带状态的数值材料不可判定时,贡献保持未知。
defineScoreEval 的 ScoreTestContext 额外提供 t.score(n) 直接登记 contribution;已有 Assertion 用 .score(n) 贡献分数。两者的 n 都必须 finite 且不小于零,零仍是显式 contribution。calledTool 与 notCalledTool 的完整契约见 Scoped assertions。全部成员:
evaluationKind
send
sendFile
requireInputRequest
respond
respondAll
reply
sessionId
events
eventOccurrences
newSession
signal
model
reasoningEffort
flags
progress
diagnostic
log
skip
group
check
judge
toolCalls
sandbox
o11y
usage
succeeded
usedNoTools
maxToolCalls
noFailedActions
event
notEvent
elapsedMs
maxTokens
maxCost
closeQA
closeQA
closeQA
Judge measurement
先用defineJudge 声明评分标准,再直接交给 t.check 或 t.judge:
judgeImage() 值,并在登记时快照。解析从项目 judgeRuntime 开始,再应用 Eval 的 judge 和 Experiment 的 judgeRuntime;完整 Provider 整体替换服务与执行配置,模型字符串只替换已选 Provider 的模型。Eval 的 judge 为这道题选择模型或 Provider,不是 Match 允许列表。通过制与计分制都可调用 .gate(minimum);计分制还可调用 .score(n),并保留 gate 失败时的 contribution。
图片材料
从niceeval/judge 导入 judgeImage。它同步复制原图字节;支持 PNG 和 JPEG,每张最多 4 MiB、16,777,216 像素。每条断言及每次模型请求最多 4 次图片引用、合计 8 MiB,重复引用也计入限制;每个 Attempt 最多留存 32 MiB 图片。输入只检查签名、头部边界和尺寸,不完整解码或转码。
OpenAIProvider、VercelProvider 和 OpenRouterProvider 必须显式设置 supportsImages: true,并选择同时支持图片与工具调用的模型。默认不启用;TypesafeProvider 不支持图片。不支持时返回 judge-capability-unavailable,不会把图片降级成文字。
judgeImage
JudgeImageInput
body
mediaType
现成裁判与自定义 Match
defineJudge 和现成裁判都返回 ScoreMatch,可以交给 t.check。t.judge 只是同一条 check 路径的便利入口,因此登记、快照、预算、求值、审计、结果保存和 handle 都只发生一次。
例如,直接使用
instructionFollowing() 的实例:
faithfulness 先提取事实,再逐项判断,由代码计算比例;提取不完整时没有有效得分。TypeSafe 不支持 extract,因此在 TypesafeProvider 上为 unavailable,不会改为整体估分。
pairwisePreference 是一次固定顺序比较,适合一个候选与一个参考的比较。
closeQA 将全部命中项保序交给一次 Judge,只依据材料回答验收问题。
Agent 可用 turn.closeQA(question)、session.closeQA(question)、t.closeQA(question);显式 EventMatch 取事件视图,ToolMatch 取完整工具事实。完整空集为0且零调用;partial、unknown或超限为 unavailable,不截断后评分。
需要组合多个模型步骤时,使用高级 defineScoreMatch 的 score(value, context)。
context.llm 提供 score、classify、extract 和 batchClassify,返回 Effect。
它们与现成裁判共用调用预算、超时和审计记录。静态配置校验不会发网络请求;Provider、模型或 key 缺失也不会发请求。聊天服务使用 forced-function 请求,TypeSafe 使用 /systemone;两者都严格校验响应。传输或超时为 unavailable,HTTP 400 或协议不兼容为 errored。完整契约见 自定义 Match。
Turn 返回类型
t.send(...) 返回一个 TurnHandle:从事件流派生的便利字段,加上一整套本轮作用域断言。
calledTool 与 notCalledTool 也属于 Turn 的作用域断言;它们的签名和 Match 规则只在 Scoped assertions 定义。
input
events
toolCalls
eventOccurrences
status
message
data
usage
check
judge
succeeded
toolOrder
usedNoTools
maxToolCalls
noFailedActions
event
notEvent
eventOrder
elapsedMs
maxTokens
maxCost
closeQA
closeQA
closeQA
测试集导出
file/0000、file/0001 等。
已有稳定业务 key 时也可以默认导出 Record<string, EvalDef>。例如 key 15193 在 swelancer.eval.ts 中生成 swelancer/15193。key 必须是非空单一路径片段,不能是 . / ..,不能含 /、\\ 或控制字符。发现顺序按 key 字典序固定。
ctx 材料与官方统计
defineMaterialMatch<C,T>({ name, read, match, capture? }) 从 niceeval 和 niceeval/expect 导出。
Adapter 的 create 提供应用 ctx;框架在 check 或 closeQA 登记时向 reader 注入当前只读 ctx。
reader 返回 { state: "complete", items: [{ id, value }] },或带 reason 的 partial/unavailable。
ID 集合内唯一且最多128 UTF-8 bytes。capture 默认256项、48 KiB,可显式提高至16384项、4 MiB。
check(materialMatch) 返回 Boolean handle,默认至少命中一项;closeQA(materialMatch, question, options?) 返回 measurement handle。
Agent reader 从 AgentMatchContext<Scope> 读取 managed toolCalls 或 eventOccurrences,使用对应 ToolMatch 或 EventMatch。
question 非空且最多8 KiB。options 为 JudgePresetOptions;全部命中材料按原顺序进入一次 Judge,完整空集为0且零调用。
defineContextMatch<C,T>({ name, read, match, capture? }) 读取单个小事实。
reader 返回 { state: "available", value } 或 { state: "unavailable", reason }。
配 BooleanMatch 得 Boolean handle,配 ScoreMatch 得 measurement handle;未知事实不调用评分器。
t.usage 读取官方账本的冻结值,保留失败、重试、缓存桶与费用依据。
Adapter 的 basis 为 recorded-calls;Agent 的 basis 为 reported-sends,并保留 Turn、Session、Attempt 范围。
usage.totalTokens 等字段为 NumericMaterial,未知不补0。
t.maxTokens(max) 约束完整 token 总量;t.maxCost(usd) 精确约束 USD 有效成本,实扣0优先于显式 pricing 估算。
t.elapsedMs 是 runtime Attempt 起点到读取处的墙钟毫秒,可交给 t.check(..., atMost(limit))。
业务内首次完成时间仍由业务 Match 判断。