whetstone-ai
Generic toolkit for evaluating and optimizing LLM prompts and programs.
Whetstone sits above the dr-* libraries (graphs, providers, store, serialize, exec, platform) and below domain-specific environments. It owns the reusable experiment contract, batched evaluation engine, optimizer harness, and evidence/analysis plumbing — not task datasets, domain scoring rules, or application UI.
In scope here: evaluation at scale, a shared optimization harness, and stepping through runs to inspect behavior. Optimizers are not co-equal:
| Optimizer | Harness adapter | Platform pipeline | Sandbox |
|---|---|---|---|
| COPRO | Live; pass a COPRO adapter in the build_runtime registry |
Wired (submit_optim_run, inline and PLATFORM deferral) |
whetstone-sandbox copro |
| GEPA | Live harness adapter + step engine; pass via the build_runtime registry |
Wired (submit_optim_run, inline and PLATFORM deferral) |
whetstone-sandbox gepa |
| MIPROv2 | Live via register_toy_runtime(..., extra_adapters=...) + prepare_miprov2_run |
Not on the pipeline | whetstone-sandbox miprov2 (plan preview only) |
| Codex direct | Live via the build_runtime registry + prepare_codex_run; the only tool-using optimizer, and macOS-only (its sandbox is sandbox-exec) |
Not on the pipeline | No sandbox command |
Out of scope here: particular benchmarks or envs (those live in separate packages or repos), one-off experiment scripts, and product-facing runners.
Core capabilities
- Evaluation — batched, efficient sweeps over candidates and tasks;
configurable splits, graph rollouts, concurrency, and durable evidence.
Bundled reference drivers:
GraphRolloutEvalDriver(eval/drivers/graph_rollout.py) — the default, parallel in-process graph rollouts with injectedEvalProcedureRunner— andSubprocessGraphRolloutEvalDriver(eval/drivers/subprocess_graph_rollout.py), which runs the same rows on a dr-exec worker pool with per-row and per-batch wall-time budgets. - Evaluation analysis — bootstrap confidence intervals, power analysis, and
anchor calibration over persisted evaluation evidence (
eval/analysis/). - Optimization — shared harness and adapters that propose candidates and
drive evaluation intents in a loop. COPRO is the platform-wired optimizer;
GEPA is platform-wired the same way as COPRO when present in the
build_runtimeregistry. MIPROv2 plugs into the in-process harness viaregister_toy_runtime(..., extra_adapters=...)plusprepare_toy_miprov2_runand is not on the platform pipeline. - Sandbox & interpretation — dry-run previews and toy-graph helpers to step
through optimizer behavior before spending full eval budget
(
whetstone-sandbox). - Codex MCP eval — whetstone hosts, outside the Codex sandbox, the one
tool a Codex run is granted: evaluate a candidate on the run's internal
split and read back the aggregate reward and per-task scores. The agent
receives only an authenticated loopback endpoint, never the store. Every
call is admitted through
ToolAdmissionAuthorityagainst a per-run capacity, leased, persisted, and recorded in the step's Issued Tool Call ledger. The Codex output artifact carries no candidate body -- it names thecall_idit selected, and the adapter rebuilds that candidate from the call's recorded, content-addressed arguments, so a template that was never evaluated through the tool cannot be returned.
Evaluation → Evaluation analysis
↓
Optimization → Sandbox / interpretation
dr-* libraries
| Package | Role in whetstone |
|---|---|
| dr-graph | Rollout graphs: LLM-call → eval nodes, executed per task row |
| dr-providers | Provider call configs, transport, and invocation evidence |
| dr-store | Content-addressed persistence for candidates, evidence, and step records |
| dr-serialize | Strict JSON and canonical identity hashing |
| dr-exec | Budgeted subprocess execution: the Codex optimizer's ProcessExecutor, and the subprocess rollout driver's worker pool |
| dr-platform | Durable pipeline stages, deferral/fan-in, and run submission (platform extra) |
Stable seams
- Experiment — generation graph, initial/ceiling candidates, eval configs, reward policy
- EvaluationEngine — validates and evaluates a candidate; returns typed evidence refs
- OptimizerAdapter — COPRO and GEPA plug into the shared harness and platform pipeline when present in the
build_runtimeregistry; MIPROv2 and Codex are harness-only. Codex is the onlyTOOL_USINGadapter, so its run carries aToolConfigandbuild_runtimeneeds atool_executorand a durableadmissionauthority. Adding or removing an adapter changes controller identity. - StepContractProvider — each optimizer declares its first-step and continuation contracts and parses its own launch control, registered by adapter key;
StepRequestBuilderandHarnessRunControllerdispatch through it - Step evidence — a step reports evaluations it asked the harness to run in
resolved_intents(COPRO, MIPROv2), and evaluations its own search drove insearch_evidence(GEPA), each bound to its run and step index and verified by the harness. ATOOL_USINGstep (Codex) carriestool_evidenceinstead: intent/search evidence and tool evidence are mutually exclusive, and the Issued Tool Call ledger records one entry per admitted call. A terminal step whose contract setsterminal_proposal_countand that accepted no improvement over the run's own initial candidate setsseed_retained - Graph rollouts —
experiment/graph/builds standard two-node graphs; drivers execute them per row
Platform pipeline
The optim pipeline (whetstone.optim.v1) has stages optim_step → eval_row
→ eval_fanin, plus run_completion. EvalDispatchMode.INLINE evaluates
inside the step. EvalDispatchMode.PLATFORM persists eval intents, fans out
row jobs, fans results back in, then resumes the step. Submit a run with
submit_optim_run.
whetstone-optim (requires the platform extra) is the production entry
point. run resolves a bound launch from a SQLite store, assembles
build_runtime + deploy_platform, submits a members tuple, and prints the
receipt. Adapter-set membership is part of controller identity: adding an
adapter changes runtime.controller.runtime_hash. status reads the run
manifest and release state; result loads OptimPlatformRunResult.
uv sync --extra platform
uv run whetstone-optim run \
--run-id <bound-run-id> \
--store-path runtime.sqlite \
--database-url "$WHETSTONE_DATABASE_URL" \
--campaign-key campaign-1 \
--run-key run-1 \
--adapter copro \
--proposer provider \
--application-version 0.1.5 \
--executor-id local-1
uv run whetstone-optim status --run-key run-1 --store-path runtime.sqlite
uv run whetstone-optim result --run-key run-1 --store-path runtime.sqlite
Sandbox
uv run whetstone-sandbox copro --task-prompt "Say hello"
uv run whetstone-sandbox graph --run
Requires Python 3.13+. Optional extras: dbos, postgres, platform.
Platform integration tests
Tier 2 tests exercise the dr-platform harness against Postgres + DBOS:
uv sync --extra platform
createdb whetstone_platform_test # once, if needed
uv run pytest -m integration tests/integration/
Set WHETSTONE_TEST_DATABASE_URL when not using the default
postgresql+psycopg:///whetstone_platform_test. Locally, tests skip when
Postgres is unavailable; in CI they fail hard. Default uv run pytest excludes
integration tests via the pytest marker.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file whetstone_ai-0.1.7.tar.gz.
File metadata
- Download URL: whetstone_ai-0.1.7.tar.gz
- Upload date:
- Size: 412.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d475a4f1f5e7a9a6393627c41e3fe2837a2c9353fbc15a95151b2ecd2756b2c6
|
|
| MD5 |
3cf4187029a5040b950a255ba739351c
|
|
| BLAKE2b-256 |
532b3aef2f981218d6b4a5ad5b8dab89b365bb89e38dfb20b5996e99268a531a
|
Provenance
The following attestation bundles were made for whetstone_ai-0.1.7.tar.gz:
Publisher:
release.yml on danielle-rothermel/whetstone-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whetstone_ai-0.1.7.tar.gz -
Subject digest:
d475a4f1f5e7a9a6393627c41e3fe2837a2c9353fbc15a95151b2ecd2756b2c6 - Sigstore transparency entry: 2567433502
- Sigstore integration time:
-
Permalink:
danielle-rothermel/whetstone-ai@1bfc566dbc78ad6f670e5c0d917e58c05588c09a -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/danielle-rothermel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1bfc566dbc78ad6f670e5c0d917e58c05588c09a -
Trigger Event:
push
-
Statement type:
File details
Details for the file whetstone_ai-0.1.7-py3-none-any.whl.
File metadata
- Download URL: whetstone_ai-0.1.7-py3-none-any.whl
- Upload date:
- Size: 521.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac6d505fb3b2c96ee1f3ca69816f6bcbd3c285a51fa5f6ffdad537e251e6f67f
|
|
| MD5 |
2104681fbb46025e0b2edc59657665b4
|
|
| BLAKE2b-256 |
2697f91cb41d7c48582e4db78975f89571236a2c6ab42cf9d1bb76a11ea14f48
|
Provenance
The following attestation bundles were made for whetstone_ai-0.1.7-py3-none-any.whl:
Publisher:
release.yml on danielle-rothermel/whetstone-ai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
whetstone_ai-0.1.7-py3-none-any.whl -
Subject digest:
ac6d505fb3b2c96ee1f3ca69816f6bcbd3c285a51fa5f6ffdad537e251e6f67f - Sigstore transparency entry: 2567433809
- Sigstore integration time:
-
Permalink:
danielle-rothermel/whetstone-ai@1bfc566dbc78ad6f670e5c0d917e58c05588c09a -
Branch / Tag:
refs/tags/v0.1.7 - Owner: https://github.com/danielle-rothermel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1bfc566dbc78ad6f670e5c0d917e58c05588c09a -
Trigger Event:
push
-
Statement type: