跳转到主要内容
每个 niceeval agent 都是一个 adapter:一段知道如何驱动特定 backend,并把输出转成标准事件流的代码。runner 只调用 agent.send(input, ctx)

defineAgent

用于进程内函数和 HTTP 服务:
import { defineAgent } from "niceeval/adapter";
name
string
必填
agent 唯一名字。experiment 引用 agent 对象,报告按这个名字分组。
capabilities
AgentCapabilities
声明 agent 能力。runner 据此决定 t 上哪些方法可用。
conversation
boolean
支持多轮会话,启用 t.replyt.newSession()
toolObservability
boolean
产生工具或动作事件,启用 t.calledTool() 等断言。
workspace
boolean
能操作文件系统,启用 t.fileChanged()t.check(await t.sandbox.runCommand("npm", ["test"], { cwd: "/workspace" }), commandSucceeded()) 等断言。
send
(input: TurnInput, ctx: AgentContext) => Promise<Turn>
必填
驱动 agent 的核心函数。必须返回标准 Turn

input

text
string
当前 t.send(...) 传入的文本。

ctx

signal
AbortSignal
用于超时和取消。
model
string | undefined
CLI 或配置传入的模型。
flags
Readonly<Record<string, unknown>>
运行时 flags。
session
{ id?: string; isNew: boolean }
当前会话信息。
log
(msg: string) => void
向运行日志写消息。

进程内示例

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?)
function
运行命令。
runShell(script, opts?)
function
运行 shell 脚本。
readFile(path)
function
读取 sandbox 内文件。
writeFiles(files)
function
写入文件。
stop()
function
停止 sandbox。
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 作者看到的测试上下文。两者使用同一批运行数据,但职责不同。