Skip to content

Repository files navigation

Coding Harness Arena

同一个编码任务,在同一代码库快照、同一 MCP 配置下,并行分发给 M 个 Coding Harness × N 个底层模型,各路在独立 git worktree 中执行,产出 diff 供人工验收打分,结果沉淀为个人偏好数据库——为「任务 → 最优 harness+model 组合」的智能路由积累数据。

当前状态:M1 完成(CLI + 执行引擎 + 三个适配器,冒烟通过)。下一步 M2:arena serve Web 对比/打分 UI。设计见 docs/design/architecture-v1.md,调研见 docs/research/

快速开始

npm install
./bin/arena run "在 app.js 加 greet(name) 并 module.exports" \
  --repo /path/to/your/repo \
  --matrix "claude-code:sonnet,opus:low codex:default:low opencode:opencode/big-pickle:low" \
  --timeout-min 15

矩阵语法:harness:model1,model2:effort1,effort2(effort ∈ off|low|high,多组空格分隔)。

其他命令:

./bin/arena serve -p 3939    # Web UI:diff 并排对比、打分/采用、A/B 两两对比、排行榜
./bin/arena verdict <taskId> # 终端交互式验收(逐格打分 + pairwise)
./bin/arena stats            # 按组合聚合的表现排行榜
./bin/arena accept <runId>   # 输出把该 run 合入目标 repo 的 merge/apply 命令
./bin/arena list            # 历史任务
./bin/arena show <taskId>   # 某任务各 run 状态/指标/diff 路径(id 可前缀)
./bin/arena export -o x.jsonl
./bin/arena adapters        # 已支持 harness 列表
./bin/arena run ... --dry-run   # 只建档展开矩阵不执行
./bin/arena run ... --mcp ./arena.mcp.json  # 注入统一 MCP 配置(公平性)

数据落在 ~/.arena/arena.db(SQLite:task/run/verdict/pairwise 四表)、tasks/<taskId>/artifacts/(每 run 的原始事件流 *.jsonl + 补丁 *.patch)。每个 run 在目标 repo 留一个 arena/<taskId>/<runId> 分支,diff 可复核、可 cherry-pick。

已支持的 harness × 模型

harness 模型 effort 映射 凭证
claude-code sonnet/opus/haiku/全名 --effort low/high ANTHROPIC_API_KEY 或已 claude login
codex default(或 -m 任意模型) model_reasoning_effort=minimal/low/high ~/.codex/auth.json(自动复制进隔离 CODEX_HOME)
opencode provider/model(如 anthropic/claude-sonnet-4-6opencode/big-pickle --variant minimal/low/high opencode auth login / ~/.config/opencode/opencode.json 自定义 provider

注意:

  • Claude Code 与 Codex 走各自的官方模型;Claude Code × 非 Claude 模型需要 ANTHROPIC_BASE_URL 代理(△ 探索格,适配器已支持 extraEnv 注入)。
  • Codex 无头模式有 TTY/stdin 两个已知 bug,适配器已内置 workaround(stdin 空写端 + 隔离 CODEX_HOME)。
  • 单机并行瓶颈是 API 限流而非 CPU:默认每 provider 并发 2,用 --concurrency '{"openai":3}' 调。

架构

src/
  cli.ts          # commander CLI(run/list/show/serve/verdict/stats/accept/export/adapters)
  engine.ts       # 单 run 生命周期:worktree → 子进程 → diff 导出 → 指标入库
  runner.ts       # 并发调度:按 provider 分桶限流 + 失败重试
  server.ts       # arena serve 的 REST API(Node 原生 http,无框架)
  verdict.ts      # 终端交互式验收(readline 行读取器,TTY/管道均可)
  adapters/       # claude-code / codex / opencode(build + extractMetrics)
  store.ts        # SQLite(better-sqlite3,WAL)+ verdict/pairwise 读写 + comboStats
  git.ts          # worktree / diff 采集(git add -N 覆盖未跟踪文件)
  matrix.ts       # 矩阵展开
web/
  index.html      # 单文件 UI(diff2html CDN 渲染 diff,打分/A-B/排行榜)

关键设计(详见架构文档):公平性靠「同 base commit + 同 MCP 配置快照 + 隔离配置目录」;指标归一化为 RunMetrics{tokens, costUsd, wallTimeMs, numTurns, toolCalls, exitStatus};verdict/pairwise 表为场景 2 的 Bradley-Terry / 路由预留。

测试

npx vitest run      # 单元测试(矩阵展开 + 三个适配器的日志解析)
npx tsc --noEmit    # 类型检查

Roadmap

  • M1 CLI + worktree 执行引擎 + 3 适配器(冒烟通过:codex×gpt + opencode×big-pickle 并行产出 diff 与指标)
  • M2 验收闭环:arena verdict 终端交互 + arena serve Web UI(diff 并排/打分/采用/A-B pairwise 落库)+ arena stats 排行榜
  • M3 kimi-code 适配器 + gateway 元数据记录(量化 harness 锁定效应)
  • M4 统计视图(组合胜率/成本/时长)+ 任务标签
  • M5 Harbor/Terminal-Bench 导入器(task.source='terminal-bench')+ DockerRunner

About

Benchmark coding harnesses, models, reasoning levels, and sandboxes under controlled environments

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages