Axon 的能力基准(benchmark)评估体系。不是单元测试 —— 这里跑真实的 LLM 调用, 拿 Pass@1 / cost / 耗时三件套衡量整个 agent 编排能否稳定完成任务。
# 跑最便宜的 3 题 smoke(首次推荐)
npm run eval:smoke
# 跑全套 curated
npm run eval
# 换模型
tsx evals/cli.ts smoke --model opus
# Pass@3(每题独立跑 3 次)
tsx evals/cli.ts smoke --attempts 3
# 失败时保留 tmp workspace 便于排查
tsx evals/cli.ts smoke --keep-failedevals/
├── runner/ # 评估引擎(任务执行、trajectory、指标聚合)
│ ├── types.ts # EvalTask / EvalResult / 指标类型
│ ├── runner.ts # 核心:单题/套件执行
│ ├── workspace.ts # tmp 工作目录管理
│ ├── trajectory.ts # tool call 轨迹 + edit churn
│ └── reporter.ts # markdown + jsonl 输出
├── suites/
│ └── curated/ # 内部 curated 任务(每题一个目录)
│ ├── index.ts # 注册中心,SMOKE_TASKS 是子集
│ ├── 001-create-file/
│ ├── 002-fix-typo/
│ └── 003-rename-symbol/
├── cli.ts # 命令行入口
└── reports/ # 运行结果(gitignored)
└── <runId>/
├── report.md
├── results.jsonl
├── summary.json
└── trajectories/<taskId>-attempt<N>.json
| 指标 | 定义 |
|---|---|
| Pass@1 | 单次跑通 verify 的任务比例 |
| Cost per resolved | 总 USD ÷ 成功数(避免"暴力多轮刷分") |
| p50 wall time | 中位耗时 |
- Pass@N — N 次内至少一次通过(衡量稳定性)
- Avg input / output tokens
- Avg turns / tool calls
- Avg edit churn — 同文件被反复改的次数(返工率)
- Failure mode breakdown —
wrong_fix / no_progress / crash / timeout / budget_exceeded / max_turns
每个任务是一个 EvalTask 对象:
{
id: 'curated-XYZ-...',
suite: 'curated',
title: '...',
prompt: '...', // 给 agent 的指令
setup(env): Promise, // 准备工作目录(copy fixture 等)
verify(env): Promise, // 返回 {passed, reason, log}
budget: { // 单题硬上限
maxTokens, maxTimeSec, maxTurns, maxBudgetUSD,
},
}详见 runner/types.ts。
- 真实 LLM 调用:smoke 跑得起、贵题(SWE-bench)单独排期。第一版不内置 mock。
- 单题 workspace 隔离:每题独立
mkdtemp临时目录,跑完即清。 失败时可--keep-failed留底排查(路径在日志里)。 - Pass@N 是独立 N 次 run,不是隐式重试:runner 不会偷偷"看到失败就重跑"。
- 没有 docker / sandbox:Step 1 只覆盖 curated,agent 在临时目录里跑
node等本地命令。 Step 3 接 SWE-bench 时再单独加 sandbox 层。 - 认证复用主进程:通过
initAuth()/getAuth()透传,跟用户日常用 axon 的凭证一致。
- Step 1:骨架 + 3 个 smoke 任务 +
npm run eval:smoke - Step 2:扩到 20 个 curated 任务(覆盖 blueprint / 配置 / 多工具协同)
- Step 3:SWE-bench Verified Python 子集(30 题)+ docker sandbox
- Step 4:对标 Claude Code CLI baseline + 消融实验
- LLM 非确定:Pass@1 单点噪声大,对外公布前至少跑
--attempts 3。 - cost 估算依赖 axon 自己的 client 计价:换 provider(axon-cloud / openai-compatible)时 价格表是否准确需单独验证。详见 LLM Provider Reality。
- smoke 也会真烧 token:每次 PR 都跑 3 题 ≈ $0.05-0.30,对应 1-3 分钟。
- OAuth subscription 用户的 cost 是"理论价":报告里的
$X.XXXX是按 Anthropic API 公开费率 从 token 数算出来的,OAuth 包月用户实际不会按此再扣费。要对标真实开销时用 API key 鉴权再跑一次。 tokens.totalTokens = input + output,不含 cacheRead:缓存读取在 trajectory JSON 的cacheReadInputTokens字段单独保留,按 Anthropic 计费语义不计入 total。- modelStats 是进程级全局:runner 用 baseline-diff 隔离每题统计,所以必须串行跑。 未来若要并行,需重构成 per-loop client 维度。