evalproof 0.2.1__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- evalproof-0.4.0/CHANGELOG.md +254 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/CITATION.cff +2 -2
- evalproof-0.4.0/PKG-INFO +554 -0
- evalproof-0.4.0/README.md +536 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/__init__.py +5 -1
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/_version.py +1 -1
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/cache.py +10 -2
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/cli.py +124 -5
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/compare.py +29 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/config.py +51 -6
- evalproof-0.4.0/src/evalproof/doctor.py +130 -0
- evalproof-0.4.0/src/evalproof/gate.py +149 -0
- evalproof-0.4.0/src/evalproof/importers/__init__.py +75 -0
- evalproof-0.4.0/src/evalproof/importers/_common.py +309 -0
- evalproof-0.4.0/src/evalproof/importers/deepeval.py +127 -0
- evalproof-0.4.0/src/evalproof/importers/inspect_ai.py +207 -0
- evalproof-0.4.0/src/evalproof/importers/lm_eval.py +114 -0
- evalproof-0.4.0/src/evalproof/importers/promptfoo.py +256 -0
- evalproof-0.4.0/src/evalproof/importers/table.py +246 -0
- evalproof-0.4.0/src/evalproof/providers/__init__.py +117 -0
- evalproof-0.4.0/src/evalproof/providers/agent_cli.py +617 -0
- evalproof-0.4.0/src/evalproof/providers/agent_cli_experimental.py +452 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/providers/anthropic.py +38 -11
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/providers/base.py +35 -2
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/providers/ollama.py +10 -2
- evalproof-0.4.0/src/evalproof/providers/openai.py +163 -0
- evalproof-0.4.0/src/evalproof/providers/profiles.py +164 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/report.py +34 -12
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/runner.py +73 -6
- evalproof-0.4.0/src/evalproof/scaffold.py +369 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/stats.py +20 -0
- evalproof-0.4.0/src/evalproof/templates/SKILL.md +86 -0
- evalproof-0.4.0/src/evalproof/templates/cases.jsonl +3 -0
- evalproof-0.4.0/src/evalproof/templates/evals-readme.md +11 -0
- evalproof-0.4.0/src/evalproof/templates/gitignore +3 -0
- evalproof-0.4.0/src/evalproof/templates/suite.yaml +70 -0
- evalproof-0.4.0/src/evalproof/templates/workflow-api-key.yml +74 -0
- evalproof-0.4.0/src/evalproof/templates/workflow-keyless.yml +67 -0
- evalproof-0.4.0/tests/fakecli.py +260 -0
- evalproof-0.4.0/tests/fakecli_experimental.py +207 -0
- evalproof-0.4.0/tests/fixtures/README.md +9 -0
- evalproof-0.4.0/tests/fixtures/deepeval/test_run.json +167 -0
- evalproof-0.4.0/tests/fixtures/inspect/log_formats.json +399 -0
- evalproof-0.4.0/tests/fixtures/lm-eval/gpt2/samples_hellaswag_2024-05-01T10-20-30.123456.jsonl +4 -0
- evalproof-0.4.0/tests/fixtures/lm-eval/llama3/samples_gsm8k_2024-05-01T10-20-30.123456.jsonl +6 -0
- evalproof-0.4.0/tests/fixtures/promptfoo/sample-export.json +692 -0
- evalproof-0.4.0/tests/fixtures/table/long.csv +9 -0
- evalproof-0.4.0/tests/fixtures/table/long.jsonl +8 -0
- evalproof-0.4.0/tests/fixtures/table/wide.csv +4 -0
- evalproof-0.4.0/tests/test_action.py +85 -0
- evalproof-0.4.0/tests/test_agent_cli.py +810 -0
- evalproof-0.4.0/tests/test_agent_cli_experimental.py +869 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_cache_systems.py +22 -0
- evalproof-0.4.0/tests/test_doctor.py +251 -0
- evalproof-0.4.0/tests/test_holm_gate.py +168 -0
- evalproof-0.4.0/tests/test_importers.py +795 -0
- evalproof-0.4.0/tests/test_init.py +699 -0
- evalproof-0.4.0/tests/test_judge_fingerprint.py +272 -0
- evalproof-0.4.0/tests/test_live_agent_cli.py +47 -0
- evalproof-0.4.0/tests/test_providers.py +517 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_public_api.py +14 -0
- evalproof-0.4.0/tests/test_release_fixes.py +162 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_security.py +23 -9
- evalproof-0.2.1/CHANGELOG.md +0 -111
- evalproof-0.2.1/PKG-INFO +0 -277
- evalproof-0.2.1/README.md +0 -259
- evalproof-0.2.1/src/evalproof/gate.py +0 -107
- evalproof-0.2.1/src/evalproof/providers/__init__.py +0 -54
- evalproof-0.2.1/src/evalproof/providers/openai.py +0 -76
- evalproof-0.2.1/tests/test_providers.py +0 -161
- {evalproof-0.2.1 → evalproof-0.4.0}/.gitignore +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/LICENSE +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/NOTICE +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/pyproject.toml +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/calibration.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/dataset.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/models.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/py.typed +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/scorers/__init__.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/scorers/deterministic.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/scorers/judge.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/scorers/retrieval.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/src/evalproof/systems.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/__init__.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/conftest.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_calibration.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_compare_gate_report.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_config_dataset.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_runner_cli.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_scorers.py +0 -0
- {evalproof-0.2.1 → evalproof-0.4.0}/tests/test_stats.py +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes are listed here. The project follows [Semantic Versioning](https://semver.org/).
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
## [0.4.0] — 2026-11-13
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `claude-code:<model>` and `codex:<model>` providers: run your own logged-in Claude Code or
|
|
12
|
+
Codex CLI as a judge or a system under test, with no API key. Each call runs in a fresh
|
|
13
|
+
empty directory with the agent's tools, settings, MCP servers, skills and memory switched
|
|
14
|
+
off and no permission-bypass flag; API-key variables are removed from the child's
|
|
15
|
+
environment unless `api_key_env` names one or `EVALPROOF_CLI_AUTH=api-key` keeps them.
|
|
16
|
+
Neither CLI takes a temperature, seed or token limit, so those params are ignored (Codex
|
|
17
|
+
maps `think` to its reasoning effort). Claude Code runs with no tools; Codex still offers a
|
|
18
|
+
JavaScript isolate, sub-agents and a question to the user, so any item in its output other
|
|
19
|
+
than a message, reasoning, an error or a plan fails the call as an isolation break, and a
|
|
20
|
+
codex too old for the flags evalproof sets gets a message to upgrade. ADR 0004 has the
|
|
21
|
+
reasoning.
|
|
22
|
+
- `EVALPROOF_CLI_AUTH` (`login`, the default, or `api-key`) chooses whether a CLI provider
|
|
23
|
+
uses the subscription login or its own API key variable; `evalproof doctor` prints the mode
|
|
24
|
+
in effect and warns when `api-key` has no key to use. `api_key_env` still wins.
|
|
25
|
+
- `evalproof doctor [suite.yaml]`: reports each CLI's path, version, login mode and the
|
|
26
|
+
isolation flags it will use, without a model call, and exits 1 when a target of the suite
|
|
27
|
+
is not usable. Without a suite it surveys the installed CLIs and exits 1 only when none is
|
|
28
|
+
usable. It prints no account details.
|
|
29
|
+
- Run facts for CLI targets in `runner.environment`: `{judge,system}_cli`,
|
|
30
|
+
`{judge,system}_cli_version`, `{judge,system}_isolation` and `{judge,system}_model_resolved`
|
|
31
|
+
(the model ids that answered, sorted, cached replies included). The response cache keys on
|
|
32
|
+
the CLI fingerprint, so a CLI upgrade is a cache miss.
|
|
33
|
+
- `compare` reports `same_judge`, `judge_changes` and `system_changes`, and the gate refuses
|
|
34
|
+
to decide (exit 4) when the judge changed between the runs. `--allow-judge-change` or
|
|
35
|
+
`gate.allow_judge_change: true` accepts the change and keeps a warning.
|
|
36
|
+
- Experimental `opencode:<provider>/<model>`, `cursor:<model>` and `copilot:<model>`
|
|
37
|
+
providers, on the same footing as the CLI providers above (fresh empty directory, the CLI's
|
|
38
|
+
key variable removed unless `api_key_env` names one, bounded runtime, CLI fingerprint with the
|
|
39
|
+
isolation tags `opencode/0`, `cursor/0`, `copilot/0`). Each prints one warning on stderr the
|
|
40
|
+
first time it is used. Only OpenCode was exercised for real, and only against a local ollama
|
|
41
|
+
model; Cursor (not logged in) and Copilot (not installed) follow their documentation, and the
|
|
42
|
+
README's "Experimental providers" says what was and was not verified. `evalproof doctor`
|
|
43
|
+
without a suite now also lists whichever of these CLIs are on `PATH`.
|
|
44
|
+
- `evalproof.providers.TransientError`, a `ProviderError` that `with_retries` retries; the CLI
|
|
45
|
+
providers raise it for rate limits and server errors.
|
|
46
|
+
- `tests/test_live_agent_cli.py`: one real call per installed CLI, skipped unless
|
|
47
|
+
`EVALPROOF_LIVE=1`.
|
|
48
|
+
- `evalproof init [--dir PATH] [--judge TARGET] [--ci keyless|api-key|none] [--no-skill]
|
|
49
|
+
[--force]`: writes `evals/suite.yaml`, three sample cases in `evals/cases.jsonl`, an
|
|
50
|
+
`evals/README.md`, a GitHub Actions workflow at `.github/workflows/evalproof.yml` and an
|
|
51
|
+
agent skill at `.agents/skills/evalproof/SKILL.md` and `.claude/skills/evalproof/SKILL.md`.
|
|
52
|
+
The judge is the first of `claude`, `codex`, `ollama` found on `PATH`, else a hosted
|
|
53
|
+
Anthropic model. The keyless workflow makes no model calls and gates the committed
|
|
54
|
+
`evals/runs/latest.json` against the base branch; the api-key workflow runs the suite in CI
|
|
55
|
+
(with `EVALPROOF_CLI_AUTH: api-key` for a CLI judge, so no second suite file is written)
|
|
56
|
+
and pins the judge CLI to the version found at init time. Existing files are kept unless
|
|
57
|
+
`--force` is passed, nothing is written outside `--dir`, and no model is called.
|
|
58
|
+
|
|
59
|
+
### Changed
|
|
60
|
+
|
|
61
|
+
- A gate that passed in 0.3.0 can now exit 4 when the judge's target, CLI version, isolation
|
|
62
|
+
or resolved model differs between two runs that both carry these keys. Runs written before
|
|
63
|
+
this release carry none and compare as before.
|
|
64
|
+
- A changed system target or CLI version between two runs now adds a warning, so the status
|
|
65
|
+
is `warn` instead of `pass` (the exit code stays 0).
|
|
66
|
+
- `runner.environment` records `judge_target` and `system_target` for every model target (not
|
|
67
|
+
only CLI ones), and the system target it records is the one in effect, with any override
|
|
68
|
+
applied.
|
|
69
|
+
- The gate's "too few paired cases" reason now says how to fix it (add cases, or lower
|
|
70
|
+
`gate.min_cases`).
|
|
71
|
+
|
|
72
|
+
## [0.3.0] — 2026-11-12
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
|
|
76
|
+
- `evalproof import` and `evalproof.import_run`: per-case results from promptfoo (JSON and
|
|
77
|
+
JSONL), Inspect (`.json` and `.eval` logs), DeepEval, lm-evaluation-harness
|
|
78
|
+
(`samples_*.jsonl`) and generic long or wide `jsonl` and `csv` files become a run that
|
|
79
|
+
`compare` and the gate read. Case ids are stable across runs, system errors score as
|
|
80
|
+
failures, repeats collapse by `--epochs`, and NaN or infinite scores are refused with the
|
|
81
|
+
case and metric named. Raises `evalproof.ImportFormatError` (a `ValueError`; exit 2 on the
|
|
82
|
+
command line).
|
|
83
|
+
- Gating several metrics: `gate.metrics` in the suite or `--metric` repeated on
|
|
84
|
+
`compare`, with Holm-adjusted p-values (`evalproof.holm`). The decision carries
|
|
85
|
+
`adjusted_p`, the report gains a Holm-adjusted p column, and a single metric behaves as
|
|
86
|
+
before. ADR 0003 has the reasoning.
|
|
87
|
+
- The composite action's `metric` input takes several names, separated by newlines or commas.
|
|
88
|
+
- `examples/retrieval`: an offline retrieval example for recall@k, MRR and nDCG, with a
|
|
89
|
+
regression that recall@5 cannot see and MRR and nDCG@5 can. Contributed by
|
|
90
|
+
@HarshRajSinghania in #5. CI asserts its gate exits 1 on the regression and 0 on no change.
|
|
91
|
+
- MEASUREMENTS §8: the support-qa judge with thinking on (#3), with its runs, suite and
|
|
92
|
+
analysis in `measure.py`. Against labels audited case by case it passes no wrong answer
|
|
93
|
+
and κ rises, at 6.7× the judge time; the gate's decision does not change.
|
|
94
|
+
- A provider profile table (`providers/profiles.py`) behind one OpenAI-compatible adapter:
|
|
95
|
+
`openai`, `azure`, `gemini`, `mistral`, `groq`, `together`, `fireworks`, `deepseek`, `xai`,
|
|
96
|
+
`openrouter`, `cerebras`, the local servers `vllm`, `lmstudio` and `llamacpp`, and
|
|
97
|
+
`openai-compatible` for any other server (set `base_url`). Each profile carries its base
|
|
98
|
+
URL, key variable, auth header, token-limit field and a link to the provider's docs.
|
|
99
|
+
`OpenAIProvider` stays importable.
|
|
100
|
+
- `TargetConfig.api_key_env` names the environment variable that holds the key, and
|
|
101
|
+
`TargetConfig.headers` adds request headers to every HTTP provider; suite headers win over
|
|
102
|
+
a provider's own, and neither is part of the cache key or written to a run. A named key
|
|
103
|
+
variable that is not set is an error rather than a 401.
|
|
104
|
+
- Anthropic: a `refusal` stop reason is recorded as a case error naming its category, and so
|
|
105
|
+
is `max_tokens` reached before any text, with a hint to raise `params.max_tokens`. The
|
|
106
|
+
OpenAI-compatible adapter does the same for `finish_reason` `length` with no text, and
|
|
107
|
+
for `content_filter`, and reads replies that arrive as a list of typed content parts.
|
|
108
|
+
- A test pins the cache key of an existing Ollama call, so a change to it cannot slip in.
|
|
109
|
+
|
|
110
|
+
### Changed
|
|
111
|
+
|
|
112
|
+
- Hosted providers (everything except Ollama and the local servers) send `temperature` and
|
|
113
|
+
`seed` only when the suite sets them. Before, `openai` sent `temperature: 0` and
|
|
114
|
+
`seed: 0` on every call, which reasoning models reject; now an unset value is left to the
|
|
115
|
+
provider's default. A hosted run that relied on the implicit `temperature: 0` should set
|
|
116
|
+
it in `params`. Ollama and the local servers still send both, so local runs repeat as
|
|
117
|
+
before and keep their cache keys; `GenerationParams` defaults are unchanged. A hosted call
|
|
118
|
+
that now leaves a value out gets a new cache key, so a reply cached at the old implicit
|
|
119
|
+
`temperature: 0` is not reused for it. To point `openai` at an older local server through
|
|
120
|
+
`base_url`, use `openai-compatible` or a local profile instead, which send both values.
|
|
121
|
+
- `openai` sends the token limit as `max_completion_tokens`, which OpenAI's reasoning models
|
|
122
|
+
require (they reject `max_tokens`), and `mistral` sends its seed as `random_seed`. The
|
|
123
|
+
default limit is still 512.
|
|
124
|
+
- The llama.cpp profile defaults to port 9931, the one its server documents now; for an older
|
|
125
|
+
build on 8080, set `base_url`.
|
|
126
|
+
|
|
127
|
+
### Fixed
|
|
128
|
+
|
|
129
|
+
- Anthropic calls to current Claude models failed with HTTP 400, because `temperature` was
|
|
130
|
+
sent on every request. It goes out only when the suite sets it, and no seed is sent, since
|
|
131
|
+
the Messages API has none.
|
|
132
|
+
- A gate built without validation and given no metric passed by gating nothing; it now
|
|
133
|
+
cannot gate (exit 4), and `compare --metric ""` is a usage error (exit 2).
|
|
134
|
+
- Found in review before release, in the new importers: two promptfoo prompts whose first 60
|
|
135
|
+
characters matched merged into one system (the label is no longer truncated, and two
|
|
136
|
+
prompts that share a label are an error), promptfoo output with repeated tests but no
|
|
137
|
+
`repeatIndex` now warns that it reads as separate cases, Inspect message ids no longer
|
|
138
|
+
change the dataset hash, a `null` promptfoo `testIdx` no longer crashes, and under
|
|
139
|
+
`--epochs any` or `mean` a case with one good repeat is no longer marked as an error.
|
|
140
|
+
- `examples/support-qa/cases.jsonl`: the q21 and q22 references named Enterprise, which the
|
|
141
|
+
product facts do not give SSO or an admin console (#7). The original set is kept as
|
|
142
|
+
`cases.v1.jsonl` so the recorded runs stay reproducible; the runs judged on the revised set
|
|
143
|
+
are in `runs/v2/`, and MEASUREMENTS §8 reports both.
|
|
144
|
+
|
|
145
|
+
## [0.2.1] — 2026-10-16
|
|
146
|
+
|
|
147
|
+
### Fixed
|
|
148
|
+
|
|
149
|
+
- The PyPI and Python badges on the 0.2.0 PyPI page read "package or version not found".
|
|
150
|
+
PyPI's image proxy fetched them about a minute after the first upload, before the badge
|
|
151
|
+
service could see the package, and keeps that answer for 12 to 24 hours. The PyPI page
|
|
152
|
+
now leaves those two badges out, since it shows the version and supported Pythons
|
|
153
|
+
itself, and the README's copies use new URLs so no cache serves the old images. CI fails
|
|
154
|
+
if a PyPI-data badge reaches the PyPI description again.
|
|
155
|
+
|
|
156
|
+
## [0.2.0] — 2026-10-16
|
|
157
|
+
|
|
158
|
+
The first release on PyPI: `pip install evalproof`.
|
|
159
|
+
|
|
160
|
+
### Added
|
|
161
|
+
|
|
162
|
+
- A supported Python API: `from evalproof import compare_runs, decide, calibrate, ...`.
|
|
163
|
+
The names in `evalproof.__all__` are the public surface; other modules are internal.
|
|
164
|
+
- Python 3.14 support, tested in CI alongside 3.11 to 3.13.
|
|
165
|
+
- Releases publish to PyPI from GitHub Actions with trusted publishing, so no token is
|
|
166
|
+
stored anywhere. Each file on PyPI carries a PEP 740 attestation, and the GitHub release
|
|
167
|
+
carries the same files with a build-provenance attestation.
|
|
168
|
+
- `SECURITY.md` with private vulnerability reporting and the trust boundaries, backed by a
|
|
169
|
+
test that runs both hosted providers with a placeholder key and finds it in no file written.
|
|
170
|
+
- `CODE_OF_CONDUCT.md` (Contributor Covenant 2.1), issue and pull-request templates,
|
|
171
|
+
`CITATION.cff`, `CODEOWNERS`, Dependabot for actions and Python dependencies with a
|
|
172
|
+
three-day cooldown, and a pre-commit configuration.
|
|
173
|
+
|
|
174
|
+
### Changed
|
|
175
|
+
|
|
176
|
+
- The version is written once, in `src/evalproof/_version.py`; the build reads it.
|
|
177
|
+
- The README published to PyPI rewrites relative links to GitHub and replaces the Mermaid
|
|
178
|
+
diagram with a link, so the PyPI page has no broken links. CI checks this on every
|
|
179
|
+
commit, along with `twine check --strict` and a clean install of the built wheel.
|
|
180
|
+
- CI pins every action to a commit SHA, checks out without persisted credentials, sets
|
|
181
|
+
timeouts and cancels superseded pull-request runs, and audits the workflows with zizmor.
|
|
182
|
+
The composite action pins `setup-uv` the same way.
|
|
183
|
+
- Package metadata: documentation, source, changelog and live-demo links; classifiers for
|
|
184
|
+
typing, Python 3.14 and beta status.
|
|
185
|
+
|
|
186
|
+
## [0.1.2] — 2026-10-15
|
|
187
|
+
|
|
188
|
+
### Added
|
|
189
|
+
|
|
190
|
+
- `app/`: an interactive Streamlit app, live at https://evalproof.streamlit.app.
|
|
191
|
+
*Check a drop* starts from four scenarios (the recorded run, the same rates on 4× the
|
|
192
|
+
cases, a small but certain drop, a twenty-case suite) or from sliders, and shows the
|
|
193
|
+
gate's verdict, every paired case as a grid, the coin-flip distribution behind the exact
|
|
194
|
+
McNemar p-value, and the suite size at which the same drop would become significant.
|
|
195
|
+
*The recorded run* replays the committed `examples/support-qa` runs: select any of the
|
|
196
|
+
twelve changed answers to read both versions side by side, add a latency budget, and
|
|
197
|
+
calibrate the judge on a gold sample of chosen size. It runs the library from `src/`
|
|
198
|
+
through the same `compare_runs` and `decide` calls as the CLI; CI installs the app's own
|
|
199
|
+
requirements and drives every scenario.
|
|
200
|
+
|
|
201
|
+
### Fixed
|
|
202
|
+
|
|
203
|
+
- `evalproof compare` raised OverflowError when a metric had more than about 1,030
|
|
204
|
+
discordant pairs: the exact McNemar test summed `comb(n, i) * 0.5**n` in floating
|
|
205
|
+
point, and `comb(n, i)` outgrows the largest float. The binomial tail is now summed
|
|
206
|
+
as integers and divided once, so it stays exact at any size.
|
|
207
|
+
|
|
208
|
+
## [0.1.1] — 2026-10-13
|
|
209
|
+
|
|
210
|
+
### Fixed
|
|
211
|
+
|
|
212
|
+
- The Wilson interval now returns exactly 0 at k=0 and exactly 1 at k=n. Computing
|
|
213
|
+
the boundaries by subtraction left platform-dependent rounding (2.8e-17 on x86_64
|
|
214
|
+
Linux, 0.0 on arm64 macOS).
|
|
215
|
+
|
|
216
|
+
### Changed
|
|
217
|
+
|
|
218
|
+
- The three-day `exclude-newer` resolution guard is declared in `[tool.uv]`, so
|
|
219
|
+
`uv.lock` means the same thing on every machine and in CI.
|
|
220
|
+
- CI pins uv to the version that wrote `uv.lock`.
|
|
221
|
+
|
|
222
|
+
## [0.1.0] — 2026-10-13
|
|
223
|
+
|
|
224
|
+
First release.
|
|
225
|
+
|
|
226
|
+
### Added
|
|
227
|
+
|
|
228
|
+
- Suites in YAML: a JSONL golden set, a system under test, scorers, an optional judge,
|
|
229
|
+
calibration settings and a gate.
|
|
230
|
+
- Systems under test: Ollama, Anthropic and OpenAI models with a prompt template; Python
|
|
231
|
+
functions; HTTP endpoints. System failures are recorded per case, never fatal.
|
|
232
|
+
- Scorers: exact match, contains, regex with accept/reject answer keys, a JSON Schema
|
|
233
|
+
subset, numeric tolerance, recall@k, MRR, nDCG, and an LLM judge with a strict JSON
|
|
234
|
+
verdict, one parse retry and an explicit undecided state.
|
|
235
|
+
- Pairwise judging with order swap; position-inconsistent verdicts become ties.
|
|
236
|
+
- Judge calibration: confusion matrix, TPR, FPR, Cohen's κ, and prevalence-corrected pass
|
|
237
|
+
rates by adjusted classify-and-count (bootstrap interval) and prediction-powered
|
|
238
|
+
inference (normal interval).
|
|
239
|
+
- Paired comparison of two runs: exact McNemar for pass/fail, paired bootstrap for scores.
|
|
240
|
+
- A CI gate that fails only on a drop that is both beyond `max_drop` and significant at
|
|
241
|
+
`alpha`, plus p95-latency and cost budgets, with distinct exit codes.
|
|
242
|
+
- Content-addressed response cache; runs record the Ollama version and model digests.
|
|
243
|
+
- Markdown reports for GitHub step summaries, JSON reports, and a composite GitHub Action.
|
|
244
|
+
- Two examples: an offline ticket router (CI's gate contract) and a product support
|
|
245
|
+
assistant judged by a local model, with measurements.
|
|
246
|
+
|
|
247
|
+
[Unreleased]: https://github.com/technobasant/evalproof/compare/v0.4.0...HEAD
|
|
248
|
+
[0.4.0]: https://github.com/technobasant/evalproof/compare/v0.3.0...v0.4.0
|
|
249
|
+
[0.3.0]: https://github.com/technobasant/evalproof/compare/v0.2.1...v0.3.0
|
|
250
|
+
[0.2.1]: https://github.com/technobasant/evalproof/compare/v0.2.0...v0.2.1
|
|
251
|
+
[0.2.0]: https://github.com/technobasant/evalproof/compare/v0.1.2...v0.2.0
|
|
252
|
+
[0.1.2]: https://github.com/technobasant/evalproof/compare/v0.1.1...v0.1.2
|
|
253
|
+
[0.1.1]: https://github.com/technobasant/evalproof/compare/v0.1.0...v0.1.1
|
|
254
|
+
[0.1.0]: https://github.com/technobasant/evalproof/releases/tag/v0.1.0
|
|
@@ -11,8 +11,8 @@ authors:
|
|
|
11
11
|
- family-names: Bhattarai
|
|
12
12
|
given-names: Basant
|
|
13
13
|
website: "https://basantbhattarai.com.np"
|
|
14
|
-
version: 0.
|
|
15
|
-
date-released: "2026-
|
|
14
|
+
version: 0.3.0
|
|
15
|
+
date-released: "2026-11-12"
|
|
16
16
|
license: Apache-2.0
|
|
17
17
|
repository-code: "https://github.com/technobasant/evalproof"
|
|
18
18
|
url: "https://pypi.org/project/evalproof/"
|