跳转到主要内容
把一个被测对象接入 NiceEval 需要一个 AdapterdefineAgent 包住一个 send 函数;该函数接收输入、驱动 Agent,并返回本轮结果。 本教程先用 Adapter、Experiment 和评估用例跑通最小接入,再说明参数从 Experiment 到 Adapter 和被测应用的传递路径。事件流、多轮、HITL 与 tracing 属于可选能力,文末列出对应教程。

按被测对象选择接入方式

AI SDK 应用

Vercel AI SDK 应用可使用内置适配器连接现有 HTTP 接口。

Agent

评估 Claude Code / Codex / bub 这种独立的 Agent:用内置 Sandbox Agent。

其它 AI Agent

自己的 Agent 需要 编写 Send。如应用已有 OTel 埋点,可 接入OTel

最小接入示例

以下步骤假设项目已经运行 npx niceeval init,并包含 niceeval.config.tsevals/ 目录。三个文件各有一项职责:Adapter 连接被测系统,Experiment 固定运行配置,评估用例定义交互和断言。 1. 写 Adapter。 最小接入只填 statusevents,把 Agent 回复放进一条 message 事件。
最小示例先使用固定 URL。需要按环境传入 URL 时,使用下文的参数传递方式send 的完整契约(TurnInput / AgentContext / Turn 各字段)见 Adapter 即使 Agent runtime 和评估用例位于同一个代码库,也应通过像前端用户一样调用接口,也不要把 fetch 换成进程内函数调用,因为
  • 代码内部调用不是用户走的那条链路。 HTTP 层、序列化、中间件、流式传输全被绕过,评估用例通过不代表线上行为正确。
  • Adapter 无法复用于其它部署环境。 HTTP Adapter 只需更换 baseUrl,即可连接本地、预发或生产环境(见下文两个 Experiment 文件);进程内调用依赖当前代码库。
2. 实验
3. 评估用例
验证运行结果:终端会显示动态 dashboard,完成和排队数量在原位更新;失败、错误和 warning 会保留在输出中。运行结束后会打印摘要、失败 locator 和结果路径。npx niceeval view 会显示每条评估用例逐轮的输入、事件和评分明细。 没跑通时,按报错的位置分三类排查:
  • fetch 直接抛错(连接被拒等):应用没起来,或 send 里的 URL 不对——先用 curl 对那个接口发一次同样的请求确认。
  • t.succeeded() 没过、本轮判定是 failed:请求发出去了,但应用返回的 Turn 是 failed。把协议中的失败映射到 Turn.status 或标准 error event;需要额外保留的有限上下文用 ctx.diagnostic(...),不要打印完整响应体。
  • 只有内容断言没过:接入本身已经通了——在 view 里对照 t.reply 的实际值,调断言或调应用。
完成这些步骤后,文本断言和 Judge 评分即可使用。工具、多轮和审批流断言需要继续添加文末列出的可选能力。

实验 Flag

配置归属只有两条通道,分清它们,接入就不会乱:
  1. 静态配置走 Adapter 工厂。 URL、鉴权和协议细节等环境级配置作为工厂参数写在 Experiment 文件里。defineExperimentagent 字段接收已经配置好的实例
  2. 每轮动态值走 ctx experiment 声明的 modelflags,运行器每轮经 ctx 原样递给 send;Adapter 不解释它们的含义,只随请求转发给应用。
把第一步的 my-agent 从固定 URL 的实例改成接收配置的工厂。将 default export 改为返回 defineAgent(...) 的函数,并让 send 读取工厂参数。Experiment 声明的 modelflags 每轮经 ctx 到达,再由 send 随请求转发:
鉴权 header、协议开关这类同属静态配置,一样加进 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 文件,并传入不同的工厂参数:
不要把 URL 放进 CLI 位置参数——experiment 名之后的位置参数只用于过滤评估用例 ID。experiment 的完整字段(runsbudget、并发、sandbox)见写实验

添加可选能力

最小接入完成后,可以按需扩展 Adapter。已有评估用例不需要修改: 各项能力对应的接入等级和功能范围见 Tier

参考实现

examples/zh/tier1 提供五个可运行的无侵入接入示例(ai-sdk-v7、claude-sdk、codex-sdk、pi-sdk、langgraph),覆盖事件流断言、多轮隔离、HITL 批准与拒绝,以及 trace 瀑布图。手写 send 只需实现 transport 和映射表;会话续接与 HITL 暂停恢复由 ctx.session 提供,逐帧驱动可使用内置实现,见内置 Agent 能力

相关阅读

  • 官方适配器一览 —— 查看 Sandbox 与非 Sandbox Adapter 及其配置项。
  • 写 send —— 手写 Adapter 的完整教程:七步递进,从发一条消息到 HITL、OTel、flags。
  • Adapter —— send 的契约:TurnInput / AgentContext / Turn 逐字段。
  • OTel 接入 —— 把应用的 span 也发给 NiceEval,换 niceeval view 的调用瀑布图。
  • Tier —— 查看三个接入等级的要求与能力。
  • 写实验 —— defineExperiment 的完整字段。