Skip to content

nogataka/coding-agent-bench

Repository files navigation

Coding Agent Benchmark

複数のコーディングエージェント(codex、claudecode、opencode)を同一課題・同一制約で実行し、成功率・所要時間・テスト通過率などを自動収集するベンチマークツール。

特徴

  • 公平な比較:実行環境・制約・課題を統一
  • 📊 自動評価:テスト通過率、実行時間、終了コードを自動収集
  • 🔄 順序ランダム化:実行順の偏りを排除
  • 🎯 拡張可能:新しいエージェントやタスクを簡単に追加
  • 🏗️ ビルトインリポジトリ:すぐに試せるベースリポジトリを同梱

セットアップ

1. 依存関係のインストール

# ベンチマークツール本体
pnpm install

# ベースリポジトリ(テスト用プロジェクト)
cd base-repo
pnpm install
cd ..

2. 環境設定

デフォルトでは base-repo を使用する設定になっています。独自のリポジトリを使う場合は .env を編集:

BENCH_REPO_PATH=./base-repo  # または独自のリポジトリパス
BENCH_TEST_CMD="pnpm test"
BENCH_TIME_BUDGET_MIN=20

3. ビルド

pnpm build

使い方

クイックスタート(ベースリポジトリを使用)

# ベースリポジトリのセットアップ
cd base-repo
pnpm install
pnpm test  # すべてのテストが通過することを確認
cd ..

# ベンチマーク実行
pnpm build
pnpm bench

バグ状態のリセット (難易度別)

ベンチ実行前に base-repo をバグ状態へ戻したい場合は、ルートで次のスクリプトを実行します。

pnpm prepare:l1  # L1: parseUser の null チェックが壊れた状態
pnpm prepare:l2  # L2: /health ルートが登録されていない状態
pnpm prepare:l3  # L3: L1+L2 を同時に壊した複合バグ

即座にベンチを走らせる場合は pnpm bench:l1 (または bench:l2, bench:l3) を利用すると、リセット→ビルド→ベンチをまとめて実行できます。 バグ状態を確認したい場合は pnpm prepare:l1 -- --verify のように VERIFY=true を付けると対象テストのみを走らせ、期待どおり失敗するか検証できます(環境によってはネットワーク制限で health 系テストが bind エラーを出す点に注意してください)。

結果確認

  • results/summary.csv - 集計結果(CSV形式)
  • results/run-<timestamp>.json - 詳細ログ(JSON形式)

ベースリポジトリ

base-repo/ には、すぐに使えるテスト用プロジェクトが含まれています:

  • TypeScript + Express + Jest の最小構成
  • 2つのテスト課題に対応
    • L1: parseUser 関数の null チェック修正
    • L2: /health エンドポイントの追加
  • すべてのテストが通過する状態

詳細は base-repo/README.md を参照してください。

タスク定義

tasks/ ディレクトリに YAML 形式でタスクを定義します。

task_id: fix-null-check
difficulty: L1
context_paths:
  - src/utils/parseUser.ts
requirements:
  - "undefined/nullのuserでもparseUserが落ちないこと"
constraints:
  - "新規依存追加は禁止"
success_criteria:
  test_cmd: "pnpm test"
  must_pass: 100
time_budget_min: 15

サンプルタスク:

  • tasks/sample-fix-null-check.yaml - parseUser の null 処理
  • tasks/sample-add-endpoint.yaml - health エンドポイント追加

エージェント設定

bench.config.ts で各エージェントの実行コマンドをカスタマイズできます。

agents: {
  codex: {
    cmd: "codex",
    args: (sessionId, message) => ["exec", "--json", "resume", sessionId, message],
  },
  claudecode: {
    cmd: "claude",
    args: (sessionId, message) => [
      "--json", "resume", sessionId, 
      "--non-interactive", "--message", message
    ],
  },
  opencode: {
    cmd: "opencode",
    args: (sessionId, message) => [
      "run", "--format", "json", "--session", sessionId, message
    ],
  },
}

公平性ルール

  • ネットワークアクセス:全エージェント統一(.env で設定)
  • 新規依存の追加:全エージェント統一(.env で設定)
  • 時間制限:タスクごとまたは全体で設定可能
  • 実行順:ランダム化により順序効果を排除

プロジェクト構成

bench/
├── package.json
├── tsconfig.json
├── bench.config.ts          # エージェント設定
├── .env                     # 環境変数
├── src/
│   ├── types.ts             # 型定義
│   ├── utils.ts             # ユーティリティ
│   ├── git.ts               # Git操作
│   ├── score.ts             # スコアリング
│   ├── runner.ts            # メインランナー
│   └── adapters/
│       ├── base.ts
│       ├── codex.ts
│       ├── claudecode.ts
│       └── opencode.ts
├── tasks/                   # タスク定義(YAML)
├── base-repo/               # ビルトインテストリポジトリ
├── results/                 # 実行結果(自動生成)
└── prompts/                 # プロンプト(自動生成)

拡張

新しいエージェントの追加

  1. bench.config.ts にエージェント設定を追加
  2. src/adapters/ に新しいアダプターを作成
  3. src/runner.tsadapters オブジェクトに登録

新しいタスクの追加

tasks/ ディレクトリに YAML ファイルを追加するだけ。

独自リポジトリの使用

  1. .envBENCH_REPO_PATH を変更
  2. リポジトリが pnpm install && pnpm test で動作することを確認
  3. タスク定義の context_paths をリポジトリの構造に合わせて調整

トラブルシューティング

エージェントが見つからない

各エージェントのCLIがインストールされ、PATHに追加されていることを確認してください。

# 確認コマンド
codex --version
claude --version
opencode --version

テスト結果が取得できない

bench.config.tstestCmd が正しいか確認してください。Jest を使用している場合、JSON出力オプションが利用可能か確認してください。

タイムアウトが発生する

.envBENCH_TIME_BUDGET_MIN を増やすか、個別タスクの time_budget_min を調整してください。

ベースリポジトリのテストが失敗する

cd base-repo
pnpm install
pnpm test

依存関係が正しくインストールされているか確認してください。

ライセンス

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published