defineAgent 包住一个 send 函数;该函数接收输入、驱动 Agent,并返回本轮结果。
本教程先用 Adapter、Experiment 和评估用例跑通最小接入,再说明参数从 Experiment 到 Adapter 和被测应用的传递路径。事件流、多轮、HITL 与 tracing 属于可选能力,文末列出对应教程。
按被测对象选择接入方式
AI SDK 应用
Vercel AI SDK 应用可使用内置适配器连接现有 HTTP 接口。
Agent
评估 Claude Code / Codex / bub 这种独立的 Agent:用内置 Sandbox Agent。
最小接入示例
以下步骤假设项目已经运行npx niceeval init,并包含 niceeval.config.ts 和 evals/ 目录。三个文件各有一项职责:Adapter 连接被测系统,Experiment 固定运行配置,评估用例定义交互和断言。
1. 写 Adapter。 最小接入只填 status 和 events,把 Agent 回复放进一条 message 事件。
send 的完整契约(TurnInput / AgentContext / Turn 各字段)见 Adapter。
即使 Agent runtime 和评估用例位于同一个代码库,也应通过像前端用户一样调用接口,也不要把 fetch 换成进程内函数调用,因为
- 代码内部调用不是用户走的那条链路。 HTTP 层、序列化、中间件、流式传输全被绕过,评估用例通过不代表线上行为正确。
- Adapter 无法复用于其它部署环境。 HTTP Adapter 只需更换
baseUrl,即可连接本地、预发或生产环境(见下文两个 Experiment 文件);进程内调用依赖当前代码库。
npx niceeval view 会显示每条评估用例逐轮的输入、事件和评分明细。
没跑通时,按报错的位置分三类排查:
fetch直接抛错(连接被拒等):应用没起来,或send里的 URL 不对——先用curl对那个接口发一次同样的请求确认。t.succeeded()没过、本轮判定是 failed:请求发出去了,但应用返回的 Turn 是failed。把协议中的失败映射到Turn.status或标准errorevent;需要额外保留的有限上下文用ctx.diagnostic(...),不要打印完整响应体。- 只有内容断言没过:接入本身已经通了——在
view里对照t.reply的实际值,调断言或调应用。
实验 Flag
配置归属只有两条通道,分清它们,接入就不会乱:- 静态配置走 Adapter 工厂。 URL、鉴权和协议细节等环境级配置作为工厂参数写在 Experiment 文件里。
defineExperiment的agent字段接收已经配置好的实例。 - 每轮动态值走
ctx。 experiment 声明的model、flags,运行器每轮经ctx原样递给send;Adapter 不解释它们的含义,只随请求转发给应用。
my-agent 从固定 URL 的实例改成接收配置的工厂。将 default export 改为返回 defineAgent(...) 的函数,并让 send 读取工厂参数。Experiment 声明的 model 和 flags 每轮经 ctx 到达,再由 send 随请求转发:
options。experiment 侧对应两处小改:具名导入工厂,agent 字段从「引用实例」变成「调用工厂」:
ctx 上每轮可能用到的字段和消费方式:
Adapter 里的进度、诊断和致命错误
progress 是可覆盖的短期状态;diagnostic 是运行结束后仍能回顾的有界记录。两者都不能指定 phase 或输出流,也不会自动改变 Turn.status 或 Attempt 判定。连接失败、解析无法继续等基础设施错误应抛出异常;正常收到的被测 Agent 失败通过 Turn.status: "failed" 表达。
终端只显示错误的一层摘要和 locator。完整 code、message、cause、stack 与 diagnostics 在 result.json 中,使用 niceeval show @<locator> 查看。OTel trace 只补充调用关系和耗时,不是错误记录的前提。
要分别评估本地和生产环境,创建两个 Experiment 文件,并传入不同的工厂参数:
runs、budget、并发、sandbox)见写实验。
添加可选能力
最小接入完成后,可以按需扩展 Adapter。已有评估用例不需要修改:
各项能力对应的接入等级和功能范围见 Tier。
参考实现
examples/zh/tier1 提供五个可运行的无侵入接入示例(ai-sdk-v7、claude-sdk、codex-sdk、pi-sdk、langgraph),覆盖事件流断言、多轮隔离、HITL 批准与拒绝,以及 trace 瀑布图。手写 send 只需实现 transport 和映射表;会话续接与 HITL 暂停恢复由 ctx.session 提供,逐帧驱动可使用内置实现,见内置 Agent 能力。