The official WordPress AI benchmark. Evaluate how well language models understand WordPress development—from core APIs and coding standards to plugin architecture and security best practices.
The official WordPress AI benchmark. Evaluate how well language models understand WordPress development—from core APIs and coding standards to plugin architecture and security best practices.
WP-Bench measures AI model capabilities across two dimensions:
The benchmark uses WordPress itself as the grader, running generated code in a sandboxed environment with static analysis and runtime assertions.
Requires Python version 3.10 or later
python3 -m venv .venv && source .venv/bin/activate
pip install -e ./python
Create a .env file with your model provider API keys:
OPENAI_API_KEY=sk-...
ANTHROPIC_API_KEY=sk-ant-...
GOOGLE_API_KEY=...
cd runtime
npm install
npm start
cd ..
wp-bench run --config wp-bench.example.yaml
Results are written to output/results.json with per-test logs in output/results.jsonl.
Compare multiple models in a single run by listing them in your config:
models:
- name: gpt-4o
- name: gpt-4o-mini
- name: claude-sonnet-4-20250514
- name: claude-opus-4-5-20251101
- name: gemini/gemini-2.5-pro
- name: gemini/gemini-2.5-flash
The harness runs each model sequentially and outputs a comparison table. Model names follow LiteLLM conventions.
Copy wp-bench.example.yaml and customize:
dataset:
source: local # 'local' or 'huggingface'
name: wp-core-v1 # suite name
models:
- name: gpt-4o
grader:
kind: docker
wp_env_dir: ./runtime # path to wp-env project
timeout_seconds: 90 # hard cap per runtime execution (timeout = 0.0 score)
setup_timeout_seconds: 600 # hard cap for environment setup
run:
suite: wp-core-v1
limit: 10 # limit tests (null = all); seeded stratified selection
seed: 1337 # selection seed (same seed = same subset)
test_ids: [] # optional explicit test IDs to run
dry_run: false # load/filter tests without calling models
concurrency: 4 # model-call concurrency (knowledge tests)
execution_isolation: reset_per_test # reset WordPress before each execution test
execution_concurrency: 1 # must stay 1 under reset_per_test isolation
continue_on_error: false # record per-test errors and keep going (diagnostic
# only; errored tests are excluded from aggregates)
output:
path: output/results.json
jsonl_path: output/results.jsonl
# Run from project root
wp-bench run --config wp-bench.yaml # run with config file
wp-bench run --model-name gpt-4o --limit 5 # quick single-model test (stratified subset)
wp-bench run --limit 5 --seed 42 # different deterministic subset
wp-bench run --test-type knowledge # run only knowledge tests (no WordPress env needed)
wp-bench run --test-type execution # run only execution tests
wp-bench run --test-type execution --test-id e-abilities-api-001
wp-bench run --test-id e-abilities-api-001 --test-id e-rest-api-001
wp-bench run --config wp-bench.yaml --dry-run # validate config without calling models
wp-bench run --check-reference-solution --test-type execution # verify reference solutions pass
wp-bench run --check-exploits --test-type execution # adversarial assertion audit (see below)
--check-reference-solution proves a correct solution passes; --check-exploits
proves that trivial cheats fail. For every execution test it runs a battery of
zero-effort stubs (an empty function, return 1, return true, return array(), …)
through the real WordPress verifier and flags any test whose assertions a cheat can
satisfy. Such a test is under-specified — its assertions check a predictable output
(one fixture’s answer) rather than the WordPress behavior the task describes, so a
model could score on it without doing the work. Exits non-zero if any test is
exploitable; results (with the passing cheat per test) are written to the output file.
wp-bench run --check-exploits --test-type execution
.
├── python/ # Benchmark harness (pip installable)
├── runtime/ # WordPress grader plugin + wp-env config
├── datasets/ # Test suites (local JSON + Hugging Face builder)
├── notebooks/ # Results visualization and reporting
└── output/ # Benchmark results (gitignored)
Test suites live in datasets/suites/<suite-name>/ with two directories per suite:
execution/ — Code generation tasks with assertions (one JSON file per category)knowledge/ — Multiple-choice and short-answer knowledge questions (one JSON file per category)The default suite wp-core-v1 covers WordPress core APIs, hooks, database operations, and security patterns.
dataset:
source: huggingface
name: WordPress/wp-bench-v1
After running benchmarks, visualize results with the included Jupyter notebook:
pip install jupyter pandas plotly
jupyter notebook notebooks/results_report.ipynb
The notebook generates:
pip install -e ./python[dev] # install with dev dependencies
ruff check python/ # lint
mypy python/ # type check
pytest python/ # test