"Lord, forgive me, I've been running, running blind in truth."
— Beyonce / "Freedom" / Lemonade
ADE-bench[^1] is a framework for evaluating AI agents on data analyst tasks. Use it to create realistic testing environments with complex evaluation criteria, that can be shared as simple files and tested in production warehouses, while making it as easy as possible to create new tasks.
Watch an explainer video from Coalesce 2025
It does this by running each task in a separate temporary sandbox, and then evaluating the agent's work against the expected results.
git clone https://github.com/dbt-labs/ade-bench.git
cd ade-bench
uvYou might already have these, check with:
uv --version
docker compose version
If you don't, install them according to the links above.
ade CLIReminder: cd into the ade-bench directory first.
uv venv
source .venv/bin/activate
uv pip install -e .
Confirm it is installed by running:
ade --help
Learn more about virtual environments, including activation instructions for Windows.
Databases are distributed via GitHub Releases. Download them with the gh CLI:
gh release download databases --repo dbt-labs/ade-bench --pattern "*.duckdb" --dir shared/databases/duckdb
ade run simple001 --db duckdb --project-type dbt --agent sage
You should see output like this:
$ ade run simple001 --db duckdb --project-type dbt --agent sage 14:58:07 | system | START | STARTING HARNESS RUN 14:58:07 | system | START | Run ID: 2025-12-05__14-58-07 14:58:07 | system | START | Running with duckdb + dbt. Found 1 tasks of 1 requested tasks. ┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ Time ┃ Task ┃ Stage ┃ Message ┃ ┡━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │ 14:58:32 │ simple001 │ ✓ ✓ ✓ DONE │ PASS - dbt test results - Pass: 2, Fail: 0, Total: 2 │ │ ──────── │ ──────────────────────────────── │ ──────────── │ ──────────────────────────────────────────────────────────────────────────────────────────────────── │ │ 14:58:32 │ SUMMARY │ │ Run 1 of 1 tasks, 1 successful (100.0%) │ └──────────┴──────────────────────────────────┴──────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────┘ 14:58:32 | system | FINISH | Generated HTML dashboard. 14:58:32 | system | FINISH | Harness run completed: 1 of 1 tasks successful ======================================== RESULTS SUMMARY ======================================== +-------------+----------+----------------+---------+----------+------------+------------+--------+----------------+-----------------+----------------+---------+ | Task | Result | Failure Type | Tests | Passed | Passed % | Time (s) | Cost | Input Tokens | Output Tokens | Cache Tokens | Turns | |-------------+----------+----------------+---------+----------+------------+------------+--------+----------------+-----------------+----------------+---------| | simple001 | p | | 2 | 2 | | 0 | $0.00 | 0 | 0 | 0 | 0 | | | | | | | | | | | | | | | TOTAL (n=1) | 100% | | 2 | 2 | 100% | 0 | $0.00 | 0 | 0 | 0 | 0 | +-------------+----------+----------------+---------+----------+------------+------------+--------+----------------+-----------------+----------------+---------+ For more details, run the command below: ade view
Make a copy of .env.example and rename it to .env, then provide your preferred API keys in the specified locations. See Configuration for a worked example.
ade run all --db duckdb --project-type dbt --agent claude
--project-type dbt-fusion (set up Snowflake first)--plugin-set flag (see Plugin Sets section)ADE-bench has three primary components:
Each task represents a request that might be made to an agent. Though each task can include multiple evaluation criteria (e.g., it may require multiple models to be updated, or a model to have the correct SQL query and materialization configuration), the task is the primary unit of evaluation in ADE-bench.
When ADE-bench is asked to solve a task, here is what happens:
dim_users table, you can define this table in the task configuration, and the comparison test is generated automatically.ADE-bench runs with the ade CLI command. Here is an example command for running tasks:
ade run \
foo001 foo002 \ # The tasks to run. See the task selection list immediately below for more details.
--db snowflake \ # Which database variant to run
--project-type dbt \ # Which project variant to run (currently dbt or dbt-fusion)
--agent sage \ # Which agent to use (e.g., `sage`, `claude`, `codex`)
--model claude-opus-4-5-20251101 \ # Optional; which specific model to use for different agents.
--exclude_task_ids foo001 \ # Optional; if you run all tasks, you can exclude tasks with this flag.
--n-concurrent-trials 4 \ # Optional; sets trial concurrency limit; defaults to 4.
--n-attempts 1 \ # Optional; sets times to run each task; defaults to 1.
--max-episodes 50 \ # Optional; the maximum number of calls to an agent's LM; defaults to 50.
--seed \ # Optional; flag for creating solution seed CSVs !! DESTRUCTIVE !! RUN WITH CAUTION !! SEE BELOW !!
--no-diffs \ # Optional; disables taking snapshots of diffs for faster performance.
--persist \ # Optional; keeps the container alive after the trial is over or is aborted.
--plugin-set none \ # Optional; plugin set name(s) from experiment_sets/plugin-sets.yaml. Defaults to 'none'.
--tasks-dir /absolute/path/to/tasks \ # Optional; path to an external tasks directory. Defaults to 'tasks' in the current directory.
See also: complete usage documentation.
There are several ways to select tasks to run:
ade run airbnb001 # Run a specific task
ade run f1006.hard # Run a specific task with a specific variant
ade run airbnb001 airbnb002 # Run multiple tasks
ade run all # Run all ready tasks
ade run @coalesce # Run an experiment set
ade run f1+ simple+ # Run wildcard patterns
Before getting into the details, it's useful to see how tasks are configured. This will help define the outline for how ADE-bench works, and the sections below will fill in the details.
Each task folder contains a handful of files:
task.yaml - The task's configuration. This is an important file, so all the details are below.setup.sh – A setup script that runs before the agent is given the task, for modifying files and doing other computer stuff.setup/ – (Optional) A directory containing files that the setup script can use. For example, suppose you want to replace a_good_working_file.sql with one_with_a_bug.sql. Put the one with a bug here and use setup.sh to replace it. This lets you modify the project for the specific task, without having to make changes to the shared project.solution.sh – A script that solves the task. The sage agent is a agent that just runs this script. See "The sage agent" below for more.solutions/ – (Optional) Files that are available to the solution script. This is exactly analogous to the /setup directory for the setup script.tests/ - dbt tests that are used to evaluate the trial. For a trial to pass, all the tests in this directory must pass. You can add manual tests, and if you include solution_seeds in the task configuration, tests will get added here automatically when a task is run. Automatically generated tests are appended with the name AUTO_. See "How trials are evaluated" below for more.seeds/ - CSVs that are used when evaluating the automatically-generated equality tests.The task is defined in the task.yaml file:
```yaml
task_id: The name of the task, which should match the name of the task directory. status: An indicator of the task's development status. [ready | dev | open] description: A description of what the task does notes: |- Optional notes about the task, things to add to it, issues with it, etc. prompts: # # Tasks can have multiple prompt variants to see how well agents resolve issues # with different levels of detail. The base prompt is required; additional prompt # variants are optional. Each prompt will run as its own trial in its own sandbox. - key: base prompt: |- The prompt to give to the agent. - key: hard prompt: |- Optional prompt variants. author_name: The name of the task author. author_email: The author's email. difficulty: How hard the task is. category: The category of problem the task is testing. tags: # Additional tags to help with organization - dbt - jinja
test_setup: |- dbt run --select obt_product_inventory
solution__[table_name]) after the agent runs.solution_seeds: - table_name: dim_products
table_name: fct_sales include_columns:
table_name: fct_transactions exclude_columns:
table_name: generated_income_statement exclude_tests:
existence_testtable_name: sec_filing_report alternates:
$ claude mcp add ade-bench \
-- python -m otcore.mcp_server <graph>