🎨 Welcome to the Creative Writing Benchmark v3 repository! This benchmark evaluates the creative writing capabilities of large language models using a hybrid rubric and Elo scoring system, designed for enhanced discrimination, especially at the top end of model performance. This is the system used for the Creative Writing leaderboard on EQ-Bench.com.
The evaluation process involves several steps:
+ symbols).+'s) from pairwise comparisons. This process loops until model positions stabilize.deepseek/deepseek-r1 to 1500, mistralai/ministral-3b to 200) to ensure comparability over time.More info here: https://eqbench.com/about.html#creative-writing-v3
Clone the repository:
git clone https://github.com/EQ-bench/creative-writing-bench.git
cd creative-writing-bench
Install dependencies:
pip install -r requirements.txt
# Or manually:
# pip install requests python-dotenv numpy scipy tqdm glicko2 nltk joblib
You also need to download NLTK data:
import nltk
nltk.download('punkt')
nltk.download('cmudict')
Configure API Keys:
cp .env.example .env.env file and add your API keys and desired endpoint URLs for the test and judge models. You can also adjust timeouts and retries here.Execute the main script with your desired parameters. For a leaderboard-comparable score, use the recommended judge model and the provided runs file:
python3 creative_writing_bench.py \
--test-model "your-model-provider/your-model-name" \
--judge-model "claude-sonnet-4-6" \
--runs-file "creative_bench_runs.json" \
--creative-prompts-file "data/creative_writing_prompts_v3.json" \
--run-id "my_model_run_1" \
--threads 500 \
--verbosity "INFO" \
--iterations 3
Important Arguments:
--test-model: Identifier for the model you want to evaluate.--judge-model: Identifier for the judge model (use claude-sonnet-4-6 for leaderboard scores).--runs-file: Path to the JSON file storing run data. Crucially, to get an Elo score comparable to the EQ-Bench leaderboard, you must use the creative_bench_runs.json file provided in this repository, as it contains the necessary historical data for Elo calculation. Start with the one provided here. Subsequent runs will update this file.--iterations: Number of generation iterations per prompt (default and recommended: 3).--run-id: A unique prefix for this specific run attempt. Helps organize results if you run the same model multiple times.--threads: Number of parallel threads for generation and judging (adjust based on your API rate limits and system). High numbers like 500 assume generous rate limits.--verbosity: Logging level (e.g., DEBUG, INFO).Leaderboard results are saved in creative_bench_runs.zip and elo_results.zip. If you would to compare a result against the leaderboard models, unzip these into the root repository dir and the eval pipeline will use them in ELO matchups (assuming you are using default run file paths), giving you a leaderboard-comparable result.
These canonical zip files may not be always updated, so if you need the latest results, ping contact@eqbench.com.
Quick example for leaderboard reproduction:
# ensure .env is set up for your api, then:
unzip creative_bench_runs.zip
unzip elo_results.zip
python3 creative_writing_bench.py \
--test-model "your-model-provider/your-model-name" \
--judge-model "claude-sonnet-4-6" \
--runs-file "creative_bench_runs.json" \
--run-id "my_model_run_1" \
--iterations 3
--runs-file (e.g., creative_bench_runs.json).elo_results.json.elo_norm) for your test model will be printed at the end and saved in elo_results.json. This is the score comparable to the EQ-Bench leaderboard.Evaluating creative writing is inherently subjective. This benchmark aims to provide a reliable relative ranking by:
However, no benchmark is perfect. Always supplement scores by reading sample outputs and forming your own judgment.
These scores measure different aspects and may not always align perfectly due to judging methodology differences and criteria variations. The normalized Elo score (elo_norm) is the primary metric used for the leaderboard ranking.
We attempt to control for several biases common in pairwise LLM judging:
Biases not explicitly controlled for include potential judge self-bias, positivity/negativity bias, NSFW content aversion (smut bias), stylistic preferences, and "slop" bias (favoring overused tropes). Be mindful of these when interpreting results.
Always view benchmark scores as a guide, not absolute truth. Read the sample outputs!
If you use this benchmark in your work, please cite the repository:
@misc{creative-writing-bench-v3,
author = {Samuel J Paech},
title = {EQ-Bench Creative Writing Benchmark v3},
year = {2025},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/EQ-bench/creative-writing-bench}}
}
23 commits
HTML
99.0%
🎨 Welcome to the Creative Writing Benchmark v3 repository! This benchmark evaluates the creative writing capabilities of large language models using a hybrid rubric and Elo scoring system, designed for enhanced discrimination, especially at the top end of model performance. This is the system used for the Creative Writing leaderboard on EQ-Bench.com.
The evaluation process involves several steps:
+ symbols).+'s) from pairwise comparisons. This process loops until model positions stabilize.deepseek/deepseek-r1 to 1500, mistralai/ministral-3b to 200) to ensure comparability over time.More info here: https://eqbench.com/about.html#creative-writing-v3
Clone the repository:
git clone https://github.com/EQ-bench/creative-writing-bench.git
cd creative-writing-bench
Install dependencies:
pip install -r requirements.txt
# Or manually:
# pip install requests python-dotenv numpy scipy tqdm glicko2 nltk joblib
You also need to download NLTK data:
import nltk
nltk.download('punkt')
nltk.download('cmudict')
Configure API Keys:
cp .env.example .env.env file and add your API keys and desired endpoint URLs for the test and judge models. You can also adjust timeouts and retries here.Execute the main script with your desired parameters. For a leaderboard-comparable score, use the recommended judge model and the provided runs file:
python3 creative_writing_bench.py \
--test-model "your-model-provider/your-model-name" \
--judge-model "claude-sonnet-4-6" \
--runs-file "creative_bench_runs.json" \
--creative-prompts-file "data/creative_writing_prompts_v3.json" \
--run-id "my_model_run_1" \
--threads 500 \
--verbosity "INFO" \
--iterations 3
Important Arguments:
--test-model: Identifier for the model you want to evaluate.--judge-model: Identifier for the judge model (use claude-sonnet-4-6 for leaderboard scores).--runs-file: Path to the JSON file storing run data. Crucially, to get an Elo score comparable to the EQ-Bench leaderboard, you must use the creative_bench_runs.json file provided in this repository, as it contains the necessary historical data for Elo calculation. Start with the one provided here. Subsequent runs will update this file.--iterations: Number of generation iterations per prompt (default and recommended: 3).--run-id: A unique prefix for this specific run attempt. Helps organize results if you run the same model multiple times.--threads: Number of parallel threads for generation and judging (adjust based on your API rate limits and system). High numbers like 500 assume generous rate limits.--verbosity: Logging level (e.g., DEBUG, INFO).Leaderboard results are saved in creative_bench_runs.zip and elo_results.zip. If you would to compare a result against the leaderboard models, unzip these into the root repository dir and the eval pipeline will use them in ELO matchups (assuming you are using default run file paths), giving you a leaderboard-comparable result.
These canonical zip files may not be always updated, so if you need the latest results, ping contact@eqbench.com.
Quick example for leaderboard reproduction:
# ensure .env is set up for your api, then:
unzip creative_bench_runs.zip
unzip elo_results.zip
python3 creative_writing_bench.py \
--test-model "your-model-provider/your-model-name" \
--judge-model "claude-sonnet-4-6" \
--runs-file "creative_bench_runs.json" \
--run-id "my_model_run_1" \
--iterations 3
--runs-file (e.g., creative_bench_runs.json).elo_results.json.elo_norm) for your test model will be printed at the end and saved in elo_results.json. This is the score comparable to the EQ-Bench leaderboard.Evaluating creative writing is inherently subjective. This benchmark aims to provide a reliable relative ranking by:
However, no benchmark is perfect. Always supplement scores by reading sample outputs and forming your own judgment.
These scores measure different aspects and may not always align perfectly due to judging methodology differences and criteria variations. The normalized Elo score (elo_norm) is the primary metric used for the leaderboard ranking.
We attempt to control for several biases common in pairwise LLM judging:
Biases not explicitly controlled for include potential judge self-bias, positivity/negativity bias, NSFW content aversion (smut bias), stylistic preferences, and "slop" bias (favoring overused tropes). Be mindful of these when interpreting results.
Always view benchmark scores as a guide, not absolute truth. Read the sample outputs!
If you use this benchmark in your work, please cite the repository:
@misc{creative-writing-bench-v3,
author = {Samuel J Paech},
title = {EQ-Bench Creative Writing Benchmark v3},
year = {2025},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/EQ-bench/creative-writing-bench}}
}
23 commits
HTML
99.0%