localhost 地址,只能单轮对话。真实项目很快会遇到这些问题:本地和预发环境地址不同,想比较两个模型,想检查工具调用。这一页说明怎样把那个最小 Adapter 变成能长期用的接入。
先选接入方式
AI SDK 应用
基于 Vercel AI SDK 的应用,用内置适配器直接连现有 HTTP 接口,不用手写映射。
Claude Code、Codex 等 Coding Agent
用内置 Sandbox Agent,把 Agent 放进隔离环境里跑。
其它 AI 应用
手写一个 Adapter 的
send 函数。应用已有 OTel 埋点的,还能接入 OTel看调用瀑布图。defineAdapter,见评估自定义应用。
连接真实的入口
被测对象是独立的 HTTP 服务时,Adapter 应该调用线上实际使用的那个接口,即使服务代码和评估用例在同一个仓库里。不要为了方便改成在进程内直接调用函数:- HTTP 层、序列化、中间件和流式传输都会被绕过,评估通过不代表线上行为正确。
- HTTP Adapter 换一个
baseUrl就能连本地、预发或生产;进程内调用只能在当前代码库里跑。
send 里直接调用它,不要为了套用 HTTP 写法额外搭一个服务。
被测服务的启动和停止不归 Adapter 管。先用项目自己的开发命令、部署脚本或 CI 把服务起好,确认健康检查通过,再运行评估。服务起不来时,让评估如实报错,不要用写死的回复冒充运行结果。需要每次评估自动起停的服务,见启动实验共享服务。
两条传配置的通道
接入里最容易乱的是“这个值该从哪里传”。只有两条通道:- 连到哪里、怎么鉴权,走 Adapter 工厂。 URL、鉴权 header、协议开关这类环境级配置,作为工厂参数写在 Experiment 文件里。
- 这次跑什么配置,走
ctx。 Experiment 里的model和flags,NiceEval 每轮经ctx交给send。Adapter 不解释它们的含义,原样转给应用。
model 和 flags:
baseUrl:
ctx 上每轮能用到的字段:
报告进度和异常
调用上游比较慢,或者响应不完整时,用ctx 报告,不要直接 console.log:
- 被测 Agent 正常回复了,但这一轮它自己报告失败:返回
status: "failed"。这次运行会得出结论,通常是failed。 - 连接失败、响应没法解析,评估没法继续:直接抛出异常。这次运行记为
errored,终端会给出 locator。 - 能继续,但有值得记下的异常:写一条
ctx.diagnostic。它不会改变通过与否。
niceeval show @<locator> 查看。
没跑通时先查哪里
fetch直接抛错,例如连接被拒:应用没起来,或者 URL 不对。先用curl对同一个接口发一次请求确认。t.succeeded()没过:请求发出去了,但 Adapter 返回了failed。检查应用的错误响应是怎么映射到status的。- 只有内容断言没过:接入已经通了。用
niceeval show @<locator> --execution看应用实际回了什么,再决定改断言还是改应用。
按需加上更多能力
最小接入只能检查回复文本。下面这些能力都只改 Adapter,已有的评估用例不用动:
各项能力分别需要应用配合到什么程度,见 Tier。
参考实现
examples/zh/tier1 有五个可运行的接入示例:AI SDK v7、Claude SDK、Codex SDK、Pi SDK 和 LangGraph。它们覆盖工具调用断言、多轮隔离、HITL 的批准与拒绝,以及调用瀑布图。send 的完整字段见 Adapter,全部官方适配器见官方适配器一览。