每个 niceeval agent 都是一个 adapter:一段知道如何驱动特定 backend,并把输出转成标准事件流的代码。runner 只调用 agent.send(input, ctx)。
defineAgent
用于进程内函数和 HTTP 服务:
import { defineAgent } from "niceeval/adapter";
agent 唯一名字。experiment 引用 agent 对象,报告按这个名字分组。
声明 agent 能力。runner 据此决定 t 上哪些方法可用。支持多轮会话,启用 t.reply 和 t.newSession()。
产生工具或动作事件,启用 t.calledTool() 等断言。
能操作文件系统,启用 t.fileChanged()、t.check(await t.sandbox.runCommand("npm", ["test"], { cwd: "/workspace" }), commandSucceeded()) 等断言。
send
(input: TurnInput, ctx: AgentContext) => Promise<Turn>
必填
驱动 agent 的核心函数。必须返回标准 Turn。
ctx
flags
Readonly<Record<string, unknown>>
运行时 flags。
session
{ id?: string; isNew: boolean }
当前会话信息。
进程内示例
export default defineAgent({
name: "echo",
capabilities: { conversation: true },
async send(input) {
return {
status: "completed",
events: [{ type: "message", role: "assistant", content: input.text }],
};
},
});
defineSandboxAgent
用于 coding agent CLI。ctx.sandbox 是当前隔离环境的句柄:
runCommand(cmd, args?, opts?)
运行命令。
import { defineSandboxAgent } from "niceeval/adapter";
export default defineSandboxAgent({
name: "my-cli-agent",
async send(input, ctx) {
await ctx.sandbox.runCommand("my-agent", ["run", input.text]);
return { status: "completed", events: [] };
},
});
import { defineExperiment } from "niceeval";
import echo from "./agents/echo";
export default defineExperiment({
agent: echo,
runs: 1,
});
ctx 与 t
ctx 是 adapter 侧看到的运行上下文;t 是 eval 作者看到的测试上下文。两者使用同一批运行数据,但职责不同。