跳转到主要内容
Sandbox agent 会在隔离环境中启动 coding-agent CLI,给它 workspace 和任务,让它自由修改文件、运行命令,然后收集 transcript、diff 和测试结果。

内置 sandbox agents

claude-code

运行 Anthropic Claude Code CLI,需要 ANTHROPIC_API_KEY

codex

运行 OpenAI Codex CLI,需要 OPENAI_API_KEY

bub

运行 bub coding agent,鉴权遵循 bub CLI 自身约定。

运行内置 agent

export ANTHROPIC_API_KEY=sk-ant-...
npx niceeval exp local fixtures/button --sandbox docker

npx niceeval exp local fixtures/button --runs 10 --early-exit
如果 Docker 是默认后端,--sandbox docker 可以省略。--sandbox auto 会根据环境变量选择云端或 Docker。

agent 环境变量

Agent必需变量
claude-codeANTHROPIC_API_KEY
codexOPENAI_API_KEY
bub遵循 bub CLI 鉴权

工作流程

createSandbox
  → git init && git commit
  → adapter.setup?                 # 装 CLI / 写 agent 配置
  → test(t): uploadDirectory(...)   # 写入这条 eval 的起始文件
  → adapter.send(input, ctx)
  → test(t): runCommand(...)        # 手工运行验证命令
  → collectGeneratedFiles()         # git diff HEAD
  → sandbox.stop()
起始文件和验证命令都写在 test(t) 中。agent 执行阶段只能看到你已经写进 sandbox 的文件。

自定义 sandbox agent

import { defineSandboxAgent } from "niceeval/adapter";

export default defineSandboxAgent({
  name: "my-agent",
  async send(input, ctx) {
    await ctx.sandbox.runCommand("my-agent", ["run", input.text]);
    const transcript = await ctx.sandbox.readFile("transcript.jsonl");
    return {
      status: "completed",
      events: parseTranscript(transcript),
    };
  },
});

ctx.modelctx.flags

CLI 传入的模型和自定义 flags 会出现在 adapter context 中。adapter 可以决定如何把它们转成 CLI 参数或 HTTP payload。

在 experiment 中使用自定义 agent

import { defineExperiment } from "niceeval";
import myAgent from "./agents/my-agent";

export default defineExperiment({
  agent: myAgent,
  runs: 3,
});
不要在 core runner 里写 agent-specific 分支。差异行为应该放进 adapter。