Claude Fable 5をOpus 4.8、Sonnet 4.6、Codex CLIとブログ修正で比較した
目次
Claude Fable 5が出たので、手元のClaude Code CLIから呼べるか確認したうえで、Opus 4.8、Sonnet 4.6、Codex CLIと同じ小さな改修タスクを回した。
今回の小さな架空ブログ改修では、4つとも npm test と npm run build まで通した。
フィクスチャの規模が小さすぎるので、この結果だけでモデルの優劣は決められない。同じ指示で直させ、テスト通過後の差分を読むための記録だ。Fable、Opus、Sonnetはだいたい同じ方向で直した。一方でCodexは、同じテストを通しつつ違う方向性を示した。
速度はCLI経由の実測値なので、モデル単体の推論速度と同一視しない。ネットワーク、プロンプトキャッシュ、ハーネス、ツール実行、初期文脈量の影響を受ける。この記事では参考値として扱う。
本番ブログは使わない
実ブログをそのままAIエージェントに触らせると、未公開記事、内部の運用構造、SEO方針、ビルド構成がモデル側に渡る。記事化する場合も、サイトの構造を必要以上に公開することになる。
そのため、LiltingChannelWeb の技術記事の雰囲気だけを読み取り、別ディレクトリに架空の静的ブログフィクスチャを作った。
実験場所はここ。
/Users/hide3tu/projects/agent-blog-benchmark/
_template/
_results/
Fable/
Opus/
Sonnet/
Codex/
_template が原本で、各モデル用ディレクトリへ同じ状態をコピーしてから実行した。各ディレクトリは独立したgit repoにして、あとから git diff を取れるようにした。
検証用フィクスチャ
検証用フィクスチャは依存なしの小さなNode.jsプロジェクトにした。
package.json
BENCHMARK_TASK.md
src/articles.js
src/blog.js
scripts/build.js
test/blog.test.js
中身は架空の静的ブログだ。記事には tech、lab、tool のカテゴリがあり、公開記事一覧、関連記事、canonical URL、OGP、RSS、タグページを生成する。tech は技術記事、lab は実験メモ、tool はツール紹介、という扱いにした。
公開用のクリーンなディレクトリを別に切り、GitHub Actionsでは npm test と npm run build だけを検証する形にした。フィクスチャは壊れた初期状態なので、そのままではCIは赤くなる。エージェントや人間が修正したブランチ/PRを検証するためのCIだ。
公開用repoはこれ。
完成差分は4つのdraft PRとしてぶら下げた。GitHub Actions上では4本とも npm test と npm run build が成功している。
| PR | 対象 |
|---|---|
| #1 Fable solution | Claude Fable 5 |
| #2 Opus solution | Claude Opus 4.8 |
| #3 Codex solution | Codex CLI |
| #4 Sonnet solution | Claude Sonnet 4.6 |
壊しておいた箇所は次の通り。
| 領域 | 意図的に壊した内容 |
|---|---|
| メタデータ | 記事カテゴリが不正、tech記事のdescriptionが空 |
| 公開記事一覧 | draftを除外せず、古い順に並ぶ |
| 関連記事 | 自分自身やdraftを含み、共有タグ数の昇順になる |
| SEO | canonicalが /article/、OGP fallbackのパスも違う |
| description | Markdownやコードブロックを落とさない |
| RSS | draftを含み、canonicalも間違う |
| タグページ | 最初のタグしか拾わず、ページ分割も不完全 |
初期状態では npm test が7件すべて失敗する。
tests 7
pass 0
fail 7
タスク指示は全モデルで同じにした。
Read BENCHMARK_TASK.md.
Fix this repository so `npm test` and `npm run build` pass.
Keep the project dependency-free, do not remove tests, and keep changes scoped.
Run the tests yourself before finishing.
比較対象
手元ではClaude Code CLIが 2.1.170、Codex CLIが 0.139.0 だった。
Claude側は次で実行した。
claude --model fable
claude --model opus
claude --model sonnet
--effort は付けなかった。ただし、この手元環境の ~/.claude/settings.json には "effortLevel": "xhigh" が入っていた。
このため今回のClaude 3本は、ローカル設定でxhighを指定した状態で走っている。Claude Codeの結果JSONには解決後のeffort値が出ていなかったので、モデル側で上限に丸められたかまではログからは断定しない。少なくとも、この記事では「Claude Code側はローカル設定のxhigh」として扱う。
この環境では opus は claude-opus-4-8、sonnet は claude-sonnet-4-6 に解決された。Fableは claude-fable-5 として処理された。FableのログにOpus 4.8は出ていなかったので、今回のプロンプトではOpus fallbackは観測していない。Claude Code側の補助的なHaiku呼び出しは各Claude実行に少量出ている。
Codex側は codex exec --json --ephemeral --sandbox workspace-write で回した。こちらもコマンドラインではモデルやreasoning effortを指定していないが、~/.codex/config.toml では model = "gpt-5.5"、model_reasoning_effort = "high" になっていた。CodexはClaude Codeとは別ハーネスなので、費用や速度は直接比較しすぎない。
結果
全モデルがテストとビルドを通した。
| 実行対象 | effort | テスト | ビルド | 実行時間 | 推定コスト | 変更ファイル | 差分 |
|---|---|---|---|---|---|---|---|
| Claude Fable 5 | local xhigh | 7/7 | OK | 139.52秒 | $1.0522 | 2 | +46 / -23 |
| Claude Opus 4.8 | local xhigh | 7/7 | OK | 289.17秒 | $1.2158 | 2 | +44 / -18 |
| Claude Sonnet 4.6 | local xhigh | 7/7 | OK | 274.57秒 | $0.4745 | 2 | +37 / -22 |
| Codex CLI 0.139.0 | gpt-5.5 high | 7/7 | OK | 103.48秒 | 未取得 | 2 | +48 / -19 |
CodexのローカルJSONLでは、ドル建ての推定コストは出ていなかった。トークン使用量は次の通り。
input_tokens: 184869
cached_input_tokens: 145664
output_tokens: 4381
reasoning_output_tokens: 1566
Claude側の推定コストは、Claude CodeのJSON出力に出た total_cost_usd をそのまま使った。今回は claude コマンドで呼び出しており、APIを直接叩いたわけではない。実際のAPI請求額ではない。Claude Code実行ログ上のドル建て換算値として扱う。
実行後に確認したClaudeの利用状況は時間使用率3%程度だった。ほかのClaude作業は走らせていないため、この表示は今回の3本のClaude Code実行後の目安になる。ただし、total_cost_usd とサブスクリプション側の使用率は同じ指標ではない。
差分の中身
Fable、Opus、Sonnetはかなり似た直し方だった。
rss-canonical-regressionのcategory: "tool"をtechに直す- 空だったdescriptionを入れる
- 公開記事一覧からdraftを除外し、新しい順にする
- 関連記事から自分自身とdraftを除外する
- 共有タグ数の降順、同点なら公開日の降順にする
- canonicalを
/articles/<slug>に直す - OGP fallbackを
/images/og/<slug>.pngに直す - Markdown/code fenceを落としてdescriptionを作る
- タグページで全タグを拾い、ページ分割する
また、Claude側はどれも agent-cli-benchmark-setup に テスト タグを追加した。これはテスト期待値に合わせるための内容変更だが、記事本文に npm test の話があるので、記事内容とは合っている。
Codexもテストは通したが、ここが少し違った。
rss-canonical-regressionをtoolからlabに変更rss-canonical-regressionのdescriptionは空のまま- 複数記事に
Codexタグを追加して関連記事の期待順を満たす
テスト上は lab も有効なカテゴリなので通る。だが、RSSとcanonical URLの回帰記事を lab に分類すると、このフィクスチャの狙いから外れる。
自動テストは、意味的に良い修正かどうかまで拾えなかった。
速度は参考値
手元で測った実行時間は、Codexが103.48秒だった。Claude側ではFableが139.52秒で、Opus 4.8とSonnet 4.6より短かった。
ただし、これはモデル単体のtokens/secと同一視しない。
- CLIハーネスが違う
- キャッシュの効き方が違う
- ツール呼び出しの実装が違う
- 実行中にモデルがどれだけ確認したかが違う
- Claude Code側には補助的なHaiku呼び出しも含まれる
そのため、速度表は「この環境でこのタスクをこのCLI経由で回した時の実測」としてだけ読む。
差分から分かること
小さいフィクスチャでは、Fable 5だけの差は出にくかった。全モデルが一発でテストを通したからだ。
ただ、FableはClaude側では実行時間が短く、Opus 4.8より推定コストも低かった。この規模なら、Opus 4.8と並べても十分に良い結果だった。
一方で、Codexは103.48秒で終わったが、記事の意図からずれる差分が混ざった。これはCodexの問題というより、テストで制約できていなかった点だ。rss-canonical-regression はtech記事であるべき、という制約をテストに入れていなかった。
このベンチは小さい。静的ブログのメタデータと記事一覧処理なので、長時間の探索、設計判断、広いリファクタリング、複数ファイルをまたぐ仕様読解までは測れていない。
また、Claude Fable 5は長く曖昧な作業で差が出るタイプのモデルとして案内されている。今回のような7テストの小型フィクスチャでは、能力上限よりも「テストを読んで素早く直す」能力を比べる内容になっている。
それでも、簡易掲示板を作らせるよりは比較として分かりやすかった。RSS、canonical、OGP、draft除外、関連記事、タグページのように、静的サイトで壊れ方を想像しやすい題材にできるからだ。
次にやるなら、以下を追加したい。
- 期待カテゴリを固定するテスト
- 「関連記事を通すためだけの不自然なタグ追加」を検出する人間評価
- より大きい既存コードベース風のフィクスチャ
- 単発実行を避け、3回程度の反復実行
- 失敗時の自己修正回数